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

Diff for /texi2mdoc/util.c between version 1.20 and 1.23

version 1.20, 2015/03/01 00:25:08 version 1.23, 2015/03/02 18:12:53
Line 184  texiputchar(struct texi *p, char c)
Line 184  texiputchar(struct texi *p, char c)
         if ('\'' == c && 0 == p->outcol)          if ('\'' == c && 0 == p->outcol)
                 fputs("\\&", p->outfile);                  fputs("\\&", p->outfile);
   
         fputc(c, p->outfile);          if (p->uppercase)
                   fputc(toupper((unsigned int)c), p->outfile);
           else
                   fputc(c, p->outfile);
         if ('\\' == c)          if ('\\' == c)
                 fputc('e', p->outfile);                  fputc('e', p->outfile);
         p->seenvs = 0;          p->seenvs = 0;
Line 210  texiputchars(struct texi *p, const char *s)
Line 213  texiputchars(struct texi *p, const char *s)
                 fputs("\\&", p->outfile);                  fputs("\\&", p->outfile);
         if ('\'' == *s && 0 == p->outcol)          if ('\'' == *s && 0 == p->outcol)
                 fputs("\\&", p->outfile);                  fputs("\\&", p->outfile);
         p->outcol += fputs(s, p->outfile);          if (p->uppercase)
                   for ( ; '\0' != *s; s++)
                           p->outcol += fputc(toupper
                                   ((unsigned int)*s), p->outfile);
           else
                   p->outcol += fputs(s, p->outfile);
         p->seenvs = 0;          p->seenvs = 0;
 }  }
   
Line 362  texipunctuate(struct texi *p, size_t *pos)
Line 370  texipunctuate(struct texi *p, size_t *pos)
                 case ('.'):                  case ('.'):
                 case ('"'):                  case ('"'):
                 case (':'):                  case (':'):
                   case (';'):
                 case ('!'):                  case ('!'):
                 case ('?'):                  case ('?'):
                         continue;                          continue;
Line 415  advancenext(struct texi *p, size_t *pos)
Line 424  advancenext(struct texi *p, size_t *pos)
   
 /*  /*
  * Advance to the EOLN in the input stream.   * Advance to the EOLN in the input stream.
  * NOTE: THIS SHOULD NOT BE CALLED ON BLANK TEXT, as it will read up to   * This will skip over '@' markers in an effort to ignore escaped
  * the @\n.   * newlines.
  */   */
 size_t  size_t
 advanceeoln(struct texi *p, size_t *pos, int consumenl)  advanceeoln(struct texi *p, size_t *pos, int consumenl)
 {  {
   
         while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos])          while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) {
                   if ('@' == BUF(p)[*pos])
                           advance(p, pos);
                 advance(p, pos);                  advance(p, pos);
           }
         if (*pos < BUFSZ(p) && consumenl)          if (*pos < BUFSZ(p) && consumenl)
                 advance(p, pos);                  advance(p, pos);
         return(*pos);          return(*pos);
Line 452  texiexecmacro(struct texi *p, struct teximacro *m, siz
Line 464  texiexecmacro(struct texi *p, struct teximacro *m, siz
         const char       *cp;          const char       *cp;
   
         /* Disregard empty macros. */          /* Disregard empty macros. */
         if (0 == (valsz = realsz = strlen(m->value)))          if (0 == (valsz = realsz = strlen(m->value))) {
                   args = argparse(p, pos, &asz, m->argsz);
                   for (i = 0; i < asz; i++)
                           free(args[i]);
                   free(args);
                 return;                  return;
           }
   
         /*          /*
          * This is important: it protect us from macros that invoke more           * This is important: it protect us from macros that invoke more
Line 472  texiexecmacro(struct texi *p, struct teximacro *m, siz
Line 489  texiexecmacro(struct texi *p, struct teximacro *m, siz
         aasz = asz < m->argsz ? asz : m->argsz;          aasz = asz < m->argsz ? asz : m->argsz;
   
         if (0 == aasz) {          if (0 == aasz) {
                 texisplice(p, m->value, valsz, pos);                  texisplice(p, m->value, valsz, *pos);
                 return;                  return;
         }          }
   
Line 535  texiexecmacro(struct texi *p, struct teximacro *m, siz
Line 552  texiexecmacro(struct texi *p, struct teximacro *m, siz
                 i = end;                  i = end;
         }          }
   
         texisplice(p, val, strlen(val), pos);          texisplice(p, val, strlen(val), *pos);
   
         for (i = 0; i < asz; i++)          for (i = 0; i < asz; i++)
                 free(args[i]);                  free(args[i]);
Line 607  texicmd(const struct texi *p, size_t pos, size_t *end,
Line 624  texicmd(const struct texi *p, size_t pos, size_t *end,
                 return(TEXICMD__MAX);                  return(TEXICMD__MAX);
   
         /* Alphabetic commands are special. */          /* Alphabetic commands are special. */
         if ( ! isalpha((unsigned char)BUF(p)[pos])) {          if ( ! isalpha((unsigned int)BUF(p)[pos])) {
                 if ((*end = pos + 1) == BUFSZ(p))                  if ((*end = pos + 1) == BUFSZ(p))
                         return(TEXICMD__MAX);                          return(TEXICMD__MAX);
                 for (i = 0; i < TEXICMD__MAX; i++) {                  for (i = 0; i < TEXICMD__MAX; i++) {
Line 927  parseeof(struct texi *p)
Line 944  parseeof(struct texi *p)
 }  }
   
 void  void
 texisplice(struct texi *p, const char *buf, size_t sz, size_t *pos)  texisplice(struct texi *p, const char *buf, size_t sz, size_t pos)
 {  {
         char            *cp;          char            *cp;
         struct texifile *f;          struct texifile *f;
Line 944  texisplice(struct texi *p, const char *buf, size_t sz,
Line 961  texisplice(struct texi *p, const char *buf, size_t sz,
         }          }
   
         f->insplice += sz;          f->insplice += sz;
         memmove(f->map + *pos + sz, f->map + *pos, f->mapsz - *pos);          memmove(f->map + pos + sz, f->map + pos, f->mapsz - pos);
         memcpy(f->map + *pos, buf, sz);          memcpy(f->map + pos, buf, sz);
         f->mapsz += sz;          f->mapsz += sz;
 }  }
   
Line 1369  teximdocclose(struct texi *p, int last)
Line 1386  teximdocclose(struct texi *p, int last)
   
         /* Print a reference to the "top" node. */          /* Print a reference to the "top" node. */
         if (p->chapnum > 1) {          if (p->chapnum > 1) {
                   texiputchars(p, "Top node,");
                 snprintf(buf, sizeof(buf), "node1 7");                  snprintf(buf, sizeof(buf), "node1 7");
                 teximacroopen(p, "Xr ");                  teximacroopen(p, "Xr ");
                 texiputchars(p, buf);                  texiputchars(p, buf);
                 texiputchars(p, " ,");                  texiputchars(p, " ;");
                 teximacroclose(p);                  teximacroclose(p);
         }          }
   
         /* Print a reference to the previous node. */          /* Print a reference to the previous node. */
         if (p->chapnum > 2) {          if (p->chapnum > 2) {
                   texiputchars(p, "previous node,");
                 snprintf(buf, sizeof(buf),                  snprintf(buf, sizeof(buf),
                         "node%zu 7", p->chapnum - 1);                          "node%zu 7", p->chapnum - 1);
                 teximacroopen(p, "Xr ");                  teximacroopen(p, "Xr ");
                 texiputchars(p, buf);                  texiputchars(p, buf);
                 if ( ! last)                  if ( ! last)
                         texiputchars(p, " ,");                          texiputchars(p, " ;");
                 teximacroclose(p);                  teximacroclose(p);
         }          }
   
         /* Print a reference to the next node. */          /* Print a reference to the next node. */
         if ( ! last) {          if ( ! last) {
                   if (1 == p->chapnum)
                           texiputchars(p, "Next node,");
                   else
                           texiputchars(p, "next node,");
                 snprintf(buf, sizeof(buf),                  snprintf(buf, sizeof(buf),
                         "node%zu 7", p->chapnum + 1);                          "node%zu 7", p->chapnum + 1);
                 teximacroopen(p, "Xr ");                  teximacroopen(p, "Xr ");
Line 1405  teximdocclose(struct texi *p, int last)
Line 1428  teximdocclose(struct texi *p, int last)
  * Otherwise just print the mdoc(7) prologue.   * Otherwise just print the mdoc(7) prologue.
  */   */
 void  void
 teximdocopen(struct texi *p)  teximdocopen(struct texi *p, size_t *pos)
 {  {
         const char      *cp;          const char      *cp;
         time_t           t;          time_t           t;
Line 1445  teximdocopen(struct texi *p)
Line 1468  teximdocopen(struct texi *p)
                 texiputchar(p, *cp);                  texiputchar(p, *cp);
         teximacroclose(p);          teximacroclose(p);
         teximacroopen(p, "Nd");          teximacroopen(p, "Nd");
         if (NULL != p->subtitle)          /*
                 for (cp = p->subtitle; '\0' != *cp; cp++)           * The subtitle `Nd' can consist of arbitrary macros, so paste
                         texiputchar(p, *cp);           * it and parse to the end of the line.
         else           */
           if (NULL != p->subtitle) {
                   texisplice(p, p->subtitle, strlen(p->subtitle), *pos);
                   parseeoln(p, pos);
           } else
                 texiputchars(p, "Unknown description");                  texiputchars(p, "Unknown description");
         teximacroclose(p);          teximacroclose(p);
         p->seenvs = 1;          p->seenvs = 1;

Legend:
Removed from v.1.20  
changed lines
  Added in v.1.23

CVSweb