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

Annotation of mandoc/mdoc.h, Revision 1.105

1.104     kristaps    1: /*     $Id: mdoc.h,v 1.103 2010/08/20 01:02:07 schwarze Exp $ */
1.1       kristaps    2: /*
1.101     schwarze    3:  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
1.1       kristaps    4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
1.56      kristaps    6:  * purpose with or without fee is hereby granted, provided that the above
                      7:  * copyright notice and this permission notice appear in all copies.
1.1       kristaps    8:  *
1.56      kristaps    9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1.1       kristaps   16:  */
                     17: #ifndef MDOC_H
                     18: #define MDOC_H
                     19:
1.105   ! kristaps   20: /*
        !            21:  * What follows is a list of ALL possible macros.
        !            22:  */
        !            23: enum   mdoct {
        !            24:        MDOC_Ap = 0,
        !            25:        MDOC_Dd,
        !            26:        MDOC_Dt,
        !            27:        MDOC_Os,
        !            28:        MDOC_Sh,
        !            29:        MDOC_Ss,
        !            30:        MDOC_Pp,
        !            31:        MDOC_D1,
        !            32:        MDOC_Dl,
        !            33:        MDOC_Bd,
        !            34:        MDOC_Ed,
        !            35:        MDOC_Bl,
        !            36:        MDOC_El,
        !            37:        MDOC_It,
        !            38:        MDOC_Ad,
        !            39:        MDOC_An,
        !            40:        MDOC_Ar,
        !            41:        MDOC_Cd,
        !            42:        MDOC_Cm,
        !            43:        MDOC_Dv,
        !            44:        MDOC_Er,
        !            45:        MDOC_Ev,
        !            46:        MDOC_Ex,
        !            47:        MDOC_Fa,
        !            48:        MDOC_Fd,
        !            49:        MDOC_Fl,
        !            50:        MDOC_Fn,
        !            51:        MDOC_Ft,
        !            52:        MDOC_Ic,
        !            53:        MDOC_In,
        !            54:        MDOC_Li,
        !            55:        MDOC_Nd,
        !            56:        MDOC_Nm,
        !            57:        MDOC_Op,
        !            58:        MDOC_Ot,
        !            59:        MDOC_Pa,
        !            60:        MDOC_Rv,
        !            61:        MDOC_St,
        !            62:        MDOC_Va,
        !            63:        MDOC_Vt,
        !            64:        MDOC_Xr,
        !            65:        MDOC__A,
        !            66:        MDOC__B,
        !            67:        MDOC__D,
        !            68:        MDOC__I,
        !            69:        MDOC__J,
        !            70:        MDOC__N,
        !            71:        MDOC__O,
        !            72:        MDOC__P,
        !            73:        MDOC__R,
        !            74:        MDOC__T,
        !            75:        MDOC__V,
        !            76:        MDOC_Ac,
        !            77:        MDOC_Ao,
        !            78:        MDOC_Aq,
        !            79:        MDOC_At,
        !            80:        MDOC_Bc,
        !            81:        MDOC_Bf,
        !            82:        MDOC_Bo,
        !            83:        MDOC_Bq,
        !            84:        MDOC_Bsx,
        !            85:        MDOC_Bx,
        !            86:        MDOC_Db,
        !            87:        MDOC_Dc,
        !            88:        MDOC_Do,
        !            89:        MDOC_Dq,
        !            90:        MDOC_Ec,
        !            91:        MDOC_Ef,
        !            92:        MDOC_Em,
        !            93:        MDOC_Eo,
        !            94:        MDOC_Fx,
        !            95:        MDOC_Ms,
        !            96:        MDOC_No,
        !            97:        MDOC_Ns,
        !            98:        MDOC_Nx,
        !            99:        MDOC_Ox,
        !           100:        MDOC_Pc,
        !           101:        MDOC_Pf,
        !           102:        MDOC_Po,
        !           103:        MDOC_Pq,
        !           104:        MDOC_Qc,
        !           105:        MDOC_Ql,
        !           106:        MDOC_Qo,
        !           107:        MDOC_Qq,
        !           108:        MDOC_Re,
        !           109:        MDOC_Rs,
        !           110:        MDOC_Sc,
        !           111:        MDOC_So,
        !           112:        MDOC_Sq,
        !           113:        MDOC_Sm,
        !           114:        MDOC_Sx,
        !           115:        MDOC_Sy,
        !           116:        MDOC_Tn,
        !           117:        MDOC_Ux,
        !           118:        MDOC_Xc,
        !           119:        MDOC_Xo,
        !           120:        MDOC_Fo,
        !           121:        MDOC_Fc,
        !           122:        MDOC_Oo,
        !           123:        MDOC_Oc,
        !           124:        MDOC_Bk,
        !           125:        MDOC_Ek,
        !           126:        MDOC_Bt,
        !           127:        MDOC_Hf,
        !           128:        MDOC_Fr,
        !           129:        MDOC_Ud,
        !           130:        MDOC_Lb,
        !           131:        MDOC_Lp,
        !           132:        MDOC_Lk,
        !           133:        MDOC_Mt,
        !           134:        MDOC_Brq,
        !           135:        MDOC_Bro,
        !           136:        MDOC_Brc,
        !           137:        MDOC__C,
        !           138:        MDOC_Es,
        !           139:        MDOC_En,
        !           140:        MDOC_Dx,
        !           141:        MDOC__Q,
        !           142:        MDOC_br,
        !           143:        MDOC_sp,
        !           144:        MDOC__U,
        !           145:        MDOC_Ta,
        !           146:        MDOC_MAX
        !           147: };
        !           148:
        !           149: /*
        !           150:  * What follows is a list of ALL possible macro arguments.
        !           151:  */
        !           152: enum   mdocargt {
        !           153:        MDOC_Split,
        !           154:        MDOC_Nosplit,
        !           155:        MDOC_Ragged,
        !           156:        MDOC_Unfilled,
        !           157:        MDOC_Literal,
        !           158:        MDOC_File,
        !           159:        MDOC_Offset,
        !           160:        MDOC_Bullet,
        !           161:        MDOC_Dash,
        !           162:        MDOC_Hyphen,
        !           163:        MDOC_Item,
        !           164:        MDOC_Enum,
        !           165:        MDOC_Tag,
        !           166:        MDOC_Diag,
        !           167:        MDOC_Hang,
        !           168:        MDOC_Ohang,
        !           169:        MDOC_Inset,
        !           170:        MDOC_Column,
        !           171:        MDOC_Width,
        !           172:        MDOC_Compact,
        !           173:        MDOC_Std,
        !           174:        MDOC_Filled,
        !           175:        MDOC_Words,
        !           176:        MDOC_Emphasis,
        !           177:        MDOC_Symbolic,
        !           178:        MDOC_Nested,
        !           179:        MDOC_Centred,
        !           180:        MDOC_ARG_MAX
        !           181: };
        !           182:
        !           183: /*
        !           184:  * Type of a syntax node.
        !           185:  */
        !           186: enum   mdoc_type {
        !           187:        MDOC_TEXT,
        !           188:        MDOC_ELEM,
        !           189:        MDOC_HEAD,
        !           190:        MDOC_TAIL,
        !           191:        MDOC_BODY,
        !           192:        MDOC_BLOCK,
        !           193:        MDOC_ROOT
        !           194: };
        !           195:
        !           196: /*
        !           197:  * Section (named/unnamed) of `Sh'.   Note that these appear in the
        !           198:  * conventional order imposed by mdoc.7.
        !           199:  */
        !           200: enum   mdoc_sec {
        !           201:        SEC_NONE = 0, /* No section, yet. */
        !           202:        SEC_NAME,
        !           203:        SEC_LIBRARY,
        !           204:        SEC_SYNOPSIS,
        !           205:        SEC_DESCRIPTION,
        !           206:        SEC_IMPLEMENTATION,
        !           207:        SEC_RETURN_VALUES,
        !           208:        SEC_ENVIRONMENT,
        !           209:        SEC_FILES,
        !           210:        SEC_EXIT_STATUS,
        !           211:        SEC_EXAMPLES,
        !           212:        SEC_DIAGNOSTICS,
        !           213:        SEC_COMPATIBILITY,
        !           214:        SEC_ERRORS,
        !           215:        SEC_SEE_ALSO,
        !           216:        SEC_STANDARDS,
        !           217:        SEC_HISTORY,
        !           218:        SEC_AUTHORS,
        !           219:        SEC_CAVEATS,
        !           220:        SEC_BUGS,
        !           221:        SEC_SECURITY,
        !           222:        SEC_CUSTOM, /* User-defined. */
        !           223:        SEC__MAX
        !           224: };
        !           225:
        !           226: /*
        !           227:  * Information from prologue.
        !           228:  */
        !           229: struct mdoc_meta {
        !           230:        char             *msec; /* `Dt' section (1, 3p, etc.) */
        !           231:        char             *vol; /* `Dt' volume (implied) */
        !           232:        char             *arch; /* `Dt' arch (i386, etc.) */
        !           233:        time_t            date; /* `Dd' normalised date */
        !           234:        char             *title; /* `Dt' title (FOO, etc.) */
        !           235:        char             *os; /* `Os' system (OpenBSD, etc.) */
        !           236:        char             *name; /* leading `Nm' name */
        !           237: };
        !           238:
        !           239: /*
        !           240:  * An argument to a macro (multiple values = `-column xxx yyy').
        !           241:  */
        !           242: struct mdoc_argv {
        !           243:        enum mdocargt     arg; /* type of argument */
        !           244:        int               line;
        !           245:        int               pos;
        !           246:        size_t            sz; /* elements in "value" */
        !           247:        char            **value; /* argument strings */
        !           248: };
        !           249:
1.33      kristaps  250: /*
1.105   ! kristaps  251:  * Reference-counted macro arguments.  These are refcounted because
        !           252:  * blocks have multiple instances of the same arguments spread across
        !           253:  * the HEAD, BODY, TAIL, and BLOCK node types.
1.33      kristaps  254:  */
1.105   ! kristaps  255: struct         mdoc_arg {
        !           256:        size_t            argc;
        !           257:        struct mdoc_argv *argv;
        !           258:        unsigned int      refcnt;
        !           259: };
1.1       kristaps  260:
1.105   ! kristaps  261: /*
        !           262:  * Indicates that a BODY's formatting has ended, but the scope is still
        !           263:  * open.  Used for syntax-broken blocks.
        !           264:  */
        !           265: enum   mdoc_endbody {
        !           266:        ENDBODY_NOT = 0,
        !           267:        ENDBODY_SPACE, /* is broken: append a space */
        !           268:        ENDBODY_NOSPACE /* is broken: don't append a space */
        !           269: };
        !           270:
        !           271: /*
        !           272:  * Normalised `Bl' list type.
        !           273:  */
        !           274: enum   mdoc_list {
        !           275:        LIST__NONE = 0,
        !           276:        LIST_bullet,
        !           277:        LIST_column,
        !           278:        LIST_dash,
        !           279:        LIST_diag,
        !           280:        LIST_enum,
        !           281:        LIST_hang,
        !           282:        LIST_hyphen,
        !           283:        LIST_inset,
        !           284:        LIST_item,
        !           285:        LIST_ohang,
        !           286:        LIST_tag
        !           287: };
        !           288:
        !           289: /*
        !           290:  * Normalised `Bd' display type.
        !           291:  */
        !           292: enum   mdoc_disp {
        !           293:        DISP__NONE = 0,
        !           294:        DISP_centred,
        !           295:        DISP_ragged,
        !           296:        DISP_unfilled,
        !           297:        DISP_filled,
        !           298:        DISP_literal
        !           299: };
        !           300:
        !           301: /*
        !           302:  * Normalised `An' splitting argument.
        !           303:  */
        !           304: enum   mdoc_auth {
        !           305:        AUTH__NONE = 0,
        !           306:        AUTH_split,
        !           307:        AUTH_nosplit
        !           308: };
1.60      kristaps  309:
1.105   ! kristaps  310: /*
        !           311:  * Normalised `Bf' font type.
        !           312:  */
        !           313: enum   mdoc_font {
        !           314:        FONT__NONE = 0,
        !           315:        FONT_Em,
        !           316:        FONT_Li,
        !           317:        FONT_Sy
        !           318: };
        !           319:
        !           320: /*
        !           321:  * Normalised arguments for `Bd'.
        !           322:  */
        !           323: struct mdoc_bd {
        !           324:        const char       *offs; /* -offset */
        !           325:        enum mdoc_disp    type; /* -ragged, etc. */
        !           326:        int               comp; /* -compact */
        !           327: };
        !           328:
        !           329: /*
        !           330:  * Normalised arguments for `Bl'.
        !           331:  */
        !           332: struct mdoc_bl {
        !           333:        const char       *width; /* -width */
        !           334:        const char       *offs; /* -offset */
        !           335:        enum mdoc_list    type; /* -tag, -enum, etc. */
        !           336:        int               comp; /* -compact */
        !           337:        size_t            ncols; /* -column arg count */
        !           338:        const char      **cols; /* -column val ptr */
        !           339: };
        !           340:
        !           341: /*
        !           342:  * Normalised arguments for `Bf'.
        !           343:  */
        !           344: struct mdoc_bf {
        !           345:        enum mdoc_font    font; /* font */
        !           346: };
        !           347:
        !           348: /*
        !           349:  * Normalised arguments for `An'.
        !           350:  */
        !           351: struct mdoc_an {
        !           352:        enum mdoc_auth    auth; /* -split, etc. */
        !           353: };
        !           354:
        !           355: /*
        !           356:  * Consists of normalised node arguments.  These should be used instead
        !           357:  * of iterating through the mdoc_arg pointers of a node: defaults are
        !           358:  * provided, etc.
        !           359:  */
        !           360: union mdoc_data {
        !           361:        struct mdoc_an    An;
        !           362:        struct mdoc_bd   *Bd;
        !           363:        struct mdoc_bf   *Bf;
        !           364:        struct mdoc_bl   *Bl;
        !           365: };
        !           366:
        !           367: /*
        !           368:  * Single node in tree-linked AST.
        !           369:  */
        !           370: struct mdoc_node {
        !           371:        struct mdoc_node *parent; /* parent AST node */
        !           372:        struct mdoc_node *child; /* first child AST node */
        !           373:        struct mdoc_node *next; /* sibling AST node */
        !           374:        struct mdoc_node *prev; /* prior sibling AST node */
        !           375:        int               nchild; /* number children */
        !           376:        int               line; /* parse line */
        !           377:        int               pos; /* parse column */
        !           378:        enum mdoct        tok; /* tok or MDOC__MAX if none */
        !           379:        int               flags;
        !           380: #define        MDOC_VALID       (1 << 0) /* has been validated */
        !           381: #define        MDOC_ACTED       (1 << 1) /* has been acted upon */
        !           382: #define        MDOC_EOS         (1 << 2) /* at sentence boundary */
        !           383: #define        MDOC_LINE        (1 << 3) /* first macro/text on line */
        !           384: #define        MDOC_SYNPRETTY   (1 << 4) /* SYNOPSIS-style formatting */
        !           385: #define        MDOC_ENDED       (1 << 5) /* rendering has been ended */
        !           386:        enum mdoc_type    type; /* AST node type */
        !           387:        enum mdoc_sec     sec; /* current named section */
        !           388:        /* FIXME: these can be union'd to shave a few bytes. */
        !           389:        struct mdoc_arg  *args; /* BLOCK/ELEM */
        !           390:        struct mdoc_node *pending; /* BLOCK */
        !           391:        struct mdoc_node *head; /* BLOCK */
        !           392:        struct mdoc_node *body; /* BLOCK */
        !           393:        struct mdoc_node *tail; /* BLOCK */
        !           394:        char             *string; /* TEXT */
        !           395:        enum mdoc_endbody end; /* BODY */
        !           396:        union mdoc_data   data;
        !           397: };
        !           398:
        !           399: /*
        !           400:  * Names of macros.  Index is enum mdoct.  Indexing into this returns
        !           401:  * the normalised name, e.g., mdoc_macronames[MDOC_Sh] -> "Sh".
        !           402:  */
1.1       kristaps  403: extern const char *const *mdoc_macronames;
1.105   ! kristaps  404:
        !           405: /*
        !           406:  * Names of macro args.  Index is enum mdocargt.  Indexing into this
        !           407:  * returns the normalised name, e.g., mdoc_argnames[MDOC_File] ->
        !           408:  * "file".
        !           409:  */
1.1       kristaps  410: extern const char *const *mdoc_argnames;
                    411:
                    412: __BEGIN_DECLS
                    413:
                    414: struct mdoc;
1.60      kristaps  415:
1.1       kristaps  416: void             mdoc_free(struct mdoc *);
1.103     schwarze  417: struct mdoc     *mdoc_alloc(struct regset *, void *, mandocmsg);
1.73      kristaps  418: void             mdoc_reset(struct mdoc *);
1.93      kristaps  419: int              mdoc_parseln(struct mdoc *, int, char *, int);
1.32      kristaps  420: const struct mdoc_node *mdoc_node(const struct mdoc *);
                    421: const struct mdoc_meta *mdoc_meta(const struct mdoc *);
1.16      kristaps  422: int              mdoc_endparse(struct mdoc *);
1.1       kristaps  423:
                    424: __END_DECLS
                    425:
                    426: #endif /*!MDOC_H*/

CVSweb