-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfolder.c
89 lines (69 loc) · 1.53 KB
/
folder.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* Copyright (c) 2016 Richard Russon <rich@flatcap.org>
* Released under the GPLv3 -- see LICENSE.md for details */
#include <stdio.h>
#include <stdlib.h>
#include "folder.h"
#include "item.h"
void
folder_destroy (FOLDER *f)
{
if (!f) {
return;
}
int i;
for (i = 0; i < f->num_items; i++) {
release (f->items[i]);
}
container_destroy (&f->container); // Destroy parent
}
void
folder_display (FOLDER *f, int indent)
{
if (!f) {
return;
}
printf ("%*s\033[1;32m%s\033[m\n", indent * 8, "", f->container.object.name);
if ((f->num_items == 0) && (f->container.num_children == 0)) {
printf ("%*s\033[1;36m[empty]\033[m\n", (indent + 1) * 8, "");
} else {
container_display (&f->container, indent + 1);
int i;
for (i = 0; i < f->num_items; i++) {
display (f->items[i], indent + 1);
}
}
}
int
folder_add_child (FOLDER *f, void *child)
{
if (!f || !child) {
return 0;
}
OBJECT *obj = child;
if ((obj->type & 0xFF) == MAGIC_ITEM) {
addref (child);
f->items[f->num_items] = child;
f->num_items++;
} else {
container_add_child (&f->container, child);
}
return 1;
}
FOLDER *
folder_create (FOLDER *f)
{
if (!f) {
f = calloc (1, sizeof (FOLDER));
if (!f) {
return NULL;
}
}
container_create (&f->container); // Construct parent
OBJECT *o = &f->container.object;
o->type = MAGIC_FOLDER;
o->destroy = (object_destroy_fn) folder_destroy;
o->display = (object_display_fn) folder_display;
CONTAINER *c = &f->container;
c->add_child = (container_add_child_fn) folder_add_child;
return f;
}