X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/96f3af166d2258373cdb68eb37a78cc9ff851b80..3e030063e831da0af7bdb8d12f2f25a5224ba0be:/halibut.h diff --git a/halibut.h b/halibut.h index 1312cd4..6a0e944 100644 --- a/halibut.h +++ b/halibut.h @@ -4,6 +4,9 @@ #include #include #include +#include + +#include "charset.h" #ifdef __GNUC__ #define NORETURN __attribute__((__noreturn__)) @@ -65,6 +68,11 @@ struct input_Tag { filepos pos; int reportcols; /* report column numbers in errors */ macrostack *stack; /* macro expansions in force */ + int defcharset, charset; /* character sets for input files */ + charset_state csstate; + wchar_t wc[16]; /* wide chars from input conversion */ + int nwc, wcpos; /* size of, and position in, wc[] */ + char *pushback_chars; /* used to save input-encoding data */ }; /* @@ -75,6 +83,7 @@ struct paragraph_Tag { paragraph *next; int type; wchar_t *keyword; /* for most special paragraphs */ + char *origkeyword; /* same again in original charset */ word *words; /* list of words in paragraph */ int aux; /* number, in a numbered paragraph * or subsection level @@ -105,13 +114,18 @@ enum { para_Description, para_Code, para_Copyright, - para_Preamble, para_NoCite, para_Title, para_VersionID, para_Config, /* configuration directive */ para_LcontPush, /* begin continuation of list item */ para_LcontPop, /* end continuation of list item */ + para_QuotePush, /* begin block quote */ + para_QuotePop, /* end block quote */ + /* + * Back ends may define their own paragraph types beyond here, + * in case they need to use them internally. + */ para_NotParaType /* placeholder value */ }; @@ -125,6 +139,8 @@ struct word_Tag { int breaks; /* can a line break after it? */ wchar_t *text; filepos fpos; + + void *private_data; /* for temp use in backends */ }; enum { /* ORDERING CONSTRAINT: these normal-word types ... */ @@ -149,7 +165,12 @@ enum { word_XrefEnd, /* (invisible; no text) */ word_IndexRef, /* (always an invisible one) */ word_HyperLink, /* (invisible) */ - word_HyperEnd /* (also invisible; no text) */ + word_HyperEnd, /* (also invisible; no text) */ + /* + * Back ends may define their own word types beyond here, in + * case they need to use them internally. + */ + word_NotWordType /* placeholder value */ }; /* aux values for attributed words */ enum { @@ -213,7 +234,10 @@ enum { err_winhelp_ctxclash, /* WinHelp context ID hash clash */ err_multikw, /* keyword clash in sections */ err_misplacedlcont, /* \lcont not after a list item */ - err_sectmarkerinlcont, /* section marker appeared in \lcont */ + err_sectmarkerinblock, /* section marker appeared in block */ + err_infodirentry, /* \cfg{info-dir-entry} missing param */ + err_infonodechar, /* colon/comma in node name in info */ + err_text_codeline, /* \c line too long in text backend */ err_whatever /* random error of another type */ }; @@ -245,19 +269,35 @@ char *dupstr(char *s); /* * ustring.c */ -wchar_t *ustrdup(wchar_t *s); -char *ustrtoa(wchar_t *s, char *outbuf, int size); -int ustrlen(wchar_t *s); +wchar_t *ustrdup(wchar_t const *s); +char *ustrtoa(wchar_t const *s, char *outbuf, int size, int charset); +char *ustrtoa_careful(wchar_t const *s, char *outbuf, int size, int charset); +wchar_t *ustrfroma(char const *s, wchar_t *outbuf, int size, int charset); +char *utoa_dup(wchar_t const *s, int charset); +char *utoa_dup_len(wchar_t const *s, int charset, int *len); +char *utoa_careful_dup(wchar_t const *s, int charset); +wchar_t *ufroma_dup(char const *s, int charset); +char *utoa_locale_dup(wchar_t const *s); +wchar_t *ufroma_locale_dup(char const *s); +int ustrlen(wchar_t const *s); wchar_t *uadv(wchar_t *s); -wchar_t *ustrcpy(wchar_t *dest, wchar_t *source); +wchar_t *ustrcpy(wchar_t *dest, wchar_t const *source); wchar_t utolower(wchar_t); +int uisalpha(wchar_t); int ustrcmp(wchar_t *lhs, wchar_t *rhs); int ustricmp(wchar_t *lhs, wchar_t *rhs); int utoi(wchar_t *); int utob(wchar_t *); int uisdigit(wchar_t); wchar_t *ustrlow(wchar_t *s); -wchar_t *ustrftime(wchar_t *fmt, struct tm *timespec); +wchar_t *ustrftime(const wchar_t *wfmt, const struct tm *timespec); +int cvt_ok(int charset, const wchar_t *s); + +/* + * wcwidth.c + */ +int strwid(char const *s, int charset); +int ustrwid(wchar_t const *s, int charset); /* * help.c @@ -279,6 +319,8 @@ const char *const version; /* * misc.c */ +char *adv(char *s); + typedef struct stackTag *stack; stack stk_new(void); void stk_free(stack); @@ -299,15 +341,15 @@ struct tagRdstringc { extern const rdstring empty_rdstring; extern const rdstringc empty_rdstringc; void rdadd(rdstring *rs, wchar_t c); -void rdadds(rdstring *rs, wchar_t *p); +void rdadds(rdstring *rs, wchar_t const *p); wchar_t *rdtrim(rdstring *rs); void rdaddc(rdstringc *rs, char c); -void rdaddsc(rdstringc *rs, char *p); +void rdaddsc(rdstringc *rs, char const *p); char *rdtrimc(rdstringc *rs); int compare_wordlists(word *a, word *b); -void mark_attr_ends(paragraph *sourceform); +void mark_attr_ends(word *words); typedef struct tagWrappedLine wrappedline; struct tagWrappedLine { @@ -316,8 +358,11 @@ struct tagWrappedLine { int nspaces; /* number of whitespaces in line */ int shortfall; /* how much shorter than max width */ }; -wrappedline *wrap_para(word *, int, int, int (*)(word *)); +wrappedline *wrap_para(word *, int, int, int (*)(void *, word *), void *, int); void wrap_free(wrappedline *); +void cmdline_cfg_add(paragraph *cfg, char *string); +paragraph *cmdline_cfg_new(void); +paragraph *cmdline_cfg_simple(char *string, ...); /* * input.c @@ -364,7 +409,9 @@ struct indexdata_Tag { struct indextag_Tag { wchar_t *name; word *implicit_text; + filepos implicit_fpos; word **explicit_texts; + filepos *explicit_fpos; int nexplicit, explicit_size; int nrefs; indexentry **refs; /* array of entries referenced by tag */ @@ -376,13 +423,14 @@ struct indextag_Tag { struct indexentry_Tag { word *text; void *backend_data; /* private to back end */ + filepos fpos; }; indexdata *make_index(void); void cleanup_index(indexdata *); /* index_merge takes responsibility for freeing arg 3 iff implicit; never * takes responsibility for arg 2 */ -void index_merge(indexdata *, int is_explicit, wchar_t *, word *); +void index_merge(indexdata *, int is_explicit, wchar_t *, word *, filepos *); void build_index(indexdata *); void index_debug(indexdata *); indextag *index_findtag(indexdata *idx, wchar_t *name); @@ -409,21 +457,48 @@ struct userstyle_Tag { /* * bk_text.c */ -void text_backend(paragraph *, keywordlist *, indexdata *); +void text_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *text_config_filename(char *filename); /* * bk_xhtml.c */ -void xhtml_backend(paragraph *, keywordlist *, indexdata *); +void xhtml_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *xhtml_config_filename(char *filename); /* * bk_whlp.c */ -void whlp_backend(paragraph *, keywordlist *, indexdata *); +void whlp_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *whlp_config_filename(char *filename); /* * bk_man.c */ -void man_backend(paragraph *, keywordlist *, indexdata *); +void man_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *man_config_filename(char *filename); + +/* + * bk_info.c + */ +void info_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *info_config_filename(char *filename); + +/* + * bk_paper.c + */ +void *paper_pre_backend(paragraph *, keywordlist *, indexdata *); + +/* + * bk_ps.c + */ +void ps_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *ps_config_filename(char *filename); + +/* + * bk_pdf.c + */ +void pdf_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *pdf_config_filename(char *filename); #endif