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

Annotation of mandoc/mdoc.h, Revision 1.34

1.34    ! kristaps    1: /* $Id: mdoc.h,v 1.33 2009/02/23 09:33:34 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: #ifndef MDOC_H
                     20: #define MDOC_H
                     21:
1.33      kristaps   22: /*
                     23:  * This library implements a validating scanner/parser for ``mdoc'' roff
                     24:  * macro documents, a.k.a. BSD manual page documents.  The mdoc.c file
                     25:  * drives the parser, while macro.c describes the macro ontologies.
                     26:  * validate.c pre- and post-validates parsed macros, and action.c
                     27:  * performs actions on parsed and validated macros.
                     28:  */
                     29:
1.22      kristaps   30: /* What follows is a list of ALL possible macros. */
                     31:
1.1       kristaps   32: #define        MDOC___          0
                     33: #define        MDOC_Dd          1
                     34: #define        MDOC_Dt          2
                     35: #define        MDOC_Os          3
                     36: #define        MDOC_Sh          4
                     37: #define        MDOC_Ss          5
                     38: #define        MDOC_Pp          6
                     39: #define        MDOC_D1          7
                     40: #define        MDOC_Dl          8
                     41: #define        MDOC_Bd          9
                     42: #define        MDOC_Ed          10
                     43: #define        MDOC_Bl          11
                     44: #define        MDOC_El          12
                     45: #define        MDOC_It          13
                     46: #define        MDOC_Ad          14
                     47: #define        MDOC_An          15
                     48: #define        MDOC_Ar          16
                     49: #define        MDOC_Cd          17
                     50: #define        MDOC_Cm          18
                     51: #define        MDOC_Dv          19
                     52: #define        MDOC_Er          20
                     53: #define        MDOC_Ev          21
                     54: #define        MDOC_Ex          22
                     55: #define        MDOC_Fa          23
                     56: #define        MDOC_Fd          24
                     57: #define        MDOC_Fl          25
                     58: #define        MDOC_Fn          26
                     59: #define        MDOC_Ft          27
                     60: #define        MDOC_Ic          28
                     61: #define        MDOC_In          29
                     62: #define        MDOC_Li          30
                     63: #define        MDOC_Nd          31
                     64: #define        MDOC_Nm          32
                     65: #define        MDOC_Op          33
                     66: #define        MDOC_Ot          34
                     67: #define        MDOC_Pa          35
                     68: #define        MDOC_Rv          36
                     69: #define        MDOC_St          37
                     70: #define        MDOC_Va          38
                     71: #define        MDOC_Vt          39
                     72: #define        MDOC_Xr          40
                     73: #define        MDOC__A          41
                     74: #define        MDOC__B          42
                     75: #define        MDOC__D          43
                     76: #define        MDOC__I          44
                     77: #define        MDOC__J          45
                     78: #define        MDOC__N          46
                     79: #define        MDOC__O          47
                     80: #define        MDOC__P          48
                     81: #define        MDOC__R          49
                     82: #define        MDOC__T          50
                     83: #define        MDOC__V          51
                     84: #define MDOC_Ac                 52
                     85: #define MDOC_Ao                 53
                     86: #define MDOC_Aq                 54
                     87: #define MDOC_At                 55
                     88: #define MDOC_Bc                 56
                     89: #define MDOC_Bf                 57
                     90: #define MDOC_Bo                 58
                     91: #define MDOC_Bq                 59
                     92: #define MDOC_Bsx        60
                     93: #define MDOC_Bx                 61
                     94: #define MDOC_Db                 62
                     95: #define MDOC_Dc                 63
                     96: #define MDOC_Do                 64
                     97: #define MDOC_Dq                 65
                     98: #define MDOC_Ec                 66
                     99: #define MDOC_Ef                 67
                    100: #define MDOC_Em                 68
                    101: #define MDOC_Eo                 69
                    102: #define MDOC_Fx                 70
                    103: #define MDOC_Ms                 71
                    104: #define MDOC_No                 72
                    105: #define MDOC_Ns                 73
                    106: #define MDOC_Nx                 74
                    107: #define MDOC_Ox                 75
                    108: #define MDOC_Pc                 76
                    109: #define MDOC_Pf                 77
                    110: #define MDOC_Po                 78
                    111: #define MDOC_Pq                 79
                    112: #define MDOC_Qc                 80
                    113: #define MDOC_Ql                 81
                    114: #define MDOC_Qo                 82
                    115: #define MDOC_Qq                 83
                    116: #define MDOC_Re                 84
                    117: #define MDOC_Rs                 85
                    118: #define MDOC_Sc                 86
                    119: #define MDOC_So                 87
                    120: #define MDOC_Sq                 88
                    121: #define MDOC_Sm                 89
                    122: #define MDOC_Sx                 90
                    123: #define MDOC_Sy                 91
                    124: #define MDOC_Tn                 92
                    125: #define MDOC_Ux                 93
                    126: #define MDOC_Xc                 94
                    127: #define MDOC_Xo                 95
                    128: #define        MDOC_Fo          96
                    129: #define        MDOC_Fc          97
                    130: #define        MDOC_Oo          98
                    131: #define        MDOC_Oc          99
                    132: #define        MDOC_Bk          100
                    133: #define        MDOC_Ek          101
                    134: #define        MDOC_Bt          102
                    135: #define        MDOC_Hf          103
                    136: #define        MDOC_Fr          104
                    137: #define        MDOC_Ud          105
                    138: #define        MDOC_MAX         106
                    139:
1.22      kristaps  140: /* What follows is a list of ALL possible macro arguments. */
                    141:
1.1       kristaps  142: #define        MDOC_Split       0
                    143: #define        MDOC_Nosplit     1
                    144: #define        MDOC_Ragged      2
                    145: #define        MDOC_Unfilled    3
                    146: #define        MDOC_Literal     4
                    147: #define        MDOC_File        5
                    148: #define        MDOC_Offset      6
                    149: #define        MDOC_Bullet      7
                    150: #define        MDOC_Dash        8
                    151: #define        MDOC_Hyphen      9
                    152: #define        MDOC_Item        10
                    153: #define        MDOC_Enum        11
                    154: #define        MDOC_Tag         12
                    155: #define        MDOC_Diag        13
                    156: #define        MDOC_Hang        14
                    157: #define        MDOC_Ohang       15
                    158: #define        MDOC_Inset       16
                    159: #define        MDOC_Column      17
                    160: #define        MDOC_Width       18
                    161: #define        MDOC_Compact     19
                    162: #define        MDOC_Std         20
                    163: #define MDOC_p1003_1_88         21
                    164: #define MDOC_p1003_1_90         22
                    165: #define MDOC_p1003_1_96         23
                    166: #define MDOC_p1003_1_2001 24
                    167: #define MDOC_p1003_1_2004 25
                    168: #define MDOC_p1003_1    26
                    169: #define MDOC_p1003_1b   27
                    170: #define MDOC_p1003_1b_93 28
                    171: #define MDOC_p1003_1c_95 29
                    172: #define MDOC_p1003_1g_2000 30
                    173: #define MDOC_p1003_2_92         31
                    174: #define MDOC_p1387_2_95         32
                    175: #define MDOC_p1003_2    33
                    176: #define MDOC_p1387_2    34
                    177: #define MDOC_isoC_90    35
                    178: #define MDOC_isoC_amd1  36
                    179: #define MDOC_isoC_tcor1         37
                    180: #define MDOC_isoC_tcor2         38
                    181: #define MDOC_isoC_99    39
                    182: #define MDOC_ansiC      40
                    183: #define MDOC_ansiC_89   41
                    184: #define MDOC_ansiC_99   42
                    185: #define MDOC_ieee754    43
                    186: #define MDOC_iso8802_3  44
                    187: #define MDOC_xpg3       45
                    188: #define MDOC_xpg4       46
                    189: #define MDOC_xpg4_2     47
                    190: #define MDOC_xpg4_3     48
                    191: #define MDOC_xbd5       49
                    192: #define MDOC_xcu5       50
                    193: #define MDOC_xsh5       51
                    194: #define MDOC_xns5       52
                    195: #define MDOC_xns5_2d2_0         53
                    196: #define MDOC_xcurses4_2         54
                    197: #define MDOC_susv2      55
                    198: #define MDOC_susv3      56
                    199: #define MDOC_svid4      57
                    200: #define        MDOC_Filled      58
                    201: #define        MDOC_Words       59
1.12      kristaps  202: #define        MDOC_Emphasis    60
                    203: #define        MDOC_Symbolic    61
                    204: #define        MDOC_ARG_MAX     62
1.1       kristaps  205:
1.29      kristaps  206: /* Warnings are either syntax or groff-compatibility. */
1.22      kristaps  207: enum   mdoc_warn {
1.29      kristaps  208:        WARN_SYNTAX,
                    209:        WARN_COMPAT
1.1       kristaps  210: };
                    211:
1.23      kristaps  212: /* Possible values for the `At' macro. */
1.8       kristaps  213: enum   mdoc_att {
                    214:        ATT_DEFAULT = 0,
                    215:        ATT_v1,
                    216:        ATT_v2,
                    217:        ATT_v3,
                    218:        ATT_v4,
                    219:        ATT_v5,
                    220:        ATT_v6,
                    221:        ATT_v7,
                    222:        ATT_32v,
                    223:        ATT_V1,
                    224:        ATT_V2,
                    225:        ATT_V3,
                    226:        ATT_V4
                    227: };
                    228:
1.23      kristaps  229: /* An argument to a macro (multiple values = `It -column'). */
1.1       kristaps  230: struct mdoc_arg {
                    231:        int               arg;
1.19      kristaps  232:        int               line;
                    233:        int               pos;
1.1       kristaps  234:        size_t            sz;
                    235:        char            **value;
                    236: };
                    237:
1.23      kristaps  238: /* Type of a syntax node. */
1.1       kristaps  239: enum   mdoc_type {
                    240:        MDOC_TEXT,
                    241:        MDOC_ELEM,
                    242:        MDOC_HEAD,
1.14      kristaps  243:        MDOC_TAIL,
1.1       kristaps  244:        MDOC_BODY,
1.18      kristaps  245:        MDOC_BLOCK,
                    246:        MDOC_ROOT
1.1       kristaps  247: };
                    248:
1.23      kristaps  249: /* Manual section. */
1.2       kristaps  250: enum   mdoc_msec {
1.3       kristaps  251:        MSEC_DEFAULT = 0,
1.2       kristaps  252:        MSEC_1,
                    253:        MSEC_2,
                    254:        MSEC_3,
                    255:        MSEC_3f,
                    256:        MSEC_3p,
                    257:        MSEC_4,
                    258:        MSEC_5,
                    259:        MSEC_6,
                    260:        MSEC_7,
                    261:        MSEC_8,
                    262:        MSEC_9,
                    263:        MSEC_X11,
                    264:        MSEC_X11R6,
                    265:        MSEC_local,
                    266:        MSEC_n,
                    267:        MSEC_unass,
                    268:        MSEC_draft,
1.3       kristaps  269:        MSEC_paper
1.2       kristaps  270: };
                    271:
1.23      kristaps  272: /* Section (named/unnamed) of `Ss'. */
1.2       kristaps  273: enum   mdoc_sec {
1.3       kristaps  274:        SEC_PROLOGUE = 0,
                    275:        SEC_BODY,
1.2       kristaps  276:        SEC_NAME,
                    277:        SEC_SYNOPSIS,
                    278:        SEC_DESCRIPTION,
                    279:        SEC_RETURN_VALUES,
                    280:        SEC_ENVIRONMENT,
                    281:        SEC_FILES,
                    282:        SEC_EXAMPLES,
                    283:        SEC_DIAGNOSTICS,
                    284:        SEC_ERRORS,
                    285:        SEC_SEE_ALSO,
                    286:        SEC_STANDARDS,
                    287:        SEC_HISTORY,
                    288:        SEC_AUTHORS,
                    289:        SEC_CAVEATS,
                    290:        SEC_BUGS,
                    291:        SEC_CUSTOM
                    292: };
                    293:
1.23      kristaps  294: /* Volume of `Dt'. */
1.2       kristaps  295: enum   mdoc_vol {
1.3       kristaps  296:        VOL_DEFAULT = 0,
1.2       kristaps  297:        VOL_AMD,
                    298:        VOL_IND,
                    299:        VOL_KM,
                    300:        VOL_LOCAL,
                    301:        VOL_PRM,
                    302:        VOL_PS1,
                    303:        VOL_SMM,
                    304:        VOL_URM,
1.3       kristaps  305:        VOL_USD
1.2       kristaps  306: };
                    307:
1.23      kristaps  308: /* Architecture of `Dt'. */
1.2       kristaps  309: enum   mdoc_arch {
1.3       kristaps  310:        ARCH_DEFAULT = 0,
1.2       kristaps  311:        ARCH_alpha,
                    312:        ARCH_amd64,
                    313:        ARCH_amiga,
                    314:        ARCH_arc,
1.23      kristaps  315:        ARCH_arm,
1.2       kristaps  316:        ARCH_armish,
                    317:        ARCH_aviion,
                    318:        ARCH_hp300,
                    319:        ARCH_hppa,
                    320:        ARCH_hppa64,
                    321:        ARCH_i386,
                    322:        ARCH_landisk,
                    323:        ARCH_luna88k,
                    324:        ARCH_mac68k,
                    325:        ARCH_macppc,
                    326:        ARCH_mvme68k,
                    327:        ARCH_mvme88k,
                    328:        ARCH_mvmeppc,
                    329:        ARCH_pmax,
                    330:        ARCH_sgi,
                    331:        ARCH_socppc,
                    332:        ARCH_sparc,
                    333:        ARCH_sparc64,
                    334:        ARCH_sun3,
                    335:        ARCH_vax,
1.3       kristaps  336:        ARCH_zaurus
1.2       kristaps  337: };
                    338:
1.29      kristaps  339: /* Information from prologue. */
1.2       kristaps  340: struct mdoc_meta {
                    341:        enum mdoc_msec    msec;
                    342:        enum mdoc_vol     vol;
                    343:        enum mdoc_arch    arch;
1.3       kristaps  344:        time_t            date;
1.25      kristaps  345:        char             *title;
                    346:        char             *os;
                    347:        char             *name;
1.2       kristaps  348: };
                    349:
1.29      kristaps  350: /* Text-only node. */
1.1       kristaps  351: struct mdoc_text {
                    352:        char             *string;
                    353: };
                    354:
1.29      kristaps  355: /* Block (scoped) node. */
1.1       kristaps  356: struct mdoc_block {
                    357:        size_t            argc;
                    358:        struct mdoc_arg  *argv;
1.20      kristaps  359:        struct mdoc_node *head;
                    360:        struct mdoc_node *body;
                    361:        struct mdoc_node *tail;
1.1       kristaps  362: };
                    363:
1.29      kristaps  364: /* In-line element node. */
1.1       kristaps  365: struct mdoc_elem {
                    366:        size_t            argc;
                    367:        struct mdoc_arg  *argv;
                    368: };
                    369:
1.29      kristaps  370: /* Typed nodes of an AST node. */
1.1       kristaps  371: union  mdoc_data {
                    372:        struct mdoc_text  text;
                    373:        struct mdoc_elem  elem;
                    374:        struct mdoc_block block;
                    375: };
                    376:
1.29      kristaps  377: /* Node in AST. */
1.1       kristaps  378: struct mdoc_node {
                    379:        struct mdoc_node *parent;
                    380:        struct mdoc_node *child;
                    381:        struct mdoc_node *next;
1.5       kristaps  382:        struct mdoc_node *prev;
1.16      kristaps  383:        int               line;
                    384:        int               pos;
1.20      kristaps  385:        int               tok;
1.26      kristaps  386:        int               flags;
                    387: #define        MDOC_VALID       (1 << 0)
                    388: #define        MDOC_ACTED       (1 << 1)
1.1       kristaps  389:        enum mdoc_type    type;
                    390:        union mdoc_data   data;
1.31      kristaps  391:        enum mdoc_sec     sec;
1.1       kristaps  392: };
                    393:
1.23      kristaps  394: /* Call-backs for parse messages. */
1.1       kristaps  395: struct mdoc_cb {
1.17      kristaps  396:        void    (*mdoc_msg)(void *, int, int, const char *);
1.22      kristaps  397:        int     (*mdoc_err)(void *, int, int, const char *);
                    398:        int     (*mdoc_warn)(void *, int, int,
                    399:                        enum mdoc_warn, const char *);
1.1       kristaps  400: };
                    401:
1.29      kristaps  402: /* Global table of macro names (`Bd', `Ed', etc.). */
1.1       kristaps  403: extern const char *const *mdoc_macronames;
1.29      kristaps  404:
                    405: /* Global table of argument names (`column', `tag', etc.). */
1.1       kristaps  406: extern const char *const *mdoc_argnames;
                    407:
                    408: __BEGIN_DECLS
                    409:
                    410: struct mdoc;
                    411:
1.23      kristaps  412: /* Free memory allocated with mdoc_alloc. */
1.1       kristaps  413: void             mdoc_free(struct mdoc *);
1.23      kristaps  414:
                    415: /* Allocate a new parser instance. */
1.1       kristaps  416: struct mdoc     *mdoc_alloc(void *data, const struct mdoc_cb *);
1.23      kristaps  417:
1.29      kristaps  418: /* Parse a single line in a stream (boolean retval). */
1.16      kristaps  419: int              mdoc_parseln(struct mdoc *, int, char *buf);
1.23      kristaps  420:
1.29      kristaps  421: /* Get result first node (after mdoc_endparse!). */
1.32      kristaps  422: const struct mdoc_node *mdoc_node(const struct mdoc *);
1.27      kristaps  423:
1.29      kristaps  424: /* Get result meta-information (after mdoc_endparse!). */
1.32      kristaps  425: const struct mdoc_meta *mdoc_meta(const struct mdoc *);
1.23      kristaps  426:
                    427: /* Signal end of parse sequence (boolean retval). */
1.16      kristaps  428: int              mdoc_endparse(struct mdoc *);
1.1       kristaps  429:
1.33      kristaps  430: /* The following are utility functions. */
1.30      kristaps  431: const char      *mdoc_arch2a(enum mdoc_arch);
                    432: const char      *mdoc_vol2a(enum mdoc_vol);
                    433: const char      *mdoc_msec2a(enum mdoc_msec);
                    434: int              mdoc_isdelim(const char *);
                    435:
1.1       kristaps  436: __END_DECLS
                    437:
                    438: #endif /*!MDOC_H*/

CVSweb