1 | inline int cmp(const char *a, bool a_isdir, const char *b, bool b_isdir) |
---|
2 | { |
---|
3 | // oh... directory sort doesn't matter since we write out dir- and filenames seperately |
---|
4 | //if (a_isdir && !b_isdir) return -1; |
---|
5 | //if (b_isdir && !a_isdir) return +1; |
---|
6 | return strcmp(a, b); |
---|
7 | } |
---|
8 | |
---|
9 | struct TreeNode |
---|
10 | { |
---|
11 | unsigned int dir_id; // directory ID in case of directory entry |
---|
12 | const char *name; // file or directory name |
---|
13 | TreeNode *directory; // nonzero indicates directory. first directory node is a dummy |
---|
14 | TreeNode *prev, *next; // linked list |
---|
15 | |
---|
16 | TreeNode() |
---|
17 | { |
---|
18 | dir_id = 0; |
---|
19 | name = ""; |
---|
20 | directory = 0; |
---|
21 | prev = next = 0; |
---|
22 | } |
---|
23 | |
---|
24 | // new entry in same directory |
---|
25 | TreeNode *New(const char *name, bool isdir) |
---|
26 | { |
---|
27 | TreeNode *newNode = new TreeNode(); |
---|
28 | newNode->name = strdup(name); |
---|
29 | |
---|
30 | TreeNode *node = this; |
---|
31 | |
---|
32 | if (cmp(name, isdir, node->name, node->dir_id) < 0) // prev |
---|
33 | { |
---|
34 | while (cmp(name, isdir, node->name, node->dir_id) < 0) |
---|
35 | { |
---|
36 | if (node->prev) |
---|
37 | node = node->prev; |
---|
38 | else |
---|
39 | break; // insert after dummy node |
---|
40 | } |
---|
41 | } |
---|
42 | else |
---|
43 | { |
---|
44 | while (node->next && (cmp(name, isdir, node->next->name, node->next->dir_id) >= 0)) |
---|
45 | { |
---|
46 | node = node->next; |
---|
47 | } |
---|
48 | } |
---|
49 | |
---|
50 | // insert after current node |
---|
51 | newNode->prev = node; |
---|
52 | newNode->next = node->next; |
---|
53 | if (node->next) node->next->prev = newNode; |
---|
54 | node->next = newNode; |
---|
55 | |
---|
56 | return newNode; |
---|
57 | } |
---|
58 | }; |
---|
59 | |
---|
60 | TreeNode *ReadDirectory(TreeNode *node, char *path); |
---|