=================================================================== RCS file: /cvs/mandoc/Attic/private.h,v retrieving revision 1.7 retrieving revision 1.78 diff -u -p -r1.7 -r1.78 --- mandoc/Attic/private.h 2008/11/25 16:49:57 1.7 +++ mandoc/Attic/private.h 2009/02/22 14:31:08 1.78 @@ -1,4 +1,4 @@ -/* $Id: private.h,v 1.7 2008/11/25 16:49:57 kristaps Exp $ */ +/* $Id: private.h,v 1.78 2009/02/22 14:31:08 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -19,182 +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 15 -#define ROFF_An 16 -#define ROFF_Ar 17 -#define ROFF_Cd 18 -#define ROFF_Cm 19 -#define ROFF_Dv 20 -#define ROFF_Er 21 -#define ROFF_Ev 22 -#define ROFF_Ex 23 -#define ROFF_Fa 24 -#define ROFF_Fd 25 -#define ROFF_Fl 26 -#define ROFF_Fn 27 -#define ROFF_Ft 28 -#define ROFF_Ic 29 -#define ROFF_In 30 -#define ROFF_Li 31 -#define ROFF_Nd 32 -#define ROFF_Nm 33 -#define ROFF_Op 34 -#define ROFF_Ot 35 -#define ROFF_Pa 36 -#define ROFF_Rv 37 -#define ROFF_St 38 -#define ROFF_Va 39 -#define ROFF_Vt 40 -#define ROFF_Xr 41 -#define ROFF__A 42 -#define ROFF__B 43 -#define ROFF__D 44 -#define ROFF__I 45 -#define ROFF__J 46 -#define ROFF__N 47 -#define ROFF__O 48 -#define ROFF__P 49 -#define ROFF__R 50 -#define ROFF__T 51 -#define ROFF__V 52 -#define ROFF_Ac 53 -#define ROFF_Ao 54 -#define ROFF_Aq 55 -#define ROFF_At 56 -#define ROFF_Bc 57 -#define ROFF_Bf 58 -#define ROFF_Bo 59 -#define ROFF_Bq 60 -#define ROFF_Bsx 61 -#define ROFF_Bx 62 -#define ROFF_Db 63 -#define ROFF_Dc 64 -#define ROFF_Do 65 -#define ROFF_Dq 66 -#define ROFF_Ec 67 -#define ROFF_Ef 68 -#define ROFF_Em 60 -#define ROFF_Eo 70 -#define ROFF_Fx 71 -#define ROFF_Ms 72 -#define ROFF_No 73 -#define ROFF_Ns 74 -#define ROFF_Nx 75 -#define ROFF_Ox 76 -#define ROFF_Pc 77 -#define ROFF_Pf 78 -#define ROFF_Po 79 -#define ROFF_Pq 80 -#define ROFF_Qc 81 -#define ROFF_Ql 82 -#define ROFF_Qo 83 -#define ROFF_Qq 84 -#define ROFF_Re 85 -#define ROFF_Rs 86 -#define ROFF_Sc 87 -#define ROFF_So 88 -#define ROFF_Sq 89 -#define ROFF_Sm 90 -#define ROFF_Sx 91 -#define ROFF_Sy 92 -#define ROFF_Tn 93 -#define ROFF_Ux 94 -#define ROFF_Xc 95 -#define ROFF_Xo 96 -#define ROFF_MAX 97 -#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_ARGMAX 20 +/* Hard-limit of macro arguments. */ -extern const char *const *toknames; -extern const char *const *tokargnames; +#define MDOC_LINEARG_MAX 9 -/* FIXME: have a md_roff with all necessary parameters. */ +/* Suggested limit of macro arguments. */ -typedef int (*roffin)(int, int *, char **); -typedef int (*roffout)(int); -typedef int (*roffblkin)(int); -typedef int (*roffblkout)(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 *, - roffin, roffout, roffblkin, roffblkout); -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