[0001] [0002] [0003] [0004] [0005] [0006] [0007] [0008] [0009] [0010] [0011] [0012] [0013] [0014] [0015] [0016] [0017] [0018] [0019] [0020] [0021] [0022] [0023] [0024] [0025] [0026] [0027] [0028] [0029] [0030] [0031] [0032] [0033] [0034] [0035] [0036] [0037] [0038] [0039] [0040] [0041] [0042] [0043] [0044] [0045] [0046] [0047] [0048] [0049] [0050] [0051] [0052] [0053] [0054] [0055] [0056] [0057] [0058] [0059] [0060] [0061] [0062] [0063] [0064] [0065] [0066] [0067] [0068] [0069] [0070] [0071] [0072] [0073] [0074] [0075] [0076] [0077] [0078] [0079] [0080] [0081] [0082] [0083] [0084] [0085] [0086] [0087] [0088] [0089] [0090] [0091] [0092] [0093] [0094] [0095] [0096] [0097] [0098] [0099] [0100] [0101] [0102] [0103] [0104] [0105] [0106] [0107] [0108] [0109] [0110] [0111] [0112] [0113] [0114] [0115] [0116] [0117] [0118] [0119] [0120] [0121] [0122] [0123] [0124] [0125] [0126] [0127] [0128] [0129] [0130] [0131] [0132] [0133] [0134] [0135] [0136] [0137] [0138] [0139] [0140] [0141] [0142] [0143] [0144] [0145] [0146] [0147] [0148] [0149] [0150] [0151] [0152] [0153] [0154] [0155] [0156] [0157] [0158] [0159] [0160] [0161] [0162] [0163] [0164] [0165] [0166] [0167] [0168] [0169] [0170] [0171] [0172] [0173] [0174] [0175] [0176] [0177] [0178] [0179] [0180] [0181] [0182] [0183] [0184] [0185] [0186] [0187] [0188] [0189] [0190] [0191] [0192] [0193] [0194] [0195] [0196] [0197] [0198] [0199] [0200] [0201] [0202] [0203] [0204] [0205] [0206] [0207] [0208] [0209] [0210] [0211] [0212] [0213] [0214] [0215] [0216] [0217] [0218] [0219] [0220] [0221] [0222] [0223] [0224] [0225] [0226] [0227] [0228] [0229] [0230] [0231] [0232] [0233] [0234] [0235] [0236] [0237] [0238] [0239] [0240] [0241] [0242] [0243] [0244] [0245] [0246] [0247] [0248] [0249] [0250] [0251] [0252] [0253] [0254] [0255] [0256] [0257] [0258] [0259] [0260] [0261] [0262] [0263] [0264] [0265] [0266] [0267] [0268] [0269] [0270] [0271] [0272] [0273] [0274] [0275] [0276] [0277] [0278] [0279] [0280] [0281] [0282] [0283] [0284] [0285] [0286] [0287] [0288] [0289] [0290] [0291]
/*****************************************************************************/ /* cli.c Command-line wasDOC. VERSION HISTORY --------------- 21-FEB-2019 MGD initial */ /*****************************************************************************/ #include <stat.h> #include "wasdoc.h" int CliChunk, CliDoOutput, CliInsight; char *CliDocDir, *CliMain, *CliOutput; extern int dbug, isCgi, isCgiPlus; extern char CopyrightDate [], DefaultType [], SoftwareID [], Utility []; /*****************************************************************************/ /* Command-line usage. */ void CliDoc (int argc, char *argv[]) { int chunk, cnt, error, retval; char *cptr, *dptr, *sptr, *zptr; struct wasdoc_st *docptr; if (cptr = getenv ("WASDOC$DBUG")) if (!(dbug = atoi(cptr))) dbug = 1; CliOptions (argc, argv); if (!CliDocDir) CliDocDir = getenv("PATH"); if (!CliDocDir) CliDocDir = "[]"; if (retval = CliCheckDir (CliDocDir)) exit (retval); docptr = InitDoc (NULL, NULL, NULL, CliDocDir); docptr->isStatic = 1; docptr->chunked = CliChunk; if (CliInsight < 0) /* if negative then force insights to document */ docptr->insight = docptr->insight2doc = -CliInsight; else docptr->insight = CliInsight; wasDocStatistics (docptr, 1); if (CliOutput) { zptr = (sptr = docptr->output) + sizeof(docptr->output)-1; for (cptr = CliOutput; *cptr && sptr < zptr; *sptr++ = *cptr++); *sptr = '\0'; /* parse out the file from the directory elements */ for (cptr = sptr = dptr = docptr->output; *cptr; cptr++); while (cptr > sptr && *cptr != '/' && *cptr != ']' && *(cptr-1) != '^') cptr--; if (*cptr == '/' || *cptr == ']') dptr = ++cptr; /* buffer just the file name (sans directory, sans any type) */ zptr = (sptr = docptr->oname) + sizeof(docptr->oname)-1; while (*cptr && *cptr != '.' && !MATCH2 (cptr-1, "^.") && sptr < zptr) *sptr++ = *cptr++; *sptr = '\0'; /* now just terminate ->output at the end of the directory element */ *dptr = '\0'; if (retval = CliCheckDir (CliDocDir)) exit (retval); } if (docptr->insight) { fprintf (stdout, "%%WASDOC-I-INSIGHT, %d\n", docptr->insight); for (cnt = 0; cnt < argc; cnt++) fprintf (stdout, "%s ", argv[cnt]); fprintf (stdout, "\n%s %s\n", docptr->dname, docptr->oname); } error = ProcessDirectory (docptr); if (error) exit (vaxc$errno); if (!docptr->tlength) exit (SS$_ABORT); if (dbug>1) fputs (docptr->text, stdout); if (error = renderParse (docptr)) { if (CliDoOutput) if (docptr->hlength) wasDocWrite (docptr, docptr->html, docptr->hlength); fprintf (stdout, "%%%s-E-RENDER, %s\n", Utility, strerror(error)); exit (SS$_ABORT | STS$M_INHIB_MSG); } if (!docptr->hlength) exit (SS$_ABORT); wasDocStatistics (docptr, 0); // wasDocHtmlPrint (docptr, "<!-- %s -->\n", docptr->statistics); if (docptr->chunked) { for (chunk = 0; chunk <= docptr->chunkTotal; chunk++) { docptr->pchunk = chunk; error = wasDocChunkOut (docptr); if (error) break; } if (CliMain && *(cptr = CliMain)) { zptr = (sptr = docptr->oname) + sizeof(docptr->oname)-1; while (*cptr && *cptr != '.' && !MATCH2 (cptr-1, "^.") && sptr < zptr) *sptr++ = *cptr++; *sptr = '\0'; /* get the zeroeth chunk (again) */ docptr->pchunk = -1; error = wasDocChunkOut (docptr); } } else error = wasDocWrite (docptr, docptr->html, docptr->hlength); exit (error ? SS$_ABORT : 1); } /*****************************************************************************/ /* */ int CliWriteFile ( struct wasdoc_st *docptr, char *data, int length ) { static char pname [256]; static FILE *ofptr; int retval = 0; char *cptr, *sptr, *zptr; char fname [sizeof(pname)]; if (length < 0) { /* close the file */ fclose (ofptr); pname[0] = '\0'; return (0); } zptr = (sptr = fname) + sizeof(fname)-16; for (cptr = docptr->output; *cptr && sptr < zptr; *sptr++ = *cptr++); for (cptr = docptr->oname; *cptr && sptr < zptr; *sptr++ = *cptr++); if (docptr->chunked && docptr->pchunk >= 0) sprintf (sptr, "%03.3d.html", docptr->pchunk); else sprintf (sptr, ".html"); if (dbug>1) dbugThis (FI_LI, "CliWriteFile() |%s|%s|%s|\n", docptr->oname, fname, pname); if (pname[0] && strcmp (fname, pname)) { fclose (ofptr); pname[0] = '\0'; } if (!pname[0]) { if ((ofptr = fopen (fname, "w")) == NULL) { retval = vaxc$errno; fprintf (stdout, "%%%s-E-OUTPUT, %s\n", Utility, fname); exit (retval); } strcpy (pname, fname); } if (length > 0) retval = fwrite (data, length, 1, ofptr); else retval = fflush (ofptr); return (retval ? 0 : vaxc$errno); } /*****************************************************************************/ /* CLI a bit VMS-like. */ void CliOptions (int argc, char *argv[]) { int cnt, nomain = 0; char *cptr; for (cnt = 1; cnt < argc; cnt++) { if (!strncasecmp (argv[cnt], "/chunked", 6)) CliChunk = 1; else if (!strncasecmp (argv[cnt], "/dbug=", 6)) dbug = atoi(argv[cnt]+6); else if (!strncasecmp (argv[cnt], "/dbug", 5)) dbug = 99; else if (!strncasecmp (argv[cnt], "/main", 4)) { for (cptr = argv[cnt]; *cptr && *cptr != '='; cptr++); if (*cptr) CliMain = cptr + 1; } else if (!strncasecmp (argv[cnt], "/nomain", 6)) nomain = 1; else if (!strncasecmp (argv[cnt], "/output=", 4)) { for (cptr = argv[cnt]; *cptr && *cptr != '='; cptr++); if (*cptr) CliOutput = cptr + 1; else CliDoOutput = 1; } else if (!strncasecmp (argv[cnt], "/insight", 4)) { for (cptr = argv[cnt]; *cptr && *cptr != '='; cptr++); if (*cptr) CliInsight = atoi(cptr+1); else CliInsight = -1; } else if (!strncasecmp (argv[cnt], "/version", 4)) { fprintf (stdout, "%%%s-I-VERSION, %s\n", Utility, SoftwareID); exit (1); } else if (*argv[cnt] == '/') { fprintf (stdout, "%%%s-E-IVQUAL, unrecognized qualifier\n \\%s\\\n", Utility, argv[cnt]); exit(0x10000002); } else CliDocDir = argv[cnt]; } if (nomain) CliMain = NULL; else if (!CliMain) CliMain = CliOutput; } /*****************************************************************************/ /* Return 0 if a dir, ENOTDIR if not a dir, or some other errno. */ int CliCheckDir (char *path) { struct stat st; if (stat (path, &st) == 0) if (!(st.st_mode & S_IFDIR)) return (ENOTDIR); return (errno); } /*****************************************************************************/