At present -I dts and -I fs modes both use the fill_fullpaths() helper function to fill in the fullpath and basenamelen fields of struct node, which are useful in later parts of the code. -I dtb mode, however, fills these in itself.
This patch simplifies flattree.c by making -I dtb mode use fill_fullpaths() like the others. Signed-off-by: David Gibson <[EMAIL PROTECTED]> Index: dtc/flattree.c =================================================================== --- dtc.orig/flattree.c 2008-02-29 13:38:15.000000000 +1100 +++ dtc/flattree.c 2008-02-29 16:46:02.000000000 +1100 @@ -704,59 +704,37 @@ static struct reserve_info *flat_read_me static char *nodename_from_path(const char *ppath, const char *cpath) { - const char *lslash; int plen; - lslash = strrchr(cpath, '/'); - if (! lslash) - return NULL; + plen = strlen(ppath); - plen = lslash - cpath; + if (!strneq(ppath, cpath, plen)) + die("Path \"%s\" is not valid as a child of \"%s\"\n", + cpath, ppath); - if (streq(cpath, "/") && streq(ppath, "")) - return ""; + /* root node is a special case */ + if (!streq(ppath, "/")) + plen++; - if ((plen == 0) && streq(ppath, "/")) - return strdup(lslash+1); - - if (! strneq(ppath, cpath, plen)) - return NULL; - - return strdup(lslash+1); -} - -static int find_basenamelen(const char *name) -{ - const char *atpos = strchr(name, '@'); - - if (atpos) - return atpos - name; - else - return strlen(name); + return strdup(cpath + plen); } static struct node *unflatten_tree(struct inbuf *dtbuf, struct inbuf *strbuf, - const char *parent_path, int flags) + const char *parent_flatname, int flags) { struct node *node; + char *flatname; u32 val; node = build_node(NULL, NULL); - if (flags & FTF_FULLPATH) { - node->fullpath = flat_read_string(dtbuf); - node->name = nodename_from_path(parent_path, node->fullpath); - - if (! node->name) - die("Path \"%s\" is not valid as a child of \"%s\"\n", - node->fullpath, parent_path); - } else { - node->name = flat_read_string(dtbuf); - node->fullpath = join_path(parent_path, node->name); - } + flatname = flat_read_string(dtbuf); - node->basenamelen = find_basenamelen(node->name); + if (flags & FTF_FULLPATH) + node->name = nodename_from_path(parent_flatname, flatname); + else + node->name = flatname; do { struct property *prop; @@ -773,8 +751,7 @@ static struct node *unflatten_tree(struc break; case FDT_BEGIN_NODE: - child = unflatten_tree(dtbuf,strbuf, node->fullpath, - flags); + child = unflatten_tree(dtbuf,strbuf, flatname, flags); add_child(node, child); break; Index: dtc/dtc.c =================================================================== --- dtc.orig/dtc.c 2008-02-28 12:55:04.000000000 +1100 +++ dtc/dtc.c 2008-02-29 16:16:07.000000000 +1100 @@ -55,7 +55,7 @@ char *join_path(const char *path, const return str; } -void fill_fullpaths(struct node *tree, const char *prefix) +static void fill_fullpaths(struct node *tree, const char *prefix) { struct node *child; const char *unit; @@ -208,6 +208,7 @@ int main(int argc, char *argv[]) if (! bi || ! bi->dt || bi->error) die("Couldn't read input tree\n"); + fill_fullpaths(bi->dt, ""); process_checks(force, bi); if (streq(outname, "-")) { Index: dtc/dtc.h =================================================================== --- dtc.orig/dtc.h 2008-02-28 17:02:38.000000000 +1100 +++ dtc/dtc.h 2008-02-29 16:16:07.000000000 +1100 @@ -264,6 +264,5 @@ struct boot_info *dt_from_fs(const char /* misc */ char *join_path(const char *path, const char *name); -void fill_fullpaths(struct node *tree, const char *prefix); #endif /* _DTC_H */ Index: dtc/fstree.c =================================================================== --- dtc.orig/fstree.c 2008-02-28 12:55:04.000000000 +1100 +++ dtc/fstree.c 2008-02-29 16:16:07.000000000 +1100 @@ -87,8 +87,6 @@ struct boot_info *dt_from_fs(const char tree = read_fstree(dirname); tree = name_node(tree, "", NULL); - fill_fullpaths(tree, ""); - return build_boot_info(NULL, tree); } Index: dtc/treesource.c =================================================================== --- dtc.orig/treesource.c 2008-02-28 17:02:36.000000000 +1100 +++ dtc/treesource.c 2008-02-29 16:16:07.000000000 +1100 @@ -37,8 +37,6 @@ struct boot_info *dt_from_source(const c if (yyparse() != 0) return NULL; - fill_fullpaths(the_boot_info->dt, ""); - the_boot_info->error = treesource_error; return the_boot_info; } -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev