2 * dump-identifiers.c --
4 * Operations to dump flat identifier lists for SMI modules.
6 * Copyright (c) 2000 Frank Strauss, Technical University of Braunschweig.
7 * Copyright (c) 2000 J. Schoenwaelder, Technical University of Braunschweig.
9 * See the file "COPYING" for information on usage and redistribution
10 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
12 * @(#) $Id: dump-identifiers.c 5758 2006-08-16 21:10:05Z schoenw $
28 static int moduleLen = 0;
29 static int identifierLen = 0;
31 static int showlines = 0;
32 static int showpath = 0;
33 static int ctagfmt = 0;
36 static char *smiStringNodekind(SmiNodekind nodekind)
39 (nodekind == SMI_NODEKIND_UNKNOWN) ? "<unknown>" :
40 (nodekind == SMI_NODEKIND_NODE) ? "node" :
41 (nodekind == SMI_NODEKIND_SCALAR) ? "scalar" :
42 (nodekind == SMI_NODEKIND_TABLE) ? "table" :
43 (nodekind == SMI_NODEKIND_ROW) ? "row" :
44 (nodekind == SMI_NODEKIND_COLUMN) ? "column" :
45 (nodekind == SMI_NODEKIND_NOTIFICATION) ? "notification" :
46 (nodekind == SMI_NODEKIND_GROUP) ? "group" :
47 (nodekind == SMI_NODEKIND_COMPLIANCE) ? "compliance" :
48 (nodekind == SMI_NODEKIND_CAPABILITIES) ? "capabilities" :
54 static void fprintNodeIdentifiers(FILE *f, int modc, SmiModule **modv)
60 for (i = 0; i < modc; i++) {
61 for (smiNode = smiGetFirstNode(modv[i], SMI_NODEKIND_ANY);
63 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
66 fprintf(f, "%*s", -identifierLen, smiNode->name);
67 fprintf(f, " %d", smiGetNodeLine(smiNode));
68 fprintf(f, " %*s", -moduleLen, modv[i]->path);
69 fprintf(f, " %s OBJECT-TYPE -- %s\n", smiNode->name,
70 smiStringNodekind(smiNode->nodekind));
73 -moduleLen, showpath ? modv[i]->path : modv[i]->name);
75 fprintf(f, ":%d:", smiGetNodeLine(smiNode));
77 fprintf(f, " %*s %-12s ", -identifierLen, smiNode->name,
78 smiStringNodekind(smiNode->nodekind));
79 for (j = 0; j < smiNode->oidlen; j++) {
80 fprintf(f, j ? ".%u" : "%u", smiNode->oid[j]);
91 static void fprintTypeIdentifiers(FILE *f, int modc, SmiModule **modv)
96 for (i = 0; i < modc; i++) {
97 for (smiType = smiGetFirstType(modv[i]);
99 smiType = smiGetNextType(smiType)) {
102 fprintf(f, "%*s", -identifierLen, smiType->name);
103 fprintf(f, " %d", smiGetTypeLine(smiType));
104 fprintf(f, " %*s", -moduleLen, modv[i]->path);
105 fprintf(f, " %s TEXTUAL-CONVENTION\n", smiType->name);
108 -moduleLen, showpath ? modv[i]->path : modv[i]->name);
110 fprintf(f, ":%d:", smiGetTypeLine(smiType));
112 fprintf(f, " %*s %-12s\n", -identifierLen, smiType->name,
122 static void dumpIdentifiers(int modc, SmiModule **modv, int flags,
130 f = fopen(output, "w");
132 fprintf(stderr, "smidump: cannot open %s for writing: ", output);
138 for (moduleLen = 0, identifierLen = 0, i = 0; i < modc; i++) {
140 len = strlen(modv[i]->path);
142 len = strlen(modv[i]->name);
144 if (len > moduleLen) moduleLen = len;
145 for (smiNode = smiGetFirstNode(modv[i], SMI_NODEKIND_ANY);
147 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
149 len = strlen(smiNode->name);
150 if (len > identifierLen) identifierLen = len;
155 if (flags & SMIDUMP_FLAG_UNITE) {
157 if (! (flags & SMIDUMP_FLAG_SILENT)) {
158 fprintf(f, "# united list of identifiers (generated by smidump "
159 SMI_VERSION_STRING ")\n\n");
162 if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
163 fprintf(f, "# WARNING: this output may be incorrect due to "
164 "significant parse errors\n\n");
167 fprintTypeIdentifiers(f, modc, modv);
168 fprintNodeIdentifiers(f, modc, modv);
172 for (i = 0; i < modc; i++) {
174 if (! (flags & SMIDUMP_FLAG_SILENT)) {
175 fprintf(f, "# %s list of identifiers (generated by smidump "
176 SMI_VERSION_STRING ")\n\n",
180 if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
181 fprintf(f, "# WARNING: this output may be incorrect due to "
182 "significant parse errors\n\n");
185 fprintTypeIdentifiers(f, 1, &(modv[i]));
186 fprintNodeIdentifiers(f, 1, &(modv[i]));
190 if (fflush(f) || ferror(f)) {
191 perror("smidump: write error");
202 void initIdentifiers()
205 static SmidumpDriverOption opt[] = {
206 { "lines", OPT_FLAG, &showlines, 0,
207 "show line numbers"},
208 { "path", OPT_FLAG, &showpath, 0,
209 "show file path instead of module name"},
210 { "ctag", OPT_FLAG, &ctagfmt, 0,
211 "show symbols in [g]ctag format"},
215 static SmidumpDriver driver = {
220 "list of all identifiers",
225 smidumpRegisterDriver(&driver);