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

Diff for /mandoc/mdoc.c between version 1.53 and 1.66

version 1.53, 2009/03/08 11:41:22 version 1.66, 2009/03/16 23:37:28
Line 1 
Line 1 
 /* $Id$ */  /* $Id$ */
 /*  /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>   * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the   * purpose with or without fee is hereby granted, provided that the
Line 38  static int    mdoc_node_append(struct mdoc *, 
Line 38  static int    mdoc_node_append(struct mdoc *, 
   
 static  int               parsetext(struct mdoc *, int, char *);  static  int               parsetext(struct mdoc *, int, char *);
 static  int               parsemacro(struct mdoc *, int, char *);  static  int               parsemacro(struct mdoc *, int, char *);
   static  int               macrowarn(struct mdoc *, int, const char *);
   
   
 const   char *const __mdoc_macronames[MDOC_MAX] = {  const   char *const __mdoc_macronames[MDOC_MAX] = {
Line 70  const char *const __mdoc_macronames[MDOC_MAX] = {   
Line 71  const char *const __mdoc_macronames[MDOC_MAX] = {   
         "Tn",           "Ux",           "Xc",           "Xo",          "Tn",           "Ux",           "Xc",           "Xo",
         "Fo",           "Fc",           "Oo",           "Oc",          "Fo",           "Fc",           "Oo",           "Oc",
         "Bk",           "Ek",           "Bt",           "Hf",          "Bk",           "Ek",           "Bt",           "Hf",
         "Fr",           "Ud",           "Lb",          "Fr",           "Ud",           "Lb",           "Ap",
           "Lp",           "Lk",           "Mt",           "Brq",
           /* LINTED */
           "Bro",          "Brc",          "\%C",          "Es",
           "En",           "Dx"
         };          };
   
 const   char *const __mdoc_argnames[MDOC_ARG_MAX] = {  const   char *const __mdoc_argnames[MDOC_ARG_MAX] = {
Line 82  const char *const __mdoc_argnames[MDOC_ARG_MAX] = {   
Line 87  const char *const __mdoc_argnames[MDOC_ARG_MAX] = {   
         "ohang",                "inset",                "column",          "ohang",                "inset",                "column",
         "width",                "compact",              "std",          "width",                "compact",              "std",
         "filled",               "words",                "emphasis",          "filled",               "words",                "emphasis",
         "symbolic"          "symbolic",             "nested"
         };          };
   
 const   char * const *mdoc_macronames = __mdoc_macronames;  const   char * const *mdoc_macronames = __mdoc_macronames;
Line 129  mdoc_free(struct mdoc *mdoc)
Line 134  mdoc_free(struct mdoc *mdoc)
   
   
 struct mdoc *  struct mdoc *
 mdoc_alloc(void *data, const struct mdoc_cb *cb)  mdoc_alloc(void *data, int pflags, const struct mdoc_cb *cb)
 {  {
         struct mdoc     *p;          struct mdoc     *p;
   
Line 142  mdoc_alloc(void *data, const struct mdoc_cb *cb)
Line 147  mdoc_alloc(void *data, const struct mdoc_cb *cb)
         p->last = xcalloc(1, sizeof(struct mdoc_node));          p->last = xcalloc(1, sizeof(struct mdoc_node));
         p->last->type = MDOC_ROOT;          p->last->type = MDOC_ROOT;
         p->first = p->last;          p->first = p->last;
           p->pflags = pflags;
         p->next = MDOC_NEXT_CHILD;          p->next = MDOC_NEXT_CHILD;
         p->htab = mdoc_tokhash_alloc();          p->htab = mdoc_tokhash_alloc();
   
Line 254  mdoc_macro(struct mdoc *m, int tok, 
Line 259  mdoc_macro(struct mdoc *m, int tok, 
                                 "disallowed in prologue"));                                  "disallowed in prologue"));
   
         if (1 != pp && ! (MDOC_CALLABLE & mdoc_macros[tok].flags))          if (1 != pp && ! (MDOC_CALLABLE & mdoc_macros[tok].flags))
                 return(mdoc_perr(m, ln, pp, "not callable"));                  return(mdoc_perr(m, ln, pp, "%s not callable",
                                           mdoc_macronames[tok]));
   
         return((*mdoc_macros[tok].fp)(m, tok, ln, pp, pos, buf));          return((*mdoc_macros[tok].fp)(m, tok, ln, pp, pos, buf));
 }  }
Line 494  parsetext(struct mdoc *mdoc, int line, char *buf)
Line 500  parsetext(struct mdoc *mdoc, int line, char *buf)
 }  }
   
   
   static int
   macrowarn(struct mdoc *m, int ln, const char *buf)
   {
           if ( ! (MDOC_IGN_MACRO & m->pflags))
                   return(mdoc_perr(m, ln, 1, "unknown macro: %s%s",
                                   buf, strlen(buf) > 3 ? "..." : ""));
           return(mdoc_pwarn(m, ln, 1, WARN_SYNTAX,
                                   "unknown macro: %s%s",
                                   buf, strlen(buf) > 3 ? "..." : ""));
   }
   
   
   
 /*  /*
  * Parse a macro line, that is, a line beginning with the control   * Parse a macro line, that is, a line beginning with the control
  * character.   * character.
Line 504  parsemacro(struct mdoc *m, int ln, char *buf)
Line 523  parsemacro(struct mdoc *m, int ln, char *buf)
         int               i, c;          int               i, c;
         char              mac[5];          char              mac[5];
   
         /* Comments are quickly ignored. */          /* Comments and empties are quickly ignored. */
   
           if (0 == buf[1])
                   return(1);
   
           if (' ' == buf[1]) {
                   i = 2;
                   while (buf[i] && ' ' == buf[i])
                           i++;
                   if (0 == buf[i])
                           return(1);
                   return(mdoc_perr(m, ln, 1, "invalid syntax"));
           }
   
         if (buf[1] && '\\' == buf[1])          if (buf[1] && '\\' == buf[1])
                 if (buf[2] && '\"' == buf[2])                  if (buf[2] && '\"' == buf[2])
                         return(1);                          return(1);
Line 515  parsemacro(struct mdoc *m, int ln, char *buf)
Line 546  parsemacro(struct mdoc *m, int ln, char *buf)
         for (i = 1; i < 5; i++) {          for (i = 1; i < 5; i++) {
                 if (0 == (mac[i - 1] = buf[i]))                  if (0 == (mac[i - 1] = buf[i]))
                         break;                          break;
                 else if (isspace((unsigned char)buf[i]))                  else if (' ' == buf[i])
                         break;                          break;
         }          }
   
         mac[i - 1] = 0;          mac[i - 1] = 0;
   
         if (i == 5 || i <= 2) {          if (i == 5 || i <= 2) {
                 (void)mdoc_perr(m, ln, 1, "unknown macro: %s%s",                  if ( ! macrowarn(m, ln, mac))
                                 mac, i == 5 ? "..." : "");                          goto err;
                 goto err;                  return(1);
         }          }
   
         if (MDOC_MAX == (c = mdoc_tokhash_find(m->htab, mac))) {          if (MDOC_MAX == (c = mdoc_tokhash_find(m->htab, mac))) {
                 (void)mdoc_perr(m, ln, 1, "unknown macro: %s", mac);                  if ( ! macrowarn(m, ln, mac))
                 goto err;                          goto err;
                   return(1);
         }          }
   
         /* The macro is sane.  Jump to the next word. */          /* The macro is sane.  Jump to the next word. */
   
         while (buf[i] && isspace((unsigned char)buf[i]))          while (buf[i] && ' ' == buf[i])
                 i++;                  i++;
   
         /* Begin recursive parse sequence. */          /* Begin recursive parse sequence. */

Legend:
Removed from v.1.53  
changed lines
  Added in v.1.66

CVSweb