summaryrefslogtreecommitdiff
path: root/usr/src/cmd/man/src/util/instant.src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/man/src/util/instant.src/main.c')
-rw-r--r--usr/src/cmd/man/src/util/instant.src/main.c714
1 files changed, 0 insertions, 714 deletions
diff --git a/usr/src/cmd/man/src/util/instant.src/main.c b/usr/src/cmd/man/src/util/instant.src/main.c
deleted file mode 100644
index 2537b31021..0000000000
--- a/usr/src/cmd/man/src/util/instant.src/main.c
+++ /dev/null
@@ -1,714 +0,0 @@
-/*
- * Copyright 1993 Open Software Foundation, Inc., Cambridge, Massachusetts.
- * All rights reserved.
- */
-/*
-#pragma ident "%Z%%M% %I% %E% 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.
- */
-/* ________________________________________________________________________
- *
- * Program to read an SGML document instance, creating any of several things:
- *
- * "translated" output for formatting applications (given a trans. spec)
- * validation report (given a appropriate trans spec)
- * tree of the document's structure
- * statistics about the element usage
- * summary of the elements used
- * context of each element used
- * IDs of each element
- *
- * A C structure is created for each element, which includes:
- * name, attributes, parent, children, content
- * The tree is descended, and the desired actions performed.
- *
- * Takes input from James Clark's "sgmls" program (v. 1.1).
- * ________________________________________________________________________
- */
-
-#ifndef lint
-static char *RCSid =
- "$Header: /usr/src/docbook-to-man/Instant/RCS/main.c,v 1.12 1998/06/28 20:10:39 fld Exp fld $";
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <memory.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-#include <time.h>
-
-#define STORAGE
-#include "general.h"
-
-static int do_context, do_tree, do_summ, do_stats, do_validate, do_idlist;
-static int do_DATAhack = 0;
-static char *this_prog;
-static char *in_file, *out_file;
-static char *tranfile, *cmapfile, *sdatafile;
-static char *start_id;
-static char *last_file;
-static int last_lineno;
-
-extern int BOFTTextThresh;
-
-/* forward references */
-static void HandleArgs(int, char *[]);
-static void Initialize1();
-static void Initialize2();
-static void ReadInstance(char *);
-static void DoHelpMessage();
-extern void Browse();
-
-/* external reference to version number */
-extern char _HeadVeRsIoN_[];
-
-/* ______________________________________________________________________ */
-/* Program entry point. Look at args, read instance, dispatch to the
- * correct routines to do the work, and finish.
- */
-
-int
-main(
- int ac,
- char *av[]
-)
-{
- Initialize1(av[0]);
- HandleArgs(ac, av);
- Initialize2();
-
- ReadInstance(in_file);
-
- if (interactive) {
- Browse(); /* this will handle interactive commands */
- }
- else {
- /* Perform tasks based on command line flags... */
- if (tranfile) {
- Element_t *e;
- /* If user wants to start at a particular ID, point to that
- * element. Else, point to the top of the tree. */
- if (start_id) {
- if (!(e=FindElemByID(start_id))) {
- fprintf(stderr, "Error: Can not find element with ID %s\n",
- start_id);
- exit(1);
- }
- }
- else e = DocTree;
- if (sdatafile) ReadSDATA(sdatafile);
- if (cmapfile) ReadCharMap(cmapfile);
- /* If we're doing validation, make output file pointer null.
- * This means that we generate no output, except error messages. */
- if (do_validate) outfp = NULL;
- DoTranslate(e, tranfile, outfp);
- }
- if (do_summ) PrintElemSummary(DocTree);
- if (do_tree) PrintElemTree(DocTree);
- if (do_stats) PrintStats(DocTree);
- if (do_context) PrintContext(DocTree);
- if (do_idlist) PrintIDList();
- }
- if (out_file && outfp) fclose(outfp);
-
- return 0;
-}
-
-/* ______________________________________________________________________ */
-/* Initialization stuff done before dealing with args.
- * Arguments:
- * Name of program (string).
- */
-
-static void
-Initialize1(
- char *myname
-)
-{
- time_t tnow;
- struct tm *nowtm;
- char *cp, buf[100];
- extern int gethostname(char *, int); /* not in a system .h file... */
-
- /* where we try to find data/library files */
- if (!(tpt_lib=getenv(TPT_LIB))) tpt_lib = DEF_TPT_LIB;
-
- /* set some global variables */
- warnings = 1;
- fold_case = 1;
- this_prog = myname;
-
- /* setup global variable mapping */
- Variables = NewMap(IMS_variables);
-
- /* set some pre-defined variables */
- SetMappingNV(Variables, "user", (cp=getenv("USER")) ? cp : "UnknownUser" );
- time(&tnow);
- nowtm = localtime(&tnow);
- strftime(buf, 100, "%a %d %b %Y, %R", nowtm);
- SetMappingNV(Variables, "date", buf);
- if (gethostname(buf, 100) < 0) strcpy(buf, "unknown-host");
- SetMappingNV(Variables, "host", buf);
- SetMappingNV(Variables, "transpec", tranfile ? tranfile : "??");
-}
-
-/* Initialization stuff done after dealing with args. */
-
-static void
-Initialize2()
-{
- SetMappingNV(Variables, "transpec", tranfile ? tranfile : "??");
-
- /* If user wants to send output to a file, open the file, and set
- * the file pointer. Else we send output to standard out. */
- if (out_file) {
- if (!(outfp = fopen(out_file, "w"))) {
- fprintf(stderr, "Could not open output '%s' file for writing.\n%s",
- out_file, strerror(errno));
- exit(1);
- }
- }
- else outfp = stdout;
-}
-
-/* ______________________________________________________________________ */
-/* Set a variable. If it is one of the "known" variables, set the
- * variable in the C code (this program).
- * Arguments:
- * Variable name/value string - separated by an '=' (eg, "myname=Sally").
- */
-static void
-CmdLineSetVariable(
- char *var
-)
-{
- char *cp, buf[100], **tok;
- int n;
-
- /* Turn '=' into a space, to isolate the name. Then set variable. */
- strcpy(buf, var);
- if ((cp=strchr(buf, '='))) {
- /* we have "var=value" */
- *cp = ' ';
- n = 2;
- tok = Split(buf, &n, 0);
- /* see if variable name matches one of our internal ones */
- if (!strcmp(tok[0], "verbose")) verbose = atoi(tok[1]);
- else if (!strcmp(tok[0], "warnings")) warnings = atoi(tok[1]);
- else if (!strcmp(tok[0], "foldcase")) fold_case = atoi(tok[1]);
- else SetMappingNV(Variables, tok[0], tok[1]);
- }
- else {
- fprintf(stderr, "Expected an '=' in variable assignment: %s. Ignored\n",
- var);
- }
-}
-
-/* ______________________________________________________________________ */
-/* Bounce through arguments, setting variables and flags.
- * Arguments:
- * Argc and Argv, as passed to main().
- */
-static void
-HandleArgs(
- int ac,
- char *av[]
-)
-{
- int c, errflag=0;
- extern char *optarg;
- extern int optind;
-
- while ((c=getopt(ac, av, "df:t:vc:s:o:huSxIl:bHVWi:D:Z")) != EOF) {
- switch (c) {
- case 't': tranfile = optarg; break;
- case 'v': do_validate = 1; break;
- case 's': sdatafile = optarg; break;
- case 'c': cmapfile = optarg; break;
- case 'h': do_tree = 1; break;
- case 'u': do_summ = 1; break;
- case 'S': do_stats = 1; break;
- case 'x': do_context = 1; break;
- case 'I': do_idlist = 1; break;
- case 'l': tpt_lib = optarg; break;
- case 'i': start_id = optarg; break;
- case 'o': out_file = optarg; break;
- case 'd': do_DATAhack = 1; break;
- case 'f': BOFTTextThresh = atoi(optarg); break;
- case 'b': interactive = 1; break;
- case 'W': warnings = 0; break;
- case 'V': verbose = 1; break;
- case 'Z': slave = 1; break;
- case 'H': DoHelpMessage(); exit(0); break;
- case 'D': CmdLineSetVariable(optarg); break;
- case '?': errflag = 1; break;
- }
- if (errflag) {
- fprintf(stderr, "Try '%s -H' for help.\n", this_prog);
- exit(1);
- }
- }
-
- /* input (ESIS) file name */
- if (optind < ac) in_file = av[optind];
-
- /* If doing interactive/browsing, we can't take ESIS from stdin. */
- if (interactive && !in_file) {
- fprintf(stderr,
- "You must specify ESIS file on cmd line for browser mode.\n");
- exit(1);
- }
-}
-
-/* ______________________________________________________________________ */
-/* Simply print out a help/usage message.
- */
-
-static char *help_msg[] = {
- "",
- " -t file Print translated output using translation spec in <file>",
- " -s file <file> contains a list of SDATA entity mappings",
- " -c file <file> contains a list of character mappings",
- " -v Validate using translation spec specified with -t",
- " -i id Consider only subtree starting at element with ID <id>",
- " -b Interactive browser",
- " -S Print statistics (how often elements occur, etc.)",
- " -u Print element usage summary (# of children, depth, etc.)",
- " -x Print context of each element",
- " -h Print document hierarchy as a tree",
- " -o file Write output to <file>. Default is standard output.",
- " -l dir Set library directory to <dir>. (or env. variable TPT_LIB)",
- " -I List all IDs used in the instance",
- " -W Do not print warning messages",
- " -H Print this help message",
- " -Dvar=val Set variable 'var' to value 'val'",
- " file Take input from named file. If not specified, assume stdin.",
- " File should be output from the 'sgmls' program (ESIS).",
- NULL
-};
-
-static void
-DoHelpMessage()
-{
- char **s = help_msg;
- printf("usage: %s [option ...] [file]", this_prog);
- while (*s) puts(*s++);
- printf("\nVersion: %s\n", _HeadVeRsIoN_);
-}
-
-/* ______________________________________________________________________ */
-/* Remember an external entity for future reference.
- * Arguments:
- * Pointer to entity structure to remember.
- */
-
-static void
-AddEntity(
- Entity_t *ent
-)
-{
- static Entity_t *last_ent;
-
- if (!Entities) {
- Malloc(1, Entities, Entity_t);
- last_ent = Entities;
- }
- else {
- Malloc(1, last_ent->next, Entity_t);
- last_ent = last_ent->next;
- }
- *last_ent = *ent;
-
-}
-
-/* Find an entity, given its entity name.
- * Arguments:
- * Name of entity to retrieve.
- */
-Entity_t *
-FindEntity(
- char *ename
-)
-{
- Entity_t *n;
- for (n=Entities; n; n=n->next)
- if (StrEq(ename, n->ename)) return n;
- return 0;
-}
-
-/* Accumulate lines up to the open tag. Attributes, line number,
- * entity info, notation info, etc., all come before the open tag.
- */
-static Element_t *
-AccumElemInfo(
- FILE *fp
-)
-{
- char buf[LINESIZE+1];
- int c;
- int i, na;
- char *cp, *atval;
- Mapping_t a[100];
- Element_t *e;
- Entity_t ent, *ent2;
- char **tok;
- static int Index=0;
- static Element_t *last_e;
-
-
- Calloc(1, e, Element_t);
- memset(&ent, 0, sizeof ent); /* clean space for entity info */
-
- /* Also, keep a linked list of elements, so we can easily scan through */
- if (last_e) last_e->next = e;
- last_e = e;
-
- e->index = Index++; /* just a unique number for identification */
-
- /* in case these are not set for this element in the ESIS */
- e->lineno = last_lineno;
- e->infile = last_file;
-
- na = 0;
- while (1) {
- if ((c = getc(fp)) == EOF) break;
- fgets(buf, LINESIZE, fp);
- stripNL(buf);
- switch (c) {
- case EOF: /* End of input */
- fprintf(stderr, "Error: Unexpectedly reached end of ESIS.\n");
- exit(1);
- break;
-
- case CMD_OPEN: /* (gi */
- e->gi = AddElemName(buf);
- if (na > 0) {
- Malloc(na, e->atts, Mapping_t);
- memcpy(e->atts, a, na*sizeof(Mapping_t));
- e->natts = na;
- na = 0;
- }
- /* Check if this elem has a notation attr. If yes, and there
- is no notation specified, recall the previous one. (feature
- of sgmls - it does not repeat notation stuff if we the same
- is used twice in a row) */
- if (((atval=FindAttValByName(e, "NAME")) ||
- (atval=FindAttValByName(e, "ENTITYREF")) ||
- (atval=FindAttValByName(e, "EXTERNAL"))) && /* HACK */
- (ent2=FindEntity(atval))) {
- e->entity = ent2;
- }
-
- return e;
- break;
-
- case CMD_ATT: /* Aname val */
- i = 3;
- tok = Split(buf, &i, 0);
- if (!strcmp(tok[1], "IMPLIED")) break; /* skip IMPLIED atts. */
- if (!strcmp(tok[1], "CDATA") || !strcmp(tok[1], "TOKEN") ||
- !strcmp(tok[1], "ENTITY") ||!strcmp(tok[1], "NOTATION"))
- {
- a[na].name = AddAttName(tok[0]);
- a[na].sval = AddAttName(tok[2]);
- na++;
- }
- else {
- fprintf(stderr, "Error: Bad attr line (%d): A%s %s...\n",
- e->lineno, tok[0], tok[1]);
- }
- break;
-
- case CMD_LINE: /* Llineno */
- /* These lines come in 2 forms: "L123" and "L123 file.sgml".
- * Filename is given only at 1st occurance. Remember it.
- */
- if ((cp = strchr(buf, ' '))) {
- cp++;
- last_file = strdup(cp);
- }
- last_lineno = e->lineno = atoi(buf);
- e->infile = last_file;
- break;
-
- case CMD_DATA: /* -data */
- fprintf(stderr, "Error: Data in AccumElemInfo, line %d:\n%c%s\n",
- e->lineno, c,buf);
- /*return e;*/
- exit(1);
- break;
-
- case CMD_D_ATT: /* Dename name val */
-
- case CMD_NOTATION: /* Nnname */
- case CMD_PI: /* ?pi */
- /* This should be reworked soon, as it
- forces all PI's before the first GI
- to be ignored. -CSS */
- break;
-
- case CMD_EXT_ENT: /* Eename typ nname */
- i = 3;
- tok = Split(buf, &i, 0);
- ent.ename = strdup(tok[0]);
- ent.type = strdup(tok[1]);
- ent.nname = strdup(tok[2]);
- AddEntity(&ent);
- break;
- case CMD_INT_ENT: /* Iename typ text */
- fprintf(stderr, "Error: Got CMD_INT_ENT in AccumElemInfo: %s\n", buf);
- break;
- case CMD_SYSID: /* ssysid */
- ent.sysid = strdup(buf);
- break;
- case CMD_PUBID: /* ppubid */
- ent.pubid = strdup(buf);
- break;
- case CMD_FILENAME: /* ffilename */
- ent.fname = strdup(buf);
- break;
-
- case CMD_CLOSE: /* )gi */
- case CMD_SUBDOC: /* Sename */
- case CMD_SUBDOC_S: /* {ename */
- case CMD_SUBDOC_E: /* }ename */
- case CMD_EXT_REF: /* &name */
- case CMD_APPINFO: /* #text */
- case CMD_CONFORM: /* C */
- default:
- fprintf(stderr, "Error: Unexpected input in AccumElemInfo, %d:\n%c%s\n",
- e->lineno, c,buf);
- exit(1);
- break;
- }
- }
- if ( e && e->gi )
- fprintf(stderr, "Error: End of AccumElemInfo - should not be here: %s\n", e->gi);
- else
- fprintf(stderr, "Invalid SGML. File cannot be formatted\n");
-/* return e;*/
- exit(1);
-}
-
-/* Read ESIS lines.
- */
-
-#define BASECONTSIZE 500 /* starting size for number of children */
-#define GROWCONTSIZE 500 /* if we need to grow that, by this much */
-
-static Element_t *
-ReadESIS(
- FILE *fp,
- int depth
-)
-{
- char *buf;
- int i, c, ncont, contsize;
- Element_t *e;
- Content_t *cont;
-
- Malloc( LINESIZE+1, buf, char );
- contsize = BASECONTSIZE; /* starting content size */
- Malloc( contsize, cont, Content_t );
-
- /* Read input stream - the output of "sgmls", called "ESIS". */
- e = AccumElemInfo(fp);
- e->depth = depth;
-
- ncont = 0;
- while (1) {
- if ((c = getc(fp)) == EOF) break;
- if ( ncont >= contsize ) {
- contsize += GROWCONTSIZE;
- Realloc( contsize, cont, Content_t );
- }
-
- switch (c) {
- case EOF: /* End of input */
- break;
-
- case CMD_DATA: /* -data */
- fgets(buf, LINESIZE, fp);
- stripNL(buf);
- if (do_DATAhack && (buf[0] == '\\') && (buf[1] == 'n') ) {
- buf[0] = -1; /* simulate "^" command */
- memcpy(&buf[1], &buf[2], strlen(buf)-1);
- }
- cont[ncont].ch.data = strdup(buf);
- cont[ncont].type = CMD_DATA;
- ncont++;
- break;
-
- case CMD_PI: /* ?pi */
- fgets(buf, LINESIZE, fp);
- stripNL(buf);
- cont[ncont].type = CMD_PI;
- cont[ncont].ch.data = strdup(buf);
- ncont++;
- break;
-
- case CMD_CLOSE: /* )gi */
- fgets(buf, LINESIZE, fp);
- stripNL(buf);
- if (ncont) {
- e->ncont = ncont;
- Malloc(ncont, e->cont, Content_t);
- for (i=0; i<ncont; i++) e->cont[i] = cont[i];
- }
- free(buf);
- free(cont);
- return e;
- break;
-
- case CMD_OPEN: /* (gi */
-/*fprintf(stderr, "+++++ OPEN +++\n");*/
-/* break;*/
-
- case CMD_ATT: /* Aname val */
- case CMD_D_ATT: /* Dename name val */
- case CMD_NOTATION: /* Nnname */
- case CMD_EXT_ENT: /* Eename typ nname */
- case CMD_INT_ENT: /* Iename typ text */
- case CMD_SYSID: /* ssysid */
- case CMD_PUBID: /* ppubid */
- case CMD_FILENAME: /* ffilename */
- ungetc(c, fp);
- cont[ncont].ch.elem = ReadESIS(fp, depth+1);
- cont[ncont].type = CMD_OPEN;
- cont[ncont].ch.elem->parent = e;
- ncont++;
- break;
-
- case CMD_LINE: /* Llineno */
- fgets(buf, LINESIZE, fp);
- break; /* ignore these here */
-
- case CMD_SUBDOC: /* Sename */
- case CMD_SUBDOC_S: /* {ename */
- case CMD_SUBDOC_E: /* }ename */
- case CMD_EXT_REF: /* &name */
- case CMD_APPINFO: /* #text */
- case CMD_CONFORM: /* C */
- default:
- fgets(buf, LINESIZE, fp);
- fprintf(stderr, "Error: Unexpected input at %d: '%c%s'\n",
- e->lineno, c, buf);
- exit(1);
- break;
- }
- }
- if( e && e->gi)
- fprintf(stderr, "Error: End of ReadESIS - should not be here: %s\n", e->gi);
- else
- fprintf(stderr, "Error: Invalid SGML: End of ReadESIS - should not be here:\n");
-
- free(buf);
- free(cont);
- return NULL;
-}
-
-/* ______________________________________________________________________ */
-/* Read input stream, creating a tree in memory of the elements and data.
- * Arguments:
- * Filename where instance's ESIS is.
- */
-static void
-ReadInstance(
- char *filename
-)
-{
- int i, n;
- FILE *fp;
- Element_t *e;
- char *idatt;
-
- if (filename) { /* if we specified input file. else stdin */
- if ((fp=fopen(filename, "r")) == NULL) {
- perror(filename);
- exit(1);
- }
- }
- else fp = stdin;
- last_file = filename;
- DocTree = ReadESIS(fp, 0);
- if (filename) fclose(fp);
-
- /* Traverse tree, filling in econt and figuring out which child
- * (ie. what birth order) each element is. */
- DocTree->my_eorder = -1;
- for (e=DocTree; e; e=e->next) {
-
- /* count element children */
- for (i=0,n=0; i<e->ncont; i++) if (IsContElem(e,i)) n++;
- if (n > 0) Calloc(n, e->econt, Element_t *);
- for (i=0; i<e->ncont; i++)
- if (IsContElem(e,i)) e->econt[e->necont++] = ContElem(e,i);
-
- /* count data children */
- for (i=0,n=0; i<e->ncont; i++) if (IsContData(e,i)) n++;
- if (n > 0) Calloc(n, e->dcont, char *);
- for (i=0; i<e->ncont; i++)
- if (IsContData(e,i)) e->dcont[e->ndcont++] = ContData(e,i);
-
- /* where in child order order */
- for (i=0; i<e->necont; i++)
- e->econt[i]->my_eorder = i;
-
- /* Does this element have an ID? */
- for (i=0; i<e->natts; i++) {
- if ((idatt=FindAttValByName(e, "ID"))) {
- AddID(e, idatt);
- /* remember ID value for quick reference */
- e->id = idatt;
- break;
- }
- }
- }
- return;
-}
-
-/* ______________________________________________________________________ */