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

Diff for /mandoc/mdoc.c between version 1.1 and 1.7

version 1.1, 2008/12/15 01:54:58 version 1.7, 2008/12/28 23:07:04
Line 26 
Line 26 
   
 #include "private.h"  #include "private.h"
   
 extern  int     macro_text(struct mdoc *, int, int, int *, char *);  
 extern  int     macro_scoped_implicit(struct mdoc *,  
                         int, int, int *, char *);  
   
 const   char *const __mdoc_macronames[MDOC_MAX] = {  const   char *const __mdoc_macronames[MDOC_MAX] = {
         "\\\"",         "Dd",           "Dt",           "Os",          "\\\"",         "Dd",           "Dt",           "Os",
         "Sh",           "Ss",           "Pp",           "D1",          "Sh",           "Ss",           "Pp",           "D1",
Line 88  const char *const __mdoc_argnames[MDOC_ARG_MAX] = {   
Line 84  const char *const __mdoc_argnames[MDOC_ARG_MAX] = {   
   
 const   struct mdoc_macro __mdoc_macros[MDOC_MAX] = {  const   struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { NULL, 0 }, /* \" */          { NULL, 0 }, /* \" */
         { NULL, 0 }, /* Dd */          { macro_prologue_ddate, 0 }, /* Dd */
         { NULL, 0 }, /* Dt */          { macro_prologue_dtitle, 0 }, /* Dt */
         { NULL, 0 }, /* Os */          { macro_prologue_os, 0 }, /* Os */
         { macro_scoped_implicit, 0 }, /* Sh */          { macro_scoped_implicit, 0 }, /* Sh */
         { macro_scoped_implicit, 0 }, /* Ss */          { macro_scoped_implicit, 0 }, /* Ss */
         { NULL, 0 }, /* Pp */          { macro_text, 0 }, /* Pp */
         { NULL, 0 }, /* D1 */          { macro_scoped_line, 0 }, /* D1 */
         { NULL, 0 }, /* Dl */          { macro_scoped_line, 0 }, /* Dl */
         { NULL, 0 }, /* Bd */          { macro_scoped_explicit, MDOC_EXPLICIT }, /* Bd */
         { NULL, 0 }, /* Ed */          { macro_scoped_explicit, 0 }, /* Ed */
         { NULL, 0 }, /* Bl */          { macro_scoped_explicit, MDOC_EXPLICIT }, /* Bl */
         { NULL, 0 }, /* El */          { macro_scoped_explicit, 0 }, /* El */
         { NULL, 0 }, /* It */          { NULL, 0 }, /* It */
         { macro_text, MDOC_CALLABLE }, /* Ad */          { macro_text, MDOC_CALLABLE }, /* Ad */
         { NULL, 0 }, /* An */          { NULL, 0 }, /* An */
Line 141  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 137  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { NULL, 0 }, /* %V */          { NULL, 0 }, /* %V */
         { NULL, 0 }, /* Ac */          { NULL, 0 }, /* Ac */
         { NULL, 0 }, /* Ao */          { NULL, 0 }, /* Ao */
         { NULL, 0 }, /* Aq */          { macro_scoped_pline, MDOC_CALLABLE }, /* Aq */
         { NULL, 0 }, /* At */          { NULL, 0 }, /* At */
         { NULL, 0 }, /* Bc */          { NULL, 0 }, /* Bc */
         { NULL, 0 }, /* Bf */          { NULL, 0 }, /* Bf */
         { NULL, 0 }, /* Bo */          { NULL, 0 }, /* Bo */
         { NULL, 0 }, /* Bq */          { macro_scoped_pline, MDOC_CALLABLE }, /* Bq */
         { NULL, 0 }, /* Bsx */          { NULL, 0 }, /* Bsx */
         { NULL, 0 }, /* Bx */          { NULL, 0 }, /* Bx */
         { NULL, 0 }, /* Db */          { NULL, 0 }, /* Db */
         { NULL, 0 }, /* Dc */          { NULL, 0 }, /* Dc */
         { NULL, 0 }, /* Do */          { NULL, 0 }, /* Do */
         { NULL, 0 }, /* Dq */          { macro_scoped_pline, MDOC_CALLABLE }, /* Dq */
         { NULL, 0 }, /* Ec */          { NULL, 0 }, /* Ec */
         { NULL, 0 }, /* Ef */          { NULL, 0 }, /* Ef */
         { macro_text, MDOC_CALLABLE }, /* Em */          { macro_text, MDOC_CALLABLE }, /* Em */
Line 166  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 162  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { NULL, 0 }, /* Pc */          { NULL, 0 }, /* Pc */
         { NULL, 0 }, /* Pf */          { NULL, 0 }, /* Pf */
         { NULL, 0 }, /* Po */          { NULL, 0 }, /* Po */
         { NULL, 0 }, /* Pq */          { macro_scoped_pline, MDOC_CALLABLE }, /* Pq */
         { NULL, 0 }, /* Qc */          { NULL, 0 }, /* Qc */
         { NULL, 0 }, /* Ql */          { macro_scoped_pline, MDOC_CALLABLE }, /* Ql */
         { NULL, 0 }, /* Qo */          { NULL, 0 }, /* Qo */
         { NULL, 0 }, /* Qq */          { macro_scoped_pline, MDOC_CALLABLE }, /* Qq */
         { NULL, 0 }, /* Re */          { NULL, 0 }, /* Re */
         { NULL, 0 }, /* Rs */          { NULL, 0 }, /* Rs */
         { NULL, 0 }, /* Sc */          { NULL, 0 }, /* Sc */
         { NULL, 0 }, /* So */          { NULL, 0 }, /* So */
         { NULL, 0 }, /* Sq */          { macro_scoped_pline, MDOC_CALLABLE }, /* Sq */
         { NULL, 0 }, /* Sm */          { NULL, 0 }, /* Sm */
         { NULL, 0 }, /* Sx */          { NULL, 0 }, /* Sx */
         { NULL, 0 }, /* Sy */          { NULL, 0 }, /* Sy */
Line 200  const char * const *mdoc_argnames = __mdoc_argnames;
Line 196  const char * const *mdoc_argnames = __mdoc_argnames;
 const   struct mdoc_macro * const mdoc_macros = __mdoc_macros;  const   struct mdoc_macro * const mdoc_macros = __mdoc_macros;
   
   
 static  void             *xcalloc(size_t, size_t);  
 static  char             *xstrdup(const char *);  
   
 static  struct mdoc_arg  *argdup(size_t, const struct mdoc_arg *);  static  struct mdoc_arg  *argdup(size_t, const struct mdoc_arg *);
 static  void              argfree(size_t, struct mdoc_arg *);  static  void              argfree(size_t, struct mdoc_arg *);
 static  void              argcpy(struct mdoc_arg *,  static  void              argcpy(struct mdoc_arg *,
Line 232  mdoc_free(struct mdoc *mdoc)
Line 225  mdoc_free(struct mdoc *mdoc)
         if (mdoc->first)          if (mdoc->first)
                 mdoc_node_freelist(mdoc->first);                  mdoc_node_freelist(mdoc->first);
         if (mdoc->htab)          if (mdoc->htab)
                 mdoc_hash_free(mdoc->htab);                  mdoc_tokhash_free(mdoc->htab);
   
         free(mdoc);          free(mdoc);
 }  }
Line 248  mdoc_alloc(void *data, const struct mdoc_cb *cb)
Line 241  mdoc_alloc(void *data, const struct mdoc_cb *cb)
         p->data = data;          p->data = data;
         (void)memcpy(&p->cb, cb, sizeof(struct mdoc_cb));          (void)memcpy(&p->cb, cb, sizeof(struct mdoc_cb));
   
         p->htab = mdoc_hash_alloc();          p->htab = mdoc_tokhash_alloc();
         return(p);          return(p);
 }  }
   
   
 static void *  
 xcalloc(size_t num, size_t sz)  
 {  
         void            *p;  
   
         if (NULL == (p = calloc(num, sz)))  
                 err(EXIT_FAILURE, "calloc");  
         return(p);  
 }  
   
   
 static char *  
 xstrdup(const char *p)  
 {  
         char            *pp;  
   
         if (NULL == (pp = strdup(p)))  
                 err(EXIT_FAILURE, "strdup");  
         return(pp);  
 }  
   
   
 int  int
 mdoc_parseln(struct mdoc *mdoc, char *buf)  mdoc_parseln(struct mdoc *mdoc, char *buf)
 {  {
         int               c, i;          int               c, i;
         char              tmp[5];          char              tmp[5];
   
         if ('.' != *buf)  {          if ('.' != *buf) {
                 /* TODO. */                  mdoc_word_alloc(mdoc, 0, buf);
                 return(1);                  return(1);
         }          }
   
         if (buf[1] && '\\' == buf[1])          if (buf[1] && '\\' == buf[1])
Line 301  mdoc_parseln(struct mdoc *mdoc, char *buf)
Line 272  mdoc_parseln(struct mdoc *mdoc, char *buf)
   
         i--;          i--;
   
         (void)memcpy(tmp, buf + 1, i);          (void)memcpy(tmp, buf + 1, (size_t)i);
         tmp[i++] = 0;          tmp[i++] = 0;
   
         if (MDOC_MAX == (c = mdoc_find(mdoc, tmp)))          if (MDOC_MAX == (c = mdoc_find(mdoc, tmp)))
Line 310  mdoc_parseln(struct mdoc *mdoc, char *buf)
Line 281  mdoc_parseln(struct mdoc *mdoc, char *buf)
         while (buf[i] && isspace(buf[i]))          while (buf[i] && isspace(buf[i]))
                 i++;                  i++;
   
         if (NULL == (mdoc_macros[c].fp)) {          return(mdoc_macro(mdoc, c, 1, &i, buf));
                 (void)mdoc_err(mdoc, c, 1, ERR_MACRO_NOTSUP);  
                 return(0);  
         }  
   
         return((*mdoc_macros[c].fp)(mdoc, c, 1, &i, buf));  
 }  }
   
   
Line 363  mdoc_macro(struct mdoc *mdoc, int tok, int ppos, int *
Line 329  mdoc_macro(struct mdoc *mdoc, int tok, int ppos, int *
         if (NULL == (mdoc_macros[tok].fp)) {          if (NULL == (mdoc_macros[tok].fp)) {
                 (void)mdoc_err(mdoc, tok, ppos, ERR_MACRO_NOTSUP);                  (void)mdoc_err(mdoc, tok, ppos, ERR_MACRO_NOTSUP);
                 return(0);                  return(0);
         } else if ( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) {          }
   
           if (1 != ppos && ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) {
                 (void)mdoc_err(mdoc, tok, ppos, ERR_MACRO_NOTCALL);                  (void)mdoc_err(mdoc, tok, ppos, ERR_MACRO_NOTCALL);
                 return(0);                  return(0);
         }          }
   
           /*mdoc_msg(mdoc, ppos, "calling `%s'", mdoc_macronames[tok]);*/
   
         return((*mdoc_macros[tok].fp)(mdoc, tok, ppos, pos, buf));          return((*mdoc_macros[tok].fp)(mdoc, tok, ppos, pos, buf));
 }  }
   
Line 379  mdoc_node_append(struct mdoc *mdoc, int pos, struct md
Line 349  mdoc_node_append(struct mdoc *mdoc, int pos, struct md
   
         switch (p->type) {          switch (p->type) {
         case (MDOC_TEXT):          case (MDOC_TEXT):
                 nn = "<text>";                  nn = p->data.text.string;
                 nt = "text";                  nt = "text";
                 break;                  break;
         case (MDOC_BODY):          case (MDOC_BODY):
Line 398  mdoc_node_append(struct mdoc *mdoc, int pos, struct md
Line 368  mdoc_node_append(struct mdoc *mdoc, int pos, struct md
                 nn = mdoc_macronames[p->data.block.tok];                  nn = mdoc_macronames[p->data.block.tok];
                 nt = "block";                  nt = "block";
                 break;                  break;
           default:
                   abort();
                   /* NOTREACHED */
         }          }
   
         if (NULL == mdoc->first) {          if (NULL == mdoc->first) {
Line 429  mdoc_node_append(struct mdoc *mdoc, int pos, struct md
Line 402  mdoc_node_append(struct mdoc *mdoc, int pos, struct md
                 on = mdoc_macronames[mdoc->last->data.block.tok];                  on = mdoc_macronames[mdoc->last->data.block.tok];
                 ot = "block";                  ot = "block";
                 break;                  break;
           default:
                   abort();
                   /* NOTREACHED */
         }          }
   
         switch (p->type) {          switch (p->type) {
         case (MDOC_BODY):          case (MDOC_BODY):
                 switch (mdoc->last->type) {                  p->parent = mdoc->last->parent;
                 case (MDOC_BLOCK):                  mdoc->last->next = p;
                         p->parent = mdoc->last;                  p->prev = mdoc->last;
                         mdoc->last->child = p;                  act = "sibling";
                         act = "child";  
                         break;  
                 case (MDOC_HEAD):  
                         p->parent = mdoc->last->parent;  
                         mdoc->last->next = p;  
                         act = "sibling";  
                         break;  
                 default:  
                         abort();  
                         /* NOTREACHED */  
                 }  
                 break;                  break;
   
         case (MDOC_HEAD):          case (MDOC_HEAD):
                 assert(mdoc->last->type == MDOC_BLOCK);                  assert(mdoc->last->type == MDOC_BLOCK);
                 p->parent = mdoc->last;                  p->parent = mdoc->last;
                 mdoc->last->child = p;                  mdoc->last->child = p;
                 act = "child";                  act = "child";
                 break;                  break;
   
         default:          default:
                 switch (mdoc->last->type) {                  switch (mdoc->last->type) {
                 case (MDOC_BODY):                  case (MDOC_BODY):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (MDOC_HEAD):                  case (MDOC_HEAD):
                         p->parent = mdoc->last->parent;                          p->parent = mdoc->last;
                         mdoc->last->child = p;                          mdoc->last->child = p;
                         act = "child";                          act = "child";
                         break;                          break;
                 default:                  default:
                         p->parent = mdoc->last->parent;                          p->parent = mdoc->last->parent;
                           p->prev = mdoc->last;
                         mdoc->last->next = p;                          mdoc->last->next = p;
                         act = "sibling";                          act = "sibling";
                         break;                          break;
Line 479  mdoc_node_append(struct mdoc *mdoc, int pos, struct md
Line 447  mdoc_node_append(struct mdoc *mdoc, int pos, struct md
 }  }
   
   
   /* FIXME: deprecate paramsz, params. */
 void  void
 mdoc_head_alloc(struct mdoc *mdoc, int pos, int tok,  mdoc_head_alloc(struct mdoc *mdoc, int pos, int tok,
                 size_t paramsz, const char **params)                  size_t paramsz, const char **params)
Line 575  mdoc_word_alloc(struct mdoc *mdoc, int pos, const char
Line 544  mdoc_word_alloc(struct mdoc *mdoc, int pos, const char
 static void  static void
 argfree(size_t sz, struct mdoc_arg *p)  argfree(size_t sz, struct mdoc_arg *p)
 {  {
         size_t           i, j;          int              i, j;
   
         if (0 == sz)          if (0 == sz)
                 return;                  return;
   
         assert(p);          assert(p);
         for (i = 0; i < sz; i++)          /* LINTED */
           for (i = 0; i < (int)sz; i++)
                 if (p[i].sz > 0) {                  if (p[i].sz > 0) {
                         assert(p[i].value);                          assert(p[i].value);
                         for (j = 0; j < p[i].sz; j++)                          /* LINTED */
                           for (j = 0; j < (int)p[i].sz; j++)
                                 free(p[i].value[j]);                                  free(p[i].value[j]);
                 }                  }
         free(p);          free(p);
Line 667  int
Line 638  int
 mdoc_find(const struct mdoc *mdoc, const char *key)  mdoc_find(const struct mdoc *mdoc, const char *key)
 {  {
   
         return(mdoc_hash_find(mdoc->htab, key));          return(mdoc_tokhash_find(mdoc->htab, key));
 }  }
   
   
 static void  static void
 argcpy(struct mdoc_arg *dst, const struct mdoc_arg *src)  argcpy(struct mdoc_arg *dst, const struct mdoc_arg *src)
 {  {
         size_t           i;          int              i;
   
         dst->arg = src->arg;          dst->arg = src->arg;
         if (0 == (dst->sz = src->sz))          if (0 == (dst->sz = src->sz))
                 return;                  return;
         dst->value = xcalloc(dst->sz, sizeof(char *));          dst->value = xcalloc(dst->sz, sizeof(char *));
         for (i = 0; i < dst->sz; i++)          for (i = 0; i < (int)dst->sz; i++)
                 dst->value[i] = xstrdup(src->value[i]);                  dst->value[i] = xstrdup(src->value[i]);
 }  }
   
Line 689  static struct mdoc_arg *
Line 660  static struct mdoc_arg *
 argdup(size_t argsz, const struct mdoc_arg *args)  argdup(size_t argsz, const struct mdoc_arg *args)
 {  {
         struct mdoc_arg *pp;          struct mdoc_arg *pp;
         size_t           i;          int              i;
   
         if (0 == argsz)          if (0 == argsz)
                 return(NULL);                  return(NULL);
   
         pp = xcalloc((size_t)argsz, sizeof(struct mdoc_arg));          pp = xcalloc((size_t)argsz, sizeof(struct mdoc_arg));
         for (i = 0; i < argsz; i++)          for (i = 0; i < (int)argsz; i++)
                 argcpy(&pp[i], &args[i]);                  argcpy(&pp[i], &args[i]);
   
         return(pp);          return(pp);
Line 705  argdup(size_t argsz, const struct mdoc_arg *args)
Line 676  argdup(size_t argsz, const struct mdoc_arg *args)
 static void  static void
 paramfree(size_t sz, char **p)  paramfree(size_t sz, char **p)
 {  {
         size_t           i;          int              i;
   
         if (0 == sz)          if (0 == sz)
                 return;                  return;
   
         assert(p);          assert(p);
         for (i = 0; i < sz; i++)          /* LINTED */
           for (i = 0; i < (int)sz; i++)
                 free(p[i]);                  free(p[i]);
         free(p);          free(p);
 }  }
Line 721  static char **
Line 693  static char **
 paramdup(size_t sz, const char **p)  paramdup(size_t sz, const char **p)
 {  {
         char            **pp;          char            **pp;
         size_t            i;          int               i;
   
         if (0 == sz)          if (0 == sz)
                 return(NULL);                  return(NULL);
   
         pp = xcalloc(sz, sizeof(char *));          pp = xcalloc(sz, sizeof(char *));
         for (i = 0; i < sz; i++)          for (i = 0; i < (int)sz; i++)
                 pp[i] = xstrdup(p[i]);                  pp[i] = xstrdup(p[i]);
   
         return(pp);          return(pp);

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.7

CVSweb