xref: /netbsd-src/external/gpl2/texinfo/dist/makeinfo/xml.c (revision d3737e9cfd8cdb680cae0994d1d5f26b365d6d47)
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 ("&amp;");
125229619d2aSchristos   else if (character == '<' && escape_html)
125329619d2aSchristos       insert_string ("&lt;");
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