diff options
Diffstat (limited to 'src/pmns/pmnsutil.c')
-rw-r--r-- | src/pmns/pmnsutil.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/pmns/pmnsutil.c b/src/pmns/pmnsutil.c new file mode 100644 index 0000000..1e0acf9 --- /dev/null +++ b/src/pmns/pmnsutil.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 1995 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "pmapi.h" +#include "impl.h" +#include "pmnsutil.h" + +static FILE *outf; + +/* + * breadth-first traversal + */ +void +pmns_traverse(__pmnsNode *p, int depth, char *path, void(*func)(__pmnsNode *, int, char *)) +{ + char *newpath; + __pmnsNode *q; + + if (p != NULL) { + /* breadth */ + for (q = p; q != NULL; q = q->next) + (*func)(q, depth, path); + if (depth > 0) + (*func)(NULL, -1, NULL); /* end of level */ + /* descend */ + for (q = p; q != NULL; q = q->next) { + if (q->first != NULL) { + newpath = (char *)malloc(strlen(path)+strlen(q->name)+2); + if (depth == 0) + *newpath = '\0'; + else if (depth == 1) + strcpy(newpath, q->name); + else { + strcpy(newpath, path); + strcat(newpath, "."); + strcat(newpath, q->name); + } + pmns_traverse(q->first, depth+1, newpath, func); + free(newpath); + } + } + } +} + +/* + * generate an ASCII PMNS from the internal format produced by + * pmLoadNameSpace and friends + */ +static void +output(__pmnsNode *p, int depth, char *path) +{ + static int lastdepth = -1; + + if (depth == 0) { + fprintf(outf, "root {\n"); + lastdepth = 1; + return; + } + else if (depth < 0) { + if (lastdepth > 0) + fprintf(outf, "}\n"); + lastdepth = -1; + return; + } + else if (depth != lastdepth) + fprintf(outf, "\n%s {\n", path); + lastdepth = depth; + if (p->first != NULL) + fprintf(outf, "\t%s\n", p->name); + else { + if (pmid_domain(p->pmid) == DYNAMIC_PMID && pmid_item(p->pmid) == 0) + fprintf(outf, "\t%s\t%d:*:*\n", p->name, pmid_cluster(p->pmid)); + else + fprintf(outf, "\t%s\t%d:%d:%d\n", p->name, pmid_domain(p->pmid), pmid_cluster(p->pmid), pmid_item(p->pmid)); + } +} + +void +pmns_output(__pmnsNode *root, FILE *f) +{ + outf = f; + pmns_traverse(root, 0, "", output); + output(NULL, -2, NULL); /* special hack for null PMNS */ +} |