From c478f3d9469c09773097eba89342c311ee70a319 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 5 Aug 2002 10:31:35 +0000 Subject: Rename Buttress to Halibut. I _think_ I've caught everything in this pass. [originally from svn r1800] --- LICENCE | 2 +- MODULE | 8 +- Makefile | 8 +- biblio.c | 2 +- bk_text.c | 4 +- bk_whlp.c | 4 +- bk_xhtml.c | 10 +- buttress.h | 416 ------------------------------------------------------- contents.c | 2 +- error.c | 8 +- halibut.h | 416 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ help.c | 4 +- index.c | 2 +- input.c | 4 +- inputs/test.but | 6 +- keywords.c | 2 +- main.c | 2 +- malloc.c | 6 +- misc.c | 2 +- misc/buttress.sl | 98 ------------- misc/halibut.sl | 98 +++++++++++++ style.c | 2 +- ustring.c | 2 +- winhelp.c | 2 +- 24 files changed, 555 insertions(+), 555 deletions(-) delete mode 100644 buttress.h create mode 100644 halibut.h delete mode 100644 misc/buttress.sl create mode 100644 misc/halibut.sl diff --git a/LICENCE b/LICENCE index 98ee16a..b1bfa8b 100644 --- a/LICENCE +++ b/LICENCE @@ -1,4 +1,4 @@ -Buttress is copyright (c) 1999-2001 Simon Tatham and James Aylett. +Halibut is copyright (c) 1999-2001 Simon Tatham and James Aylett. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files diff --git a/MODULE b/MODULE index ffc0f34..260f8ab 100644 --- a/MODULE +++ b/MODULE @@ -1,5 +1,5 @@ -Module: buttress +Module: halibut Author: Simon Tatham -Description: Buttress is yet another text formatting system, intended primarily for writing software documentation. It accepts a single source format and outputs a variety of formats, planned to include text, HTML, Texinfo, Windows Help, Windows HTMLHelp, PostScript and PDF. It has comprehensive indexing and cross-referencing support, and generates hyperlinks within output documents wherever possible. -Homepage: http://www.chiark.greenend.org.uk/~sgtatham/buttress.html -Release: http://www.chiark.greenend.org.uk/~sgtatham/buttress.html +Description: Halibut is yet another text formatting system, intended primarily for writing software documentation. It accepts a single source format and outputs a variety of formats, planned to include text, HTML, Texinfo, Windows Help, Windows HTMLHelp, PostScript and PDF. It has comprehensive indexing and cross-referencing support, and generates hyperlinks within output documents wherever possible. +Homepage: http://www.chiark.greenend.org.uk/~sgtatham/halibut.html +Release: http://www.chiark.greenend.org.uk/~sgtatham/halibut.html diff --git a/Makefile b/Makefile index 17cec01..b82ba23 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# Buttress master makefile +# Halibut master makefile # Requires a compiler with -MD support, currently @@ -59,8 +59,8 @@ MODULES += winhelp OBJECTS := $(addsuffix .o,$(MODULES)) DEPS := $(addsuffix .d,$(MODULES)) -buttress: $(OBJECTS) - $(CC) $(LFLAGS) -o buttress $(OBJECTS) $(LIBS) +halibut: $(OBJECTS) + $(CC) $(LFLAGS) -o halibut $(OBJECTS) $(LIBS) %.o: $(SRC)%.c $(CC) $(CFLAGS) -MD -c $< @@ -72,7 +72,7 @@ spotless:: clean rm -f *.d clean:: - rm -f *.o buttress core + rm -f *.o halibut core FORCE: # phony target to force version.o to be rebuilt every time diff --git a/biblio.c b/biblio.c index 57f1963..de0b925 100644 --- a/biblio.c +++ b/biblio.c @@ -3,7 +3,7 @@ */ #include -#include "buttress.h" +#include "halibut.h" static wchar_t *gentext(int num) { wchar_t text[22]; diff --git a/bk_text.c b/bk_text.c index 18a6af7..1583cbd 100644 --- a/bk_text.c +++ b/bk_text.c @@ -1,11 +1,11 @@ /* - * text backend for Buttress + * text backend for Halibut */ #include #include #include -#include "buttress.h" +#include "halibut.h" typedef enum { LEFT, LEFTPLUS, CENTRE } alignment; typedef struct { diff --git a/bk_whlp.c b/bk_whlp.c index 757f4e5..a8cb99e 100644 --- a/bk_whlp.c +++ b/bk_whlp.c @@ -1,5 +1,5 @@ /* - * Windows Help backend for Buttress + * Windows Help backend for Halibut * * TODO: * - allow user to specify section contexts. @@ -9,7 +9,7 @@ #include #include -#include "buttress.h" +#include "halibut.h" #include "winhelp.h" struct bk_whlp_state { diff --git a/bk_xhtml.c b/bk_xhtml.c index 0005f6b..2016e10 100644 --- a/bk_xhtml.c +++ b/bk_xhtml.c @@ -1,5 +1,5 @@ /* - * xhtml backend for Buttress + * xhtml backend for Halibut * (initial implementation by James Aylett) * * Still to do: @@ -23,13 +23,13 @@ * top-level file not being normal, probably not even having a valid * section level, and stuff like that. I question whether this is an * issue, frankly; small manuals that fit on one page should probably - * not be written in buttress at all. + * not be written in halibut at all. */ #include #include #include -#include "buttress.h" +#include "halibut.h" struct xhtmlsection_Struct { struct xhtmlsection_Struct *next; /* next sibling (NULL if split across files) */ @@ -328,7 +328,7 @@ void xhtml_fixup_layout(xhtmlfile* file) * Note that you _can_ have 1.1.1.1 followed by 1.2 - you can change * more than one level at a time. Lots of asserts, and probably part of * the algorithm here, rely on this being true. (It currently isn't - * enforced by buttress, however.) + * enforced by halibut, however.) * * File splitting makes this harder. For instance, say we added at (3) * above and now need to add another section. We are splitting at level @@ -1098,7 +1098,7 @@ static void xhtml_doheader(FILE *fp, word *title) else xhtml_para(fp, title); fprintf(fp, "\n"); - fprintf(fp, "\n", version); + fprintf(fp, "\n", version); if (conf.author) fprintf(fp, "\n", conf.author); if (conf.description) diff --git a/buttress.h b/buttress.h deleted file mode 100644 index 6646a81..0000000 --- a/buttress.h +++ /dev/null @@ -1,416 +0,0 @@ -#ifndef BUTTRESS_BUTTRESS_H -#define BUTTRESS_BUTTRESS_H - -#include -#include -#include - -#ifdef __GNUC__ -#define NORETURN __attribute__((__noreturn__)) -#else -#define NORETURN /* nothing */ -#endif - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -/* For suppressing unused-parameter warnings */ -#define IGNORE(x) ( (x) = (x) ) - -#include "tree234.h" - -/* - * Structure tags - */ -typedef struct input_Tag input; -typedef struct filepos_Tag filepos; -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; -typedef struct indexentry_Tag indexentry; -typedef struct macrostack_Tag macrostack; - -/* - * Data structure to hold a file name and index, a line and a - * column number, for reporting errors - */ -struct filepos_Tag { - char *filename; - int line, col; -}; - -/* - * Data structure to hold all the file names etc for input - */ -typedef struct pushback_Tag { - int chr; - filepos pos; -} pushback; -struct input_Tag { - char **filenames; /* complete list of input files */ - int nfiles; /* how many in the list */ - FILE *currfp; /* the currently open one */ - int currindex; /* which one is that in the list */ - pushback *pushback; /* pushed-back input characters */ - int npushback, pushbacksize; - filepos pos; - int reportcols; /* report column numbers in errors */ - macrostack *stack; /* macro expansions in force */ -}; - -/* - * Data structure to hold the input form of the source, ie a linked - * list of paragraphs - */ -struct paragraph_Tag { - paragraph *next; - int type; - wchar_t *keyword; /* for most special paragraphs */ - word *words; /* list of words in paragraph */ - int aux; /* number, in a numbered paragraph - * or subsection level - */ - word *kwtext; /* chapter/section indication */ - word *kwtext2; /* numeric-only form of kwtext */ - filepos fpos; - - paragraph *parent, *child, *sibling; /* for hierarchy navigation */ - - void *private_data; /* for temp use in backends */ -}; -enum { - para_IM, /* index merge */ - para_BR, /* bibliography rewrite */ - para_Rule, /* random horizontal rule */ - para_Chapter, - para_Appendix, - para_UnnumberedChapter, - para_Heading, - para_Subsect, - para_Normal, - para_Biblio, /* causes no output unless turned ... */ - para_BiblioCited, /* ... into this paragraph type */ - para_Bullet, - para_NumberedList, - para_Code, - para_Copyright, - para_Preamble, - para_NoCite, - para_Title, - para_VersionID, - para_Config, /* configuration directive */ - para_NotParaType /* placeholder value */ -}; - -/* - * Data structure to hold an individual word - */ -struct word_Tag { - word *next, *alt; - int type; - int aux; - int breaks; /* can a line break after it? */ - wchar_t *text; - filepos fpos; -}; -enum { - /* ORDERING CONSTRAINT: these normal-word types ... */ - word_Normal, - word_Emph, - word_Code, /* monospaced; `quoted' in text */ - word_WeakCode, /* monospaced, normal in text */ - /* ... must be in the same order as these space types ... */ - word_WhiteSpace, /* text is NULL or ignorable */ - word_EmphSpace, /* WhiteSpace when emphasised */ - word_CodeSpace, /* WhiteSpace when code */ - word_WkCodeSpace, /* WhiteSpace when weak code */ - /* ... and must be in the same order as these quote types ... */ - word_Quote, /* text is NULL or ignorable */ - word_EmphQuote, /* Quote when emphasised */ - word_CodeQuote, /* (can't happen) */ - word_WkCodeQuote, /* (can't happen) */ - /* END ORDERING CONSTRAINT */ - word_internal_endattrs, - word_UpperXref, /* \K */ - word_LowerXref, /* \k */ - word_XrefEnd, /* (invisible; no text) */ - word_IndexRef, /* (always an invisible one) */ - word_HyperLink, /* (invisible) */ - word_HyperEnd /* (also invisible; no text) */ -}; -/* aux values for attributed words */ -enum { - attr_Only = 0x0000, /* a lone word with the attribute */ - 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, -}; -/* aux values for quote-type words */ -enum { - quote_Open = 0x0010, - quote_Close = 0x0020, - quote_mask = 0x0030, -}; -#define isattr(x) ( ( (x) > word_Normal && (x) < word_WhiteSpace ) || \ - ( (x) > word_WhiteSpace && (x) < word_internal_endattrs ) ) -#define sameattr(x,y) ( (((x)-(y)) & 3) == 0 ) -#define towordstyle(x) ( word_Normal + ((x) & 3) ) -#define tospacestyle(x) ( word_WhiteSpace + ((x) & 3) ) -#define toquotestyle(x) ( word_Quote + ((x) & 3) ) -#define removeattr(x) ( word_Normal + ((x) &~ 3) ) - -#define attraux(x) ( (x) & attr_mask ) -#define quoteaux(x) ( (x) & quote_mask ) - -/* - * 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_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_whatever /* random error of another type */ -}; - -/* - * malloc.c - */ -#ifdef LOGALLOC -void *smalloc(char *file, int line, int size); -void *srealloc(char *file, int line, void *p, int size); -void sfree(char *file, int line, void *p); -#define smalloc(x) smalloc(__FILE__, __LINE__, x) -#define srealloc(x, y) srealloc(__FILE__, __LINE__, x, y) -#define sfree(x) sfree(__FILE__, __LINE__, x) -#else -void *smalloc(int size); -void *srealloc(void *p, int size); -void sfree(void *p); -#endif -void free_word_list(word *w); -void free_para_list(paragraph *p); -word *dup_word_list(word *w); -char *dupstr(char *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 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 *uadv(wchar_t *s); -wchar_t *ustrcpy(wchar_t *dest, wchar_t *source); -wchar_t utolower(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); - -/* - * help.c - */ -void help(void); -void usage(void); -void showversion(void); - -/* - * licence.c - */ -void licence(void); - -/* - * version.c - */ -const char *const version; - -/* - * misc.c - */ -typedef struct stackTag *stack; -stack stk_new(void); -void stk_free(stack); -void stk_push(stack, void *); -void *stk_pop(stack); - -typedef struct tagRdstring rdstring; -struct tagRdstring { - int pos, size; - wchar_t *text; -}; -typedef struct tagRdstringc rdstringc; -struct tagRdstringc { - int pos, size; - char *text; -}; -extern const rdstring empty_rdstring; -extern const rdstringc empty_rdstringc; -void rdadd(rdstring *rs, wchar_t c); -void rdadds(rdstring *rs, wchar_t *p); -wchar_t *rdtrim(rdstring *rs); -void rdaddc(rdstringc *rs, char c); -void rdaddsc(rdstringc *rs, char *p); -char *rdtrimc(rdstringc *rs); - -int compare_wordlists(word *a, word *b); - -void mark_attr_ends(paragraph *sourceform); - -typedef struct tagWrappedLine wrappedline; -struct tagWrappedLine { - wrappedline *next; - word *begin, *end; /* first & last words of line */ - int nspaces; /* number of whitespaces in line */ - int shortfall; /* how much shorter than max width */ -}; -wrappedline *wrap_para(word *, int, int, int (*)(word *)); -void wrap_free(wrappedline *); - -/* - * input.c - */ -paragraph *read_input(input *in, indexdata *idx); - -/* - * keywords.c - */ -struct keywordlist_Tag { - int nkeywords; - int size; - tree234 *keys; /* sorted by `key' field */ - word **looseends; /* non-keyword list element numbers */ - int nlooseends; - int looseendssize; -}; -struct keyword_Tag { - wchar_t *key; /* the keyword itself */ - word *text; /* "Chapter 2", "Appendix Q"... */ - /* (NB: filepos are not set) */ - paragraph *para; /* the paragraph referenced */ -}; -keyword *kw_lookup(keywordlist *, wchar_t *); -keywordlist *get_keywords(paragraph *); -void free_keywords(keywordlist *); -void subst_keywords(paragraph *, keywordlist *); - -/* - * index.c - */ - -/* - * Data structure to hold both sides of the index. - */ -struct indexdata_Tag { - tree234 *tags; /* holds type `indextag' */ - tree234 *entries; /* holds type `indexentry' */ -}; - -/* - * Data structure to hold an index tag (LHS of index). - */ -struct indextag_Tag { - wchar_t *name; - word *implicit_text; - word **explicit_texts; - int nexplicit, explicit_size; - int nrefs; - indexentry **refs; /* array of entries referenced by tag */ -}; - -/* - * Data structure to hold an index entry (RHS of index). - */ -struct indexentry_Tag { - word *text; - void *backend_data; /* private to back end */ -}; - -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 build_index(indexdata *); -void index_debug(indexdata *); -indextag *index_findtag(indexdata *idx, wchar_t *name); - -/* - * contents.c - */ -numberstate *number_init(void); -void number_cfg(numberstate *, paragraph *); -word *number_mktext(numberstate *, paragraph *, wchar_t *, int , int *); -void number_free(numberstate *); - -/* - * biblio.c - */ -void gen_citations(paragraph *, keywordlist *); - -/* - * style.c - */ -struct userstyle_Tag { -}; - -/* - * bk_text.c - */ -void text_backend(paragraph *, keywordlist *, indexdata *); - -/* - * bk_xhtml.c - */ -void xhtml_backend(paragraph *, keywordlist *, indexdata *); - -/* - * bk_whlp.c - */ -void whlp_backend(paragraph *, keywordlist *, indexdata *); - -#endif diff --git a/contents.c b/contents.c index 85d230b..de45433 100644 --- a/contents.c +++ b/contents.c @@ -6,7 +6,7 @@ #include #include #include -#include "buttress.h" +#include "halibut.h" struct numberstate_Tag { int chapternum; diff --git a/error.c b/error.c index 4f7524c..6d8dd13 100644 --- a/error.c +++ b/error.c @@ -1,16 +1,16 @@ /* - * error.c: buttress error handling + * error.c: Halibut error handling */ #include #include #include -#include "buttress.h" +#include "halibut.h" /* * Error flags */ -#define PREFIX 0x0001 /* give `buttress:' prefix */ +#define PREFIX 0x0001 /* give `halibut:' prefix */ #define FILEPOS 0x0002 /* give file position prefix */ static void do_error(int code, va_list ap) { @@ -192,7 +192,7 @@ static void do_error(int code, va_list ap) { } if (flags & PREFIX) - fputs("buttress: ", stderr); + fputs("halibut: ", stderr); if (flags & FILEPOS) { fprintf(stderr, "%s:%d:", fpos.filename, fpos.line); if (fpos.col > 0) diff --git a/halibut.h b/halibut.h new file mode 100644 index 0000000..c948624 --- /dev/null +++ b/halibut.h @@ -0,0 +1,416 @@ +#ifndef HALIBUT_HALIBUT_H +#define HALIBUT_HALIBUT_H + +#include +#include +#include + +#ifdef __GNUC__ +#define NORETURN __attribute__((__noreturn__)) +#else +#define NORETURN /* nothing */ +#endif + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +/* For suppressing unused-parameter warnings */ +#define IGNORE(x) ( (x) = (x) ) + +#include "tree234.h" + +/* + * Structure tags + */ +typedef struct input_Tag input; +typedef struct filepos_Tag filepos; +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; +typedef struct indexentry_Tag indexentry; +typedef struct macrostack_Tag macrostack; + +/* + * Data structure to hold a file name and index, a line and a + * column number, for reporting errors + */ +struct filepos_Tag { + char *filename; + int line, col; +}; + +/* + * Data structure to hold all the file names etc for input + */ +typedef struct pushback_Tag { + int chr; + filepos pos; +} pushback; +struct input_Tag { + char **filenames; /* complete list of input files */ + int nfiles; /* how many in the list */ + FILE *currfp; /* the currently open one */ + int currindex; /* which one is that in the list */ + pushback *pushback; /* pushed-back input characters */ + int npushback, pushbacksize; + filepos pos; + int reportcols; /* report column numbers in errors */ + macrostack *stack; /* macro expansions in force */ +}; + +/* + * Data structure to hold the input form of the source, ie a linked + * list of paragraphs + */ +struct paragraph_Tag { + paragraph *next; + int type; + wchar_t *keyword; /* for most special paragraphs */ + word *words; /* list of words in paragraph */ + int aux; /* number, in a numbered paragraph + * or subsection level + */ + word *kwtext; /* chapter/section indication */ + word *kwtext2; /* numeric-only form of kwtext */ + filepos fpos; + + paragraph *parent, *child, *sibling; /* for hierarchy navigation */ + + void *private_data; /* for temp use in backends */ +}; +enum { + para_IM, /* index merge */ + para_BR, /* bibliography rewrite */ + para_Rule, /* random horizontal rule */ + para_Chapter, + para_Appendix, + para_UnnumberedChapter, + para_Heading, + para_Subsect, + para_Normal, + para_Biblio, /* causes no output unless turned ... */ + para_BiblioCited, /* ... into this paragraph type */ + para_Bullet, + para_NumberedList, + para_Code, + para_Copyright, + para_Preamble, + para_NoCite, + para_Title, + para_VersionID, + para_Config, /* configuration directive */ + para_NotParaType /* placeholder value */ +}; + +/* + * Data structure to hold an individual word + */ +struct word_Tag { + word *next, *alt; + int type; + int aux; + int breaks; /* can a line break after it? */ + wchar_t *text; + filepos fpos; +}; +enum { + /* ORDERING CONSTRAINT: these normal-word types ... */ + word_Normal, + word_Emph, + word_Code, /* monospaced; `quoted' in text */ + word_WeakCode, /* monospaced, normal in text */ + /* ... must be in the same order as these space types ... */ + word_WhiteSpace, /* text is NULL or ignorable */ + word_EmphSpace, /* WhiteSpace when emphasised */ + word_CodeSpace, /* WhiteSpace when code */ + word_WkCodeSpace, /* WhiteSpace when weak code */ + /* ... and must be in the same order as these quote types ... */ + word_Quote, /* text is NULL or ignorable */ + word_EmphQuote, /* Quote when emphasised */ + word_CodeQuote, /* (can't happen) */ + word_WkCodeQuote, /* (can't happen) */ + /* END ORDERING CONSTRAINT */ + word_internal_endattrs, + word_UpperXref, /* \K */ + word_LowerXref, /* \k */ + word_XrefEnd, /* (invisible; no text) */ + word_IndexRef, /* (always an invisible one) */ + word_HyperLink, /* (invisible) */ + word_HyperEnd /* (also invisible; no text) */ +}; +/* aux values for attributed words */ +enum { + attr_Only = 0x0000, /* a lone word with the attribute */ + 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, +}; +/* aux values for quote-type words */ +enum { + quote_Open = 0x0010, + quote_Close = 0x0020, + quote_mask = 0x0030, +}; +#define isattr(x) ( ( (x) > word_Normal && (x) < word_WhiteSpace ) || \ + ( (x) > word_WhiteSpace && (x) < word_internal_endattrs ) ) +#define sameattr(x,y) ( (((x)-(y)) & 3) == 0 ) +#define towordstyle(x) ( word_Normal + ((x) & 3) ) +#define tospacestyle(x) ( word_WhiteSpace + ((x) & 3) ) +#define toquotestyle(x) ( word_Quote + ((x) & 3) ) +#define removeattr(x) ( word_Normal + ((x) &~ 3) ) + +#define attraux(x) ( (x) & attr_mask ) +#define quoteaux(x) ( (x) & quote_mask ) + +/* + * 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_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_whatever /* random error of another type */ +}; + +/* + * malloc.c + */ +#ifdef LOGALLOC +void *smalloc(char *file, int line, int size); +void *srealloc(char *file, int line, void *p, int size); +void sfree(char *file, int line, void *p); +#define smalloc(x) smalloc(__FILE__, __LINE__, x) +#define srealloc(x, y) srealloc(__FILE__, __LINE__, x, y) +#define sfree(x) sfree(__FILE__, __LINE__, x) +#else +void *smalloc(int size); +void *srealloc(void *p, int size); +void sfree(void *p); +#endif +void free_word_list(word *w); +void free_para_list(paragraph *p); +word *dup_word_list(word *w); +char *dupstr(char *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 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 *uadv(wchar_t *s); +wchar_t *ustrcpy(wchar_t *dest, wchar_t *source); +wchar_t utolower(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); + +/* + * help.c + */ +void help(void); +void usage(void); +void showversion(void); + +/* + * licence.c + */ +void licence(void); + +/* + * version.c + */ +const char *const version; + +/* + * misc.c + */ +typedef struct stackTag *stack; +stack stk_new(void); +void stk_free(stack); +void stk_push(stack, void *); +void *stk_pop(stack); + +typedef struct tagRdstring rdstring; +struct tagRdstring { + int pos, size; + wchar_t *text; +}; +typedef struct tagRdstringc rdstringc; +struct tagRdstringc { + int pos, size; + char *text; +}; +extern const rdstring empty_rdstring; +extern const rdstringc empty_rdstringc; +void rdadd(rdstring *rs, wchar_t c); +void rdadds(rdstring *rs, wchar_t *p); +wchar_t *rdtrim(rdstring *rs); +void rdaddc(rdstringc *rs, char c); +void rdaddsc(rdstringc *rs, char *p); +char *rdtrimc(rdstringc *rs); + +int compare_wordlists(word *a, word *b); + +void mark_attr_ends(paragraph *sourceform); + +typedef struct tagWrappedLine wrappedline; +struct tagWrappedLine { + wrappedline *next; + word *begin, *end; /* first & last words of line */ + int nspaces; /* number of whitespaces in line */ + int shortfall; /* how much shorter than max width */ +}; +wrappedline *wrap_para(word *, int, int, int (*)(word *)); +void wrap_free(wrappedline *); + +/* + * input.c + */ +paragraph *read_input(input *in, indexdata *idx); + +/* + * keywords.c + */ +struct keywordlist_Tag { + int nkeywords; + int size; + tree234 *keys; /* sorted by `key' field */ + word **looseends; /* non-keyword list element numbers */ + int nlooseends; + int looseendssize; +}; +struct keyword_Tag { + wchar_t *key; /* the keyword itself */ + word *text; /* "Chapter 2", "Appendix Q"... */ + /* (NB: filepos are not set) */ + paragraph *para; /* the paragraph referenced */ +}; +keyword *kw_lookup(keywordlist *, wchar_t *); +keywordlist *get_keywords(paragraph *); +void free_keywords(keywordlist *); +void subst_keywords(paragraph *, keywordlist *); + +/* + * index.c + */ + +/* + * Data structure to hold both sides of the index. + */ +struct indexdata_Tag { + tree234 *tags; /* holds type `indextag' */ + tree234 *entries; /* holds type `indexentry' */ +}; + +/* + * Data structure to hold an index tag (LHS of index). + */ +struct indextag_Tag { + wchar_t *name; + word *implicit_text; + word **explicit_texts; + int nexplicit, explicit_size; + int nrefs; + indexentry **refs; /* array of entries referenced by tag */ +}; + +/* + * Data structure to hold an index entry (RHS of index). + */ +struct indexentry_Tag { + word *text; + void *backend_data; /* private to back end */ +}; + +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 build_index(indexdata *); +void index_debug(indexdata *); +indextag *index_findtag(indexdata *idx, wchar_t *name); + +/* + * contents.c + */ +numberstate *number_init(void); +void number_cfg(numberstate *, paragraph *); +word *number_mktext(numberstate *, paragraph *, wchar_t *, int , int *); +void number_free(numberstate *); + +/* + * biblio.c + */ +void gen_citations(paragraph *, keywordlist *); + +/* + * style.c + */ +struct userstyle_Tag { +}; + +/* + * bk_text.c + */ +void text_backend(paragraph *, keywordlist *, indexdata *); + +/* + * bk_xhtml.c + */ +void xhtml_backend(paragraph *, keywordlist *, indexdata *); + +/* + * bk_whlp.c + */ +void whlp_backend(paragraph *, keywordlist *, indexdata *); + +#endif diff --git a/help.c b/help.c index c1e2e42..3fd957f 100644 --- a/help.c +++ b/help.c @@ -3,7 +3,7 @@ */ #include -#include "buttress.h" +#include "halibut.h" static char *helptext[] = { "FIXME: help text goes here", @@ -28,5 +28,5 @@ void usage(void) { } void showversion(void) { - printf("Buttress, %s\n", version); + printf("Halibut, %s\n", version); } diff --git a/index.c b/index.c index b5005ac..3b1df51 100644 --- a/index.c +++ b/index.c @@ -4,7 +4,7 @@ #include #include -#include "buttress.h" +#include "halibut.h" static int compare_tags(void *av, void *bv); static int compare_entries(void *av, void *bv); diff --git a/input.c b/input.c index a8f076b..15e0a97 100644 --- a/input.c +++ b/input.c @@ -5,7 +5,7 @@ #include #include #include -#include "buttress.h" +#include "halibut.h" #define TAB_STOP 8 /* for column number tracking */ @@ -157,7 +157,7 @@ enum { tok_rbrace /* } */ }; -/* Buttress command keywords. */ +/* Halibut command keywords. */ enum { c__invalid, /* invalid command */ c__comment, /* comment command (\#) */ diff --git a/inputs/test.but b/inputs/test.but index f13fba8..5849e52 100644 --- a/inputs/test.but +++ b/inputs/test.but @@ -1,4 +1,4 @@ -\title Buttress: A Test Document With A Stupidly Long Title Just To +\title Halibut: A Test Document With A Stupidly Long Title Just To See If Wrapping Titles Works OK. In Fact This Title Will Span Three Lines, Not Just Two. How's That For Ludicrous? @@ -7,7 +7,7 @@ Lines, Not Just Two. How's That For Ludicrous? \cfg{xhtml-leaf-contains-contents}{true} \preamble This manual is a small joke effort, designed to use every -feature \#{ comment } that Buttress's input format supports. Creation +feature \#{ comment } that Halibut's input format supports. Creation date \date{%Y.%m.%d} (default format is \date). \copyright Copyright 1999 Simon \#{second comment}Tatham. All rights @@ -19,7 +19,7 @@ a bit] \define{coopt} co\u00F6{-o}pt -\versionid $Id: test.but,v 1.17 2001/12/14 12:44:40 simon Exp $ +\versionid $Id: test.but,v 1.18 2002/08/05 10:31:33 simon Exp $ \C{ch\\ap} First chapter title; for similar wrapping reasons this chapter title will be ludicrously long. I wonder how much more diff --git a/keywords.c b/keywords.c index 1fc6f5e..6e8a230 100644 --- a/keywords.c +++ b/keywords.c @@ -5,7 +5,7 @@ #include #include #include -#include "buttress.h" +#include "halibut.h" static int kwcmp(void *av, void *bv) { diff --git a/main.c b/main.c index a86399a..64f1869 100644 --- a/main.c +++ b/main.c @@ -4,7 +4,7 @@ #include #include -#include "buttress.h" +#include "halibut.h" static void dbg_prtsource(paragraph *sourceform); static void dbg_prtwordlist(int level, word *w); diff --git a/malloc.c b/malloc.c index e9f54d6..1635b47 100644 --- a/malloc.c +++ b/malloc.c @@ -4,7 +4,7 @@ #include #include -#include "buttress.h" +#include "halibut.h" #ifdef LOGALLOC #define LOGPARAMS char *file, int line, @@ -37,8 +37,8 @@ static void logprintf(char *fmt, ...) { #endif /* - * smalloc should guarantee to return a useful pointer - buttress - * can do nothing except die when it's out of memory anyway + * smalloc should guarantee to return a useful pointer - Halibut + * can do nothing except die when it's out of memory anyway. */ void *(smalloc)(LOGPARAMS int size) { void *p; diff --git a/misc.c b/misc.c index 4243954..c4ac72f 100644 --- a/misc.c +++ b/misc.c @@ -2,7 +2,7 @@ * misc.c: miscellaneous useful items */ -#include "buttress.h" +#include "halibut.h" struct stackTag { void **data; diff --git a/misc/buttress.sl b/misc/buttress.sl deleted file mode 100644 index b7b30bd..0000000 --- a/misc/buttress.sl +++ /dev/null @@ -1,98 +0,0 @@ -% Buttress mode for Jed. - -$1 = "Buttress"; -create_syntax_table ($1); - -define_syntax ("\#", "", '%', $1); % Comment Syntax -define_syntax ('\\', '\\', $1); % Quote character -define_syntax ("{", "}", '(', $1); % are all these needed? -define_syntax ("a-zA-Z0-9", 'w', $1); -set_syntax_flags ($1, 8); - -#ifdef HAS_DFA_SYNTAX -%enable_highlight_cache ("buttress.dfa", $1); - -% A braced comment in Buttress is \#{ ... }, where ... may contain -% any correctly nested sequence of braces. Of course we can't match -% that in a DFA rule, so we'll go down to a reasonable depth of 3 -% instead. -#ifexists dfa_define_highlight_rule -dfa_define_highlight_rule ("\\\\#{[^{}]*({[^{}]*({[^}]*}[^{}]*)*}[^{}]*)*}", - "Qcomment", $1); - -dfa_define_highlight_rule ("\\\\#.*$", "comment", $1); -dfa_define_highlight_rule ("^\\\\c([ \t].*)?$", "string", $1); -dfa_define_highlight_rule ("\\\\[\\\\{}\\-_]", "keyword0", $1); -dfa_define_highlight_rule ("\\\\[A-Za-tv-z][A-Za-z0-9]*", "keyword0", $1); -dfa_define_highlight_rule ("\\\\u[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]", - "keyword0", $1); -dfa_define_highlight_rule ("\\\\u[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]", - "keyword1", $1); -dfa_define_highlight_rule ("[{}]", "delimiter", $1); -dfa_define_highlight_rule (".", "normal", $1); -dfa_build_highlight_table ($1); -#else -define_highlight_rule ("\\\\#{[^{}]*({[^{}]*({[^}]*}[^{}]*)*}[^{}]*)*}", - "Qcomment", $1); - -define_highlight_rule ("\\\\#.*$", "comment", $1); -define_highlight_rule ("^\\\\c([ \t].*)?$", "string", $1); -define_highlight_rule ("\\\\[\\\\{}\\-_]", "keyword0", $1); -define_highlight_rule ("\\\\[A-Za-tv-z][A-Za-z0-9]*", "keyword0", $1); -define_highlight_rule ("\\\\u[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]", - "keyword0", $1); -define_highlight_rule ("\\\\u[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]", - "keyword1", $1); -define_highlight_rule ("[{}]", "delimiter", $1); -define_highlight_rule (".", "normal", $1); -build_highlight_table ($1); -#endif -#endif - -% This hook identifies lines containing comments as paragraph separator -define buttress_is_comment() { - bol (); - while (ffind ("\\\\#")) go_right (3); - ffind ("\\#"); % return value on stack -} - -variable Buttress_Ignore_Comment = 0; % if true, line containing a comment - % does not delimit a paragraph - -define buttress_paragraph_separator() { - bol(); - skip_white(); - if (eolp()) - return 1; - if (looking_at("\\c ") or looking_at("\\c\t") or - looking_at("\\c\n")) - return 1; - return not (Buttress_Ignore_Comment) and buttress_is_comment(); -} - -define buttress_wrap_hook() { - variable yep; - push_spot (); - yep = up_1 () and buttress_is_comment (); - pop_spot (); - if (yep) { - push_spot (); - bol_skip_white (); - insert ("\\# "); - pop_spot (); - } -} - -#ifexists mode_set_mode_info -mode_set_mode_info("Buttress", "fold_info", "\\# {{{\r\\# }}}\r\r"); -#endif - -define buttress_mode() { - variable mode = "Buttress"; - % use_keymap (mode); - set_mode (mode, 0x1 | 0x20); - set_buffer_hook ("par_sep", "buttress_paragraph_separator"); - set_buffer_hook ("wrap_hook", "buttress_wrap_hook"); - use_syntax_table (mode); - runhooks ("buttress_mode_hook"); -} diff --git a/misc/halibut.sl b/misc/halibut.sl new file mode 100644 index 0000000..e88b1ed --- /dev/null +++ b/misc/halibut.sl @@ -0,0 +1,98 @@ +% Halibut mode for Jed. + +$1 = "Halibut"; +create_syntax_table ($1); + +define_syntax ("\#", "", '%', $1); % Comment Syntax +define_syntax ('\\', '\\', $1); % Quote character +define_syntax ("{", "}", '(', $1); % are all these needed? +define_syntax ("a-zA-Z0-9", 'w', $1); +set_syntax_flags ($1, 8); + +#ifdef HAS_DFA_SYNTAX +%enable_highlight_cache ("halibut.dfa", $1); + +% A braced comment in Halibut is \#{ ... }, where ... may contain +% any correctly nested sequence of braces. Of course we can't match +% that in a DFA rule, so we'll go down to a reasonable depth of 3 +% instead. +#ifexists dfa_define_highlight_rule +dfa_define_highlight_rule ("\\\\#{[^{}]*({[^{}]*({[^}]*}[^{}]*)*}[^{}]*)*}", + "Qcomment", $1); + +dfa_define_highlight_rule ("\\\\#.*$", "comment", $1); +dfa_define_highlight_rule ("^\\\\c([ \t].*)?$", "string", $1); +dfa_define_highlight_rule ("\\\\[\\\\{}\\-_]", "keyword0", $1); +dfa_define_highlight_rule ("\\\\[A-Za-tv-z][A-Za-z0-9]*", "keyword0", $1); +dfa_define_highlight_rule ("\\\\u[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]", + "keyword0", $1); +dfa_define_highlight_rule ("\\\\u[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]", + "keyword1", $1); +dfa_define_highlight_rule ("[{}]", "delimiter", $1); +dfa_define_highlight_rule (".", "normal", $1); +dfa_build_highlight_table ($1); +#else +define_highlight_rule ("\\\\#{[^{}]*({[^{}]*({[^}]*}[^{}]*)*}[^{}]*)*}", + "Qcomment", $1); + +define_highlight_rule ("\\\\#.*$", "comment", $1); +define_highlight_rule ("^\\\\c([ \t].*)?$", "string", $1); +define_highlight_rule ("\\\\[\\\\{}\\-_]", "keyword0", $1); +define_highlight_rule ("\\\\[A-Za-tv-z][A-Za-z0-9]*", "keyword0", $1); +define_highlight_rule ("\\\\u[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]", + "keyword0", $1); +define_highlight_rule ("\\\\u[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]", + "keyword1", $1); +define_highlight_rule ("[{}]", "delimiter", $1); +define_highlight_rule (".", "normal", $1); +build_highlight_table ($1); +#endif +#endif + +% This hook identifies lines containing comments as paragraph separator +define halibut_is_comment() { + bol (); + while (ffind ("\\\\#")) go_right (3); + ffind ("\\#"); % return value on stack +} + +variable Halibut_Ignore_Comment = 0; % if true, line containing a comment + % does not delimit a paragraph + +define halibut_paragraph_separator() { + bol(); + skip_white(); + if (eolp()) + return 1; + if (looking_at("\\c ") or looking_at("\\c\t") or + looking_at("\\c\n")) + return 1; + return not (Halibut_Ignore_Comment) and halibut_is_comment(); +} + +define halibut_wrap_hook() { + variable yep; + push_spot (); + yep = up_1 () and halibut_is_comment (); + pop_spot (); + if (yep) { + push_spot (); + bol_skip_white (); + insert ("\\# "); + pop_spot (); + } +} + +#ifexists mode_set_mode_info +mode_set_mode_info("Halibut", "fold_info", "\\# {{{\r\\# }}}\r\r"); +#endif + +define halibut_mode() { + variable mode = "Halibut"; + % use_keymap (mode); + set_mode (mode, 0x1 | 0x20); + set_buffer_hook ("par_sep", "halibut_paragraph_separator"); + set_buffer_hook ("wrap_hook", "halibut_wrap_hook"); + use_syntax_table (mode); + runhooks ("halibut_mode_hook"); +} diff --git a/style.c b/style.c index bc16b2f..562c594 100644 --- a/style.c +++ b/style.c @@ -4,5 +4,5 @@ #include #include -#include "buttress.h" +#include "halibut.h" diff --git a/ustring.c b/ustring.c index a6690c1..1573a19 100644 --- a/ustring.c +++ b/ustring.c @@ -4,7 +4,7 @@ #include #include -#include "buttress.h" +#include "halibut.h" wchar_t *ustrdup(wchar_t *s) { wchar_t *r; diff --git a/winhelp.c b/winhelp.c index 990c49e..005409e 100644 --- a/winhelp.c +++ b/winhelp.c @@ -71,7 +71,7 @@ #include #include -#include "buttress.h" +#include "halibut.h" #include "winhelp.h" #include "tree234.h" -- cgit v1.1