]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdocterm.c
Memory-corruption fix.
[mandoc.git] / mdocterm.c
index 00a1308503a2185b5f7909785afc8686788beb56..9758549528195d6ed8bcec6c0fd70eafc0ec1d4a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mdocterm.c,v 1.27 2009/03/03 21:07:01 kristaps Exp $ */
+/* $Id: mdocterm.c,v 1.34 2009/03/06 14:13:47 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -16,8 +16,6 @@
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  * PERFORMANCE OF THIS SOFTWARE.
  */
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  * PERFORMANCE OF THIS SOFTWARE.
  */
-#include <sys/utsname.h>
-
 #include <assert.h>
 #include <ctype.h>
 #include <err.h>
 #include <assert.h>
 #include <ctype.h>
 #include <err.h>
@@ -78,6 +76,8 @@ static        struct termenc    termenc1[] = {
 static struct termenc    termenc2[] = {
        { "rB",           TERMSYM_RBRACK },
        { "lB",           TERMSYM_LBRACK },
 static struct termenc    termenc2[] = {
        { "rB",           TERMSYM_RBRACK },
        { "lB",           TERMSYM_LBRACK },
+       { "ra",           TERMSYM_RANGLE },
+       { "la",           TERMSYM_LANGLE },
        { "Lq",           TERMSYM_LDQUOTE },
        { "lq",           TERMSYM_LDQUOTE },
        { "Rq",           TERMSYM_RDQUOTE },
        { "Lq",           TERMSYM_LDQUOTE },
        { "lq",           TERMSYM_LDQUOTE },
        { "Rq",           TERMSYM_RDQUOTE },
@@ -99,7 +99,7 @@ static        struct termenc    termenc2[] = {
        { "Le",           TERMSYM_LE },
        { "<=",           TERMSYM_LE },
        { "Ge",           TERMSYM_GE },
        { "Le",           TERMSYM_LE },
        { "<=",           TERMSYM_LE },
        { "Ge",           TERMSYM_GE },
-       { "=>",           TERMSYM_GE },
+       { ">=",           TERMSYM_GE },
        { "==",           TERMSYM_EQ },
        { "Ne",           TERMSYM_NEQ },
        { "!=",           TERMSYM_NEQ },
        { "==",           TERMSYM_EQ },
        { "Ne",           TERMSYM_NEQ },
        { "!=",           TERMSYM_NEQ },
@@ -161,6 +161,8 @@ static      struct termsym    termsym_ansi[] = {
        { " ", 1 },             /* TERMSYM_SPACE */
        { ".", 1 },             /* TERMSYM_PERIOD */
        { "", 0 },              /* TERMSYM_BREAK */
        { " ", 1 },             /* TERMSYM_SPACE */
        { ".", 1 },             /* TERMSYM_PERIOD */
        { "", 0 },              /* TERMSYM_BREAK */
+       { "<", 1 },             /* TERMSYM_LANGLE */
+       { ">", 1 },             /* TERMSYM_RANGLE */
 };
 
 static const char        ansi_clear[]  = { 27, '[', '0', 'm' };
 };
 
 static const char        ansi_clear[]  = { 27, '[', '0', 'm' };
@@ -177,20 +179,21 @@ static    struct termsym    termstyle_ansi[] = {
 int
 main(int argc, char *argv[])
 {
 int
 main(int argc, char *argv[])
 {
-       struct mmain    *p;
+       struct mmain      *p;
+       int                c;
        const struct mdoc *mdoc;
        const struct mdoc *mdoc;
-       struct termp     termp;
+       struct termp       termp;
 
        p = mmain_alloc();
 
 
        p = mmain_alloc();
 
-       if ( ! mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL))
-               mmain_exit(p, 1);
+       c = mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL);
+       if (1 != c)
+               mmain_exit(p, -1 == c ? 1 : 0);
 
        if (NULL == (mdoc = mmain_mdoc(p)))
                mmain_exit(p, 1);
 
 
        if (NULL == (mdoc = mmain_mdoc(p)))
                mmain_exit(p, 1);
 
-       termp.maxrmargin = 78; /* XXX */
-       termp.rmargin = termp.maxrmargin;
+       termp.maxrmargin = termp.rmargin = 78; /* XXX */
        termp.maxcols = 1024;
        termp.offset = termp.col = 0;
        termp.flags = TERMP_NOSPACE;
        termp.maxcols = 1024;
        termp.offset = termp.col = 0;
        termp.flags = TERMP_NOSPACE;
@@ -227,9 +230,6 @@ main(int argc, char *argv[])
  *    offset value.  This is useful when doing columnar lists where the
  *    prior column has right-padded.
  *
  *    offset value.  This is useful when doing columnar lists where the
  *    prior column has right-padded.
  *
- *  - TERMP_LITERAL: don't break apart words.  Note that a long literal
- *    word will violate the right margin.
- *
  *  - TERMP_NOBREAK: this is the most important and is used when making
  *    columns.  In short: don't print a newline and instead pad to the
  *    right margin.  Used in conjunction with TERMP_NOLPAD.
  *  - TERMP_NOBREAK: this is the most important and is used when making
  *    columns.  In short: don't print a newline and instead pad to the
  *    right margin.  Used in conjunction with TERMP_NOLPAD.
@@ -287,7 +287,7 @@ flushln(struct termp *p)
 
                /* LINTED */
                for (j = i, vsz = 0; j < p->col; j++) {
 
                /* LINTED */
                for (j = i, vsz = 0; j < p->col; j++) {
-                       if (isspace((int)p->buf[j]))
+                       if (isspace((u_char)p->buf[j]))
                                break;
                        else if (27 == p->buf[j]) {
                                assert(j + 4 <= p->col);
                                break;
                        else if (27 == p->buf[j]) {
                                assert(j + 4 <= p->col);
@@ -320,7 +320,7 @@ flushln(struct termp *p)
                                putchar('\n');
                                for (j = 0; j < p->rmargin; j++)
                                        putchar(' ');
                                putchar('\n');
                                for (j = 0; j < p->rmargin; j++)
                                        putchar(' ');
-                               vis = p->rmargin;
+                               vis = p->rmargin - p->offset;
                        } else if (vis + vsz > bp) 
                                warnx("word breaks right margin");
 
                        } else if (vis + vsz > bp) 
                                warnx("word breaks right margin");
 
@@ -334,7 +334,7 @@ flushln(struct termp *p)
                 */
 
                for ( ; i < p->col; i++) {
                 */
 
                for ( ; i < p->col; i++) {
-                       if (isspace((int)p->buf[i]))
+                       if (isspace((u_char)p->buf[i]))
                                break;
                        putchar(p->buf[i]);
                }
                                break;
                        putchar(p->buf[i]);
                }
@@ -351,9 +351,11 @@ flushln(struct termp *p)
         */
 
        if ((TERMP_NOBREAK & p->flags) && vis >= maxvis) {
         */
 
        if ((TERMP_NOBREAK & p->flags) && vis >= maxvis) {
-               putchar('\n');
-               for (i = 0; i < p->rmargin; i++)
-                       putchar(' ');
+               if ( ! (TERMP_NONOBREAK & p->flags)) {
+                       putchar('\n');
+                       for (i = 0; i < p->rmargin; i++)
+                               putchar(' ');
+               }
                p->col = 0;
                return;
        }
                p->col = 0;
                return;
        }
@@ -364,8 +366,9 @@ flushln(struct termp *p)
         */
 
        if (p->flags & TERMP_NOBREAK) {
         */
 
        if (p->flags & TERMP_NOBREAK) {
-               for ( ; vis < maxvis; vis++)
-                       putchar(' ');
+               if ( ! (TERMP_NONOBREAK & p->flags))
+                       for ( ; vis < maxvis; vis++)
+                               putchar(' ');
        } else
                putchar('\n');
 
        } else
                putchar('\n');
 
@@ -434,13 +437,13 @@ word(struct termp *p, const char *word)
 
        /* LINTED */
        for (j = i = 0; i < len; i++) {
 
        /* LINTED */
        for (j = i = 0; i < len; i++) {
-               if ( ! isspace((int)word[i])) {
+               if ( ! isspace((u_char)word[i])) {
                        j++;
                        continue;
                } 
                
                /* Escaped spaces don't delimit... */
                        j++;
                        continue;
                } 
                
                /* Escaped spaces don't delimit... */
-               if (i > 0 && isspace((int)word[i]) && 
+               if (i > 0 && isspace((u_char)word[i]) && 
                                '\\' == word[i - 1]) {
                        j++;
                        continue;
                                '\\' == word[i - 1]) {
                        j++;
                        continue;
@@ -567,9 +570,7 @@ footer(struct termp *p, const struct mdoc_meta *meta)
 static void
 header(struct termp *p, const struct mdoc_meta *meta)
 {
 static void
 header(struct termp *p, const struct mdoc_meta *meta)
 {
-       char            *buf, *title, *bufp, *vbuf;
-       const char      *pp;
-       struct utsname   uts;
+       char            *buf, *title, *bufp;
 
        p->rmargin = p->maxrmargin;
        p->offset = 0;
 
        p->rmargin = p->maxrmargin;
        p->offset = 0;
@@ -578,48 +579,6 @@ header(struct termp *p, const struct mdoc_meta *meta)
                err(1, "malloc");
        if (NULL == (title = malloc(p->rmargin)))
                err(1, "malloc");
                err(1, "malloc");
        if (NULL == (title = malloc(p->rmargin)))
                err(1, "malloc");
-       if (NULL == (vbuf = malloc(p->rmargin)))
-               err(1, "malloc");
-
-       if (NULL == (pp = mdoc_vol2a(meta->vol))) {
-               switch (meta->msec) {
-               case (MSEC_1):
-                       /* FALLTHROUGH */
-               case (MSEC_6):
-                       /* FALLTHROUGH */
-               case (MSEC_7):
-                       pp = mdoc_vol2a(VOL_URM);
-                       break;
-               case (MSEC_8):
-                       pp = mdoc_vol2a(VOL_SMM);
-                       break;
-               case (MSEC_2):
-                       /* FALLTHROUGH */
-               case (MSEC_3):
-                       /* FALLTHROUGH */
-               case (MSEC_4):
-                       /* FALLTHROUGH */
-               case (MSEC_5):
-                       pp = mdoc_vol2a(VOL_PRM);
-                       break;
-               case (MSEC_9):
-                       pp = mdoc_vol2a(VOL_KM);
-                       break;
-               default:
-                       break;
-               }
-       }
-       vbuf[0] = 0;
-
-       if (pp) {
-               if (-1 == uname(&uts)) 
-                       err(1, "uname");
-               (void)strlcat(vbuf, uts.sysname, p->rmargin);
-               (void)strlcat(vbuf, " ", p->rmargin);
-       } else if (NULL == (pp = mdoc_msec2a(meta->msec)))
-               pp = mdoc_msec2a(MSEC_local);
-
-       (void)strlcat(vbuf, pp, p->rmargin);
 
        /*
         * The header is strange.  It has three components, which are
 
        /*
         * The header is strange.  It has three components, which are
@@ -634,19 +593,20 @@ header(struct termp *p, const struct mdoc_meta *meta)
         * switches on the manual section.
         */
 
         * switches on the manual section.
         */
 
-       if (mdoc_arch2a(meta->arch))
-               (void)snprintf(buf, p->rmargin, "%s (%s)",
-                               vbuf, mdoc_arch2a(meta->arch));
-       else
-               (void)strlcpy(buf, vbuf, p->rmargin);
+       assert(meta->vol);
+       (void)strlcpy(buf, meta->vol, p->rmargin);
 
 
-       pp = mdoc_msec2a(meta->msec);
+       if (meta->arch) {
+               (void)strlcat(buf, " (", p->rmargin);
+               (void)strlcat(buf, meta->arch, p->rmargin);
+               (void)strlcat(buf, ")", p->rmargin);
+       }
 
 
-       (void)snprintf(title, p->rmargin, "%s(%s)",
-                       meta->title, pp ? pp : "");
+       (void)snprintf(title, p->rmargin, "%s(%d)", 
+                       meta->title, meta->msec);
 
        for (bufp = title; *bufp; bufp++)
 
        for (bufp = title; *bufp; bufp++)
-               *bufp = toupper(*bufp);
+               *bufp = toupper((u_char)*bufp);
        
        p->offset = 0;
        p->rmargin = (p->maxrmargin - strlen(buf)) / 2;
        
        p->offset = 0;
        p->rmargin = (p->maxrmargin - strlen(buf)) / 2;
@@ -675,7 +635,6 @@ header(struct termp *p, const struct mdoc_meta *meta)
        p->flags &= ~TERMP_NOSPACE;
 
        free(title);
        p->flags &= ~TERMP_NOSPACE;
 
        free(title);
-       free(vbuf);
        free(buf);
 }
 
        free(buf);
 }