version 1.6, 2015/02/23 11:56:39 |
version 1.21, 2015/03/01 00:25:07 |
|
|
#ifndef EXTERN_H |
#ifndef EXTERN_H |
#define EXTERN_H |
#define EXTERN_H |
|
|
|
#if !defined(__BEGIN_DECLS) |
|
# ifdef __cplusplus |
|
# define __BEGIN_DECLS extern "C" { |
|
# else |
|
# define __BEGIN_DECLS |
|
# endif |
|
#endif |
|
#if !defined(__END_DECLS) |
|
# ifdef __cplusplus |
|
# define __END_DECLS } |
|
# else |
|
# define __END_DECLS |
|
# endif |
|
#endif |
|
|
/* |
/* |
* This defines each one of the Texinfo commands that we understand. |
* This defines each one of the Texinfo commands that we understand. |
* Obviously this only refers to native commands; overriden names are a |
* Obviously this only refers to native commands; overriden names are a |
* different story. |
* different story. |
*/ |
*/ |
enum texicmd { |
enum texicmd { |
|
TEXICMD_A4PAPER, |
|
TEXICMD_AA, |
|
TEXICMD_AASMALL, |
TEXICMD_ACRONYM, |
TEXICMD_ACRONYM, |
TEXICMD_ACUTE, |
TEXICMD_ACUTE, |
TEXICMD_A4PAPER, |
TEXICMD_AE, |
|
TEXICMD_AESMALL, |
TEXICMD_ANCHOR, |
TEXICMD_ANCHOR, |
TEXICMD_APPENDIX, |
TEXICMD_APPENDIX, |
TEXICMD_APPENDIXSEC, |
TEXICMD_APPENDIXSEC, |
|
|
TEXICMD_BANG, |
TEXICMD_BANG, |
TEXICMD_BULLET, |
TEXICMD_BULLET, |
TEXICMD_BYE, |
TEXICMD_BYE, |
|
TEXICMD_CARTOUCHE, |
|
TEXICMD_CEDILLA, |
TEXICMD_CENTER, |
TEXICMD_CENTER, |
TEXICMD_CHAPTER, |
TEXICMD_CHAPTER, |
TEXICMD_CINDEX, |
TEXICMD_CINDEX, |
|
|
TEXICMD_CODE, |
TEXICMD_CODE, |
TEXICMD_COLON, |
TEXICMD_COLON, |
TEXICMD_COLUMNFRACTIONS, |
TEXICMD_COLUMNFRACTIONS, |
|
TEXICMD_COMMA, |
TEXICMD_COMMAND, |
TEXICMD_COMMAND, |
TEXICMD_COMMENT, |
TEXICMD_COMMENT, |
TEXICMD_COMMENT_LONG, |
TEXICMD_COMMENT_LONG, |
|
|
TEXICMD_DEFTYPEFNX, |
TEXICMD_DEFTYPEFNX, |
TEXICMD_DEFTYPEFUN, |
TEXICMD_DEFTYPEFUN, |
TEXICMD_DEFTYPEFUNX, |
TEXICMD_DEFTYPEFUNX, |
|
TEXICMD_DEFTYPEMETHOD, |
|
TEXICMD_DEFTYPEMETHODX, |
TEXICMD_DEFTYPEVAR, |
TEXICMD_DEFTYPEVAR, |
TEXICMD_DEFTYPEVARX, |
TEXICMD_DEFTYPEVARX, |
TEXICMD_DEFTYPEVR, |
TEXICMD_DEFTYPEVR, |
|
|
TEXICMD_DEFVRX, |
TEXICMD_DEFVRX, |
TEXICMD_DETAILMENU, |
TEXICMD_DETAILMENU, |
TEXICMD_DFN, |
TEXICMD_DFN, |
|
TEXICMD_DH, |
|
TEXICMD_DHSMALL, |
TEXICMD_DIRCATEGORY, |
TEXICMD_DIRCATEGORY, |
TEXICMD_DIRENTRY, |
TEXICMD_DIRENTRY, |
TEXICMD_DISPLAY, |
TEXICMD_DISPLAY, |
TEXICMD_DMN, |
TEXICMD_DMN, |
|
TEXICMD_DOCUMENTDESCRPITION, |
|
TEXICMD_DOCUMENTENCODING, |
|
TEXICMD_DOCUMENTLANGUAGE, |
|
TEXICMD_DOTACCENT, |
|
TEXICMD_DOTLESS, |
TEXICMD_DOTS, |
TEXICMD_DOTS, |
TEXICMD_EMAIL, |
TEXICMD_EMAIL, |
TEXICMD_EMPH, |
TEXICMD_EMPH, |
TEXICMD_END, |
TEXICMD_END, |
|
TEXICMD_ENDDOTS, |
TEXICMD_ENUMERATE, |
TEXICMD_ENUMERATE, |
TEXICMD_ENV, |
TEXICMD_ENV, |
TEXICMD_EQUIV, |
TEXICMD_EQUIV, |
TEXICMD_ERROR, |
TEXICMD_ERROR, |
|
TEXICMD_EURO, |
TEXICMD_EXAMPLE, |
TEXICMD_EXAMPLE, |
|
TEXICMD_EXCLAMDOWN, |
TEXICMD_EXDENT, |
TEXICMD_EXDENT, |
TEXICMD_EXPANSION, |
TEXICMD_EXPANSION, |
TEXICMD_FILE, |
TEXICMD_FILE, |
TEXICMD_FINALOUT, |
TEXICMD_FINALOUT, |
TEXICMD_FINDEX, |
TEXICMD_FINDEX, |
|
TEXICMD_FLUSHLEFT, |
|
TEXICMD_FLUSHRIGHT, |
|
TEXICMD_FIRSTPARAGRAPHINDENT, |
|
TEXICMD_FOOTNOTE, |
|
TEXICMD_FOOTNOTESTYLE, |
TEXICMD_FTABLE, |
TEXICMD_FTABLE, |
TEXICMD_FORMAT, |
TEXICMD_FORMAT, |
|
TEXICMD_GEQ, |
TEXICMD_GRAVE, |
TEXICMD_GRAVE, |
TEXICMD_GROUP, |
TEXICMD_GROUP, |
|
TEXICMD_GUILLEMETLEFT, |
|
TEXICMD_GUILLEMETRIGHT, |
|
TEXICMD_GUILLEMOTLEFT, |
|
TEXICMD_GUILLEMOTRIGHT, |
|
TEXICMD_GUILSINGLLEFT, |
|
TEXICMD_GUILSINGLRIGHT, |
|
TEXICMD_H, |
TEXICMD_HEADING, |
TEXICMD_HEADING, |
TEXICMD_HEADINGS, |
TEXICMD_HEADINGS, |
TEXICMD_HEADITEM, |
TEXICMD_HEADITEM, |
|
|
TEXICMD_IMAGE, |
TEXICMD_IMAGE, |
TEXICMD_INCLUDE, |
TEXICMD_INCLUDE, |
TEXICMD_INDENTBLOCK, |
TEXICMD_INDENTBLOCK, |
TEXICMD_USER_INDEX, |
TEXICMD_INDICATEURL, |
|
TEXICMD_INFOREF, |
TEXICMD_INSERTCOPYING, |
TEXICMD_INSERTCOPYING, |
TEXICMD_ITEM, |
TEXICMD_ITEM, |
TEXICMD_ITEMIZE, |
TEXICMD_ITEMIZE, |
|
|
TEXICMD_KBD, |
TEXICMD_KBD, |
TEXICMD_KEY, |
TEXICMD_KEY, |
TEXICMD_KINDEX, |
TEXICMD_KINDEX, |
|
TEXICMD_L, |
TEXICMD_LATEX, |
TEXICMD_LATEX, |
|
TEXICMD_LEQ, |
TEXICMD_LOWERSECTIONS, |
TEXICMD_LOWERSECTIONS, |
|
TEXICMD_LSMALL, |
TEXICMD_MACRO, |
TEXICMD_MACRO, |
|
TEXICMD_MACRON, |
TEXICMD_MATH, |
TEXICMD_MATH, |
TEXICMD_MENU, |
TEXICMD_MENU, |
TEXICMD_MINUS, |
TEXICMD_MINUS, |
|
|
TEXICMD_NEWLINE, |
TEXICMD_NEWLINE, |
TEXICMD_NODE, |
TEXICMD_NODE, |
TEXICMD_NOINDENT, |
TEXICMD_NOINDENT, |
|
TEXICMD_O, |
|
TEXICMD_OE, |
|
TEXICMD_OESMALL, |
|
TEXICMD_OGONEK, |
TEXICMD_OPTION, |
TEXICMD_OPTION, |
TEXICMD_PXREF, |
TEXICMD_ORDF, |
TEXICMD_QUESTIONMARK, |
TEXICMD_ORDM, |
TEXICMD_QUOTATION, |
TEXICMD_OSMALL, |
TEXICMD_PAGE, |
TEXICMD_PAGE, |
TEXICMD_PARINDENT, |
TEXICMD_PARINDENT, |
TEXICMD_PERIOD, |
TEXICMD_PERIOD, |
TEXICMD_PINDEX, |
TEXICMD_PINDEX, |
|
TEXICMD_POUNDS, |
TEXICMD_PRINTINDEX, |
TEXICMD_PRINTINDEX, |
|
TEXICMD_PXREF, |
|
TEXICMD_QUESTIONDOWN, |
|
TEXICMD_QUESTIONMARK, |
|
TEXICMD_QUOTATION, |
|
TEXICMD_QUOTEDBLBASE, |
|
TEXICMD_QUOTEDBLLEFT, |
|
TEXICMD_QUOTEDBLRIGHT, |
|
TEXICMD_QUOTESINGLBASE, |
|
TEXICMD_QUOTELEFT, |
|
TEXICMD_QUOTERIGHT, |
TEXICMD_R, |
TEXICMD_R, |
TEXICMD_RAISESECTIONS, |
TEXICMD_RAISESECTIONS, |
TEXICMD_REF, |
TEXICMD_REF, |
TEXICMD_REFILL, |
TEXICMD_REFILL, |
|
TEXICMD_REGISTEREDSYMBOL, |
TEXICMD_RESULT, |
TEXICMD_RESULT, |
|
TEXICMD_RINGACCENT, |
TEXICMD_SAMP, |
TEXICMD_SAMP, |
TEXICMD_SANSSERIF, |
TEXICMD_SANSSERIF, |
TEXICMD_SC, |
TEXICMD_SC, |
TEXICMD_SECTION, |
TEXICMD_SECTION, |
TEXICMD_SET, |
TEXICMD_SET, |
TEXICMD_SETCHAPNEWPAGE, |
TEXICMD_SETCHAPNEWPAGE, |
|
TEXICMD_SETCONTENTSAFTER, |
TEXICMD_SETFILENAME, |
TEXICMD_SETFILENAME, |
TEXICMD_SETTITLE, |
TEXICMD_SETTITLE, |
TEXICMD_SHORTCONTENTS, |
TEXICMD_SHORTCONTENTS, |
TEXICMD_SLANTED, |
TEXICMD_SLANTED, |
|
TEXICMD_SLASH, |
TEXICMD_SP, |
TEXICMD_SP, |
TEXICMD_SPACE, |
TEXICMD_SPACE, |
TEXICMD_SMALLBOOK, |
TEXICMD_SMALLBOOK, |
|
|
TEXICMD_SMALLINDENTBLOCK, |
TEXICMD_SMALLINDENTBLOCK, |
TEXICMD_SQUIGGLE_LEFT, |
TEXICMD_SQUIGGLE_LEFT, |
TEXICMD_SQUIGGLE_RIGHT, |
TEXICMD_SQUIGGLE_RIGHT, |
|
TEXICMD_SS, |
TEXICMD_STRONG, |
TEXICMD_STRONG, |
TEXICMD_SUBHEADING, |
TEXICMD_SUBHEADING, |
TEXICMD_SUBSECTION, |
TEXICMD_SUBSECTION, |
|
|
TEXICMD_TABLE, |
TEXICMD_TABLE, |
TEXICMD_TEX, |
TEXICMD_TEX, |
TEXICMD_TEXSYM, |
TEXICMD_TEXSYM, |
|
TEXICMD_TEXTDEGREE, |
|
TEXICMD_TH, |
|
TEXICMD_THSMALL, |
|
TEXICMD_TIE, |
|
TEXICMD_TIEACCENT, |
TEXICMD_TILDE, |
TEXICMD_TILDE, |
TEXICMD_TINDEX, |
TEXICMD_TINDEX, |
TEXICMD_TITLE, |
TEXICMD_TITLE, |
TEXICMD_TITLEFONT, |
TEXICMD_TITLEFONT, |
TEXICMD_TITLEPAGE, |
TEXICMD_TITLEPAGE, |
TEXICMD_TOP, |
TEXICMD_TOP, |
|
TEXICMD_U, |
|
TEXICMD_UBARACCENT, |
|
TEXICMD_UDOTACCENT, |
TEXICMD_UMLAUT, |
TEXICMD_UMLAUT, |
TEXICMD_UNNUMBERED, |
TEXICMD_UNNUMBERED, |
TEXICMD_UNNUMBEREDSEC, |
TEXICMD_UNNUMBEREDSEC, |
|
|
TEXICMD_UNNUMBEREDSUBSUBSEC, |
TEXICMD_UNNUMBEREDSUBSUBSEC, |
TEXICMD_UREF, |
TEXICMD_UREF, |
TEXICMD_URL, |
TEXICMD_URL, |
|
TEXICMD_USER_INDEX, |
|
TEXICMD_V, |
TEXICMD_VALUE, |
TEXICMD_VALUE, |
TEXICMD_VAR, |
TEXICMD_VAR, |
|
TEXICMD_VERB, |
TEXICMD_VERBATIM, |
TEXICMD_VERBATIM, |
TEXICMD_VERBATIMINCLUDE, |
TEXICMD_VERBATIMINCLUDE, |
TEXICMD_VINDEX, |
TEXICMD_VINDEX, |
|
|
TEXICMD__MAX |
TEXICMD__MAX |
}; |
}; |
|
|
|
enum texisrc { |
|
TEXISRC_FILE, |
|
TEXISRC_STDIN |
|
}; |
|
|
/* |
/* |
* The file currently being parsed. |
* The file currently being parsed. |
* This keeps track of our location within that file. |
* This keeps track of our location within that file. |
*/ |
*/ |
struct texifile { |
struct texifile { |
|
enum texisrc type; /* type of file */ |
const char *name; /* name of the file */ |
const char *name; /* name of the file */ |
size_t line; /* current line (from zero) */ |
size_t line; /* current line (from zero) */ |
size_t col; /* current column in line (from zero) */ |
size_t col; /* current column in line (from zero) */ |
char *map; /* mmap'd file */ |
char *map; /* allocated file buffer */ |
size_t mapsz; /* size of mmap */ |
size_t mapsz; /* size of map */ |
|
size_t mapmaxsz; /* full size of map */ |
|
size_t insplice; /* how many bytes left in splice */ |
|
size_t depth; /* pasted macro recursive depth */ |
}; |
}; |
|
|
struct texi; |
struct texi; |
|
|
/* |
/* |
* Callback for functions implementing texi commands. |
* Callback for functions implementing texi commands. |
*/ |
*/ |
typedef void (*texicmdfp)(struct texi *, |
typedef void (*texicmdfp)(struct texi *, enum texicmd, size_t *); |
enum texicmd, const char *, size_t, size_t *); |
|
|
|
/* |
/* |
* Describes Texinfo commands, whether native or overriden. |
* Describes Texinfo commands, whether native or overriden. |
Line 245 struct texitok { |
|
Line 336 struct texitok { |
|
size_t len; /* strlen(tok) */ |
size_t len; /* strlen(tok) */ |
}; |
}; |
|
|
|
/* |
|
* These values instruct us on whether a list (or table) of some type is |
|
* currently being parsed. |
|
*/ |
enum texilist { |
enum texilist { |
TEXILIST_NONE = 0, |
TEXILIST_NONE = 0, |
TEXILIST_ITEM, |
TEXILIST_ITEM, |
|
|
TEXILIST_TABLE |
TEXILIST_TABLE |
}; |
}; |
|
|
|
/* |
|
* Hold values assigned with @set and retrieved with @value. |
|
* These values can contain arbitrary Texinfo. |
|
*/ |
struct texivalue { |
struct texivalue { |
char *key; |
char *key; /* the nil-terminated value name */ |
char *value; |
char *value; /* the nil-terminated value */ |
}; |
}; |
|
|
|
/* |
|
* Macros are (possibly-recursive) Texinfo sequences created with @macro |
|
* and filled in by arguments when invoked. |
|
*/ |
struct teximacro { |
struct teximacro { |
char *key; |
char *key; /* nil-terminated macro name */ |
char *value; |
char *value; /* nil-terminated value */ |
char **args; |
char **args; /* array of argument names (or NULL) */ |
size_t argsz; |
size_t argsz; /* array size */ |
}; |
}; |
|
|
/* |
/* |
Line 269 struct teximacro { |
|
Line 372 struct teximacro { |
|
* This keeps any necessary information handy. |
* This keeps any necessary information handy. |
*/ |
*/ |
struct texi { |
struct texi { |
|
const char *chapters; /* are we splitting chapters */ |
|
size_t chapnum; |
|
char **dirs; /* texi directories */ |
|
size_t dirsz; /* number of texi directories */ |
|
FILE *outfile; |
|
/* |
|
* Run-time parameters. |
|
*/ |
struct texifile files[64]; /* stack of open files */ |
struct texifile files[64]; /* stack of open files */ |
size_t filepos; /* number of open files */ |
size_t filepos; /* number of open files */ |
const char *valstack[64]; /* stack of opened values */ |
const char *valstack[64]; /* stack of opened values */ |
size_t valstackpos; /* position in valstack */ |
size_t valstackpos; /* position in valstack */ |
size_t outcol; /* column in output line */ |
|
char **dirs; /* texi directories */ |
|
size_t dirsz; /* number of texi directories */ |
|
char *title; /* title of document */ |
char *title; /* title of document */ |
char *subtitle; /* subtitle of document */ |
char *subtitle; /* subtitle of document */ |
int secoffs; /* see sectioner() */ |
int secoffs; /* see sectioner() */ |
|
|
size_t indexsz; /* entries in indexs */ |
size_t indexsz; /* entries in indexs */ |
struct texivalue *vals; /* @value entries */ |
struct texivalue *vals; /* @value entries */ |
size_t valsz; /* entries in vals */ |
size_t valsz; /* entries in vals */ |
struct teximacro *macros; |
struct teximacro *macros; /* @macro entries */ |
size_t macrosz; |
size_t macrosz; /* entries in macros */ |
/* |
/* |
* The following control what we output to the screen. |
* The following control what we output to the screen. |
* The complexity is required to accomodate for mdoc(7). |
* The complexity is required to accomodate for mdoc(7). |
*/ |
*/ |
enum texilist list; /* current list (set recursively) */ |
enum texilist list; /* current list (set recursively) */ |
int outmacro; /* if >0, output is in line macro */ |
int outmacro; /* if >0, output is in line macro */ |
|
size_t outcol; /* column in output line */ |
int seenws; /* ws has been seen (and ignored) */ |
int seenws; /* ws has been seen (and ignored) */ |
int seenvs; /* newline has been Pp'd */ |
int seenvs; /* newline has been Pp'd */ |
int ign; /* if >0, don't print anything */ |
int ign; /* if >0, don't print anything */ |
int literal; /* if >0, literal context */ |
int literal; /* if >0, literal context */ |
}; |
}; |
|
|
|
#define BUF(_p) ((_p)->files[(_p)->filepos - 1].map) |
|
#define BUFSZ(_p) ((_p)->files[(_p)->filepos - 1].mapsz) |
|
|
#define isws(_x) \ |
#define isws(_x) \ |
(' ' == (_x) || '\t' == (_x)) |
(' ' == (_x) || '\t' == (_x)) |
#define ismspace(_x) \ |
#define ismspace(_x) \ |
|
|
|
|
__BEGIN_DECLS |
__BEGIN_DECLS |
|
|
void advance(struct texi *, const char *, size_t *); |
void advance(struct texi *, size_t *); |
size_t advanceeoln(struct texi *, const char *, size_t, size_t *, int); |
size_t advanceeoln(struct texi *, size_t *, int); |
void advanceto(struct texi *, const char *, size_t *, size_t); |
void advanceto(struct texi *, size_t *, size_t); |
|
|
char **argparse(struct texi *, const char *, size_t, size_t *, size_t *, size_t); |
char **argparse(struct texi *, size_t *, size_t *, size_t); |
|
|
int parsearg(struct texi *, const char *, size_t, size_t *, size_t); |
int parsearg(struct texi *, size_t *, size_t); |
void parsebracket(struct texi *, const char *, size_t, size_t *); |
void parsebracket(struct texi *, size_t *, int); |
|
void parsestdin(struct texi *); |
void parsefile(struct texi *, const char *, int); |
void parsefile(struct texi *, const char *, int); |
int parselinearg(struct texi *, const char *, size_t, size_t *); |
int parselinearg(struct texi *, size_t *); |
void parseeof(struct texi *, const char *, size_t); |
void parseeoln(struct texi *, size_t *); |
void parsemembuf(struct texi *, const char *, size_t); |
void parseto(struct texi *, size_t *, const char *); |
void parseeoln(struct texi *, const char *, size_t, size_t *); |
|
void parsesingle(struct texi *, const char *, size_t, size_t *); |
|
void parseto(struct texi *, const char *, size_t, size_t *, const char *); |
|
|
|
void texiabort(struct texi *, const char *) |
void texiabort(struct texi *, const char *) |
__attribute__((noreturn)); |
__attribute__((noreturn)); |
enum texicmd |
enum texicmd |
texicmd(struct texi *, const char *, size_t, size_t, |
texicmd(const struct texi *, size_t, size_t *, struct teximacro **); |
size_t *, struct teximacro **); |
enum texicmd |
|
peekcmd(const struct texi *, size_t); |
void texierr(struct texi *, const char *, ...) |
void texierr(struct texi *, const char *, ...) |
__attribute__((format(printf, 2, 3))) |
__attribute__((format(printf, 2, 3))) |
__attribute__((noreturn)); |
__attribute__((noreturn)); |
Line 333 void texifilepop(struct texi *); |
|
Line 444 void texifilepop(struct texi *); |
|
void teximacro(struct texi *, const char *); |
void teximacro(struct texi *, const char *); |
void teximacroclose(struct texi *); |
void teximacroclose(struct texi *); |
void teximacroopen(struct texi *, const char *); |
void teximacroopen(struct texi *, const char *); |
void texipunctuate(struct texi *, const char *, size_t, size_t *); |
void teximdocopen(struct texi *); |
|
void teximdocclose(struct texi *, int); |
|
void texipunctuate(struct texi *, size_t *); |
|
void texiputbuf(struct texi *p, size_t, size_t); |
void texiputchar(struct texi *p, char); |
void texiputchar(struct texi *p, char); |
void texiputchars(struct texi *, const char *); |
void texiputchars(struct texi *, const char *); |
void texivspace(struct texi *); |
void texivspace(struct texi *); |
void texiwarn(const struct texi *, const char *, ...) |
void texiwarn(const struct texi *, const char *, ...) |
__attribute__((format(printf, 2, 3))); |
__attribute__((format(printf, 2, 3))); |
|
void texisplice(struct texi *, const char *, size_t, size_t *); |
|
|
void valueadd(struct texi *, char *, char *); |
void valueadd(struct texi *, char *, char *); |
const char * |
const char * |
valueblookup(struct texi *, const char *, size_t, size_t *); |
valueblookup(struct texi *, size_t *); |
void valuelclear(struct texi *, const char *, size_t, size_t *); |
void valuelclear(struct texi *, size_t *); |
const char * |
const char * |
valuellookup(struct texi *, const char *, size_t, size_t *); |
valuellookup(struct texi *, size_t *); |
|
|
extern const struct texitok *const texitoks; |
extern const struct texitok *const texitoks; |
|
|