Annotation of mandoc/prologue.c, Revision 1.1
1.1 ! kristaps 1: /* $Id: macro.c,v 1.15 2008/12/30 19:06:03 kristaps Exp $ */
! 2: /*
! 3: * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
! 4: *
! 5: * Permission to use, copy, modify, and distribute this software for any
! 6: * purpose with or without fee is hereby granted, provided that the
! 7: * above copyright notice and this permission notice appear in all
! 8: * copies.
! 9: *
! 10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
! 11: * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
! 12: * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
! 13: * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
! 14: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
! 15: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
! 16: * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
! 17: * PERFORMANCE OF THIS SOFTWARE.
! 18: */
! 19: #include <assert.h>
! 20: #include <stdlib.h>
! 21:
! 22: #include "private.h"
! 23:
! 24: static int prologue_dt(MACRO_PROT_ARGS);
! 25: static int prologue_dd(MACRO_PROT_ARGS);
! 26: static int prologue_os(MACRO_PROT_ARGS);
! 27:
! 28: static int
! 29: prologue_dt(MACRO_PROT_ARGS)
! 30: {
! 31: int lastarg, j;
! 32: char *args[MDOC_LINEARG_MAX];
! 33:
! 34: if (SEC_PROLOGUE != mdoc->sec_lastn)
! 35: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
! 36: if (0 == mdoc->meta.date)
! 37: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
! 38: if (mdoc->meta.title[0])
! 39: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
! 40:
! 41: j = -1;
! 42: lastarg = ppos;
! 43:
! 44: again:
! 45: if (j == MDOC_LINEARG_MAX)
! 46: return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
! 47:
! 48: lastarg = *pos;
! 49:
! 50: switch (mdoc_args(mdoc, tok, pos, buf, 0, &args[++j])) {
! 51: case (ARGS_EOLN):
! 52: if (mdoc->meta.title)
! 53: return(1);
! 54: if ( ! mdoc_warn(mdoc, tok, ppos, WARN_ARGS_GE1))
! 55: return(0);
! 56: (void)xstrlcpy(mdoc->meta.title,
! 57: "UNTITLED", META_TITLE_SZ);
! 58: return(1);
! 59: case (ARGS_ERROR):
! 60: return(0);
! 61: default:
! 62: break;
! 63: }
! 64:
! 65: if (MDOC_MAX != mdoc_find(mdoc, args[j]) && ! mdoc_warn
! 66: (mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE))
! 67: return(0);
! 68:
! 69: if (0 == j) {
! 70: if (xstrlcpy(mdoc->meta.title, args[0], META_TITLE_SZ))
! 71: goto again;
! 72: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
! 73:
! 74: } else if (1 == j) {
! 75: mdoc->meta.msec = mdoc_atomsec(args[1]);
! 76: if (MSEC_DEFAULT != mdoc->meta.msec)
! 77: goto again;
! 78: return(mdoc_err(mdoc, tok, -1, ERR_SYNTAX_ARGFORM));
! 79:
! 80: } else if (2 == j) {
! 81: mdoc->meta.vol = mdoc_atovol(args[2]);
! 82: if (VOL_DEFAULT != mdoc->meta.vol)
! 83: goto again;
! 84: mdoc->meta.arch = mdoc_atoarch(args[2]);
! 85: if (ARCH_DEFAULT != mdoc->meta.arch)
! 86: goto again;
! 87: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
! 88: }
! 89:
! 90: return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
! 91: }
! 92:
! 93:
! 94: static int
! 95: prologue_os(MACRO_PROT_ARGS)
! 96: {
! 97: int lastarg, j;
! 98: char *args[MDOC_LINEARG_MAX];
! 99:
! 100: /* FIXME: if we use `Os' again... ? */
! 101:
! 102: if (SEC_PROLOGUE != mdoc->sec_lastn)
! 103: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
! 104: if (0 == mdoc->meta.title[0])
! 105: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
! 106: if (mdoc->meta.os[0])
! 107: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
! 108:
! 109: j = -1;
! 110: lastarg = ppos;
! 111:
! 112: again:
! 113: if (j == MDOC_LINEARG_MAX)
! 114: return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
! 115:
! 116: lastarg = *pos;
! 117:
! 118: switch (mdoc_args(mdoc, tok, pos, buf,
! 119: ARGS_QUOTED, &args[++j])) {
! 120: case (ARGS_EOLN):
! 121: mdoc->sec_lastn = mdoc->sec_last = SEC_BODY;
! 122: return(1);
! 123: case (ARGS_ERROR):
! 124: return(0);
! 125: default:
! 126: break;
! 127: }
! 128:
! 129: if ( ! xstrlcat(mdoc->meta.os, args[j], sizeof(mdoc->meta.os)))
! 130: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
! 131: if ( ! xstrlcat(mdoc->meta.os, " ", sizeof(mdoc->meta.os)))
! 132: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
! 133:
! 134: goto again;
! 135: /* NOTREACHED */
! 136: }
! 137:
! 138:
! 139: static int
! 140: prologue_dd(MACRO_PROT_ARGS)
! 141: {
! 142: int lastarg, j;
! 143: char *args[MDOC_LINEARG_MAX], date[64];
! 144:
! 145: if (SEC_PROLOGUE != mdoc->sec_lastn)
! 146: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
! 147: if (mdoc->meta.title[0])
! 148: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
! 149: if (mdoc->meta.date)
! 150: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
! 151:
! 152: j = -1;
! 153: date[0] = 0;
! 154: lastarg = ppos;
! 155:
! 156: again:
! 157: if (j == MDOC_LINEARG_MAX)
! 158: return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
! 159:
! 160: lastarg = *pos;
! 161: switch (mdoc_args(mdoc, tok, pos, buf, 0, &args[++j])) {
! 162: case (ARGS_EOLN):
! 163: if (mdoc->meta.date)
! 164: return(1);
! 165: mdoc->meta.date = mdoc_atotime(date);
! 166: if (mdoc->meta.date)
! 167: return(1);
! 168: return(mdoc_err(mdoc, tok, ppos, ERR_SYNTAX_ARGFORM));
! 169: case (ARGS_ERROR):
! 170: return(0);
! 171: default:
! 172: break;
! 173: }
! 174:
! 175: if (MDOC_MAX != mdoc_find(mdoc, args[j]) && ! mdoc_warn
! 176: (mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE))
! 177: return(0);
! 178:
! 179: if (0 == j) {
! 180: if (xstrcmp("$Mdocdate$", args[j])) {
! 181: mdoc->meta.date = time(NULL);
! 182: goto again;
! 183: } else if (xstrcmp("$Mdocdate:", args[j]))
! 184: goto again;
! 185: } else if (4 == j)
! 186: if ( ! xstrcmp("$", args[j]))
! 187: goto again;
! 188:
! 189: if ( ! xstrlcat(date, args[j], sizeof(date)))
! 190: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
! 191: if ( ! xstrlcat(date, " ", sizeof(date)))
! 192: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
! 193:
! 194: goto again;
! 195: /* NOTREACHED */
! 196: }
! 197:
! 198:
! 199: int
! 200: macro_prologue(MACRO_PROT_ARGS)
! 201: {
! 202:
! 203: switch (tok) {
! 204: case (MDOC_Dt):
! 205: return(prologue_dt(mdoc, tok, ppos, pos, buf));
! 206: case (MDOC_Dd):
! 207: return(prologue_dd(mdoc, tok, ppos, pos, buf));
! 208: case (MDOC_Os):
! 209: return(prologue_os(mdoc, tok, ppos, pos, buf));
! 210: default:
! 211: break;
! 212: }
! 213:
! 214: abort();
! 215: /* NOTREACHED */
! 216: }
! 217:
CVSweb