Sorting of nodes in a dir acording to ECMA-119, 9.3.
This commit is contained in:
parent
411524c330
commit
56cdd00638
@ -95,17 +95,17 @@ int main(int argc, char **argv)
|
|||||||
ecma119->iso_level = 1;
|
ecma119->iso_level = 1;
|
||||||
|
|
||||||
/* create low level tree */
|
/* create low level tree */
|
||||||
result = ecma119_tree_create(ecma119, (IsoNode*)iso_image_get_root(image), &tree);
|
result = ecma119_tree_create(ecma119, (IsoNode*)iso_image_get_root(image));
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
printf ("Error creating ecma-119 tree: %d\n", result);
|
printf ("Error creating ecma-119 tree: %d\n", result);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("================= ECMA-119 TREE =================\n");
|
printf("================= ECMA-119 TREE =================\n");
|
||||||
print_dir(tree, 0);
|
print_dir(ecma119->root, 0);
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
|
|
||||||
ecma119_node_free(tree);
|
ecma119_node_free(ecma119->root);
|
||||||
iso_image_unref(image);
|
iso_image_unref(image);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -238,18 +238,49 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ecma119_tree_create(Ecma119Image *img, IsoNode *iso, Ecma119Node **tree)
|
/**
|
||||||
|
* Compare the iso name of two ECMA-119 nodes
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
int cmp_node_name(const void *f1, const void *f2)
|
||||||
|
{
|
||||||
|
Ecma119Node *f = *((Ecma119Node**)f1);
|
||||||
|
Ecma119Node *g = *((Ecma119Node**)f2);
|
||||||
|
return strcmp(f->iso_name, g->iso_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts a the children of each directory in the ECMA-119 tree represented
|
||||||
|
* by \p root, acording to the order specified in ECMA-119, section 9.3.
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
void sort_tree(Ecma119Node *root)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
qsort(root->info.dir.children, root->info.dir.nchildren,
|
||||||
|
sizeof(void*), cmp_node_name);
|
||||||
|
for (i = 0; i < root->info.dir.nchildren; i++) {
|
||||||
|
if (root->info.dir.children[i]->type == ECMA119_DIR)
|
||||||
|
sort_tree(root->info.dir.children[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ecma119_tree_create(Ecma119Image *img, IsoNode *iso)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
ret = create_tree(img, iso, tree, 1, 0);
|
Ecma119Node *root;
|
||||||
|
|
||||||
|
ret = create_tree(img, iso, &root, 1, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
img->root = root;
|
||||||
|
sort_tree(root);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO
|
* TODO
|
||||||
* - reparent if RR
|
* - reparent if RR
|
||||||
* - sort files in dir
|
|
||||||
* - mangle names
|
* - mangle names
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ struct ecma119_node
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int ecma119_tree_create(Ecma119Image *img, IsoNode *iso, Ecma119Node **tree);
|
int ecma119_tree_create(Ecma119Image *img, IsoNode *iso);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free an Ecma119Node, and its children if node is a dir
|
* Free an Ecma119Node, and its children if node is a dir
|
||||||
|
Loading…
Reference in New Issue
Block a user