1*d3737e9cSchristos /* $NetBSD: xml.c,v 1.2 2016/01/14 00:34:53 christos Exp $ */
229619d2aSchristos
329619d2aSchristos /* xml.c -- xml output.
429619d2aSchristos Id: xml.c,v 1.52 2004/12/19 17:02:23 karl Exp
529619d2aSchristos
629619d2aSchristos Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
729619d2aSchristos
829619d2aSchristos This program is free software; you can redistribute it and/or modify
929619d2aSchristos it under the terms of the GNU General Public License as published by
1029619d2aSchristos the Free Software Foundation; either version 2, or (at your option)
1129619d2aSchristos any later version.
1229619d2aSchristos
1329619d2aSchristos This program is distributed in the hope that it will be useful,
1429619d2aSchristos but WITHOUT ANY WARRANTY; without even the implied warranty of
1529619d2aSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1629619d2aSchristos GNU General Public License for more details.
1729619d2aSchristos
1829619d2aSchristos You should have received a copy of the GNU General Public License
1929619d2aSchristos along with this program; if not, write to the Free Software
2029619d2aSchristos Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2129619d2aSchristos
2229619d2aSchristos Originally written by Philippe Martin <feloy@free.fr>. */
2329619d2aSchristos
2429619d2aSchristos #include "system.h"
2529619d2aSchristos #include "makeinfo.h"
2629619d2aSchristos #include "insertion.h"
2729619d2aSchristos #include "files.h"
2829619d2aSchristos #include "float.h"
2929619d2aSchristos #include "macro.h"
3029619d2aSchristos #include "cmds.h"
3129619d2aSchristos #include "lang.h"
3229619d2aSchristos
3329619d2aSchristos #include "xml.h"
3429619d2aSchristos
3529619d2aSchristos /* Options */
3629619d2aSchristos int xml_index_divisions = 1;
3729619d2aSchristos
3829619d2aSchristos typedef struct _element
3929619d2aSchristos {
4029619d2aSchristos char name[32];
4129619d2aSchristos int contains_para;
4229619d2aSchristos int contained_in_para;
4329619d2aSchristos int keep_space;
4429619d2aSchristos } element;
4529619d2aSchristos
4629619d2aSchristos element texinfoml_element_list [] = {
4729619d2aSchristos { "texinfo", 1, 0, 0 },
4829619d2aSchristos { "setfilename", 0, 0, 0 },
4929619d2aSchristos { "titlefont", 0, 0, 0 },
5029619d2aSchristos { "settitle", 0, 0, 0 },
5129619d2aSchristos { "documentdescription", 1, 0, 0 },
5229619d2aSchristos
5329619d2aSchristos { "node", 1, 0, 0 },
5429619d2aSchristos { "nodenext", 0, 0, 0 },
5529619d2aSchristos { "nodeprev", 0, 0, 0 },
5629619d2aSchristos { "nodeup", 0, 0, 0 },
5729619d2aSchristos
5829619d2aSchristos { "chapter", 1, 0, 0 },
5929619d2aSchristos { "section", 1, 0, 0 },
6029619d2aSchristos { "subsection", 1, 0, 0 },
6129619d2aSchristos { "subsubsection", 1, 0, 0 },
6229619d2aSchristos
6329619d2aSchristos { "top", 1, 0, 0 },
6429619d2aSchristos { "unnumbered", 1, 0, 0 },
6529619d2aSchristos { "unnumberedsec", 1, 0, 0 },
6629619d2aSchristos { "unnumberedsubsec", 1, 0, 0 },
6729619d2aSchristos { "unnumberedsubsubsec", 1, 0, 0 },
6829619d2aSchristos
6929619d2aSchristos { "appendix", 1, 0, 0 },
7029619d2aSchristos { "appendixsec", 1, 0, 0 },
7129619d2aSchristos { "appendixsubsec", 1, 0, 0 },
7229619d2aSchristos { "appendixsubsubsec", 1, 0, 0 },
7329619d2aSchristos
7429619d2aSchristos { "majorheading", 0, 0, 0 },
7529619d2aSchristos { "chapheading", 0, 0, 0 },
7629619d2aSchristos { "heading", 0, 0, 0 },
7729619d2aSchristos { "subheading", 0, 0, 0 },
7829619d2aSchristos { "subsubheading", 0, 0, 0 },
7929619d2aSchristos
8029619d2aSchristos { "titlepage", 1, 0, 0 },
8129619d2aSchristos { "author", 0, 0, 0 },
8229619d2aSchristos { "booktitle", 0, 0, 0 },
8329619d2aSchristos { "booksubtitle", 0, 0, 0 },
8429619d2aSchristos
8529619d2aSchristos { "menu", 1, 0, 0 },
8629619d2aSchristos { "detailmenu", 1, 0, 0 },
8729619d2aSchristos { "menuentry", 0, 0, 0 },
8829619d2aSchristos { "menutitle", 0, 0, 0 },
8929619d2aSchristos { "menucomment", 0, 0, 0 },
9029619d2aSchristos { "menunode", 0, 0, 0 },
9129619d2aSchristos { "nodename", 0, 0, 0 },
9229619d2aSchristos
9329619d2aSchristos { "acronym", 0, 1, 0 },
9429619d2aSchristos { "acronymword", 0, 1, 0 },
9529619d2aSchristos { "acronymdesc", 0, 1, 0 },
9629619d2aSchristos
9729619d2aSchristos { "abbrev", 0, 1, 0 },
9829619d2aSchristos { "abbrevword", 0, 1, 0 },
9929619d2aSchristos { "abbrevdesc", 0, 1, 0 },
10029619d2aSchristos
10129619d2aSchristos { "tt", 0, 1, 0 },
10229619d2aSchristos { "code", 0, 1, 0 },
10329619d2aSchristos { "command", 0, 1, 0 },
10429619d2aSchristos { "env", 0, 1, 0 },
10529619d2aSchristos { "file", 0, 1, 0 },
10629619d2aSchristos { "option", 0, 1, 0 },
10729619d2aSchristos { "samp", 0, 1, 0 },
10829619d2aSchristos { "kbd", 0, 1, 0 },
10929619d2aSchristos { "url", 0, 1, 0 },
11029619d2aSchristos { "key", 0, 1, 0 },
11129619d2aSchristos { "var", 0, 1, 0 },
11229619d2aSchristos { "sc", 0, 1, 0 },
11329619d2aSchristos { "dfn", 0, 1, 0 },
11429619d2aSchristos { "emph", 0, 1, 0 },
11529619d2aSchristos { "strong", 0, 1, 0 },
11629619d2aSchristos { "cite", 0, 1, 0 },
11729619d2aSchristos { "notfixedwidth", 0, 1, 0 },
11829619d2aSchristos { "i", 0, 1, 0 },
11929619d2aSchristos { "b", 0, 1, 0 },
12029619d2aSchristos { "r", 0, 1, 0 },
12129619d2aSchristos { "slanted", 0, 1, 0 },
12229619d2aSchristos { "sansserif", 0, 1, 0 },
12329619d2aSchristos
12429619d2aSchristos { "exdent", 0, 0, 0 },
12529619d2aSchristos
12629619d2aSchristos { "title", 0, 0, 0 },
12729619d2aSchristos { "ifinfo", 1, 0, 0 },
12829619d2aSchristos { "sp", 0, 0, 0 },
12929619d2aSchristos { "center", 1, 0, 0 },
13029619d2aSchristos { "dircategory", 0, 0, 0 },
13129619d2aSchristos { "quotation", 1, 0, 0 },
13229619d2aSchristos { "example", 0, 0, 1 },
13329619d2aSchristos { "smallexample", 0, 0, 1 },
13429619d2aSchristos { "lisp", 0, 0, 1 },
13529619d2aSchristos { "smalllisp", 0, 0, 1 },
13629619d2aSchristos { "cartouche", 1, 0, 0 },
13729619d2aSchristos { "copying", 1, 0, 0 },
13829619d2aSchristos { "format", 0, 0, 1 },
13929619d2aSchristos { "smallformat", 0, 0, 1 },
14029619d2aSchristos { "display", 0, 0, 1 },
14129619d2aSchristos { "smalldisplay", 0, 0, 1 },
14229619d2aSchristos { "verbatim", 0, 0, 1 },
14329619d2aSchristos { "footnote", 0, 1, 0 },
14429619d2aSchristos { "", 0, 1, 0 }, /* LINEANNOTATION (docbook) */
14529619d2aSchristos
14629619d2aSchristos { "", 1, 0, 0 }, /* TIP (docbook) */
14729619d2aSchristos { "", 1, 0, 0 }, /* NOTE (docbook) */
14829619d2aSchristos { "", 1, 0, 0 }, /* IMPORTANT (docbook) */
14929619d2aSchristos { "", 1, 0, 0 }, /* WARNING (docbook) */
15029619d2aSchristos { "", 1, 0, 0 }, /* CAUTION (docbook) */
15129619d2aSchristos
15229619d2aSchristos { "itemize", 0, 0, 0 },
15329619d2aSchristos { "itemfunction", 0, 0, 0 },
15429619d2aSchristos { "item", 1, 0, 0 },
15529619d2aSchristos { "enumerate", 0, 0, 0 },
15629619d2aSchristos { "table", 0, 0, 0 },
15729619d2aSchristos { "tableitem", 0, 0, 0 },
15829619d2aSchristos { "tableterm", 0, 0, 0 },
15929619d2aSchristos
16029619d2aSchristos { "indexterm", 0, 1, 0 },
16129619d2aSchristos
16229619d2aSchristos { "math", 0, 1, 0 },
16329619d2aSchristos
16429619d2aSchristos { "dmn", 0, 1, 0 },
16529619d2aSchristos
16629619d2aSchristos { "xref", 0, 1, 0 },
16729619d2aSchristos { "xrefnodename", 0, 1, 0 },
16829619d2aSchristos { "xrefinfoname", 0, 1, 0 },
16929619d2aSchristos { "xrefprinteddesc", 0, 1, 0 },
17029619d2aSchristos { "xrefinfofile", 0, 1, 0 },
17129619d2aSchristos { "xrefprintedname", 0, 1, 0 },
17229619d2aSchristos
17329619d2aSchristos { "inforef", 0, 1, 0 },
17429619d2aSchristos { "inforefnodename", 0, 1, 0 },
17529619d2aSchristos { "inforefrefname", 0, 1, 0 },
17629619d2aSchristos { "inforefinfoname", 0, 1, 0 },
17729619d2aSchristos
17829619d2aSchristos { "uref", 0, 1, 0 },
17929619d2aSchristos { "urefurl", 0, 1, 0 },
18029619d2aSchristos { "urefdesc", 0, 1, 0 },
18129619d2aSchristos { "urefreplacement", 0, 1, 0 },
18229619d2aSchristos
18329619d2aSchristos { "email", 0, 1, 0 },
18429619d2aSchristos { "emailaddress", 0, 1, 0 },
18529619d2aSchristos { "emailname", 0, 1, 0 },
18629619d2aSchristos
18729619d2aSchristos { "group", 0, 0, 0 },
18829619d2aSchristos { "float", 1, 0, 0 },
18929619d2aSchristos { "floattype", 0, 0, 0 },
19029619d2aSchristos { "floatpos", 0, 0, 0 },
19129619d2aSchristos { "caption", 0, 0, 0 },
19229619d2aSchristos { "shortcaption", 0, 0, 0 },
19329619d2aSchristos
19429619d2aSchristos { "", 0, 0, 0 }, /* TABLE (docbook) */
19529619d2aSchristos { "", 0, 0, 0 }, /* FIGURE (docbook) */
19629619d2aSchristos { "", 0, 0, 0 }, /* EXAMPLE (docbook) */
19729619d2aSchristos { "", 1, 0, 0 }, /* SIDEBAR (docbook) */
19829619d2aSchristos
19929619d2aSchristos { "printindex", 0, 0, 0 },
20029619d2aSchristos { "listoffloats", 0, 0, 0 },
20129619d2aSchristos { "anchor", 0, 1, 0 },
20229619d2aSchristos
20329619d2aSchristos { "image", 0, 0, 0 },
20429619d2aSchristos { "inlineimage", 0, 1, 0 },
20529619d2aSchristos { "alttext", 0, 1, 0 },
20629619d2aSchristos
20729619d2aSchristos { "", 0, 1, 0 }, /* PRIMARY (docbook) */
20829619d2aSchristos { "", 0, 1, 0 }, /* SECONDARY (docbook) */
20929619d2aSchristos { "", 0, 0, 0 }, /* INFORMALFIGURE (docbook) */
21029619d2aSchristos { "", 0, 0, 0 }, /* MEDIAOBJECT (docbook) */
21129619d2aSchristos { "", 0, 0, 0 }, /* IMAGEOBJECT (docbook) */
21229619d2aSchristos { "", 0, 0, 0 }, /* IMAGEDATA (docbook) */
21329619d2aSchristos { "", 0, 0, 0 }, /* TEXTOBJECT (docbook) */
21429619d2aSchristos { "", 0, 0, 0 }, /* INDEXENTRY (docbook) */
21529619d2aSchristos { "", 0, 0, 0 }, /* PRIMARYIE (docbook) */
21629619d2aSchristos { "", 0, 0, 0 }, /* SECONDARYIE (docbook) */
21729619d2aSchristos { "", 0, 0, 0 }, /* INDEXDIV (docbook) */
21829619d2aSchristos { "multitable", 0, 0, 0 },
21929619d2aSchristos { "", 0, 0, 0 }, /* TGROUP (docbook) */
22029619d2aSchristos { "columnfraction", 0, 0, 0 },
22129619d2aSchristos { "thead", 0, 0, 0 },
22229619d2aSchristos { "tbody", 0, 0, 0 },
22329619d2aSchristos { "entry", 0, 0, 0 },
22429619d2aSchristos { "row", 0, 0, 0 },
22529619d2aSchristos { "", 0, 0, 0 }, /* BOOKINFO (docbook) */
22629619d2aSchristos { "", 0, 0, 0 }, /* ABSTRACT (docbook) */
22729619d2aSchristos { "", 0, 0, 0 }, /* REPLACEABLE (docbook) */
22829619d2aSchristos { "", 0, 0, 0 }, /* ENVAR (docbook) */
22929619d2aSchristos { "", 0, 0, 0 }, /* COMMENT (docbook) */
23029619d2aSchristos { "", 0, 0, 0 }, /* FUNCTION (docbook) */
23129619d2aSchristos { "", 0, 0, 0 }, /* LEGALNOTICE (docbook) */
23229619d2aSchristos
23329619d2aSchristos { "contents", 0, 0, 0 },
23429619d2aSchristos { "shortcontents", 0, 0, 0 },
23529619d2aSchristos { "documentlanguage", 0, 0, 0 },
23629619d2aSchristos
23729619d2aSchristos { "setvalue", 0, 0, 0 },
23829619d2aSchristos { "clearvalue", 0, 0, 0 },
23929619d2aSchristos
24029619d2aSchristos { "definition", 0, 0, 0 },
24129619d2aSchristos { "definitionterm", 0, 0, 0 },
24229619d2aSchristos { "definitionitem", 1, 0, 0 },
24329619d2aSchristos { "defcategory", 0, 0, 0 },
24429619d2aSchristos { "deffunction", 0, 0, 0 },
24529619d2aSchristos { "defvariable", 0, 0, 0 },
24629619d2aSchristos { "defparam", 0, 0, 0 },
24729619d2aSchristos { "defdelimiter", 0, 0, 0 },
24829619d2aSchristos { "deftype", 0, 0, 0 },
24929619d2aSchristos { "defparamtype", 0, 0, 0 },
25029619d2aSchristos { "defdatatype", 0, 0, 0 },
25129619d2aSchristos { "defclass", 0, 0, 0 },
25229619d2aSchristos { "defclassvar", 0, 0, 0 },
25329619d2aSchristos { "defoperation", 0, 0, 0 },
25429619d2aSchristos
25529619d2aSchristos { "para", 0, 0, 0 } /* Must be last */
25629619d2aSchristos /* name / contains para / contained in para / preserve space */
25729619d2aSchristos };
25829619d2aSchristos
25929619d2aSchristos element docbook_element_list [] = {
26029619d2aSchristos { "book", 0, 0, 0 }, /* TEXINFO */
26129619d2aSchristos { "", 0, 0, 0 }, /* SETFILENAME */
26229619d2aSchristos { "", 0, 0, 0 }, /* TITLEINFO */
26329619d2aSchristos { "title", 0, 0, 0 }, /* SETTITLE */
26429619d2aSchristos { "", 1, 0, 0 }, /* DOCUMENTDESCRIPTION (?) */
26529619d2aSchristos
26629619d2aSchristos { "", 1, 0, 0 }, /* NODE */
26729619d2aSchristos { "", 0, 0, 0 }, /* NODENEXT */
26829619d2aSchristos { "", 0, 0, 0 }, /* NODEPREV */
26929619d2aSchristos { "", 0, 0, 0 }, /* NODEUP */
27029619d2aSchristos
27129619d2aSchristos { "chapter", 1, 0, 0 },
27229619d2aSchristos { "sect1", 1, 0, 0 }, /* SECTION */
27329619d2aSchristos { "sect2", 1, 0, 0 }, /* SUBSECTION */
27429619d2aSchristos { "sect3", 1, 0, 0 }, /* SUBSUBSECTION */
27529619d2aSchristos
27629619d2aSchristos { "chapter", 1, 0, 0 }, /* TOP */
27729619d2aSchristos { "chapter", 1, 0, 0 }, /* UNNUMBERED */
27829619d2aSchristos { "sect1", 1, 0, 0 }, /* UNNUMBEREDSEC */
27929619d2aSchristos { "sect2", 1, 0, 0 }, /* UNNUMBEREDSUBSEC */
28029619d2aSchristos { "sect3", 1, 0, 0 }, /* UNNUMBEREDSUBSUBSEC */
28129619d2aSchristos
28229619d2aSchristos { "appendix", 1, 0, 0 },
28329619d2aSchristos { "sect1", 1, 0, 0 }, /* APPENDIXSEC */
28429619d2aSchristos { "sect2", 1, 0, 0 }, /* APPENDIXSUBSEC */
28529619d2aSchristos { "sect3", 1, 0, 0 }, /* APPENDIXSUBSUBSEC */
28629619d2aSchristos
28729619d2aSchristos { "bridgehead", 0, 0, 0 }, /* MAJORHEADING */
28829619d2aSchristos { "bridgehead", 0, 0, 0 }, /* CHAPHEADING */
28929619d2aSchristos { "bridgehead", 0, 0, 0 }, /* HEADING */
29029619d2aSchristos { "bridgehead", 0, 0, 0 }, /* SUBHEADING */
29129619d2aSchristos { "bridgehead", 0, 0, 0 }, /* SUBSUBHEADING */
29229619d2aSchristos
29329619d2aSchristos { "", 0, 0, 0 }, /* TITLEPAGE */
29429619d2aSchristos { "", 0, 0, 0 }, /* AUTHOR */
29529619d2aSchristos { "", 0, 0, 0 }, /* BOOKTITLE */
29629619d2aSchristos { "", 0, 0, 0 }, /* BOOKSUBTITLE */
29729619d2aSchristos
29829619d2aSchristos { "", 1, 0, 0 }, /* MENU */
29929619d2aSchristos { "", 1, 0, 0 }, /* DETAILMENU */
30029619d2aSchristos { "", 1, 0, 0 }, /* MENUENTRY */
30129619d2aSchristos { "", 0, 0, 0 }, /* MENUTITLE */
30229619d2aSchristos { "", 1, 0, 0 }, /* MENUCOMMENT */
30329619d2aSchristos { "", 0, 0, 0 }, /* MENUNODE */
30429619d2aSchristos { "anchor", 0, 0, 0 }, /* NODENAME */
30529619d2aSchristos
30629619d2aSchristos { "acronym", 0, 1, 0 },
30729619d2aSchristos { "", 0, 1, 0 }, /* ACRONYMWORD */
30829619d2aSchristos { "", 0, 1, 0 }, /* ACRONYMDESC */
30929619d2aSchristos
31029619d2aSchristos { "abbrev", 0, 1, 0 },
31129619d2aSchristos { "", 0, 1, 0 }, /* ABBREVWORD */
31229619d2aSchristos { "", 0, 1, 0 }, /* ABBREVDESC */
31329619d2aSchristos
31429619d2aSchristos { "literal", 0, 1, 0 }, /* TT */
31529619d2aSchristos { "literal", 0, 1, 0 }, /* CODE */
31629619d2aSchristos { "command", 0, 1, 0 }, /* COMMAND */
31729619d2aSchristos { "envar", 0, 1, 0 }, /* ENV */
31829619d2aSchristos { "filename", 0, 1, 0 }, /* FILE */
31929619d2aSchristos { "option", 0, 1, 0 }, /* OPTION */
32029619d2aSchristos { "literal", 0, 1, 0 }, /* SAMP */
32129619d2aSchristos { "userinput", 0, 1, 0 }, /* KBD */
32229619d2aSchristos { "wordasword", 0, 1, 0 }, /* URL */
32329619d2aSchristos { "keycap", 0, 1, 0 }, /* KEY */
32429619d2aSchristos { "replaceable", 0, 1, 0 }, /* VAR */
32529619d2aSchristos { "", 0, 1, 0 }, /* SC */
32629619d2aSchristos { "firstterm", 0, 1, 0 }, /* DFN */
32729619d2aSchristos { "emphasis", 0, 1, 0 }, /* EMPH */
32829619d2aSchristos { "emphasis", 0, 1, 0 }, /* STRONG */
32929619d2aSchristos { "citetitle", 0, 1, 0 }, /* CITE */
33029619d2aSchristos { "", 0, 1, 0 }, /* NOTFIXEDWIDTH */
33129619d2aSchristos { "wordasword", 0, 1, 0 }, /* I */
33229619d2aSchristos { "emphasis", 0, 1, 0 }, /* B */
33329619d2aSchristos { "", 0, 1, 0 }, /* R */
33429619d2aSchristos
33529619d2aSchristos { "", 0, 0, 0 }, /* EXDENT */
33629619d2aSchristos
33729619d2aSchristos { "title", 0, 0, 0 },
33829619d2aSchristos { "", 1, 0, 0 }, /* IFINFO */
33929619d2aSchristos { "", 0, 0, 0 }, /* SP */
34029619d2aSchristos { "", 1, 0, 0 }, /* CENTER */
34129619d2aSchristos { "", 0, 0, 0 }, /* DIRCATEGORY */
34229619d2aSchristos { "blockquote", 1, 0, 0 }, /* QUOTATION */
34329619d2aSchristos { "screen", 0, 0, 1 }, /* EXAMPLE */
34429619d2aSchristos { "screen", 0, 0, 1 }, /* SMALLEXAMPLE */
34529619d2aSchristos { "programlisting", 0, 0, 1 }, /* LISP */
34629619d2aSchristos { "programlisting", 0, 0, 1 }, /* SMALLLISP */
34729619d2aSchristos { "", 1, 0, 0 }, /* CARTOUCHE */
34829619d2aSchristos { "", 1, 0, 0 }, /* COPYING */
34929619d2aSchristos { "screen", 0, 1, 1 }, /* FORMAT */
35029619d2aSchristos { "screen", 0, 1, 1 }, /* SMALLFORMAT */
35129619d2aSchristos { "literallayout", 0, 1, 1 }, /* DISPLAY */
35229619d2aSchristos { "literallayout", 0, 1, 1 }, /* SMALLDISPLAY */
35329619d2aSchristos { "screen", 0, 0, 1 }, /* VERBATIM */
35429619d2aSchristos { "footnote", 0, 1, 0 },
35529619d2aSchristos { "lineannotation", 0, 1, 0 },
35629619d2aSchristos
35729619d2aSchristos { "tip", 1, 0, 0 },
35829619d2aSchristos { "note", 1, 0, 0 },
35929619d2aSchristos { "important", 1, 0, 0 },
36029619d2aSchristos { "warning", 1, 0, 0 },
36129619d2aSchristos { "caution", 1, 0, 0 },
36229619d2aSchristos
36329619d2aSchristos { "itemizedlist", 0, 0, 0 }, /* ITEMIZE */
36429619d2aSchristos { "", 0, 0, 0 }, /* ITEMFUNCTION */
36529619d2aSchristos { "listitem", 1, 0, 0 }, /* ITEM */
36629619d2aSchristos { "orderedlist", 0, 0, 0 }, /* ENUMERATE */
36729619d2aSchristos { "variablelist", 0, 0, 0 }, /* TABLE */
36829619d2aSchristos { "varlistentry", 0, 0, 0 }, /* TABLEITEM */
36929619d2aSchristos { "term", 0, 0, 0 }, /* TABLETERM */
37029619d2aSchristos
37129619d2aSchristos { "indexterm", 0, 1, 0 }, /* INDEXTERM */
37229619d2aSchristos
37329619d2aSchristos { "", 0, 1, 0 }, /* MATH */
37429619d2aSchristos
37529619d2aSchristos { "", 0, 1, 0 }, /* DIMENSION */
37629619d2aSchristos
37729619d2aSchristos { "xref", 0, 1, 0 }, /* XREF */
37829619d2aSchristos { "link", 0, 1, 0 }, /* XREFNODENAME */
37929619d2aSchristos { "", 0, 1, 0 }, /* XREFINFONAME */
38029619d2aSchristos { "", 0, 1, 0 }, /* XREFPRINTEDDESC */
38129619d2aSchristos { "", 0, 1, 0 }, /* XREFINFOFILE */
38229619d2aSchristos { "", 0, 1, 0 }, /* XREFPRINTEDNAME */
38329619d2aSchristos
38429619d2aSchristos { "", 0, 1, 0 }, /* INFOREF */
38529619d2aSchristos { "", 0, 1, 0 }, /* INFOREFNODENAME */
38629619d2aSchristos { "", 0, 1, 0 }, /* INFOREFREFNAME */
38729619d2aSchristos { "", 0, 1, 0 }, /* INFOREFINFONAME */
38829619d2aSchristos
38929619d2aSchristos { "ulink", 0, 1, 0 }, /* UREF */
39029619d2aSchristos { "", 0, 1, 0 }, /* UREFURL */
39129619d2aSchristos { "", 0, 1, 0 }, /* UREFDESC */
39229619d2aSchristos { "", 0, 1, 0 }, /* UREFREPLACEMENT */
39329619d2aSchristos
39429619d2aSchristos { "ulink", 0, 1, 0 }, /* EMAIL */
39529619d2aSchristos { "", 0, 1, 0 }, /* EMAILADDRESS */
39629619d2aSchristos { "", 0, 1, 0 }, /* EMAILNAME */
39729619d2aSchristos
39829619d2aSchristos { "", 0, 0, 0 }, /* GROUP */
39929619d2aSchristos { "", 1, 0, 0 }, /* FLOAT */
40029619d2aSchristos { "", 0, 0, 0 }, /* FLOATTYPE */
40129619d2aSchristos { "", 0, 0, 0 }, /* FLOATPOS */
40229619d2aSchristos { "", 0, 0, 0 }, /* CAPTION */
40329619d2aSchristos { "", 0, 0, 0 }, /* SHORTCAPTION */
40429619d2aSchristos
40529619d2aSchristos { "table", 0, 1, 0 },
40629619d2aSchristos { "figure", 0, 1, 0 },
40729619d2aSchristos { "example", 1, 1, 0 },
40829619d2aSchristos { "sidebar", 1, 0, 0 },
40929619d2aSchristos
41029619d2aSchristos { "index", 0, 1, 0 }, /* PRINTINDEX */
41129619d2aSchristos { "", 0, 1, 0 }, /* LISTOFFLOATS */
41229619d2aSchristos { "", 0, 1, 0 }, /* ANCHOR */
41329619d2aSchristos
41429619d2aSchristos { "", 0, 0, 0 }, /* IMAGE */
41529619d2aSchristos { "inlinemediaobject", 0, 1, 0 }, /* INLINEIMAGE */
41629619d2aSchristos { "", 0, 0, 0 }, /* IMAGEALTTEXT */
41729619d2aSchristos
41829619d2aSchristos { "primary", 0, 1, 0 }, /* PRIMARY */
41929619d2aSchristos { "secondary", 0, 1, 0 },
42029619d2aSchristos { "informalfigure", 0, 0, 0 },
42129619d2aSchristos { "mediaobject", 0, 0, 0 },
42229619d2aSchristos { "imageobject", 0, 1, 0 },
42329619d2aSchristos { "imagedata", 0, 1, 0 },
42429619d2aSchristos { "textobject", 0, 1, 0 },
42529619d2aSchristos { "indexentry", 0, 0, 0 },
42629619d2aSchristos { "primaryie", 0, 0, 0 },
42729619d2aSchristos { "secondaryie", 0, 0, 0 },
42829619d2aSchristos { "indexdiv", 0, 0, 0 },
42929619d2aSchristos { "informaltable", 0, 0, 0 },
43029619d2aSchristos { "tgroup", 0, 0, 0 },
43129619d2aSchristos { "colspec", 0, 0, 0 },
43229619d2aSchristos { "thead", 0, 0, 0 },
43329619d2aSchristos { "tbody", 0, 0, 0 },
43429619d2aSchristos { "entry", 0, 0, 0 },
43529619d2aSchristos { "row", 0, 0, 0 },
43629619d2aSchristos { "bookinfo", 0, 0, 0 },
43729619d2aSchristos { "abstract", 1, 0, 0 },
43829619d2aSchristos { "replaceable", 0, 0, 0 },
43929619d2aSchristos { "envar", 0, 1, 0 },
44029619d2aSchristos { "comment", 0, 0, 0 },
44129619d2aSchristos { "function", 0, 1, 0 },
44229619d2aSchristos { "legalnotice", 1, 0, 0 },
44329619d2aSchristos
44429619d2aSchristos { "", 0, 0, 0 }, /* CONTENTS (xml) */
44529619d2aSchristos { "", 0, 0, 0 }, /* SHORTCONTENTS (xml) */
44629619d2aSchristos { "", 0, 0, 0 }, /* DOCUMENT LANGUAGE (xml) */
44729619d2aSchristos
44829619d2aSchristos { "", 0, 0, 0 }, /* SETVALUE (xml) */
44929619d2aSchristos { "", 0, 0, 0 }, /* CLEARVALUE (xml) */
45029619d2aSchristos
45129619d2aSchristos { "blockquote", 1, 0, 0 }, /* DEFINITION */
45229619d2aSchristos { "screen", 0, 0, 1 }, /* DEFINITIONTERM */
45329619d2aSchristos { "", 0, 0, 0 }, /* DEFINITIONITEM (xml) */
45429619d2aSchristos { "", 0, 0, 0 }, /* DEFCATEGORY (xml) */
45529619d2aSchristos { "function", 0, 0, 0 }, /* DEFFUNCTION */
45629619d2aSchristos { "varname", 0, 0, 0 }, /* DEFVARIABLE */
45729619d2aSchristos { "varname", 0, 0, 0 }, /* DEFPARAM */
45829619d2aSchristos { "", 0, 0, 0 }, /* DEFDELIMITER (xml) */
45929619d2aSchristos { "returnvalue", 0, 0, 0 }, /* DEFTYPE */
46029619d2aSchristos { "type", 0, 0, 0 }, /* DEFPARAMTYPE */
46129619d2aSchristos { "structname", 0, 0, 0 }, /* DEFDATATYPE */
46229619d2aSchristos { "classname", 0, 0, 0 }, /* DEFCLASS */
46329619d2aSchristos { "property", 0, 0, 0 }, /* DEFCLASSVAR */
46429619d2aSchristos { "methodname", 0, 0, 0 }, /* DEFOPERATION */
46529619d2aSchristos
46629619d2aSchristos { "para", 0, 0, 0 } /* Must be last */
46729619d2aSchristos /* name / contains para / contained in para / preserve space */
46829619d2aSchristos };
46929619d2aSchristos
47029619d2aSchristos element *xml_element_list = NULL;
47129619d2aSchristos
47229619d2aSchristos
47329619d2aSchristos typedef struct _replace_element
47429619d2aSchristos {
47529619d2aSchristos int element_to_replace;
47629619d2aSchristos int element_containing;
47729619d2aSchristos int element_replacing;
47829619d2aSchristos } replace_element;
47929619d2aSchristos
48029619d2aSchristos /* Elements to replace - Docbook only
48129619d2aSchristos -------------------
48229619d2aSchristos if `element_to_replace' have to be inserted
48329619d2aSchristos as a child of `element_containing,'
48429619d2aSchristos use `element_replacing' instead.
48529619d2aSchristos
48629619d2aSchristos A value of `-1' for element_replacing means `do not use any element.'
48729619d2aSchristos */
48829619d2aSchristos
48929619d2aSchristos replace_element replace_elements [] = {
49029619d2aSchristos { I, TABLETERM, EMPH },
49129619d2aSchristos { B, TABLETERM, EMPH },
49229619d2aSchristos { TT, CODE, -1 },
49329619d2aSchristos { EXAMPLE, DISPLAY, -1 },
49429619d2aSchristos { CODE, DFN, -1 },
49529619d2aSchristos { CODE, VAR, -1 },
49629619d2aSchristos { EMPH, CODE, REPLACEABLE },
49729619d2aSchristos { VAR, VAR, -1},
49829619d2aSchristos { VAR, B, EMPH},
49929619d2aSchristos { B, CODE, ENVAR},
50029619d2aSchristos { CODE, I, EMPH},
50129619d2aSchristos { SAMP, VAR, -1 },
50229619d2aSchristos { FORMAT, BOOKINFO, ABSTRACT },
50329619d2aSchristos { QUOTATION, ABSTRACT, -1},
50429619d2aSchristos { LINEANNOTATION, LINEANNOTATION, -1 },
50529619d2aSchristos { LEGALNOTICE, ABSTRACT, -1 },
50629619d2aSchristos { QUOTATION, QUOTATION, -1 },
50729619d2aSchristos /* Formal versions of table and image elements. */
50829619d2aSchristos { MULTITABLE, FLOAT, FLOATTABLE },
50929619d2aSchristos { INFORMALFIGURE, FLOAT, FLOATFIGURE },
51029619d2aSchristos { CARTOUCHE, FLOAT, FLOATCARTOUCHE },
51129619d2aSchristos /* Unnecessary markup in @defun blocks. */
51229619d2aSchristos { VAR, DEFPARAM, -1 },
51329619d2aSchristos { CODE, DEFTYPE, -1 },
51429619d2aSchristos /* Add your elements to replace here */
51529619d2aSchristos {-1, 0, 0}
51629619d2aSchristos };
51729619d2aSchristos
51829619d2aSchristos int xml_in_menu_entry = 0;
51929619d2aSchristos int xml_in_menu_entry_comment = 0;
52029619d2aSchristos int xml_node_open = 0;
52129619d2aSchristos int xml_node_level = -1;
52229619d2aSchristos int xml_in_para = 0;
52329619d2aSchristos int xml_just_after_element = 0;
52429619d2aSchristos int xml_keep_space = 0;
52529619d2aSchristos
52629619d2aSchristos int xml_no_indent = 0;
52729619d2aSchristos
52829619d2aSchristos int xml_no_para = 0;
52929619d2aSchristos char *xml_node_id = NULL;
53029619d2aSchristos int xml_sort_index = 0;
53129619d2aSchristos
53229619d2aSchristos int xml_in_xref_token = 0;
53329619d2aSchristos int xml_in_bookinfo = 0;
53429619d2aSchristos int xml_in_book_title = 0;
53529619d2aSchristos int xml_in_abstract = 0;
53629619d2aSchristos
53729619d2aSchristos /* Non-zero if we are handling an element that can appear between
53829619d2aSchristos @item and @itemx, @deffn and @deffnx. */
53929619d2aSchristos int xml_dont_touch_items_defs = 0;
54029619d2aSchristos
54129619d2aSchristos /* We need to keep footnote state, because elements inside footnote may try
54229619d2aSchristos to close the previous parent para. */
54329619d2aSchristos static int xml_in_footnote = 0;
54429619d2aSchristos
54529619d2aSchristos static int xml_after_table_term = 0;
54629619d2aSchristos static int book_started = 0;
54729619d2aSchristos static int first_section_opened = 0;
54829619d2aSchristos
54929619d2aSchristos static int xml_in_tableitem[256];
55029619d2aSchristos static int xml_in_item[256];
55129619d2aSchristos static int xml_table_level = 0;
55229619d2aSchristos
55329619d2aSchristos static int xml_in_def_item[256];
55429619d2aSchristos static int xml_definition_level = 0;
55529619d2aSchristos int xml_after_def_term = 0;
55629619d2aSchristos
55729619d2aSchristos static int in_table_title = 0;
55829619d2aSchristos
55929619d2aSchristos static int in_indexentry = 0;
56029619d2aSchristos static int in_secondary = 0;
56129619d2aSchristos static int in_indexterm = 0;
56229619d2aSchristos
56329619d2aSchristos char *
xml_id(char * id)56429619d2aSchristos xml_id (char *id)
56529619d2aSchristos {
56629619d2aSchristos char *tem = xmalloc (strlen (id) + 1);
56729619d2aSchristos char *p = tem;
56829619d2aSchristos strcpy (tem, id);
56929619d2aSchristos while (*p)
57029619d2aSchristos { /* Check if a character is allowed in ID attributes. This list differs
57129619d2aSchristos slightly from XML specs that it doesn't contain underscores.
57229619d2aSchristos See http://xml.coverpages.org/sgmlsyn/sgmlsyn.htm, ``9.3 Name'' */
57329619d2aSchristos if (!strchr ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.", *p))
57429619d2aSchristos *p = '-';
57529619d2aSchristos p++;
57629619d2aSchristos }
57729619d2aSchristos p = tem;
57829619d2aSchristos /* First character can only be a letter. */
57929619d2aSchristos if (!strchr ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", *p))
58029619d2aSchristos *p = 'i';
58129619d2aSchristos return tem;
58229619d2aSchristos }
58329619d2aSchristos
58429619d2aSchristos int
xml_element(char * name)58529619d2aSchristos xml_element (char *name)
58629619d2aSchristos {
58729619d2aSchristos int i;
58829619d2aSchristos for (i=0; i<=PARA; i++)
58929619d2aSchristos {
59029619d2aSchristos if (strcasecmp (name, texinfoml_element_list[i].name) == 0)
59129619d2aSchristos return i;
59229619d2aSchristos }
59329619d2aSchristos printf ("Error xml_element\n");
59429619d2aSchristos return -1;
59529619d2aSchristos }
59629619d2aSchristos
59729619d2aSchristos void
xml_begin_document(char * output_filename)59829619d2aSchristos xml_begin_document (char *output_filename)
59929619d2aSchristos {
60029619d2aSchristos if (book_started)
60129619d2aSchristos return;
60229619d2aSchristos
60329619d2aSchristos book_started = 1;
60429619d2aSchristos
60529619d2aSchristos /* Make sure this is the very first string of the output document. */
60629619d2aSchristos output_paragraph_offset = 0;
60729619d2aSchristos
60829619d2aSchristos insert_string ("<?xml version=\"1.0\"");
60929619d2aSchristos
61029619d2aSchristos /* At this point, we register a delayed writing for document encoding,
61129619d2aSchristos so in the end, proper encoding attribute will be inserted here.
61229619d2aSchristos Since the user is unaware that we are implicitly executing this
61329619d2aSchristos command, we should disable warnings temporarily, in order to avoid
61429619d2aSchristos possible confusion. (ie. if the output is not seekable,
61529619d2aSchristos register_delayed_write issues a warning.) */
61629619d2aSchristos {
61729619d2aSchristos extern int print_warnings;
61829619d2aSchristos int save_print_warnings = print_warnings;
61929619d2aSchristos print_warnings = 0;
62029619d2aSchristos register_delayed_write ("@documentencoding");
62129619d2aSchristos print_warnings = save_print_warnings;
62229619d2aSchristos }
62329619d2aSchristos
62429619d2aSchristos insert_string ("?>\n");
62529619d2aSchristos
62629619d2aSchristos if (docbook)
62729619d2aSchristos {
62829619d2aSchristos insert_string ("<!DOCTYPE book PUBLIC \"-//OASIS//DTD DocBook XML V4.2//EN\" \"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\" [\n <!ENTITY tex \"TeX\">\n <!ENTITY latex \"LaTeX\">\n]>");
62929619d2aSchristos xml_element_list = docbook_element_list;
63029619d2aSchristos }
63129619d2aSchristos else
63229619d2aSchristos {
63329619d2aSchristos insert_string ("<!DOCTYPE texinfo PUBLIC \"-//GNU//DTD TexinfoML V");
63429619d2aSchristos insert_string (VERSION);
63529619d2aSchristos insert_string ("//EN\" \"http://www.gnu.org/software/texinfo/dtd/");
63629619d2aSchristos insert_string (VERSION);
63729619d2aSchristos insert_string ("/texinfo.dtd\">");
63829619d2aSchristos xml_element_list = texinfoml_element_list;
63929619d2aSchristos }
64029619d2aSchristos if (language_code != last_language_code)
64129619d2aSchristos {
64229619d2aSchristos if (docbook)
64329619d2aSchristos xml_insert_element_with_attribute (TEXINFO, START, "lang=\"%s\"", language_table[language_code].abbrev);
64429619d2aSchristos else
64529619d2aSchristos xml_insert_element_with_attribute (TEXINFO, START, "xml:lang=\"%s\"", language_table[language_code].abbrev);
64629619d2aSchristos }
64729619d2aSchristos if (!docbook)
64829619d2aSchristos {
64929619d2aSchristos xml_insert_element (SETFILENAME, START);
65029619d2aSchristos insert_string (output_filename);
65129619d2aSchristos xml_insert_element (SETFILENAME, END);
65229619d2aSchristos }
65329619d2aSchristos }
65429619d2aSchristos
65529619d2aSchristos /* */
65629619d2aSchristos static int element_stack[256];
65729619d2aSchristos static int element_stack_index = 0;
65829619d2aSchristos
65929619d2aSchristos static int
xml_current_element(void)66029619d2aSchristos xml_current_element (void)
66129619d2aSchristos {
66229619d2aSchristos return element_stack[element_stack_index-1];
66329619d2aSchristos }
66429619d2aSchristos
66529619d2aSchristos static void
xml_push_current_element(int elt)66629619d2aSchristos xml_push_current_element (int elt)
66729619d2aSchristos {
66829619d2aSchristos element_stack[element_stack_index++] = elt;
66929619d2aSchristos if (element_stack_index > 200)
67029619d2aSchristos printf ("*** stack overflow (%d - %s) ***\n",
67129619d2aSchristos element_stack_index,
67229619d2aSchristos xml_element_list[elt].name);
67329619d2aSchristos }
67429619d2aSchristos
67529619d2aSchristos static void
xml_pop_current_element(void)67629619d2aSchristos xml_pop_current_element (void)
67729619d2aSchristos {
67829619d2aSchristos element_stack_index--;
67929619d2aSchristos if (element_stack_index < 0)
68029619d2aSchristos printf ("*** stack underflow (%d - %d) ***\n",
68129619d2aSchristos element_stack_index,
68229619d2aSchristos xml_current_element());
68329619d2aSchristos }
68429619d2aSchristos
68529619d2aSchristos int
xml_current_stack_index(void)68629619d2aSchristos xml_current_stack_index (void)
68729619d2aSchristos {
68829619d2aSchristos return element_stack_index;
68929619d2aSchristos }
69029619d2aSchristos
69129619d2aSchristos void
xml_end_current_element(void)69229619d2aSchristos xml_end_current_element (void)
69329619d2aSchristos {
69429619d2aSchristos xml_insert_element (xml_current_element (), END);
69529619d2aSchristos }
69629619d2aSchristos
69729619d2aSchristos static void
xml_indent(void)69829619d2aSchristos xml_indent (void)
69929619d2aSchristos {
70029619d2aSchristos if (xml_indentation_increment > 0)
70129619d2aSchristos {
70229619d2aSchristos int i;
70329619d2aSchristos if (output_paragraph[output_paragraph_offset-1] != '\n')
70429619d2aSchristos insert ('\n');
70529619d2aSchristos for (i = 0; i < element_stack_index * xml_indentation_increment; i++)
70629619d2aSchristos insert (' ');
70729619d2aSchristos }
70829619d2aSchristos }
70929619d2aSchristos
71029619d2aSchristos void
xml_start_para(void)71129619d2aSchristos xml_start_para (void)
71229619d2aSchristos {
71329619d2aSchristos if (xml_in_para || xml_in_footnote
71429619d2aSchristos || !xml_element_list[xml_current_element()].contains_para)
71529619d2aSchristos return;
71629619d2aSchristos
71729619d2aSchristos while (output_paragraph[output_paragraph_offset-1] == '\n')
71829619d2aSchristos output_paragraph_offset--;
71929619d2aSchristos xml_indent ();
72029619d2aSchristos
72129619d2aSchristos insert_string ("<para");
72229619d2aSchristos if (xml_no_indent)
72329619d2aSchristos insert_string (" role=\"continues\"");
72429619d2aSchristos insert_string (">");
72529619d2aSchristos xml_no_indent = 0;
72629619d2aSchristos xml_in_para = 1;
72729619d2aSchristos }
72829619d2aSchristos
72929619d2aSchristos void
xml_end_para(void)73029619d2aSchristos xml_end_para (void)
73129619d2aSchristos {
73229619d2aSchristos if (!xml_in_para || xml_in_footnote)
73329619d2aSchristos return;
73429619d2aSchristos
73529619d2aSchristos while (cr_or_whitespace(output_paragraph[output_paragraph_offset-1]))
73629619d2aSchristos output_paragraph_offset--;
73729619d2aSchristos
73829619d2aSchristos insert_string ("</para>");
73929619d2aSchristos if (xml_indentation_increment > 0)
74029619d2aSchristos insert ('\n');
74129619d2aSchristos xml_in_para = 0;
74229619d2aSchristos }
74329619d2aSchristos
74429619d2aSchristos void
xml_end_document(void)74529619d2aSchristos xml_end_document (void)
74629619d2aSchristos {
74729619d2aSchristos if (xml_node_open)
74829619d2aSchristos {
74929619d2aSchristos if (xml_node_level != -1)
75029619d2aSchristos {
75129619d2aSchristos xml_close_sections (xml_node_level);
75229619d2aSchristos xml_node_level = -1;
75329619d2aSchristos }
75429619d2aSchristos xml_insert_element (NODE, END);
75529619d2aSchristos }
75629619d2aSchristos else
75729619d2aSchristos xml_close_sections (xml_node_level);
75829619d2aSchristos
75929619d2aSchristos xml_insert_element (TEXINFO, END);
76029619d2aSchristos if (xml_indentation_increment == 0)
76129619d2aSchristos insert ('\n');
76229619d2aSchristos insert_string ("<!-- Keep this comment at the end of the file\n\
76329619d2aSchristos Local variables:\n\
76429619d2aSchristos mode: sgml\n\
76529619d2aSchristos sgml-indent-step:1\n\
76629619d2aSchristos sgml-indent-data:nil\n\
76729619d2aSchristos End:\n\
76829619d2aSchristos -->\n");
76929619d2aSchristos if (element_stack_index != 0)
77029619d2aSchristos error ("Element stack index : %d\n", element_stack_index);
77129619d2aSchristos }
77229619d2aSchristos
77329619d2aSchristos /* MUST be 0 or 1, not true or false values */
77429619d2aSchristos static int start_element_inserted = 1;
77529619d2aSchristos
77629619d2aSchristos /* NOTE: We use `elt' rather than `element' in the argument list of
77729619d2aSchristos the next function, since otherwise the Solaris SUNWspro compiler
77829619d2aSchristos barfs because `element' is a typedef declared near the beginning of
77929619d2aSchristos this file. */
78029619d2aSchristos void
78129619d2aSchristos #if defined (VA_FPRINTF) && __STDC__
xml_insert_element_with_attribute(int elt,int arg,char * format,...)78229619d2aSchristos xml_insert_element_with_attribute (int elt, int arg, char *format, ...)
78329619d2aSchristos #else
78429619d2aSchristos xml_insert_element_with_attribute (elt, arg, format, va_alist)
78529619d2aSchristos int elt;
78629619d2aSchristos int arg;
78729619d2aSchristos char *format;
78829619d2aSchristos va_dcl
78929619d2aSchristos #endif
79029619d2aSchristos {
79129619d2aSchristos /* Look at the replace_elements table to see if we have to change the element */
79229619d2aSchristos if (xml_sort_index)
79329619d2aSchristos return;
79429619d2aSchristos if (docbook)
79529619d2aSchristos {
79629619d2aSchristos replace_element *element_list = replace_elements;
79729619d2aSchristos while (element_list->element_to_replace >= 0)
79829619d2aSchristos {
79929619d2aSchristos if ( ( (arg == START) &&
80029619d2aSchristos (element_list->element_containing == xml_current_element ()) &&
80129619d2aSchristos (element_list->element_to_replace == elt) ) ||
80229619d2aSchristos ( (arg == END) &&
80329619d2aSchristos (element_list->element_containing == element_stack[element_stack_index-1-start_element_inserted]) &&
80429619d2aSchristos (element_list->element_to_replace == elt) ) )
80529619d2aSchristos {
80629619d2aSchristos elt = element_list->element_replacing;
80729619d2aSchristos break;
80829619d2aSchristos }
80929619d2aSchristos element_list ++;
81029619d2aSchristos }
81129619d2aSchristos
81229619d2aSchristos /* Forget the element */
81329619d2aSchristos if (elt < 0)
81429619d2aSchristos {
81529619d2aSchristos if (arg == START)
81629619d2aSchristos start_element_inserted = 0;
81729619d2aSchristos else
81829619d2aSchristos /* Replace the default value, for the next time */
81929619d2aSchristos start_element_inserted = 1;
82029619d2aSchristos return;
82129619d2aSchristos }
82229619d2aSchristos }
82329619d2aSchristos
82429619d2aSchristos if (!book_started)
82529619d2aSchristos return;
82629619d2aSchristos
82729619d2aSchristos if (!xml_dont_touch_items_defs && arg == START)
82829619d2aSchristos {
82929619d2aSchristos if (xml_after_table_term && elt != TABLETERM && xml_table_level
83029619d2aSchristos && !xml_in_item[xml_table_level])
83129619d2aSchristos {
83229619d2aSchristos xml_after_table_term = 0;
83329619d2aSchristos xml_insert_element (ITEM, START);
83429619d2aSchristos xml_in_item[xml_table_level] = 1;
83529619d2aSchristos }
83629619d2aSchristos else if (xml_after_def_term && elt != DEFINITIONTERM)
83729619d2aSchristos {
83829619d2aSchristos xml_after_def_term = 0;
83929619d2aSchristos xml_insert_element (DEFINITIONITEM, START);
84029619d2aSchristos xml_in_def_item[xml_definition_level] = 1;
84129619d2aSchristos }
84229619d2aSchristos }
84329619d2aSchristos
84429619d2aSchristos if (docbook && !only_macro_expansion && (in_menu || in_detailmenu))
84529619d2aSchristos return;
84629619d2aSchristos
84729619d2aSchristos if (executing_string && arg == END)
84829619d2aSchristos switch (elt)
84929619d2aSchristos {
85029619d2aSchristos case TABLEITEM:
85129619d2aSchristos xml_in_tableitem[xml_table_level] = 0;
85229619d2aSchristos break;
85329619d2aSchristos case ITEM:
85429619d2aSchristos xml_in_item[xml_table_level] = 0;
85529619d2aSchristos break;
85629619d2aSchristos case DEFINITIONTERM:
85729619d2aSchristos xml_in_def_item[xml_definition_level] = 0;
85829619d2aSchristos break;
85929619d2aSchristos }
86029619d2aSchristos
86129619d2aSchristos /* We are special-casing FIGURE element for docbook. It does appear in
86229619d2aSchristos the tag stack, but not in the output. This is to make element replacement
86329619d2aSchristos work beautifully. */
86429619d2aSchristos if (docbook && elt == FLOAT)
86529619d2aSchristos {
86629619d2aSchristos if (arg == START)
86729619d2aSchristos xml_push_current_element (elt);
86829619d2aSchristos else
86929619d2aSchristos xml_pop_current_element ();
87029619d2aSchristos return;
87129619d2aSchristos }
87229619d2aSchristos
873*d3737e9cSchristos if (!strlen (xml_element_list[elt].name))
87429619d2aSchristos {
87529619d2aSchristos /*printf ("Warning: Inserting empty element %d\n", elt);*/
87629619d2aSchristos return;
87729619d2aSchristos }
87829619d2aSchristos
87929619d2aSchristos if (arg == START && !xml_in_para && !xml_no_para
88029619d2aSchristos && xml_element_list[elt].contained_in_para)
88129619d2aSchristos xml_start_para ();
88229619d2aSchristos
88329619d2aSchristos if (arg == START && xml_in_para && !xml_element_list[elt].contained_in_para)
88429619d2aSchristos xml_end_para ();
88529619d2aSchristos
88629619d2aSchristos if (arg == END && xml_in_para && !xml_element_list[elt].contained_in_para)
88729619d2aSchristos xml_end_para ();
88829619d2aSchristos
88929619d2aSchristos if (docbook && xml_table_level && !in_table_title
89029619d2aSchristos && !xml_in_tableitem[xml_table_level] && !xml_in_item[xml_table_level]
89129619d2aSchristos && arg == START && elt != TABLEITEM && elt != TABLETERM
89229619d2aSchristos && !in_indexterm && xml_current_element() == TABLE)
89329619d2aSchristos {
89429619d2aSchristos in_table_title = 1;
89529619d2aSchristos xml_insert_element (TITLE, START);
89629619d2aSchristos }
89729619d2aSchristos
89829619d2aSchristos if (arg == START && !xml_in_para && !xml_keep_space
89929619d2aSchristos && !xml_element_list[elt].contained_in_para)
90029619d2aSchristos xml_indent ();
90129619d2aSchristos
90229619d2aSchristos if (arg == START)
90329619d2aSchristos xml_push_current_element (elt);
90429619d2aSchristos else
90529619d2aSchristos xml_pop_current_element ();
90629619d2aSchristos
90729619d2aSchristos /* Eat one newline before </example> and the like. */
90829619d2aSchristos if (!docbook && arg == END
90929619d2aSchristos && (xml_element_list[elt].keep_space || elt == GROUP)
91029619d2aSchristos && output_paragraph[output_paragraph_offset-1] == '\n')
91129619d2aSchristos output_paragraph_offset--;
91229619d2aSchristos
91329619d2aSchristos /* And eat whitespace before </entry> in @multitables. */
91429619d2aSchristos if (arg == END && elt == ENTRY)
91529619d2aSchristos while (cr_or_whitespace(output_paragraph[output_paragraph_offset-1]))
91629619d2aSchristos output_paragraph_offset--;
91729619d2aSchristos
91829619d2aSchristos /* Indent elements that can contain <para>. */
91929619d2aSchristos if (arg == END && !xml_in_para && !xml_keep_space
92029619d2aSchristos && xml_element_list[elt].contains_para)
92129619d2aSchristos xml_indent ();
92229619d2aSchristos
92329619d2aSchristos /* Here are the elements we want indented. These do not contain <para>
92429619d2aSchristos directly. */
92529619d2aSchristos if (arg == END && (elt == MENUENTRY || elt == ITEMIZE || elt == ENUMERATE
92629619d2aSchristos || elt == TABLEITEM || elt == TABLE
92729619d2aSchristos || elt == MULTITABLE || elt == TGROUP || elt == THEAD || elt == TBODY
92829619d2aSchristos || elt == ROW || elt == INFORMALFIGURE
92929619d2aSchristos || (!docbook && (elt == DEFINITION || elt == DEFINITIONTERM))))
93029619d2aSchristos xml_indent ();
93129619d2aSchristos
93229619d2aSchristos insert ('<');
93329619d2aSchristos if (arg == END)
93429619d2aSchristos insert ('/');
93529619d2aSchristos insert_string (xml_element_list[elt].name);
93629619d2aSchristos
93729619d2aSchristos /* printf ("%s ", xml_element_list[elt].name);*/
93829619d2aSchristos
93929619d2aSchristos if (format)
94029619d2aSchristos {
94129619d2aSchristos char temp_string[2000]; /* xx no fixed limits */
94229619d2aSchristos #ifdef VA_SPRINTF
94329619d2aSchristos va_list ap;
94429619d2aSchristos #endif
94529619d2aSchristos
94629619d2aSchristos VA_START (ap, format);
94729619d2aSchristos #ifdef VA_SPRINTF
94829619d2aSchristos VA_SPRINTF (temp_string, format, ap);
94929619d2aSchristos #else
95029619d2aSchristos sprintf (temp_string, format, a1, a2, a3, a4, a5, a6, a7, a8);
95129619d2aSchristos #endif
95229619d2aSchristos insert (' ');
95329619d2aSchristos insert_string (temp_string);
95429619d2aSchristos va_end (ap);
95529619d2aSchristos }
95629619d2aSchristos
95729619d2aSchristos if (arg == START && xml_node_id && elt != NODENAME)
95829619d2aSchristos {
95929619d2aSchristos insert_string (" id=\"");
96029619d2aSchristos insert_string (xml_node_id);
96129619d2aSchristos insert ('"');
96229619d2aSchristos free (xml_node_id);
96329619d2aSchristos xml_node_id = NULL;
96429619d2aSchristos }
96529619d2aSchristos
96629619d2aSchristos if (xml_element_list[elt].keep_space)
96729619d2aSchristos {
96829619d2aSchristos if (arg == START)
96929619d2aSchristos {
97029619d2aSchristos if (!docbook)
97129619d2aSchristos insert_string (" xml:space=\"preserve\"");
97229619d2aSchristos xml_keep_space++;
97329619d2aSchristos }
97429619d2aSchristos else
97529619d2aSchristos xml_keep_space--;
97629619d2aSchristos }
97729619d2aSchristos
97829619d2aSchristos insert ('>');
97929619d2aSchristos
98029619d2aSchristos if (!xml_in_para && !xml_element_list[elt].contained_in_para
98129619d2aSchristos && xml_element_list[elt].contains_para && xml_indentation_increment > 0)
98229619d2aSchristos insert ('\n');
98329619d2aSchristos
98429619d2aSchristos xml_just_after_element = 1;
98529619d2aSchristos }
98629619d2aSchristos
98729619d2aSchristos /* See the NOTE before xml_insert_element_with_attribute, for why we
98829619d2aSchristos use `elt' rather than `element' here. */
98929619d2aSchristos void
xml_insert_element(int elt,int arg)99029619d2aSchristos xml_insert_element (int elt, int arg)
99129619d2aSchristos {
99229619d2aSchristos xml_insert_element_with_attribute (elt, arg, NULL);
99329619d2aSchristos }
99429619d2aSchristos
99529619d2aSchristos void
xml_insert_entity(char * entity_name)99629619d2aSchristos xml_insert_entity (char *entity_name)
99729619d2aSchristos {
99829619d2aSchristos int saved_escape_html = escape_html;
99929619d2aSchristos
100029619d2aSchristos if (!book_started)
100129619d2aSchristos return;
100229619d2aSchristos if (docbook && !only_macro_expansion && (in_menu || in_detailmenu))
100329619d2aSchristos return;
100429619d2aSchristos
100529619d2aSchristos if (!xml_in_para && !xml_no_para && !only_macro_expansion
100629619d2aSchristos && xml_element_list[xml_current_element ()].contains_para
100729619d2aSchristos && !in_fixed_width_font)
100829619d2aSchristos xml_start_para ();
100929619d2aSchristos
101029619d2aSchristos escape_html = 0;
101129619d2aSchristos add_char ('&');
101229619d2aSchristos escape_html = saved_escape_html;
101329619d2aSchristos insert_string (entity_name);
101429619d2aSchristos add_char (';');
101529619d2aSchristos }
101629619d2aSchristos
101729619d2aSchristos typedef struct _xml_section xml_section;
101829619d2aSchristos struct _xml_section {
101929619d2aSchristos int level;
102029619d2aSchristos char *name;
102129619d2aSchristos xml_section *prev;
102229619d2aSchristos };
102329619d2aSchristos
102429619d2aSchristos xml_section *last_section = NULL;
102529619d2aSchristos
102629619d2aSchristos void
xml_begin_node(void)102729619d2aSchristos xml_begin_node (void)
102829619d2aSchristos {
102929619d2aSchristos first_section_opened = 1;
103029619d2aSchristos if (xml_in_abstract)
103129619d2aSchristos {
103229619d2aSchristos xml_insert_element (ABSTRACT, END);
103329619d2aSchristos xml_in_abstract = 0;
103429619d2aSchristos }
103529619d2aSchristos if (xml_in_bookinfo)
103629619d2aSchristos {
103729619d2aSchristos xml_insert_element (BOOKINFO, END);
103829619d2aSchristos xml_in_bookinfo = 0;
103929619d2aSchristos }
104029619d2aSchristos if (xml_node_open && ! docbook)
104129619d2aSchristos {
104229619d2aSchristos if (xml_node_level != -1)
104329619d2aSchristos {
104429619d2aSchristos xml_close_sections (xml_node_level);
104529619d2aSchristos xml_node_level = -1;
104629619d2aSchristos }
104729619d2aSchristos xml_insert_element (NODE, END);
104829619d2aSchristos }
104929619d2aSchristos xml_insert_element (NODE, START);
105029619d2aSchristos xml_node_open = 1;
105129619d2aSchristos }
105229619d2aSchristos
105329619d2aSchristos void
xml_close_sections(int level)105429619d2aSchristos xml_close_sections (int level)
105529619d2aSchristos {
105629619d2aSchristos if (!first_section_opened)
105729619d2aSchristos {
105829619d2aSchristos if (xml_in_abstract)
105929619d2aSchristos {
106029619d2aSchristos xml_insert_element (ABSTRACT, END);
106129619d2aSchristos xml_in_abstract = 0;
106229619d2aSchristos }
106329619d2aSchristos if (xml_in_bookinfo)
106429619d2aSchristos {
106529619d2aSchristos xml_insert_element (BOOKINFO, END);
106629619d2aSchristos xml_in_bookinfo = 0;
106729619d2aSchristos }
106829619d2aSchristos first_section_opened = 1;
106929619d2aSchristos }
107029619d2aSchristos
107129619d2aSchristos while (last_section && last_section->level >= level)
107229619d2aSchristos {
107329619d2aSchristos xml_section *temp = last_section;
107429619d2aSchristos xml_insert_element (xml_element(last_section->name), END);
107529619d2aSchristos temp = last_section;
107629619d2aSchristos last_section = last_section->prev;
107729619d2aSchristos free (temp->name);
107829619d2aSchristos free (temp);
107929619d2aSchristos }
108029619d2aSchristos }
108129619d2aSchristos
108229619d2aSchristos void
xml_open_section(int level,char * name)108329619d2aSchristos xml_open_section (int level, char *name)
108429619d2aSchristos {
108529619d2aSchristos xml_section *sect = (xml_section *) xmalloc (sizeof (xml_section));
108629619d2aSchristos
108729619d2aSchristos sect->level = level;
108829619d2aSchristos sect->name = xmalloc (1 + strlen (name));
108929619d2aSchristos strcpy (sect->name, name);
109029619d2aSchristos sect->prev = last_section;
109129619d2aSchristos last_section = sect;
109229619d2aSchristos
109329619d2aSchristos if (xml_node_open && xml_node_level == -1)
109429619d2aSchristos xml_node_level = level;
109529619d2aSchristos }
109629619d2aSchristos
109729619d2aSchristos void
xml_start_menu_entry(char * tem)109829619d2aSchristos xml_start_menu_entry (char *tem)
109929619d2aSchristos {
110029619d2aSchristos char *string;
110129619d2aSchristos discard_until ("* ");
110229619d2aSchristos
110329619d2aSchristos /* The line number was already incremented in reader_loop when we
110429619d2aSchristos saw the newline, and discard_until has now incremented again. */
110529619d2aSchristos line_number--;
110629619d2aSchristos
110729619d2aSchristos if (xml_in_menu_entry)
110829619d2aSchristos {
110929619d2aSchristos if (xml_in_menu_entry_comment)
111029619d2aSchristos {
111129619d2aSchristos xml_insert_element (MENUCOMMENT, END);
111229619d2aSchristos xml_in_menu_entry_comment=0;
111329619d2aSchristos }
111429619d2aSchristos xml_insert_element (MENUENTRY, END);
111529619d2aSchristos xml_in_menu_entry=0;
111629619d2aSchristos }
111729619d2aSchristos xml_insert_element (MENUENTRY, START);
111829619d2aSchristos xml_in_menu_entry=1;
111929619d2aSchristos
112029619d2aSchristos xml_insert_element (MENUNODE, START);
112129619d2aSchristos string = expansion (tem, 0);
112229619d2aSchristos add_word (string);
112329619d2aSchristos xml_insert_element (MENUNODE, END);
112429619d2aSchristos free (string);
112529619d2aSchristos
112629619d2aSchristos /* The menu item may use macros, so expand them now. */
112729619d2aSchristos xml_insert_element (MENUTITLE, START);
112829619d2aSchristos only_macro_expansion++;
112929619d2aSchristos get_until_in_line (1, ":", &string);
113029619d2aSchristos only_macro_expansion--;
113129619d2aSchristos execute_string ("%s", string); /* get escaping done */
113229619d2aSchristos xml_insert_element (MENUTITLE, END);
113329619d2aSchristos free (string);
113429619d2aSchristos
113529619d2aSchristos if (looking_at ("::"))
113629619d2aSchristos discard_until (":");
113729619d2aSchristos else
113829619d2aSchristos { /* discard the node name */
113929619d2aSchristos get_until_in_line (0, ".", &string);
114029619d2aSchristos free (string);
114129619d2aSchristos }
114229619d2aSchristos input_text_offset++; /* discard the second colon or the period */
114329619d2aSchristos skip_whitespace_and_newlines();
114429619d2aSchristos xml_insert_element (MENUCOMMENT, START);
114529619d2aSchristos xml_in_menu_entry_comment ++;
114629619d2aSchristos }
114729619d2aSchristos
114829619d2aSchristos void
xml_end_menu(void)114929619d2aSchristos xml_end_menu (void)
115029619d2aSchristos {
115129619d2aSchristos if (xml_in_menu_entry)
115229619d2aSchristos {
115329619d2aSchristos if (xml_in_menu_entry_comment)
115429619d2aSchristos {
115529619d2aSchristos xml_insert_element (MENUCOMMENT, END);
115629619d2aSchristos xml_in_menu_entry_comment --;
115729619d2aSchristos }
115829619d2aSchristos xml_insert_element (MENUENTRY, END);
115929619d2aSchristos xml_in_menu_entry--;
116029619d2aSchristos }
116129619d2aSchristos xml_insert_element (MENU, END);
116229619d2aSchristos }
116329619d2aSchristos
116429619d2aSchristos static int xml_last_character;
116529619d2aSchristos
116629619d2aSchristos void
xml_add_char(int character)116729619d2aSchristos xml_add_char (int character)
116829619d2aSchristos {
116929619d2aSchristos if (!book_started)
117029619d2aSchristos return;
117129619d2aSchristos if (docbook && !only_macro_expansion && (in_menu || in_detailmenu))
117229619d2aSchristos return;
117329619d2aSchristos
117429619d2aSchristos if (docbook && xml_table_level && !in_table_title
117529619d2aSchristos && !xml_in_item[xml_table_level] && !xml_in_tableitem[xml_table_level]
117629619d2aSchristos && !cr_or_whitespace (character) && !in_indexterm)
117729619d2aSchristos {
117829619d2aSchristos in_table_title = 1;
117929619d2aSchristos xml_insert_element (TITLE, START);
118029619d2aSchristos }
118129619d2aSchristos
118229619d2aSchristos if (!first_section_opened && !xml_in_abstract && !xml_in_book_title
118329619d2aSchristos && !xml_no_para && character != '\r' && character != '\n'
118429619d2aSchristos && character != ' ' && !is_in_insertion_of_type (copying))
118529619d2aSchristos {
118629619d2aSchristos if (!xml_in_bookinfo)
118729619d2aSchristos {
118829619d2aSchristos xml_insert_element (BOOKINFO, START);
118929619d2aSchristos xml_in_bookinfo = 1;
119029619d2aSchristos }
119129619d2aSchristos xml_insert_element (ABSTRACT, START);
119229619d2aSchristos xml_in_abstract = 1;
119329619d2aSchristos }
119429619d2aSchristos
119529619d2aSchristos if (!xml_sort_index && !xml_in_xref_token && !xml_dont_touch_items_defs)
119629619d2aSchristos {
119729619d2aSchristos if (xml_after_table_term && xml_table_level
119829619d2aSchristos && !xml_in_item[xml_table_level])
119929619d2aSchristos {
120029619d2aSchristos xml_after_table_term = 0;
120129619d2aSchristos xml_insert_element (ITEM, START);
120229619d2aSchristos xml_in_item[xml_table_level] = 1;
120329619d2aSchristos }
120429619d2aSchristos else if (xml_after_def_term)
120529619d2aSchristos {
120629619d2aSchristos xml_after_def_term = 0;
120729619d2aSchristos xml_insert_element (DEFINITIONITEM, START);
120829619d2aSchristos xml_in_def_item[xml_definition_level] = 1;
120929619d2aSchristos }
121029619d2aSchristos }
121129619d2aSchristos
121229619d2aSchristos if (xml_just_after_element && !xml_in_para && !inhibit_paragraph_indentation)
121329619d2aSchristos {
121429619d2aSchristos if (character == '\r' || character == '\n' || character == '\t' || character == ' ')
121529619d2aSchristos return;
121629619d2aSchristos xml_just_after_element = 0;
121729619d2aSchristos }
121829619d2aSchristos
121929619d2aSchristos if (xml_element_list[xml_current_element()].contains_para
122029619d2aSchristos && !xml_in_para && !only_macro_expansion && !xml_no_para
122129619d2aSchristos && !cr_or_whitespace (character) && !in_fixed_width_font)
122229619d2aSchristos xml_start_para ();
122329619d2aSchristos
122429619d2aSchristos if (xml_in_para && character == '\n' && xml_last_character == '\n'
122529619d2aSchristos && !only_macro_expansion && !xml_no_para
122629619d2aSchristos && xml_element_list[xml_current_element()].contains_para )
122729619d2aSchristos {
122829619d2aSchristos xml_end_para ();
122929619d2aSchristos xml_just_after_element = 1;
123029619d2aSchristos return;
123129619d2aSchristos }
123229619d2aSchristos
123329619d2aSchristos if (xml_in_menu_entry_comment && character == '\n' && xml_last_character == '\n')
123429619d2aSchristos {
123529619d2aSchristos xml_insert_element (MENUCOMMENT, END);
123629619d2aSchristos xml_in_menu_entry_comment = 0;
123729619d2aSchristos xml_insert_element (MENUENTRY, END);
123829619d2aSchristos xml_in_menu_entry = 0;
123929619d2aSchristos }
124029619d2aSchristos
124129619d2aSchristos if (xml_in_menu_entry_comment && whitespace(character)
124229619d2aSchristos && cr_or_whitespace(xml_last_character))
124329619d2aSchristos return;
124429619d2aSchristos
124529619d2aSchristos if (character == '\n' && !xml_in_para && !inhibit_paragraph_indentation)
124629619d2aSchristos return;
124729619d2aSchristos
124829619d2aSchristos xml_last_character = character;
124929619d2aSchristos
125029619d2aSchristos if (character == '&' && escape_html)
125129619d2aSchristos insert_string ("&");
125229619d2aSchristos else if (character == '<' && escape_html)
125329619d2aSchristos insert_string ("<");
125429619d2aSchristos else if (character == '\n' && !xml_keep_space)
125529619d2aSchristos {
125629619d2aSchristos if (!xml_in_para && xml_just_after_element && !multitable_active)
125729619d2aSchristos return;
125829619d2aSchristos else
125929619d2aSchristos insert (docbook ? '\n' : ' ');
126029619d2aSchristos }
126129619d2aSchristos else
126229619d2aSchristos insert (character);
126329619d2aSchristos
126429619d2aSchristos return;
126529619d2aSchristos }
126629619d2aSchristos
126729619d2aSchristos void
xml_insert_footnote(char * note)126829619d2aSchristos xml_insert_footnote (char *note)
126929619d2aSchristos {
127029619d2aSchristos if (!xml_in_para)
127129619d2aSchristos xml_start_para ();
127229619d2aSchristos
127329619d2aSchristos xml_in_footnote = 1;
127429619d2aSchristos xml_insert_element (FOOTNOTE, START);
127529619d2aSchristos insert_string ("<para>");
127629619d2aSchristos execute_string ("%s", note);
127729619d2aSchristos insert_string ("</para>");
127829619d2aSchristos xml_insert_element (FOOTNOTE, END);
127929619d2aSchristos xml_in_footnote = 0;
128029619d2aSchristos }
128129619d2aSchristos
128229619d2aSchristos /* We need to keep the quotation stack ourself, because insertion_stack
128329619d2aSchristos loses item_function when we are closing the block, so we don't know
128429619d2aSchristos what to close then. */
128529619d2aSchristos typedef struct quotation_elt
128629619d2aSchristos {
128729619d2aSchristos struct quotation_elt *next;
128829619d2aSchristos char *type;
128929619d2aSchristos } QUOTATION_ELT;
129029619d2aSchristos
129129619d2aSchristos static QUOTATION_ELT *quotation_stack = NULL;
129229619d2aSchristos
129329619d2aSchristos void
xml_insert_quotation(char * type,int arg)129429619d2aSchristos xml_insert_quotation (char *type, int arg)
129529619d2aSchristos {
129629619d2aSchristos int quotation_started = 0;
129729619d2aSchristos
129829619d2aSchristos if (arg == START)
129929619d2aSchristos {
130029619d2aSchristos QUOTATION_ELT *new = xmalloc (sizeof (QUOTATION_ELT));
130129619d2aSchristos new->type = xstrdup (type);
130229619d2aSchristos new->next = quotation_stack;
130329619d2aSchristos quotation_stack = new;
130429619d2aSchristos }
130529619d2aSchristos else
130629619d2aSchristos type = quotation_stack->type;
130729619d2aSchristos
130829619d2aSchristos /* Make use of special quotation styles of Docbook if we can. */
130929619d2aSchristos if (docbook && strlen(type))
131029619d2aSchristos {
131129619d2aSchristos /* Let's assume it started. */
131229619d2aSchristos quotation_started = 1;
131329619d2aSchristos
131429619d2aSchristos if (strcasecmp (type, "tip") == 0)
131529619d2aSchristos xml_insert_element (TIP, arg);
131629619d2aSchristos else if (strcasecmp (type, "note") == 0)
131729619d2aSchristos xml_insert_element (NOTE, arg);
131829619d2aSchristos else if (strcasecmp (type, "important") == 0)
131929619d2aSchristos xml_insert_element (IMPORTANT, arg);
132029619d2aSchristos else if (strcasecmp (type, "warning") == 0)
132129619d2aSchristos xml_insert_element (WARNING, arg);
132229619d2aSchristos else if (strcasecmp (type, "caution") == 0)
132329619d2aSchristos xml_insert_element (CAUTION, arg);
132429619d2aSchristos else
132529619d2aSchristos /* Didn't find a known quotation type :\ */
132629619d2aSchristos quotation_started = 0;
132729619d2aSchristos }
132829619d2aSchristos
132929619d2aSchristos if (!quotation_started)
133029619d2aSchristos {
133129619d2aSchristos xml_insert_element (QUOTATION, arg);
133229619d2aSchristos if (strlen(type) && arg == START)
133329619d2aSchristos execute_string ("@b{%s:} ", type);
133429619d2aSchristos }
133529619d2aSchristos
133629619d2aSchristos if (arg == END)
133729619d2aSchristos {
133829619d2aSchristos QUOTATION_ELT *temp = quotation_stack;
133929619d2aSchristos if (temp == NULL)
134029619d2aSchristos return;
134129619d2aSchristos quotation_stack = quotation_stack->next;
134229619d2aSchristos free(temp->type);
134329619d2aSchristos free(temp);
134429619d2aSchristos }
134529619d2aSchristos }
134629619d2aSchristos
134729619d2aSchristos /* Starting generic docbook floats. Just starts elt with correct label
134829619d2aSchristos and id attributes, and inserts title. */
134929619d2aSchristos void
xml_begin_docbook_float(int elt)135029619d2aSchristos xml_begin_docbook_float (int elt)
135129619d2aSchristos {
135229619d2aSchristos if (current_float_used_title ()) /* in a nested float */
135329619d2aSchristos {
135429619d2aSchristos xml_insert_element (elt, START); /* just insert the tag */
135529619d2aSchristos return;
135629619d2aSchristos }
135729619d2aSchristos
135829619d2aSchristos
135929619d2aSchristos /* OK, need the title, tag, etc. */
136029619d2aSchristos if (elt == CARTOUCHE) /* no labels on <sidebar> */
136129619d2aSchristos {
136229619d2aSchristos if (strlen (current_float_id ()) == 0)
136329619d2aSchristos xml_insert_element (elt, START);
136429619d2aSchristos else
136529619d2aSchristos xml_insert_element_with_attribute (elt, START,
136629619d2aSchristos "id=\"%s\"", xml_id (current_float_id ()));
136729619d2aSchristos }
136829619d2aSchristos else if (strlen (current_float_id ()) == 0)
136929619d2aSchristos xml_insert_element_with_attribute (elt, START, "label=\"\"");
137029619d2aSchristos else
137129619d2aSchristos xml_insert_element_with_attribute (elt, START,
137229619d2aSchristos "id=\"%s\" label=\"%s\"", xml_id (current_float_id ()),
137329619d2aSchristos current_float_number ());
137429619d2aSchristos
137529619d2aSchristos xml_insert_element (TITLE, START);
137629619d2aSchristos execute_string ("%s", current_float_title ());
137729619d2aSchristos xml_insert_element (TITLE, END);
137829619d2aSchristos
137929619d2aSchristos current_float_set_title_used (); /* mark this title, tag, etc used */
138029619d2aSchristos }
138129619d2aSchristos
138229619d2aSchristos /*
138329619d2aSchristos * Lists and Tables
138429619d2aSchristos */
138529619d2aSchristos void
xml_begin_table(int type,char * item_function)138629619d2aSchristos xml_begin_table (int type, char *item_function)
138729619d2aSchristos {
138829619d2aSchristos switch (type)
138929619d2aSchristos {
139029619d2aSchristos case ftable:
139129619d2aSchristos case vtable:
139229619d2aSchristos case table:
139329619d2aSchristos /*if (docbook)*/ /* 05-08 */
139429619d2aSchristos {
139529619d2aSchristos xml_insert_element (TABLE, START);
139629619d2aSchristos xml_table_level ++;
139729619d2aSchristos xml_in_tableitem[xml_table_level] = 0;
139829619d2aSchristos xml_in_item[xml_table_level] = 0;
139929619d2aSchristos xml_after_table_term = 0;
140029619d2aSchristos }
140129619d2aSchristos break;
140229619d2aSchristos case itemize:
140329619d2aSchristos if (!docbook)
140429619d2aSchristos {
140529619d2aSchristos xml_insert_element (ITEMIZE, START);
140629619d2aSchristos xml_table_level ++;
140729619d2aSchristos xml_in_item[xml_table_level] = 0;
140829619d2aSchristos xml_insert_element (ITEMFUNCTION, START);
140929619d2aSchristos if (*item_function == COMMAND_PREFIX
141029619d2aSchristos && item_function[strlen (item_function) - 1] != '}'
141129619d2aSchristos && command_needs_braces (item_function + 1))
141229619d2aSchristos execute_string ("%s{}", item_function);
141329619d2aSchristos else
141429619d2aSchristos execute_string ("%s", item_function);
141529619d2aSchristos xml_insert_element (ITEMFUNCTION, END);
141629619d2aSchristos }
141729619d2aSchristos else
141829619d2aSchristos {
141929619d2aSchristos xml_insert_element_with_attribute (ITEMIZE, START,
142029619d2aSchristos "mark=\"%s\"",
142129619d2aSchristos (*item_function == COMMAND_PREFIX) ?
142229619d2aSchristos &item_function[1] : item_function);
142329619d2aSchristos xml_table_level ++;
142429619d2aSchristos xml_in_item[xml_table_level] = 0;
142529619d2aSchristos }
142629619d2aSchristos break;
142729619d2aSchristos }
142829619d2aSchristos }
142929619d2aSchristos
143029619d2aSchristos void
xml_end_table(int type)143129619d2aSchristos xml_end_table (int type)
143229619d2aSchristos {
143329619d2aSchristos switch (type)
143429619d2aSchristos {
143529619d2aSchristos case ftable:
143629619d2aSchristos case vtable:
143729619d2aSchristos case table:
143829619d2aSchristos if (xml_in_item[xml_table_level])
143929619d2aSchristos {
144029619d2aSchristos xml_insert_element (ITEM, END);
144129619d2aSchristos xml_in_item[xml_table_level] = 0;
144229619d2aSchristos }
144329619d2aSchristos if (xml_in_tableitem[xml_table_level])
144429619d2aSchristos {
144529619d2aSchristos xml_insert_element (TABLEITEM, END);
144629619d2aSchristos xml_in_tableitem[xml_table_level] = 0;
144729619d2aSchristos }
144829619d2aSchristos xml_insert_element (TABLE, END);
144929619d2aSchristos xml_after_table_term = 0;
145029619d2aSchristos xml_table_level --;
145129619d2aSchristos
145229619d2aSchristos break;
145329619d2aSchristos case itemize:
145429619d2aSchristos if (xml_in_item[xml_table_level])
145529619d2aSchristos {
145629619d2aSchristos xml_insert_element (ITEM, END);
145729619d2aSchristos xml_in_item[xml_table_level] = 0;
145829619d2aSchristos }
145929619d2aSchristos /* gnat-style manual contains an itemized list without items! */
146029619d2aSchristos if (in_table_title)
146129619d2aSchristos {
146229619d2aSchristos xml_insert_element (TITLE, END);
146329619d2aSchristos in_table_title = 0;
146429619d2aSchristos }
146529619d2aSchristos xml_insert_element (ITEMIZE, END);
146629619d2aSchristos xml_table_level --;
146729619d2aSchristos break;
146829619d2aSchristos }
146929619d2aSchristos }
147029619d2aSchristos
147129619d2aSchristos void
xml_begin_item(void)147229619d2aSchristos xml_begin_item (void)
147329619d2aSchristos {
147429619d2aSchristos if (xml_in_item[xml_table_level])
147529619d2aSchristos xml_insert_element (ITEM, END);
147629619d2aSchristos
147729619d2aSchristos xml_insert_element (ITEM, START);
147829619d2aSchristos xml_in_item[xml_table_level] = 1;
147929619d2aSchristos }
148029619d2aSchristos
148129619d2aSchristos void
xml_begin_table_item(void)148229619d2aSchristos xml_begin_table_item (void)
148329619d2aSchristos {
148429619d2aSchristos if (!xml_after_table_term)
148529619d2aSchristos {
148629619d2aSchristos if (xml_in_item[xml_table_level])
148729619d2aSchristos xml_insert_element (ITEM, END);
148829619d2aSchristos if (xml_in_tableitem[xml_table_level])
148929619d2aSchristos xml_insert_element (TABLEITEM, END);
149029619d2aSchristos
149129619d2aSchristos if (in_table_title)
149229619d2aSchristos {
149329619d2aSchristos in_table_title = 0;
149429619d2aSchristos xml_insert_element (TITLE, END);
149529619d2aSchristos }
149629619d2aSchristos xml_insert_element (TABLEITEM, START);
149729619d2aSchristos }
149829619d2aSchristos xml_insert_element (TABLETERM, START);
149929619d2aSchristos xml_in_tableitem[xml_table_level] = 1;
150029619d2aSchristos xml_in_item[xml_table_level] = 0;
150129619d2aSchristos xml_after_table_term = 0;
150229619d2aSchristos }
150329619d2aSchristos
150429619d2aSchristos void
xml_continue_table_item(void)150529619d2aSchristos xml_continue_table_item (void)
150629619d2aSchristos {
150729619d2aSchristos xml_insert_element (TABLETERM, END);
150829619d2aSchristos xml_after_table_term = 1;
150929619d2aSchristos xml_in_item[xml_table_level] = 0;
151029619d2aSchristos }
151129619d2aSchristos
151229619d2aSchristos void
xml_begin_enumerate(char * enum_arg)151329619d2aSchristos xml_begin_enumerate (char *enum_arg)
151429619d2aSchristos {
151529619d2aSchristos if (!docbook)
151629619d2aSchristos xml_insert_element_with_attribute (ENUMERATE, START, "first=\"%s\"", enum_arg);
151729619d2aSchristos else
151829619d2aSchristos {
151929619d2aSchristos if (isdigit (*enum_arg))
152029619d2aSchristos {
152129619d2aSchristos int enum_val = atoi (enum_arg);
152229619d2aSchristos
152329619d2aSchristos /* Have to check the value, not just the first digit. */
152429619d2aSchristos if (enum_val == 0)
152529619d2aSchristos xml_insert_element_with_attribute (ENUMERATE, START,
152629619d2aSchristos "numeration=\"arabic\" role=\"0\"", NULL);
152729619d2aSchristos else if (enum_val == 1)
152829619d2aSchristos xml_insert_element_with_attribute (ENUMERATE, START,
152929619d2aSchristos "numeration=\"arabic\"", NULL);
153029619d2aSchristos else
153129619d2aSchristos xml_insert_element_with_attribute (ENUMERATE, START,
153229619d2aSchristos "continuation=\"continues\" numeration=\"arabic\"", NULL);
153329619d2aSchristos }
153429619d2aSchristos else if (isupper (*enum_arg))
153529619d2aSchristos {
153629619d2aSchristos if (enum_arg[0] == 'A')
153729619d2aSchristos xml_insert_element_with_attribute (ENUMERATE, START,
153829619d2aSchristos "numeration=\"upperalpha\"", NULL);
153929619d2aSchristos else
154029619d2aSchristos xml_insert_element_with_attribute (ENUMERATE, START,
154129619d2aSchristos "continuation=\"continues\" numeration=\"upperalpha\"", NULL);
154229619d2aSchristos }
154329619d2aSchristos else
154429619d2aSchristos {
154529619d2aSchristos if (enum_arg[0] == 'a')
154629619d2aSchristos xml_insert_element_with_attribute (ENUMERATE, START,
154729619d2aSchristos "numeration=\"loweralpha\"", NULL);
154829619d2aSchristos else
154929619d2aSchristos xml_insert_element_with_attribute (ENUMERATE, START,
155029619d2aSchristos "continuation=\"continues\" numeration=\"loweralpha\"", NULL);
155129619d2aSchristos }
155229619d2aSchristos }
155329619d2aSchristos xml_table_level ++;
155429619d2aSchristos xml_in_item[xml_table_level] = 0;
155529619d2aSchristos }
155629619d2aSchristos
155729619d2aSchristos void
xml_end_enumerate(void)155829619d2aSchristos xml_end_enumerate (void)
155929619d2aSchristos {
156029619d2aSchristos if (xml_in_item[xml_table_level])
156129619d2aSchristos {
156229619d2aSchristos xml_insert_element (ITEM, END);
156329619d2aSchristos xml_in_item[xml_table_level] = 0;
156429619d2aSchristos }
156529619d2aSchristos xml_insert_element (ENUMERATE, END);
156629619d2aSchristos xml_table_level --;
156729619d2aSchristos }
156829619d2aSchristos
156929619d2aSchristos static void
xml_insert_text_file(char * name_arg)157029619d2aSchristos xml_insert_text_file (char *name_arg)
157129619d2aSchristos {
157229619d2aSchristos char *fullname = xmalloc (strlen (name_arg) + 4 + 1);
157329619d2aSchristos FILE *image_file;
157429619d2aSchristos strcpy (fullname, name_arg);
157529619d2aSchristos strcat (fullname, ".txt");
157629619d2aSchristos image_file = fopen (fullname, "r");
157729619d2aSchristos if (image_file)
157829619d2aSchristos {
157929619d2aSchristos int ch;
158029619d2aSchristos int save_inhibit_indentation = inhibit_paragraph_indentation;
158129619d2aSchristos int save_filling_enabled = filling_enabled;
158229619d2aSchristos
158329619d2aSchristos xml_insert_element (TEXTOBJECT, START);
158429619d2aSchristos xml_insert_element (DISPLAY, START);
158529619d2aSchristos
158629619d2aSchristos inhibit_paragraph_indentation = 1;
158729619d2aSchristos filling_enabled = 0;
158829619d2aSchristos last_char_was_newline = 0;
158929619d2aSchristos
159029619d2aSchristos /* Maybe we need to remove the final newline if the image
159129619d2aSchristos file is only one line to allow in-line images. On the
159229619d2aSchristos other hand, they could just make the file without a
159329619d2aSchristos final newline. */
159429619d2aSchristos while ((ch = getc (image_file)) != EOF)
159529619d2aSchristos add_char (ch);
159629619d2aSchristos
159729619d2aSchristos inhibit_paragraph_indentation = save_inhibit_indentation;
159829619d2aSchristos filling_enabled = save_filling_enabled;
159929619d2aSchristos
160029619d2aSchristos xml_insert_element (DISPLAY, END);
160129619d2aSchristos xml_insert_element (TEXTOBJECT, END);
160229619d2aSchristos
160329619d2aSchristos if (fclose (image_file) != 0)
160429619d2aSchristos perror (fullname);
160529619d2aSchristos }
160629619d2aSchristos else
160729619d2aSchristos warning (_("@image file `%s' unreadable: %s"), fullname,
160829619d2aSchristos strerror (errno));
160929619d2aSchristos
161029619d2aSchristos free (fullname);
161129619d2aSchristos }
161229619d2aSchristos
161329619d2aSchristos /* If NAME.EXT is accessible or FORCE is nonzero, insert a docbook
161429619d2aSchristos imagedata element for FMT. Return 1 if inserted something, 0 else. */
161529619d2aSchristos
161629619d2aSchristos static int
try_docbook_image(const char * name,const char * ext,const char * fmt,int force)161729619d2aSchristos try_docbook_image (const char *name, const char *ext, const char *fmt,
161829619d2aSchristos int force)
161929619d2aSchristos {
162029619d2aSchristos int used = 0;
162129619d2aSchristos char *fullname = xmalloc (strlen (name) + 1 + strlen (ext) + 1);
162229619d2aSchristos sprintf (fullname, "%s.%s", name, ext);
162329619d2aSchristos
162429619d2aSchristos if (force || access (fullname, R_OK) == 0)
162529619d2aSchristos {
162629619d2aSchristos xml_insert_element (IMAGEOBJECT, START);
162729619d2aSchristos xml_insert_element_with_attribute (IMAGEDATA, START,
162829619d2aSchristos "fileref=\"%s\" format=\"%s\"", fullname, fmt);
162929619d2aSchristos xml_insert_element (IMAGEDATA, END);
163029619d2aSchristos xml_insert_element (IMAGEOBJECT, END);
163129619d2aSchristos used = 1;
163229619d2aSchristos }
163329619d2aSchristos
163429619d2aSchristos free (fullname);
163529619d2aSchristos return used;
163629619d2aSchristos }
163729619d2aSchristos
163829619d2aSchristos
163929619d2aSchristos void
xml_insert_docbook_image(char * name_arg)164029619d2aSchristos xml_insert_docbook_image (char *name_arg)
164129619d2aSchristos {
164229619d2aSchristos int found = 0;
164329619d2aSchristos int elt = xml_in_para ? INLINEIMAGE : MEDIAOBJECT;
164429619d2aSchristos
164529619d2aSchristos if (is_in_insertion_of_type (floatenv))
164629619d2aSchristos xml_begin_docbook_float (INFORMALFIGURE);
164729619d2aSchristos else if (!xml_in_para)
164829619d2aSchristos xml_insert_element (INFORMALFIGURE, START);
164929619d2aSchristos
165029619d2aSchristos xml_no_para++;
165129619d2aSchristos
165229619d2aSchristos xml_insert_element (elt, START);
165329619d2aSchristos
165429619d2aSchristos /* A selected few from http://docbook.org/tdg/en/html/imagedata.html. */
165529619d2aSchristos if (try_docbook_image (name_arg, "eps", "EPS", 0))
165629619d2aSchristos found++;
165729619d2aSchristos if (try_docbook_image (name_arg, "gif", "GIF", 0))
165829619d2aSchristos found++;
165929619d2aSchristos if (try_docbook_image (name_arg, "jpg", "JPG", 0))
166029619d2aSchristos found++;
166129619d2aSchristos if (try_docbook_image (name_arg, "jpeg", "JPEG", 0))
166229619d2aSchristos found++;
166329619d2aSchristos if (try_docbook_image (name_arg, "pdf", "PDF", 0))
166429619d2aSchristos found++;
166529619d2aSchristos if (try_docbook_image (name_arg, "png", "PNG", 0))
166629619d2aSchristos found++;
166729619d2aSchristos if (try_docbook_image (name_arg, "svg", "SVG", 0))
166829619d2aSchristos found++;
166929619d2aSchristos
167029619d2aSchristos /* If no luck so far, just assume we'll eventually have a jpg. */
167129619d2aSchristos if (!found)
167229619d2aSchristos try_docbook_image (name_arg, "jpg", "JPG", 1);
167329619d2aSchristos
167429619d2aSchristos xml_insert_text_file (name_arg);
167529619d2aSchristos xml_insert_element (elt, END);
167629619d2aSchristos
167729619d2aSchristos xml_no_para--;
167829619d2aSchristos
167929619d2aSchristos if (elt == MEDIAOBJECT)
168029619d2aSchristos xml_insert_element (INFORMALFIGURE, END);
168129619d2aSchristos }
168229619d2aSchristos
168329619d2aSchristos void
xml_asterisk(void)168429619d2aSchristos xml_asterisk (void)
168529619d2aSchristos {
168629619d2aSchristos }
168729619d2aSchristos
168829619d2aSchristos
168929619d2aSchristos /*
169029619d2aSchristos * INDEX
169129619d2aSchristos */
169229619d2aSchristos /* Used to separate primary and secondary entries in an index -- we need
169329619d2aSchristos to have real multilivel indexing support, not just string analysis. */
169429619d2aSchristos #define INDEX_SEP "@this string will never appear@" /* was , */
169529619d2aSchristos
169629619d2aSchristos typedef struct
169729619d2aSchristos {
169829619d2aSchristos char *from;
169929619d2aSchristos char *to;
170029619d2aSchristos } XML_SYNONYM;
170129619d2aSchristos
170229619d2aSchristos static XML_SYNONYM **xml_synonyms = NULL;
170329619d2aSchristos static int xml_synonyms_count = 0;
170429619d2aSchristos
170529619d2aSchristos void
xml_insert_indexterm(char * indexterm,char * index)170629619d2aSchristos xml_insert_indexterm (char *indexterm, char *index)
170729619d2aSchristos {
170829619d2aSchristos /* @index commands can appear between @item and @itemx, @deffn and @deffnx. */
170929619d2aSchristos if (!docbook)
171029619d2aSchristos {
171129619d2aSchristos /* Check to see if we need to do index redirection per @synindex. */
171229619d2aSchristos int i;
171329619d2aSchristos for (i = 0; i < xml_synonyms_count; i++)
171429619d2aSchristos {
171529619d2aSchristos if (STREQ (xml_synonyms[i]->from, index))
171629619d2aSchristos index = xstrdup (xml_synonyms[i]->to);
171729619d2aSchristos }
171829619d2aSchristos
171929619d2aSchristos xml_dont_touch_items_defs++;
172029619d2aSchristos xml_insert_element_with_attribute (INDEXTERM, START, "index=\"%s\"", index);
172129619d2aSchristos in_indexterm = 1;
172229619d2aSchristos execute_string ("%s", indexterm);
172329619d2aSchristos xml_insert_element (INDEXTERM, END);
172429619d2aSchristos in_indexterm = 0;
172529619d2aSchristos xml_dont_touch_items_defs--;
172629619d2aSchristos }
172729619d2aSchristos else
172829619d2aSchristos {
172929619d2aSchristos char *primary = NULL, *secondary = NULL;
173029619d2aSchristos if (strstr (indexterm+1, INDEX_SEP))
173129619d2aSchristos {
173229619d2aSchristos primary = xmalloc (strlen (indexterm) + 1);
173329619d2aSchristos strcpy (primary, indexterm);
173429619d2aSchristos secondary = strstr (primary+1, INDEX_SEP);
173529619d2aSchristos *secondary = '\0';
173629619d2aSchristos secondary += strlen (INDEX_SEP);
173729619d2aSchristos }
173829619d2aSchristos xml_insert_element_with_attribute (INDEXTERM, START, "role=\"%s\"", index);
173929619d2aSchristos in_indexterm = 1;
174029619d2aSchristos xml_insert_element (PRIMARY, START);
174129619d2aSchristos if (primary)
174229619d2aSchristos execute_string ("%s", primary);
174329619d2aSchristos else
174429619d2aSchristos execute_string ("%s", indexterm);
174529619d2aSchristos xml_insert_element (PRIMARY, END);
174629619d2aSchristos if (primary)
174729619d2aSchristos {
174829619d2aSchristos xml_insert_element (SECONDARY, START);
174929619d2aSchristos execute_string ("%s", secondary);
175029619d2aSchristos xml_insert_element (SECONDARY, END);
175129619d2aSchristos }
175229619d2aSchristos xml_insert_element (INDEXTERM, END);
175329619d2aSchristos in_indexterm = 0;
175429619d2aSchristos }
175529619d2aSchristos }
175629619d2aSchristos
175729619d2aSchristos
175829619d2aSchristos int xml_last_section_output_position = 0;
175929619d2aSchristos static char last_division_letter = ' ';
176029619d2aSchristos static char index_primary[2000]; /** xx no fixed limit */
176129619d2aSchristos static int indexdivempty = 0;
176229619d2aSchristos
176329619d2aSchristos static void
xml_close_indexentry(void)176429619d2aSchristos xml_close_indexentry (void)
176529619d2aSchristos {
176629619d2aSchristos if (!in_indexentry)
176729619d2aSchristos return;
176829619d2aSchristos if (in_secondary)
176929619d2aSchristos xml_insert_element (SECONDARYIE, END);
177029619d2aSchristos xml_insert_element (INDEXENTRY, END);
177129619d2aSchristos in_secondary = 0;
177229619d2aSchristos in_indexentry = 0;
177329619d2aSchristos }
177429619d2aSchristos
177529619d2aSchristos void
xml_begin_index(void)177629619d2aSchristos xml_begin_index (void)
177729619d2aSchristos {
177829619d2aSchristos typedef struct xml_index_title {
177929619d2aSchristos struct xml_index_title *next;
178029619d2aSchristos char *title;
178129619d2aSchristos } XML_INDEX_TITLE;
178229619d2aSchristos
178329619d2aSchristos static XML_INDEX_TITLE *xml_index_titles = NULL;
178429619d2aSchristos
178529619d2aSchristos if (!handling_delayed_writes)
178629619d2aSchristos { /* We assume that we just opened a section, and so that the last output is
178729619d2aSchristos <SECTION ID="node-name"><TITLE>Title</TITLE>
178829619d2aSchristos where SECTION can be CHAPTER, ... */
178929619d2aSchristos
179029619d2aSchristos XML_INDEX_TITLE *new = xmalloc (sizeof (XML_INDEX_TITLE));
179129619d2aSchristos xml_section *temp = last_section;
179229619d2aSchristos
179329619d2aSchristos int l = output_paragraph_offset-xml_last_section_output_position;
179429619d2aSchristos char *tmp = xmalloc (l+1);
179529619d2aSchristos char *p = tmp;
179629619d2aSchristos strncpy (tmp, (char *) output_paragraph, l);
179729619d2aSchristos
179829619d2aSchristos /* We remove <SECTION */
179929619d2aSchristos tmp[l] = '\0';
180029619d2aSchristos while (*p != '<')
180129619d2aSchristos p++;
180229619d2aSchristos while (*p != ' ')
180329619d2aSchristos p++;
180429619d2aSchristos /* ... and its label attribute. */
180529619d2aSchristos if (strncmp (p, " label=", 7) == 0)
180629619d2aSchristos {
180729619d2aSchristos p++;
180829619d2aSchristos while (*p != ' ')
180929619d2aSchristos p++;
181029619d2aSchristos }
181129619d2aSchristos
181229619d2aSchristos output_paragraph_offset = xml_last_section_output_position;
181329619d2aSchristos xml_last_section_output_position = 0;
181429619d2aSchristos
181529619d2aSchristos xml_pop_current_element (); /* remove section element from elements stack */
181629619d2aSchristos
181729619d2aSchristos if (last_section)
181829619d2aSchristos last_section = last_section->prev; /* remove section from sections stack */
181929619d2aSchristos if (temp)
182029619d2aSchristos {
182129619d2aSchristos free (temp->name);
182229619d2aSchristos free (temp);
182329619d2aSchristos }
182429619d2aSchristos
182529619d2aSchristos new->title = xstrdup (p);
182629619d2aSchristos new->next = xml_index_titles;
182729619d2aSchristos xml_index_titles = new;
182829619d2aSchristos }
182929619d2aSchristos else
183029619d2aSchristos {
183129619d2aSchristos static int xml_index_titles_reversed = 0;
183229619d2aSchristos
183329619d2aSchristos if (!xml_index_titles_reversed)
183429619d2aSchristos {
183529619d2aSchristos xml_index_titles = (XML_INDEX_TITLE *) reverse_list
183629619d2aSchristos ((GENERIC_LIST *) xml_index_titles);
183729619d2aSchristos xml_index_titles_reversed = 1;
183829619d2aSchristos }
183929619d2aSchristos
184029619d2aSchristos /* We put <INDEX> */
184129619d2aSchristos xml_insert_element (PRINTINDEX, START);
184229619d2aSchristos if (xml_index_titles)
184329619d2aSchristos {
184429619d2aSchristos /* Remove the final > */
184529619d2aSchristos output_paragraph_offset--;
184629619d2aSchristos /* and put ID="node-name"><TITLE>Title</TITLE> */
184729619d2aSchristos insert_string (xml_index_titles->title);
184829619d2aSchristos free (xml_index_titles->title);
184929619d2aSchristos xml_index_titles = xml_index_titles->next;
185029619d2aSchristos }
185129619d2aSchristos
185229619d2aSchristos if (xml_index_divisions)
185329619d2aSchristos {
185429619d2aSchristos xml_insert_element (INDEXDIV, START);
185529619d2aSchristos indexdivempty = 1;
185629619d2aSchristos }
185729619d2aSchristos }
185829619d2aSchristos }
185929619d2aSchristos
186029619d2aSchristos void
xml_end_index(void)186129619d2aSchristos xml_end_index (void)
186229619d2aSchristos {
186329619d2aSchristos xml_close_indexentry ();
186429619d2aSchristos if (xml_index_divisions)
186529619d2aSchristos xml_insert_element (INDEXDIV, END);
186629619d2aSchristos xml_insert_element (PRINTINDEX, END);
186729619d2aSchristos }
186829619d2aSchristos
186929619d2aSchristos static void
xml_index_divide(char * entry)187029619d2aSchristos xml_index_divide (char *entry)
187129619d2aSchristos {
187229619d2aSchristos char c;
187329619d2aSchristos if (strlen (entry) > (strlen (xml_element_list[CODE].name) + 2) &&
187429619d2aSchristos strncmp (entry+1, xml_element_list[CODE].name, strlen (xml_element_list[CODE].name)) == 0)
187529619d2aSchristos c = entry[strlen (xml_element_list[CODE].name)+2];
187629619d2aSchristos else
187729619d2aSchristos c = entry[0];
187829619d2aSchristos if (tolower (c) != last_division_letter && isalpha (c))
187929619d2aSchristos {
188029619d2aSchristos last_division_letter = tolower (c);
188129619d2aSchristos xml_close_indexentry ();
188229619d2aSchristos if (!indexdivempty)
188329619d2aSchristos {
188429619d2aSchristos xml_insert_element (INDEXDIV, END);
188529619d2aSchristos xml_insert_element (INDEXDIV, START);
188629619d2aSchristos }
188729619d2aSchristos xml_insert_element (TITLE, START);
188829619d2aSchristos insert (toupper (c));
188929619d2aSchristos xml_insert_element (TITLE, END);
189029619d2aSchristos }
189129619d2aSchristos }
189229619d2aSchristos
189329619d2aSchristos void
xml_insert_indexentry(char * entry,char * node)189429619d2aSchristos xml_insert_indexentry (char *entry, char *node)
189529619d2aSchristos {
189629619d2aSchristos char *primary = NULL, *secondary;
189729619d2aSchristos if (xml_index_divisions)
189829619d2aSchristos xml_index_divide (entry);
189929619d2aSchristos
190029619d2aSchristos indexdivempty = 0;
190129619d2aSchristos if (strstr (entry+1, INDEX_SEP))
190229619d2aSchristos {
190329619d2aSchristos primary = xmalloc (strlen (entry) + 1);
190429619d2aSchristos strcpy (primary, entry);
190529619d2aSchristos secondary = strstr (primary+1, INDEX_SEP);
190629619d2aSchristos *secondary = '\0';
190729619d2aSchristos secondary += strlen (INDEX_SEP);
190829619d2aSchristos
190929619d2aSchristos if (in_secondary && strcmp (primary, index_primary) == 0)
191029619d2aSchristos {
191129619d2aSchristos xml_insert_element (SECONDARYIE, END);
191229619d2aSchristos xml_insert_element (SECONDARYIE, START);
191329619d2aSchristos execute_string ("%s", secondary);
191429619d2aSchristos }
191529619d2aSchristos else
191629619d2aSchristos {
191729619d2aSchristos xml_close_indexentry ();
191829619d2aSchristos xml_insert_element (INDEXENTRY, START);
191929619d2aSchristos in_indexentry = 1;
192029619d2aSchristos xml_insert_element (PRIMARYIE, START);
192129619d2aSchristos execute_string ("%s", primary);
192229619d2aSchristos xml_insert_element (PRIMARYIE, END);
192329619d2aSchristos xml_insert_element (SECONDARYIE, START);
192429619d2aSchristos execute_string ("%s", secondary);
192529619d2aSchristos in_secondary = 1;
192629619d2aSchristos }
192729619d2aSchristos }
192829619d2aSchristos else
192929619d2aSchristos {
193029619d2aSchristos xml_close_indexentry ();
193129619d2aSchristos xml_insert_element (INDEXENTRY, START);
193229619d2aSchristos in_indexentry = 1;
193329619d2aSchristos xml_insert_element (PRIMARYIE, START);
193429619d2aSchristos execute_string ("%s", entry);
193529619d2aSchristos }
193629619d2aSchristos add_word (", ");
193729619d2aSchristos
193829619d2aSchristos /* Don't link to @unnumbered sections directly.
193929619d2aSchristos We are disabling warnings temporarily, otherwise these xrefs
194029619d2aSchristos will cause bogus warnings about missing punctuation. */
194129619d2aSchristos {
194229619d2aSchristos extern int print_warnings;
194329619d2aSchristos int save_print_warnings = print_warnings;
194429619d2aSchristos print_warnings = 0;
194529619d2aSchristos execute_string ("%cxref{%s}", COMMAND_PREFIX, xstrdup (node));
194629619d2aSchristos print_warnings = save_print_warnings;
194729619d2aSchristos }
194829619d2aSchristos
194929619d2aSchristos if (primary)
195029619d2aSchristos {
195129619d2aSchristos strcpy (index_primary, primary);
195229619d2aSchristos /* xml_insert_element (SECONDARYIE, END);*/
195329619d2aSchristos /* *(secondary-1) = ',';*/ /* necessary ? */
195429619d2aSchristos free (primary);
195529619d2aSchristos }
195629619d2aSchristos else
195729619d2aSchristos xml_insert_element (PRIMARYIE, END);
195829619d2aSchristos
195929619d2aSchristos /* xml_insert_element (INDEXENTRY, END); */
196029619d2aSchristos }
196129619d2aSchristos
196229619d2aSchristos void
xml_synindex(char * from,char * to)196329619d2aSchristos xml_synindex (char *from, char *to)
196429619d2aSchristos {
196529619d2aSchristos int i, slot;
196629619d2aSchristos
196729619d2aSchristos slot = -1;
196829619d2aSchristos for (i = 0; i < xml_synonyms_count; i++)
196929619d2aSchristos if (!xml_synonyms[i])
197029619d2aSchristos {
197129619d2aSchristos slot = i;
197229619d2aSchristos break;
197329619d2aSchristos }
197429619d2aSchristos
197529619d2aSchristos if (slot < 0)
197629619d2aSchristos {
197729619d2aSchristos slot = xml_synonyms_count;
197829619d2aSchristos xml_synonyms_count++;
197929619d2aSchristos
198029619d2aSchristos xml_synonyms = (XML_SYNONYM **) xrealloc (xml_synonyms,
198129619d2aSchristos (xml_synonyms_count + 1) * sizeof (XML_SYNONYM *));
198229619d2aSchristos }
198329619d2aSchristos
198429619d2aSchristos xml_synonyms[slot] = xmalloc (sizeof (XML_SYNONYM));
198529619d2aSchristos xml_synonyms[slot]->from = xstrdup (from);
198629619d2aSchristos xml_synonyms[slot]->to = xstrdup (to);
198729619d2aSchristos }
198829619d2aSchristos
198929619d2aSchristos /*
199029619d2aSchristos * MULTITABLE
199129619d2aSchristos */
199229619d2aSchristos
199329619d2aSchristos static int multitable_columns_count;
199429619d2aSchristos static int *multitable_column_widths;
199529619d2aSchristos
199629619d2aSchristos void
xml_begin_multitable(int ncolumns,int * column_widths)199729619d2aSchristos xml_begin_multitable (int ncolumns, int *column_widths)
199829619d2aSchristos {
199929619d2aSchristos int i;
200029619d2aSchristos if (docbook)
200129619d2aSchristos {
200229619d2aSchristos if (is_in_insertion_of_type (floatenv))
200329619d2aSchristos xml_begin_docbook_float (MULTITABLE);
200429619d2aSchristos else
200529619d2aSchristos xml_insert_element (MULTITABLE, START);
200629619d2aSchristos
200729619d2aSchristos multitable_columns_count = ncolumns;
200829619d2aSchristos multitable_column_widths = xmalloc (sizeof (int) * ncolumns);
200929619d2aSchristos memcpy (multitable_column_widths, column_widths,
201029619d2aSchristos sizeof (int) * ncolumns);
201129619d2aSchristos
201229619d2aSchristos xml_no_para = 1;
201329619d2aSchristos }
201429619d2aSchristos else
201529619d2aSchristos {
201629619d2aSchristos xml_insert_element (MULTITABLE, START);
201729619d2aSchristos for (i=0; i<ncolumns; i++)
201829619d2aSchristos {
201929619d2aSchristos xml_insert_element (COLSPEC, START);
202029619d2aSchristos add_word_args ("%d", column_widths[i]);
202129619d2aSchristos xml_insert_element (COLSPEC, END);
202229619d2aSchristos }
202329619d2aSchristos xml_no_para = 1;
202429619d2aSchristos }
202529619d2aSchristos }
202629619d2aSchristos
202729619d2aSchristos static void
xml_begin_multitable_group(void)202829619d2aSchristos xml_begin_multitable_group (void)
202929619d2aSchristos {
203029619d2aSchristos int i;
203129619d2aSchristos
203229619d2aSchristos xml_insert_element_with_attribute (TGROUP, START, "cols=\"%d\"",
203329619d2aSchristos multitable_columns_count);
203429619d2aSchristos
203529619d2aSchristos for (i=0; i < multitable_columns_count; i++)
203629619d2aSchristos {
203729619d2aSchristos xml_insert_element_with_attribute (COLSPEC, START,
203829619d2aSchristos "colwidth=\"%d*\"", multitable_column_widths[i]);
203929619d2aSchristos xml_insert_element (COLSPEC, END);
204029619d2aSchristos }
204129619d2aSchristos }
204229619d2aSchristos
204329619d2aSchristos void
xml_end_multitable_row(int first_row)204429619d2aSchristos xml_end_multitable_row (int first_row)
204529619d2aSchristos {
204629619d2aSchristos if (!first_row)
204729619d2aSchristos {
204829619d2aSchristos xml_insert_element (ENTRY, END);
204929619d2aSchristos xml_insert_element (ROW, END);
205029619d2aSchristos }
205129619d2aSchristos
205229619d2aSchristos if (headitem_flag)
205329619d2aSchristos {
205429619d2aSchristos if (!first_row)
205529619d2aSchristos {
205629619d2aSchristos if (after_headitem)
205729619d2aSchristos xml_insert_element (THEAD, END);
205829619d2aSchristos else
205929619d2aSchristos xml_insert_element (TBODY, END);
206029619d2aSchristos xml_insert_element (TGROUP, END);
206129619d2aSchristos }
206229619d2aSchristos
206329619d2aSchristos xml_begin_multitable_group ();
206429619d2aSchristos xml_insert_element (THEAD, START);
206529619d2aSchristos }
206629619d2aSchristos else if (first_row)
206729619d2aSchristos {
206829619d2aSchristos xml_begin_multitable_group ();
206929619d2aSchristos xml_insert_element (TBODY, START);
207029619d2aSchristos }
207129619d2aSchristos else if (after_headitem)
207229619d2aSchristos {
207329619d2aSchristos xml_insert_element (THEAD, END);
207429619d2aSchristos xml_insert_element (TBODY, START);
207529619d2aSchristos }
207629619d2aSchristos else if (first_row)
207729619d2aSchristos xml_insert_element (TBODY, START);
207829619d2aSchristos
207929619d2aSchristos xml_insert_element (ROW, START);
208029619d2aSchristos xml_insert_element (ENTRY, START);
208129619d2aSchristos }
208229619d2aSchristos
208329619d2aSchristos void
xml_end_multitable_column(void)208429619d2aSchristos xml_end_multitable_column (void)
208529619d2aSchristos {
208629619d2aSchristos xml_insert_element (ENTRY, END);
208729619d2aSchristos xml_insert_element (ENTRY, START);
208829619d2aSchristos }
208929619d2aSchristos
209029619d2aSchristos void
xml_end_multitable(void)209129619d2aSchristos xml_end_multitable (void)
209229619d2aSchristos {
209329619d2aSchristos xml_insert_element (ENTRY, END);
209429619d2aSchristos xml_insert_element (ROW, END);
209529619d2aSchristos
209629619d2aSchristos if (after_headitem)
209729619d2aSchristos {
209829619d2aSchristos if (docbook)
209929619d2aSchristos warning (_("@headitem as the last item of @multitable produces invalid Docbook documents"));
210029619d2aSchristos xml_insert_element (THEAD, END);
210129619d2aSchristos }
210229619d2aSchristos else
210329619d2aSchristos xml_insert_element (TBODY, END);
210429619d2aSchristos
210529619d2aSchristos if (docbook)
210629619d2aSchristos xml_insert_element (TGROUP, END);
210729619d2aSchristos
210829619d2aSchristos xml_insert_element (MULTITABLE, END);
210929619d2aSchristos xml_no_para = 0;
211029619d2aSchristos }
211129619d2aSchristos
211229619d2aSchristos /*
211329619d2aSchristos * Parameters in @def definitions
211429619d2aSchristos */
211529619d2aSchristos
211629619d2aSchristos #define DEFUN_SELF_DELIMITING(c) \
211729619d2aSchristos ((c) == '(' || (c) == ')' || (c) == '[' || (c) == ']')
211829619d2aSchristos
211929619d2aSchristos void
xml_process_defun_args(char ** defun_args,int auto_var_p)212029619d2aSchristos xml_process_defun_args (char **defun_args, int auto_var_p)
212129619d2aSchristos {
212229619d2aSchristos int pending_space = 0;
212329619d2aSchristos int just_after_paramtype = 0;
212429619d2aSchristos
212529619d2aSchristos for (;;)
212629619d2aSchristos {
212729619d2aSchristos char *defun_arg = *defun_args++;
212829619d2aSchristos
212929619d2aSchristos if (defun_arg == NULL)
213029619d2aSchristos break;
213129619d2aSchristos
213229619d2aSchristos if (defun_arg[0] == ' ')
213329619d2aSchristos {
213429619d2aSchristos pending_space = 1;
213529619d2aSchristos continue;
213629619d2aSchristos }
213729619d2aSchristos
213829619d2aSchristos if (pending_space)
213929619d2aSchristos {
214029619d2aSchristos add_char (' ');
214129619d2aSchristos pending_space = 0;
214229619d2aSchristos }
214329619d2aSchristos
214429619d2aSchristos if (DEFUN_SELF_DELIMITING (defun_arg[0]))
214529619d2aSchristos {
214629619d2aSchristos xml_insert_element (DEFDELIMITER, START);
214729619d2aSchristos add_char (defun_arg[0]);
214829619d2aSchristos xml_insert_element (DEFDELIMITER, END);
214929619d2aSchristos just_after_paramtype = 0;
215029619d2aSchristos }
215129619d2aSchristos else if (defun_arg[0] == '&')
215229619d2aSchristos {
215329619d2aSchristos xml_insert_element (DEFPARAM, START);
215429619d2aSchristos add_word (defun_arg);
215529619d2aSchristos xml_insert_element (DEFPARAM, END);
215629619d2aSchristos just_after_paramtype = 0;
215729619d2aSchristos }
215829619d2aSchristos else if (defun_arg[0] == COMMAND_PREFIX || just_after_paramtype)
215929619d2aSchristos {
216029619d2aSchristos xml_insert_element (DEFPARAM, START);
216129619d2aSchristos execute_string ("%s", defun_arg);
216229619d2aSchristos xml_insert_element (DEFPARAM, END);
216329619d2aSchristos just_after_paramtype = 0;
216429619d2aSchristos }
216529619d2aSchristos else if (defun_arg[0] == ',' || defun_arg[0] == ';')
216629619d2aSchristos {
216729619d2aSchristos xml_insert_element (DEFDELIMITER, START);
216829619d2aSchristos add_word (defun_arg);
216929619d2aSchristos xml_insert_element (DEFDELIMITER, END);
217029619d2aSchristos just_after_paramtype = 0;
217129619d2aSchristos }
217229619d2aSchristos else if (auto_var_p)
217329619d2aSchristos {
217429619d2aSchristos xml_insert_element (DEFPARAM, START);
217529619d2aSchristos add_word (defun_arg);
217629619d2aSchristos xml_insert_element (DEFPARAM, END);
217729619d2aSchristos just_after_paramtype = 0;
217829619d2aSchristos }
217929619d2aSchristos else
218029619d2aSchristos {
218129619d2aSchristos xml_insert_element (DEFPARAMTYPE, START);
218229619d2aSchristos add_word (defun_arg);
218329619d2aSchristos xml_insert_element (DEFPARAMTYPE, END);
218429619d2aSchristos just_after_paramtype = 1;
218529619d2aSchristos }
218629619d2aSchristos }
218729619d2aSchristos }
218829619d2aSchristos
218929619d2aSchristos void
xml_begin_definition(void)219029619d2aSchristos xml_begin_definition (void)
219129619d2aSchristos {
219229619d2aSchristos xml_insert_element (DEFINITION, START);
219329619d2aSchristos xml_definition_level ++;
219429619d2aSchristos xml_in_def_item[xml_definition_level] = 0;
219529619d2aSchristos }
219629619d2aSchristos
219729619d2aSchristos void
xml_end_definition(void)219829619d2aSchristos xml_end_definition (void)
219929619d2aSchristos {
220029619d2aSchristos if (xml_in_def_item[xml_definition_level])
220129619d2aSchristos {
220229619d2aSchristos xml_insert_element (DEFINITIONITEM, END);
220329619d2aSchristos xml_in_def_item[xml_definition_level] = 0;
220429619d2aSchristos }
220529619d2aSchristos xml_after_def_term = 0;
220629619d2aSchristos xml_insert_element (DEFINITION, END);
220729619d2aSchristos xml_definition_level --;
220829619d2aSchristos }
220929619d2aSchristos
221029619d2aSchristos void
xml_begin_def_term(int base_type,const char * category,char * defined_name,char * type_name,char * type_name2)221129619d2aSchristos xml_begin_def_term (int base_type, const char *category,
221229619d2aSchristos char *defined_name, char *type_name, char *type_name2)
221329619d2aSchristos {
221429619d2aSchristos xml_after_def_term = 0;
221529619d2aSchristos xml_insert_element (DEFINITIONTERM, START);
221629619d2aSchristos
221729619d2aSchristos /* Index entry */
221829619d2aSchristos switch (base_type)
221929619d2aSchristos {
222029619d2aSchristos case deffn:
222129619d2aSchristos case deftypefn:
222229619d2aSchristos execute_string ("@findex %s\n", defined_name);
222329619d2aSchristos break;
222429619d2aSchristos case defvr:
222529619d2aSchristos case deftypevr:
222629619d2aSchristos case defcv:
222729619d2aSchristos execute_string ("@vindex %s\n", defined_name);
222829619d2aSchristos break;
222929619d2aSchristos case deftypecv:
223029619d2aSchristos case deftypeivar:
223129619d2aSchristos execute_string ("@vindex %s %s %s\n", defined_name, _("of"), type_name);
223229619d2aSchristos break;
223329619d2aSchristos case deftypemethod:
223429619d2aSchristos case defop:
223529619d2aSchristos case deftypeop:
223629619d2aSchristos execute_string ("@findex %s %s %s\n", defined_name, _("on"), type_name);
223729619d2aSchristos break;
223829619d2aSchristos case deftp:
223929619d2aSchristos execute_string ("@tindex %s\n", defined_name);
224029619d2aSchristos break;
224129619d2aSchristos }
224229619d2aSchristos
224329619d2aSchristos /* Start with category. */
224429619d2aSchristos xml_insert_element (DEFCATEGORY, START);
224529619d2aSchristos execute_string (docbook ? "--- %s:" : "%s", category);
224629619d2aSchristos xml_insert_element (DEFCATEGORY, END);
224729619d2aSchristos add_char(' ');
224829619d2aSchristos
224929619d2aSchristos /* Output type name first for typed definitions. */
225029619d2aSchristos switch (base_type)
225129619d2aSchristos {
225229619d2aSchristos case deffn:
225329619d2aSchristos case defvr:
225429619d2aSchristos case deftp:
225529619d2aSchristos break;
225629619d2aSchristos
225729619d2aSchristos case deftypefn:
225829619d2aSchristos case deftypevr:
225929619d2aSchristos xml_insert_element (DEFTYPE, START);
226029619d2aSchristos execute_string ("%s", type_name);
226129619d2aSchristos xml_insert_element (DEFTYPE, END);
226229619d2aSchristos add_char (' ');
226329619d2aSchristos break;
226429619d2aSchristos
226529619d2aSchristos case deftypecv:
226629619d2aSchristos case deftypeivar:
226729619d2aSchristos case deftypemethod:
226829619d2aSchristos case deftypeop:
226929619d2aSchristos xml_insert_element (DEFTYPE, START);
227029619d2aSchristos execute_string ("%s", type_name2);
227129619d2aSchristos xml_insert_element (DEFTYPE, END);
227229619d2aSchristos add_char (' ');
227329619d2aSchristos break;
227429619d2aSchristos
227529619d2aSchristos default:
227629619d2aSchristos xml_insert_element (DEFCLASS, START);
227729619d2aSchristos execute_string ("%s", type_name);
227829619d2aSchristos xml_insert_element (DEFCLASS, END);
227929619d2aSchristos add_char (' ');
228029619d2aSchristos break;
228129619d2aSchristos }
228229619d2aSchristos
228329619d2aSchristos /* Categorize rest of the definitions. */
228429619d2aSchristos switch (base_type)
228529619d2aSchristos {
228629619d2aSchristos case deffn:
228729619d2aSchristos case deftypefn:
228829619d2aSchristos xml_insert_element (DEFFUNCTION, START);
228929619d2aSchristos execute_string ("%s", defined_name);
229029619d2aSchristos xml_insert_element (DEFFUNCTION, END);
229129619d2aSchristos break;
229229619d2aSchristos
229329619d2aSchristos case defvr:
229429619d2aSchristos case deftypevr:
229529619d2aSchristos xml_insert_element (DEFVARIABLE, START);
229629619d2aSchristos execute_string ("%s", defined_name);
229729619d2aSchristos xml_insert_element (DEFVARIABLE, END);
229829619d2aSchristos break;
229929619d2aSchristos
230029619d2aSchristos case deftp:
230129619d2aSchristos xml_insert_element (DEFDATATYPE, START);
230229619d2aSchristos execute_string ("%s", defined_name);
230329619d2aSchristos xml_insert_element (DEFDATATYPE, END);
230429619d2aSchristos break;
230529619d2aSchristos
230629619d2aSchristos case defcv:
230729619d2aSchristos case deftypecv:
230829619d2aSchristos case deftypeivar:
230929619d2aSchristos xml_insert_element (DEFCLASSVAR, START);
231029619d2aSchristos execute_string ("%s", defined_name);
231129619d2aSchristos xml_insert_element (DEFCLASSVAR, END);
231229619d2aSchristos break;
231329619d2aSchristos
231429619d2aSchristos case defop:
231529619d2aSchristos case deftypeop:
231629619d2aSchristos case deftypemethod:
231729619d2aSchristos /* Operation / Method */
231829619d2aSchristos xml_insert_element (DEFOPERATION, START);
231929619d2aSchristos execute_string ("%s", defined_name);
232029619d2aSchristos xml_insert_element (DEFOPERATION, END);
232129619d2aSchristos break;
232229619d2aSchristos }
232329619d2aSchristos }
232429619d2aSchristos
232529619d2aSchristos void
xml_end_def_term(void)232629619d2aSchristos xml_end_def_term (void)
232729619d2aSchristos {
232829619d2aSchristos xml_insert_element (DEFINITIONTERM, END);
232929619d2aSchristos xml_after_def_term = 1;
233029619d2aSchristos }
2331