X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/08e784865150faf1d14195370ddfff718eff45dc..refs/heads/master:/halibut.h diff --git a/halibut.h b/halibut.h index 8bbcc1e..c196c13 100644 --- a/halibut.h +++ b/halibut.h @@ -35,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; @@ -63,6 +62,7 @@ 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; @@ -178,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 ) @@ -200,46 +201,123 @@ enum { /* * error.c */ -void fatal(int code, ...) NORETURN; -void error(int code, ...); -enum { - err_nomemory, /* out of memory */ - err_optnoarg, /* option `-%s' requires an argument */ - err_nosuchopt, /* unrecognised option `-%s' */ - err_noinput, /* no input files */ - err_cantopen, /* unable to open input file `%s' */ - err_nodata, /* no data in input files */ - err_brokencodepara, /* line in codepara didn't begin `\c' */ - err_kwunclosed, /* expected `}' after keyword */ - err_kwillegal, /* paragraph type expects no keyword */ - err_kwexpected, /* paragraph type expects a keyword */ - err_kwtoomany, /* paragraph type expects only 1 */ - err_bodyillegal, /* paragraph type expects only kws! */ - err_badparatype, /* invalid command at start of para */ - err_badmidcmd, /* invalid command in mid-para */ - err_unexbrace, /* unexpected brace */ - err_explbr, /* expected `{' after command */ - err_commenteof, /* EOF inside braced comment */ - err_kwexprbr, /* expected `}' after cross-ref */ - 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_nosuchkw, /* unresolved cross-reference */ - err_multiBR, /* multiple \BRs on same keyword */ - err_nosuchidxtag, /* \IM on unknown index tag (warning) */ - err_cantopenw, /* can't open output file for write */ - err_macroexists, /* this macro already exists */ - err_sectjump, /* jump a heading level, eg \C -> \S */ - err_winhelp_ctxclash, /* WinHelp context ID hash clash */ - err_multikw, /* keyword clash in sections */ - err_misplacedlcont, /* \lcont not after a list item */ - 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 */ -}; +/* out of memory */ +void fatalerr_nomemory(void) NORETURN; +/* option `-%s' requires an argument */ +void err_optnoarg(const char *sp); +/* unrecognised option `-%s' */ +void err_nosuchopt(const char *sp); +/* unrecognised charset %s (cmdline) */ +void err_cmdcharset(const char *sp); +/* futile option `-%s'%s */ +void err_futileopt(const char *sp, const char *sp2); +/* no input files */ +void err_noinput(void); +/* unable to open input file `%s' */ +void err_cantopen(const char *sp); +/* no data in input files */ +void err_nodata(void); +/* line in codepara didn't begin `\c' */ +void err_brokencodepara(const filepos *fpos); +/* expected `}' after keyword */ +void err_kwunclosed(const filepos *fpos); +/* paragraph type expects no keyword */ +void err_kwexpected(const filepos *fpos); +/* paragraph type expects a keyword */ +void err_kwillegal(const filepos *fpos); +/* paragraph type expects only 1 */ +void err_kwtoomany(const filepos *fpos); +/* paragraph type expects only kws! */ +void err_bodyillegal(const filepos *fpos); +/* invalid command at start of para */ +void err_badparatype(const wchar_t *wsp, const filepos *fpos); +/* invalid command in mid-para */ +void err_badmidcmd(const wchar_t *wsp, const filepos *fpos); +/* unexpected brace */ +void err_unexbrace(const filepos *fpos); +/* expected `{' after command */ +void err_explbr(const filepos *fpos); +/* EOF inside braced comment */ +void err_commenteof(const filepos *fpos); +/* expected `}' after cross-ref */ +void err_kwexprbr(const filepos *fpos); +/* \q within \c is not supported */ +void err_codequote(const filepos *fpos); +/* unclosed braces at end of para */ +void err_missingrbrace(const filepos *fpos); +/* unclosed braces at end of file */ +void err_missingrbrace2(const filepos *fpos); +/* unable to nest text styles */ +void err_nestedstyles(const filepos *fpos); +/* unable to nest `\i' thingys */ +void err_nestedindex(const filepos *fpos); +/* two \i differing only in case */ +void err_indexcase(const filepos *fpos, const wchar_t *wsp, + const filepos *fpos2, const wchar_t *wsp2); +/* unresolved cross-reference */ +void err_nosuchkw(const filepos *fpos, const wchar_t *wsp); +/* multiple \BRs on same keyword */ +void err_multiBR(const filepos *fpos, const wchar_t *wsp); +/* \IM on unknown index tag (warning) */ +void err_nosuchidxtag(const filepos *fpos, const wchar_t *wsp); +/* can't open output file for write */ +void err_cantopenw(const char *sp); +/* this macro already exists */ +void err_macroexists(const filepos *fpos, const wchar_t *wsp); +/* jump a heading level, eg \C -> \S */ +void err_sectjump(const filepos *fpos); +/* WinHelp context ID hash clash */ +void err_winhelp_ctxclash(const filepos *fpos, const char *sp, const char *sp2); +/* keyword clash in sections */ +void err_multikw(const filepos *fpos, const filepos *fpos2, const wchar_t *wsp); +/* \lcont not after a list item */ +void err_misplacedlcont(const filepos *fpos); +/* section marker appeared in block */ +void err_sectmarkerinblock(const filepos *fpos, const char *sp); +/* \cfg{%s} insufficient args (<%d) */ +void err_cfginsufarg(const filepos *fpos, const char *sp, int i); +/* colon/comma in node name in info */ +void err_infonodechar(const filepos *fpos, char c) /* fpos might be NULL */; +/* \c line too long in text backend */ +void err_text_codeline(const filepos *fpos, int i, int j); +/* unrecognised HTML version keyword */ +void err_htmlver(const filepos *fpos, const wchar_t *wsp); +/* unrecognised character set name */ +void err_charset(const filepos *fpos, const wchar_t *wsp); +/* unrecognised font name */ +void err_nofont(const filepos *fpos, const wchar_t *wsp); +/* eof in AFM file */ +void err_afmeof(const filepos *fpos); +/* missing expected keyword in AFM */ +void err_afmkey(const filepos *fpos, const char *sp); +/* unsupported AFM version */ +void err_afmvers(const filepos *fpos); +/* missing value(s) for AFM key */ +void err_afmval(const filepos *fpos, const char *sp, int i); +/* eof in Type 1 font file */ +void err_pfeof(const filepos *fpos); +/* bad Type 1 header line */ +void err_pfhead(const filepos *fpos); +/* otherwise invalide Type 1 font */ +void err_pfbad(const filepos *fpos); +/* Type 1 font but no AFM */ +void err_pfnoafm(const filepos *fpos, const char *sp); +/* need both or neither of hhp+chm */ +void err_chmnames(void); +/* required sfnt table missing */ +void err_sfntnotable(const filepos *fpos, const char *sp); +/* sfnt has no PostScript name */ +void err_sfntnopsname(const filepos *fpos); +/* sfnt table not valid */ +void err_sfntbadtable(const filepos *fpos, const char *sp); +/* sfnt has no UCS-2 cmap */ +void err_sfntnounicmap(const filepos *fpos); +/* sfnt table version unknown */ +void err_sfnttablevers(const filepos *fpos, const char *sp); +/* sfnt has bad header */ +void err_sfntbadhdr(const filepos *fpos); +/* sfnt cmap references bad glyph */ +void err_sfntbadglyph(const filepos *fpos, unsigned wc); /* * malloc.c @@ -259,11 +337,12 @@ 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)) ) /* @@ -286,13 +365,16 @@ 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(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 @@ -306,6 +388,7 @@ int ustrwid(wchar_t const *s, int charset); void help(void); void usage(void); void showversion(void); +void listcharsets(void); /* * licence.c @@ -315,7 +398,7 @@ void licence(void); /* * version.c */ -const char *const version; +extern const char *const version; /* * misc.c @@ -346,6 +429,7 @@ void rdadds(rdstring *rs, wchar_t const *p); wchar_t *rdtrim(rdstring *rs); void rdaddc(rdstringc *rs, char c); 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); @@ -371,6 +455,22 @@ paragraph *cmdline_cfg_simple(char *string, ...); 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 { @@ -450,22 +550,16 @@ void number_free(numberstate *); void gen_citations(paragraph *, keywordlist *); /* - * style.c - */ -struct userstyle_Tag { -}; - -/* * bk_text.c */ 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 *, void *); -paragraph *xhtml_config_filename(char *filename); +void html_backend(paragraph *, keywordlist *, indexdata *, void *); +paragraph *html_config_filename(char *filename); /* * bk_whlp.c @@ -489,6 +583,7 @@ paragraph *info_config_filename(char *filename); * bk_paper.c */ void *paper_pre_backend(paragraph *, keywordlist *, indexdata *); +void listfonts(void); /* * bk_ps.c