Mercurial > illumos > onarm
diff usr/src/cmd/man/src/util/instant.src/info.c @ 0:c9caec207d52 b86
Initial porting based on b86
author | Koji Uno <koji.uno@sun.com> |
---|---|
date | Tue, 02 Jun 2009 18:56:50 +0900 |
parents | |
children | 1a15d5aaf794 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/man/src/util/instant.src/info.c Tue Jun 02 18:56:50 2009 +0900 @@ -0,0 +1,301 @@ +/* + * Copyright 1993 Open Software Foundation, Inc., Cambridge, Massachusetts. + * All rights reserved. + */ +/* +#pragma ident "@(#)info.c 1.3 00/07/17 SMI" + * Copyright (c) 1994 + * Open Software Foundation, Inc. + * + * Permission is hereby granted to use, copy, modify and freely distribute + * the software in this file and its documentation for any purpose without + * fee, provided that the above copyright notice appears in all copies and + * that both the copyright notice and this permission notice appear in + * supporting documentation. Further, provided that the name of Open + * Software Foundation, Inc. ("OSF") not be used in advertising or + * publicity pertaining to distribution of the software without prior + * written permission from OSF. OSF makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + */ +/* + * Copyright (c) 1996 X Consortium + * Copyright (c) 1995, 1996 Dalrymple Consulting + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * X CONSORTIUM OR DALRYMPLE CONSULTING BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the names of the X Consortium and + * Dalrymple Consulting shall not be used in advertising or otherwise to + * promote the sale, use or other dealings in this Software without prior + * written authorization. + */ +/* ________________________________________________________________________ + * + * Functions for printing information about an instance in the 'instant' + * program. Most of these are fairly short and simple. + * + * Entry points for this module: + * PrintElemSummary(elem) print summary info of each element + * PrintContext(elem) print context of each element + * PrintElemTree(elem) print tree of document + * PrintStats(elem) print statistics about doc tree + * PrintIDList(elem) print list of IDs and element context + * Most Print*() functions start at subtree pointed to by 'elem'. + * ________________________________________________________________________ + */ + +#ifndef lint +static char *RCSid = + "$Header: /usr/src/docbook-to-man/Instant/RCS/info.c,v 1.2 1996/06/02 21:46:10 fld Exp $"; +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include "general.h" + +/* ______________________________________________________________________ */ +/* Print a summary of each tag use in the instance. Things like depth in + * the tree, number of children, parent, attributes. + */ + +/* Do the actual printing. Print the info about the node. If null, + * print a header for the columns. + * Arguments: + * Pointer to element structure of the node to print. + */ +static void +print_summ( + Element_t *e +) +{ + int i, n, dsize; + char *hfmt="%-18.18s %4s %5s %4s %4s %s\n"; + char *fmt ="%-18.18s %4d %5d %4d %4d %s\n"; + + if (e == NULL) { + fprintf(outfp, hfmt, "Element", "Att", "Data", "Chd", "Dep", "Parent"); + return; + } + for (i=0,n=0; i<e->ncont; i++) if (IsContElem(e,i)) n++; + for (i=0,dsize=0; i<e->ncont; i++) + if (IsContElem(e,i)) dsize += strlen(e->cont[i].ch.data); + fprintf(outfp, fmt, e->gi, e->natts, dsize, n, e->depth, + e->parent ? e->parent->gi : "-"); + + for (i=0; i<e->natts; i++) { + fprintf(outfp, "%45d: %s = %s\n", i, e->atts[i].name, + e->atts[i].sval ? e->atts[i].sval : "empty"); + } +} + +/* Descend the tree, calling processing routine. + * Arguments: + * Pointer to element structure at top of tree to traverse. + */ +void +PrintElemSummary( + Element_t *e +) +{ + print_summ(0); + DescendTree(e, print_summ, 0, 0, 0); +} + +/* ______________________________________________________________________ */ +/* Print the context of each tag in the instance (i.e. the tag with its + * ancestors). + */ + +/* Do the actual printing. Print the context of the node. + * Arguments: + * Pointer to element structure of the node to print. + */ +static void +print_context( + Element_t *e +) +{ + char buf[LINESIZE]; + + fprintf(outfp, "%-22s %s\n", e->gi, FindContext(e, 10, buf)); +} + +/* Descend the tree, calling processing routine. + * Arguments: + * Pointer to element structure at top of tree to traverse. + */ +void +PrintContext( + Element_t *e +) +{ + fprintf(outfp, "%-22s %s\n", "Element", "Context"); + fprintf(outfp, "%-22s %s\n", "---------------", "-----------"); + DescendTree(e, print_context, 0, 0, 0); + + putc(NL, outfp); +} + +/* ______________________________________________________________________ */ +/* Print tree of the instance. GI's are printed indented by their depth + * in the tree. + */ + +/* Do the actual printing. Print the element name, indented the right amount. + * Arguments: + * Pointer to element structure of the node to print. + */ +static void +print_indent( + Element_t *e +) +{ + int i, ne, nd; + for(i=0; i<e->depth; i++) fputs(". ", outfp); + for(i=0,ne=0; i<e->ncont; i++) if (IsContElem(e,i)) ne++; + for(i=0,nd=0; i<e->ncont; i++) if IsContData(e,i) nd++; + fprintf(outfp, "%s (%d,%d)\n", e->gi, ne, nd); +} + +/* Descend the tree, calling processing routine. + * Arguments: + * Pointer to element structure at top of tree to traverse. + */ +void +PrintElemTree( + Element_t *e +) +{ + DescendTree(e, print_indent, 0, 0, 0); + putc(NL, outfp); +} + +/* ______________________________________________________________________ */ +/* Print some statistics about the instance. + */ + +/* Accumulate the totals for the statistics. + * Arguments: + * Pointer to element structure of the node to print. + * Pointer to the total number of elements. + * Pointer to the total amount of content data. + * Pointer to the maximum depth of tree. + */ +static void +acc_tots( + Element_t *e, + int *tot_el, + int *tot_data, + int *max_depth +) +{ + int i; + for(i=0; i<e->necont; i++) + acc_tots(e->econt[i], tot_el, tot_data, max_depth); + for (i=0; i<e->necont; i++) (*tot_el)++; + for (i=0; i<e->ndcont; i++) (*tot_data) += strlen(e->dcont[i]); + if (e->depth > (*max_depth)) *max_depth = e->depth; +} + +/* Descend the tree (recursively), collecting the statistics. + * Arguments: + * Pointer to element structure of the node to print. + * Pointer to the total number of elements. + * Pointer to the total amount of content data. + * Pointer to the maximum depth of tree. + */ +static void +elem_usage( + Element_t *e, + char *name, + int *n_used, + int *nchars +) +{ + int i; + if (!strcmp(name, e->gi)) { + (*n_used)++; + for (i=0; i<e->ncont; i++) + if (IsContData(e,i)) (*nchars) += strlen(ContData(e,i)); + } + for(i=0; i<e->necont; i++) + elem_usage(e->econt[i], name, n_used, nchars); +} + +/* Descend the tree, calling processing routine. + * Arguments: + * Pointer to element structure at top of tree to traverse. + */ +void +PrintStats( + Element_t *top +) +{ + int i, n; + int dif_el=0, tot_el=0, tot_data=0, nchars, max_depth=0; + float pct; + + fprintf(outfp, "%-22s %s %s\n", "Element name", "Occurrances", "Character Content"); + fprintf(outfp, "%-22s %s %s\n", "---------------", "-----------", "-----------------"); + + acc_tots(top, &tot_el, &tot_data, &max_depth); + + for (i=0; i<nUsedElem; i++) { + n = 0; + nchars = 0; + elem_usage(top, UsedElem[i], &n, &nchars); + if (n > 0) { + pct = 100.0 * (float)n / (float)tot_el; + fprintf(outfp, "%-22s %4d %4.1f%% %6d %4d\n", UsedElem[i], + n, pct, nchars, (nchars/n)); + dif_el++; + } + } + + fprintf(outfp, "\nTotal of %d elements used, %d different ones.\n", + tot_el, dif_el); + fprintf(outfp, "Total character data: %d.\n", tot_data); + fprintf(outfp, "Maximum element depth: %d.\n", max_depth); + putc(NL, outfp); +} + +/* ______________________________________________________________________ */ +/* Print list of: ID, GI, input file, line number, separated by colons. + * This is better for other programs to manipulate (like for keeping a + * database of IDs in documents) than humans to read. + */ + +void +PrintIDList() +{ + ID_t *id; + Element_t *ep; + + for (id=IDList; id; id=id->next) { + ep = id->elem; + fprintf(outfp, "%s:%s:%s:%d\n", id->id, ep->gi, + ep->infile?ep->infile:"-", ep->lineno); + } +} + +/* ______________________________________________________________________ */ +