]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdocterm.c
Memory-corruption fix.
[mandoc.git] / mdocterm.c
index 26304acaff11bbb5e983a4c74eb7f80fc57928e6..9758549528195d6ed8bcec6c0fd70eafc0ec1d4a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mdocterm.c,v 1.30 2009/03/04 14:04:02 kristaps Exp $ */
+/* $Id: mdocterm.c,v 1.34 2009/03/06 14:13:47 kristaps Exp $ */
 /*
  * 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.
  */
-#include <sys/utsname.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 },
+       { "ra",           TERMSYM_RANGLE },
+       { "la",           TERMSYM_LANGLE },
        { "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 },
-       { "=>",           TERMSYM_GE },
+       { ">=",           TERMSYM_GE },
        { "==",           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_LANGLE */
+       { ">", 1 },             /* TERMSYM_RANGLE */
 };
 
 static const char        ansi_clear[]  = { 27, '[', '0', 'm' };
@@ -177,14 +179,16 @@ static    struct termsym    termstyle_ansi[] = {
 int
 main(int argc, char *argv[])
 {
-       struct mmain    *p;
+       struct mmain      *p;
+       int                c;
        const struct mdoc *mdoc;
-       struct termp     termp;
+       struct termp       termp;
 
        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);
@@ -283,7 +287,7 @@ flushln(struct termp *p)
 
                /* 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);
@@ -330,7 +334,7 @@ flushln(struct termp *p)
                 */
 
                for ( ; i < p->col; i++) {
-                       if (isspace((int)p->buf[i]))
+                       if (isspace((u_char)p->buf[i]))
                                break;
                        putchar(p->buf[i]);
                }
@@ -347,9 +351,11 @@ flushln(struct termp *p)
         */
 
        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;
        }
@@ -359,10 +365,11 @@ flushln(struct termp *p)
         * pad to the right margin and stay off.
         */
 
-       if (p->flags & TERMP_NOBREAK) 
-               for ( ; vis < maxvis; vis++)
-                       putchar(' ');
-       else
+       if (p->flags & TERMP_NOBREAK) {
+               if ( ! (TERMP_NONOBREAK & p->flags))
+                       for ( ; vis < maxvis; vis++)
+                               putchar(' ');
+       } else
                putchar('\n');
 
        p->col = 0;
@@ -430,13 +437,13 @@ word(struct termp *p, const char *word)
 
        /* 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... */
-               if (i > 0 && isspace((int)word[i]) && 
+               if (i > 0 && isspace((u_char)word[i]) && 
                                '\\' == word[i - 1]) {
                        j++;
                        continue;
@@ -563,9 +570,7 @@ footer(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;
@@ -574,48 +579,6 @@ header(struct termp *p, const struct mdoc_meta *meta)
                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
@@ -630,19 +593,20 @@ header(struct termp *p, const struct mdoc_meta *meta)
         * 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++)
-               *bufp = toupper(*bufp);
+               *bufp = toupper((u_char)*bufp);
        
        p->offset = 0;
        p->rmargin = (p->maxrmargin - strlen(buf)) / 2;
@@ -671,7 +635,6 @@ header(struct termp *p, const struct mdoc_meta *meta)
        p->flags &= ~TERMP_NOSPACE;
 
        free(title);
-       free(vbuf);
        free(buf);
 }