Add an error check for correct formatting in Deflate uncompressed
[sgt/halibut] / halibut.h
index c771459..11b8ac2 100644 (file)
--- a/halibut.h
+++ b/halibut.h
@@ -4,6 +4,9 @@
 #include <stdio.h>
 #include <wchar.h>
 #include <time.h>
+#include <string.h>
+
+#include "charset.h"
 
 #ifdef __GNUC__
 #define NORETURN __attribute__((__noreturn__))
@@ -32,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;
@@ -60,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 */
 };
 
 /*
@@ -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,7 +114,6 @@ enum {
     para_Description,
     para_Code,
     para_Copyright,
-    para_Preamble,
     para_NoCite,
     para_Title,
     para_VersionID,
@@ -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,29 +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);
-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
@@ -267,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
@@ -276,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);
@@ -301,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 {
@@ -318,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
@@ -327,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 {
@@ -366,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 */
@@ -378,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);
@@ -403,29 +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 *);
+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