]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandoc.c
tiny update
[mandoc.git] / mandoc.c
index d1e7356b54ad285138d38f8dda4d27eb4af343cf..6adf1a4318b29f852c11ba9272a5d1953f554412 100644 (file)
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,7 +1,7 @@
-/*     $Id: mandoc.c,v 1.113 2018/12/18 22:00:02 schwarze Exp $ */
+/*     $Id: mandoc.c,v 1.119 2021/08/10 12:55:03 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2015, 2017-2021 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -32,6 +32,7 @@
 #include "mandoc.h"
 #include "roff.h"
 #include "libmandoc.h"
+#include "roff_int.h"
 
 static int      a2time(time_t *, const char *, const char *);
 static char    *time2a(time_t);
@@ -73,12 +74,12 @@ mandoc_font(const char *cp, int sz)
                case 'C':
                        switch (cp[1]) {
                        case 'B':
-                               return ESCAPE_FONTBOLD;
+                               return ESCAPE_FONTCB;
                        case 'I':
-                               return ESCAPE_FONTITALIC;
+                               return ESCAPE_FONTCI;
                        case 'R':
                        case 'W':
-                               return ESCAPE_FONTCW;
+                               return ESCAPE_FONTCR;
                        default:
                                return ESCAPE_ERROR;
                        }
@@ -202,7 +203,18 @@ mandoc_escape(const char **end, const char **start, int *sz)
        case 'O':
        case 'V':
        case 'Y':
-               gly = (*start)[-1] == 'f' ? ESCAPE_FONT : ESCAPE_IGNORE;
+       case '*':
+               switch ((*start)[-1]) {
+               case 'f':
+                       gly = ESCAPE_FONT;
+                       break;
+               case '*':
+                       gly = ESCAPE_DEVICE;
+                       break;
+               default:
+                       gly = ESCAPE_IGNORE;
+                       break;
+               }
                switch (**start) {
                case '(':
                        if ((*start)[-1] == 'O')
@@ -237,13 +249,6 @@ mandoc_escape(const char **end, const char **start, int *sz)
                        break;
                }
                break;
-       case '*':
-               if (strncmp(*start, "(.T", 3) != 0)
-                       abort();
-               gly = ESCAPE_DEVICE;
-               *start = ++*end;
-               *sz = 2;
-               break;
 
        /*
         * These escapes are of the form \X'Y', where 'X' is the trigger
@@ -458,6 +463,9 @@ mandoc_escape(const char **end, const char **start, int *sz)
                    + 1 == *sz)
                        gly = ESCAPE_UNICODE;
                break;
+       case ESCAPE_DEVICE:
+               assert(*sz == 2 && (*start)[0] == '.' && (*start)[1] == 'T');
+               break;
        default:
                break;
        }
@@ -493,9 +501,10 @@ time2a(time_t t)
        size_t           ssz;
        int              isz;
 
+       buf = NULL;
        tm = localtime(&t);
        if (tm == NULL)
-               return NULL;
+               goto fail;
 
        /*
         * Reserve space:
@@ -519,7 +528,8 @@ time2a(time_t t)
         * of looking at LC_TIME.
         */
 
-       if ((isz = snprintf(p, 4 + 1, "%d, ", tm->tm_mday)) == -1)
+       isz = snprintf(p, 4 + 1, "%d, ", tm->tm_mday);
+       if (isz < 0 || isz > 4)
                goto fail;
        p += isz;
 
@@ -529,46 +539,63 @@ time2a(time_t t)
 
 fail:
        free(buf);
-       return NULL;
+       return mandoc_strdup("");
 }
 
 char *
-mandoc_normdate(struct roff_man *man, char *in, int ln, int pos)
+mandoc_normdate(struct roff_node *nch, struct roff_node *nbl)
 {
        char            *cp;
        time_t           t;
 
-       /* No date specified: use today's date. */
+       /* No date specified. */
 
-       if (in == NULL || *in == '\0' || strcmp(in, "$" "Mdocdate$") == 0) {
-               mandoc_msg(MANDOCERR_DATE_MISSING, ln, pos, NULL);
-               return time2a(time(NULL));
+       if (nch == NULL) {
+               if (nbl == NULL)
+                       mandoc_msg(MANDOCERR_DATE_MISSING, 0, 0, NULL);
+               else
+                       mandoc_msg(MANDOCERR_DATE_MISSING, nbl->line,
+                           nbl->pos, "%s", roff_name[nbl->tok]);
+               return mandoc_strdup("");
        }
+       if (*nch->string == '\0') {
+               mandoc_msg(MANDOCERR_DATE_MISSING, nch->line,
+                   nch->pos, "%s", roff_name[nbl->tok]);
+               return mandoc_strdup("");
+       }
+       if (strcmp(nch->string, "$" "Mdocdate$") == 0)
+               return time2a(time(NULL));
 
        /* Valid mdoc(7) date format. */
 
-       if (a2time(&t, "$" "Mdocdate: %b %d %Y $", in) ||
-           a2time(&t, "%b %d, %Y", in)) {
+       if (a2time(&t, "$" "Mdocdate: %b %d %Y $", nch->string) ||
+           a2time(&t, "%b %d, %Y", nch->string)) {
                cp = time2a(t);
                if (t > time(NULL) + 86400)
-                       mandoc_msg(MANDOCERR_DATE_FUTURE, ln, pos, "%s", cp);
-               else if (*in != '$' && strcmp(in, cp) != 0)
-                       mandoc_msg(MANDOCERR_DATE_NORM, ln, pos, "%s", cp);
+                       mandoc_msg(MANDOCERR_DATE_FUTURE, nch->line,
+                           nch->pos, "%s %s", roff_name[nbl->tok], cp);
+               else if (*nch->string != '$' &&
+                   strcmp(nch->string, cp) != 0)
+                       mandoc_msg(MANDOCERR_DATE_NORM, nch->line,
+                           nch->pos, "%s %s", roff_name[nbl->tok], cp);
                return cp;
        }
 
        /* In man(7), do not warn about the legacy format. */
 
-       if (a2time(&t, "%Y-%m-%d", in) == 0)
-               mandoc_msg(MANDOCERR_DATE_BAD, ln, pos, "%s", in);
+       if (a2time(&t, "%Y-%m-%d", nch->string) == 0)
+               mandoc_msg(MANDOCERR_DATE_BAD, nch->line, nch->pos,
+                   "%s %s", roff_name[nbl->tok], nch->string);
        else if (t > time(NULL) + 86400)
-               mandoc_msg(MANDOCERR_DATE_FUTURE, ln, pos, "%s", in);
-       else if (man->macroset == MACROSET_MDOC)
-               mandoc_msg(MANDOCERR_DATE_LEGACY, ln, pos, "Dd %s", in);
+               mandoc_msg(MANDOCERR_DATE_FUTURE, nch->line, nch->pos,
+                   "%s %s", roff_name[nbl->tok], nch->string);
+       else if (nbl->tok == MDOC_Dd)
+               mandoc_msg(MANDOCERR_DATE_LEGACY, nch->line, nch->pos,
+                   "Dd %s", nch->string);
 
        /* Use any non-mdoc(7) date verbatim. */
 
-       return mandoc_strdup(in);
+       return mandoc_strdup(nch->string);
 }
 
 int