=================================================================== RCS file: /cvs/mandoc/Attic/private.h,v retrieving revision 1.13 retrieving revision 1.78 diff -u -p -r1.13 -r1.78 --- mandoc/Attic/private.h 2008/11/27 17:27:50 1.13 +++ mandoc/Attic/private.h 2009/02/22 14:31:08 1.78 @@ -1,4 +1,4 @@ -/* $Id: private.h,v 1.13 2008/11/27 17:27:50 kristaps Exp $ */ +/* $Id: private.h,v 1.78 2009/02/22 14:31:08 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -19,236 +19,161 @@ #ifndef PRIVATE_H #define PRIVATE_H -/* Input buffer (input read into buffer, then filled when empty). */ -struct md_rbuf { - int fd; /* Open descriptor. */ - char *name; /* Name of file. */ - char *buf; /* Buffer. */ - size_t bufsz; /* Size of buffer. */ - size_t line; /* Current line number. */ +#include "mdoc.h" + +enum mdoc_next { + MDOC_NEXT_SIBLING = 0, + MDOC_NEXT_CHILD }; -/* Output buffer (output buffered until full, then flushed). */ -struct md_mbuf { - int fd; /* Open descriptor. */ - char *name; /* Name of file. */ - char *buf; /* Buffer. */ - size_t bufsz; /* Size of buffer. */ - size_t pos; /* Position in buffer. */ +struct mdoc { + void *data; + struct mdoc_cb cb; + void *htab; + int linetok; + int flags; +#define MDOC_HALT (1 << 0) + enum mdoc_next next; + struct mdoc_node *last; + struct mdoc_node *first; + struct mdoc_meta meta; + enum mdoc_sec lastnamed; + enum mdoc_sec lastsec; }; -#define ROFF___ 0 -#define ROFF_Dd 1 -#define ROFF_Dt 2 -#define ROFF_Os 3 -#define ROFF_Sh 4 -#define ROFF_Ss 5 -#define ROFF_Pp 6 -#define ROFF_D1 7 -#define ROFF_Dl 8 -#define ROFF_Bd 9 -#define ROFF_Ed 10 -#define ROFF_Bl 11 -#define ROFF_El 12 -#define ROFF_It 13 -#define ROFF_Ad 14 -#define ROFF_An 15 -#define ROFF_Ar 16 -#define ROFF_Cd 17 -#define ROFF_Cm 18 -#define ROFF_Dv 19 -#define ROFF_Er 20 -#define ROFF_Ev 21 -#define ROFF_Ex 22 -#define ROFF_Fa 23 -#define ROFF_Fd 24 -#define ROFF_Fl 25 -#define ROFF_Fn 26 -#define ROFF_Ft 27 -#define ROFF_Ic 28 -#define ROFF_In 29 -#define ROFF_Li 30 -#define ROFF_Nd 31 -#define ROFF_Nm 32 -#define ROFF_Op 33 -#define ROFF_Ot 34 -#define ROFF_Pa 35 -#define ROFF_Rv 36 -#define ROFF_St 37 -#define ROFF_Va 38 -#define ROFF_Vt 39 -#define ROFF_Xr 40 -#define ROFF__A 41 -#define ROFF__B 42 -#define ROFF__D 43 -#define ROFF__I 44 -#define ROFF__J 45 -#define ROFF__N 46 -#define ROFF__O 47 -#define ROFF__P 48 -#define ROFF__R 49 -#define ROFF__T 50 -#define ROFF__V 51 -#define ROFF_Ac 52 -#define ROFF_Ao 53 -#define ROFF_Aq 54 -#define ROFF_At 55 -#define ROFF_Bc 56 -#define ROFF_Bf 57 -#define ROFF_Bo 58 -#define ROFF_Bq 59 -#define ROFF_Bsx 60 -#define ROFF_Bx 61 -#define ROFF_Db 62 -#define ROFF_Dc 63 -#define ROFF_Do 64 -#define ROFF_Dq 65 -#define ROFF_Ec 66 -#define ROFF_Ef 67 -#define ROFF_Em 68 -#define ROFF_Eo 69 -#define ROFF_Fx 70 -#define ROFF_Ms 71 -#define ROFF_No 72 -#define ROFF_Ns 73 -#define ROFF_Nx 74 -#define ROFF_Ox 75 -#define ROFF_Pc 76 -#define ROFF_Pf 77 -#define ROFF_Po 78 -#define ROFF_Pq 79 -#define ROFF_Qc 80 -#define ROFF_Ql 81 -#define ROFF_Qo 82 -#define ROFF_Qq 83 -#define ROFF_Re 84 -#define ROFF_Rs 85 -#define ROFF_Sc 86 -#define ROFF_So 87 -#define ROFF_Sq 88 -#define ROFF_Sm 89 -#define ROFF_Sx 90 -#define ROFF_Sy 91 -#define ROFF_Tn 92 -#define ROFF_Ux 93 -#define ROFF_Xc 94 -#define ROFF_Xo 95 -#define ROFF_Fo 96 -#define ROFF_Fc 97 -#define ROFF_Oo 98 -#define ROFF_Oc 99 -#define ROFF_Bk 100 -#define ROFF_Ek 101 -#define ROFF_MAX 102 -#define ROFF_Split 0 -#define ROFF_Nosplit 1 -#define ROFF_Ragged 2 -#define ROFF_Unfilled 3 -#define ROFF_Literal 4 -#define ROFF_File 5 -#define ROFF_Offset 6 -#define ROFF_Bullet 7 -#define ROFF_Dash 8 -#define ROFF_Hyphen 9 -#define ROFF_Item 10 -#define ROFF_Enum 11 -#define ROFF_Tag 12 -#define ROFF_Diag 13 -#define ROFF_Hang 14 -#define ROFF_Ohang 15 -#define ROFF_Inset 16 -#define ROFF_Column 17 -#define ROFF_Width 18 -#define ROFF_Compact 19 -#define ROFF_Std 20 -#define ROFF_p1003_1_88 21 -#define ROFF_p1003_1_90 22 -#define ROFF_p1003_1_96 23 -#define ROFF_p1003_1_2001 24 -#define ROFF_p1003_1_2004 25 -#define ROFF_p1003_1 26 -#define ROFF_p1003_1b 27 -#define ROFF_p1003_1b_93 28 -#define ROFF_p1003_1c_95 29 -#define ROFF_p1003_1g_2000 30 -#define ROFF_p1003_2_92 31 -#define ROFF_p1387_2_95 32 -#define ROFF_p1003_2 33 -#define ROFF_p1387_2 34 -#define ROFF_isoC_90 35 -#define ROFF_isoC_amd1 36 -#define ROFF_isoC_tcor1 37 -#define ROFF_isoC_tcor2 38 -#define ROFF_isoC_99 39 -#define ROFF_ansiC 40 -#define ROFF_ansiC_89 41 -#define ROFF_ansiC_99 42 -#define ROFF_ieee754 43 -#define ROFF_iso8802_3 44 -#define ROFF_xpg3 45 -#define ROFF_xpg4 46 -#define ROFF_xpg4_2 47 -#define ROFF_xpg4_3 48 -#define ROFF_xbd5 49 -#define ROFF_xcu5 50 -#define ROFF_xsh5 51 -#define ROFF_xns5 52 -#define ROFF_xns5_2d2_0 53 -#define ROFF_xcurses4_2 54 -#define ROFF_susv2 55 -#define ROFF_susv3 56 -#define ROFF_svid4 57 -#define ROFF_Filled 58 -#define ROFF_Words 59 -#define ROFF_ARGMAX 60 +/* Hard-limit of macro arguments. */ -extern const char *const *toknames; -extern const char *const *tokargnames; +#define MDOC_LINEARG_MAX 9 -enum roffmsg { ROFF_WARN, ROFF_ERROR }; +/* Suggested limit of macro arguments. */ -struct roffcb { - void (*roffmsg)(const struct md_args *, enum roffmsg, - const char *, const char *, const char *, - int, char *); - int (*roffhead)(void); - int (*rofftail)(void); - int (*roffin)(const struct md_args *, int, int *, char **); - int (*roffout)(const struct md_args *, int); - int (*roffblkin)(const struct md_args *, int); - int (*roffblkout)(const struct md_args *, int); - int (*roffspecial)(int); +#define MDOC_LINEARG_SOFTMAX 9 + +#define MACRO_PROT_ARGS struct mdoc *mdoc, int tok, int line, \ + int ppos, int *pos, char *buf + +struct mdoc_macro { + int (*fp)(MACRO_PROT_ARGS); + int flags; +#define MDOC_CALLABLE (1 << 0) +#define MDOC_PARSED (1 << 1) +#define MDOC_EXPLICIT (1 << 2) +#define MDOC_PROLOGUE (1 << 3) }; +#define mdoc_nwarn(mdoc, node, type, fmt, ...) \ + mdoc_vwarn((mdoc), (node)->line, \ + (node)->pos, (type), (fmt), ##__VA_ARGS__) + +#define mdoc_nerr(mdoc, node, fmt, ...) \ + mdoc_verr((mdoc), (node)->line, \ + (node)->pos, (fmt), ##__VA_ARGS__) + +#define mdoc_warn(mdoc, type, fmt, ...) \ + mdoc_vwarn((mdoc), (mdoc)->last->line, \ + (mdoc)->last->pos, (type), (fmt), ##__VA_ARGS__) + +#define mdoc_err(mdoc, fmt, ...) \ + mdoc_verr((mdoc), (mdoc)->last->line, \ + (mdoc)->last->pos, (fmt), ##__VA_ARGS__) + +#define mdoc_msg(mdoc, fmt, ...) \ + mdoc_vmsg((mdoc), (mdoc)->last->line, \ + (mdoc)->last->pos, (fmt), ##__VA_ARGS__) + +#define mdoc_pmsg(mdoc, line, pos, fmt, ...) \ + mdoc_vmsg((mdoc), (line), \ + (pos), (fmt), ##__VA_ARGS__) + +#define mdoc_pwarn(mdoc, line, pos, type, fmt, ...) \ + mdoc_vwarn((mdoc), (line), \ + (pos), (type), (fmt), ##__VA_ARGS__) + +#define mdoc_perr(mdoc, line, pos, fmt, ...) \ + mdoc_verr((mdoc), (line), \ + (pos), (fmt), ##__VA_ARGS__) + +extern const struct mdoc_macro *const mdoc_macros; + __BEGIN_DECLS -typedef void (*(*md_init)(const struct md_args *, - struct md_mbuf *, const struct md_rbuf *)); -typedef int (*md_line)(void *, char *, size_t); -typedef int (*md_exit)(void *, int); +int mdoc_vwarn(struct mdoc *, int, int, + enum mdoc_warn, const char *, ...); +void mdoc_vmsg(struct mdoc *, int, int, + const char *, ...); +int mdoc_verr(struct mdoc *, int, int, + const char *, ...); -void *md_init_html4_strict(const struct md_args *, - struct md_mbuf *, const struct md_rbuf *); -int md_line_html4_strict(void *, char *, size_t); -int md_exit_html4_strict(void *, int); +int mdoc_macro(MACRO_PROT_ARGS); +int mdoc_find(const struct mdoc *, const char *); +int mdoc_word_alloc(struct mdoc *, + int, int, const char *); +int mdoc_elem_alloc(struct mdoc *, int, int, + int, size_t, const struct mdoc_arg *); +int mdoc_block_alloc(struct mdoc *, int, int, + int, size_t, const struct mdoc_arg *); +int mdoc_root_alloc(struct mdoc *); +int mdoc_head_alloc(struct mdoc *, int, int, int); +int mdoc_tail_alloc(struct mdoc *, int, int, int); +int mdoc_body_alloc(struct mdoc *, int, int, int); +void mdoc_node_free(struct mdoc_node *); +void mdoc_node_freelist(struct mdoc_node *); +void mdoc_sibling(struct mdoc *, int, struct mdoc_node **, + struct mdoc_node **, struct mdoc_node *); +void *mdoc_tokhash_alloc(void); +int mdoc_tokhash_find(const void *, const char *); +void mdoc_tokhash_free(void *); +int mdoc_iscdelim(char); +enum mdoc_sec mdoc_atosec(const char *); +enum mdoc_msec mdoc_atomsec(const char *); +enum mdoc_vol mdoc_atovol(const char *); +enum mdoc_arch mdoc_atoarch(const char *); +enum mdoc_att mdoc_atoatt(const char *); +time_t mdoc_atotime(const char *); -void *md_init_dummy(const struct md_args *, - struct md_mbuf *, const struct md_rbuf *); -int md_line_dummy(void *, char *, size_t); -int md_exit_dummy(void *, int); +char *mdoc_type2a(enum mdoc_type); +char *mdoc_node2a(struct mdoc_node *); -int md_buf_puts(struct md_mbuf *, const char *, size_t); -int md_buf_putchar(struct md_mbuf *, char); -int md_buf_putstring(struct md_mbuf *, const char *); +int mdoc_valid_pre(struct mdoc *, struct mdoc_node *); +int mdoc_valid_post(struct mdoc *); +int mdoc_action_pre(struct mdoc *, struct mdoc_node *); +int mdoc_action_post(struct mdoc *); -struct rofftree; +int mdoc_argv(struct mdoc *, int, int, + struct mdoc_arg *, int *, char *); +#define ARGV_ERROR (-1) +#define ARGV_EOLN (0) +#define ARGV_ARG (1) +#define ARGV_WORD (2) +void mdoc_argv_free(int, struct mdoc_arg *); +int mdoc_args(struct mdoc *, int, + int *, char *, int, char **); +#define ARGS_ERROR (-1) +#define ARGS_EOLN (0) +#define ARGS_WORD (1) +#define ARGS_PUNCT (2) +#define ARGS_QWORD (3) +#define ARGS_PHRASE (4) -struct rofftree *roff_alloc(const struct md_args *, - struct md_mbuf *, const struct md_rbuf *, - const struct roffcb *); -int roff_engine(struct rofftree *, char *, size_t); -int roff_free(struct rofftree *, int); +int xstrlcats(char *, const struct mdoc_node *, size_t); +int xstrlcat(char *, const char *, size_t); +int xstrlcpy(char *, const char *, size_t); +int xstrcmp(const char *, const char *); +int xstrncmp(const char *, const char *, size_t); +void *xcalloc(size_t, size_t); +char *xstrdup(const char *); + +int macro_obsolete(MACRO_PROT_ARGS); +int macro_constant(MACRO_PROT_ARGS); +int macro_constant_scoped(MACRO_PROT_ARGS); +int macro_constant_delimited(MACRO_PROT_ARGS); +int macro_text(MACRO_PROT_ARGS); +int macro_scoped(MACRO_PROT_ARGS); +int macro_scoped_close(MACRO_PROT_ARGS); +int macro_scoped_line(MACRO_PROT_ARGS); +int macro_prologue(MACRO_PROT_ARGS); +int macro_end(struct mdoc *); __END_DECLS