static void dumpImports(int modc, SmiModule **modv, int flags, char *output) { int i; FILE *f = stdout; if (output) { f = fopen(output, "w"); if (!f) { fprintf(stderr, "smidump: cannot open %s for writing: ", output); perror(NULL); exit(1); } } for (i = 0; i < modc; i++) { if (! (flags & SMIDUMP_FLAG_SILENT)) { fprintf(f, "# %s imports tree (generated by smidump " SMI_VERSION_STRING ")\n\n", modv[i]->name); } fprintf(f, "%s\n", modv[i]->name); fprintImports(f, modv[i], "", NULL); } if (fflush(f) || ferror(f)) { perror("smidump: write error"); exit(1); } if (output) { fclose(f); } }
static int fprintImports(FILE *f, SmiModule *smiModule, char *prefix, Imports *backtrace) { SmiModule *smiModule2; Imports *imports, *imp; int i, n, recurse = 0, done = 0; for (imp = backtrace; imp; imp = imp->nextPtr) { if (strcmp(imp->module, smiModule->name) == 0) { fprintf(stderr, "%s (recursion - aborted)\n", prefix); return 0; } } imp = (Imports *) xmalloc(sizeof(Imports)); imp->module = smiModule->name; imp->nextPtr = backtrace; backtrace = imp; imports = getImports(smiModule, &n); for (i = 0; i < n; i++) { char *newprefix; smiModule2 = smiGetModule(imports[i].module); recurse = (NULL == smiGetFirstImport(smiModule2)); if (recurse) { fprintf(f, "%s |\n", prefix); } fprintf(f, "%s +--%s [%d identifier%s]\n", prefix, imports[i].module, imports[i].count, imports[i].count > 1 ? "s" : ""); newprefix = xmalloc(strlen(prefix)+10); strcpy(newprefix, prefix); if (i == n-1) { strcat(newprefix, " "); } else { strcat(newprefix, " |"); } done = fprintImports(f, smiModule2, newprefix, backtrace); if (! recurse && done) { if (i == n-1) { fprintf(f, "%s \n", prefix); } else { fprintf(f, "%s |\n", prefix); } } xfree(newprefix); } freeImports(imports, n); xfree(backtrace); return recurse; }
static void dumpXml(int modc, SmiModule **modv, int flags, char *output) { int i; FILE *f = stdout; if (output) { f = fopen(output, "w"); if (!f) { fprintf(stderr, "smidump: cannot open %s for writing: ", output); perror(NULL); exit(1); } } for (i = 0; i < modc; i++) { fprint(f, "<?xml version=\"1.0\"?>\n"); if (!disabledoctype) { fprint(f, "<!DOCTYPE smi SYSTEM \"http://www.ibr.cs.tu-bs.de/projects/nmrg/smi.dtd\">\n"); } fprint(f, "\n"); fprint(f, "<!-- This module has been generated by smidump " SMI_VERSION_STRING ". Do not edit. -->\n"); fprint(f, "\n"); if (!disableschema) { fprint(f, "<smi xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"); fprint(f, " xsi:noNamespaceSchemaLocation=\"http://www.ibr.cs.tu-bs.de/projects/nmrg/smi.xsd\">\n"); } else { fprint(f, "<smi>\n"); } fprintModule(f, modv[i]); fprintImports(f, modv[i]); fprintTypedefs(f, modv[i]); fprintNodes(f, modv[i]); fprintNotifications(f, modv[i]); fprintGroups(f, modv[i]); fprintCompliances(f, modv[i]); fprint(f, "</smi>\n"); } if (fflush(f) || ferror(f)) { perror("smidump: write error"); exit(1); } if (output) { fclose(f); } }
static void dumpSming(int modc, SmiModule **modv, int flags, char *output) { SmiModule *smiModule; SmiNode *smiNode; int i; FILE *f = stdout; silent = (flags & SMIDUMP_FLAG_SILENT); if (output) { f = fopen(output, "w"); if (!f) { fprintf(stderr, "smidump: cannot open %s for writing: ", output); perror(NULL); exit(1); } } for (i = 0; i < modc; i++) { smiModule = modv[i]; fprint(f, "//\n"); fprint(f, "// This module has been generated by smidump " SMI_VERSION_STRING ". Do not edit.\n"); fprint(f, "//\n"); fprint(f, "module %s ", smiModule->name); fprint(f, "{\n"); fprint(f, "\n"); fprintImports(f, smiModule); if (! silent) { fprint(f, "//\n// MODULE META INFORMATION\n//\n\n"); } fprintSegment(f, INDENT, "organization", INDENTVALUE); fprint(f, "\n"); fprintMultilineString(f, INDENT, smiModule->organization); fprint(f, ";\n\n"); fprintSegment(f, INDENT, "contact", INDENTVALUE); fprint(f, "\n"); fprintMultilineString(f, INDENT, smiModule->contactinfo); fprint(f, ";\n\n"); fprintSegment(f, INDENT, "description", INDENTVALUE); fprint(f, "\n"); fprintMultilineString(f, INDENT, smiModule->description); fprint(f, ";\n\n"); if (smiModule->reference) { fprintSegment(f, INDENT, "reference", INDENTVALUE); fprint(f, "\n"); fprintMultilineString(f, INDENT, smiModule->reference); fprint(f, ";\n\n"); } fprintRevisions(f, smiModule); smiNode = smiGetModuleIdentityNode(smiModule); if (smiNode) { fprintSegment(f, INDENT, "identity", INDENTVALUE); fprint(f, "%s;\n\n", smiNode->name); } fprintTypedefs(f, smiModule); fprintObjects(f, smiModule); fprintNotifications(f, smiModule); fprintGroups(f, smiModule); fprintCompliances(f, smiModule); fprint(f, "}; // end of module %s.\n", smiModule->name); } if (fflush(f) || ferror(f)) { perror("smidump: write error"); exit(1); } if (output) { fclose(f); } }