[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);
}

/*****************************************************************************/