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

Diff for /docbook2mdoc/macro.c between version 1.10 and 1.18

version 1.10, 2019/04/12 08:48:16 version 1.18, 2019/05/01 17:20:47
Line 28 
Line 28 
  */   */
   
 void  void
   para_check(struct format *f)
   {
           if (f->parastate != PARA_WANT)
                   return;
           if (f->linestate != LINE_NEW) {
                   putchar('\n');
                   f->linestate = LINE_NEW;
           }
           puts(".Pp");
           f->parastate = PARA_HAVE;
   }
   
   void
 macro_open(struct format *f, const char *name)  macro_open(struct format *f, const char *name)
 {  {
           para_check(f);
         switch (f->linestate) {          switch (f->linestate) {
         case LINE_MACRO:          case LINE_MACRO:
                 if (f->flags & FMT_NOSPC) {                  if (f->flags & FMT_NOSPC) {
Line 42  macro_open(struct format *f, const char *name)
Line 56  macro_open(struct format *f, const char *name)
                 }                  }
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case LINE_TEXT:          case LINE_TEXT:
                   if (f->nofill && f->linestate == LINE_TEXT)
                           fputs(" \\c", stdout);
                 putchar('\n');                  putchar('\n');
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case LINE_NEW:          case LINE_NEW:
Line 53  macro_open(struct format *f, const char *name)
Line 69  macro_open(struct format *f, const char *name)
         fputs(name, stdout);          fputs(name, stdout);
         f->flags &= FMT_IMPL;          f->flags &= FMT_IMPL;
         f->flags |= FMT_ARG;          f->flags |= FMT_ARG;
           f->parastate = PARA_MID;
 }  }
   
 void  void
Line 79  void
Line 96  void
 macro_addarg(struct format *f, const char *arg, int flags)  macro_addarg(struct format *f, const char *arg, int flags)
 {  {
         const char      *cp;          const char      *cp;
           int              quote_now;
   
         assert(f->linestate == LINE_MACRO);          assert(f->linestate == LINE_MACRO);
   
         /* Quote if requested and necessary. */          /* Quote if requested and necessary. */
   
           quote_now = 0;
         if ((flags & (ARG_SINGLE | ARG_QUOTED)) == ARG_SINGLE) {          if ((flags & (ARG_SINGLE | ARG_QUOTED)) == ARG_SINGLE) {
                 for (cp = arg; *cp != '\0'; cp++)                  for (cp = arg; *cp != '\0'; cp++)
                         if (isspace((unsigned char)*cp))                          if (isspace((unsigned char)*cp))
Line 95  macro_addarg(struct format *f, const char *arg, int fl
Line 114  macro_addarg(struct format *f, const char *arg, int fl
                         }                          }
                         putchar('"');                          putchar('"');
                         flags = ARG_QUOTED;                          flags = ARG_QUOTED;
                           quote_now = 1;
                 }                  }
         }          }
   
Line 112  macro_addarg(struct format *f, const char *arg, int fl
Line 132  macro_addarg(struct format *f, const char *arg, int fl
   
                 /* Escape us if we look like a macro. */                  /* Escape us if we look like a macro. */
   
                 if ((flags & ARG_QUOTED) == 0 &&                  if ((flags & (ARG_QUOTED | ARG_UPPER)) == 0 &&
                     (cp == arg || isspace((unsigned char)cp[-1])) &&                      (cp == arg || isspace((unsigned char)cp[-1])) &&
                     isupper((unsigned char)cp[0]) &&                      isupper((unsigned char)cp[0]) &&
                     islower((unsigned char)cp[1]) &&                      islower((unsigned char)cp[1]) &&
                     (cp[2] == '\0' || cp[2] == ' ' ||                      (cp[2] == '\0' || cp[2] == ' ' ||
                      (islower((unsigned char)cp[2]) &&                       ((cp[3] == '\0' || cp[3] == ' ') &&
                       (cp[3] == '\0' || cp[3] == ' '))))                        (strncmp(cp, "Brq", 3) == 0 ||
                          strncmp(cp, "Bro", 3) == 0 ||
                          strncmp(cp, "Brc", 3) == 0 ||
                          strncmp(cp, "Bsx", 3) == 0))))
                         fputs("\\&", stdout);                          fputs("\\&", stdout);
   
                 if (*cp == '"')                  if (*cp == '"')
Line 130  macro_addarg(struct format *f, const char *arg, int fl
Line 153  macro_addarg(struct format *f, const char *arg, int fl
                 if (*cp == '\\')                  if (*cp == '\\')
                         putchar('e');                          putchar('e');
         }          }
           if (quote_now)
                   putchar('"');
           f->parastate = PARA_MID;
 }  }
   
 void  void
Line 147  void
Line 173  void
 macro_addnode(struct format *f, struct pnode *n, int flags)  macro_addnode(struct format *f, struct pnode *n, int flags)
 {  {
         struct pnode    *nc;          struct pnode    *nc;
         int              quote_now;          int              is_text, quote_now;
   
         assert(f->linestate == LINE_MACRO);          assert(f->linestate == LINE_MACRO);
   
Line 162  macro_addnode(struct format *f, struct pnode *n, int f
Line 188  macro_addnode(struct format *f, struct pnode *n, int f
   
         if (n->node == NODE_TEXT || n->node == NODE_ESCAPE) {          if (n->node == NODE_TEXT || n->node == NODE_ESCAPE) {
                 macro_addarg(f, n->b, flags);                  macro_addarg(f, n->b, flags);
                   f->parastate = PARA_MID;
                 return;                  return;
         }          }
   
Line 191  macro_addnode(struct format *f, struct pnode *n, int f
Line 218  macro_addnode(struct format *f, struct pnode *n, int f
   
         while (nc != NULL) {          while (nc != NULL) {
                 macro_addnode(f, nc, flags);                  macro_addnode(f, nc, flags);
                   is_text = pnode_class(nc->node) == CLASS_TEXT;
                 nc = TAILQ_NEXT(nc, child);                  nc = TAILQ_NEXT(nc, child);
                 flags |= ARG_SPACE;                  if (nc == NULL || pnode_class(nc->node) != CLASS_TEXT)
                           is_text = 0;
                   if (is_text && (nc->flags & NFLAG_SPC) == 0)
                           flags &= ~ARG_SPACE;
                   else
                           flags |= ARG_SPACE;
         }          }
         if (quote_now)          if (quote_now)
                 putchar('"');                  putchar('"');
           f->parastate = PARA_MID;
 }  }
   
 void  void
Line 214  macro_nodeline(struct format *f, const char *name, str
Line 248  macro_nodeline(struct format *f, const char *name, str
 void  void
 print_text(struct format *f, const char *word, int flags)  print_text(struct format *f, const char *word, int flags)
 {  {
           para_check(f);
         switch (f->linestate) {          switch (f->linestate) {
         case LINE_NEW:          case LINE_NEW:
                 if (*word == '.' || *word == '\'')  
                         fputs("\\&", stdout);  
                 break;                  break;
         case LINE_TEXT:          case LINE_TEXT:
                 if (flags & ARG_SPACE)                  if (flags & ARG_SPACE)
Line 227  print_text(struct format *f, const char *word, int fla
Line 260  print_text(struct format *f, const char *word, int fla
                 macro_close(f);                  macro_close(f);
                 break;                  break;
         }          }
           if (f->linestate == LINE_NEW && (*word == '.' || *word == '\''))
                   fputs("\\&", stdout);
         while (*word != '\0') {          while (*word != '\0') {
                 putchar(*word);                  putchar(*word);
                 if (*word++ == '\\')                  if (*word++ == '\\')
                         putchar('e');                          putchar('e');
         }          }
         f->linestate = LINE_TEXT;          f->linestate = LINE_TEXT;
           f->parastate = PARA_MID;
         f->flags = 0;          f->flags = 0;
 }  }
   

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.18

CVSweb