[9a12c7e5] | 1 | inline int cmp(const char *a, bool a_isdir, const char *b, bool b_isdir) |
---|
[311dfa6] | 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 |
---|
[9a12c7e5] | 12 | const char *name; // file or directory name |
---|
[311dfa6] | 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 | } |
---|
[32b8506] | 23 | |
---|
[311dfa6] | 24 | // new entry in same directory |
---|
[9a12c7e5] | 25 | TreeNode *New(const char *name, bool isdir) |
---|
[311dfa6] | 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); |
---|