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

Diff for /mandoc/roff.c between version 1.21 and 1.26

version 1.21, 2008/11/30 18:50:44 version 1.26, 2008/12/01 09:25:18
Line 105  struct rofftree {
Line 105  struct rofftree {
 static  int               roff_Dd(ROFFCALL_ARGS);  static  int               roff_Dd(ROFFCALL_ARGS);
 static  int               roff_Dt(ROFFCALL_ARGS);  static  int               roff_Dt(ROFFCALL_ARGS);
 static  int               roff_Os(ROFFCALL_ARGS);  static  int               roff_Os(ROFFCALL_ARGS);
   #ifdef notyet
   static  int               roff_Ns(ROFFCALL_ARGS);
   #endif
   
 static  int               roff_layout(ROFFCALL_ARGS);  static  int               roff_layout(ROFFCALL_ARGS);
 static  int               roff_text(ROFFCALL_ARGS);  static  int               roff_text(ROFFCALL_ARGS);
 static  int               roff_comment(ROFFCALL_ARGS);  static  int               roff_comment(ROFFCALL_ARGS);
 static  int               roff_close(ROFFCALL_ARGS);  static  int               roff_close(ROFFCALL_ARGS);
 static  int               roff_special(ROFFCALL_ARGS);  
   
 static  struct roffnode  *roffnode_new(int, struct rofftree *);  static  struct roffnode  *roffnode_new(int, struct rofftree *);
 static  void              roffnode_free(struct rofftree *);  static  void              roffnode_free(struct rofftree *);
Line 235  static const struct rofftok tokens[ROFF_MAX] = {
Line 237  static const struct rofftok tokens[ROFF_MAX] = {
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Bq */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Bq */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Bsx */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Bsx */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Bx */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Bx */
         {roff_special, NULL, NULL, NULL, 0, ROFF_SPECIAL, 0 },  /* Db */          {        NULL, NULL, NULL, NULL, 0, ROFF_SPECIAL, 0 },  /* Db */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Dc */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Dc */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Do */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Do */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Dq */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Dq */
Line 246  static const struct rofftok tokens[ROFF_MAX] = {
Line 248  static const struct rofftok tokens[ROFF_MAX] = {
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Fx */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Fx */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ms */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ms */
         {   NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* No */          {   NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* No */
         {   NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ns */          {        NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ns */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Nx */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Nx */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ox */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ox */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Pc */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Pc */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Pf */          {        NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Pf */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_LAYOUT, ROFF_PARSED | ROFF_CALLABLE }, /* Po */          {   roff_text, NULL, NULL, NULL, 0, ROFF_LAYOUT, ROFF_PARSED | ROFF_CALLABLE }, /* Po */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Pq */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Pq */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Qc */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Qc */
Line 262  static const struct rofftok tokens[ROFF_MAX] = {
Line 264  static const struct rofftok tokens[ROFF_MAX] = {
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sc */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sc */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* So */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* So */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sq */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sq */
         {roff_special, NULL, NULL, NULL, 0, ROFF_SPECIAL, 0 }, /* Sm */          {        NULL, NULL, NULL, NULL, 0, ROFF_SPECIAL, 0 }, /* Sm */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sx */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sx */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sy */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sy */
         {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Tn */          {   roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Tn */
Line 307  const char *const toknamesp[ROFF_MAX] = {   
Line 309  const char *const toknamesp[ROFF_MAX] = {   
         "Ic",           "In",           "Li",           "Nd",          "Ic",           "In",           "Li",           "Nd",
         "Nm",           "Op",           "Ot",           "Pa",          "Nm",           "Op",           "Ot",           "Pa",
         "Rv",           "St",           "Va",           "Vt",          "Rv",           "St",           "Va",           "Vt",
           /* LINTED */
         "Xr",           "\%A",          "\%B",          "\%D",          "Xr",           "\%A",          "\%B",          "\%D",
           /* LINTED */
         "\%I",          "\%J",          "\%N",          "\%O",          "\%I",          "\%J",          "\%N",          "\%O",
           /* LINTED */
         "\%P",          "\%R",          "\%T",          "\%V",          "\%P",          "\%R",          "\%T",          "\%V",
         "Ac",           "Ao",           "Aq",           "At",          "Ac",           "Ao",           "Aq",           "At",
         "Bc",           "Bf",           "Bo",           "Bq",          "Bc",           "Bf",           "Bo",           "Bq",
Line 491  roffargs(const struct rofftree *tree, 
Line 496  roffargs(const struct rofftree *tree, 
 }  }
   
   
 /* XXX */  
 static int  static int
 roffscan(int tok, const int *tokv)  roffscan(int tok, const int *tokv)
 {  {
Line 515  roffparse(struct rofftree *tree, char *buf)
Line 519  roffparse(struct rofftree *tree, char *buf)
         char             *argv[ROFF_MAXARG];          char             *argv[ROFF_MAXARG];
         char            **argvp;          char            **argvp;
   
           if (0 != *buf && 0 != *(buf + 1) && 0 != *(buf + 2))
                   if (0 == strncmp(buf, ".\\\"", 3))
                           return(1);
   
         if (ROFF_MAX == (tok = rofffindtok(buf + 1))) {          if (ROFF_MAX == (tok = rofffindtok(buf + 1))) {
                 roff_err(tree, buf + 1, "bogus line macro");                  roff_err(tree, buf + 1, "bogus line macro");
                 return(0);                  return(0);
Line 522  roffparse(struct rofftree *tree, char *buf)
Line 530  roffparse(struct rofftree *tree, char *buf)
                 roff_err(tree, buf + 1, "unsupported macro `%s'",                  roff_err(tree, buf + 1, "unsupported macro `%s'",
                                 toknames[tok]);                                  toknames[tok]);
                 return(0);                  return(0);
         } else if (ROFF_COMMENT == tokens[tok].type)          }
                 return(1);  
           assert(ROFF___ != tok);
         if ( ! roffargs(tree, tok, buf, argv))          if ( ! roffargs(tree, tok, buf, argv))
                 return(0);                  return(0);
   
Line 671  static int
Line 679  static int
 rofffindtok(const char *buf)  rofffindtok(const char *buf)
 {  {
         char             token[4];          char             token[4];
         size_t           i;          int              i;
   
         for (i = 0; *buf && ! isspace(*buf) && i < 3; i++, buf++)          for (i = 0; *buf && ! isspace(*buf) && i < 3; i++, buf++)
                 token[i] = *buf;                  token[i] = *buf;
Line 991  roff_layout(ROFFCALL_ARGS) 
Line 999  roff_layout(ROFFCALL_ARGS) 
   
         i = 0;          i = 0;
         while (*argv) {          while (*argv) {
                 if (ROFF_MAX != (c = rofffindcallable(*argv))) {                  if (ROFF_MAX == (c = rofffindcallable(*argv))) {
                         if (NULL == tokens[c].cb) {                          assert(tree->arg);
                                 roff_err(tree, *argv, "unsupported "                          if ( ! (*tree->cb.roffdata)
                                                 "macro `%s'",                                          (tree->arg, i, *argv++))
                                                 toknames[c]);  
                                 return(0);                                  return(0);
                         }                          i = 1;
                         if ( ! (*tokens[c].cb)(c, tree, argv, ROFF_ENTER))                          continue;
                                 return(0);  
                         break;  
                 }                  }
   
                 assert(tree->arg);                  if (NULL == tokens[c].cb) {
                 if ( ! (*tree->cb.roffdata)(tree->arg, i, *argv++))                          roff_err(tree, *argv, "unsupported macro `%s'",
                                           toknames[c]);
                         return(0);                          return(0);
                 i = 1;                  }
   
                   if ( ! (*tokens[c].cb)(c, tree, argv, ROFF_ENTER))
                           return(0);
   
                   break;
         }          }
   
         /*          /*
Line 1015  roff_layout(ROFFCALL_ARGS) 
Line 1026  roff_layout(ROFFCALL_ARGS) 
          * the end of line.           * the end of line.
          */           */
   
         if (ROFF_PARSED & tokens[tok].flags && *argv) {          if ( ! (ROFF_PARSED & tokens[tok].flags && *argv))
                 i = 0;                  return((*tree->cb.roffout)(tree->arg, tok));
                 while (argv[i])  
                         i++;  
   
                 assert(i > 0);          i = 0;
                 if ( ! roffispunct(argv[--i]))          while (argv[i])
                         return(1);                  i++;
   
                 while (i >= 0 && roffispunct(argv[i]))          assert(i > 0);
                         i--;          if ( ! roffispunct(argv[--i]))
                   return((*tree->cb.roffout)(tree->arg, tok));
   
                 assert(0 != i);          while (i >= 0 && roffispunct(argv[i]))
                 i++;                  i--;
   
                 while (argv[i])          assert(0 != i);
                         if ( ! (*tree->cb.roffdata)(tree->arg, 0, argv[i++]))          i++;
                                 return(0);  
         }  
   
           /* LINTED */
           while (argv[i])
                   if ( ! (*tree->cb.roffdata)(tree->arg, 0, argv[i++]))
                           return(0);
   
         return((*tree->cb.roffout)(tree->arg, tok));          return((*tree->cb.roffout)(tree->arg, tok));
 }  }
   
Line 1100  roff_text(ROFFCALL_ARGS) 
Line 1113  roff_text(ROFFCALL_ARGS) 
                                 i = 1;                                  i = 1;
                         }                          }
   
                         if ( ! (*tree->cb.roffdata)(tree->arg, i, *argv++))                          if ( ! (*tree->cb.roffdata)
                                           (tree->arg, i, *argv++))
                                 return(0);                                  return(0);
   
                         i = 1;                          i = 1;
Line 1133  roff_text(ROFFCALL_ARGS) 
Line 1147  roff_text(ROFFCALL_ARGS) 
          * the end of line.           * the end of line.
          */           */
   
         if (first && *argv) {          if ( ! (first && *argv))
                 i = 0;                  return(1);
                 while (argv[i])  
                         i++;  
   
                 assert(i > 0);          i = 0;
                 if ( ! roffispunct(argv[--i]))          while (argv[i])
                         return(1);                  i++;
   
                 while (i >= 0 && roffispunct(argv[i]))          assert(i > 0);
                         i--;          if ( ! roffispunct(argv[--i]))
                   return(1);
   
                 assert(0 != i);          while (i >= 0 && roffispunct(argv[i]))
                 i++;                  i--;
   
                 while (argv[i])          assert(0 != i);
                         if ( ! (*tree->cb.roffdata)(tree->arg, 0, argv[i++]))          i++;
                                 return(0);  
         }  
   
           /* LINTED */
           while (argv[i])
                   if ( ! (*tree->cb.roffdata)(tree->arg, 0, argv[i++]))
                           return(0);
   
         return(1);          return(1);
 }  }
   
Line 1175  roff_close(ROFFCALL_ARGS)
Line 1191  roff_close(ROFFCALL_ARGS)
 }  }
   
   
   #if notyet
 /* ARGSUSED */  /* ARGSUSED */
 static int  static int
 roff_special(ROFFCALL_ARGS)  roff_Ns(ROFFCALL_ARGS)
 {  {
           int              c;
   
         return((*tree->cb.roffspecial)(tree->arg, tok));          argv++;
   
           if (ROFF_MAX != (c = rofffindcallable(*argv))) {
                   if (NULL == tokens[c].cb) {
                           roff_err(tree, *argv, "unsupported macro `%s'",
                                           toknames[c]);
                           return(0);
                   }
                   if ( ! (*tree->cb.roffspecial)(tree->arg, tok))
                           return(0);
                   if ( ! (*tokens[c].cb)(c, tree, argv, ROFF_ENTER))
                           return(0);
   
                   return(1);
           } else if ( ! (*tree->cb.roffdata)(tree->arg, 0, *argv++))
                   return(0);
   
           while (*argv) {
                   if (ROFF_MAX == (c = rofffindcallable(*argv))) {
                           assert(tree->arg);
                           if ( ! (*tree->cb.roffdata)
                                           (tree->arg, 1, *argv++))
                                   return(0);
                           continue;
                   }
                   if (NULL == tokens[c].cb) {
                           roff_err(tree, *argv, "unsupported macro `%s'",
                                           toknames[c]);
                           return(0);
                   }
                   if ( ! (*tokens[c].cb)(c, tree, argv, ROFF_ENTER))
                           return(0);
   
                   break;
           }
   
           return(1);
 }  }
   #endif
   
   
 static void  static void

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.26

CVSweb