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

Annotation of mandoc/prologue.c, Revision 1.2

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

CVSweb