Blame tools/dump-metrics.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-metrics.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to compute and dump some MIB metrics.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 2000 Frank Strauss, Technical University of Braunschweig.
Packit Service 9ccfef
 * Copyright (c) 2000 J. Schoenwaelder, Technical University of Braunschweig.
Packit Service 9ccfef
 * Copyright (c) 2002 J. Schoenwaelder, University of Osnabrueck.
Packit Service 9ccfef
 * Copyright (c) 2004 J. Schoenwaelder, International University Bremen.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * See the file "COPYING" for information on usage and redistribution
Packit Service 9ccfef
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * @(#) $Id: dump-metrics.c 8090 2008-04-18 12:56:29Z strauss $
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
  # revisions
Packit Service 9ccfef
  # imports
Packit Service 9ccfef
  # row creations:
Packit Service 9ccfef
  # count node references in notification definitions
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
#include <config.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "smidump.h"
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int raw = 0;
Packit Service 9ccfef
Packit Service 9ccfef
static int silent = 0;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct BasetypeCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long unknown;
Packit Service 9ccfef
    unsigned long integer32;
Packit Service 9ccfef
    unsigned long octetstring;
Packit Service 9ccfef
    unsigned long objectidentifier;
Packit Service 9ccfef
    unsigned long unsigned32;
Packit Service 9ccfef
    unsigned long integer64;
Packit Service 9ccfef
    unsigned long unsigned64;
Packit Service 9ccfef
    unsigned long float32;
Packit Service 9ccfef
    unsigned long float64;
Packit Service 9ccfef
    unsigned long float128;
Packit Service 9ccfef
    unsigned long enums;
Packit Service 9ccfef
    unsigned long bits;
Packit Service 9ccfef
    unsigned long pointer;
Packit Service 9ccfef
} BasetypeCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct StatusCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long current;
Packit Service 9ccfef
    unsigned long deprecated;
Packit Service 9ccfef
    unsigned long obsolete;
Packit Service 9ccfef
} StatusCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct AccessCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long noaccess;
Packit Service 9ccfef
    unsigned long notify;
Packit Service 9ccfef
    unsigned long readonly;
Packit Service 9ccfef
    unsigned long readwrite;
Packit Service 9ccfef
} AccessCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct IndexCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long index;
Packit Service 9ccfef
    unsigned long augment;
Packit Service 9ccfef
    unsigned long reorder;
Packit Service 9ccfef
    unsigned long sparse;
Packit Service 9ccfef
    unsigned long expand;
Packit Service 9ccfef
} IndexCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct IndexLenCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long length[11];
Packit Service 9ccfef
} IndexLenCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct TableLenCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long length[81];
Packit Service 9ccfef
} TableLenCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct ScalarLenCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long length[81];
Packit Service 9ccfef
} ScalarLenCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct IndexComplexityCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long complexity[100];
Packit Service 9ccfef
} IndexComplexityCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct LengthCounter {
Packit Service 9ccfef
    unsigned long total;
Packit Service 9ccfef
    unsigned long descr;
Packit Service 9ccfef
    unsigned long descr_len;
Packit Service 9ccfef
    unsigned long reference;
Packit Service 9ccfef
    unsigned long reference_len;
Packit Service 9ccfef
    unsigned long units;
Packit Service 9ccfef
    unsigned long units_len;
Packit Service 9ccfef
    unsigned long format;
Packit Service 9ccfef
    unsigned long format_len;
Packit Service 9ccfef
} LengthCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct RowStatusCounter {
Packit Service 9ccfef
    unsigned long basetables;
Packit Service 9ccfef
    unsigned long rowstatus;
Packit Service 9ccfef
    unsigned long storagetype;
Packit Service 9ccfef
} RowStatusCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct Metrics {
Packit Service 9ccfef
    BasetypeCounter basetypesColumns;
Packit Service 9ccfef
    BasetypeCounter basetypesScalars;
Packit Service 9ccfef
    BasetypeCounter basetypesAll;
Packit Service 9ccfef
    StatusCounter   statusTypes;
Packit Service 9ccfef
    StatusCounter   statusTables;
Packit Service 9ccfef
    StatusCounter   statusColumns;
Packit Service 9ccfef
    StatusCounter   statusScalars;
Packit Service 9ccfef
    StatusCounter   statusNotifications;
Packit Service 9ccfef
    StatusCounter   statusGroups;
Packit Service 9ccfef
    StatusCounter   statusCompliances;
Packit Service 9ccfef
    StatusCounter   statusAll;
Packit Service 9ccfef
    AccessCounter   accessColumns;
Packit Service 9ccfef
    AccessCounter   accessScalars;
Packit Service 9ccfef
    AccessCounter   accessAll;
Packit Service 9ccfef
    IndexCounter    indexTables;
Packit Service 9ccfef
    IndexLenCounter indexLenTables;
Packit Service 9ccfef
    IndexComplexityCounter indexComplexity;
Packit Service 9ccfef
    TableLenCounter tableLength;
Packit Service 9ccfef
    ScalarLenCounter scalarLength;
Packit Service 9ccfef
    LengthCounter   lengthTypes;
Packit Service 9ccfef
    LengthCounter   lengthTables;
Packit Service 9ccfef
    LengthCounter   lengthRows;
Packit Service 9ccfef
    LengthCounter   lengthColumns;
Packit Service 9ccfef
    LengthCounter   lengthScalars;
Packit Service 9ccfef
    LengthCounter   lengthNotifications;
Packit Service 9ccfef
    LengthCounter   lengthAll;
Packit Service 9ccfef
} Metrics;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct UsageCounter {
Packit Service 9ccfef
    char     *module;
Packit Service 9ccfef
    char     *name;
Packit Service 9ccfef
    unsigned count;
Packit Service 9ccfef
    struct UsageCounter *nextPtr;
Packit Service 9ccfef
} UsageCounter;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static UsageCounter *typeList = NULL;
Packit Service 9ccfef
static UsageCounter *extTypeList = NULL;
Packit Service 9ccfef
static UsageCounter *extNodeList = NULL;
Packit Service 9ccfef
static UsageCounter *extModuleList = NULL;
Packit Service 9ccfef
static UsageCounter *indexComplexityList = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
#define INCR_NODE 0x01
Packit Service 9ccfef
#define INCR_TYPE 0x02
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char*
Packit Service 9ccfef
getDateString(time_t t)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char   *s = NULL;
Packit Service 9ccfef
    struct tm	  *tm;
Packit Service 9ccfef
Packit Service 9ccfef
    if (s) xfree(s);
Packit Service 9ccfef
    
Packit Service 9ccfef
    tm = gmtime(&t);
Packit Service 9ccfef
    smiAsprintf(&s, "%04d-%02d-%02d",
Packit Service 9ccfef
		tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char*
Packit Service 9ccfef
language(SmiLanguage language)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return
Packit Service 9ccfef
	(language == SMI_LANGUAGE_UNKNOWN)    ? "-" :
Packit Service 9ccfef
	(language == SMI_LANGUAGE_SMIV1)      ? "SMIv1" :
Packit Service 9ccfef
	(language == SMI_LANGUAGE_SMIV2)      ? "SMIv2" :
Packit Service 9ccfef
	(language == SMI_LANGUAGE_SMING)      ? "SMIng" :
Packit Service 9ccfef
						"-";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int
Packit Service 9ccfef
calcSize(SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *smiNode;
Packit Service 9ccfef
    SmiType *smiType;
Packit Service 9ccfef
    int size = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiType = smiGetFirstType(smiModule);
Packit Service 9ccfef
	 smiType;
Packit Service 9ccfef
	 smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
	if (smiType->name) {
Packit Service 9ccfef
	    size++;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit Service 9ccfef
	 smiNode;
Packit Service 9ccfef
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit Service 9ccfef
Packit Service 9ccfef
	switch (smiNode->nodekind) {
Packit Service 9ccfef
	case SMI_NODEKIND_SCALAR:
Packit Service 9ccfef
	case SMI_NODEKIND_COLUMN:
Packit Service 9ccfef
	case SMI_NODEKIND_NOTIFICATION:
Packit Service 9ccfef
	    size++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	default:
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return size;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef void	(*ForEachIndexFunc)	(FILE *f, SmiNode *groupNode, SmiNode *smiNode, void *data);
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
foreachIndexDo(FILE *f, SmiNode *smiNode, ForEachIndexFunc func, void *data)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *indexNode = NULL, *iNode;
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    
Packit Service 9ccfef
    switch (smiNode->indexkind) {
Packit Service 9ccfef
    case SMI_INDEX_INDEX:
Packit Service 9ccfef
    case SMI_INDEX_REORDER:
Packit Service 9ccfef
	indexNode = smiNode;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_EXPAND:	/* TODO: we have to do more work here! */
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_AUGMENT:
Packit Service 9ccfef
    case SMI_INDEX_SPARSE:
Packit Service 9ccfef
	indexNode = smiGetRelatedNode(smiNode);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_UNKNOWN:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (indexNode) {
Packit Service 9ccfef
	for (smiElement = smiGetFirstElement(indexNode);
Packit Service 9ccfef
	     smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	    iNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
	    if (iNode) {
Packit Service 9ccfef
		(func) (f, smiNode, iNode, data);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static UsageCounter*
Packit Service 9ccfef
incrUsageCounter(UsageCounter *uCntList, char *module, char *name, int incr)
Packit Service 9ccfef
{
Packit Service 9ccfef
    UsageCounter *uCnt;
Packit Service 9ccfef
Packit Service 9ccfef
    for (uCnt = uCntList; uCnt; uCnt = uCnt->nextPtr) {
Packit Service 9ccfef
	if (strcmp(uCnt->module, module) == 0
Packit Service 9ccfef
	    && (! name || strcmp(uCnt->name, name) == 0)) {
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (! uCnt) {
Packit Service 9ccfef
	uCnt = (UsageCounter *) xmalloc(sizeof(UsageCounter));
Packit Service 9ccfef
	uCnt->module = xstrdup(module);
Packit Service 9ccfef
	uCnt->name = name ? xstrdup(name) : NULL;
Packit Service 9ccfef
	uCnt->count = 0;
Packit Service 9ccfef
	uCnt->nextPtr = uCntList;
Packit Service 9ccfef
	uCntList = uCnt;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    uCnt->count += incr;
Packit Service 9ccfef
    return uCntList;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrTypeAndNodeUsageCounter(SmiModule *smiModule, SmiNode *smiNode, int flags)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiType *smiType;
Packit Service 9ccfef
    char *extModule;
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * First check whether the node is external. If yes, increment the
Packit Service 9ccfef
     * external node counter and we are done.
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    extModule = smiGetNodeModule(smiNode)->name;
Packit Service 9ccfef
    if (extModule
Packit Service 9ccfef
	&& strcmp(extModule, smiModule->name) != 0) {
Packit Service 9ccfef
	if (flags & INCR_NODE) {
Packit Service 9ccfef
	    extNodeList = incrUsageCounter(extNodeList,
Packit Service 9ccfef
					   extModule, smiNode->name, 1);
Packit Service 9ccfef
	    extModuleList = incrUsageCounter(extModuleList, extModule, NULL, 1);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * Next, check whether the type of the node is external. If yes,
Packit Service 9ccfef
     * increment the external type counter and we are done. Do not
Packit Service 9ccfef
     * count base types (that is types that have no parent type).
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
    if (! smiType) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (smiType->name && smiGetParentType(smiType)) {
Packit Service 9ccfef
	char *extModule = smiGetTypeModule(smiType)->name;
Packit Service 9ccfef
	if (extModule /* && *extModule */
Packit Service 9ccfef
	    && strcmp(extModule, smiModule->name) != 0) {
Packit Service 9ccfef
	    if (flags & INCR_TYPE) {
Packit Service 9ccfef
		extTypeList = incrUsageCounter(extTypeList,
Packit Service 9ccfef
					       extModule, smiType->name, 1);
Packit Service 9ccfef
		extModuleList = incrUsageCounter(extModuleList, extModule, NULL, 1);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * Finally, count the type name (whether external or not does not
Packit Service 9ccfef
     * matter here nor does it matter whether it is a base type or
Packit Service 9ccfef
     * not).
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    if (! smiType->name && smiGetParentType(smiType)) {
Packit Service 9ccfef
	smiType = smiGetParentType(smiType);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    typeList = incrUsageCounter(typeList, smiGetTypeModule(smiType)->name,
Packit Service 9ccfef
				smiType->name, 1);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrIndexComplexityCounter(SmiModule *smiModule, SmiNode *smiNode, int complexity)
Packit Service 9ccfef
{
Packit Service 9ccfef
    indexComplexityList = incrUsageCounter(indexComplexityList,
Packit Service 9ccfef
					   smiModule->name, smiNode->name, complexity);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int
Packit Service 9ccfef
cmp(const void *va, const void *vb)
Packit Service 9ccfef
{
Packit Service 9ccfef
    UsageCounter **a = (UsageCounter **) va;
Packit Service 9ccfef
    UsageCounter **b = (UsageCounter **) vb;
Packit Service 9ccfef
Packit Service 9ccfef
    if ((*a)->count > (*b)->count) return -1;
Packit Service 9ccfef
    if ((*a)->count < (*b)->count) return 1;
Packit Service 9ccfef
Packit Service 9ccfef
    if ((*a)->module && (*b)->module) {
Packit Service 9ccfef
	int x = strcmp((*a)->module,  (*b)->module);
Packit Service 9ccfef
	if (x) return x;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if ((*a)->name && (*b)->name) {
Packit Service 9ccfef
	int x = strcmp((*a)->name,  (*b)->name);
Packit Service 9ccfef
	if (x) return x;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return 0;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int
Packit Service 9ccfef
fprintRevisions(FILE *f, int modLen, SmiRevision *smiRevision,
Packit Service 9ccfef
		SmiModule *smiModule, int size)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int n = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (smiRevision) {
Packit Service 9ccfef
	n = fprintRevisions(f, modLen,
Packit Service 9ccfef
			    smiGetNextRevision(smiRevision), smiModule, -1);
Packit Service 9ccfef
	fprintf(f, "%-*s %7s  ", modLen, smiModule->name,
Packit Service 9ccfef
		(size >= 0) ? language(smiModule->language) : "-");
Packit Service 9ccfef
 	if (size >= 0) {
Packit Service 9ccfef
	    fprintf(f, "%4d", size);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintf(f, "   -");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "   %3d    %s\n", n, getDateString(smiRevision->date));
Packit Service 9ccfef
	n++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (!smiRevision && size >= 0) {
Packit Service 9ccfef
	fprintf(f, "%-*s %7s  ", modLen, smiModule->name,
Packit Service 9ccfef
		language(smiModule->language));
Packit Service 9ccfef
	fprintf(f, "%4d", size);
Packit Service 9ccfef
	fprintf(f, "     -    ----------\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    return n;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintRevision(FILE *f, int modc, SmiModule **modv)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    int modLen = 8;
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	if (modLen < strlen(modv[i]->name)) {
Packit Service 9ccfef
	    modLen = strlen(modv[i]->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprintf(f, "%-*s LANGUAGE SIZE REVISION DATE\n", modLen, "MODULE");
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	fprintRevisions(f, modLen, smiGetFirstRevision(modv[i]),
Packit Service 9ccfef
			modv[i], calcSize(modv[i]));
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
 
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintTypeUsage(FILE *f, UsageCounter *typeUsageList)
Packit Service 9ccfef
{
Packit Service 9ccfef
    UsageCounter *uCnt;
Packit Service 9ccfef
    int modLen = 8, nameLen = 8;
Packit Service 9ccfef
    unsigned total = 0;
Packit Service 9ccfef
    int i, cnt = 0;
Packit Service 9ccfef
    UsageCounter **sortCnt;
Packit Service 9ccfef
Packit Service 9ccfef
    /* should be sorted */
Packit Service 9ccfef
Packit Service 9ccfef
    for (uCnt = typeUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
Packit Service 9ccfef
	if (modLen < strlen(uCnt->module)) {
Packit Service 9ccfef
	    modLen = strlen(uCnt->module);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (nameLen < strlen(uCnt->name)) {
Packit Service 9ccfef
	    nameLen = strlen(uCnt->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	total += uCnt->count;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt == 0) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /* create an array for a quick qsort */
Packit Service 9ccfef
Packit Service 9ccfef
    sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    for (uCnt = typeUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
Packit Service 9ccfef
	sortCnt[i] = uCnt;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (! silent) {
Packit Service 9ccfef
	fputs(
Packit Service 9ccfef
"# The following table shows the distribution of the number of references\n"
Packit Service 9ccfef
"# to defined types (including base types) in the set of loaded MIB\n"
Packit Service 9ccfef
"# modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(f, "%-*s %-*s   USAGE\n", modLen, "MODULE", nameLen, "TYPE");
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < cnt; i++) {
Packit Service 9ccfef
	fprintf(f, "%-*s %-*s ",
Packit Service 9ccfef
		modLen, sortCnt[i]->module, nameLen, sortCnt[i]->name);
Packit Service 9ccfef
	if (raw) {
Packit Service 9ccfef
	    fprintf(f, "%8u\n", sortCnt[i]->count);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count * 100 / total);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    xfree(sortCnt);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintExtTypeUsage(FILE *f, UsageCounter *typeUsageList)
Packit Service 9ccfef
{
Packit Service 9ccfef
    UsageCounter *uCnt;
Packit Service 9ccfef
    int modLen = 8, nameLen = 8;
Packit Service 9ccfef
    unsigned total = 0;
Packit Service 9ccfef
    int i, cnt = 0;
Packit Service 9ccfef
    UsageCounter **sortCnt;
Packit Service 9ccfef
Packit Service 9ccfef
    /* should be sorted */
Packit Service 9ccfef
Packit Service 9ccfef
    for (uCnt = typeUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
Packit Service 9ccfef
	if (modLen < strlen(uCnt->module)) {
Packit Service 9ccfef
	    modLen = strlen(uCnt->module);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (nameLen < strlen(uCnt->name)) {
Packit Service 9ccfef
	    nameLen = strlen(uCnt->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	total += uCnt->count;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt == 0) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /* create an array for a quick qsort */
Packit Service 9ccfef
Packit Service 9ccfef
    sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    for (uCnt = typeUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
Packit Service 9ccfef
	sortCnt[i] = uCnt;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (! silent) {
Packit Service 9ccfef
	fputs(
Packit Service 9ccfef
"# The following table shows the distribution of the number of references\n"
Packit Service 9ccfef
"# to externally defined types (excluding base types) in the set of loaded\n"
Packit Service 9ccfef
"# MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(f, "%-*s %-*s EXT-USAGE\n", modLen, "MODULE", nameLen, "TYPE");
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < cnt; i++) {
Packit Service 9ccfef
	fprintf(f, "%-*s %-*s ",
Packit Service 9ccfef
		modLen, sortCnt[i]->module, nameLen, sortCnt[i]->name);
Packit Service 9ccfef
	if (raw) {
Packit Service 9ccfef
	    fprintf(f, "%8u\n", sortCnt[i]->count);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count * 100 / total);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    xfree(sortCnt);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintExtNodeUsage(FILE *f, UsageCounter *typeUsageList)
Packit Service 9ccfef
{
Packit Service 9ccfef
    UsageCounter *uCnt;
Packit Service 9ccfef
    int modLen = 8, nameLen = 8;
Packit Service 9ccfef
    unsigned total = 0;
Packit Service 9ccfef
    int i, cnt = 0;
Packit Service 9ccfef
    UsageCounter **sortCnt;
Packit Service 9ccfef
Packit Service 9ccfef
    /* should be sorted */
Packit Service 9ccfef
Packit Service 9ccfef
    for (uCnt = typeUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
Packit Service 9ccfef
	if (modLen < strlen(uCnt->module)) {
Packit Service 9ccfef
	    modLen = strlen(uCnt->module);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (nameLen < strlen(uCnt->name)) {
Packit Service 9ccfef
	    nameLen = strlen(uCnt->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	total += uCnt->count;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt == 0) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /* create an array for a quick qsort */
Packit Service 9ccfef
Packit Service 9ccfef
    sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    for (uCnt = typeUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
Packit Service 9ccfef
	sortCnt[i] = uCnt;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (! silent) {
Packit Service 9ccfef
	fputs(
Packit Service 9ccfef
"# The following table shows the distribution of the number of references\n"
Packit Service 9ccfef
"# to externally defined nodes in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(f, "%-*s %-*s EXT-USAGE\n", modLen, "MODULE", nameLen, "NODE");
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < cnt; i++) {
Packit Service 9ccfef
	fprintf(f, "%-*s %-*s ",
Packit Service 9ccfef
		modLen, sortCnt[i]->module, nameLen, sortCnt[i]->name);
Packit Service 9ccfef
	if (raw) {
Packit Service 9ccfef
	    fprintf(f, "%8u\n", sortCnt[i]->count);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count * 100 / total);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    xfree(sortCnt);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintModuleUsage(FILE *f, UsageCounter *modUsageList)
Packit Service 9ccfef
{
Packit Service 9ccfef
    UsageCounter *uCnt;
Packit Service 9ccfef
    int modLen = 8;
Packit Service 9ccfef
    unsigned total = 0;
Packit Service 9ccfef
    int i, cnt = 0;
Packit Service 9ccfef
    UsageCounter **sortCnt;
Packit Service 9ccfef
Packit Service 9ccfef
    /* should be sorted */
Packit Service 9ccfef
Packit Service 9ccfef
    for (uCnt = modUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
Packit Service 9ccfef
	if (modLen < strlen(uCnt->module)) {
Packit Service 9ccfef
	    modLen = strlen(uCnt->module);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	total += uCnt->count;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt == 0) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /* create an array for a quick qsort */
Packit Service 9ccfef
Packit Service 9ccfef
    sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    for (uCnt = modUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
Packit Service 9ccfef
	sortCnt[i] = uCnt;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
Packit Service 9ccfef
Packit Service 9ccfef
    if (! silent) {
Packit Service 9ccfef
	fputs(
Packit Service 9ccfef
"# The following table shows the distribution of the number of references\n"
Packit Service 9ccfef
"# to externally defined items (such as types or objects) accumulated by\n"
Packit Service 9ccfef
"# the defining MIB module in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(f, "%-*s EXT-USAGE\n", modLen, "MODULE");
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < cnt; i++) {
Packit Service 9ccfef
	fprintf(f, "%-*s ", modLen, sortCnt[i]->module);
Packit Service 9ccfef
	if (raw) {
Packit Service 9ccfef
	    fprintf(f, "%8u\n", sortCnt[i]->count);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count * 100 / total);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    xfree(sortCnt);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintIndexComplexity(FILE *f, UsageCounter *modUsageList)
Packit Service 9ccfef
{
Packit Service 9ccfef
    UsageCounter *uCnt;
Packit Service 9ccfef
    int modLen = 8;
Packit Service 9ccfef
    int nameLen = 8;
Packit Service 9ccfef
    unsigned total = 0;
Packit Service 9ccfef
    int i, cnt = 0;
Packit Service 9ccfef
    UsageCounter **sortCnt;
Packit Service 9ccfef
Packit Service 9ccfef
    /* should be sorted */
Packit Service 9ccfef
Packit Service 9ccfef
    for (uCnt = modUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
Packit Service 9ccfef
	if (modLen < strlen(uCnt->module)) {
Packit Service 9ccfef
	    modLen = strlen(uCnt->module);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (nameLen < strlen(uCnt->name)) {
Packit Service 9ccfef
	    nameLen = strlen(uCnt->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	total += uCnt->count;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt == 0) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /* create an array for a quick qsort */
Packit Service 9ccfef
Packit Service 9ccfef
    sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
Packit Service 9ccfef
    for (uCnt = modUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
Packit Service 9ccfef
	sortCnt[i] = uCnt;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
Packit Service 9ccfef
Packit Service 9ccfef
    if (! silent) {
Packit Service 9ccfef
	fputs(
Packit Service 9ccfef
"# The following table shows the distribution of the index complexity\n"
Packit Service 9ccfef
"# in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(f, "%-*s %-*s COMPLEXITY\n", modLen, "MODULE", nameLen, "TABLE");
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < cnt; i++) {
Packit Service 9ccfef
	fprintf(f, "%-*s %-*s ", modLen, sortCnt[i]->module, nameLen, sortCnt[i]->name);
Packit Service 9ccfef
	if (raw) {
Packit Service 9ccfef
	    fprintf(f, "%8u\n", sortCnt[i]->count);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    xfree(sortCnt);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
freeUsageCounter(UsageCounter *usageCounterList)
Packit Service 9ccfef
{
Packit Service 9ccfef
    UsageCounter *uCnt, *p;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (uCnt = usageCounterList; uCnt; ) {
Packit Service 9ccfef
	p = uCnt, uCnt = uCnt->nextPtr;
Packit Service 9ccfef
	xfree(p->module);
Packit Service 9ccfef
	xfree(p->name);
Packit Service 9ccfef
	xfree(p);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrBasetypeCounter(BasetypeCounter *basetypeCounter, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiType *smiType;
Packit Service 9ccfef
Packit Service 9ccfef
    smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
    if (smiType) {
Packit Service 9ccfef
	basetypeCounter->total++;
Packit Service 9ccfef
	switch (smiType->basetype) {
Packit Service 9ccfef
	case SMI_BASETYPE_UNKNOWN:
Packit Service 9ccfef
	    basetypeCounter->unknown++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_INTEGER32:
Packit Service 9ccfef
	    basetypeCounter->integer32++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_OCTETSTRING:
Packit Service 9ccfef
	    basetypeCounter->octetstring++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit Service 9ccfef
	    basetypeCounter->objectidentifier++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_UNSIGNED32:
Packit Service 9ccfef
	    basetypeCounter->unsigned32++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_INTEGER64:
Packit Service 9ccfef
	    basetypeCounter->integer64++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_UNSIGNED64:
Packit Service 9ccfef
	    basetypeCounter->unsigned64++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_FLOAT32:
Packit Service 9ccfef
	    basetypeCounter->float32++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_FLOAT64:
Packit Service 9ccfef
	    basetypeCounter->float64++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_FLOAT128:
Packit Service 9ccfef
	    basetypeCounter->float128++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_ENUM:
Packit Service 9ccfef
	    basetypeCounter->enums++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_BITS:
Packit Service 9ccfef
	    basetypeCounter->bits++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_BASETYPE_POINTER:
Packit Service 9ccfef
	    basetypeCounter->pointer++;
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrStatusCounter(StatusCounter *cnt, SmiStatus smiStatus)
Packit Service 9ccfef
{
Packit Service 9ccfef
    cnt->total++;
Packit Service 9ccfef
    switch (smiStatus) {
Packit Service 9ccfef
    case SMI_STATUS_CURRENT:
Packit Service 9ccfef
    case SMI_STATUS_MANDATORY:
Packit Service 9ccfef
    case SMI_STATUS_OPTIONAL:
Packit Service 9ccfef
	cnt->current++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_STATUS_DEPRECATED:
Packit Service 9ccfef
	cnt->deprecated++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_STATUS_OBSOLETE:
Packit Service 9ccfef
	cnt->obsolete++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_STATUS_UNKNOWN:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrAccessCounter(AccessCounter *cnt, SmiAccess smiAccess)
Packit Service 9ccfef
{
Packit Service 9ccfef
    cnt->total++;
Packit Service 9ccfef
    switch (smiAccess) {
Packit Service 9ccfef
    case SMI_ACCESS_NOT_ACCESSIBLE:
Packit Service 9ccfef
	cnt->noaccess++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_ACCESS_NOTIFY:
Packit Service 9ccfef
	cnt->notify++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_ACCESS_READ_ONLY:
Packit Service 9ccfef
	cnt->readonly++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_ACCESS_READ_WRITE:
Packit Service 9ccfef
	cnt->readwrite++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_ACCESS_INSTALL:
Packit Service 9ccfef
    case SMI_ACCESS_INSTALL_NOTIFY:
Packit Service 9ccfef
    case SMI_ACCESS_REPORT_ONLY:
Packit Service 9ccfef
    case SMI_ACCESS_UNKNOWN:
Packit Service 9ccfef
    case SMI_ACCESS_NOT_IMPLEMENTED:
Packit Service 9ccfef
    case SMI_ACCESS_EVENT_ONLY:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrIndexCounter(IndexCounter *cnt, SmiIndexkind indexkind)
Packit Service 9ccfef
{
Packit Service 9ccfef
    cnt->total++;
Packit Service 9ccfef
    switch (indexkind) {
Packit Service 9ccfef
    case SMI_INDEX_INDEX:
Packit Service 9ccfef
	cnt->index++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_AUGMENT:
Packit Service 9ccfef
	cnt->augment++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_REORDER:
Packit Service 9ccfef
	cnt->reorder++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_SPARSE:
Packit Service 9ccfef
	cnt->sparse++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_EXPAND:
Packit Service 9ccfef
	cnt->expand++;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_UNKNOWN:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrIndexLenCounter(IndexLenCounter *cnt, int len)
Packit Service 9ccfef
{
Packit Service 9ccfef
    cnt->total++;
Packit Service 9ccfef
    if (len < sizeof(cnt->length)/sizeof(cnt->length[0])) {
Packit Service 9ccfef
	cnt->length[len]++;
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(stderr, "smidump: index len overflow: %d\n", len);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrTableLenCounter(TableLenCounter *cnt, int len)
Packit Service 9ccfef
{
Packit Service 9ccfef
    cnt->total++;
Packit Service 9ccfef
    if (len < sizeof(cnt->length)/sizeof(cnt->length[0])) {
Packit Service 9ccfef
	cnt->length[len]++;
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(stderr, "smidump: table len overflow: %d\n", len);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrIndexComplexityMetric(IndexComplexityCounter *cnt, int cmplx)
Packit Service 9ccfef
{
Packit Service 9ccfef
    cnt->total++;
Packit Service 9ccfef
    if (cmplx < sizeof(cnt->complexity)/sizeof(cnt->complexity[0])) {
Packit Service 9ccfef
	cnt->complexity[cmplx]++;
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(stderr, "smidump: index complexity overflow: %d\n", cmplx);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrLengthCounter(LengthCounter *cnt, char *description, char *reference,
Packit Service 9ccfef
		  char *units, char *format)
Packit Service 9ccfef
{
Packit Service 9ccfef
    cnt->total++;
Packit Service 9ccfef
    if (description) {
Packit Service 9ccfef
	cnt->descr++;
Packit Service 9ccfef
	cnt->descr_len += strlen(description);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (reference) {
Packit Service 9ccfef
	cnt->reference++;
Packit Service 9ccfef
	cnt->reference_len += strlen(reference);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (units) {
Packit Service 9ccfef
	cnt->units++;
Packit Service 9ccfef
	cnt->units_len += strlen(units);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (format) {
Packit Service 9ccfef
	cnt->format++;
Packit Service 9ccfef
	cnt->format_len += strlen(format);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
incrRowStatusCounter(SmiNode *rowNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *smiNode;
Packit Service 9ccfef
    SmiType *smiType;
Packit Service 9ccfef
    SmiModule *smiModule;
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiNode = smiGetFirstChildNode(rowNode);
Packit Service 9ccfef
	 smiNode;
Packit Service 9ccfef
	 smiNode = smiGetNextChildNode(smiNode)) {
Packit Service 9ccfef
	smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
	if (smiType && smiType->name) {
Packit Service 9ccfef
	    smiModule = smiGetTypeModule(smiType);
Packit Service 9ccfef
	    if (smiModule && smiModule->name
Packit Service 9ccfef
		&& strcmp(smiType->name, "RowStatus") == 0
Packit Service 9ccfef
		&& strcmp(smiModule->name, "SNMPv2-TC") == 0) {
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (smiNode) {
Packit Service 9ccfef
#if 0
Packit Service 9ccfef
	fprintf(stderr, "** %s\t%s\t%s\n", rowNode->name,
Packit Service 9ccfef
		smiNode->name, smiType->name);
Packit Service 9ccfef
	/* xxx count rows indexed by ifIndex, InterfaceIndex, InterfaceIndexOrZero, ... */
Packit Service 9ccfef
#endif
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
count(FILE *f, SmiNode *row, SmiNode *col, void *data)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int *cnt = (int *) data;
Packit Service 9ccfef
Packit Service 9ccfef
    (*cnt)++;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
complexity(FILE *f, SmiNode *row, SmiNode *col, void *data)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int *cmplx = (int *) data;
Packit Service 9ccfef
    SmiType *smiType;
Packit Service 9ccfef
    unsigned long min, max;
Packit Service 9ccfef
Packit Service 9ccfef
    smiType = smiGetNodeType(col);
Packit Service 9ccfef
    if (! smiType) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    switch (smiType->basetype) {
Packit Service 9ccfef
    case SMI_BASETYPE_INTEGER32:
Packit Service 9ccfef
    case SMI_BASETYPE_UNSIGNED32:
Packit Service 9ccfef
    case SMI_BASETYPE_ENUM:
Packit Service 9ccfef
	*cmplx += 1;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_OCTETSTRING:
Packit Service 9ccfef
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit Service 9ccfef
    case SMI_BASETYPE_BITS:
Packit Service 9ccfef
	*cmplx += 2;
Packit Service 9ccfef
	min = smiGetMinSize(smiType);
Packit Service 9ccfef
	max = smiGetMaxSize(smiType);
Packit Service 9ccfef
	if (min != max) {
Packit Service 9ccfef
	    *cmplx += 1;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    default:				/* ignore everything else */
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
yadayada(FILE *f, SmiNode *row, SmiNode *col, void *data)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiModule *smiModule = (SmiModule *) data;
Packit Service 9ccfef
    int flags = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    if (col->access == SMI_ACCESS_NOT_ACCESSIBLE) {
Packit Service 9ccfef
	flags |= INCR_TYPE;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    flags |= INCR_NODE;
Packit Service 9ccfef
Packit Service 9ccfef
    incrTypeAndNodeUsageCounter(smiModule, col, flags);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
addMetrics(Metrics *metrics, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *smiNode;
Packit Service 9ccfef
    SmiType *smiType;
Packit Service 9ccfef
    size_t len;
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit Service 9ccfef
	 smiNode;
Packit Service 9ccfef
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit Service 9ccfef
	len = smiNode->description ? strlen(smiNode->description) : 0;
Packit Service 9ccfef
	switch (smiNode->nodekind) {
Packit Service 9ccfef
	case SMI_NODEKIND_TABLE:
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusTables, smiNode->status);
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusAll, smiNode->status);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthTables,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthAll,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_NODEKIND_ROW:
Packit Service 9ccfef
	    incrIndexCounter(&metrics->indexTables, smiNode->indexkind);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthRows,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthAll,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    incrRowStatusCounter(smiNode);
Packit Service 9ccfef
	    {
Packit Service 9ccfef
		int cnt = 0;
Packit Service 9ccfef
		foreachIndexDo(NULL, smiNode, count, &cnt);
Packit Service 9ccfef
		incrIndexLenCounter(&metrics->indexLenTables, cnt);
Packit Service 9ccfef
		foreachIndexDo(NULL, smiNode, yadayada, smiModule);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    {
Packit Service 9ccfef
		int cmplx = 0;
Packit Service 9ccfef
		foreachIndexDo(NULL, smiNode, complexity, &cmplx);
Packit Service 9ccfef
		incrIndexComplexityCounter(smiModule, smiNode, cmplx);
Packit Service 9ccfef
		incrIndexComplexityMetric(&metrics->indexComplexity, cmplx);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    /* count the childs ... */
Packit Service 9ccfef
	    {
Packit Service 9ccfef
		    SmiModule *smiModule = smiGetModule("SNMPv2-TC");
Packit Service 9ccfef
		    SmiNode *childNode;
Packit Service 9ccfef
		    SmiType *rowStatus = smiGetType(smiModule, "RowStatus");
Packit Service 9ccfef
		    SmiType *storageType = smiGetType(smiModule, "StorageType");
Packit Service 9ccfef
		    /* include index elements not in table */
Packit Service 9ccfef
		    int n = 0;
Packit Service 9ccfef
		    for (childNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
			 childNode;
Packit Service 9ccfef
			 childNode = smiGetNextChildNode(childNode)) {
Packit Service 9ccfef
			    n++;
Packit Service 9ccfef
			    if (rowStatus == smiGetNodeType(childNode)) {
Packit Service 9ccfef
				    fprintf(stderr, "**** GEEEEEE - ROWSTATUS\n");
Packit Service 9ccfef
			    }
Packit Service 9ccfef
			    if (storageType == smiGetNodeType(childNode)) {
Packit Service 9ccfef
				    fprintf(stderr, "**** GEEEEEE - STORAGETYPE\n");
Packit Service 9ccfef
			    }
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    incrTableLenCounter(&metrics->tableLength, n);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_NODEKIND_COLUMN:
Packit Service 9ccfef
	    incrBasetypeCounter(&metrics->basetypesColumns, smiNode);
Packit Service 9ccfef
	    incrBasetypeCounter(&metrics->basetypesAll, smiNode);
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusColumns, smiNode->status);
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusAll, smiNode->status);
Packit Service 9ccfef
	    incrAccessCounter(&metrics->accessColumns, smiNode->access);
Packit Service 9ccfef
	    incrAccessCounter(&metrics->accessAll, smiNode->access);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthColumns,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthAll,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    incrTypeAndNodeUsageCounter(smiModule, smiNode, INCR_TYPE);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_NODEKIND_SCALAR:
Packit Service 9ccfef
	    incrBasetypeCounter(&metrics->basetypesScalars, smiNode);
Packit Service 9ccfef
	    incrBasetypeCounter(&metrics->basetypesAll, smiNode);
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusScalars, smiNode->status);
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusAll, smiNode->status);
Packit Service 9ccfef
	    incrAccessCounter(&metrics->accessScalars, smiNode->access);
Packit Service 9ccfef
	    incrAccessCounter(&metrics->accessAll, smiNode->access);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthScalars,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthAll,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    incrTypeAndNodeUsageCounter(smiModule, smiNode, INCR_TYPE);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_NODEKIND_NOTIFICATION:
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusNotifications, smiNode->status);
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusAll, smiNode->status);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthNotifications,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    incrLengthCounter(&metrics->lengthAll,
Packit Service 9ccfef
			      smiNode->description, smiNode->reference,
Packit Service 9ccfef
			      smiNode->units, smiNode->format);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_NODEKIND_GROUP:
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusGroups, smiNode->status);
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusAll, smiNode->status);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_NODEKIND_COMPLIANCE:
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusCompliances, smiNode->status);
Packit Service 9ccfef
	    incrStatusCounter(&metrics->statusAll, smiNode->status);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiType = smiGetFirstType(smiModule);
Packit Service 9ccfef
	 smiType;
Packit Service 9ccfef
	 smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
Packit Service 9ccfef
	/*
Packit Service 9ccfef
	 * Ignore all types with empty descriptions coming from the
Packit Service 9ccfef
	 * "SNMPv2-SMI" module since they are not really defined
Packit Service 9ccfef
	 * types but part of the language itself.
Packit Service 9ccfef
	 */
Packit Service 9ccfef
Packit Service 9ccfef
	if (! smiType->description) {
Packit Service 9ccfef
	    SmiModule *m = smiGetTypeModule(smiType);
Packit Service 9ccfef
	    if (m && strcmp(m->name, "SNMPv2-SMI") == 0) {
Packit Service 9ccfef
		continue;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    
Packit Service 9ccfef
	incrStatusCounter(&metrics->statusTypes, smiType->status);
Packit Service 9ccfef
	incrStatusCounter(&metrics->statusAll, smiType->status);
Packit Service 9ccfef
	incrLengthCounter(&metrics->lengthTypes,
Packit Service 9ccfef
			  smiType->description, smiType->reference,
Packit Service 9ccfef
			  smiType->units, smiType->format);
Packit Service 9ccfef
	incrLengthCounter(&metrics->lengthAll,
Packit Service 9ccfef
			  smiType->description, smiType->reference,
Packit Service 9ccfef
			  smiType->units, smiType->format);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintBasetypeCounter(FILE *f, BasetypeCounter *cnt, const char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (!s && ! cnt) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fputs(
Packit Service 9ccfef
"# The following table shows the basetype usage distribution in the\n"
Packit Service 9ccfef
"# set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%-10s Int32 Uns32 Int64 Uns64 OctSt ObjId Enums  Bits Flo32 Flo64 Flo128\n",
Packit Service 9ccfef
		"CATEGORY");
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (raw) {
Packit Service 9ccfef
	fprintf(f, "%-10s %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu\n", s,
Packit Service 9ccfef
		cnt->integer32, cnt->unsigned32,
Packit Service 9ccfef
		cnt->integer64, cnt->unsigned64,
Packit Service 9ccfef
		cnt->octetstring, cnt->objectidentifier,
Packit Service 9ccfef
		cnt->enums, cnt->bits,
Packit Service 9ccfef
		cnt->float32, cnt->float64, cnt->float128);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(f, "%-10s %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%%\n", s,
Packit Service 9ccfef
		cnt->total ? (double) cnt->integer32 * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->unsigned32 * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->integer64 * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->unsigned64 * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->octetstring * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->objectidentifier * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->enums * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->bits * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->float32 * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->float64 * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->float128 * 100 / cnt->total : 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintStatusCounter(FILE *f, StatusCounter *cnt, char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (!s || !cnt) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fputs(
Packit Service 9ccfef
"# The following table shows the status distribution of various\n"
Packit Service 9ccfef
"# definitions contained in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%-14s %8s %8s %11s %9s\n", "CATEGORY",
Packit Service 9ccfef
		"TOTAL", "CURRENT", "DEPRECATED", "OBSOLETE");
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (raw) {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %8lu %11lu %9lu\n", s,
Packit Service 9ccfef
		cnt->total, cnt->current, cnt->deprecated, cnt->obsolete);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %7.1f%% %10.1f%% %8.1f%%\n", s,
Packit Service 9ccfef
		cnt->total,
Packit Service 9ccfef
		cnt->total ? (double) cnt->current * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->deprecated * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->obsolete * 100 / cnt->total : 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintAccessCounter(FILE *f, AccessCounter *cnt, char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (!s || !cnt) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fputs(
Packit Service 9ccfef
"# The following table shows the access mode distribution of all scalar\n"
Packit Service 9ccfef
"# or column definitions contained in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%-14s %8s %10s %9s %7s %8s\n", "CATEGORY",
Packit Service 9ccfef
		"TOTAL", "READWRITE", "READONLY", "NOTIFY", "NOACCES");
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (raw) {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %10lu %9lu %7lu %8lu\n", s,
Packit Service 9ccfef
		cnt->total, cnt->readwrite, cnt->readonly,
Packit Service 9ccfef
		cnt->notify, cnt->noaccess);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %9.1f%% %8.1f%% %6.1f%% %7.1f%%\n", s,
Packit Service 9ccfef
		cnt->total,
Packit Service 9ccfef
		cnt->total ? (double) cnt->readwrite * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->readonly * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->notify * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->noaccess * 100 / cnt->total : 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintIndexCounter(FILE *f, IndexCounter *cnt, char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (! s || ! cnt) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fputs(
Packit Service 9ccfef
"# The following table shows the table index kind distribution of\n"
Packit Service 9ccfef
"# table definitions contained in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
	fprintf(f, "%-14s %8s %8s %8s %8s %8s %8s\n", "CATEGORY",
Packit Service 9ccfef
		"TOTAL", "INDEX", "AUGMENT", "REORDER", "SPARSE", "EXPAND");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (raw) {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %8lu %8lu %8lu %8lu %8lu\n", s,
Packit Service 9ccfef
		cnt->total, cnt->index, cnt->augment,
Packit Service 9ccfef
		cnt->reorder, cnt->sparse, cnt->expand);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %7.1f%% %7.1f%% %7.1f%% %7.1f%% %7.1f%%\n", s,
Packit Service 9ccfef
		cnt->total,
Packit Service 9ccfef
		cnt->total ? (double) cnt->index * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->augment * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->reorder * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->sparse * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->expand * 100 / cnt->total : 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintIndexLenCounter(FILE *f, IndexLenCounter *cnt, char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    int n = sizeof(cnt->length)/sizeof(cnt->length[0]);
Packit Service 9ccfef
    char buf[42];
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (! s || ! cnt) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fputs(
Packit Service 9ccfef
"# The following table shows the table index length distribution of\n"
Packit Service 9ccfef
"# table definitions contained in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%-10s %6s ", "CATEGORY", "TOTAL");
Packit Service 9ccfef
	for (i = 1; i < n; i++) {
Packit Service 9ccfef
	    sprintf(buf, "[%d]", i);
Packit Service 9ccfef
	    fprintf(f, " %5s", buf);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "\n");
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprintf(f, "%-10s %6lu ", s, cnt->total);
Packit Service 9ccfef
    if (raw) {
Packit Service 9ccfef
	for (i = 1; i < n; i++) {
Packit Service 9ccfef
	    fprintf(f, " %5lu", cnt->length[i]);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	for (i = 1; i < n; i++) {
Packit Service 9ccfef
	    fprintf(f, " %4.1f%%", (double) cnt->length[i] * 100 / cnt->total);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintTableLenCounter(FILE *f, TableLenCounter *cnt, char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    int n = sizeof(cnt->length)/sizeof(cnt->length[0]);
Packit Service 9ccfef
    char buf[42];
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (! s || ! cnt) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fputs(
Packit Service 9ccfef
"# The following table shows the table length distribution of\n"
Packit Service 9ccfef
"# table definitions contained in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%-10s %6s ", "CATEGORY", "TOTAL");
Packit Service 9ccfef
	for (i = 1; i < n; i++) {
Packit Service 9ccfef
	    sprintf(buf, "[%d]", i);
Packit Service 9ccfef
	    fprintf(f, " %5s", buf);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "\n");
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprintf(f, "%-10s %6lu ", s, cnt->total);
Packit Service 9ccfef
    if (raw) {
Packit Service 9ccfef
	for (i = 1; i < n; i++) {
Packit Service 9ccfef
	    fprintf(f, " %5lu", cnt->length[i]);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	for (i = 1; i < n; i++) {
Packit Service 9ccfef
	    fprintf(f, " %4.1f%%", (double) cnt->length[i] * 100 / cnt->total);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintLengthCounter(FILE *f, LengthCounter *cnt, char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (! s) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fputs(
Packit Service 9ccfef
"# The following table shows the text clause usage distribution of all\n"
Packit Service 9ccfef
"# definitions contained in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%-14s %8s %12s %10s %8s %8s\n", "CATEGORY",
Packit Service 9ccfef
		"TOTAL", "DESCRIPTION", "REFERENCE", "UNIT", "FORMAT");
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (raw) {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %12lu %10lu %8lu %8lu\n", s,
Packit Service 9ccfef
		cnt->total, cnt->descr, cnt->reference,
Packit Service 9ccfef
		cnt->units, cnt->format);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %11.1f%% %9.1f%% %7.1f%% %7.1f%%\n", s,
Packit Service 9ccfef
		cnt->total,
Packit Service 9ccfef
		cnt->total ? (double) cnt->descr * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->reference * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->units * 100 / cnt->total : 0,
Packit Service 9ccfef
		cnt->total ? (double) cnt->format * 100 / cnt->total : 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintLengthCounter2(FILE *f, LengthCounter *cnt, char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (! s) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fprintf(f,
Packit Service 9ccfef
"# The following table shows the %s text length distribution (in\n"
Packit Service 9ccfef
"# bytes) of all definitions contained in the set of loaded MIB modules.\n"
Packit Service 9ccfef
"\n", raw ? "total" : "average");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%-14s %8s %12s %10s %8s %8s\n", "CATEGORY",
Packit Service 9ccfef
		"TOTAL", "DESCRIPTION", "REFERENCE", "UNIT", "FORMAT");
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (raw) {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %12lu %10lu %8lu %8lu\n", s,
Packit Service 9ccfef
		cnt->total, cnt->descr_len, cnt->reference_len,
Packit Service 9ccfef
		cnt->units_len, cnt->format_len);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %12.1f %10.1f %8.1f %8.1f\n", s,
Packit Service 9ccfef
		cnt->total,
Packit Service 9ccfef
		cnt->descr ? (double) cnt->descr_len / cnt->descr : 0,
Packit Service 9ccfef
		cnt->reference ? (double) cnt->reference_len / cnt->reference : 0,
Packit Service 9ccfef
		cnt->units ? (double) cnt->units_len / cnt->units : 0,
Packit Service 9ccfef
		cnt->format ? (double) cnt->format_len / cnt->format : 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintfComplexity(FILE *f, Metrics *metrics)
Packit Service 9ccfef
{
Packit Service 9ccfef
    unsigned long cmplx = 0, fctrs = 0;
Packit Service 9ccfef
    unsigned long total_cmplx = 0, total_fctrs = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    if (! silent) {
Packit Service 9ccfef
	fputs(
Packit Service 9ccfef
"# The following table shows the complexity metrics of the set of loaded\n"
Packit Service 9ccfef
"# MIB modules.\n"
Packit Service 9ccfef
"\n", f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(f, "%-14s %8s %8s %8s %8s\n", "CATEGORY", "TOTAL",
Packit Service 9ccfef
	    "RAW", "WEIGHT", "COMPLEXITY");
Packit Service 9ccfef
    
Packit Service 9ccfef
    cmplx = metrics->accessScalars.readonly  * 1;
Packit Service 9ccfef
    fctrs = metrics->accessScalars.readonly;
Packit Service 9ccfef
    fprintf(f, "%-14s %8lu %8lu\n", "Scalars (ro):", fctrs, cmplx);
Packit Service 9ccfef
    total_cmplx += cmplx;
Packit Service 9ccfef
    total_fctrs += fctrs;
Packit Service 9ccfef
	    
Packit Service 9ccfef
    cmplx = metrics->accessScalars.readwrite * 2;
Packit Service 9ccfef
    fctrs = metrics->accessScalars.readwrite;
Packit Service 9ccfef
    fprintf(f, "%-14s %8lu %8lu\n", "Scalars (rw):", fctrs, cmplx);
Packit Service 9ccfef
    total_cmplx += cmplx;
Packit Service 9ccfef
    total_fctrs += fctrs;
Packit Service 9ccfef
Packit Service 9ccfef
    cmplx = metrics->accessColumns.readonly * 2;
Packit Service 9ccfef
    fctrs = metrics->accessColumns.readonly;
Packit Service 9ccfef
    fprintf(f, "%-14s %8lu %8lu\n", "Columns (ro):", fctrs, cmplx);
Packit Service 9ccfef
    total_cmplx += cmplx;
Packit Service 9ccfef
    total_fctrs += fctrs;
Packit Service 9ccfef
Packit Service 9ccfef
    cmplx = metrics->accessColumns.readwrite * 3;
Packit Service 9ccfef
    fctrs = metrics->accessColumns.readwrite;
Packit Service 9ccfef
    fprintf(f, "%-14s %8lu %8lu\n", "Columns (rw):", fctrs, cmplx);
Packit Service 9ccfef
    total_cmplx += cmplx;
Packit Service 9ccfef
    total_fctrs += fctrs;
Packit Service 9ccfef
Packit Service 9ccfef
    /* readcreate tables ? */
Packit Service 9ccfef
Packit Service 9ccfef
    /* table index complexity ? */
Packit Service 9ccfef
Packit Service 9ccfef
    {
Packit Service 9ccfef
	int i;
Packit Service 9ccfef
	cmplx = 0;
Packit Service 9ccfef
	for (i = 0; i < 100; i++) {
Packit Service 9ccfef
	    cmplx += 3 * i * metrics->indexComplexity.complexity[i];
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%-14s %8lu %8lu\n", "Indexes:", metrics->indexComplexity.total, cmplx);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprintf(f, "%-14s %8lu %8lu\n", "Summary:", total_fctrs, total_cmplx);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintMetrics(FILE *f, Metrics *metrics)
Packit Service 9ccfef
{
Packit Service 9ccfef
    fprintStatusCounter(f, NULL, NULL);
Packit Service 9ccfef
    fprintStatusCounter(f, &metrics->statusTypes, "Types:");
Packit Service 9ccfef
    fprintStatusCounter(f, &metrics->statusTables, "Tables:");
Packit Service 9ccfef
    fprintStatusCounter(f, &metrics->statusColumns, "Columns:");
Packit Service 9ccfef
    fprintStatusCounter(f, &metrics->statusScalars, "Scalars:");
Packit Service 9ccfef
    fprintStatusCounter(f, &metrics->statusNotifications, "Notifications:");
Packit Service 9ccfef
    fprintStatusCounter(f, &metrics->statusGroups, "Groups:");
Packit Service 9ccfef
    fprintStatusCounter(f, &metrics->statusCompliances, "Compliances:");
Packit Service 9ccfef
    fprintStatusCounter(f, &metrics->statusAll, "Summary:");
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintAccessCounter(f, NULL, NULL);
Packit Service 9ccfef
    fprintAccessCounter(f, &metrics->accessColumns, "Columns:");
Packit Service 9ccfef
    fprintAccessCounter(f, &metrics->accessScalars, "Scalars:");
Packit Service 9ccfef
    fprintAccessCounter(f, &metrics->accessAll, "Summary:");
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintIndexCounter(f, NULL, NULL);
Packit Service 9ccfef
    fprintIndexCounter(f, &metrics->indexTables, "Tables:");
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintIndexLenCounter(f, NULL, NULL);
Packit Service 9ccfef
    fprintIndexLenCounter(f, &metrics->indexLenTables, "Tables:");
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintTableLenCounter(f, NULL, NULL);
Packit Service 9ccfef
    fprintTableLenCounter(f, &metrics->tableLength, "Tables:");
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintLengthCounter(f, NULL, NULL);
Packit Service 9ccfef
    fprintLengthCounter(f, &metrics->lengthTypes, "Types:");
Packit Service 9ccfef
    fprintLengthCounter(f, &metrics->lengthTables, "Tables:");
Packit Service 9ccfef
    fprintLengthCounter(f, &metrics->lengthColumns, "Columns:");
Packit Service 9ccfef
    fprintLengthCounter(f, &metrics->lengthScalars, "Scalars:");
Packit Service 9ccfef
    fprintLengthCounter(f, &metrics->lengthNotifications, "Notifications:");
Packit Service 9ccfef
    fprintLengthCounter(f, &metrics->lengthAll, "Summary:");
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintLengthCounter2(f, NULL, NULL);
Packit Service 9ccfef
    fprintLengthCounter2(f, &metrics->lengthTypes, "Types:");
Packit Service 9ccfef
    fprintLengthCounter2(f, &metrics->lengthTables, "Tables:");
Packit Service 9ccfef
    fprintLengthCounter2(f, &metrics->lengthColumns, "Columns:");
Packit Service 9ccfef
    fprintLengthCounter2(f, &metrics->lengthScalars, "Scalars:");
Packit Service 9ccfef
    fprintLengthCounter2(f, &metrics->lengthNotifications, "Notifications:");
Packit Service 9ccfef
    fprintLengthCounter2(f, &metrics->lengthAll, "Summary:");
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintBasetypeCounter(f, NULL, NULL);
Packit Service 9ccfef
    fprintBasetypeCounter(f, &metrics->basetypesColumns, "Columns:");
Packit Service 9ccfef
    fprintBasetypeCounter(f, &metrics->basetypesScalars, "Scalars:");
Packit Service 9ccfef
    fprintBasetypeCounter(f, &metrics->basetypesAll, "Summary:");
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintfComplexity(f, metrics);
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintTypeUsage(f, typeList);
Packit Service 9ccfef
    freeUsageCounter(typeList), typeList = NULL;
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintExtTypeUsage(f, extTypeList);
Packit Service 9ccfef
    freeUsageCounter(extTypeList), extTypeList = NULL;
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintExtNodeUsage(f, extNodeList);
Packit Service 9ccfef
    freeUsageCounter(extNodeList), extNodeList = NULL;
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintModuleUsage(f, extModuleList);
Packit Service 9ccfef
    freeUsageCounter(extModuleList), extModuleList = NULL;
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
    fprintIndexComplexity(f, indexComplexityList);
Packit Service 9ccfef
    freeUsageCounter(indexComplexityList), indexComplexityList = NULL;
Packit Service 9ccfef
    fprintf(f, "\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
dumpMetrics(int modc, SmiModule **modv, int flags, char *output)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Metrics   metrics;
Packit Service 9ccfef
    int       i;
Packit Service 9ccfef
    FILE      *f = stdout;
Packit Service 9ccfef
Packit Service 9ccfef
    silent = (flags & SMIDUMP_FLAG_SILENT);
Packit Service 9ccfef
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	f = fopen(output, "w");
Packit Service 9ccfef
	if (!f) {
Packit Service 9ccfef
	    fprintf(stderr, "smidump: cannot open %s for writing: ", output);
Packit Service 9ccfef
	    perror(NULL);
Packit Service 9ccfef
	    exit(1);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (flags & SMIDUMP_FLAG_UNITE) {
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    int pos = 8888;
Packit Service 9ccfef
	    fprintf(f, "# united module metrics [%d modules] "
Packit Service 9ccfef
		    "(generated by smidump " SMI_VERSION_STRING ")\n", modc);
Packit Service 9ccfef
	    fprintf(f, "#\n# smidump -u -f metrics");
Packit Service 9ccfef
	    if (raw) fprintf(f, " --metrics-raw");
Packit Service 9ccfef
	    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
		int len = strlen(modv[i]->name);
Packit Service 9ccfef
		if (pos + len > 70) {
Packit Service 9ccfef
		    fprintf(f, " \\\n#\t"), pos = 8;
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprintf(f, "%s ", modv[i]->name);
Packit Service 9ccfef
		pos += len + 1;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintf(f, "%s\n", (pos == 8) ? "" : "\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprintRevision(f, modc, modv);
Packit Service 9ccfef
	    
Packit Service 9ccfef
	for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	    memset(&metrics, 0, sizeof(Metrics));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	    addMetrics(&metrics, modv[i]);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintMetrics(f, &metrics);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	    if (! silent) {
Packit Service 9ccfef
		fprintf(f, "# %s module metrics (generated by smidump "
Packit Service 9ccfef
			SMI_VERSION_STRING ")\n\n", modv[i]->name);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
Packit Service 9ccfef
	    fprintRevision(f, 1, modv+i);
Packit Service 9ccfef
    
Packit Service 9ccfef
	    memset(&metrics, 0, sizeof(Metrics));
Packit Service 9ccfef
	    addMetrics(&metrics, modv[i]);
Packit Service 9ccfef
	    fprintMetrics(f, &metrics);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (fflush(f) || ferror(f)) {
Packit Service 9ccfef
	perror("smidump: write error");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	fclose(f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void
Packit Service 9ccfef
initMetrics()
Packit Service 9ccfef
{
Packit Service 9ccfef
    static SmidumpDriverOption opt[] = {
Packit Service 9ccfef
	{ "raw", OPT_FLAG, &raw, 0,
Packit Service 9ccfef
	  "generate raw statistics (no percentages)"},
Packit Service 9ccfef
        { 0, OPT_END, 0, 0 }
Packit Service 9ccfef
    };
Packit Service 9ccfef
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"metrics",
Packit Service 9ccfef
	dumpMetrics,
Packit Service 9ccfef
	0,
Packit Service 9ccfef
	0,
Packit Service 9ccfef
	"metrics characterizing MIB modules",
Packit Service 9ccfef
	opt,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}