X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/6e969fcfe897ed651145d5cadfc6764c2a6bce6d..5b1d0032b0eb6f4a347c0c2cfdbe6e4bb4f959ab:/halibut.h diff --git a/halibut.h b/halibut.h index da7a845..6a0e944 100644 --- a/halibut.h +++ b/halibut.h @@ -6,6 +6,8 @@ #include #include +#include "charset.h" + #ifdef __GNUC__ #define NORETURN __attribute__((__noreturn__)) #else @@ -66,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 */ }; /* @@ -76,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 @@ -114,6 +122,10 @@ enum { 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 */ }; @@ -153,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 { @@ -220,6 +237,7 @@ enum { 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 */ }; @@ -251,11 +269,16 @@ char *dupstr(char *s); /* * ustring.c */ -wchar_t *ustrdup(wchar_t *s); -char *ustrtoa(wchar_t *s, char *outbuf, int size); -wchar_t *ustrfroma(char *s, wchar_t *outbuf, int size); -char *utoa_dup(wchar_t *s); -wchar_t *ufroma_dup(char *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 const *source); @@ -267,7 +290,14 @@ 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 @@ -289,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); @@ -317,7 +349,7 @@ 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 { @@ -326,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