371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov/* $Id: mdoc_argv.c,v 1.107 2015/10/17 00:21:07 schwarze Exp $ */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore/*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * Copyright (c) 2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore *
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Permission to use, copy, modify, and distribute this software for any
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * purpose with or without fee is hereby granted, provided that the above
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * copyright notice and this permission notice appear in all copies.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore *
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include "config.h"
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <sys/types.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <assert.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <stdlib.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <stdio.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <string.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov#include "mandoc_aux.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "mandoc.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "roff.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "mdoc.h"
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include "libmandoc.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "libmdoc.h"
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#define MULTI_STEP 5 /* pre-allocate argument values */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov#define DELIMSZ 6 /* max possible size of a delimiter */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoreenum argsflag {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGSFL_NONE = 0,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGSFL_DELIM, /* handle delimiters of [[::delim::][ ]+]+ */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGSFL_TABSEP /* handle tab/`Ta' separated phrases */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoreenum argvflag {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* no args to flag (e.g., -split) */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_SINGLE, /* one arg to flag (e.g., -file xxx) */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore ARGV_MULTI /* multiple args (e.g., -column xxx yyy) */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestruct mdocarg {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore enum argsflag flags;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore const enum mdocargt *argvs;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic void argn_free(struct mdoc_arg *, int);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic enum margserr args(struct roff_man *, int, int *,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore char *, enum argsflag, char **);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic int args_checkpunct(const char *, int);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void argv_multi(struct roff_man *, int,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore struct mdoc_argv *, int *, char *);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void argv_single(struct roff_man *, int,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore struct mdoc_argv *, int *, char *);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const enum argvflag argvflags[MDOC_ARG_MAX] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Split */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Nosplit */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Ragged */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Unfilled */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Literal */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_SINGLE, /* MDOC_File */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore ARGV_SINGLE, /* MDOC_Offset */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Bullet */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Dash */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Hyphen */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Item */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Enum */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Tag */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Diag */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Hang */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Ohang */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Inset */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_MULTI, /* MDOC_Column */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore ARGV_SINGLE, /* MDOC_Width */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Compact */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Std */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Filled */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Words */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Emphasis */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE, /* MDOC_Symbolic */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ARGV_NONE /* MDOC_Symbolic */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const enum mdocargt args_Ex[] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Std,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_ARG_MAX
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const enum mdocargt args_An[] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Split,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Nosplit,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_ARG_MAX
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const enum mdocargt args_Bd[] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Ragged,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Unfilled,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Filled,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Literal,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_File,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Offset,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Compact,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Centred,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_ARG_MAX
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const enum mdocargt args_Bf[] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Emphasis,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Literal,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Symbolic,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_ARG_MAX
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const enum mdocargt args_Bk[] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Words,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_ARG_MAX
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const enum mdocargt args_Bl[] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Bullet,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Dash,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Hyphen,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Item,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Enum,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Tag,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Diag,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Hang,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Ohang,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Inset,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Column,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Width,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Offset,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Compact,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_Nested,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC_ARG_MAX
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const struct mdocarg mdocargs[MDOC_MAX] = {
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ap */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Dd */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Dt */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Os */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Sh */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_NONE, NULL }, /* Ss */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_NONE, NULL }, /* Pp */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* D1 */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Dl */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, args_Bd }, /* Bd */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Ed */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, args_Bl }, /* Bl */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* El */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* It */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Ad */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, args_An }, /* An */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ar */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Cd */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Cm */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Dv */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Er */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Ev */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, args_Ex }, /* Ex */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Fa */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_NONE, NULL }, /* Fd */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Fl */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Fn */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Ft */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Ic */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* In */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Li */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_NONE, NULL }, /* Nd */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Nm */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Op */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Ot */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Pa */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, args_Ex }, /* Rv */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* St */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Va */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Vt */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Xr */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %A */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %B */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %D */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %I */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %J */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %N */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %O */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %P */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %R */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %T */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %V */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ac */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Ao */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Aq */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* At */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Bc */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_NONE, args_Bf }, /* Bf */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Bo */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Bq */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Bsx */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Bx */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Db */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Dc */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Do */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Dq */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ec */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Ef */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Em */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Eo */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Fx */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ms */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* No */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ns */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Nx */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ox */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Pc */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Pf */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Po */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Pq */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Qc */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ql */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Qo */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Qq */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Re */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Rs */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Sc */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* So */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Sq */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Sm */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Sx */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Sy */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Tn */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Ux */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Xc */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Xo */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_NONE, NULL }, /* Fo */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Fc */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Oo */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Oc */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, args_Bk }, /* Bk */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Ek */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Bt */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Hf */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* Fr */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Ud */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Lb */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Lp */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Lk */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Mt */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Brq */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Bro */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Brc */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %C */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Es */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_DELIM, NULL }, /* En */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore { ARGSFL_DELIM, NULL }, /* Dx */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %Q */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* br */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* sp */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* %U */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore { ARGSFL_NONE, NULL }, /* Ta */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov { ARGSFL_NONE, NULL }, /* ll */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore/*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * Parse flags and their arguments from the input line.
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * These come in the form -flag [argument ...].
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * Some flags take no argument, some one, some multiple.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovvoid
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovmdoc_argv(struct roff_man *mdoc, int line, int tok,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov struct mdoc_arg **reta, int *pos, char *buf)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov struct mdoc_argv tmpv;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov struct mdoc_argv **retv;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov const enum mdocargt *argtable;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov char *argname;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov int ipos, retc;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov char savechar;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov *reta = NULL;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Which flags does this macro support? */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argtable = mdocargs[tok].argvs;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (argtable == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Loop over the flags on the input line. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov ipos = *pos;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov while (buf[ipos] == '-') {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Seek to the first unescaped space. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (argname = buf + ++ipos; buf[ipos] != '\0'; ipos++)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (buf[ipos] == ' ' && buf[ipos - 1] != '\\')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * We want to nil-terminate the word to look it up.
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * But we may not have a flag, in which case we need
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * to restore the line as-is. So keep around the
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * stray byte, which we'll reset upon exiting.
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ((savechar = buf[ipos]) != '\0')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov buf[ipos++] = '\0';
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * Now look up the word as a flag. Use temporary
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * storage that we'll copy into the node's flags.
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov while ((tmpv.arg = *argtable++) != MDOC_ARG_MAX)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ( ! strcmp(argname, mdoc_argnames[tmpv.arg]))
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* If it isn't a flag, restore the saved byte. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (tmpv.arg == MDOC_ARG_MAX) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (savechar != '\0')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov buf[ipos - 1] = savechar;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Read to the next word (the first argument). */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov while (buf[ipos] == ' ')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov ipos++;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Parse the arguments of the flag. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov tmpv.line = line;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov tmpv.pos = *pos;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov tmpv.sz = 0;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov tmpv.value = NULL;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov switch (argvflags[tmpv.arg]) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case ARGV_SINGLE:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv_single(mdoc, line, &tmpv, &ipos, buf);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case ARGV_MULTI:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv_multi(mdoc, line, &tmpv, &ipos, buf);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case ARGV_NONE:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Append to the return values. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (*reta == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov *reta = mandoc_calloc(1, sizeof(**reta));
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov retc = ++(*reta)->argc;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov retv = &(*reta)->argv;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov *retv = mandoc_reallocarray(*retv, retc, sizeof(**retv));
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov memcpy(*retv + retc - 1, &tmpv, sizeof(**retv));
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Prepare for parsing the next flag. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov *pos = ipos;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argtable = mdocargs[tok].argvs;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorevoid
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoremdoc_argv_free(struct mdoc_arg *p)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int i;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (NULL == p)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (p->refcnt) {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore --(p->refcnt);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (p->refcnt)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore assert(p->argc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (i = (int)p->argc - 1; i >= 0; i--)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore argn_free(p, i);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore free(p->argv);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore free(p);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoreargn_free(struct mdoc_arg *p, int iarg)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore struct mdoc_argv *arg;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int j;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore arg = &p->argv[iarg];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (arg->sz && arg->value) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (j = (int)arg->sz - 1; j >= 0; j--)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore free(arg->value[j]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore free(arg->value);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (--p->argc; iarg < (int)p->argc; iarg++)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore p->argv[iarg] = p->argv[iarg+1];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoreenum margserr
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovmdoc_args(struct roff_man *mdoc, int line, int *pos,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov char *buf, int tok, char **v)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov char *v_local;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov enum argsflag fl;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (v == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov v = &v_local;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov fl = tok == TOKEN_NONE ? ARGSFL_NONE : mdocargs[tok].flags;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (tok != MDOC_It)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return args(mdoc, line, pos, buf, fl, v);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * We know that we're in an `It', so it's reasonable to expect
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * us to be sitting in a `Bl'. Someday this may not be the case
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * (if we allow random `It's sitting out there), so provide a
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * safe fall-back into the default behaviour.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore for (n = mdoc->last; n; n = n->parent)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (MDOC_Bl == n->tok)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (LIST_column == n->norm->Bl.type) {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore fl = ARGSFL_TABSEP;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return args(mdoc, line, pos, buf, fl, v);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic enum margserr
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovargs(struct roff_man *mdoc, int line, int *pos,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore char *buf, enum argsflag fl, char **v)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov char *p;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore int pairs;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (buf[*pos] == '\0') {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->flags & MDOC_PHRASELIT &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov ! (mdoc->flags & MDOC_PHRASE)) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_ARG_QUOTE,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, line, *pos, NULL);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags &= ~MDOC_PHRASELIT;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return ARGS_EOLN;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov *v = buf + *pos;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (fl == ARGSFL_DELIM && args_checkpunct(buf, *pos))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return ARGS_PUNCT;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * Tabs in `It' lines in `Bl -column' can't be escaped.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * Phrases are reparsed for `Ta' and other macros later.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (fl == ARGSFL_TABSEP) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((p = strchr(*v, '\t')) != NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov /*
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * Words right before and right after
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * tab characters are not parsed,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * unless there is a blank in between.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (p[-1] != ' ')
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags |= MDOC_PHRASEQL;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (p[1] != ' ')
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags |= MDOC_PHRASEQN;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov /*
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * One or more blanks after a tab cause
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * one leading blank in the next column.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * So skip all but one of them.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov *pos += (int)(p - *v) + 1;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov while (buf[*pos] == ' ' && buf[*pos + 1] == ' ')
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov (*pos)++;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov /*
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * A tab at the end of an input line
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * switches to the next column.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (buf[*pos] == '\0' || buf[*pos + 1] == '\0')
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags |= MDOC_PHRASEQN;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore } else {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov p = strchr(*v, '\0');
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (p[-1] == ' ')
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_SPACE_EOL,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->parse, line, *pos, NULL);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov *pos += (int)(p - *v);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov /* Skip any trailing blank characters. */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov while (p > *v && p[-1] == ' ' &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov (p - 1 == *v || p[-2] != '\\'))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov p--;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov *p = '\0';
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return ARGS_PHRASE;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Process a quoted literal. A quote begins with a double-quote
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * and ends with a double-quote NOT preceded by a double-quote.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * NUL-terminate the literal in place.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * Collapse pairs of quotes inside quoted literals.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Whitespace is NOT involved in literal termination.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->flags & MDOC_PHRASELIT || buf[*pos] == '\"') {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ( ! (mdoc->flags & MDOC_PHRASELIT))
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore *v = &buf[++(*pos)];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->flags & MDOC_PHRASE)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore mdoc->flags |= MDOC_PHRASELIT;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore pairs = 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for ( ; buf[*pos]; (*pos)++) {
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore /* Move following text left after quoted quotes. */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore if (pairs)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore buf[*pos - pairs] = buf[*pos];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if ('\"' != buf[*pos])
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore continue;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore /* Unquoted quotes end quoted args. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if ('\"' != buf[*pos + 1])
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore /* Quoted quotes collapse. */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore pairs++;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore (*pos)++;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore if (pairs)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore buf[*pos - pairs] = '\0';
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (buf[*pos] == '\0') {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ( ! (mdoc->flags & MDOC_PHRASE))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_ARG_QUOTE,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->parse, line, *pos, NULL);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return ARGS_QWORD;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore mdoc->flags &= ~MDOC_PHRASELIT;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore buf[(*pos)++] = '\0';
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if ('\0' == buf[*pos])
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return ARGS_QWORD;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore while (' ' == buf[*pos])
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore (*pos)++;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if ('\0' == buf[*pos])
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov line, *pos, NULL);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return ARGS_QWORD;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore p = &buf[*pos];
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore *v = mandoc_getarg(mdoc->parse, &p, line, pos);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov /*
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * After parsing the last word in this phrase,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * tell lookup() whether or not to interpret it.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (*p == '\0' && mdoc->flags & MDOC_PHRASEQL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags &= ~MDOC_PHRASEQL;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags |= MDOC_PHRASEQF;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return ARGS_WORD;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov/*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Check if the string consists only of space-separated closing
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * delimiters. This is a bit of a dance: the first must be a close
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * delimiter, but it may be followed by middle delimiters. Arbitrary
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * whitespace may separate these tokens.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic int
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoreargs_checkpunct(const char *buf, int i)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int j;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore char dbuf[DELIMSZ];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore enum mdelim d;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* First token must be a close-delimiter. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (j = 0; buf[i] && ' ' != buf[i] && j < DELIMSZ; j++, i++)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dbuf[j] = buf[i];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (DELIMSZ == j)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dbuf[j] = '\0';
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (DELIM_CLOSE != mdoc_isdelim(dbuf))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore while (' ' == buf[i])
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore i++;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Remaining must NOT be open/none. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore while (buf[i]) {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore j = 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore while (buf[i] && ' ' != buf[i] && j < DELIMSZ)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dbuf[j++] = buf[i++];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (DELIMSZ == j)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dbuf[j] = '\0';
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore d = mdoc_isdelim(dbuf);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (DELIM_NONE == d || DELIM_OPEN == d)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore while (' ' == buf[i])
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore i++;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return '\0' == buf[i];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovargv_multi(struct roff_man *mdoc, int line,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore struct mdoc_argv *v, int *pos, char *buf)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore enum margserr ac;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore char *p;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (v->sz = 0; ; v->sz++) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (buf[*pos] == '-')
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore ac = args(mdoc, line, pos, buf, ARGSFL_NONE, &p);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (ac == ARGS_EOLN)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (v->sz % MULTI_STEP == 0)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov v->value = mandoc_reallocarray(v->value,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov v->sz + MULTI_STEP, sizeof(char *));
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore v->value[(int)v->sz] = mandoc_strdup(p);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovargv_single(struct roff_man *mdoc, int line,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore struct mdoc_argv *v, int *pos, char *buf)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore enum margserr ac;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore char *p;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore ac = args(mdoc, line, pos, buf, ARGSFL_NONE, &p);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (ac == ARGS_EOLN)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore v->sz = 1;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore v->value = mandoc_malloc(sizeof(char *));
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore v->value[0] = mandoc_strdup(p);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}