| 1 | /* xml.c -- xml output. | 
|---|
| 2 | $Id: xml.c,v 1.52 2004/12/19 17:02:23 karl Exp $ | 
|---|
| 3 |  | 
|---|
| 4 | Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | 
|---|
| 5 |  | 
|---|
| 6 | This program is free software; you can redistribute it and/or modify | 
|---|
| 7 | it under the terms of the GNU General Public License as published by | 
|---|
| 8 | the Free Software Foundation; either version 2, or (at your option) | 
|---|
| 9 | any later version. | 
|---|
| 10 |  | 
|---|
| 11 | This program is distributed in the hope that it will be useful, | 
|---|
| 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 14 | GNU General Public License for more details. | 
|---|
| 15 |  | 
|---|
| 16 | You should have received a copy of the GNU General Public License | 
|---|
| 17 | along with this program; if not, write to the Free Software | 
|---|
| 18 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 
|---|
| 19 |  | 
|---|
| 20 | Originally written by Philippe Martin <feloy@free.fr>.  */ | 
|---|
| 21 |  | 
|---|
| 22 | #include "system.h" | 
|---|
| 23 | #include "makeinfo.h" | 
|---|
| 24 | #include "insertion.h" | 
|---|
| 25 | #include "files.h" | 
|---|
| 26 | #include "float.h" | 
|---|
| 27 | #include "macro.h" | 
|---|
| 28 | #include "cmds.h" | 
|---|
| 29 | #include "lang.h" | 
|---|
| 30 |  | 
|---|
| 31 | #include "xml.h" | 
|---|
| 32 |  | 
|---|
| 33 | /* Options */ | 
|---|
| 34 | int xml_index_divisions = 1; | 
|---|
| 35 |  | 
|---|
| 36 | typedef struct _element | 
|---|
| 37 | { | 
|---|
| 38 | char name[32]; | 
|---|
| 39 | int contains_para; | 
|---|
| 40 | int contained_in_para; | 
|---|
| 41 | int keep_space; | 
|---|
| 42 | } element; | 
|---|
| 43 |  | 
|---|
| 44 | element texinfoml_element_list [] = { | 
|---|
| 45 | { "texinfo",             1, 0, 0 }, | 
|---|
| 46 | { "setfilename",         0, 0, 0 }, | 
|---|
| 47 | { "titlefont",           0, 0, 0 }, | 
|---|
| 48 | { "settitle",            0, 0, 0 }, | 
|---|
| 49 | { "documentdescription", 1, 0, 0 }, | 
|---|
| 50 |  | 
|---|
| 51 | { "node",                1, 0, 0 }, | 
|---|
| 52 | { "nodenext",            0, 0, 0 }, | 
|---|
| 53 | { "nodeprev",            0, 0, 0 }, | 
|---|
| 54 | { "nodeup",              0, 0, 0 }, | 
|---|
| 55 |  | 
|---|
| 56 | { "chapter",             1, 0, 0 }, | 
|---|
| 57 | { "section",             1, 0, 0 }, | 
|---|
| 58 | { "subsection",          1, 0, 0 }, | 
|---|
| 59 | { "subsubsection",       1, 0, 0 }, | 
|---|
| 60 |  | 
|---|
| 61 | { "top",                 1, 0, 0 }, | 
|---|
| 62 | { "unnumbered",          1, 0, 0 }, | 
|---|
| 63 | { "unnumberedsec",       1, 0, 0 }, | 
|---|
| 64 | { "unnumberedsubsec",    1, 0, 0 }, | 
|---|
| 65 | { "unnumberedsubsubsec", 1, 0, 0 }, | 
|---|
| 66 |  | 
|---|
| 67 | { "appendix",            1, 0, 0 }, | 
|---|
| 68 | { "appendixsec",         1, 0, 0 }, | 
|---|
| 69 | { "appendixsubsec",      1, 0, 0 }, | 
|---|
| 70 | { "appendixsubsubsec",   1, 0, 0 }, | 
|---|
| 71 |  | 
|---|
| 72 | { "majorheading",        0, 0, 0 }, | 
|---|
| 73 | { "chapheading",         0, 0, 0 }, | 
|---|
| 74 | { "heading",             0, 0, 0 }, | 
|---|
| 75 | { "subheading",          0, 0, 0 }, | 
|---|
| 76 | { "subsubheading",       0, 0, 0 }, | 
|---|
| 77 |  | 
|---|
| 78 | { "titlepage",           1, 0, 0 }, | 
|---|
| 79 | { "author",              0, 0, 0 }, | 
|---|
| 80 | { "booktitle",           0, 0, 0 }, | 
|---|
| 81 | { "booksubtitle",        0, 0, 0 }, | 
|---|
| 82 |  | 
|---|
| 83 | { "menu",                1, 0, 0 }, | 
|---|
| 84 | { "detailmenu",          1, 0, 0 }, | 
|---|
| 85 | { "menuentry",           0, 0, 0 }, | 
|---|
| 86 | { "menutitle",           0, 0, 0 }, | 
|---|
| 87 | { "menucomment",         0, 0, 0 }, | 
|---|
| 88 | { "menunode",            0, 0, 0 }, | 
|---|
| 89 | { "nodename",            0, 0, 0 }, | 
|---|
| 90 |  | 
|---|
| 91 | { "acronym",             0, 1, 0 }, | 
|---|
| 92 | { "acronymword",         0, 1, 0 }, | 
|---|
| 93 | { "acronymdesc",         0, 1, 0 }, | 
|---|
| 94 |  | 
|---|
| 95 | { "abbrev",              0, 1, 0 }, | 
|---|
| 96 | { "abbrevword",          0, 1, 0 }, | 
|---|
| 97 | { "abbrevdesc",          0, 1, 0 }, | 
|---|
| 98 |  | 
|---|
| 99 | { "tt",                  0, 1, 0 }, | 
|---|
| 100 | { "code",                0, 1, 0 }, | 
|---|
| 101 | { "command",             0, 1, 0 }, | 
|---|
| 102 | { "env",                 0, 1, 0 }, | 
|---|
| 103 | { "file",                0, 1, 0 }, | 
|---|
| 104 | { "option",              0, 1, 0 }, | 
|---|
| 105 | { "samp",                0, 1, 0 }, | 
|---|
| 106 | { "kbd",                 0, 1, 0 }, | 
|---|
| 107 | { "url",                 0, 1, 0 }, | 
|---|
| 108 | { "key",                 0, 1, 0 }, | 
|---|
| 109 | { "var",                 0, 1, 0 }, | 
|---|
| 110 | { "sc",                  0, 1, 0 }, | 
|---|
| 111 | { "dfn",                 0, 1, 0 }, | 
|---|
| 112 | { "emph",                0, 1, 0 }, | 
|---|
| 113 | { "strong",              0, 1, 0 }, | 
|---|
| 114 | { "cite",                0, 1, 0 }, | 
|---|
| 115 | { "notfixedwidth",       0, 1, 0 }, | 
|---|
| 116 | { "i",                   0, 1, 0 }, | 
|---|
| 117 | { "b",                   0, 1, 0 }, | 
|---|
| 118 | { "r",                   0, 1, 0 }, | 
|---|
| 119 | { "slanted",             0, 1, 0 }, | 
|---|
| 120 | { "sansserif",           0, 1, 0 }, | 
|---|
| 121 |  | 
|---|
| 122 | { "exdent",              0, 0, 0 }, | 
|---|
| 123 |  | 
|---|
| 124 | { "title",               0, 0, 0 }, | 
|---|
| 125 | { "ifinfo",              1, 0, 0 }, | 
|---|
| 126 | { "sp",                  0, 0, 0 }, | 
|---|
| 127 | { "center",              1, 0, 0 }, | 
|---|
| 128 | { "dircategory",         0, 0, 0 }, | 
|---|
| 129 | { "quotation",           1, 0, 0 }, | 
|---|
| 130 | { "example",             0, 0, 1 }, | 
|---|
| 131 | { "smallexample",        0, 0, 1 }, | 
|---|
| 132 | { "lisp",                0, 0, 1 }, | 
|---|
| 133 | { "smalllisp",           0, 0, 1 }, | 
|---|
| 134 | { "cartouche",           1, 0, 0 }, | 
|---|
| 135 | { "copying",             1, 0, 0 }, | 
|---|
| 136 | { "format",              0, 0, 1 }, | 
|---|
| 137 | { "smallformat",         0, 0, 1 }, | 
|---|
| 138 | { "display",             0, 0, 1 }, | 
|---|
| 139 | { "smalldisplay",        0, 0, 1 }, | 
|---|
| 140 | { "verbatim",            0, 0, 1 }, | 
|---|
| 141 | { "footnote",            0, 1, 0 }, | 
|---|
| 142 | { "",                    0, 1, 0 }, /* LINEANNOTATION (docbook) */ | 
|---|
| 143 |  | 
|---|
| 144 | { "",                    1, 0, 0 }, /* TIP (docbook)       */ | 
|---|
| 145 | { "",                    1, 0, 0 }, /* NOTE (docbook)      */ | 
|---|
| 146 | { "",                    1, 0, 0 }, /* IMPORTANT (docbook) */ | 
|---|
| 147 | { "",                    1, 0, 0 }, /* WARNING (docbook)   */ | 
|---|
| 148 | { "",                    1, 0, 0 }, /* CAUTION (docbook)   */ | 
|---|
| 149 |  | 
|---|
| 150 | { "itemize",             0, 0, 0 }, | 
|---|
| 151 | { "itemfunction",        0, 0, 0 }, | 
|---|
| 152 | { "item",                1, 0, 0 }, | 
|---|
| 153 | { "enumerate",           0, 0, 0 }, | 
|---|
| 154 | { "table",               0, 0, 0 }, | 
|---|
| 155 | { "tableitem",           0, 0, 0 }, | 
|---|
| 156 | { "tableterm",           0, 0, 0 }, | 
|---|
| 157 |  | 
|---|
| 158 | { "indexterm",           0, 1, 0 }, | 
|---|
| 159 |  | 
|---|
| 160 | { "math",                0, 1, 0 }, | 
|---|
| 161 |  | 
|---|
| 162 | { "dmn",                 0, 1, 0 }, | 
|---|
| 163 |  | 
|---|
| 164 | { "xref",                0, 1, 0 }, | 
|---|
| 165 | { "xrefnodename",        0, 1, 0 }, | 
|---|
| 166 | { "xrefinfoname",        0, 1, 0 }, | 
|---|
| 167 | { "xrefprinteddesc",     0, 1, 0 }, | 
|---|
| 168 | { "xrefinfofile",        0, 1, 0 }, | 
|---|
| 169 | { "xrefprintedname",     0, 1, 0 }, | 
|---|
| 170 |  | 
|---|
| 171 | { "inforef",             0, 1, 0 }, | 
|---|
| 172 | { "inforefnodename",     0, 1, 0 }, | 
|---|
| 173 | { "inforefrefname",      0, 1, 0 }, | 
|---|
| 174 | { "inforefinfoname",     0, 1, 0 }, | 
|---|
| 175 |  | 
|---|
| 176 | { "uref",                0, 1, 0 }, | 
|---|
| 177 | { "urefurl",             0, 1, 0 }, | 
|---|
| 178 | { "urefdesc",            0, 1, 0 }, | 
|---|
| 179 | { "urefreplacement",     0, 1, 0 }, | 
|---|
| 180 |  | 
|---|
| 181 | { "email",               0, 1, 0 }, | 
|---|
| 182 | { "emailaddress",        0, 1, 0 }, | 
|---|
| 183 | { "emailname",           0, 1, 0 }, | 
|---|
| 184 |  | 
|---|
| 185 | { "group",               0, 0, 0 }, | 
|---|
| 186 | { "float",               1, 0, 0 }, | 
|---|
| 187 | { "floattype",           0, 0, 0 }, | 
|---|
| 188 | { "floatpos",            0, 0, 0 }, | 
|---|
| 189 | { "caption",             0, 0, 0 }, | 
|---|
| 190 | { "shortcaption",        0, 0, 0 }, | 
|---|
| 191 |  | 
|---|
| 192 | { "",                    0, 0, 0 }, /* TABLE (docbook) */ | 
|---|
| 193 | { "",                    0, 0, 0 }, /* FIGURE (docbook) */ | 
|---|
| 194 | { "",                    0, 0, 0 }, /* EXAMPLE (docbook) */ | 
|---|
| 195 | { "",                    1, 0, 0 }, /* SIDEBAR (docbook) */ | 
|---|
| 196 |  | 
|---|
| 197 | { "printindex",          0, 0, 0 }, | 
|---|
| 198 | { "listoffloats",        0, 0, 0 }, | 
|---|
| 199 | { "anchor",              0, 1, 0 }, | 
|---|
| 200 |  | 
|---|
| 201 | { "image",               0, 0, 0 }, | 
|---|
| 202 | { "inlineimage",         0, 1, 0 }, | 
|---|
| 203 | { "alttext",             0, 1, 0 }, | 
|---|
| 204 |  | 
|---|
| 205 | { "",                    0, 1, 0 }, /* PRIMARY (docbook) */ | 
|---|
| 206 | { "",                    0, 1, 0 }, /* SECONDARY (docbook) */ | 
|---|
| 207 | { "",                    0, 0, 0 }, /* INFORMALFIGURE (docbook) */ | 
|---|
| 208 | { "",                    0, 0, 0 }, /* MEDIAOBJECT (docbook) */ | 
|---|
| 209 | { "",                    0, 0, 0 }, /* IMAGEOBJECT (docbook) */ | 
|---|
| 210 | { "",                    0, 0, 0 }, /* IMAGEDATA (docbook) */ | 
|---|
| 211 | { "",                    0, 0, 0 }, /* TEXTOBJECT (docbook) */ | 
|---|
| 212 | { "",                    0, 0, 0 }, /* INDEXENTRY (docbook) */ | 
|---|
| 213 | { "",                    0, 0, 0 }, /* PRIMARYIE (docbook) */ | 
|---|
| 214 | { "",                    0, 0, 0 }, /* SECONDARYIE (docbook) */ | 
|---|
| 215 | { "",                    0, 0, 0 }, /* INDEXDIV (docbook) */ | 
|---|
| 216 | { "multitable",          0, 0, 0 }, | 
|---|
| 217 | { "",                    0, 0, 0 }, /* TGROUP (docbook) */ | 
|---|
| 218 | { "columnfraction",      0, 0, 0 }, | 
|---|
| 219 | { "thead",               0, 0, 0 }, | 
|---|
| 220 | { "tbody",               0, 0, 0 }, | 
|---|
| 221 | { "entry",               0, 0, 0 }, | 
|---|
| 222 | { "row",                 0, 0, 0 }, | 
|---|
| 223 | { "",                    0, 0, 0 }, /* BOOKINFO (docbook) */ | 
|---|
| 224 | { "",                    0, 0, 0 }, /* ABSTRACT (docbook) */ | 
|---|
| 225 | { "",                    0, 0, 0 }, /* REPLACEABLE (docbook) */ | 
|---|
| 226 | { "",                    0, 0, 0 }, /* ENVAR (docbook) */ | 
|---|
| 227 | { "",                    0, 0, 0 }, /* COMMENT (docbook) */ | 
|---|
| 228 | { "",                    0, 0, 0 }, /* FUNCTION (docbook) */ | 
|---|
| 229 | { "",                    0, 0, 0 }, /* LEGALNOTICE (docbook) */ | 
|---|
| 230 |  | 
|---|
| 231 | { "contents",            0, 0, 0 }, | 
|---|
| 232 | { "shortcontents",       0, 0, 0 }, | 
|---|
| 233 | { "documentlanguage",    0, 0, 0 }, | 
|---|
| 234 |  | 
|---|
| 235 | { "setvalue",            0, 0, 0 }, | 
|---|
| 236 | { "clearvalue",          0, 0, 0 }, | 
|---|
| 237 |  | 
|---|
| 238 | { "definition",          0, 0, 0 }, | 
|---|
| 239 | { "definitionterm",      0, 0, 0 }, | 
|---|
| 240 | { "definitionitem",      1, 0, 0 }, | 
|---|
| 241 | { "defcategory",         0, 0, 0 }, | 
|---|
| 242 | { "deffunction",         0, 0, 0 }, | 
|---|
| 243 | { "defvariable",         0, 0, 0 }, | 
|---|
| 244 | { "defparam",            0, 0, 0 }, | 
|---|
| 245 | { "defdelimiter",        0, 0, 0 }, | 
|---|
| 246 | { "deftype",             0, 0, 0 }, | 
|---|
| 247 | { "defparamtype",        0, 0, 0 }, | 
|---|
| 248 | { "defdatatype",         0, 0, 0 }, | 
|---|
| 249 | { "defclass",            0, 0, 0 }, | 
|---|
| 250 | { "defclassvar",         0, 0, 0 }, | 
|---|
| 251 | { "defoperation",        0, 0, 0 }, | 
|---|
| 252 |  | 
|---|
| 253 | { "para",                0, 0, 0 } /* Must be last */ | 
|---|
| 254 | /* name / contains para / contained in para / preserve space */ | 
|---|
| 255 | }; | 
|---|
| 256 |  | 
|---|
| 257 | element docbook_element_list [] = { | 
|---|
| 258 | { "book",                0, 0, 0 }, /* TEXINFO */ | 
|---|
| 259 | { "",                    0, 0, 0 }, /* SETFILENAME */ | 
|---|
| 260 | { "",                    0, 0, 0 }, /* TITLEINFO */ | 
|---|
| 261 | { "title",               0, 0, 0 }, /* SETTITLE */ | 
|---|
| 262 | { "",                    1, 0, 0 }, /* DOCUMENTDESCRIPTION (?) */ | 
|---|
| 263 |  | 
|---|
| 264 | { "",                    1, 0, 0 }, /* NODE */ | 
|---|
| 265 | { "",                    0, 0, 0 }, /* NODENEXT */ | 
|---|
| 266 | { "",                    0, 0, 0 }, /* NODEPREV */ | 
|---|
| 267 | { "",                    0, 0, 0 }, /* NODEUP */ | 
|---|
| 268 |  | 
|---|
| 269 | { "chapter",             1, 0, 0 }, | 
|---|
| 270 | { "sect1",               1, 0, 0 }, /* SECTION */ | 
|---|
| 271 | { "sect2",               1, 0, 0 }, /* SUBSECTION */ | 
|---|
| 272 | { "sect3",               1, 0, 0 }, /* SUBSUBSECTION */ | 
|---|
| 273 |  | 
|---|
| 274 | { "chapter",             1, 0, 0 }, /* TOP */ | 
|---|
| 275 | { "chapter",             1, 0, 0 }, /* UNNUMBERED */ | 
|---|
| 276 | { "sect1",               1, 0, 0 }, /* UNNUMBEREDSEC */ | 
|---|
| 277 | { "sect2",               1, 0, 0 }, /* UNNUMBEREDSUBSEC */ | 
|---|
| 278 | { "sect3",               1, 0, 0 }, /* UNNUMBEREDSUBSUBSEC */ | 
|---|
| 279 |  | 
|---|
| 280 | { "appendix",            1, 0, 0 }, | 
|---|
| 281 | { "sect1",               1, 0, 0 }, /* APPENDIXSEC */ | 
|---|
| 282 | { "sect2",               1, 0, 0 }, /* APPENDIXSUBSEC */ | 
|---|
| 283 | { "sect3",               1, 0, 0 }, /* APPENDIXSUBSUBSEC */ | 
|---|
| 284 |  | 
|---|
| 285 | { "bridgehead",          0, 0, 0 }, /* MAJORHEADING */ | 
|---|
| 286 | { "bridgehead",          0, 0, 0 }, /* CHAPHEADING */ | 
|---|
| 287 | { "bridgehead",          0, 0, 0 }, /* HEADING */ | 
|---|
| 288 | { "bridgehead",          0, 0, 0 }, /* SUBHEADING */ | 
|---|
| 289 | { "bridgehead",          0, 0, 0 }, /* SUBSUBHEADING */ | 
|---|
| 290 |  | 
|---|
| 291 | { "",                    0, 0, 0 }, /* TITLEPAGE */ | 
|---|
| 292 | { "",                    0, 0, 0 }, /* AUTHOR */ | 
|---|
| 293 | { "",                    0, 0, 0 }, /* BOOKTITLE */ | 
|---|
| 294 | { "",                    0, 0, 0 }, /* BOOKSUBTITLE */ | 
|---|
| 295 |  | 
|---|
| 296 | { "",                    1, 0, 0 }, /* MENU */ | 
|---|
| 297 | { "",                    1, 0, 0 }, /* DETAILMENU */ | 
|---|
| 298 | { "",                    1, 0, 0 }, /* MENUENTRY */ | 
|---|
| 299 | { "",                    0, 0, 0 }, /* MENUTITLE */ | 
|---|
| 300 | { "",                    1, 0, 0 }, /* MENUCOMMENT */ | 
|---|
| 301 | { "",                    0, 0, 0 }, /* MENUNODE */ | 
|---|
| 302 | { "anchor",              0, 0, 0 }, /* NODENAME */ | 
|---|
| 303 |  | 
|---|
| 304 | { "acronym",             0, 1, 0 }, | 
|---|
| 305 | { "",                    0, 1, 0 }, /* ACRONYMWORD */ | 
|---|
| 306 | { "",                    0, 1, 0 }, /* ACRONYMDESC */ | 
|---|
| 307 |  | 
|---|
| 308 | { "abbrev",              0, 1, 0 }, | 
|---|
| 309 | { "",                    0, 1, 0 }, /* ABBREVWORD */ | 
|---|
| 310 | { "",                    0, 1, 0 }, /* ABBREVDESC */ | 
|---|
| 311 |  | 
|---|
| 312 | { "literal",             0, 1, 0 }, /* TT */ | 
|---|
| 313 | { "literal",             0, 1, 0 }, /* CODE */ | 
|---|
| 314 | { "command",             0, 1, 0 }, /* COMMAND */ | 
|---|
| 315 | { "envar",               0, 1, 0 }, /* ENV */ | 
|---|
| 316 | { "filename",            0, 1, 0 }, /* FILE */ | 
|---|
| 317 | { "option",              0, 1, 0 }, /* OPTION */ | 
|---|
| 318 | { "literal",             0, 1, 0 }, /* SAMP */ | 
|---|
| 319 | { "userinput",           0, 1, 0 }, /* KBD */ | 
|---|
| 320 | { "wordasword",          0, 1, 0 }, /* URL */ | 
|---|
| 321 | { "keycap",              0, 1, 0 }, /* KEY */ | 
|---|
| 322 | { "replaceable",         0, 1, 0 }, /* VAR */ | 
|---|
| 323 | { "",                    0, 1, 0 }, /* SC */ | 
|---|
| 324 | { "firstterm",           0, 1, 0 }, /* DFN */ | 
|---|
| 325 | { "emphasis",            0, 1, 0 }, /* EMPH */ | 
|---|
| 326 | { "emphasis",            0, 1, 0 }, /* STRONG */ | 
|---|
| 327 | { "citetitle",           0, 1, 0 }, /* CITE */ | 
|---|
| 328 | { "",                    0, 1, 0 }, /* NOTFIXEDWIDTH */ | 
|---|
| 329 | { "wordasword",          0, 1, 0 }, /* I */ | 
|---|
| 330 | { "emphasis",            0, 1, 0 }, /* B */ | 
|---|
| 331 | { "",                    0, 1, 0 }, /* R */ | 
|---|
| 332 |  | 
|---|
| 333 | { "",                    0, 0, 0 }, /* EXDENT */ | 
|---|
| 334 |  | 
|---|
| 335 | { "title",               0, 0, 0 }, | 
|---|
| 336 | { "",                    1, 0, 0 }, /* IFINFO */ | 
|---|
| 337 | { "",                    0, 0, 0 }, /* SP */ | 
|---|
| 338 | { "",                    1, 0, 0 }, /* CENTER */ | 
|---|
| 339 | { "",                    0, 0, 0 }, /* DIRCATEGORY */ | 
|---|
| 340 | { "blockquote",          1, 0, 0 }, /* QUOTATION */ | 
|---|
| 341 | { "screen",              0, 0, 1 }, /* EXAMPLE */ | 
|---|
| 342 | { "screen",              0, 0, 1 }, /* SMALLEXAMPLE */ | 
|---|
| 343 | { "programlisting",      0, 0, 1 }, /* LISP */ | 
|---|
| 344 | { "programlisting",      0, 0, 1 }, /* SMALLLISP */ | 
|---|
| 345 | { "",                    1, 0, 0 }, /* CARTOUCHE */ | 
|---|
| 346 | { "",                    1, 0, 0 }, /* COPYING */ | 
|---|
| 347 | { "screen",              0, 1, 1 }, /* FORMAT */ | 
|---|
| 348 | { "screen",              0, 1, 1 }, /* SMALLFORMAT */ | 
|---|
| 349 | { "literallayout",       0, 1, 1 }, /* DISPLAY */ | 
|---|
| 350 | { "literallayout",       0, 1, 1 }, /* SMALLDISPLAY */ | 
|---|
| 351 | { "screen",              0, 0, 1 }, /* VERBATIM */ | 
|---|
| 352 | { "footnote",            0, 1, 0 }, | 
|---|
| 353 | { "lineannotation",      0, 1, 0 }, | 
|---|
| 354 |  | 
|---|
| 355 | { "tip",                 1, 0, 0 }, | 
|---|
| 356 | { "note",                1, 0, 0 }, | 
|---|
| 357 | { "important",           1, 0, 0 }, | 
|---|
| 358 | { "warning",             1, 0, 0 }, | 
|---|
| 359 | { "caution",             1, 0, 0 }, | 
|---|
| 360 |  | 
|---|
| 361 | { "itemizedlist",        0, 0, 0 }, /* ITEMIZE */ | 
|---|
| 362 | { "",                    0, 0, 0 }, /* ITEMFUNCTION */ | 
|---|
| 363 | { "listitem",            1, 0, 0 }, /* ITEM */ | 
|---|
| 364 | { "orderedlist",         0, 0, 0 }, /* ENUMERATE */ | 
|---|
| 365 | { "variablelist",        0, 0, 0 }, /* TABLE */ | 
|---|
| 366 | { "varlistentry",        0, 0, 0 }, /* TABLEITEM */ | 
|---|
| 367 | { "term",                0, 0, 0 }, /* TABLETERM */ | 
|---|
| 368 |  | 
|---|
| 369 | { "indexterm",           0, 1, 0 }, /* INDEXTERM */ | 
|---|
| 370 |  | 
|---|
| 371 | { "",                    0, 1, 0 }, /* MATH */ | 
|---|
| 372 |  | 
|---|
| 373 | { "",                    0, 1, 0 }, /* DIMENSION */ | 
|---|
| 374 |  | 
|---|
| 375 | { "xref",                0, 1, 0 }, /* XREF */ | 
|---|
| 376 | { "link",                0, 1, 0 }, /* XREFNODENAME */ | 
|---|
| 377 | { "",                    0, 1, 0 }, /* XREFINFONAME */ | 
|---|
| 378 | { "",                    0, 1, 0 }, /* XREFPRINTEDDESC */ | 
|---|
| 379 | { "",                    0, 1, 0 }, /* XREFINFOFILE */ | 
|---|
| 380 | { "",                    0, 1, 0 }, /* XREFPRINTEDNAME */ | 
|---|
| 381 |  | 
|---|
| 382 | { "",                    0, 1, 0 }, /* INFOREF */ | 
|---|
| 383 | { "",                    0, 1, 0 }, /* INFOREFNODENAME */ | 
|---|
| 384 | { "",                    0, 1, 0 }, /* INFOREFREFNAME */ | 
|---|
| 385 | { "",                    0, 1, 0 }, /* INFOREFINFONAME */ | 
|---|
| 386 |  | 
|---|
| 387 | { "ulink",               0, 1, 0 }, /* UREF */ | 
|---|
| 388 | { "",                    0, 1, 0 }, /* UREFURL */ | 
|---|
| 389 | { "",                    0, 1, 0 }, /* UREFDESC */ | 
|---|
| 390 | { "",                    0, 1, 0 }, /* UREFREPLACEMENT */ | 
|---|
| 391 |  | 
|---|
| 392 | { "ulink",               0, 1, 0 }, /* EMAIL */ | 
|---|
| 393 | { "",                    0, 1, 0 }, /* EMAILADDRESS */ | 
|---|
| 394 | { "",                    0, 1, 0 }, /* EMAILNAME */ | 
|---|
| 395 |  | 
|---|
| 396 | { "",                    0, 0, 0 }, /* GROUP */ | 
|---|
| 397 | { "",                    1, 0, 0 }, /* FLOAT */ | 
|---|
| 398 | { "",                    0, 0, 0 }, /* FLOATTYPE */ | 
|---|
| 399 | { "",                    0, 0, 0 }, /* FLOATPOS */ | 
|---|
| 400 | { "",                    0, 0, 0 }, /* CAPTION */ | 
|---|
| 401 | { "",                    0, 0, 0 }, /* SHORTCAPTION */ | 
|---|
| 402 |  | 
|---|
| 403 | { "table",               0, 1, 0 }, | 
|---|
| 404 | { "figure",              0, 1, 0 }, | 
|---|
| 405 | { "example",             1, 1, 0 }, | 
|---|
| 406 | { "sidebar",             1, 0, 0 }, | 
|---|
| 407 |  | 
|---|
| 408 | { "index",               0, 1, 0 }, /* PRINTINDEX */ | 
|---|
| 409 | { "",                    0, 1, 0 }, /* LISTOFFLOATS */ | 
|---|
| 410 | { "",                    0, 1, 0 }, /* ANCHOR */ | 
|---|
| 411 |  | 
|---|
| 412 | { "",                    0, 0, 0 }, /* IMAGE */ | 
|---|
| 413 | { "inlinemediaobject",   0, 1, 0 }, /* INLINEIMAGE */ | 
|---|
| 414 | { "",                    0, 0, 0 }, /* IMAGEALTTEXT */ | 
|---|
| 415 |  | 
|---|
| 416 | { "primary",             0, 1, 0 }, /* PRIMARY */ | 
|---|
| 417 | { "secondary",           0, 1, 0 }, | 
|---|
| 418 | { "informalfigure",      0, 0, 0 }, | 
|---|
| 419 | { "mediaobject",         0, 0, 0 }, | 
|---|
| 420 | { "imageobject",         0, 1, 0 }, | 
|---|
| 421 | { "imagedata",           0, 1, 0 }, | 
|---|
| 422 | { "textobject",          0, 1, 0 }, | 
|---|
| 423 | { "indexentry",          0, 0, 0 }, | 
|---|
| 424 | { "primaryie",           0, 0, 0 }, | 
|---|
| 425 | { "secondaryie",         0, 0, 0 }, | 
|---|
| 426 | { "indexdiv",            0, 0, 0 }, | 
|---|
| 427 | { "informaltable",       0, 0, 0 }, | 
|---|
| 428 | { "tgroup",              0, 0, 0 }, | 
|---|
| 429 | { "colspec",             0, 0, 0 }, | 
|---|
| 430 | { "thead",               0, 0, 0 }, | 
|---|
| 431 | { "tbody",               0, 0, 0 }, | 
|---|
| 432 | { "entry",               0, 0, 0 }, | 
|---|
| 433 | { "row",                 0, 0, 0 }, | 
|---|
| 434 | { "bookinfo",            0, 0, 0 }, | 
|---|
| 435 | { "abstract",            1, 0, 0 }, | 
|---|
| 436 | { "replaceable",         0, 0, 0 }, | 
|---|
| 437 | { "envar",               0, 1, 0 }, | 
|---|
| 438 | { "comment",             0, 0, 0 }, | 
|---|
| 439 | { "function",            0, 1, 0 }, | 
|---|
| 440 | { "legalnotice",         1, 0, 0 }, | 
|---|
| 441 |  | 
|---|
| 442 | { "",                    0, 0, 0 }, /* CONTENTS (xml) */ | 
|---|
| 443 | { "",                    0, 0, 0 }, /* SHORTCONTENTS (xml) */ | 
|---|
| 444 | { "",                    0, 0, 0 }, /* DOCUMENT LANGUAGE (xml) */ | 
|---|
| 445 |  | 
|---|
| 446 | { "",                    0, 0, 0 }, /* SETVALUE (xml) */ | 
|---|
| 447 | { "",                    0, 0, 0 }, /* CLEARVALUE (xml) */ | 
|---|
| 448 |  | 
|---|
| 449 | { "blockquote",          1, 0, 0 }, /* DEFINITION */ | 
|---|
| 450 | { "screen",              0, 0, 1 }, /* DEFINITIONTERM */ | 
|---|
| 451 | { "",                    0, 0, 0 }, /* DEFINITIONITEM (xml) */ | 
|---|
| 452 | { "",                    0, 0, 0 }, /* DEFCATEGORY (xml) */ | 
|---|
| 453 | { "function",            0, 0, 0 }, /* DEFFUNCTION */ | 
|---|
| 454 | { "varname",             0, 0, 0 }, /* DEFVARIABLE */ | 
|---|
| 455 | { "varname",             0, 0, 0 }, /* DEFPARAM */ | 
|---|
| 456 | { "",                    0, 0, 0 }, /* DEFDELIMITER (xml) */ | 
|---|
| 457 | { "returnvalue",         0, 0, 0 }, /* DEFTYPE */ | 
|---|
| 458 | { "type",                0, 0, 0 }, /* DEFPARAMTYPE */ | 
|---|
| 459 | { "structname",          0, 0, 0 }, /* DEFDATATYPE */ | 
|---|
| 460 | { "classname",           0, 0, 0 }, /* DEFCLASS */ | 
|---|
| 461 | { "property",            0, 0, 0 }, /* DEFCLASSVAR */ | 
|---|
| 462 | { "methodname",          0, 0, 0 }, /* DEFOPERATION */ | 
|---|
| 463 |  | 
|---|
| 464 | { "para",                0, 0, 0 } /* Must be last */ | 
|---|
| 465 | /* name / contains para / contained in para / preserve space */ | 
|---|
| 466 | }; | 
|---|
| 467 |  | 
|---|
| 468 | element *xml_element_list = NULL; | 
|---|
| 469 |  | 
|---|
| 470 |  | 
|---|
| 471 | typedef struct _replace_element | 
|---|
| 472 | { | 
|---|
| 473 | int element_to_replace; | 
|---|
| 474 | int element_containing; | 
|---|
| 475 | int element_replacing; | 
|---|
| 476 | } replace_element; | 
|---|
| 477 |  | 
|---|
| 478 | /* Elements to replace - Docbook only | 
|---|
| 479 | ------------------- | 
|---|
| 480 | if `element_to_replace' have to be inserted | 
|---|
| 481 | as a child of `element_containing,' | 
|---|
| 482 | use `element_replacing' instead. | 
|---|
| 483 |  | 
|---|
| 484 | A value of `-1' for element_replacing means `do not use any element.' | 
|---|
| 485 | */ | 
|---|
| 486 |  | 
|---|
| 487 | replace_element replace_elements [] = { | 
|---|
| 488 | { I, TABLETERM, EMPH }, | 
|---|
| 489 | { B, TABLETERM, EMPH }, | 
|---|
| 490 | { TT, CODE, -1 }, | 
|---|
| 491 | { EXAMPLE, DISPLAY, -1 }, | 
|---|
| 492 | { CODE, DFN, -1 }, | 
|---|
| 493 | { CODE, VAR, -1 }, | 
|---|
| 494 | { EMPH, CODE, REPLACEABLE }, | 
|---|
| 495 | { VAR, VAR, -1}, | 
|---|
| 496 | { VAR, B, EMPH}, | 
|---|
| 497 | { B, CODE, ENVAR}, | 
|---|
| 498 | { CODE, I, EMPH}, | 
|---|
| 499 | { SAMP, VAR, -1 }, | 
|---|
| 500 | { FORMAT, BOOKINFO, ABSTRACT }, | 
|---|
| 501 | { QUOTATION, ABSTRACT, -1}, | 
|---|
| 502 | { LINEANNOTATION, LINEANNOTATION, -1 }, | 
|---|
| 503 | { LEGALNOTICE, ABSTRACT, -1 }, | 
|---|
| 504 | { QUOTATION, QUOTATION, -1 }, | 
|---|
| 505 | /* Formal versions of table and image elements.  */ | 
|---|
| 506 | { MULTITABLE, FLOAT, FLOATTABLE }, | 
|---|
| 507 | { INFORMALFIGURE, FLOAT, FLOATFIGURE }, | 
|---|
| 508 | { CARTOUCHE, FLOAT, FLOATCARTOUCHE }, | 
|---|
| 509 | /* Unnecessary markup in @defun blocks.  */ | 
|---|
| 510 | { VAR, DEFPARAM, -1 }, | 
|---|
| 511 | { CODE, DEFTYPE, -1 }, | 
|---|
| 512 | /* Add your elements to replace here */ | 
|---|
| 513 | {-1, 0, 0} | 
|---|
| 514 | }; | 
|---|
| 515 |  | 
|---|
| 516 | int xml_in_menu_entry = 0; | 
|---|
| 517 | int xml_in_menu_entry_comment = 0; | 
|---|
| 518 | int xml_node_open = 0; | 
|---|
| 519 | int xml_node_level = -1; | 
|---|
| 520 | int xml_in_para = 0; | 
|---|
| 521 | int xml_just_after_element = 0; | 
|---|
| 522 | int xml_keep_space = 0; | 
|---|
| 523 |  | 
|---|
| 524 | int xml_no_indent = 0; | 
|---|
| 525 |  | 
|---|
| 526 | int xml_no_para = 0; | 
|---|
| 527 | char *xml_node_id = NULL; | 
|---|
| 528 | int xml_sort_index = 0; | 
|---|
| 529 |  | 
|---|
| 530 | int xml_in_xref_token = 0; | 
|---|
| 531 | int xml_in_bookinfo = 0; | 
|---|
| 532 | int xml_in_book_title = 0; | 
|---|
| 533 | int xml_in_abstract = 0; | 
|---|
| 534 |  | 
|---|
| 535 | /* Non-zero if we are handling an element that can appear between | 
|---|
| 536 | @item and @itemx, @deffn and @deffnx.  */ | 
|---|
| 537 | int xml_dont_touch_items_defs = 0; | 
|---|
| 538 |  | 
|---|
| 539 | /* We need to keep footnote state, because elements inside footnote may try | 
|---|
| 540 | to close the previous parent para.  */ | 
|---|
| 541 | static int xml_in_footnote = 0; | 
|---|
| 542 |  | 
|---|
| 543 | static int xml_after_table_term = 0; | 
|---|
| 544 | static int book_started = 0; | 
|---|
| 545 | static int first_section_opened = 0; | 
|---|
| 546 |  | 
|---|
| 547 | static int xml_in_tableitem[256]; | 
|---|
| 548 | static int xml_in_item[256]; | 
|---|
| 549 | static int xml_table_level = 0; | 
|---|
| 550 |  | 
|---|
| 551 | static int xml_in_def_item[256]; | 
|---|
| 552 | static int xml_definition_level = 0; | 
|---|
| 553 | int xml_after_def_term = 0; | 
|---|
| 554 |  | 
|---|
| 555 | static int in_table_title = 0; | 
|---|
| 556 |  | 
|---|
| 557 | static int in_indexentry = 0; | 
|---|
| 558 | static int in_secondary = 0; | 
|---|
| 559 | static int in_indexterm = 0; | 
|---|
| 560 |  | 
|---|
| 561 |  | 
|---|
| 562 | char * | 
|---|
| 563 | xml_id (char *id) | 
|---|
| 564 | { | 
|---|
| 565 | char *tem = xmalloc (strlen (id) + 1); | 
|---|
| 566 | char *p = tem; | 
|---|
| 567 | strcpy (tem, id); | 
|---|
| 568 | while (*p) | 
|---|
| 569 | { /* Check if a character is allowed in ID attributes.  This list differs | 
|---|
| 570 | slightly from XML specs that it doesn't contain underscores. | 
|---|
| 571 | See http://xml.coverpages.org/sgmlsyn/sgmlsyn.htm, ``9.3 Name''  */ | 
|---|
| 572 | if (!strchr ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.", *p)) | 
|---|
| 573 | *p = '-'; | 
|---|
| 574 | p++; | 
|---|
| 575 | } | 
|---|
| 576 | p = tem; | 
|---|
| 577 | /* First character can only be a letter.  */ | 
|---|
| 578 | if (!strchr ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", *p)) | 
|---|
| 579 | *p = 'i'; | 
|---|
| 580 | return tem; | 
|---|
| 581 | } | 
|---|
| 582 |  | 
|---|
| 583 | int | 
|---|
| 584 | xml_element (char *name) | 
|---|
| 585 | { | 
|---|
| 586 | int i; | 
|---|
| 587 | for (i=0; i<=PARA; i++) | 
|---|
| 588 | { | 
|---|
| 589 | if (strcasecmp (name, texinfoml_element_list[i].name) == 0) | 
|---|
| 590 | return i; | 
|---|
| 591 | } | 
|---|
| 592 | printf ("Error xml_element\n"); | 
|---|
| 593 | return -1; | 
|---|
| 594 | } | 
|---|
| 595 |  | 
|---|
| 596 | void | 
|---|
| 597 | xml_begin_document (char *output_filename) | 
|---|
| 598 | { | 
|---|
| 599 | if (book_started) | 
|---|
| 600 | return; | 
|---|
| 601 |  | 
|---|
| 602 | book_started = 1; | 
|---|
| 603 |  | 
|---|
| 604 | /* Make sure this is the very first string of the output document.  */ | 
|---|
| 605 | output_paragraph_offset = 0; | 
|---|
| 606 |  | 
|---|
| 607 | insert_string ("<?xml version=\"1.0\""); | 
|---|
| 608 |  | 
|---|
| 609 | /* At this point, we register a delayed writing for document encoding, | 
|---|
| 610 | so in the end, proper encoding attribute will be inserted here. | 
|---|
| 611 | Since the user is unaware that we are implicitly executing this | 
|---|
| 612 | command, we should disable warnings temporarily, in order to avoid | 
|---|
| 613 | possible confusion.  (ie. if the output is not seekable, | 
|---|
| 614 | register_delayed_write issues a warning.)  */ | 
|---|
| 615 | { | 
|---|
| 616 | extern int print_warnings; | 
|---|
| 617 | int save_print_warnings = print_warnings; | 
|---|
| 618 | print_warnings = 0; | 
|---|
| 619 | register_delayed_write ("@documentencoding"); | 
|---|
| 620 | print_warnings = save_print_warnings; | 
|---|
| 621 | } | 
|---|
| 622 |  | 
|---|
| 623 | insert_string ("?>\n"); | 
|---|
| 624 |  | 
|---|
| 625 | if (docbook) | 
|---|
| 626 | { | 
|---|
| 627 | 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]>"); | 
|---|
| 628 | xml_element_list = docbook_element_list; | 
|---|
| 629 | } | 
|---|
| 630 | else | 
|---|
| 631 | { | 
|---|
| 632 | insert_string ("<!DOCTYPE texinfo PUBLIC \"-//GNU//DTD TexinfoML V"); | 
|---|
| 633 | insert_string (VERSION); | 
|---|
| 634 | insert_string ("//EN\" \"http://www.gnu.org/software/texinfo/dtd/"); | 
|---|
| 635 | insert_string (VERSION); | 
|---|
| 636 | insert_string ("/texinfo.dtd\">"); | 
|---|
| 637 | xml_element_list = texinfoml_element_list; | 
|---|
| 638 | } | 
|---|
| 639 | if (language_code != last_language_code) | 
|---|
| 640 | { | 
|---|
| 641 | if (docbook) | 
|---|
| 642 | xml_insert_element_with_attribute (TEXINFO, START, "lang=\"%s\"", language_table[language_code].abbrev); | 
|---|
| 643 | else | 
|---|
| 644 | xml_insert_element_with_attribute (TEXINFO, START, "xml:lang=\"%s\"", language_table[language_code].abbrev); | 
|---|
| 645 | } | 
|---|
| 646 | if (!docbook) | 
|---|
| 647 | { | 
|---|
| 648 | xml_insert_element (SETFILENAME, START); | 
|---|
| 649 | insert_string (output_filename); | 
|---|
| 650 | xml_insert_element (SETFILENAME, END); | 
|---|
| 651 | } | 
|---|
| 652 | } | 
|---|
| 653 |  | 
|---|
| 654 | /* | 
|---|
| 655 | */ | 
|---|
| 656 | static int element_stack[256]; | 
|---|
| 657 | static int element_stack_index = 0; | 
|---|
| 658 |  | 
|---|
| 659 | static int | 
|---|
| 660 | xml_current_element (void) | 
|---|
| 661 | { | 
|---|
| 662 | return element_stack[element_stack_index-1]; | 
|---|
| 663 | } | 
|---|
| 664 |  | 
|---|
| 665 | static void | 
|---|
| 666 | xml_push_current_element (int elt) | 
|---|
| 667 | { | 
|---|
| 668 | element_stack[element_stack_index++] = elt; | 
|---|
| 669 | if (element_stack_index > 200) | 
|---|
| 670 | printf ("*** stack overflow (%d - %s) ***\n", | 
|---|
| 671 | element_stack_index, | 
|---|
| 672 | xml_element_list[elt].name); | 
|---|
| 673 | } | 
|---|
| 674 |  | 
|---|
| 675 | static void | 
|---|
| 676 | xml_pop_current_element (void) | 
|---|
| 677 | { | 
|---|
| 678 | element_stack_index--; | 
|---|
| 679 | if (element_stack_index < 0) | 
|---|
| 680 | printf ("*** stack underflow (%d - %d) ***\n", | 
|---|
| 681 | element_stack_index, | 
|---|
| 682 | xml_current_element()); | 
|---|
| 683 | } | 
|---|
| 684 |  | 
|---|
| 685 | int | 
|---|
| 686 | xml_current_stack_index (void) | 
|---|
| 687 | { | 
|---|
| 688 | return element_stack_index; | 
|---|
| 689 | } | 
|---|
| 690 |  | 
|---|
| 691 | void | 
|---|
| 692 | xml_end_current_element (void) | 
|---|
| 693 | { | 
|---|
| 694 | xml_insert_element (xml_current_element (), END); | 
|---|
| 695 | } | 
|---|
| 696 |  | 
|---|
| 697 | static void | 
|---|
| 698 | xml_indent (void) | 
|---|
| 699 | { | 
|---|
| 700 | if (xml_indentation_increment > 0) | 
|---|
| 701 | { | 
|---|
| 702 | int i; | 
|---|
| 703 | if (output_paragraph[output_paragraph_offset-1] != '\n') | 
|---|
| 704 | insert ('\n'); | 
|---|
| 705 | for (i = 0; i < element_stack_index * xml_indentation_increment; i++) | 
|---|
| 706 | insert (' '); | 
|---|
| 707 | } | 
|---|
| 708 | } | 
|---|
| 709 |  | 
|---|
| 710 | void | 
|---|
| 711 | xml_start_para (void) | 
|---|
| 712 | { | 
|---|
| 713 | if (xml_in_para || xml_in_footnote | 
|---|
| 714 | || !xml_element_list[xml_current_element()].contains_para) | 
|---|
| 715 | return; | 
|---|
| 716 |  | 
|---|
| 717 | while (output_paragraph[output_paragraph_offset-1] == '\n') | 
|---|
| 718 | output_paragraph_offset--; | 
|---|
| 719 | xml_indent (); | 
|---|
| 720 |  | 
|---|
| 721 | insert_string ("<para"); | 
|---|
| 722 | if (xml_no_indent) | 
|---|
| 723 | insert_string (" role=\"continues\""); | 
|---|
| 724 | insert_string (">"); | 
|---|
| 725 | xml_no_indent = 0; | 
|---|
| 726 | xml_in_para = 1; | 
|---|
| 727 | } | 
|---|
| 728 |  | 
|---|
| 729 | void | 
|---|
| 730 | xml_end_para (void) | 
|---|
| 731 | { | 
|---|
| 732 | if (!xml_in_para || xml_in_footnote) | 
|---|
| 733 | return; | 
|---|
| 734 |  | 
|---|
| 735 | while (cr_or_whitespace(output_paragraph[output_paragraph_offset-1])) | 
|---|
| 736 | output_paragraph_offset--; | 
|---|
| 737 |  | 
|---|
| 738 | insert_string ("</para>"); | 
|---|
| 739 | if (xml_indentation_increment > 0) | 
|---|
| 740 | insert ('\n'); | 
|---|
| 741 | xml_in_para = 0; | 
|---|
| 742 | } | 
|---|
| 743 |  | 
|---|
| 744 | void | 
|---|
| 745 | xml_end_document (void) | 
|---|
| 746 | { | 
|---|
| 747 | if (xml_node_open) | 
|---|
| 748 | { | 
|---|
| 749 | if (xml_node_level != -1) | 
|---|
| 750 | { | 
|---|
| 751 | xml_close_sections (xml_node_level); | 
|---|
| 752 | xml_node_level = -1; | 
|---|
| 753 | } | 
|---|
| 754 | xml_insert_element (NODE, END); | 
|---|
| 755 | } | 
|---|
| 756 | else | 
|---|
| 757 | xml_close_sections (xml_node_level); | 
|---|
| 758 |  | 
|---|
| 759 | xml_insert_element (TEXINFO, END); | 
|---|
| 760 | if (xml_indentation_increment == 0) | 
|---|
| 761 | insert ('\n'); | 
|---|
| 762 | insert_string ("<!-- Keep this comment at the end of the file\n\ | 
|---|
| 763 | Local variables:\n\ | 
|---|
| 764 | mode: sgml\n\ | 
|---|
| 765 | sgml-indent-step:1\n\ | 
|---|
| 766 | sgml-indent-data:nil\n\ | 
|---|
| 767 | End:\n\ | 
|---|
| 768 | -->\n"); | 
|---|
| 769 | if (element_stack_index != 0) | 
|---|
| 770 | error ("Element stack index : %d\n", element_stack_index); | 
|---|
| 771 | } | 
|---|
| 772 |  | 
|---|
| 773 | /* MUST be 0 or 1, not true or false values */ | 
|---|
| 774 | static int start_element_inserted = 1; | 
|---|
| 775 |  | 
|---|
| 776 | /* NOTE: We use `elt' rather than `element' in the argument list of | 
|---|
| 777 | the next function, since otherwise the Solaris SUNWspro compiler | 
|---|
| 778 | barfs because `element' is a typedef declared near the beginning of | 
|---|
| 779 | this file.  */ | 
|---|
| 780 | void | 
|---|
| 781 | #if defined (VA_FPRINTF) && __STDC__ | 
|---|
| 782 | xml_insert_element_with_attribute (int elt, int arg, char *format, ...) | 
|---|
| 783 | #else | 
|---|
| 784 | xml_insert_element_with_attribute (elt, arg, format, va_alist) | 
|---|
| 785 | int elt; | 
|---|
| 786 | int arg; | 
|---|
| 787 | char *format; | 
|---|
| 788 | va_dcl | 
|---|
| 789 | #endif | 
|---|
| 790 | { | 
|---|
| 791 | /* Look at the replace_elements table to see if we have to change the element */ | 
|---|
| 792 | if (xml_sort_index) | 
|---|
| 793 | return; | 
|---|
| 794 | if (docbook) | 
|---|
| 795 | { | 
|---|
| 796 | replace_element *element_list = replace_elements; | 
|---|
| 797 | while (element_list->element_to_replace >= 0) | 
|---|
| 798 | { | 
|---|
| 799 | if ( ( (arg == START) && | 
|---|
| 800 | (element_list->element_containing == xml_current_element ()) && | 
|---|
| 801 | (element_list->element_to_replace == elt) ) || | 
|---|
| 802 | ( (arg == END) && | 
|---|
| 803 | (element_list->element_containing == element_stack[element_stack_index-1-start_element_inserted]) && | 
|---|
| 804 | (element_list->element_to_replace == elt) ) ) | 
|---|
| 805 | { | 
|---|
| 806 | elt = element_list->element_replacing; | 
|---|
| 807 | break; | 
|---|
| 808 | } | 
|---|
| 809 | element_list ++; | 
|---|
| 810 | } | 
|---|
| 811 |  | 
|---|
| 812 | /* Forget the element */ | 
|---|
| 813 | if (elt < 0) | 
|---|
| 814 | { | 
|---|
| 815 | if (arg == START) | 
|---|
| 816 | start_element_inserted = 0; | 
|---|
| 817 | else | 
|---|
| 818 | /* Replace the default value, for the next time */ | 
|---|
| 819 | start_element_inserted = 1; | 
|---|
| 820 | return; | 
|---|
| 821 | } | 
|---|
| 822 | } | 
|---|
| 823 |  | 
|---|
| 824 | if (!book_started) | 
|---|
| 825 | return; | 
|---|
| 826 |  | 
|---|
| 827 | if (!xml_dont_touch_items_defs && arg == START) | 
|---|
| 828 | { | 
|---|
| 829 | if (xml_after_table_term && elt != TABLETERM && xml_table_level | 
|---|
| 830 | && !xml_in_item[xml_table_level]) | 
|---|
| 831 | { | 
|---|
| 832 | xml_after_table_term = 0; | 
|---|
| 833 | xml_insert_element (ITEM, START); | 
|---|
| 834 | xml_in_item[xml_table_level] = 1; | 
|---|
| 835 | } | 
|---|
| 836 | else if (xml_after_def_term && elt != DEFINITIONTERM) | 
|---|
| 837 | { | 
|---|
| 838 | xml_after_def_term = 0; | 
|---|
| 839 | xml_insert_element (DEFINITIONITEM, START); | 
|---|
| 840 | xml_in_def_item[xml_definition_level] = 1; | 
|---|
| 841 | } | 
|---|
| 842 | } | 
|---|
| 843 |  | 
|---|
| 844 | if (docbook && !only_macro_expansion && (in_menu || in_detailmenu)) | 
|---|
| 845 | return; | 
|---|
| 846 |  | 
|---|
| 847 | if (executing_string && arg == END) | 
|---|
| 848 | switch (elt) | 
|---|
| 849 | { | 
|---|
| 850 | case TABLEITEM: | 
|---|
| 851 | xml_in_tableitem[xml_table_level] = 0; | 
|---|
| 852 | break; | 
|---|
| 853 | case ITEM: | 
|---|
| 854 | xml_in_item[xml_table_level] = 0; | 
|---|
| 855 | break; | 
|---|
| 856 | case DEFINITIONTERM: | 
|---|
| 857 | xml_in_def_item[xml_definition_level] = 0; | 
|---|
| 858 | break; | 
|---|
| 859 | } | 
|---|
| 860 |  | 
|---|
| 861 | /* We are special-casing FIGURE element for docbook.  It does appear in | 
|---|
| 862 | the tag stack, but not in the output.  This is to make element replacement | 
|---|
| 863 | work beautifully.  */ | 
|---|
| 864 | if (docbook && elt == FLOAT) | 
|---|
| 865 | { | 
|---|
| 866 | if (arg == START) | 
|---|
| 867 | xml_push_current_element (elt); | 
|---|
| 868 | else | 
|---|
| 869 | xml_pop_current_element (); | 
|---|
| 870 | return; | 
|---|
| 871 | } | 
|---|
| 872 |  | 
|---|
| 873 | if (!xml_element_list[elt].name || !strlen (xml_element_list[elt].name)) | 
|---|
| 874 | { | 
|---|
| 875 | /*printf ("Warning: Inserting empty element %d\n", elt);*/ | 
|---|
| 876 | return; | 
|---|
| 877 | } | 
|---|
| 878 |  | 
|---|
| 879 | if (arg == START && !xml_in_para && !xml_no_para | 
|---|
| 880 | && xml_element_list[elt].contained_in_para) | 
|---|
| 881 | xml_start_para (); | 
|---|
| 882 |  | 
|---|
| 883 | if (arg == START && xml_in_para && !xml_element_list[elt].contained_in_para) | 
|---|
| 884 | xml_end_para (); | 
|---|
| 885 |  | 
|---|
| 886 | if (arg == END && xml_in_para && !xml_element_list[elt].contained_in_para) | 
|---|
| 887 | xml_end_para (); | 
|---|
| 888 |  | 
|---|
| 889 | if (docbook && xml_table_level && !in_table_title | 
|---|
| 890 | && !xml_in_tableitem[xml_table_level] && !xml_in_item[xml_table_level] | 
|---|
| 891 | && arg == START && elt != TABLEITEM && elt != TABLETERM | 
|---|
| 892 | && !in_indexterm && xml_current_element() == TABLE) | 
|---|
| 893 | { | 
|---|
| 894 | in_table_title = 1; | 
|---|
| 895 | xml_insert_element (TITLE, START); | 
|---|
| 896 | } | 
|---|
| 897 |  | 
|---|
| 898 | if (arg == START && !xml_in_para && !xml_keep_space | 
|---|
| 899 | && !xml_element_list[elt].contained_in_para) | 
|---|
| 900 | xml_indent (); | 
|---|
| 901 |  | 
|---|
| 902 | if (arg == START) | 
|---|
| 903 | xml_push_current_element (elt); | 
|---|
| 904 | else | 
|---|
| 905 | xml_pop_current_element (); | 
|---|
| 906 |  | 
|---|
| 907 | /* Eat one newline before </example> and the like.  */ | 
|---|
| 908 | if (!docbook && arg == END | 
|---|
| 909 | && (xml_element_list[elt].keep_space || elt == GROUP) | 
|---|
| 910 | && output_paragraph[output_paragraph_offset-1] == '\n') | 
|---|
| 911 | output_paragraph_offset--; | 
|---|
| 912 |  | 
|---|
| 913 | /* And eat whitespace before </entry> in @multitables.  */ | 
|---|
| 914 | if (arg == END && elt == ENTRY) | 
|---|
| 915 | while (cr_or_whitespace(output_paragraph[output_paragraph_offset-1])) | 
|---|
| 916 | output_paragraph_offset--; | 
|---|
| 917 |  | 
|---|
| 918 | /* Indent elements that can contain <para>.  */ | 
|---|
| 919 | if (arg == END && !xml_in_para && !xml_keep_space | 
|---|
| 920 | && xml_element_list[elt].contains_para) | 
|---|
| 921 | xml_indent (); | 
|---|
| 922 |  | 
|---|
| 923 | /* Here are the elements we want indented.  These do not contain <para> | 
|---|
| 924 | directly.  */ | 
|---|
| 925 | if (arg == END && (elt == MENUENTRY || elt == ITEMIZE || elt == ENUMERATE | 
|---|
| 926 | || elt == TABLEITEM || elt == TABLE | 
|---|
| 927 | || elt == MULTITABLE || elt == TGROUP || elt == THEAD || elt == TBODY | 
|---|
| 928 | || elt == ROW || elt == INFORMALFIGURE | 
|---|
| 929 | || (!docbook && (elt == DEFINITION || elt == DEFINITIONTERM)))) | 
|---|
| 930 | xml_indent (); | 
|---|
| 931 |  | 
|---|
| 932 | insert ('<'); | 
|---|
| 933 | if (arg == END) | 
|---|
| 934 | insert ('/'); | 
|---|
| 935 | insert_string (xml_element_list[elt].name); | 
|---|
| 936 |  | 
|---|
| 937 | /*  printf ("%s ", xml_element_list[elt].name);*/ | 
|---|
| 938 |  | 
|---|
| 939 | if (format) | 
|---|
| 940 | { | 
|---|
| 941 | char temp_string[2000]; /* xx no fixed limits */ | 
|---|
| 942 | #ifdef VA_SPRINTF | 
|---|
| 943 | va_list ap; | 
|---|
| 944 | #endif | 
|---|
| 945 |  | 
|---|
| 946 | VA_START (ap, format); | 
|---|
| 947 | #ifdef VA_SPRINTF | 
|---|
| 948 | VA_SPRINTF (temp_string, format, ap); | 
|---|
| 949 | #else | 
|---|
| 950 | sprintf (temp_string, format, a1, a2, a3, a4, a5, a6, a7, a8); | 
|---|
| 951 | #endif | 
|---|
| 952 | insert (' '); | 
|---|
| 953 | insert_string (temp_string); | 
|---|
| 954 | va_end (ap); | 
|---|
| 955 | } | 
|---|
| 956 |  | 
|---|
| 957 | if (arg == START && xml_node_id && elt != NODENAME) | 
|---|
| 958 | { | 
|---|
| 959 | insert_string (" id=\""); | 
|---|
| 960 | insert_string (xml_node_id); | 
|---|
| 961 | insert ('"'); | 
|---|
| 962 | free (xml_node_id); | 
|---|
| 963 | xml_node_id = NULL; | 
|---|
| 964 | } | 
|---|
| 965 |  | 
|---|
| 966 | if (xml_element_list[elt].keep_space) | 
|---|
| 967 | { | 
|---|
| 968 | if (arg == START) | 
|---|
| 969 | { | 
|---|
| 970 | if (!docbook) | 
|---|
| 971 | insert_string (" xml:space=\"preserve\""); | 
|---|
| 972 | xml_keep_space++; | 
|---|
| 973 | } | 
|---|
| 974 | else | 
|---|
| 975 | xml_keep_space--; | 
|---|
| 976 | } | 
|---|
| 977 |  | 
|---|
| 978 | insert ('>'); | 
|---|
| 979 |  | 
|---|
| 980 | if (!xml_in_para && !xml_element_list[elt].contained_in_para | 
|---|
| 981 | && xml_element_list[elt].contains_para && xml_indentation_increment > 0) | 
|---|
| 982 | insert ('\n'); | 
|---|
| 983 |  | 
|---|
| 984 | xml_just_after_element = 1; | 
|---|
| 985 | } | 
|---|
| 986 |  | 
|---|
| 987 | /* See the NOTE before xml_insert_element_with_attribute, for why we | 
|---|
| 988 | use `elt' rather than `element' here.  */ | 
|---|
| 989 | void | 
|---|
| 990 | xml_insert_element (int elt, int arg) | 
|---|
| 991 | { | 
|---|
| 992 | xml_insert_element_with_attribute (elt, arg, NULL); | 
|---|
| 993 | } | 
|---|
| 994 |  | 
|---|
| 995 | void | 
|---|
| 996 | xml_insert_entity (char *entity_name) | 
|---|
| 997 | { | 
|---|
| 998 | int saved_escape_html = escape_html; | 
|---|
| 999 |  | 
|---|
| 1000 | if (!book_started) | 
|---|
| 1001 | return; | 
|---|
| 1002 | if (docbook && !only_macro_expansion && (in_menu || in_detailmenu)) | 
|---|
| 1003 | return; | 
|---|
| 1004 |  | 
|---|
| 1005 | if (!xml_in_para && !xml_no_para && !only_macro_expansion | 
|---|
| 1006 | && xml_element_list[xml_current_element ()].contains_para | 
|---|
| 1007 | && !in_fixed_width_font) | 
|---|
| 1008 | xml_start_para (); | 
|---|
| 1009 |  | 
|---|
| 1010 | escape_html = 0; | 
|---|
| 1011 | add_char ('&'); | 
|---|
| 1012 | escape_html = saved_escape_html; | 
|---|
| 1013 | insert_string (entity_name); | 
|---|
| 1014 | add_char (';'); | 
|---|
| 1015 | } | 
|---|
| 1016 |  | 
|---|
| 1017 | typedef struct _xml_section xml_section; | 
|---|
| 1018 | struct _xml_section { | 
|---|
| 1019 | int level; | 
|---|
| 1020 | char *name; | 
|---|
| 1021 | xml_section *prev; | 
|---|
| 1022 | }; | 
|---|
| 1023 |  | 
|---|
| 1024 | xml_section *last_section = NULL; | 
|---|
| 1025 |  | 
|---|
| 1026 | void | 
|---|
| 1027 | xml_begin_node (void) | 
|---|
| 1028 | { | 
|---|
| 1029 | first_section_opened = 1; | 
|---|
| 1030 | if (xml_in_abstract) | 
|---|
| 1031 | { | 
|---|
| 1032 | xml_insert_element (ABSTRACT, END); | 
|---|
| 1033 | xml_in_abstract = 0; | 
|---|
| 1034 | } | 
|---|
| 1035 | if (xml_in_bookinfo) | 
|---|
| 1036 | { | 
|---|
| 1037 | xml_insert_element (BOOKINFO, END); | 
|---|
| 1038 | xml_in_bookinfo = 0; | 
|---|
| 1039 | } | 
|---|
| 1040 | if (xml_node_open && ! docbook) | 
|---|
| 1041 | { | 
|---|
| 1042 | if (xml_node_level != -1) | 
|---|
| 1043 | { | 
|---|
| 1044 | xml_close_sections (xml_node_level); | 
|---|
| 1045 | xml_node_level = -1; | 
|---|
| 1046 | } | 
|---|
| 1047 | xml_insert_element (NODE, END); | 
|---|
| 1048 | } | 
|---|
| 1049 | xml_insert_element (NODE, START); | 
|---|
| 1050 | xml_node_open = 1; | 
|---|
| 1051 | } | 
|---|
| 1052 |  | 
|---|
| 1053 | void | 
|---|
| 1054 | xml_close_sections (int level) | 
|---|
| 1055 | { | 
|---|
| 1056 | if (!first_section_opened) | 
|---|
| 1057 | { | 
|---|
| 1058 | if (xml_in_abstract) | 
|---|
| 1059 | { | 
|---|
| 1060 | xml_insert_element (ABSTRACT, END); | 
|---|
| 1061 | xml_in_abstract = 0; | 
|---|
| 1062 | } | 
|---|
| 1063 | if (xml_in_bookinfo) | 
|---|
| 1064 | { | 
|---|
| 1065 | xml_insert_element (BOOKINFO, END); | 
|---|
| 1066 | xml_in_bookinfo = 0; | 
|---|
| 1067 | } | 
|---|
| 1068 | first_section_opened = 1; | 
|---|
| 1069 | } | 
|---|
| 1070 |  | 
|---|
| 1071 | while (last_section && last_section->level >= level) | 
|---|
| 1072 | { | 
|---|
| 1073 | xml_section *temp = last_section; | 
|---|
| 1074 | xml_insert_element (xml_element(last_section->name), END); | 
|---|
| 1075 | temp = last_section; | 
|---|
| 1076 | last_section = last_section->prev; | 
|---|
| 1077 | free (temp->name); | 
|---|
| 1078 | free (temp); | 
|---|
| 1079 | } | 
|---|
| 1080 | } | 
|---|
| 1081 |  | 
|---|
| 1082 | void | 
|---|
| 1083 | xml_open_section (int level, char *name) | 
|---|
| 1084 | { | 
|---|
| 1085 | xml_section *sect = (xml_section *) xmalloc (sizeof (xml_section)); | 
|---|
| 1086 |  | 
|---|
| 1087 | sect->level = level; | 
|---|
| 1088 | sect->name = xmalloc (1 + strlen (name)); | 
|---|
| 1089 | strcpy (sect->name, name); | 
|---|
| 1090 | sect->prev = last_section; | 
|---|
| 1091 | last_section = sect; | 
|---|
| 1092 |  | 
|---|
| 1093 | if (xml_node_open && xml_node_level == -1) | 
|---|
| 1094 | xml_node_level = level; | 
|---|
| 1095 | } | 
|---|
| 1096 |  | 
|---|
| 1097 | void | 
|---|
| 1098 | xml_start_menu_entry (char *tem) | 
|---|
| 1099 | { | 
|---|
| 1100 | char *string; | 
|---|
| 1101 | discard_until ("* "); | 
|---|
| 1102 |  | 
|---|
| 1103 | /* The line number was already incremented in reader_loop when we | 
|---|
| 1104 | saw the newline, and discard_until has now incremented again.  */ | 
|---|
| 1105 | line_number--; | 
|---|
| 1106 |  | 
|---|
| 1107 | if (xml_in_menu_entry) | 
|---|
| 1108 | { | 
|---|
| 1109 | if (xml_in_menu_entry_comment) | 
|---|
| 1110 | { | 
|---|
| 1111 | xml_insert_element (MENUCOMMENT, END); | 
|---|
| 1112 | xml_in_menu_entry_comment=0; | 
|---|
| 1113 | } | 
|---|
| 1114 | xml_insert_element (MENUENTRY, END); | 
|---|
| 1115 | xml_in_menu_entry=0; | 
|---|
| 1116 | } | 
|---|
| 1117 | xml_insert_element (MENUENTRY, START); | 
|---|
| 1118 | xml_in_menu_entry=1; | 
|---|
| 1119 |  | 
|---|
| 1120 | xml_insert_element (MENUNODE, START); | 
|---|
| 1121 | string = expansion (tem, 0); | 
|---|
| 1122 | add_word (string); | 
|---|
| 1123 | xml_insert_element (MENUNODE, END); | 
|---|
| 1124 | free (string); | 
|---|
| 1125 |  | 
|---|
| 1126 | /* The menu item may use macros, so expand them now.  */ | 
|---|
| 1127 | xml_insert_element (MENUTITLE, START); | 
|---|
| 1128 | only_macro_expansion++; | 
|---|
| 1129 | get_until_in_line (1, ":", &string); | 
|---|
| 1130 | only_macro_expansion--; | 
|---|
| 1131 | execute_string ("%s", string); /* get escaping done */ | 
|---|
| 1132 | xml_insert_element (MENUTITLE, END); | 
|---|
| 1133 | free (string); | 
|---|
| 1134 |  | 
|---|
| 1135 | if (looking_at ("::")) | 
|---|
| 1136 | discard_until (":"); | 
|---|
| 1137 | else | 
|---|
| 1138 | { /* discard the node name */ | 
|---|
| 1139 | get_until_in_line (0, ".", &string); | 
|---|
| 1140 | free (string); | 
|---|
| 1141 | } | 
|---|
| 1142 | input_text_offset++;  /* discard the second colon or the period */ | 
|---|
| 1143 | skip_whitespace_and_newlines(); | 
|---|
| 1144 | xml_insert_element (MENUCOMMENT, START); | 
|---|
| 1145 | xml_in_menu_entry_comment ++; | 
|---|
| 1146 | } | 
|---|
| 1147 |  | 
|---|
| 1148 | void | 
|---|
| 1149 | xml_end_menu (void) | 
|---|
| 1150 | { | 
|---|
| 1151 | if (xml_in_menu_entry) | 
|---|
| 1152 | { | 
|---|
| 1153 | if (xml_in_menu_entry_comment) | 
|---|
| 1154 | { | 
|---|
| 1155 | xml_insert_element (MENUCOMMENT, END); | 
|---|
| 1156 | xml_in_menu_entry_comment --; | 
|---|
| 1157 | } | 
|---|
| 1158 | xml_insert_element (MENUENTRY, END); | 
|---|
| 1159 | xml_in_menu_entry--; | 
|---|
| 1160 | } | 
|---|
| 1161 | xml_insert_element (MENU, END); | 
|---|
| 1162 | } | 
|---|
| 1163 |  | 
|---|
| 1164 | static int xml_last_character; | 
|---|
| 1165 |  | 
|---|
| 1166 | void | 
|---|
| 1167 | xml_add_char (int character) | 
|---|
| 1168 | { | 
|---|
| 1169 | if (!book_started) | 
|---|
| 1170 | return; | 
|---|
| 1171 | if (docbook && !only_macro_expansion && (in_menu || in_detailmenu)) | 
|---|
| 1172 | return; | 
|---|
| 1173 |  | 
|---|
| 1174 | if (docbook && xml_table_level && !in_table_title | 
|---|
| 1175 | && !xml_in_item[xml_table_level] && !xml_in_tableitem[xml_table_level] | 
|---|
| 1176 | && !cr_or_whitespace (character) && !in_indexterm) | 
|---|
| 1177 | { | 
|---|
| 1178 | in_table_title = 1; | 
|---|
| 1179 | xml_insert_element (TITLE, START); | 
|---|
| 1180 | } | 
|---|
| 1181 |  | 
|---|
| 1182 | if (!first_section_opened && !xml_in_abstract && !xml_in_book_title | 
|---|
| 1183 | && !xml_no_para && character != '\r' && character != '\n' | 
|---|
| 1184 | && character != ' ' && !is_in_insertion_of_type (copying)) | 
|---|
| 1185 | { | 
|---|
| 1186 | if (!xml_in_bookinfo) | 
|---|
| 1187 | { | 
|---|
| 1188 | xml_insert_element (BOOKINFO, START); | 
|---|
| 1189 | xml_in_bookinfo = 1; | 
|---|
| 1190 | } | 
|---|
| 1191 | xml_insert_element (ABSTRACT, START); | 
|---|
| 1192 | xml_in_abstract = 1; | 
|---|
| 1193 | } | 
|---|
| 1194 |  | 
|---|
| 1195 | if (!xml_sort_index && !xml_in_xref_token && !xml_dont_touch_items_defs) | 
|---|
| 1196 | { | 
|---|
| 1197 | if (xml_after_table_term && xml_table_level | 
|---|
| 1198 | && !xml_in_item[xml_table_level]) | 
|---|
| 1199 | { | 
|---|
| 1200 | xml_after_table_term = 0; | 
|---|
| 1201 | xml_insert_element (ITEM, START); | 
|---|
| 1202 | xml_in_item[xml_table_level] = 1; | 
|---|
| 1203 | } | 
|---|
| 1204 | else if (xml_after_def_term) | 
|---|
| 1205 | { | 
|---|
| 1206 | xml_after_def_term = 0; | 
|---|
| 1207 | xml_insert_element (DEFINITIONITEM, START); | 
|---|
| 1208 | xml_in_def_item[xml_definition_level] = 1; | 
|---|
| 1209 | } | 
|---|
| 1210 | } | 
|---|
| 1211 |  | 
|---|
| 1212 | if (xml_just_after_element && !xml_in_para && !inhibit_paragraph_indentation) | 
|---|
| 1213 | { | 
|---|
| 1214 | if (character == '\r' || character == '\n' || character == '\t' || character == ' ') | 
|---|
| 1215 | return; | 
|---|
| 1216 | xml_just_after_element = 0; | 
|---|
| 1217 | } | 
|---|
| 1218 |  | 
|---|
| 1219 | if (xml_element_list[xml_current_element()].contains_para | 
|---|
| 1220 | && !xml_in_para && !only_macro_expansion && !xml_no_para | 
|---|
| 1221 | && !cr_or_whitespace (character) && !in_fixed_width_font) | 
|---|
| 1222 | xml_start_para (); | 
|---|
| 1223 |  | 
|---|
| 1224 | if (xml_in_para && character == '\n' && xml_last_character == '\n' | 
|---|
| 1225 | && !only_macro_expansion && !xml_no_para | 
|---|
| 1226 | && xml_element_list[xml_current_element()].contains_para ) | 
|---|
| 1227 | { | 
|---|
| 1228 | xml_end_para (); | 
|---|
| 1229 | xml_just_after_element = 1; | 
|---|
| 1230 | return; | 
|---|
| 1231 | } | 
|---|
| 1232 |  | 
|---|
| 1233 | if (xml_in_menu_entry_comment && character == '\n' && xml_last_character == '\n') | 
|---|
| 1234 | { | 
|---|
| 1235 | xml_insert_element (MENUCOMMENT, END); | 
|---|
| 1236 | xml_in_menu_entry_comment = 0; | 
|---|
| 1237 | xml_insert_element (MENUENTRY, END); | 
|---|
| 1238 | xml_in_menu_entry = 0; | 
|---|
| 1239 | } | 
|---|
| 1240 |  | 
|---|
| 1241 | if (xml_in_menu_entry_comment && whitespace(character) | 
|---|
| 1242 | && cr_or_whitespace(xml_last_character)) | 
|---|
| 1243 | return; | 
|---|
| 1244 |  | 
|---|
| 1245 | if (character == '\n' && !xml_in_para && !inhibit_paragraph_indentation) | 
|---|
| 1246 | return; | 
|---|
| 1247 |  | 
|---|
| 1248 | xml_last_character = character; | 
|---|
| 1249 |  | 
|---|
| 1250 | if (character == '&' && escape_html) | 
|---|
| 1251 | insert_string ("&"); | 
|---|
| 1252 | else if (character == '<' && escape_html) | 
|---|
| 1253 | insert_string ("<"); | 
|---|
| 1254 | else if (character == '\n' && !xml_keep_space) | 
|---|
| 1255 | { | 
|---|
| 1256 | if (!xml_in_para && xml_just_after_element && !multitable_active) | 
|---|
| 1257 | return; | 
|---|
| 1258 | else | 
|---|
| 1259 | insert (docbook ? '\n' : ' '); | 
|---|
| 1260 | } | 
|---|
| 1261 | else | 
|---|
| 1262 | insert (character); | 
|---|
| 1263 |  | 
|---|
| 1264 | return; | 
|---|
| 1265 | } | 
|---|
| 1266 |  | 
|---|
| 1267 | void | 
|---|
| 1268 | xml_insert_footnote (char *note) | 
|---|
| 1269 | { | 
|---|
| 1270 | if (!xml_in_para) | 
|---|
| 1271 | xml_start_para (); | 
|---|
| 1272 |  | 
|---|
| 1273 | xml_in_footnote = 1; | 
|---|
| 1274 | xml_insert_element (FOOTNOTE, START); | 
|---|
| 1275 | insert_string ("<para>"); | 
|---|
| 1276 | execute_string ("%s", note); | 
|---|
| 1277 | insert_string ("</para>"); | 
|---|
| 1278 | xml_insert_element (FOOTNOTE, END); | 
|---|
| 1279 | xml_in_footnote = 0; | 
|---|
| 1280 | } | 
|---|
| 1281 |  | 
|---|
| 1282 | /* We need to keep the quotation stack ourself, because insertion_stack | 
|---|
| 1283 | loses item_function when we are closing the block, so we don't know | 
|---|
| 1284 | what to close then.  */ | 
|---|
| 1285 | typedef struct quotation_elt | 
|---|
| 1286 | { | 
|---|
| 1287 | struct quotation_elt *next; | 
|---|
| 1288 | char *type; | 
|---|
| 1289 | } QUOTATION_ELT; | 
|---|
| 1290 |  | 
|---|
| 1291 | static QUOTATION_ELT *quotation_stack = NULL; | 
|---|
| 1292 |  | 
|---|
| 1293 | void | 
|---|
| 1294 | xml_insert_quotation (char *type, int arg) | 
|---|
| 1295 | { | 
|---|
| 1296 | int quotation_started = 0; | 
|---|
| 1297 |  | 
|---|
| 1298 | if (arg == START) | 
|---|
| 1299 | { | 
|---|
| 1300 | QUOTATION_ELT *new = xmalloc (sizeof (QUOTATION_ELT)); | 
|---|
| 1301 | new->type = xstrdup (type); | 
|---|
| 1302 | new->next = quotation_stack; | 
|---|
| 1303 | quotation_stack = new; | 
|---|
| 1304 | } | 
|---|
| 1305 | else | 
|---|
| 1306 | type = quotation_stack->type; | 
|---|
| 1307 |  | 
|---|
| 1308 | /* Make use of special quotation styles of Docbook if we can.  */ | 
|---|
| 1309 | if (docbook && strlen(type)) | 
|---|
| 1310 | { | 
|---|
| 1311 | /* Let's assume it started.  */ | 
|---|
| 1312 | quotation_started = 1; | 
|---|
| 1313 |  | 
|---|
| 1314 | if (strcasecmp (type, "tip") == 0) | 
|---|
| 1315 | xml_insert_element (TIP, arg); | 
|---|
| 1316 | else if (strcasecmp (type, "note") == 0) | 
|---|
| 1317 | xml_insert_element (NOTE, arg); | 
|---|
| 1318 | else if (strcasecmp (type, "important") == 0) | 
|---|
| 1319 | xml_insert_element (IMPORTANT, arg); | 
|---|
| 1320 | else if (strcasecmp (type, "warning") == 0) | 
|---|
| 1321 | xml_insert_element (WARNING, arg); | 
|---|
| 1322 | else if (strcasecmp (type, "caution") == 0) | 
|---|
| 1323 | xml_insert_element (CAUTION, arg); | 
|---|
| 1324 | else | 
|---|
| 1325 | /* Didn't find a known quotation type :\ */ | 
|---|
| 1326 | quotation_started = 0; | 
|---|
| 1327 | } | 
|---|
| 1328 |  | 
|---|
| 1329 | if (!quotation_started) | 
|---|
| 1330 | { | 
|---|
| 1331 | xml_insert_element (QUOTATION, arg); | 
|---|
| 1332 | if (strlen(type) && arg == START) | 
|---|
| 1333 | execute_string ("@b{%s:} ", type); | 
|---|
| 1334 | } | 
|---|
| 1335 |  | 
|---|
| 1336 | if (arg == END) | 
|---|
| 1337 | { | 
|---|
| 1338 | QUOTATION_ELT *temp = quotation_stack; | 
|---|
| 1339 | if (temp == NULL) | 
|---|
| 1340 | return; | 
|---|
| 1341 | quotation_stack = quotation_stack->next; | 
|---|
| 1342 | free(temp->type); | 
|---|
| 1343 | free(temp); | 
|---|
| 1344 | } | 
|---|
| 1345 | } | 
|---|
| 1346 |  | 
|---|
| 1347 | /* Starting generic docbook floats.  Just starts elt with correct label | 
|---|
| 1348 | and id attributes, and inserts title.  */ | 
|---|
| 1349 | void | 
|---|
| 1350 | xml_begin_docbook_float (int elt) | 
|---|
| 1351 | { | 
|---|
| 1352 | if (current_float_used_title ())      /* in a nested float */ | 
|---|
| 1353 | { | 
|---|
| 1354 | xml_insert_element (elt, START);  /* just insert the tag */ | 
|---|
| 1355 | return; | 
|---|
| 1356 | } | 
|---|
| 1357 |  | 
|---|
| 1358 |  | 
|---|
| 1359 | /* OK, need the title, tag, etc. */ | 
|---|
| 1360 | if (elt == CARTOUCHE)    /* no labels on <sidebar> */ | 
|---|
| 1361 | { | 
|---|
| 1362 | if (strlen (current_float_id ()) == 0) | 
|---|
| 1363 | xml_insert_element (elt, START); | 
|---|
| 1364 | else | 
|---|
| 1365 | xml_insert_element_with_attribute (elt, START, | 
|---|
| 1366 | "id=\"%s\"", xml_id (current_float_id ())); | 
|---|
| 1367 | } | 
|---|
| 1368 | else if (strlen (current_float_id ()) == 0) | 
|---|
| 1369 | xml_insert_element_with_attribute (elt, START, "label=\"\""); | 
|---|
| 1370 | else | 
|---|
| 1371 | xml_insert_element_with_attribute (elt, START, | 
|---|
| 1372 | "id=\"%s\" label=\"%s\"", xml_id (current_float_id ()), | 
|---|
| 1373 | current_float_number ()); | 
|---|
| 1374 |  | 
|---|
| 1375 | xml_insert_element (TITLE, START); | 
|---|
| 1376 | execute_string ("%s", current_float_title ()); | 
|---|
| 1377 | xml_insert_element (TITLE, END); | 
|---|
| 1378 |  | 
|---|
| 1379 | current_float_set_title_used ();      /* mark this title, tag, etc used */ | 
|---|
| 1380 | } | 
|---|
| 1381 |  | 
|---|
| 1382 | /* | 
|---|
| 1383 | * Lists and Tables | 
|---|
| 1384 | */ | 
|---|
| 1385 | void | 
|---|
| 1386 | xml_begin_table (int type, char *item_function) | 
|---|
| 1387 | { | 
|---|
| 1388 | switch (type) | 
|---|
| 1389 | { | 
|---|
| 1390 | case ftable: | 
|---|
| 1391 | case vtable: | 
|---|
| 1392 | case table: | 
|---|
| 1393 | /*if (docbook)*/ /* 05-08 */ | 
|---|
| 1394 | { | 
|---|
| 1395 | xml_insert_element (TABLE, START); | 
|---|
| 1396 | xml_table_level ++; | 
|---|
| 1397 | xml_in_tableitem[xml_table_level] = 0; | 
|---|
| 1398 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1399 | xml_after_table_term = 0; | 
|---|
| 1400 | } | 
|---|
| 1401 | break; | 
|---|
| 1402 | case itemize: | 
|---|
| 1403 | if (!docbook) | 
|---|
| 1404 | { | 
|---|
| 1405 | xml_insert_element (ITEMIZE, START); | 
|---|
| 1406 | xml_table_level ++; | 
|---|
| 1407 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1408 | xml_insert_element (ITEMFUNCTION, START); | 
|---|
| 1409 | if (*item_function == COMMAND_PREFIX | 
|---|
| 1410 | && item_function[strlen (item_function) - 1] != '}' | 
|---|
| 1411 | && command_needs_braces (item_function + 1)) | 
|---|
| 1412 | execute_string ("%s{}", item_function); | 
|---|
| 1413 | else | 
|---|
| 1414 | execute_string ("%s", item_function); | 
|---|
| 1415 | xml_insert_element (ITEMFUNCTION, END); | 
|---|
| 1416 | } | 
|---|
| 1417 | else | 
|---|
| 1418 | { | 
|---|
| 1419 | xml_insert_element_with_attribute (ITEMIZE, START, | 
|---|
| 1420 | "mark=\"%s\"", | 
|---|
| 1421 | (*item_function == COMMAND_PREFIX) ? | 
|---|
| 1422 | &item_function[1] : item_function); | 
|---|
| 1423 | xml_table_level ++; | 
|---|
| 1424 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1425 | } | 
|---|
| 1426 | break; | 
|---|
| 1427 | } | 
|---|
| 1428 | } | 
|---|
| 1429 |  | 
|---|
| 1430 | void | 
|---|
| 1431 | xml_end_table (int type) | 
|---|
| 1432 | { | 
|---|
| 1433 | switch (type) | 
|---|
| 1434 | { | 
|---|
| 1435 | case ftable: | 
|---|
| 1436 | case vtable: | 
|---|
| 1437 | case table: | 
|---|
| 1438 | if (xml_in_item[xml_table_level]) | 
|---|
| 1439 | { | 
|---|
| 1440 | xml_insert_element (ITEM, END); | 
|---|
| 1441 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1442 | } | 
|---|
| 1443 | if (xml_in_tableitem[xml_table_level]) | 
|---|
| 1444 | { | 
|---|
| 1445 | xml_insert_element (TABLEITEM, END); | 
|---|
| 1446 | xml_in_tableitem[xml_table_level] = 0; | 
|---|
| 1447 | } | 
|---|
| 1448 | xml_insert_element (TABLE, END); | 
|---|
| 1449 | xml_after_table_term = 0; | 
|---|
| 1450 | xml_table_level --; | 
|---|
| 1451 |  | 
|---|
| 1452 | break; | 
|---|
| 1453 | case itemize: | 
|---|
| 1454 | if (xml_in_item[xml_table_level]) | 
|---|
| 1455 | { | 
|---|
| 1456 | xml_insert_element (ITEM, END); | 
|---|
| 1457 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1458 | } | 
|---|
| 1459 | /* gnat-style manual contains an itemized list without items! */ | 
|---|
| 1460 | if (in_table_title) | 
|---|
| 1461 | { | 
|---|
| 1462 | xml_insert_element (TITLE, END); | 
|---|
| 1463 | in_table_title = 0; | 
|---|
| 1464 | } | 
|---|
| 1465 | xml_insert_element (ITEMIZE, END); | 
|---|
| 1466 | xml_table_level --; | 
|---|
| 1467 | break; | 
|---|
| 1468 | } | 
|---|
| 1469 | } | 
|---|
| 1470 |  | 
|---|
| 1471 | void | 
|---|
| 1472 | xml_begin_item (void) | 
|---|
| 1473 | { | 
|---|
| 1474 | if (xml_in_item[xml_table_level]) | 
|---|
| 1475 | xml_insert_element (ITEM, END); | 
|---|
| 1476 |  | 
|---|
| 1477 | xml_insert_element (ITEM, START); | 
|---|
| 1478 | xml_in_item[xml_table_level] = 1; | 
|---|
| 1479 | } | 
|---|
| 1480 |  | 
|---|
| 1481 | void | 
|---|
| 1482 | xml_begin_table_item (void) | 
|---|
| 1483 | { | 
|---|
| 1484 | if (!xml_after_table_term) | 
|---|
| 1485 | { | 
|---|
| 1486 | if (xml_in_item[xml_table_level]) | 
|---|
| 1487 | xml_insert_element (ITEM, END); | 
|---|
| 1488 | if (xml_in_tableitem[xml_table_level]) | 
|---|
| 1489 | xml_insert_element (TABLEITEM, END); | 
|---|
| 1490 |  | 
|---|
| 1491 | if (in_table_title) | 
|---|
| 1492 | { | 
|---|
| 1493 | in_table_title = 0; | 
|---|
| 1494 | xml_insert_element (TITLE, END); | 
|---|
| 1495 | } | 
|---|
| 1496 | xml_insert_element (TABLEITEM, START); | 
|---|
| 1497 | } | 
|---|
| 1498 | xml_insert_element (TABLETERM, START); | 
|---|
| 1499 | xml_in_tableitem[xml_table_level] = 1; | 
|---|
| 1500 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1501 | xml_after_table_term = 0; | 
|---|
| 1502 | } | 
|---|
| 1503 |  | 
|---|
| 1504 | void | 
|---|
| 1505 | xml_continue_table_item (void) | 
|---|
| 1506 | { | 
|---|
| 1507 | xml_insert_element (TABLETERM, END); | 
|---|
| 1508 | xml_after_table_term = 1; | 
|---|
| 1509 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1510 | } | 
|---|
| 1511 |  | 
|---|
| 1512 | void | 
|---|
| 1513 | xml_begin_enumerate (char *enum_arg) | 
|---|
| 1514 | { | 
|---|
| 1515 | if (!docbook) | 
|---|
| 1516 | xml_insert_element_with_attribute (ENUMERATE, START, "first=\"%s\"", enum_arg); | 
|---|
| 1517 | else | 
|---|
| 1518 | { | 
|---|
| 1519 | if (isdigit (*enum_arg)) | 
|---|
| 1520 | { | 
|---|
| 1521 | int enum_val = atoi (enum_arg); | 
|---|
| 1522 |  | 
|---|
| 1523 | /* Have to check the value, not just the first digit.  */ | 
|---|
| 1524 | if (enum_val == 0) | 
|---|
| 1525 | xml_insert_element_with_attribute (ENUMERATE, START, | 
|---|
| 1526 | "numeration=\"arabic\" role=\"0\"", NULL); | 
|---|
| 1527 | else if (enum_val == 1) | 
|---|
| 1528 | xml_insert_element_with_attribute (ENUMERATE, START, | 
|---|
| 1529 | "numeration=\"arabic\"", NULL); | 
|---|
| 1530 | else | 
|---|
| 1531 | xml_insert_element_with_attribute (ENUMERATE, START, | 
|---|
| 1532 | "continuation=\"continues\" numeration=\"arabic\"", NULL); | 
|---|
| 1533 | } | 
|---|
| 1534 | else if (isupper (*enum_arg)) | 
|---|
| 1535 | { | 
|---|
| 1536 | if (enum_arg[0] == 'A') | 
|---|
| 1537 | xml_insert_element_with_attribute (ENUMERATE, START, | 
|---|
| 1538 | "numeration=\"upperalpha\"", NULL); | 
|---|
| 1539 | else | 
|---|
| 1540 | xml_insert_element_with_attribute (ENUMERATE, START, | 
|---|
| 1541 | "continuation=\"continues\" numeration=\"upperalpha\"", NULL); | 
|---|
| 1542 | } | 
|---|
| 1543 | else | 
|---|
| 1544 | { | 
|---|
| 1545 | if (enum_arg[0] == 'a') | 
|---|
| 1546 | xml_insert_element_with_attribute (ENUMERATE, START, | 
|---|
| 1547 | "numeration=\"loweralpha\"", NULL); | 
|---|
| 1548 | else | 
|---|
| 1549 | xml_insert_element_with_attribute (ENUMERATE, START, | 
|---|
| 1550 | "continuation=\"continues\" numeration=\"loweralpha\"", NULL); | 
|---|
| 1551 | } | 
|---|
| 1552 | } | 
|---|
| 1553 | xml_table_level ++; | 
|---|
| 1554 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1555 | } | 
|---|
| 1556 |  | 
|---|
| 1557 | void | 
|---|
| 1558 | xml_end_enumerate (void) | 
|---|
| 1559 | { | 
|---|
| 1560 | if (xml_in_item[xml_table_level]) | 
|---|
| 1561 | { | 
|---|
| 1562 | xml_insert_element (ITEM, END); | 
|---|
| 1563 | xml_in_item[xml_table_level] = 0; | 
|---|
| 1564 | } | 
|---|
| 1565 | xml_insert_element (ENUMERATE, END); | 
|---|
| 1566 | xml_table_level --; | 
|---|
| 1567 | } | 
|---|
| 1568 |  | 
|---|
| 1569 | static void | 
|---|
| 1570 | xml_insert_text_file (char *name_arg) | 
|---|
| 1571 | { | 
|---|
| 1572 | char *fullname = xmalloc (strlen (name_arg) + 4 + 1); | 
|---|
| 1573 | FILE *image_file; | 
|---|
| 1574 | strcpy (fullname, name_arg); | 
|---|
| 1575 | strcat (fullname, ".txt"); | 
|---|
| 1576 | image_file = fopen (fullname, "r"); | 
|---|
| 1577 | if (image_file) | 
|---|
| 1578 | { | 
|---|
| 1579 | int ch; | 
|---|
| 1580 | int save_inhibit_indentation = inhibit_paragraph_indentation; | 
|---|
| 1581 | int save_filling_enabled = filling_enabled; | 
|---|
| 1582 |  | 
|---|
| 1583 | xml_insert_element (TEXTOBJECT, START); | 
|---|
| 1584 | xml_insert_element (DISPLAY, START); | 
|---|
| 1585 |  | 
|---|
| 1586 | inhibit_paragraph_indentation = 1; | 
|---|
| 1587 | filling_enabled = 0; | 
|---|
| 1588 | last_char_was_newline = 0; | 
|---|
| 1589 |  | 
|---|
| 1590 | /* Maybe we need to remove the final newline if the image | 
|---|
| 1591 | file is only one line to allow in-line images.  On the | 
|---|
| 1592 | other hand, they could just make the file without a | 
|---|
| 1593 | final newline.  */ | 
|---|
| 1594 | while ((ch = getc (image_file)) != EOF) | 
|---|
| 1595 | add_char (ch); | 
|---|
| 1596 |  | 
|---|
| 1597 | inhibit_paragraph_indentation = save_inhibit_indentation; | 
|---|
| 1598 | filling_enabled = save_filling_enabled; | 
|---|
| 1599 |  | 
|---|
| 1600 | xml_insert_element (DISPLAY, END); | 
|---|
| 1601 | xml_insert_element (TEXTOBJECT, END); | 
|---|
| 1602 |  | 
|---|
| 1603 | if (fclose (image_file) != 0) | 
|---|
| 1604 | perror (fullname); | 
|---|
| 1605 | } | 
|---|
| 1606 | else | 
|---|
| 1607 | warning (_("@image file `%s' unreadable: %s"), fullname, | 
|---|
| 1608 | strerror (errno)); | 
|---|
| 1609 |  | 
|---|
| 1610 | free (fullname); | 
|---|
| 1611 | } | 
|---|
| 1612 |  | 
|---|
| 1613 | /* If NAME.EXT is accessible or FORCE is nonzero, insert a docbook | 
|---|
| 1614 | imagedata element for FMT.  Return 1 if inserted something, 0 else.  */ | 
|---|
| 1615 |  | 
|---|
| 1616 | static int | 
|---|
| 1617 | try_docbook_image (const char *name, const char *ext, const char *fmt, | 
|---|
| 1618 | int force) | 
|---|
| 1619 | { | 
|---|
| 1620 | int used = 0; | 
|---|
| 1621 | char *fullname = xmalloc (strlen (name) + 1 + strlen (ext) + 1); | 
|---|
| 1622 | sprintf (fullname, "%s.%s", name, ext); | 
|---|
| 1623 |  | 
|---|
| 1624 | if (force || access (fullname, R_OK) == 0) | 
|---|
| 1625 | { | 
|---|
| 1626 | xml_insert_element (IMAGEOBJECT, START); | 
|---|
| 1627 | xml_insert_element_with_attribute (IMAGEDATA, START, | 
|---|
| 1628 | "fileref=\"%s\" format=\"%s\"", fullname, fmt); | 
|---|
| 1629 | xml_insert_element (IMAGEDATA, END); | 
|---|
| 1630 | xml_insert_element (IMAGEOBJECT, END); | 
|---|
| 1631 | used = 1; | 
|---|
| 1632 | } | 
|---|
| 1633 |  | 
|---|
| 1634 | free (fullname); | 
|---|
| 1635 | return used; | 
|---|
| 1636 | } | 
|---|
| 1637 |  | 
|---|
| 1638 |  | 
|---|
| 1639 | void | 
|---|
| 1640 | xml_insert_docbook_image (char *name_arg) | 
|---|
| 1641 | { | 
|---|
| 1642 | int found = 0; | 
|---|
| 1643 | int elt = xml_in_para ? INLINEIMAGE : MEDIAOBJECT; | 
|---|
| 1644 |  | 
|---|
| 1645 | if (is_in_insertion_of_type (floatenv)) | 
|---|
| 1646 | xml_begin_docbook_float (INFORMALFIGURE); | 
|---|
| 1647 | else if (!xml_in_para) | 
|---|
| 1648 | xml_insert_element (INFORMALFIGURE, START); | 
|---|
| 1649 |  | 
|---|
| 1650 | xml_no_para++; | 
|---|
| 1651 |  | 
|---|
| 1652 | xml_insert_element (elt, START); | 
|---|
| 1653 |  | 
|---|
| 1654 | /* A selected few from http://docbook.org/tdg/en/html/imagedata.html.  */ | 
|---|
| 1655 | if (try_docbook_image (name_arg, "eps", "EPS", 0)) | 
|---|
| 1656 | found++; | 
|---|
| 1657 | if (try_docbook_image (name_arg, "gif", "GIF", 0)) | 
|---|
| 1658 | found++; | 
|---|
| 1659 | if (try_docbook_image (name_arg, "jpg", "JPG", 0)) | 
|---|
| 1660 | found++; | 
|---|
| 1661 | if (try_docbook_image (name_arg, "jpeg", "JPEG", 0)) | 
|---|
| 1662 | found++; | 
|---|
| 1663 | if (try_docbook_image (name_arg, "pdf", "PDF", 0)) | 
|---|
| 1664 | found++; | 
|---|
| 1665 | if (try_docbook_image (name_arg, "png", "PNG", 0)) | 
|---|
| 1666 | found++; | 
|---|
| 1667 | if (try_docbook_image (name_arg, "svg", "SVG", 0)) | 
|---|
| 1668 | found++; | 
|---|
| 1669 |  | 
|---|
| 1670 | /* If no luck so far, just assume we'll eventually have a jpg.  */ | 
|---|
| 1671 | if (!found) | 
|---|
| 1672 | try_docbook_image (name_arg, "jpg", "JPG", 1); | 
|---|
| 1673 |  | 
|---|
| 1674 | xml_insert_text_file (name_arg); | 
|---|
| 1675 | xml_insert_element (elt, END); | 
|---|
| 1676 |  | 
|---|
| 1677 | xml_no_para--; | 
|---|
| 1678 |  | 
|---|
| 1679 | if (elt == MEDIAOBJECT) | 
|---|
| 1680 | xml_insert_element (INFORMALFIGURE, END); | 
|---|
| 1681 | } | 
|---|
| 1682 |  | 
|---|
| 1683 | void | 
|---|
| 1684 | xml_asterisk (void) | 
|---|
| 1685 | { | 
|---|
| 1686 | } | 
|---|
| 1687 |  | 
|---|
| 1688 |  | 
|---|
| 1689 | /* | 
|---|
| 1690 | *     INDEX | 
|---|
| 1691 | */ | 
|---|
| 1692 | /* Used to separate primary and secondary entries in an index -- we need | 
|---|
| 1693 | to have real multilivel indexing support, not just string analysis.  */ | 
|---|
| 1694 | #define INDEX_SEP "@this string will never appear@" /* was , */ | 
|---|
| 1695 |  | 
|---|
| 1696 | typedef struct | 
|---|
| 1697 | { | 
|---|
| 1698 | char *from; | 
|---|
| 1699 | char *to; | 
|---|
| 1700 | } XML_SYNONYM; | 
|---|
| 1701 |  | 
|---|
| 1702 | static XML_SYNONYM **xml_synonyms = NULL; | 
|---|
| 1703 | static int xml_synonyms_count = 0; | 
|---|
| 1704 |  | 
|---|
| 1705 | void | 
|---|
| 1706 | xml_insert_indexterm (char *indexterm, char *index) | 
|---|
| 1707 | { | 
|---|
| 1708 | /* @index commands can appear between @item and @itemx, @deffn and @deffnx.  */ | 
|---|
| 1709 | if (!docbook) | 
|---|
| 1710 | { | 
|---|
| 1711 | /* Check to see if we need to do index redirection per @synindex.  */ | 
|---|
| 1712 | int i; | 
|---|
| 1713 | for (i = 0; i < xml_synonyms_count; i++) | 
|---|
| 1714 | { | 
|---|
| 1715 | if (STREQ (xml_synonyms[i]->from, index)) | 
|---|
| 1716 | index = xstrdup (xml_synonyms[i]->to); | 
|---|
| 1717 | } | 
|---|
| 1718 |  | 
|---|
| 1719 | xml_dont_touch_items_defs++; | 
|---|
| 1720 | xml_insert_element_with_attribute (INDEXTERM, START, "index=\"%s\"", index); | 
|---|
| 1721 | in_indexterm = 1; | 
|---|
| 1722 | execute_string ("%s", indexterm); | 
|---|
| 1723 | xml_insert_element (INDEXTERM, END); | 
|---|
| 1724 | in_indexterm = 0; | 
|---|
| 1725 | xml_dont_touch_items_defs--; | 
|---|
| 1726 | } | 
|---|
| 1727 | else | 
|---|
| 1728 | { | 
|---|
| 1729 | char *primary = NULL, *secondary = NULL; | 
|---|
| 1730 | if (strstr (indexterm+1, INDEX_SEP)) | 
|---|
| 1731 | { | 
|---|
| 1732 | primary = xmalloc (strlen (indexterm) + 1); | 
|---|
| 1733 | strcpy (primary, indexterm); | 
|---|
| 1734 | secondary = strstr (primary+1, INDEX_SEP); | 
|---|
| 1735 | *secondary = '\0'; | 
|---|
| 1736 | secondary += strlen (INDEX_SEP); | 
|---|
| 1737 | } | 
|---|
| 1738 | xml_insert_element_with_attribute (INDEXTERM, START, "role=\"%s\"", index); | 
|---|
| 1739 | in_indexterm = 1; | 
|---|
| 1740 | xml_insert_element (PRIMARY, START); | 
|---|
| 1741 | if (primary) | 
|---|
| 1742 | execute_string ("%s", primary); | 
|---|
| 1743 | else | 
|---|
| 1744 | execute_string ("%s", indexterm); | 
|---|
| 1745 | xml_insert_element (PRIMARY, END); | 
|---|
| 1746 | if (primary) | 
|---|
| 1747 | { | 
|---|
| 1748 | xml_insert_element (SECONDARY, START); | 
|---|
| 1749 | execute_string ("%s", secondary); | 
|---|
| 1750 | xml_insert_element (SECONDARY, END); | 
|---|
| 1751 | } | 
|---|
| 1752 | xml_insert_element (INDEXTERM, END); | 
|---|
| 1753 | in_indexterm = 0; | 
|---|
| 1754 | } | 
|---|
| 1755 | } | 
|---|
| 1756 |  | 
|---|
| 1757 |  | 
|---|
| 1758 | int xml_last_section_output_position = 0; | 
|---|
| 1759 | static char last_division_letter = ' '; | 
|---|
| 1760 | static char index_primary[2000]; /** xx no fixed limit */ | 
|---|
| 1761 | static int indexdivempty = 0; | 
|---|
| 1762 |  | 
|---|
| 1763 | static void | 
|---|
| 1764 | xml_close_indexentry (void) | 
|---|
| 1765 | { | 
|---|
| 1766 | if (!in_indexentry) | 
|---|
| 1767 | return; | 
|---|
| 1768 | if (in_secondary) | 
|---|
| 1769 | xml_insert_element (SECONDARYIE, END); | 
|---|
| 1770 | xml_insert_element (INDEXENTRY, END); | 
|---|
| 1771 | in_secondary = 0; | 
|---|
| 1772 | in_indexentry = 0; | 
|---|
| 1773 | } | 
|---|
| 1774 |  | 
|---|
| 1775 | void | 
|---|
| 1776 | xml_begin_index (void) | 
|---|
| 1777 | { | 
|---|
| 1778 | typedef struct xml_index_title { | 
|---|
| 1779 | struct xml_index_title *next; | 
|---|
| 1780 | char *title; | 
|---|
| 1781 | } XML_INDEX_TITLE; | 
|---|
| 1782 |  | 
|---|
| 1783 | static XML_INDEX_TITLE *xml_index_titles = NULL; | 
|---|
| 1784 |  | 
|---|
| 1785 | if (!handling_delayed_writes) | 
|---|
| 1786 | { /* We assume that we just opened a section, and so that the last output is | 
|---|
| 1787 | <SECTION ID="node-name"><TITLE>Title</TITLE> | 
|---|
| 1788 | where SECTION can be CHAPTER, ...  */ | 
|---|
| 1789 |  | 
|---|
| 1790 | XML_INDEX_TITLE *new = xmalloc (sizeof (XML_INDEX_TITLE)); | 
|---|
| 1791 | xml_section *temp = last_section; | 
|---|
| 1792 |  | 
|---|
| 1793 | int l = output_paragraph_offset-xml_last_section_output_position; | 
|---|
| 1794 | char *tmp = xmalloc (l+1); | 
|---|
| 1795 | char *p = tmp; | 
|---|
| 1796 | strncpy (tmp, (char *) output_paragraph, l); | 
|---|
| 1797 |  | 
|---|
| 1798 | /* We remove <SECTION */ | 
|---|
| 1799 | tmp[l] = '\0'; | 
|---|
| 1800 | while (*p != '<') | 
|---|
| 1801 | p++; | 
|---|
| 1802 | while (*p != ' ') | 
|---|
| 1803 | p++; | 
|---|
| 1804 | /* ... and its label attribute.  */ | 
|---|
| 1805 | if (strncmp (p, " label=", 7) == 0) | 
|---|
| 1806 | { | 
|---|
| 1807 | p++; | 
|---|
| 1808 | while (*p != ' ') | 
|---|
| 1809 | p++; | 
|---|
| 1810 | } | 
|---|
| 1811 |  | 
|---|
| 1812 | output_paragraph_offset = xml_last_section_output_position; | 
|---|
| 1813 | xml_last_section_output_position = 0; | 
|---|
| 1814 |  | 
|---|
| 1815 | xml_pop_current_element (); /* remove section element from elements stack */ | 
|---|
| 1816 |  | 
|---|
| 1817 | if (last_section) | 
|---|
| 1818 | last_section = last_section->prev; /* remove section from sections stack */ | 
|---|
| 1819 | if (temp) | 
|---|
| 1820 | { | 
|---|
| 1821 | free (temp->name); | 
|---|
| 1822 | free (temp); | 
|---|
| 1823 | } | 
|---|
| 1824 |  | 
|---|
| 1825 | new->title = xstrdup (p); | 
|---|
| 1826 | new->next = xml_index_titles; | 
|---|
| 1827 | xml_index_titles = new; | 
|---|
| 1828 | } | 
|---|
| 1829 | else | 
|---|
| 1830 | { | 
|---|
| 1831 | static int xml_index_titles_reversed = 0; | 
|---|
| 1832 |  | 
|---|
| 1833 | if (!xml_index_titles_reversed) | 
|---|
| 1834 | { | 
|---|
| 1835 | xml_index_titles = (XML_INDEX_TITLE *) reverse_list | 
|---|
| 1836 | ((GENERIC_LIST *) xml_index_titles); | 
|---|
| 1837 | xml_index_titles_reversed = 1; | 
|---|
| 1838 | } | 
|---|
| 1839 |  | 
|---|
| 1840 | /* We put <INDEX> */ | 
|---|
| 1841 | xml_insert_element (PRINTINDEX, START); | 
|---|
| 1842 | if (xml_index_titles) | 
|---|
| 1843 | { | 
|---|
| 1844 | /* Remove the final > */ | 
|---|
| 1845 | output_paragraph_offset--; | 
|---|
| 1846 | /* and put  ID="node-name"><TITLE>Title</TITLE> */ | 
|---|
| 1847 | insert_string (xml_index_titles->title); | 
|---|
| 1848 | free (xml_index_titles->title); | 
|---|
| 1849 | xml_index_titles = xml_index_titles->next; | 
|---|
| 1850 | } | 
|---|
| 1851 |  | 
|---|
| 1852 | if (xml_index_divisions) | 
|---|
| 1853 | { | 
|---|
| 1854 | xml_insert_element (INDEXDIV, START); | 
|---|
| 1855 | indexdivempty = 1; | 
|---|
| 1856 | } | 
|---|
| 1857 | } | 
|---|
| 1858 | } | 
|---|
| 1859 |  | 
|---|
| 1860 | void | 
|---|
| 1861 | xml_end_index (void) | 
|---|
| 1862 | { | 
|---|
| 1863 | xml_close_indexentry (); | 
|---|
| 1864 | if (xml_index_divisions) | 
|---|
| 1865 | xml_insert_element (INDEXDIV, END); | 
|---|
| 1866 | xml_insert_element (PRINTINDEX, END); | 
|---|
| 1867 | } | 
|---|
| 1868 |  | 
|---|
| 1869 | static void | 
|---|
| 1870 | xml_index_divide (char *entry) | 
|---|
| 1871 | { | 
|---|
| 1872 | char c; | 
|---|
| 1873 | if (strlen (entry) > (strlen (xml_element_list[CODE].name) + 2) && | 
|---|
| 1874 | strncmp (entry+1, xml_element_list[CODE].name, strlen (xml_element_list[CODE].name)) == 0) | 
|---|
| 1875 | c = entry[strlen (xml_element_list[CODE].name)+2]; | 
|---|
| 1876 | else | 
|---|
| 1877 | c = entry[0]; | 
|---|
| 1878 | if (tolower (c) != last_division_letter && isalpha (c)) | 
|---|
| 1879 | { | 
|---|
| 1880 | last_division_letter = tolower (c); | 
|---|
| 1881 | xml_close_indexentry (); | 
|---|
| 1882 | if (!indexdivempty) | 
|---|
| 1883 | { | 
|---|
| 1884 | xml_insert_element (INDEXDIV, END); | 
|---|
| 1885 | xml_insert_element (INDEXDIV, START); | 
|---|
| 1886 | } | 
|---|
| 1887 | xml_insert_element (TITLE, START); | 
|---|
| 1888 | insert (toupper (c)); | 
|---|
| 1889 | xml_insert_element (TITLE, END); | 
|---|
| 1890 | } | 
|---|
| 1891 | } | 
|---|
| 1892 |  | 
|---|
| 1893 | void | 
|---|
| 1894 | xml_insert_indexentry (char *entry, char *node) | 
|---|
| 1895 | { | 
|---|
| 1896 | char *primary = NULL, *secondary; | 
|---|
| 1897 | if (xml_index_divisions) | 
|---|
| 1898 | xml_index_divide (entry); | 
|---|
| 1899 |  | 
|---|
| 1900 | indexdivempty = 0; | 
|---|
| 1901 | if (strstr (entry+1, INDEX_SEP)) | 
|---|
| 1902 | { | 
|---|
| 1903 | primary = xmalloc (strlen (entry) + 1); | 
|---|
| 1904 | strcpy (primary, entry); | 
|---|
| 1905 | secondary = strstr (primary+1, INDEX_SEP); | 
|---|
| 1906 | *secondary = '\0'; | 
|---|
| 1907 | secondary += strlen (INDEX_SEP); | 
|---|
| 1908 |  | 
|---|
| 1909 | if (in_secondary && strcmp (primary, index_primary) == 0) | 
|---|
| 1910 | { | 
|---|
| 1911 | xml_insert_element (SECONDARYIE, END); | 
|---|
| 1912 | xml_insert_element (SECONDARYIE, START); | 
|---|
| 1913 | execute_string ("%s", secondary); | 
|---|
| 1914 | } | 
|---|
| 1915 | else | 
|---|
| 1916 | { | 
|---|
| 1917 | xml_close_indexentry (); | 
|---|
| 1918 | xml_insert_element (INDEXENTRY, START); | 
|---|
| 1919 | in_indexentry = 1; | 
|---|
| 1920 | xml_insert_element (PRIMARYIE, START); | 
|---|
| 1921 | execute_string ("%s", primary); | 
|---|
| 1922 | xml_insert_element (PRIMARYIE, END); | 
|---|
| 1923 | xml_insert_element (SECONDARYIE, START); | 
|---|
| 1924 | execute_string ("%s", secondary); | 
|---|
| 1925 | in_secondary = 1; | 
|---|
| 1926 | } | 
|---|
| 1927 | } | 
|---|
| 1928 | else | 
|---|
| 1929 | { | 
|---|
| 1930 | xml_close_indexentry (); | 
|---|
| 1931 | xml_insert_element (INDEXENTRY, START); | 
|---|
| 1932 | in_indexentry = 1; | 
|---|
| 1933 | xml_insert_element (PRIMARYIE, START); | 
|---|
| 1934 | execute_string ("%s", entry); | 
|---|
| 1935 | } | 
|---|
| 1936 | add_word (", "); | 
|---|
| 1937 |  | 
|---|
| 1938 | /* Don't link to @unnumbered sections directly. | 
|---|
| 1939 | We are disabling warnings temporarily, otherwise these xrefs | 
|---|
| 1940 | will cause bogus warnings about missing punctuation.  */ | 
|---|
| 1941 | { | 
|---|
| 1942 | extern int print_warnings; | 
|---|
| 1943 | int save_print_warnings = print_warnings; | 
|---|
| 1944 | print_warnings = 0; | 
|---|
| 1945 | execute_string ("%cxref{%s}", COMMAND_PREFIX, xstrdup (node)); | 
|---|
| 1946 | print_warnings = save_print_warnings; | 
|---|
| 1947 | } | 
|---|
| 1948 |  | 
|---|
| 1949 | if (primary) | 
|---|
| 1950 | { | 
|---|
| 1951 | strcpy (index_primary, primary); | 
|---|
| 1952 | /*      xml_insert_element (SECONDARYIE, END);*/ | 
|---|
| 1953 | /*     *(secondary-1) = ',';*/ /* necessary ? */ | 
|---|
| 1954 | free (primary); | 
|---|
| 1955 | } | 
|---|
| 1956 | else | 
|---|
| 1957 | xml_insert_element (PRIMARYIE, END); | 
|---|
| 1958 |  | 
|---|
| 1959 | /*  xml_insert_element (INDEXENTRY, END); */ | 
|---|
| 1960 | } | 
|---|
| 1961 |  | 
|---|
| 1962 | void | 
|---|
| 1963 | xml_synindex (char *from, char *to) | 
|---|
| 1964 | { | 
|---|
| 1965 | int i, slot; | 
|---|
| 1966 |  | 
|---|
| 1967 | slot = -1; | 
|---|
| 1968 | for (i = 0; i < xml_synonyms_count; i++) | 
|---|
| 1969 | if (!xml_synonyms[i]) | 
|---|
| 1970 | { | 
|---|
| 1971 | slot = i; | 
|---|
| 1972 | break; | 
|---|
| 1973 | } | 
|---|
| 1974 |  | 
|---|
| 1975 | if (slot < 0) | 
|---|
| 1976 | { | 
|---|
| 1977 | slot = xml_synonyms_count; | 
|---|
| 1978 | xml_synonyms_count++; | 
|---|
| 1979 |  | 
|---|
| 1980 | xml_synonyms = (XML_SYNONYM **) xrealloc (xml_synonyms, | 
|---|
| 1981 | (xml_synonyms_count + 1) * sizeof (XML_SYNONYM *)); | 
|---|
| 1982 | } | 
|---|
| 1983 |  | 
|---|
| 1984 | xml_synonyms[slot] = xmalloc (sizeof (XML_SYNONYM)); | 
|---|
| 1985 | xml_synonyms[slot]->from = xstrdup (from); | 
|---|
| 1986 | xml_synonyms[slot]->to = xstrdup (to); | 
|---|
| 1987 | } | 
|---|
| 1988 |  | 
|---|
| 1989 | /* | 
|---|
| 1990 | * MULTITABLE | 
|---|
| 1991 | */ | 
|---|
| 1992 |  | 
|---|
| 1993 | static int multitable_columns_count; | 
|---|
| 1994 | static int *multitable_column_widths; | 
|---|
| 1995 |  | 
|---|
| 1996 | void | 
|---|
| 1997 | xml_begin_multitable (int ncolumns, int *column_widths) | 
|---|
| 1998 | { | 
|---|
| 1999 | int i; | 
|---|
| 2000 | if (docbook) | 
|---|
| 2001 | { | 
|---|
| 2002 | if (is_in_insertion_of_type (floatenv)) | 
|---|
| 2003 | xml_begin_docbook_float (MULTITABLE); | 
|---|
| 2004 | else | 
|---|
| 2005 | xml_insert_element (MULTITABLE, START); | 
|---|
| 2006 |  | 
|---|
| 2007 | multitable_columns_count = ncolumns; | 
|---|
| 2008 | multitable_column_widths = xmalloc (sizeof (int) * ncolumns); | 
|---|
| 2009 | memcpy (multitable_column_widths, column_widths, | 
|---|
| 2010 | sizeof (int) * ncolumns); | 
|---|
| 2011 |  | 
|---|
| 2012 | xml_no_para = 1; | 
|---|
| 2013 | } | 
|---|
| 2014 | else | 
|---|
| 2015 | { | 
|---|
| 2016 | xml_insert_element (MULTITABLE, START); | 
|---|
| 2017 | for (i=0; i<ncolumns; i++) | 
|---|
| 2018 | { | 
|---|
| 2019 | xml_insert_element (COLSPEC, START); | 
|---|
| 2020 | add_word_args ("%d", column_widths[i]); | 
|---|
| 2021 | xml_insert_element (COLSPEC, END); | 
|---|
| 2022 | } | 
|---|
| 2023 | xml_no_para = 1; | 
|---|
| 2024 | } | 
|---|
| 2025 | } | 
|---|
| 2026 |  | 
|---|
| 2027 | static void | 
|---|
| 2028 | xml_begin_multitable_group (void) | 
|---|
| 2029 | { | 
|---|
| 2030 | int i; | 
|---|
| 2031 |  | 
|---|
| 2032 | xml_insert_element_with_attribute (TGROUP, START, "cols=\"%d\"", | 
|---|
| 2033 | multitable_columns_count); | 
|---|
| 2034 |  | 
|---|
| 2035 | for (i=0; i < multitable_columns_count; i++) | 
|---|
| 2036 | { | 
|---|
| 2037 | xml_insert_element_with_attribute (COLSPEC, START, | 
|---|
| 2038 | "colwidth=\"%d*\"", multitable_column_widths[i]); | 
|---|
| 2039 | xml_insert_element (COLSPEC, END); | 
|---|
| 2040 | } | 
|---|
| 2041 | } | 
|---|
| 2042 |  | 
|---|
| 2043 | void | 
|---|
| 2044 | xml_end_multitable_row (int first_row) | 
|---|
| 2045 | { | 
|---|
| 2046 | if (!first_row) | 
|---|
| 2047 | { | 
|---|
| 2048 | xml_insert_element (ENTRY, END); | 
|---|
| 2049 | xml_insert_element (ROW, END); | 
|---|
| 2050 | } | 
|---|
| 2051 |  | 
|---|
| 2052 | if (headitem_flag) | 
|---|
| 2053 | { | 
|---|
| 2054 | if (!first_row) | 
|---|
| 2055 | { | 
|---|
| 2056 | if (after_headitem) | 
|---|
| 2057 | xml_insert_element (THEAD, END); | 
|---|
| 2058 | else | 
|---|
| 2059 | xml_insert_element (TBODY, END); | 
|---|
| 2060 | xml_insert_element (TGROUP, END); | 
|---|
| 2061 | } | 
|---|
| 2062 |  | 
|---|
| 2063 | xml_begin_multitable_group (); | 
|---|
| 2064 | xml_insert_element (THEAD, START); | 
|---|
| 2065 | } | 
|---|
| 2066 | else if (first_row) | 
|---|
| 2067 | { | 
|---|
| 2068 | xml_begin_multitable_group (); | 
|---|
| 2069 | xml_insert_element (TBODY, START); | 
|---|
| 2070 | } | 
|---|
| 2071 | else if (after_headitem) | 
|---|
| 2072 | { | 
|---|
| 2073 | xml_insert_element (THEAD, END); | 
|---|
| 2074 | xml_insert_element (TBODY, START); | 
|---|
| 2075 | } | 
|---|
| 2076 | else if (first_row) | 
|---|
| 2077 | xml_insert_element (TBODY, START); | 
|---|
| 2078 |  | 
|---|
| 2079 | xml_insert_element (ROW, START); | 
|---|
| 2080 | xml_insert_element (ENTRY, START); | 
|---|
| 2081 | } | 
|---|
| 2082 |  | 
|---|
| 2083 | void | 
|---|
| 2084 | xml_end_multitable_column (void) | 
|---|
| 2085 | { | 
|---|
| 2086 | xml_insert_element (ENTRY, END); | 
|---|
| 2087 | xml_insert_element (ENTRY, START); | 
|---|
| 2088 | } | 
|---|
| 2089 |  | 
|---|
| 2090 | void | 
|---|
| 2091 | xml_end_multitable (void) | 
|---|
| 2092 | { | 
|---|
| 2093 | xml_insert_element (ENTRY, END); | 
|---|
| 2094 | xml_insert_element (ROW, END); | 
|---|
| 2095 |  | 
|---|
| 2096 | if (after_headitem) | 
|---|
| 2097 | { | 
|---|
| 2098 | if (docbook) | 
|---|
| 2099 | warning (_("@headitem as the last item of @multitable produces invalid Docbook documents")); | 
|---|
| 2100 | xml_insert_element (THEAD, END); | 
|---|
| 2101 | } | 
|---|
| 2102 | else | 
|---|
| 2103 | xml_insert_element (TBODY, END); | 
|---|
| 2104 |  | 
|---|
| 2105 | if (docbook) | 
|---|
| 2106 | xml_insert_element (TGROUP, END); | 
|---|
| 2107 |  | 
|---|
| 2108 | xml_insert_element (MULTITABLE, END); | 
|---|
| 2109 | xml_no_para = 0; | 
|---|
| 2110 | } | 
|---|
| 2111 |  | 
|---|
| 2112 | /* | 
|---|
| 2113 | * Parameters in @def definitions | 
|---|
| 2114 | */ | 
|---|
| 2115 |  | 
|---|
| 2116 | #define DEFUN_SELF_DELIMITING(c) \ | 
|---|
| 2117 | ((c) == '(' || (c) == ')' || (c) == '[' || (c) == ']') | 
|---|
| 2118 |  | 
|---|
| 2119 | void | 
|---|
| 2120 | xml_process_defun_args (char **defun_args, int auto_var_p) | 
|---|
| 2121 | { | 
|---|
| 2122 | int pending_space = 0; | 
|---|
| 2123 | int just_after_paramtype = 0; | 
|---|
| 2124 |  | 
|---|
| 2125 | for (;;) | 
|---|
| 2126 | { | 
|---|
| 2127 | char *defun_arg = *defun_args++; | 
|---|
| 2128 |  | 
|---|
| 2129 | if (defun_arg == NULL) | 
|---|
| 2130 | break; | 
|---|
| 2131 |  | 
|---|
| 2132 | if (defun_arg[0] == ' ') | 
|---|
| 2133 | { | 
|---|
| 2134 | pending_space = 1; | 
|---|
| 2135 | continue; | 
|---|
| 2136 | } | 
|---|
| 2137 |  | 
|---|
| 2138 | if (pending_space) | 
|---|
| 2139 | { | 
|---|
| 2140 | add_char (' '); | 
|---|
| 2141 | pending_space = 0; | 
|---|
| 2142 | } | 
|---|
| 2143 |  | 
|---|
| 2144 | if (DEFUN_SELF_DELIMITING (defun_arg[0])) | 
|---|
| 2145 | { | 
|---|
| 2146 | xml_insert_element (DEFDELIMITER, START); | 
|---|
| 2147 | add_char (defun_arg[0]); | 
|---|
| 2148 | xml_insert_element (DEFDELIMITER, END); | 
|---|
| 2149 | just_after_paramtype = 0; | 
|---|
| 2150 | } | 
|---|
| 2151 | else if (defun_arg[0] == '&') | 
|---|
| 2152 | { | 
|---|
| 2153 | xml_insert_element (DEFPARAM, START); | 
|---|
| 2154 | add_word (defun_arg); | 
|---|
| 2155 | xml_insert_element (DEFPARAM, END); | 
|---|
| 2156 | just_after_paramtype = 0; | 
|---|
| 2157 | } | 
|---|
| 2158 | else if (defun_arg[0] == COMMAND_PREFIX || just_after_paramtype) | 
|---|
| 2159 | { | 
|---|
| 2160 | xml_insert_element (DEFPARAM, START); | 
|---|
| 2161 | execute_string ("%s", defun_arg); | 
|---|
| 2162 | xml_insert_element (DEFPARAM, END); | 
|---|
| 2163 | just_after_paramtype = 0; | 
|---|
| 2164 | } | 
|---|
| 2165 | else if (defun_arg[0] == ',' || defun_arg[0] == ';') | 
|---|
| 2166 | { | 
|---|
| 2167 | xml_insert_element (DEFDELIMITER, START); | 
|---|
| 2168 | add_word (defun_arg); | 
|---|
| 2169 | xml_insert_element (DEFDELIMITER, END); | 
|---|
| 2170 | just_after_paramtype = 0; | 
|---|
| 2171 | } | 
|---|
| 2172 | else if (auto_var_p) | 
|---|
| 2173 | { | 
|---|
| 2174 | xml_insert_element (DEFPARAM, START); | 
|---|
| 2175 | add_word (defun_arg); | 
|---|
| 2176 | xml_insert_element (DEFPARAM, END); | 
|---|
| 2177 | just_after_paramtype = 0; | 
|---|
| 2178 | } | 
|---|
| 2179 | else | 
|---|
| 2180 | { | 
|---|
| 2181 | xml_insert_element (DEFPARAMTYPE, START); | 
|---|
| 2182 | add_word (defun_arg); | 
|---|
| 2183 | xml_insert_element (DEFPARAMTYPE, END); | 
|---|
| 2184 | just_after_paramtype = 1; | 
|---|
| 2185 | } | 
|---|
| 2186 | } | 
|---|
| 2187 | } | 
|---|
| 2188 |  | 
|---|
| 2189 | void | 
|---|
| 2190 | xml_begin_definition (void) | 
|---|
| 2191 | { | 
|---|
| 2192 | xml_insert_element (DEFINITION, START); | 
|---|
| 2193 | xml_definition_level ++; | 
|---|
| 2194 | xml_in_def_item[xml_definition_level] = 0; | 
|---|
| 2195 | } | 
|---|
| 2196 |  | 
|---|
| 2197 | void | 
|---|
| 2198 | xml_end_definition (void) | 
|---|
| 2199 | { | 
|---|
| 2200 | if (xml_in_def_item[xml_definition_level]) | 
|---|
| 2201 | { | 
|---|
| 2202 | xml_insert_element (DEFINITIONITEM, END); | 
|---|
| 2203 | xml_in_def_item[xml_definition_level] = 0; | 
|---|
| 2204 | } | 
|---|
| 2205 | xml_after_def_term = 0; | 
|---|
| 2206 | xml_insert_element (DEFINITION, END); | 
|---|
| 2207 | xml_definition_level --; | 
|---|
| 2208 | } | 
|---|
| 2209 |  | 
|---|
| 2210 | void | 
|---|
| 2211 | xml_begin_def_term (int base_type, const char *category, | 
|---|
| 2212 | char *defined_name, char *type_name, char *type_name2) | 
|---|
| 2213 | { | 
|---|
| 2214 | xml_after_def_term = 0; | 
|---|
| 2215 | xml_insert_element (DEFINITIONTERM, START); | 
|---|
| 2216 |  | 
|---|
| 2217 | /* Index entry */ | 
|---|
| 2218 | switch (base_type) | 
|---|
| 2219 | { | 
|---|
| 2220 | case deffn: | 
|---|
| 2221 | case deftypefn: | 
|---|
| 2222 | execute_string ("@findex %s\n", defined_name); | 
|---|
| 2223 | break; | 
|---|
| 2224 | case defvr: | 
|---|
| 2225 | case deftypevr: | 
|---|
| 2226 | case defcv: | 
|---|
| 2227 | execute_string ("@vindex %s\n", defined_name); | 
|---|
| 2228 | break; | 
|---|
| 2229 | case deftypecv: | 
|---|
| 2230 | case deftypeivar: | 
|---|
| 2231 | execute_string ("@vindex %s %s %s\n", defined_name, _("of"), type_name); | 
|---|
| 2232 | break; | 
|---|
| 2233 | case deftypemethod: | 
|---|
| 2234 | case defop: | 
|---|
| 2235 | case deftypeop: | 
|---|
| 2236 | execute_string ("@findex %s %s %s\n", defined_name, _("on"), type_name); | 
|---|
| 2237 | break; | 
|---|
| 2238 | case deftp: | 
|---|
| 2239 | execute_string ("@tindex %s\n", defined_name); | 
|---|
| 2240 | break; | 
|---|
| 2241 | } | 
|---|
| 2242 |  | 
|---|
| 2243 | /* Start with category.  */ | 
|---|
| 2244 | xml_insert_element (DEFCATEGORY, START); | 
|---|
| 2245 | execute_string (docbook ? "--- %s:" : "%s", category); | 
|---|
| 2246 | xml_insert_element (DEFCATEGORY, END); | 
|---|
| 2247 | add_char(' '); | 
|---|
| 2248 |  | 
|---|
| 2249 | /* Output type name first for typed definitions.  */ | 
|---|
| 2250 | switch (base_type) | 
|---|
| 2251 | { | 
|---|
| 2252 | case deffn: | 
|---|
| 2253 | case defvr: | 
|---|
| 2254 | case deftp: | 
|---|
| 2255 | break; | 
|---|
| 2256 |  | 
|---|
| 2257 | case deftypefn: | 
|---|
| 2258 | case deftypevr: | 
|---|
| 2259 | xml_insert_element (DEFTYPE, START); | 
|---|
| 2260 | execute_string ("%s", type_name); | 
|---|
| 2261 | xml_insert_element (DEFTYPE, END); | 
|---|
| 2262 | add_char (' '); | 
|---|
| 2263 | break; | 
|---|
| 2264 |  | 
|---|
| 2265 | case deftypecv: | 
|---|
| 2266 | case deftypeivar: | 
|---|
| 2267 | case deftypemethod: | 
|---|
| 2268 | case deftypeop: | 
|---|
| 2269 | xml_insert_element (DEFTYPE, START); | 
|---|
| 2270 | execute_string ("%s", type_name2); | 
|---|
| 2271 | xml_insert_element (DEFTYPE, END); | 
|---|
| 2272 | add_char (' '); | 
|---|
| 2273 | break; | 
|---|
| 2274 |  | 
|---|
| 2275 | default: | 
|---|
| 2276 | xml_insert_element (DEFCLASS, START); | 
|---|
| 2277 | execute_string ("%s", type_name); | 
|---|
| 2278 | xml_insert_element (DEFCLASS, END); | 
|---|
| 2279 | add_char (' '); | 
|---|
| 2280 | break; | 
|---|
| 2281 | } | 
|---|
| 2282 |  | 
|---|
| 2283 | /* Categorize rest of the definitions.  */ | 
|---|
| 2284 | switch (base_type) | 
|---|
| 2285 | { | 
|---|
| 2286 | case deffn: | 
|---|
| 2287 | case deftypefn: | 
|---|
| 2288 | xml_insert_element (DEFFUNCTION, START); | 
|---|
| 2289 | execute_string ("%s", defined_name); | 
|---|
| 2290 | xml_insert_element (DEFFUNCTION, END); | 
|---|
| 2291 | break; | 
|---|
| 2292 |  | 
|---|
| 2293 | case defvr: | 
|---|
| 2294 | case deftypevr: | 
|---|
| 2295 | xml_insert_element (DEFVARIABLE, START); | 
|---|
| 2296 | execute_string ("%s", defined_name); | 
|---|
| 2297 | xml_insert_element (DEFVARIABLE, END); | 
|---|
| 2298 | break; | 
|---|
| 2299 |  | 
|---|
| 2300 | case deftp: | 
|---|
| 2301 | xml_insert_element (DEFDATATYPE, START); | 
|---|
| 2302 | execute_string ("%s", defined_name); | 
|---|
| 2303 | xml_insert_element (DEFDATATYPE, END); | 
|---|
| 2304 | break; | 
|---|
| 2305 |  | 
|---|
| 2306 | case defcv: | 
|---|
| 2307 | case deftypecv: | 
|---|
| 2308 | case deftypeivar: | 
|---|
| 2309 | xml_insert_element (DEFCLASSVAR, START); | 
|---|
| 2310 | execute_string ("%s", defined_name); | 
|---|
| 2311 | xml_insert_element (DEFCLASSVAR, END); | 
|---|
| 2312 | break; | 
|---|
| 2313 |  | 
|---|
| 2314 | case defop: | 
|---|
| 2315 | case deftypeop: | 
|---|
| 2316 | case deftypemethod: | 
|---|
| 2317 | /* Operation / Method */ | 
|---|
| 2318 | xml_insert_element (DEFOPERATION, START); | 
|---|
| 2319 | execute_string ("%s", defined_name); | 
|---|
| 2320 | xml_insert_element (DEFOPERATION, END); | 
|---|
| 2321 | break; | 
|---|
| 2322 | } | 
|---|
| 2323 | } | 
|---|
| 2324 |  | 
|---|
| 2325 | void | 
|---|
| 2326 | xml_end_def_term (void) | 
|---|
| 2327 | { | 
|---|
| 2328 | xml_insert_element (DEFINITIONTERM, END); | 
|---|
| 2329 | xml_after_def_term = 1; | 
|---|
| 2330 | } | 
|---|