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

Diff for /mandoc/demandoc.c between version 1.4 and 1.24

version 1.4, 2011/09/01 20:55:50 version 1.24, 2015/10/22 22:06:43
Line 14 
Line 14 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #ifdef HAVE_CONFIG_H  
 #include "config.h"  #include "config.h"
 #endif  
   
   #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
 #include <getopt.h>  #include <getopt.h>
Line 26 
Line 26 
 #include <string.h>  #include <string.h>
 #include <unistd.h>  #include <unistd.h>
   
   #include "roff.h"
 #include "man.h"  #include "man.h"
 #include "mdoc.h"  #include "mdoc.h"
 #include "mandoc.h"  #include "mandoc.h"
   
 static  void     pline(int, int *, int *, int);  static  void     pline(int, int *, int *, int);
 static  void     pman(const struct man_node *, int *, int *, int);  static  void     pman(const struct roff_node *, int *, int *, int);
 static  void     pmandoc(struct mparse *, int, const char *, int);  static  void     pmandoc(struct mparse *, int, const char *, int);
 static  void     pmdoc(const struct mdoc_node *, int *, int *, int);  static  void     pmdoc(const struct roff_node *, int *, int *, int);
 static  void     pstring(const char *, int, int *, int);  static  void     pstring(const char *, int, int *, int);
 static  void     usage(void);  static  void     usage(void);
   
Line 43  int
Line 44  int
 main(int argc, char *argv[])  main(int argc, char *argv[])
 {  {
         struct mparse   *mp;          struct mparse   *mp;
         int              ch, i, list;          int              ch, fd, i, list;
         extern int       optind;          extern int       optind;
   
         progname = strrchr(argv[0], '/');          if (argc < 1)
         if (progname == NULL)                  progname = "demandoc";
           else if ((progname = strrchr(argv[0], '/')) == NULL)
                 progname = argv[0];                  progname = argv[0];
         else          else
                 ++progname;                  ++progname;
Line 70  main(int argc, char *argv[])
Line 72  main(int argc, char *argv[])
                         break;                          break;
                 default:                  default:
                         usage();                          usage();
                         return((int)MANDOCLEVEL_BADARG);                          return (int)MANDOCLEVEL_BADARG;
                 }                  }
   
         argc -= optind;          argc -= optind;
         argv += optind;          argv += optind;
   
         mp = mparse_alloc(MPARSE_AUTO, MANDOCLEVEL_FATAL, NULL, NULL);          mchars_alloc();
           mp = mparse_alloc(MPARSE_SO, MANDOCLEVEL_BADARG, NULL, NULL);
         assert(mp);          assert(mp);
   
         if (0 == argc)          if (argc < 1)
                 pmandoc(mp, STDIN_FILENO, "<stdin>", list);                  pmandoc(mp, STDIN_FILENO, "<stdin>", list);
   
         for (i = 0; i < argc; i++) {          for (i = 0; i < argc; i++) {
                 mparse_reset(mp);                  mparse_reset(mp);
                 pmandoc(mp, -1, argv[i], list);                  if (mparse_open(mp, &fd, argv[i]) != MANDOCLEVEL_OK) {
                           perror(argv[i]);
                           continue;
                   }
                   pmandoc(mp, fd, argv[i], list);
         }          }
   
         mparse_free(mp);          mparse_free(mp);
         return((int)MANDOCLEVEL_OK);          mchars_free();
           return (int)MANDOCLEVEL_OK;
 }  }
   
 static void  static void
Line 101  usage(void)
Line 109  usage(void)
 static void  static void
 pmandoc(struct mparse *mp, int fd, const char *fn, int list)  pmandoc(struct mparse *mp, int fd, const char *fn, int list)
 {  {
         struct mdoc     *mdoc;          struct roff_man *man;
         struct man      *man;  
         int              line, col;          int              line, col;
   
         if (mparse_readfd(mp, fd, fn) >= MANDOCLEVEL_FATAL) {          mparse_readfd(mp, fd, fn);
                 fprintf(stderr, "%s: Parse failure\n", fn);          mparse_result(mp, &man, NULL);
                 return;  
         }  
   
         mparse_result(mp, &mdoc, &man);  
         line = 1;          line = 1;
         col = 0;          col = 0;
   
         if (mdoc)          if (man == NULL)
                 pmdoc(mdoc_node(mdoc), &line, &col, list);  
         else if (man)  
                 pman(man_node(man), &line, &col, list);  
         else  
                 return;                  return;
           if (man->macroset == MACROSET_MDOC) {
                   mdoc_validate(man);
                   pmdoc(man->first->child, &line, &col, list);
           } else {
                   man_validate(man);
                   pman(man->first->child, &line, &col, list);
           }
   
         putchar('\n');          if ( ! list)
                   putchar('\n');
 }  }
   
 /*  /*
Line 131  static void
Line 138  static void
 pstring(const char *p, int col, int *colp, int list)  pstring(const char *p, int col, int *colp, int list)
 {  {
         enum mandoc_esc  esc;          enum mandoc_esc  esc;
           const char      *start, *end;
           int              emit;
   
           /*
            * Print as many column spaces til we achieve parity with the
            * input document.
            */
   
   again:
           if (list && '\0' != *p) {
                   while (isspace((unsigned char)*p))
                           p++;
   
                   while ('\'' == *p || '(' == *p || '"' == *p)
                           p++;
   
                   emit = isalpha((unsigned char)p[0]) &&
                           isalpha((unsigned char)p[1]);
   
                   for (start = p; '\0' != *p; p++)
                           if ('\\' == *p) {
                                   p++;
                                   esc = mandoc_escape(&p, NULL, NULL);
                                   if (ESCAPE_ERROR == esc)
                                           return;
                                   emit = 0;
                           } else if (isspace((unsigned char)*p))
                                   break;
   
                   end = p - 1;
   
                   while (end > start)
                           if ('.' == *end || ',' == *end ||
                                           '\'' == *end || '"' == *end ||
                                           ')' == *end || '!' == *end ||
                                           '?' == *end || ':' == *end ||
                                           ';' == *end)
                                   end--;
                           else
                                   break;
   
                   if (emit && end - start >= 1) {
                           for ( ; start <= end; start++)
                                   if (ASCII_HYPH == *start)
                                           putchar('-');
                                   else
                                           putchar((unsigned char)*start);
                           putchar('\n');
                   }
   
                   if (isspace((unsigned char)*p))
                           goto again;
   
                   return;
           }
   
         while (*colp < col) {          while (*colp < col) {
                 putchar(' ');                  putchar(' ');
                 (*colp)++;                  (*colp)++;
         }          }
   
         while ('\0' != *p)          /*
            * Print the input word, skipping any special characters.
            */
           while ('\0' != *p)
                 if ('\\' == *p) {                  if ('\\' == *p) {
                         p++;                          p++;
                         esc = mandoc_escape(&p, NULL, NULL);                          esc = mandoc_escape(&p, NULL, NULL);
Line 153  static void
Line 218  static void
 pline(int line, int *linep, int *col, int list)  pline(int line, int *linep, int *col, int list)
 {  {
   
           if (list)
                   return;
   
           /*
            * Print out as many lines as needed to reach parity with the
            * original input.
            */
   
         while (*linep < line) {          while (*linep < line) {
                 putchar('\n');                  putchar('\n');
                 (*linep)++;                  (*linep)++;
Line 162  pline(int line, int *linep, int *col, int list)
Line 235  pline(int line, int *linep, int *col, int list)
 }  }
   
 static void  static void
 pmdoc(const struct mdoc_node *p, int *line, int *col, int list)  pmdoc(const struct roff_node *p, int *line, int *col, int list)
 {  {
   
         for ( ; p; p = p->next) {          for ( ; p; p = p->next) {
                 if (MDOC_LINE & p->flags)                  if (MDOC_LINE & p->flags)
                         pline(p->line, line, col, list);                          pline(p->line, line, col, list);
                 if (MDOC_TEXT == p->type)                  if (ROFFT_TEXT == p->type)
                         pstring(p->string, p->pos, col, list);                          pstring(p->string, p->pos, col, list);
                 if (p->child)                  if (p->child)
                         pmdoc(p->child, line, col, list);                          pmdoc(p->child, line, col, list);
         }          }
 }  }
   
 static void  static void
 pman(const struct man_node *p, int *line, int *col, int list)  pman(const struct roff_node *p, int *line, int *col, int list)
 {  {
   
         for ( ; p; p = p->next) {          for ( ; p; p = p->next) {
                 if (MAN_LINE & p->flags)                  if (MAN_LINE & p->flags)
                         pline(p->line, line, col, list);                          pline(p->line, line, col, list);
                 if (MAN_TEXT == p->type)                  if (ROFFT_TEXT == p->type)
                         pstring(p->string, p->pos, col, list);                          pstring(p->string, p->pos, col, list);
                 if (p->child)                  if (p->child)
                         pman(p->child, line, col, list);                          pman(p->child, line, col, list);
         }          }
 }  }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.24

CVSweb