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

Diff for /texi2mdoc/util.c between version 1.27 and 1.29

version 1.27, 2015/03/05 09:36:41 version 1.29, 2015/03/07 11:53:21
Line 31 
Line 31 
 #include "extern.h"  #include "extern.h"
   
 /*  /*
    * Table of macros.
    * These ABSOLUTELY MUST BE 2 or three characters long.
    */
   static  const char *const mdocs[] = {
           "Ap",           "Dd",           "Dt",           "Os",
           "Sh",           "Ss",           "Pp",           "D1",
           "Dl",           "Bd",           "Ed",           "Bl",
           "El",           "It",           "Ad",           "An",
           "Ar",           "Cd",           "Cm",           "Dv",
           "Er",           "Ev",           "Ex",           "Fa",
           "Fd",           "Fl",           "Fn",           "Ft",
           "Ic",           "In",           "Li",           "Nd",
           "Nm",           "Op",           "Ot",           "Pa",
           "Rv",           "St",           "Va",           "Vt",
           "Xr",           "%A",           "%B",           "%D",
           "%I",           "%J",           "%N",           "%O",
           "%P",           "%R",           "%T",           "%V",
           "Ac",           "Ao",           "Aq",           "At",
           "Bc",           "Bf",           "Bo",           "Bq",
           "Bsx",          "Bx",           "Db",           "Dc",
           "Do",           "Dq",           "Ec",           "Ef",
           "Em",           "Eo",           "Fx",           "Ms",
           "No",           "Ns",           "Nx",           "Ox",
           "Pc",           "Pf",           "Po",           "Pq",
           "Qc",           "Ql",           "Qo",           "Qq",
           "Re",           "Rs",           "Sc",           "So",
           "Sq",           "Sm",           "Sx",           "Sy",
           "Tn",           "Ux",           "Xc",           "Xo",
           "Fo",           "Fc",           "Oo",           "Oc",
           "Bk",           "Ek",           "Bt",           "Hf",
           "Fr",           "Ud",           "Lb",           "Lp",
           "Lk",           "Mt",           "Brq",          "Bro",
           "Brc",          "%C",           "Es",           "En",
           "Dx",           "%Q",           "br",           "sp",
           "%U",           "Ta",           "ll",           NULL,
           };
   
   /*
  * Unmap the top-most file in the stack of files currently opened (that   * Unmap the top-most file in the stack of files currently opened (that
  * is, nested calls to parsefile()).   * is, nested calls to parsefile()).
  */   */
Line 561  texiexecmacro(struct texi *p, struct teximacro *m, siz
Line 599  texiexecmacro(struct texi *p, struct teximacro *m, siz
 static void  static void
 parseword(struct texi *p, size_t *pos, char extra)  parseword(struct texi *p, size_t *pos, char extra)
 {  {
           size_t           i, end, len;
           int              c;
   
         /*          /*
          * If a prior word had a terminating double-newline, then begin           * If a prior word had a terminating double-newline, then begin
Line 588  parseword(struct texi *p, size_t *pos, char extra)
Line 628  parseword(struct texi *p, size_t *pos, char extra)
   
         p->seenws = 0;          p->seenws = 0;
   
           /*
            * If we're in a macro line, we might want to print text that
            * happens to be the same as an mdoc(7) macro.
            * Obviously, we need to escape these words.
            */
           if (p->outmacro) {
                   end = *pos;
                   /* Read ahead to get the word length. */
                   while (end < BUFSZ(p) && ! ismspace(BUF(p)[end])) {
                           switch ((c = BUF(p)[end])) {
                           case ('@'):
                           case ('}'):
                           case ('{'):
                                   break;
                           default:
                                   if ('\0' != extra && extra == c)
                                           break;
                                   end++;
                                   continue;
                           }
                           break;
                   }
                   len = end - *pos;
                   /* See if we have a match. */
                   for (i = 0; NULL != mdocs[i]; i++) {
                           /* All macros are 2 or three letters. */
                           if (len < 2 || len > 3)
                                   continue;
                           /* Check the macro word length. */
                           if ('\0' == mdocs[i][2] && 2 != len)
                                   continue;
                           else if ('\0' == mdocs[i][3] && 3 != len)
                                   continue;
                           if (strncmp(mdocs[i], &BUF(p)[*pos], len))
                                   continue;
                           texiputchars(p, "\\&");
                           break;
                   }
           }
   
         while (*pos < BUFSZ(p) && ! ismspace(BUF(p)[*pos])) {          while (*pos < BUFSZ(p) && ! ismspace(BUF(p)[*pos])) {
                 switch (BUF(p)[*pos]) {                  switch (BUF(p)[*pos]) {
                 case ('@'):                  case ('@'):
Line 597  parseword(struct texi *p, size_t *pos, char extra)
Line 677  parseword(struct texi *p, size_t *pos, char extra)
                 }                  }
                 if ('\0' != extra && BUF(p)[*pos] == extra)                  if ('\0' != extra && BUF(p)[*pos] == extra)
                         return;                          return;
                 if (*pos < BUFSZ(p) - 1 &&  
                   if (p->literal) {
                           texiputchar(p, BUF(p)[*pos]);
                           advance(p, pos);
                           continue;
                   }
   
                   if (*pos < BUFSZ(p) - 2 &&
                            '-' == BUF(p)[*pos] &&
                            '-' == BUF(p)[*pos + 1] &&
                            '-' == BUF(p)[*pos + 2]) {
                           texiputchars(p, "\\(em");
                           advance(p, pos);
                           advance(p, pos);
                   } else if (*pos < BUFSZ(p) - 1 &&
                            '-' == BUF(p)[*pos] &&
                            '-' == BUF(p)[*pos + 1]) {
                           texiputchars(p, "\\(en");
                           advance(p, pos);
                   } else if (*pos < BUFSZ(p) - 1 &&
                          '`' == BUF(p)[*pos] &&                           '`' == BUF(p)[*pos] &&
                          '`' == BUF(p)[*pos + 1]) {                           '`' == BUF(p)[*pos + 1]) {
                         texiputchars(p, "\\(lq");                          texiputchars(p, "\\(lq");
Line 609  parseword(struct texi *p, size_t *pos, char extra)
Line 708  parseword(struct texi *p, size_t *pos, char extra)
                         advance(p, pos);                          advance(p, pos);
                 } else                  } else
                         texiputchar(p, BUF(p)[*pos]);                          texiputchar(p, BUF(p)[*pos]);
   
                 advance(p, pos);                  advance(p, pos);
         }          }
   

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.29

CVSweb