[BACK]Return to prologue.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Annotation of mandoc/prologue.c, Revision 1.3

1.3     ! kristaps    1: /* $Id: prologue.c,v 1.2 2009/01/02 14:06:16 kristaps Exp $ */
1.1       kristaps    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>
1.2       kristaps   21: #ifdef __linux__
                     22: #include <time.h>
                     23: #endif
1.1       kristaps   24:
                     25: #include "private.h"
                     26:
1.3     ! kristaps   27: /* FIXME: deprecate into actions.c! */
        !            28:
1.1       kristaps   29: static int              prologue_dt(MACRO_PROT_ARGS);
                     30: static int              prologue_dd(MACRO_PROT_ARGS);
                     31: static int              prologue_os(MACRO_PROT_ARGS);
                     32:
                     33: static int
                     34: prologue_dt(MACRO_PROT_ARGS)
                     35: {
                     36:        int               lastarg, j;
                     37:        char             *args[MDOC_LINEARG_MAX];
                     38:
                     39:        if (SEC_PROLOGUE != mdoc->sec_lastn)
                     40:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
                     41:        if (0 == mdoc->meta.date)
                     42:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
                     43:        if (mdoc->meta.title[0])
                     44:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
                     45:
                     46:        j = -1;
                     47:        lastarg = ppos;
                     48:
                     49: again:
                     50:        if (j == MDOC_LINEARG_MAX)
                     51:                return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
                     52:
                     53:        lastarg = *pos;
                     54:
                     55:        switch (mdoc_args(mdoc, tok, pos, buf, 0, &args[++j])) {
                     56:        case (ARGS_EOLN):
                     57:                if (mdoc->meta.title)
                     58:                        return(1);
                     59:                if ( ! mdoc_warn(mdoc, tok, ppos, WARN_ARGS_GE1))
                     60:                        return(0);
                     61:                (void)xstrlcpy(mdoc->meta.title,
                     62:                                "UNTITLED", META_TITLE_SZ);
                     63:                return(1);
                     64:        case (ARGS_ERROR):
                     65:                return(0);
                     66:        default:
                     67:                break;
                     68:        }
                     69:
                     70:        if (MDOC_MAX != mdoc_find(mdoc, args[j]) && ! mdoc_warn
                     71:                        (mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE))
                     72:                return(0);
                     73:
                     74:        if (0 == j) {
                     75:                if (xstrlcpy(mdoc->meta.title, args[0], META_TITLE_SZ))
                     76:                        goto again;
                     77:                return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
                     78:
                     79:        } else if (1 == j) {
                     80:                mdoc->meta.msec = mdoc_atomsec(args[1]);
                     81:                if (MSEC_DEFAULT != mdoc->meta.msec)
                     82:                        goto again;
                     83:                return(mdoc_err(mdoc, tok, -1, ERR_SYNTAX_ARGFORM));
                     84:
                     85:        } else if (2 == j) {
                     86:                mdoc->meta.vol = mdoc_atovol(args[2]);
                     87:                if (VOL_DEFAULT != mdoc->meta.vol)
                     88:                        goto again;
                     89:                mdoc->meta.arch = mdoc_atoarch(args[2]);
                     90:                if (ARCH_DEFAULT != mdoc->meta.arch)
                     91:                        goto again;
                     92:                return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
                     93:        }
                     94:
                     95:        return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
                     96: }
                     97:
                     98:
                     99: static int
                    100: prologue_os(MACRO_PROT_ARGS)
                    101: {
                    102:        int               lastarg, j;
                    103:        char             *args[MDOC_LINEARG_MAX];
                    104:
                    105:        /* FIXME: if we use `Os' again... ? */
                    106:
                    107:        if (SEC_PROLOGUE != mdoc->sec_lastn)
                    108:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
                    109:        if (0 == mdoc->meta.title[0])
                    110:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
                    111:        if (mdoc->meta.os[0])
                    112:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
                    113:
                    114:        j = -1;
                    115:        lastarg = ppos;
                    116:
                    117: again:
                    118:        if (j == MDOC_LINEARG_MAX)
                    119:                return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
                    120:
                    121:        lastarg = *pos;
                    122:
                    123:        switch (mdoc_args(mdoc, tok, pos, buf,
                    124:                                ARGS_QUOTED, &args[++j])) {
                    125:        case (ARGS_EOLN):
                    126:                mdoc->sec_lastn = mdoc->sec_last = SEC_BODY;
                    127:                return(1);
                    128:        case (ARGS_ERROR):
                    129:                return(0);
                    130:        default:
                    131:                break;
                    132:        }
                    133:
                    134:        if ( ! xstrlcat(mdoc->meta.os, args[j], sizeof(mdoc->meta.os)))
                    135:                return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
                    136:        if ( ! xstrlcat(mdoc->meta.os, " ", sizeof(mdoc->meta.os)))
                    137:                return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
                    138:
                    139:        goto again;
                    140:        /* NOTREACHED */
                    141: }
                    142:
                    143:
                    144: static int
                    145: prologue_dd(MACRO_PROT_ARGS)
                    146: {
                    147:        int               lastarg, j;
                    148:        char             *args[MDOC_LINEARG_MAX], date[64];
                    149:
                    150:        if (SEC_PROLOGUE != mdoc->sec_lastn)
                    151:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
                    152:        if (mdoc->meta.title[0])
                    153:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
                    154:        if (mdoc->meta.date)
                    155:                return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
                    156:
                    157:        j = -1;
                    158:        date[0] = 0;
                    159:        lastarg = ppos;
                    160:
                    161: again:
                    162:        if (j == MDOC_LINEARG_MAX)
                    163:                return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
                    164:
                    165:        lastarg = *pos;
                    166:        switch (mdoc_args(mdoc, tok, pos, buf, 0, &args[++j])) {
                    167:        case (ARGS_EOLN):
                    168:                if (mdoc->meta.date)
                    169:                        return(1);
                    170:                mdoc->meta.date = mdoc_atotime(date);
                    171:                if (mdoc->meta.date)
                    172:                        return(1);
                    173:                return(mdoc_err(mdoc, tok, ppos, ERR_SYNTAX_ARGFORM));
                    174:        case (ARGS_ERROR):
                    175:                return(0);
                    176:        default:
                    177:                break;
                    178:        }
                    179:
                    180:        if (MDOC_MAX != mdoc_find(mdoc, args[j]) && ! mdoc_warn
                    181:                        (mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE))
                    182:                return(0);
                    183:
                    184:        if (0 == j) {
                    185:                if (xstrcmp("$Mdocdate$", args[j])) {
                    186:                        mdoc->meta.date = time(NULL);
                    187:                        goto again;
                    188:                } else if (xstrcmp("$Mdocdate:", args[j]))
                    189:                        goto again;
                    190:        } else if (4 == j)
                    191:                if ( ! xstrcmp("$", args[j]))
                    192:                        goto again;
                    193:
                    194:        if ( ! xstrlcat(date, args[j], sizeof(date)))
                    195:                return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
                    196:        if ( ! xstrlcat(date, " ", sizeof(date)))
                    197:                return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
                    198:
                    199:        goto again;
                    200:        /* NOTREACHED */
                    201: }
                    202:
                    203:
                    204: int
                    205: macro_prologue(MACRO_PROT_ARGS)
                    206: {
                    207:
                    208:        switch (tok) {
                    209:        case (MDOC_Dt):
                    210:                return(prologue_dt(mdoc, tok, ppos, pos, buf));
                    211:        case (MDOC_Dd):
                    212:                return(prologue_dd(mdoc, tok, ppos, pos, buf));
                    213:        case (MDOC_Os):
                    214:                return(prologue_os(mdoc, tok, ppos, pos, buf));
                    215:        default:
                    216:                break;
                    217:        }
                    218:
                    219:        abort();
                    220:        /* NOTREACHED */
                    221: }
                    222:

CVSweb