X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/9c1cf191009beb4f16364a753df938baf1032290..0dfaac7284d7f1a54e957bba4a881d93328c1630:/halibut.h diff --git a/halibut.h b/halibut.h index 3fc752d..11b8ac2 100644 --- a/halibut.h +++ b/halibut.h @@ -6,6 +6,8 @@ #include #include +#include "charset.h" + #ifdef __GNUC__ #define NORETURN __attribute__((__noreturn__)) #else @@ -33,7 +35,6 @@ typedef struct paragraph_Tag paragraph; typedef struct word_Tag word; typedef struct keywordlist_Tag keywordlist; typedef struct keyword_Tag keyword; -typedef struct userstyle_Tag userstyle; typedef struct numberstate_Tag numberstate; typedef struct indexdata_Tag indexdata; typedef struct indextag_Tag indextag; @@ -61,11 +62,17 @@ struct input_Tag { int nfiles; /* how many in the list */ FILE *currfp; /* the currently open one */ int currindex; /* which one is that in the list */ + int wantclose; /* does the current file want closing */ pushback *pushback; /* pushed-back input characters */ int npushback, pushbacksize; 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 */ }; @@ -127,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 ... */ @@ -151,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 { @@ -159,14 +178,15 @@ enum { attr_First = 0x0001, /* the first of a series */ attr_Last = 0x0002, /* the last of a series */ attr_Always = 0x0003, /* any other part of a series */ - attr_mask = 0x0003, + attr_mask = 0x0003 }; /* aux values for quote-type words */ enum { quote_Open = 0x0010, quote_Close = 0x0020, - quote_mask = 0x0030, + quote_mask = 0x0030 }; +#define isvis(x) ( ( (x) >= word_Normal && (x) <= word_LowerXref ) ) #define isattr(x) ( ( (x) > word_Normal && (x) < word_WhiteSpace ) || \ ( (x) > word_WhiteSpace && (x) < word_internal_endattrs ) ) #define sameattr(x,y) ( (((x)-(y)) & 3) == 0 ) @@ -187,6 +207,8 @@ enum { err_nomemory, /* out of memory */ err_optnoarg, /* option `-%s' requires an argument */ err_nosuchopt, /* unrecognised option `-%s' */ + err_cmdcharset, /* unrecognised charset %s (cmdline) */ + err_futileopt, /* futile option `-%s'%s */ err_noinput, /* no input files */ err_cantopen, /* unable to open input file `%s' */ err_nodata, /* no data in input files */ @@ -202,10 +224,12 @@ enum { err_explbr, /* expected `{' after command */ err_commenteof, /* EOF inside braced comment */ err_kwexprbr, /* expected `}' after cross-ref */ + err_codequote, /* \q within \c is not supported */ err_missingrbrace, /* unclosed braces at end of para */ err_missingrbrace2, /* unclosed braces at end of file */ err_nestedstyles, /* unable to nest text styles */ err_nestedindex, /* unable to nest `\i' thingys */ + err_indexcase, /* two \i differing only in case */ err_nosuchkw, /* unresolved cross-reference */ err_multiBR, /* multiple \BRs on same keyword */ err_nosuchidxtag, /* \IM on unknown index tag (warning) */ @@ -216,6 +240,28 @@ enum { err_multikw, /* keyword clash in sections */ err_misplacedlcont, /* \lcont not after a list item */ err_sectmarkerinblock, /* section marker appeared in block */ + err_cfginsufarg, /* \cfg{%s} insufficient args (<%d) */ + err_infonodechar, /* colon/comma in node name in info */ + err_text_codeline, /* \c line too long in text backend */ + err_htmlver, /* unrecognised HTML version keyword */ + err_charset, /* unrecognised character set name */ + err_nofont, /* unrecognised font name */ + err_afmeof, /* eof in AFM file */ + err_afmkey, /* missing expected keyword in AFM */ + err_afmvers, /* unsupported AFM version */ + err_afmval, /* missing value(s) for AFM key */ + err_pfeof, /* eof in Type 1 font file */ + err_pfhead, /* bad Type 1 header line */ + err_pfbad, /* otherwise invalide Type 1 font */ + err_pfnoafm, /* Type 1 font but no AFM */ + err_chmnames, /* need both or neither of hhp+chm */ + err_sfntnotable, /* required sfnt table missing */ + err_sfntnopsname, /* sfnt has no PostScript name */ + err_sfntbadtable, /* sfnt table not valid */ + err_sfntnounicmap, /* sfnt has no UCS-2 cmap */ + err_sfnttablevers, /* sfnt table version unknown */ + err_sfntbadhdr, /* sfnt has bad header */ + err_sfntbadglyph, /* sfnt cmap references bad glyph */ err_whatever /* random error of another type */ }; @@ -237,33 +283,50 @@ void sfree(void *p); void free_word_list(word *w); void free_para_list(paragraph *p); word *dup_word_list(word *w); -char *dupstr(char *s); +char *dupstr(char const *s); -#define mknew(type) ( (type *) smalloc (sizeof (type)) ) -#define mknewa(type, number) ( (type *) smalloc ((number) * sizeof (type)) ) -#define resize(array, len) ( srealloc ((array), (len) * sizeof (*(array))) ) +#define snew(type) ( (type *) smalloc (sizeof (type)) ) +#define snewn(number, type) ( (type *) smalloc ((number) * sizeof (type)) ) +#define sresize(array, number, type) \ + ( (type *) srealloc ((array), (number) * sizeof (type)) ) #define lenof(array) ( sizeof(array) / sizeof(*(array)) ) /* * 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); -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 *ustrncpy(wchar_t *dest, wchar_t const *source, int n); 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 ustricmp(wchar_t const *lhs, wchar_t const *rhs); +int ustrnicmp(wchar_t const *lhs, wchar_t const *rhs, int maxlen); +int utoi(wchar_t const *); +double utof(wchar_t const *); +int utob(wchar_t const *); 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); +int charset_from_ustr(filepos *fpos, const wchar_t *name); + +/* + * wcwidth.c + */ +int strwid(char const *s, int charset); +int ustrwid(wchar_t const *s, int charset); /* * help.c @@ -271,6 +334,7 @@ wchar_t *ustrftime(wchar_t *fmt, struct tm *timespec); void help(void); void usage(void); void showversion(void); +void listcharsets(void); /* * licence.c @@ -280,11 +344,13 @@ void licence(void); /* * version.c */ -const char *const version; +extern const char *const version; /* * misc.c */ +char *adv(char *s); + typedef struct stackTag *stack; stack stk_new(void); void stk_free(stack); @@ -305,15 +371,16 @@ 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); +void rdaddsn(rdstringc *rc, char const *p, int len); 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 { @@ -322,8 +389,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 @@ -331,6 +401,22 @@ void wrap_free(wrappedline *); paragraph *read_input(input *in, indexdata *idx); /* + * in_afm.c + */ +void read_afm_file(input *in); + +/* + * in_pf.c + */ +void read_pfa_file(input *in); +void read_pfb_file(input *in); + +/* + * in_sfnt.c + */ +void read_sfnt_file(input *in); + +/* * keywords.c */ struct keywordlist_Tag { @@ -370,7 +456,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 */ @@ -382,13 +470,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); @@ -407,33 +496,51 @@ void number_free(numberstate *); void gen_citations(paragraph *, keywordlist *); /* - * style.c - */ -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 + * bk_html.c */ -void xhtml_backend(paragraph *, keywordlist *, indexdata *); -paragraph *xhtml_config_filename(char *filename); +void html_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *html_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 *); +void listfonts(void); + +/* + * 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