[BACK]Return to main.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / texi2mdoc

Diff for /texi2mdoc/main.c between version 1.34 and 1.41

version 1.34, 2015/02/23 14:36:03 version 1.41, 2015/02/24 14:35:40
Line 14 
Line 14 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #include <sys/mman.h>  #if defined(__linux__) || defined(__MINT__)
 #include <sys/stat.h>  # define _GNU_SOURCE /* memmem */
   #endif
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
 #include <fcntl.h>  
 #include <getopt.h>  #include <getopt.h>
 #include <libgen.h>  #include <libgen.h>
 #include <limits.h>  #include <limits.h>
Line 28 
Line 27 
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #include <time.h>  #include <time.h>
 #include <unistd.h>  
   
 #include "extern.h"  #include "extern.h"
   
Line 106  static const struct texitok __texitoks[TEXICMD__MAX] =
Line 104  static const struct texitok __texitoks[TEXICMD__MAX] =
         { doinline, "code", 4 }, /* TEXICMD_CODE */          { doinline, "code", 4 }, /* TEXICMD_CODE */
         { dosymbol, ":", 1 }, /* TEXICMD_COLON */          { dosymbol, ":", 1 }, /* TEXICMD_COLON */
         { NULL, "columnfractions", 15 }, /* TEXICMD_COLUMNFRACTIONS */          { NULL, "columnfractions", 15 }, /* TEXICMD_COLUMNFRACTIONS */
           { dosymbol, "comma", 5 }, /* TEXICMD_COMMA */
         { doinline, "command", 7 }, /* TEXICMD_COMMAND */          { doinline, "command", 7 }, /* TEXICMD_COMMAND */
         { doignline, "c", 1 }, /* TEXICMD_COMMENT */          { doignline, "c", 1 }, /* TEXICMD_COMMENT */
         { doignline, "comment", 7 }, /* TEXICMD_COMMENT_LONG */          { doignline, "comment", 7 }, /* TEXICMD_COMMENT_LONG */
Line 142  static const struct texitok __texitoks[TEXICMD__MAX] =
Line 141  static const struct texitok __texitoks[TEXICMD__MAX] =
         { doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */          { doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */
         { dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */          { dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */
         { doignbracket, "dmn", 3 }, /* TEXICMD_DMN */          { doignbracket, "dmn", 3 }, /* TEXICMD_DMN */
           { doignblock, "documentdescription", 19 }, /* TEXICMD_DOCUMENTDESCRIPTION */
           { doignline, "documentencoding", 16 }, /* TEXICMD_DOCUMENTENCODING */
         { dosymbol, "dots", 4 }, /* TEXICMD_DOTS */          { dosymbol, "dots", 4 }, /* TEXICMD_DOTS */
         { dolink, "email", 5 }, /* TEXICMD_EMAIL */          { dolink, "email", 5 }, /* TEXICMD_EMAIL */
         { doinline, "emph", 4 }, /* TEXICMD_EMPH */          { doinline, "emph", 4 }, /* TEXICMD_EMPH */
Line 225  static const struct texitok __texitoks[TEXICMD__MAX] =
Line 226  static const struct texitok __texitoks[TEXICMD__MAX] =
         { dosection, "section", 7 }, /* TEXICMD_SECTION */          { dosection, "section", 7 }, /* TEXICMD_SECTION */
         { dovalue, "set", 3 }, /* TEXICMD_SET */          { dovalue, "set", 3 }, /* TEXICMD_SET */
         { doignline, "setchapternewpage", 17 }, /* TEXICMD_SETCHAPNEWPAGE */          { doignline, "setchapternewpage", 17 }, /* TEXICMD_SETCHAPNEWPAGE */
           { doignline, "setcontentsaftertitlepage", 25 }, /* TEXICMD_SETCONTENTSAFTER */
         { doignline, "setfilename", 11 }, /* TEXICMD_SETFILENAME */          { doignline, "setfilename", 11 }, /* TEXICMD_SETFILENAME */
         { dotitle, "settitle", 8 }, /* TEXICMD_SETTITLE */          { dotitle, "settitle", 8 }, /* TEXICMD_SETTITLE */
         { doignline, "shortcontents", 13 }, /* TEXICMD_SHORTCONTENTS */          { doignline, "shortcontents", 13 }, /* TEXICMD_SHORTCONTENTS */
Line 239  static const struct texitok __texitoks[TEXICMD__MAX] =
Line 241  static const struct texitok __texitoks[TEXICMD__MAX] =
         { dodisplay, "smallindentblock", 16 }, /* TEXICMD_SMALLINDENTBLOCK */          { dodisplay, "smallindentblock", 16 }, /* TEXICMD_SMALLINDENTBLOCK */
         { dosymbol, "{", 1 }, /* TEXICMD_SQUIGGLE_LEFT */          { dosymbol, "{", 1 }, /* TEXICMD_SQUIGGLE_LEFT */
         { dosymbol, "}", 1 }, /* TEXICMD_SQUIGGLE_RIGHT */          { dosymbol, "}", 1 }, /* TEXICMD_SQUIGGLE_RIGHT */
           { dosymbol, "ss", 2 }, /* TEXICMD_SS */
         { doinline, "strong", 6 }, /* TEXICMD_STRONG */          { doinline, "strong", 6 }, /* TEXICMD_STRONG */
         { dosubsection, "subheading", 10 }, /* TEXICMD_SUBHEADING */          { dosubsection, "subheading", 10 }, /* TEXICMD_SUBHEADING */
         { dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */          { dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */
Line 254  static const struct texitok __texitoks[TEXICMD__MAX] =
Line 257  static const struct texitok __texitoks[TEXICMD__MAX] =
         { dotable, "table", 5 }, /* TEXICMD_TABLE */          { dotable, "table", 5 }, /* TEXICMD_TABLE */
         { doignblock, "tex", 3 }, /* TEXICMD_TEX */          { doignblock, "tex", 3 }, /* TEXICMD_TEX */
         { dosymbol, "TeX", 3 }, /* TEXICMD_TEXSYM */          { dosymbol, "TeX", 3 }, /* TEXICMD_TEXSYM */
           { dosymbol, "tie", 3 }, /* TEXICMD_TIE */
         { doaccent, "~", 1 }, /* TEXICMD_TILDE */          { doaccent, "~", 1 }, /* TEXICMD_TILDE */
         { doignline, "tindex", 6 }, /* TEXICMD_TINDEX */          { doignline, "tindex", 6 }, /* TEXICMD_TINDEX */
         { doignline, "title", 5 }, /* TEXICMD_TITLE */          { doignline, "title", 5 }, /* TEXICMD_TITLE */
Line 323  dodefn(struct texi *p, enum texicmd cmd, 
Line 327  dodefn(struct texi *p, enum texicmd cmd, 
         blk = NULL;          blk = NULL;
         switch (cmd) {          switch (cmd) {
         case (TEXICMD_DEFFN):          case (TEXICMD_DEFFN):
           case (TEXICMD_DEFMAC):
         case (TEXICMD_DEFTP):          case (TEXICMD_DEFTP):
         case (TEXICMD_DEFTYPEFN):          case (TEXICMD_DEFTYPEFN):
         case (TEXICMD_DEFTYPEFUN):          case (TEXICMD_DEFTYPEFUN):
Line 527  doignblock(struct texi *p, enum texicmd cmd, 
Line 532  doignblock(struct texi *p, enum texicmd cmd, 
          */           */
         term = memmem(&buf[*pos], sz, end, endsz);          term = memmem(&buf[*pos], sz, end, endsz);
         endpos = NULL == term ? sz :          endpos = NULL == term ? sz :
                 *pos + term - &buf[*pos];                  *pos + (size_t)(term - &buf[*pos]);
         assert(endpos <= sz);          assert(endpos <= sz);
         while (*pos < endpos)          while (*pos < endpos)
                 advance(p, buf, pos);                  advance(p, buf, pos);
Line 659  doverbatim(struct texi *p, enum texicmd cmd, 
Line 664  doverbatim(struct texi *p, enum texicmd cmd, 
          */           */
         term = memmem(&buf[*pos], sz, end, endsz);          term = memmem(&buf[*pos], sz, end, endsz);
         endpos = NULL == term ? sz :          endpos = NULL == term ? sz :
                 *pos + term - &buf[*pos];                  *pos + (size_t)(term - &buf[*pos]);
   
         teximacro(p, "Bd -literal -offset indent");          teximacro(p, "Bd -literal -offset indent");
         assert(endpos <= sz);          assert(endpos <= sz);
         while (*pos < endpos) {          while (*pos < endpos) {
                 if (buf[*pos] == '\n')                  texiputchar(p, buf[*pos]);
                         p->outcol = 0;  
                 else  
                         p->outcol++;  
                 if (*pos > 0 && '.' == buf[*pos])  
                         if ('\n' == buf[*pos - 1])  
                                 fputs("\\&", stdout);  
                 putchar(buf[*pos]);  
                 if ('\\' == buf[*pos])  
                         putchar('e');  
                 advance(p, buf, pos);                  advance(p, buf, pos);
         }          }
         teximacro(p, "Ed");          teximacro(p, "Ed");
Line 1010  dosymbol(struct texi *p, enum texicmd cmd, 
Line 1006  dosymbol(struct texi *p, enum texicmd cmd, 
         case (TEXICMD_BULLET):          case (TEXICMD_BULLET):
                 texiputchars(p, "\\(bu");                  texiputchars(p, "\\(bu");
                 break;                  break;
           case (TEXICMD_COMMA):
                   texiputchar(p, ',');
                   break;
         case (TEXICMD_COPYRIGHT):          case (TEXICMD_COPYRIGHT):
                 texiputchars(p, "\\(co");                  texiputchars(p, "\\(co");
                 break;                  break;
Line 1044  dosymbol(struct texi *p, enum texicmd cmd, 
Line 1043  dosymbol(struct texi *p, enum texicmd cmd, 
         case (TEXICMD_SLASH):          case (TEXICMD_SLASH):
                 texiputchar(p, '/');                  texiputchar(p, '/');
                 break;                  break;
           case (TEXICMD_SS):
                   texiputchars(p, "\\(ss");
                   break;
         case (TEXICMD_SQUIGGLE_LEFT):          case (TEXICMD_SQUIGGLE_LEFT):
                 texiputchars(p, "{");                  texiputchars(p, "{");
                 break;                  break;
Line 1053  dosymbol(struct texi *p, enum texicmd cmd, 
Line 1055  dosymbol(struct texi *p, enum texicmd cmd, 
         case (TEXICMD_TEXSYM):          case (TEXICMD_TEXSYM):
                 texiputchars(p, "TeX");                  texiputchars(p, "TeX");
                 break;                  break;
           case (TEXICMD_TIE):
                   texiputchars(p, "\\ ");
                   break;
         case (TEXICMD_COLON):          case (TEXICMD_COLON):
         case (TEXICMD_HYPHEN):          case (TEXICMD_HYPHEN):
                 break;                  break;
Line 1195  dolink(struct texi *p, enum texicmd cmd, 
Line 1200  dolink(struct texi *p, enum texicmd cmd, 
                 break;                  break;
         case (TEXICMD_XREF):          case (TEXICMD_XREF):
                 texiputchars(p, "See Section");                  texiputchars(p, "See Section");
                 teximacroopen(p, "Qq");                  teximacroopen(p, "Dq");
                 break;                  break;
         case (TEXICMD_PXREF):          case (TEXICMD_PXREF):
                 texiputchars(p, "see Section");                  texiputchars(p, "see Section");
                 teximacroopen(p, "Qq");                  teximacroopen(p, "Dq");
                 break;                  break;
         case (TEXICMD_INFOREF):          case (TEXICMD_INFOREF):
                 texiputchars(p, "See Info file node");                  texiputchars(p, "See Info file node");
                 teximacroopen(p, "Qq");                  teximacroopen(p, "Dq");
                 break;                  break;
         default:          default:
                 abort();                  abort();
Line 1341  dosp(struct texi *p, enum texicmd cmd, 
Line 1346  dosp(struct texi *p, enum texicmd cmd, 
         const char *buf, size_t sz, size_t *pos)          const char *buf, size_t sz, size_t *pos)
 {  {
   
         texivspace(p);          if (p->literal)
                   texiputchar(p, '\n');
           else
                   texivspace(p);
         /* FIXME: ignore and parseeoln. */          /* FIXME: ignore and parseeoln. */
         advanceeoln(p, buf, sz, pos, 1);          advanceeoln(p, buf, sz, pos, 1);
 }  }
Line 1378  dotop(struct texi *p, enum texicmd cmd, 
Line 1386  dotop(struct texi *p, enum texicmd cmd, 
         teximacro(p, "Os");          teximacro(p, "Os");
         teximacro(p, "Sh NAME");          teximacro(p, "Sh NAME");
         teximacroopen(p, "Nm");          teximacroopen(p, "Nm");
         texiputchars(p, p->title);          for (cp = p->title; '\0' != *cp; cp++)
                   texiputchar(p, *cp);
         teximacroclose(p);          teximacroclose(p);
         teximacroopen(p, "Nd");          teximacroopen(p, "Nd");
         texiputchars(p, NULL != p->subtitle ?          if (NULL != p->subtitle)
                 p->subtitle : "Unknown description");                  for (cp = p->subtitle; '\0' != *cp; cp++)
                           texiputchar(p, *cp);
           else
                   texiputchars(p, "Unknown description");
         teximacroclose(p);          teximacroclose(p);
         p->seenvs = 1;          p->seenvs = 1;
         dosection(p, cmd, buf, sz, pos);          dosection(p, cmd, buf, sz, pos);
Line 1577  doignline(struct texi *p, enum texicmd cmd, 
Line 1589  doignline(struct texi *p, enum texicmd cmd, 
 /*  /*
  * Parse colon-separated directories from "cp" (if not NULL) and returns   * Parse colon-separated directories from "cp" (if not NULL) and returns
  * the array of pointers.   * the array of pointers.
  * Prepends "base" to the array.   * Prepends "base" to the array, if found.
  * This does NOT sanitise the directories!   * This does NOT sanitise the directories!
  */   */
 static char **  static char **
Line 1585  parsedirs(struct texi *p, const char *base, const char
Line 1597  parsedirs(struct texi *p, const char *base, const char
 {  {
         char             *tok, *str, *tofree;          char             *tok, *str, *tofree;
         const char       *cpp;          const char       *cpp;
         size_t            i;          size_t            i = 0;
         char            **dirs;          char            **dirs;
   
         *sz = NULL != (cpp = cp) ? 2 : 1;          /* Count up our expected arguments. */
         if (*sz > 1)          *sz = NULL != base;
                 for ( ; NULL != (cpp = strchr(cpp, ':')); (*sz)++)          if (NULL != (cpp = cp))
                   for ((*sz)++; NULL != (cpp = strchr(cpp, ':')); (*sz)++)
                         cpp++;                          cpp++;
   
           if (0 == *sz)
                   return(NULL);
         if (NULL == (dirs = calloc(*sz, sizeof(char *))))          if (NULL == (dirs = calloc(*sz, sizeof(char *))))
                 texiabort(p, NULL);                  texiabort(p, NULL);
         else if (NULL == (dirs[0] = strdup(base)))          if (NULL != base && NULL == (dirs[i++] = strdup(base)))
                 texiabort(p, NULL);                  texiabort(p, NULL);
   
         if (NULL == cp)          if (NULL == cp)
                 return(dirs);                  return(dirs);
   
         if (NULL == (tofree = tok = str = strdup(cp)))          if (NULL == (tofree = tok = str = strdup(cp)))
                 texiabort(p, NULL);                  texiabort(p, NULL);
   
         for (i = 1; NULL != (tok = strsep(&str, ":")); i++)          for ( ; NULL != (tok = strsep(&str, ":")); i++)
                 if (NULL == (dirs[i] = strdup(tok)))                  if (NULL == (dirs[i] = strdup(tok)))
                         texiabort(p, NULL);                          texiabort(p, NULL);
   
Line 1617  main(int argc, char *argv[])
Line 1630  main(int argc, char *argv[])
 {  {
         struct texi      texi;          struct texi      texi;
         int              c;          int              c;
         char            *path, *dir;          char            *dirpath, *dir, *ccp;
         const char      *progname, *Idir, *cp;          const char      *progname, *Idir, *cp;
   
         progname = strrchr(argv[0], '/');          progname = strrchr(argv[0], '/');
Line 1627  main(int argc, char *argv[])
Line 1640  main(int argc, char *argv[])
                 ++progname;                  ++progname;
   
         memset(&texi, 0, sizeof(struct texi));          memset(&texi, 0, sizeof(struct texi));
           texi.ign = 1;
         Idir = NULL;          Idir = NULL;
   
         while (-1 != (c = getopt(argc, argv, "I:")))          while (-1 != (c = getopt(argc, argv, "I:")))
Line 1639  main(int argc, char *argv[])
Line 1653  main(int argc, char *argv[])
                 }                  }
   
         argv += optind;          argv += optind;
         if (0 == (argc -= optind))          argc -= optind;
                 goto usage;  
   
         if (NULL == (path = strdup(argv[0])))          if (argc > 0) {
                 texiabort(&texi, NULL);                  if (NULL == (dirpath = strdup(argv[0])))
         else if (NULL == (dir = dirname(path)))                          texiabort(&texi, NULL);
                 texiabort(&texi, NULL);                  if (NULL == (dir = dirname(dirpath)))
                           texiabort(&texi, NULL);
                   if (NULL != (cp = strrchr(argv[0], '/')))
                           texi.title = strdup(cp + 1);
                   else
                           texi.title = strdup(argv[0]);
                   if (NULL == texi.title)
                           texiabort(&texi, NULL);
                   else if (NULL != (ccp = strchr(texi.title, '.')))
                           *ccp = '\0';
                   texi.dirs = parsedirs(&texi, dir, Idir, &texi.dirsz);
                   free(dirpath);
                   parsefile(&texi, argv[0], 1);
           } else {
                   texi.title = strdup("Unknown Manual");
                   texi.dirs = parsedirs(&texi, NULL, Idir, &texi.dirsz);
                   parsestdin(&texi);
           }
   
         free(path);  
   
         if (NULL != (cp = strrchr(argv[0], '/')))  
                 texi.title = strdup(cp + 1);  
         else  
                 texi.title = strdup(argv[0]);  
   
         if (NULL == texi.title)  
                 texiabort(&texi, NULL);  
         else if (NULL != (path = strchr(texi.title, '.')))  
                 *path = '\0';  
   
         texi.ign = 1;  
         texi.dirs = parsedirs(&texi, dir, Idir, &texi.dirsz);  
         parsefile(&texi, argv[0], 1);  
         /* We shouldn't get here. */  
         texiexit(&texi);          texiexit(&texi);
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
 usage:  usage:
         fprintf(stderr, "usage: %s [-Idirs] file\n", progname);          fprintf(stderr, "usage: %s [-Idirs] [file]\n", progname);
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
 }  }

Legend:
Removed from v.1.34  
changed lines
  Added in v.1.41

CVSweb