]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_argv.c
Grrr, patch(1) merged the new function to the wrong place in this file.
[mandoc.git] / mdoc_argv.c
index b65a873bde0a46bdaf2e44a3613f322c2e725b4f..b12c510f25ef5c1ea609e0e6778439c4c2e34d63 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_argv.c,v 1.87 2013/12/15 23:56:42 schwarze Exp $ */
+/*     $Id: mdoc_argv.c,v 1.96 2014/08/10 23:54:41 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2012 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2012 Ingo Schwarze <schwarze@openbsd.org>
@@ -15,9 +15,7 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * 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 <sys/types.h>
 
 
 #include "mdoc.h"
 #include "mandoc.h"
 
 #include "mdoc.h"
 #include "mandoc.h"
+#include "mandoc_aux.h"
 #include "libmdoc.h"
 #include "libmandoc.h"
 
 #define        MULTI_STEP       5 /* pre-allocate argument values */
 #include "libmdoc.h"
 #include "libmandoc.h"
 
 #define        MULTI_STEP       5 /* pre-allocate argument values */
-#define        DELIMSZ          6 /* max possible size of a delimiter */
+#define        DELIMSZ          6 /* max possible size of a delimiter */
 
 enum   argsflag {
        ARGSFL_NONE = 0,
 
 enum   argsflag {
        ARGSFL_NONE = 0,
@@ -52,12 +51,12 @@ struct      mdocarg {
 };
 
 static void             argn_free(struct mdoc_arg *, int);
 };
 
 static void             argn_free(struct mdoc_arg *, int);
-static enum margserr    args(struct mdoc *, int, int *, 
+static enum margserr    args(struct mdoc *, int, int *,
                                char *, enum argsflag, char **);
 static int              args_checkpunct(const char *, int);
                                char *, enum argsflag, char **);
 static int              args_checkpunct(const char *, int);
-static int              argv_multi(struct mdoc *, int, 
+static int              argv_multi(struct mdoc *, int,
                                struct mdoc_argv *, int *, char *);
                                struct mdoc_argv *, int *, char *);
-static int              argv_single(struct mdoc *, int, 
+static int              argv_single(struct mdoc *, int,
                                struct mdoc_argv *, int *, char *);
 
 static const enum argvflag argvflags[MDOC_ARG_MAX] = {
                                struct mdoc_argv *, int *, char *);
 
 static const enum argvflag argvflags[MDOC_ARG_MAX] = {
@@ -149,8 +148,8 @@ static      const struct mdocarg mdocargs[MDOC_MAX] = {
        { ARGSFL_NONE, NULL }, /* Dt */
        { ARGSFL_NONE, NULL }, /* Os */
        { ARGSFL_NONE, NULL }, /* Sh */
        { ARGSFL_NONE, NULL }, /* Dt */
        { ARGSFL_NONE, NULL }, /* Os */
        { ARGSFL_NONE, NULL }, /* Sh */
-       { ARGSFL_NONE, NULL }, /* Ss */ 
-       { ARGSFL_NONE, NULL }, /* Pp */ 
+       { ARGSFL_NONE, NULL }, /* Ss */
+       { ARGSFL_NONE, NULL }, /* Pp */
        { ARGSFL_DELIM, NULL }, /* D1 */
        { ARGSFL_DELIM, NULL }, /* Dl */
        { ARGSFL_NONE, args_Bd }, /* Bd */
        { ARGSFL_DELIM, NULL }, /* D1 */
        { ARGSFL_DELIM, NULL }, /* Dl */
        { ARGSFL_NONE, args_Bd }, /* Bd */
@@ -158,32 +157,32 @@ static    const struct mdocarg mdocargs[MDOC_MAX] = {
        { ARGSFL_NONE, args_Bl }, /* Bl */
        { ARGSFL_NONE, NULL }, /* El */
        { ARGSFL_NONE, NULL }, /* It */
        { ARGSFL_NONE, args_Bl }, /* Bl */
        { ARGSFL_NONE, NULL }, /* El */
        { ARGSFL_NONE, NULL }, /* It */
-       { ARGSFL_DELIM, NULL }, /* Ad */ 
+       { ARGSFL_DELIM, NULL }, /* Ad */
        { ARGSFL_DELIM, args_An }, /* An */
        { ARGSFL_DELIM, NULL }, /* Ar */
        { ARGSFL_DELIM, NULL }, /* Cd */
        { ARGSFL_DELIM, NULL }, /* Cm */
        { ARGSFL_DELIM, args_An }, /* An */
        { ARGSFL_DELIM, NULL }, /* Ar */
        { ARGSFL_DELIM, NULL }, /* Cd */
        { ARGSFL_DELIM, NULL }, /* Cm */
-       { ARGSFL_DELIM, NULL }, /* Dv */ 
-       { ARGSFL_DELIM, NULL }, /* Er */ 
-       { ARGSFL_DELIM, NULL }, /* Ev */ 
+       { ARGSFL_DELIM, NULL }, /* Dv */
+       { ARGSFL_DELIM, NULL }, /* Er */
+       { ARGSFL_DELIM, NULL }, /* Ev */
        { ARGSFL_NONE, args_Ex }, /* Ex */
        { ARGSFL_NONE, args_Ex }, /* Ex */
-       { ARGSFL_DELIM, NULL }, /* Fa */ 
-       { ARGSFL_NONE, NULL }, /* Fd */ 
+       { ARGSFL_DELIM, NULL }, /* Fa */
+       { ARGSFL_NONE, NULL }, /* Fd */
        { ARGSFL_DELIM, NULL }, /* Fl */
        { ARGSFL_DELIM, NULL }, /* Fl */
-       { ARGSFL_DELIM, NULL }, /* Fn */ 
-       { ARGSFL_DELIM, NULL }, /* Ft */ 
-       { ARGSFL_DELIM, NULL }, /* Ic */ 
-       { ARGSFL_DELIM, NULL }, /* In */ 
+       { ARGSFL_DELIM, NULL }, /* Fn */
+       { ARGSFL_DELIM, NULL }, /* Ft */
+       { ARGSFL_DELIM, NULL }, /* Ic */
+       { ARGSFL_DELIM, NULL }, /* In */
        { ARGSFL_DELIM, NULL }, /* Li */
        { ARGSFL_DELIM, NULL }, /* Li */
-       { ARGSFL_NONE, NULL }, /* Nd */ 
-       { ARGSFL_DELIM, NULL }, /* Nm */ 
+       { ARGSFL_NONE, NULL }, /* Nd */
+       { ARGSFL_DELIM, NULL }, /* Nm */
        { ARGSFL_DELIM, NULL }, /* Op */
        { ARGSFL_DELIM, NULL }, /* Op */
-       { ARGSFL_NONE, NULL }, /* Ot */
+       { ARGSFL_DELIM, NULL }, /* Ot */
        { ARGSFL_DELIM, NULL }, /* Pa */
        { ARGSFL_NONE, args_Ex }, /* Rv */
        { ARGSFL_DELIM, NULL }, /* Pa */
        { ARGSFL_NONE, args_Ex }, /* Rv */
-       { ARGSFL_DELIM, NULL }, /* St */ 
+       { ARGSFL_DELIM, NULL }, /* St */
        { ARGSFL_DELIM, NULL }, /* Va */
        { ARGSFL_DELIM, NULL }, /* Va */
-       { ARGSFL_DELIM, NULL }, /* Vt */ 
+       { ARGSFL_DELIM, NULL }, /* Vt */
        { ARGSFL_DELIM, NULL }, /* Xr */
        { ARGSFL_NONE, NULL }, /* %A */
        { ARGSFL_NONE, NULL }, /* %B */
        { ARGSFL_DELIM, NULL }, /* Xr */
        { ARGSFL_NONE, NULL }, /* %A */
        { ARGSFL_NONE, NULL }, /* %B */
@@ -201,7 +200,7 @@ static      const struct mdocarg mdocargs[MDOC_MAX] = {
        { ARGSFL_DELIM, NULL }, /* Aq */
        { ARGSFL_DELIM, NULL }, /* At */
        { ARGSFL_DELIM, NULL }, /* Bc */
        { ARGSFL_DELIM, NULL }, /* Aq */
        { ARGSFL_DELIM, NULL }, /* At */
        { ARGSFL_DELIM, NULL }, /* Bc */
-       { ARGSFL_NONE, args_Bf }, /* Bf */ 
+       { ARGSFL_NONE, args_Bf }, /* Bf */
        { ARGSFL_NONE, NULL }, /* Bo */
        { ARGSFL_DELIM, NULL }, /* Bq */
        { ARGSFL_DELIM, NULL }, /* Bsx */
        { ARGSFL_NONE, NULL }, /* Bo */
        { ARGSFL_DELIM, NULL }, /* Bq */
        { ARGSFL_DELIM, NULL }, /* Bsx */
@@ -212,7 +211,7 @@ static      const struct mdocarg mdocargs[MDOC_MAX] = {
        { ARGSFL_DELIM, NULL }, /* Dq */
        { ARGSFL_DELIM, NULL }, /* Ec */
        { ARGSFL_NONE, NULL }, /* Ef */
        { ARGSFL_DELIM, NULL }, /* Dq */
        { ARGSFL_DELIM, NULL }, /* Ec */
        { ARGSFL_NONE, NULL }, /* Ef */
-       { ARGSFL_DELIM, NULL }, /* Em */ 
+       { ARGSFL_DELIM, NULL }, /* Em */
        { ARGSFL_NONE, NULL }, /* Eo */
        { ARGSFL_DELIM, NULL }, /* Fx */
        { ARGSFL_DELIM, NULL }, /* Ms */
        { ARGSFL_NONE, NULL }, /* Eo */
        { ARGSFL_DELIM, NULL }, /* Fx */
        { ARGSFL_DELIM, NULL }, /* Ms */
@@ -240,15 +239,15 @@ static    const struct mdocarg mdocargs[MDOC_MAX] = {
        { ARGSFL_DELIM, NULL }, /* Ux */
        { ARGSFL_DELIM, NULL }, /* Xc */
        { ARGSFL_NONE, NULL }, /* Xo */
        { ARGSFL_DELIM, NULL }, /* Ux */
        { ARGSFL_DELIM, NULL }, /* Xc */
        { ARGSFL_NONE, NULL }, /* Xo */
-       { ARGSFL_NONE, NULL }, /* Fo */ 
-       { ARGSFL_DELIM, NULL }, /* Fc */ 
+       { ARGSFL_NONE, NULL }, /* Fo */
+       { ARGSFL_DELIM, NULL }, /* Fc */
        { ARGSFL_NONE, NULL }, /* Oo */
        { ARGSFL_DELIM, NULL }, /* Oc */
        { ARGSFL_NONE, args_Bk }, /* Bk */
        { ARGSFL_NONE, NULL }, /* Ek */
        { ARGSFL_NONE, NULL }, /* Bt */
        { ARGSFL_NONE, NULL }, /* Hf */
        { ARGSFL_NONE, NULL }, /* Oo */
        { ARGSFL_DELIM, NULL }, /* Oc */
        { ARGSFL_NONE, args_Bk }, /* Bk */
        { ARGSFL_NONE, NULL }, /* Ek */
        { ARGSFL_NONE, NULL }, /* Bt */
        { ARGSFL_NONE, NULL }, /* Hf */
-       { ARGSFL_NONE, NULL }, /* Fr */
+       { ARGSFL_DELIM, NULL }, /* Fr */
        { ARGSFL_NONE, NULL }, /* Ud */
        { ARGSFL_DELIM, NULL }, /* Lb */
        { ARGSFL_NONE, NULL }, /* Lp */
        { ARGSFL_NONE, NULL }, /* Ud */
        { ARGSFL_DELIM, NULL }, /* Lb */
        { ARGSFL_NONE, NULL }, /* Lp */
@@ -259,13 +258,14 @@ static    const struct mdocarg mdocargs[MDOC_MAX] = {
        { ARGSFL_DELIM, NULL }, /* Brc */
        { ARGSFL_NONE, NULL }, /* %C */
        { ARGSFL_NONE, NULL }, /* Es */
        { ARGSFL_DELIM, NULL }, /* Brc */
        { ARGSFL_NONE, NULL }, /* %C */
        { ARGSFL_NONE, NULL }, /* Es */
-       { ARGSFL_NONE, NULL }, /* En */
-       { ARGSFL_NONE, NULL }, /* Dx */
+       { ARGSFL_DELIM, NULL }, /* En */
+       { ARGSFL_DELIM, NULL }, /* Dx */
        { ARGSFL_NONE, NULL }, /* %Q */
        { ARGSFL_NONE, NULL }, /* br */
        { ARGSFL_NONE, NULL }, /* sp */
        { ARGSFL_NONE, NULL }, /* %U */
        { ARGSFL_NONE, NULL }, /* Ta */
        { ARGSFL_NONE, NULL }, /* %Q */
        { ARGSFL_NONE, NULL }, /* br */
        { ARGSFL_NONE, NULL }, /* sp */
        { ARGSFL_NONE, NULL }, /* %U */
        { ARGSFL_NONE, NULL }, /* Ta */
+       { ARGSFL_NONE, NULL }, /* ll */
 };
 
 
 };
 
 
@@ -300,14 +300,14 @@ mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
                if (' ' == buf[*pos] && '\\' != buf[*pos - 1])
                        break;
 
                if (' ' == buf[*pos] && '\\' != buf[*pos - 1])
                        break;
 
-       /* 
+       /*
         * We want to nil-terminate the word to look it up (it's easier
         * that way).  But we may not have a flag, in which case we need
         * to restore the line as-is.  So keep around the stray byte,
         * which we'll reset upon exiting (if necessary).
         */
 
         * We want to nil-terminate the word to look it up (it's easier
         * that way).  But we may not have a flag, in which case we need
         * to restore the line as-is.  So keep around the stray byte,
         * which we'll reset upon exiting (if necessary).
         */
 
-       if ('\0' != (sv = buf[*pos])) 
+       if ('\0' != (sv = buf[*pos]))
                buf[(*pos)++] = '\0';
 
        /*
                buf[(*pos)++] = '\0';
 
        /*
@@ -326,7 +326,7 @@ mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
                        break;
 
        if (MDOC_ARG_MAX == tmp.arg) {
                        break;
 
        if (MDOC_ARG_MAX == tmp.arg) {
-               /* 
+               /*
                 * The flag was not found.
                 * Restore saved zeroed byte and return as a word.
                 */
                 * The flag was not found.
                 * Restore saved zeroed byte and return as a word.
                 */
@@ -341,15 +341,15 @@ mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
                (*pos)++;
 
        switch (argvflags[tmp.arg]) {
                (*pos)++;
 
        switch (argvflags[tmp.arg]) {
-       case (ARGV_SINGLE):
+       case ARGV_SINGLE:
                if ( ! argv_single(mdoc, line, &tmp, pos, buf))
                        return(ARGV_ERROR);
                break;
                if ( ! argv_single(mdoc, line, &tmp, pos, buf))
                        return(ARGV_ERROR);
                break;
-       case (ARGV_MULTI):
+       case ARGV_MULTI:
                if ( ! argv_multi(mdoc, line, &tmp, pos, buf))
                        return(ARGV_ERROR);
                break;
                if ( ! argv_multi(mdoc, line, &tmp, pos, buf))
                        return(ARGV_ERROR);
                break;
-       case (ARGV_NONE):
+       case ARGV_NONE:
                break;
        }
 
                break;
        }
 
@@ -357,11 +357,11 @@ mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
                arg = *v = mandoc_calloc(1, sizeof(struct mdoc_arg));
 
        arg->argc++;
                arg = *v = mandoc_calloc(1, sizeof(struct mdoc_arg));
 
        arg->argc++;
-       arg->argv = mandoc_realloc
-               (arg->argv, arg->argc * sizeof(struct mdoc_argv));
+       arg->argv = mandoc_reallocarray(arg->argv,
+           arg->argc, sizeof(struct mdoc_argv));
 
 
-       memcpy(&arg->argv[(int)arg->argc - 1], 
-                       &tmp, sizeof(struct mdoc_argv));
+       memcpy(&arg->argv[(int)arg->argc - 1], &tmp,
+           sizeof(struct mdoc_argv));
 
        return(ARGV_ARG);
 }
 
        return(ARGV_ARG);
 }
@@ -397,7 +397,7 @@ argn_free(struct mdoc_arg *p, int iarg)
        arg = &p->argv[iarg];
 
        if (arg->sz && arg->value) {
        arg = &p->argv[iarg];
 
        if (arg->sz && arg->value) {
-               for (j = (int)arg->sz - 1; j >= 0; j--) 
+               for (j = (int)arg->sz - 1; j >= 0; j--)
                        free(arg->value[j]);
                free(arg->value);
        }
                        free(arg->value[j]);
                free(arg->value);
        }
@@ -414,7 +414,7 @@ mdoc_zargs(struct mdoc *mdoc, int line, int *pos, char *buf, char **v)
 }
 
 enum margserr
 }
 
 enum margserr
-mdoc_args(struct mdoc *mdoc, int line, int *pos, 
+mdoc_args(struct mdoc *mdoc, int line, int *pos,
                char *buf, enum mdoct tok, char **v)
 {
        enum argsflag     fl;
                char *buf, enum mdoct tok, char **v)
 {
        enum argsflag     fl;
@@ -443,7 +443,7 @@ mdoc_args(struct mdoc *mdoc, int line, int *pos,
 }
 
 static enum margserr
 }
 
 static enum margserr
-args(struct mdoc *mdoc, int line, int *pos, 
+args(struct mdoc *mdoc, int line, int *pos,
                char *buf, enum argsflag fl, char **v)
 {
        char            *p, *pp;
                char *buf, enum argsflag fl, char **v)
 {
        char            *p, *pp;
@@ -459,7 +459,8 @@ args(struct mdoc *mdoc, int line, int *pos,
                 * is unterminated.
                 */
                if (MDOC_PHRASELIT & mdoc->flags)
                 * is unterminated.
                 */
                if (MDOC_PHRASELIT & mdoc->flags)
-                       mdoc_pmsg(mdoc, line, *pos, MANDOCERR_BADQUOTE);
+                       mandoc_msg(MANDOCERR_ARG_QUOTE,
+                           mdoc->parse, line, *pos, NULL);
 
                mdoc->flags &= ~MDOC_PHRASELIT;
                return(ARGS_EOLN);
 
                mdoc->flags &= ~MDOC_PHRASELIT;
                return(ARGS_EOLN);
@@ -484,7 +485,7 @@ args(struct mdoc *mdoc, int line, int *pos,
                pp = NULL;
 
                /* Scan ahead to unescaped `Ta'. */
                pp = NULL;
 
                /* Scan ahead to unescaped `Ta'. */
-               if ( ! (MDOC_PHRASELIT & mdoc->flags)) 
+               if ( ! (MDOC_PHRASELIT & mdoc->flags))
                        for (pp = *v; ; pp++) {
                                if (NULL == (pp = strstr(pp, "Ta")))
                                        break;
                        for (pp = *v; ; pp++) {
                                if (NULL == (pp = strstr(pp, "Ta")))
                                        break;
@@ -497,7 +498,7 @@ args(struct mdoc *mdoc, int line, int *pos,
                /* By default, assume a phrase. */
                rc = ARGS_PHRASE;
 
                /* By default, assume a phrase. */
                rc = ARGS_PHRASE;
 
-               /* 
+               /*
                 * Adjust new-buffer position to be beyond delimiter
                 * mark (e.g., Ta -> end + 2).
                 */
                 * Adjust new-buffer position to be beyond delimiter
                 * mark (e.g., Ta -> end + 2).
                 */
@@ -518,7 +519,8 @@ args(struct mdoc *mdoc, int line, int *pos,
 
                /* Whitespace check for eoln case... */
                if ('\0' == *p && ' ' == *(p - 1))
 
                /* Whitespace check for eoln case... */
                if ('\0' == *p && ' ' == *(p - 1))
-                       mdoc_pmsg(mdoc, line, *pos, MANDOCERR_EOLNSPACE);
+                       mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse,
+                           line, *pos, NULL);
 
                *pos += (int)(p - *v);
 
 
                *pos += (int)(p - *v);
 
@@ -536,12 +538,12 @@ args(struct mdoc *mdoc, int line, int *pos,
                        /* Skip ahead. */ ;
 
                return(rc);
                        /* Skip ahead. */ ;
 
                return(rc);
-       } 
+       }
 
 
-       /* 
+       /*
         * Process a quoted literal.  A quote begins with a double-quote
         * and ends with a double-quote NOT preceded by a double-quote.
         * Process a quoted literal.  A quote begins with a double-quote
         * and ends with a double-quote NOT preceded by a double-quote.
-        * Null-terminate the literal in place.
+        * NUL-terminate the literal in place.
         * Collapse pairs of quotes inside quoted literals.
         * Whitespace is NOT involved in literal termination.
         */
         * Collapse pairs of quotes inside quoted literals.
         * Whitespace is NOT involved in literal termination.
         */
@@ -573,7 +575,8 @@ args(struct mdoc *mdoc, int line, int *pos,
                if ('\0' == buf[*pos]) {
                        if (MDOC_PPHRASE & mdoc->flags)
                                return(ARGS_QWORD);
                if ('\0' == buf[*pos]) {
                        if (MDOC_PPHRASE & mdoc->flags)
                                return(ARGS_QWORD);
-                       mdoc_pmsg(mdoc, line, *pos, MANDOCERR_BADQUOTE);
+                       mandoc_msg(MANDOCERR_ARG_QUOTE,
+                           mdoc->parse, line, *pos, NULL);
                        return(ARGS_QWORD);
                }
 
                        return(ARGS_QWORD);
                }
 
@@ -587,7 +590,8 @@ args(struct mdoc *mdoc, int line, int *pos,
                        (*pos)++;
 
                if ('\0' == buf[*pos])
                        (*pos)++;
 
                if ('\0' == buf[*pos])
-                       mdoc_pmsg(mdoc, line, *pos, MANDOCERR_EOLNSPACE);
+                       mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse,
+                           line, *pos, NULL);
 
                return(ARGS_QWORD);
        }
 
                return(ARGS_QWORD);
        }
@@ -598,7 +602,7 @@ args(struct mdoc *mdoc, int line, int *pos,
        return(ARGS_WORD);
 }
 
        return(ARGS_WORD);
 }
 
-/* 
+/*
  * Check if the string consists only of space-separated closing
  * delimiters.  This is a bit of a dance: the first must be a close
  * delimiter, but it may be followed by middle delimiters.  Arbitrary
  * Check if the string consists only of space-separated closing
  * delimiters.  This is a bit of a dance: the first must be a close
  * delimiter, but it may be followed by middle delimiters.  Arbitrary
@@ -627,7 +631,7 @@ args_checkpunct(const char *buf, int i)
                i++;
 
        /* Remaining must NOT be open/none. */
                i++;
 
        /* Remaining must NOT be open/none. */
-       
+
        while (buf[i]) {
                j = 0;
                while (buf[i] && ' ' != buf[i] && j < DELIMSZ)
        while (buf[i]) {
                j = 0;
                while (buf[i] && ' ' != buf[i] && j < DELIMSZ)
@@ -649,7 +653,7 @@ args_checkpunct(const char *buf, int i)
 }
 
 static int
 }
 
 static int
-argv_multi(struct mdoc *mdoc, int line, 
+argv_multi(struct mdoc *mdoc, int line,
                struct mdoc_argv *v, int *pos, char *buf)
 {
        enum margserr    ac;
                struct mdoc_argv *v, int *pos, char *buf)
 {
        enum margserr    ac;
@@ -665,8 +669,8 @@ argv_multi(struct mdoc *mdoc, int line,
                        break;
 
                if (0 == v->sz % MULTI_STEP)
                        break;
 
                if (0 == v->sz % MULTI_STEP)
-                       v->value = mandoc_realloc(v->value, 
-                               (v->sz + MULTI_STEP) * sizeof(char *));
+                       v->value = mandoc_reallocarray(v->value,
+                           v->sz + MULTI_STEP, sizeof(char *));
 
                v->value[(int)v->sz] = mandoc_strdup(p);
        }
 
                v->value[(int)v->sz] = mandoc_strdup(p);
        }
@@ -675,7 +679,7 @@ argv_multi(struct mdoc *mdoc, int line,
 }
 
 static int
 }
 
 static int
-argv_single(struct mdoc *mdoc, int line, 
+argv_single(struct mdoc *mdoc, int line,
                struct mdoc_argv *v, int *pos, char *buf)
 {
        enum margserr    ac;
                struct mdoc_argv *v, int *pos, char *buf)
 {
        enum margserr    ac;