xref: /openbsd-src/gnu/usr.bin/texinfo/makeinfo/cmds.c (revision 1f65d55c05a93c580a58cba3ccfa46170ab90f2b)
11cc83814Sespie /* cmds.c -- Texinfo commands.
2*1f65d55cSotto    $Id: cmds.c,v 1.4 2019/05/27 07:13:38 otto Exp $
31cc83814Sespie 
41076333cSespie    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
51076333cSespie    Foundation, Inc.
61cc83814Sespie 
71cc83814Sespie    This program is free software; you can redistribute it and/or modify
81cc83814Sespie    it under the terms of the GNU General Public License as published by
91cc83814Sespie    the Free Software Foundation; either version 2, or (at your option)
101cc83814Sespie    any later version.
111cc83814Sespie 
121cc83814Sespie    This program is distributed in the hope that it will be useful,
131cc83814Sespie    but WITHOUT ANY WARRANTY; without even the implied warranty of
141cc83814Sespie    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151cc83814Sespie    GNU General Public License for more details.
161cc83814Sespie 
171cc83814Sespie    You should have received a copy of the GNU General Public License
181cc83814Sespie    along with this program; if not, write to the Free Software Foundation,
191cc83814Sespie    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
201cc83814Sespie 
211cc83814Sespie #include "system.h"
221cc83814Sespie #include "cmds.h"
231cc83814Sespie #include "defun.h"
241cc83814Sespie #include "files.h"
251cc83814Sespie #include "footnote.h"
261076333cSespie #include "html.h"
271cc83814Sespie #include "insertion.h"
281cc83814Sespie #include "lang.h"
291cc83814Sespie #include "macro.h"
301cc83814Sespie #include "makeinfo.h"
311cc83814Sespie #include "node.h"
321cc83814Sespie #include "sectioning.h"
331cc83814Sespie #include "toc.h"
343fb98d4aSespie #include "xml.h"
351cc83814Sespie 
361cc83814Sespie #ifdef TM_IN_SYS_TIME
371cc83814Sespie #include <sys/time.h>
381cc83814Sespie #else
391cc83814Sespie #include <time.h>
401cc83814Sespie #endif
411cc83814Sespie 
421cc83814Sespie /* Options. */
431076333cSespie static void cm_exampleindent (void),
441076333cSespie      cm_firstparagraphindent (void),
451076333cSespie      cm_paragraphindent (void),
461076333cSespie      cm_novalidate (void);
471cc83814Sespie 
481cc83814Sespie /* Internals. */
491076333cSespie static void cm_obsolete (int arg, int start, int end),
501076333cSespie      not_fixed_width (int arg);
511cc83814Sespie 
521cc83814Sespie /* The dispatch table.  */
531cc83814Sespie COMMAND command_table[] = {
541cc83814Sespie   { "\t", insert_space, NO_BRACE_ARGS },
551cc83814Sespie   { "\n", insert_space, NO_BRACE_ARGS },
563fb98d4aSespie   { " ", insert_space, NO_BRACE_ARGS },
571076333cSespie   { "!", cm_punct, NO_BRACE_ARGS },
581cc83814Sespie   { "\"", cm_accent_umlaut, MAYBE_BRACE_ARGS },
591cc83814Sespie   { "'", cm_accent_acute, MAYBE_BRACE_ARGS },
601cc83814Sespie   { "*", cm_asterisk, NO_BRACE_ARGS },
611cc83814Sespie   { ",", cm_accent_cedilla, MAYBE_BRACE_ARGS },
621cc83814Sespie   { "-", cm_no_op, NO_BRACE_ARGS },
631076333cSespie   { ".", cm_punct, NO_BRACE_ARGS },
641076333cSespie   { "/", cm_no_op, NO_BRACE_ARGS },
651076333cSespie   { ":", cm_colon, NO_BRACE_ARGS },
661cc83814Sespie   { "=", cm_accent, MAYBE_BRACE_ARGS },
671076333cSespie   { "?", cm_punct, NO_BRACE_ARGS },
681cc83814Sespie   { "@", insert_self, NO_BRACE_ARGS },
693fb98d4aSespie   { "\\", insert_self, NO_BRACE_ARGS },
701cc83814Sespie   { "^", cm_accent_hat, MAYBE_BRACE_ARGS },
711cc83814Sespie   { "`", cm_accent_grave, MAYBE_BRACE_ARGS },
721cc83814Sespie   { "{", insert_self, NO_BRACE_ARGS },
731cc83814Sespie   { "|", cm_no_op, NO_BRACE_ARGS },
741cc83814Sespie   { "}", insert_self, NO_BRACE_ARGS },
751cc83814Sespie   { "~", cm_accent_tilde, MAYBE_BRACE_ARGS },
761cc83814Sespie   { "AA", cm_special_char, BRACE_ARGS },
771cc83814Sespie   { "AE", cm_special_char, BRACE_ARGS },
781cc83814Sespie   { "H", cm_accent, MAYBE_BRACE_ARGS },
791cc83814Sespie   { "L", cm_special_char, BRACE_ARGS },
801076333cSespie   { "LaTeX", cm_LaTeX, BRACE_ARGS },
811cc83814Sespie   { "O", cm_special_char, BRACE_ARGS },
821cc83814Sespie   { "OE", cm_special_char, BRACE_ARGS },
831cc83814Sespie   { "TeX", cm_TeX, BRACE_ARGS },
841cc83814Sespie   { "aa", cm_special_char, BRACE_ARGS },
851076333cSespie   { "abbr", cm_abbr, BRACE_ARGS },
861cc83814Sespie   { "acronym", cm_acronym, BRACE_ARGS },
871cc83814Sespie   { "ae", cm_special_char, BRACE_ARGS },
883fb98d4aSespie   { "afivepaper", cm_ignore_line, NO_BRACE_ARGS },
893fb98d4aSespie   { "afourlatex", cm_ignore_line, NO_BRACE_ARGS },
901cc83814Sespie   { "afourpaper", cm_ignore_line, NO_BRACE_ARGS },
913fb98d4aSespie   { "afourwide", cm_ignore_line, NO_BRACE_ARGS },
921cc83814Sespie   { "alias", cm_alias, NO_BRACE_ARGS },
931cc83814Sespie   { "anchor", cm_anchor, BRACE_ARGS },
941cc83814Sespie   { "appendix", cm_appendix, NO_BRACE_ARGS },
951cc83814Sespie   { "appendixsection", cm_appendixsec, NO_BRACE_ARGS },
961cc83814Sespie   { "appendixsec", cm_appendixsec, NO_BRACE_ARGS },
971cc83814Sespie   { "appendixsubsec", cm_appendixsubsec, NO_BRACE_ARGS },
981cc83814Sespie   { "appendixsubsubsec", cm_appendixsubsubsec, NO_BRACE_ARGS },
991cc83814Sespie   { "asis", cm_no_op, BRACE_ARGS },
1001076333cSespie   { "author", cm_author, NO_BRACE_ARGS },
1011cc83814Sespie   { "b", cm_b, BRACE_ARGS },
1021cc83814Sespie   { "bullet", cm_bullet, BRACE_ARGS },
1031cc83814Sespie   { "bye", cm_bye, NO_BRACE_ARGS },
1041076333cSespie   { "c", cm_comment, NO_BRACE_ARGS },
1051076333cSespie   { "caption", cm_caption, BRACE_ARGS },
1061cc83814Sespie   { "cartouche", cm_cartouche, NO_BRACE_ARGS },
1071cc83814Sespie   { "center", cm_center, NO_BRACE_ARGS },
1081cc83814Sespie   { "centerchap", cm_unnumbered, NO_BRACE_ARGS },
1091cc83814Sespie   { "chapheading", cm_chapheading, NO_BRACE_ARGS },
1101cc83814Sespie   { "chapter", cm_chapter, NO_BRACE_ARGS },
1111cc83814Sespie   { "cindex", cm_cindex, NO_BRACE_ARGS },
1121cc83814Sespie   { "cite", cm_cite, BRACE_ARGS },
1131cc83814Sespie   { "clear", cm_clear, NO_BRACE_ARGS },
1141cc83814Sespie   { "code", cm_code, BRACE_ARGS },
1151076333cSespie   { "comma", cm_comma, BRACE_ARGS },
1161cc83814Sespie   { "command", cm_code, BRACE_ARGS },
1171076333cSespie   { "comment", cm_comment, NO_BRACE_ARGS },
1181cc83814Sespie   { "contents", cm_contents, NO_BRACE_ARGS },
1193fb98d4aSespie   { "copying", cm_copying, NO_BRACE_ARGS },
1201cc83814Sespie   { "copyright", cm_copyright, BRACE_ARGS },
1211cc83814Sespie   { "ctrl", cm_obsolete, BRACE_ARGS },
1221cc83814Sespie   { "defcodeindex", cm_defcodeindex, NO_BRACE_ARGS },
1231cc83814Sespie   { "defcv", cm_defun, NO_BRACE_ARGS },
1241cc83814Sespie   { "defcvx", cm_defun, NO_BRACE_ARGS },
1251cc83814Sespie   { "deffn", cm_defun, NO_BRACE_ARGS },
1261cc83814Sespie   { "deffnx", cm_defun, NO_BRACE_ARGS },
1271cc83814Sespie   { "defindex", cm_defindex, NO_BRACE_ARGS },
1281cc83814Sespie   { "definfoenclose", cm_definfoenclose, NO_BRACE_ARGS },
1291cc83814Sespie   { "defivar", cm_defun, NO_BRACE_ARGS },
1301cc83814Sespie   { "defivarx", cm_defun, NO_BRACE_ARGS },
1311cc83814Sespie   { "defmac", cm_defun, NO_BRACE_ARGS },
1321cc83814Sespie   { "defmacx", cm_defun, NO_BRACE_ARGS },
1331cc83814Sespie   { "defmethod", cm_defun, NO_BRACE_ARGS },
1341cc83814Sespie   { "defmethodx", cm_defun, NO_BRACE_ARGS },
1351cc83814Sespie   { "defop", cm_defun, NO_BRACE_ARGS },
1361cc83814Sespie   { "defopt", cm_defun, NO_BRACE_ARGS },
1371cc83814Sespie   { "defoptx", cm_defun, NO_BRACE_ARGS },
1381cc83814Sespie   { "defopx", cm_defun, NO_BRACE_ARGS },
1391cc83814Sespie   { "defspec", cm_defun, NO_BRACE_ARGS },
1401cc83814Sespie   { "defspecx", cm_defun, NO_BRACE_ARGS },
1411cc83814Sespie   { "deftp", cm_defun, NO_BRACE_ARGS },
1421cc83814Sespie   { "deftpx", cm_defun, NO_BRACE_ARGS },
1431076333cSespie   { "deftypecv", cm_defun, NO_BRACE_ARGS },
1441076333cSespie   { "deftypecvx", cm_defun, NO_BRACE_ARGS },
1451cc83814Sespie   { "deftypefn", cm_defun, NO_BRACE_ARGS },
1461cc83814Sespie   { "deftypefnx", cm_defun, NO_BRACE_ARGS },
1471cc83814Sespie   { "deftypefun", cm_defun, NO_BRACE_ARGS },
1481cc83814Sespie   { "deftypefunx", cm_defun, NO_BRACE_ARGS },
1491cc83814Sespie   { "deftypeivar", cm_defun, NO_BRACE_ARGS },
1501cc83814Sespie   { "deftypeivarx", cm_defun, NO_BRACE_ARGS },
1511cc83814Sespie   { "deftypemethod", cm_defun, NO_BRACE_ARGS },
1521cc83814Sespie   { "deftypemethodx", cm_defun, NO_BRACE_ARGS },
1531cc83814Sespie   { "deftypeop", cm_defun, NO_BRACE_ARGS },
1541cc83814Sespie   { "deftypeopx", cm_defun, NO_BRACE_ARGS },
1551cc83814Sespie   { "deftypevar", cm_defun, NO_BRACE_ARGS },
1561cc83814Sespie   { "deftypevarx", cm_defun, NO_BRACE_ARGS },
1571cc83814Sespie   { "deftypevr", cm_defun, NO_BRACE_ARGS },
1581cc83814Sespie   { "deftypevrx", cm_defun, NO_BRACE_ARGS },
1591cc83814Sespie   { "defun", cm_defun, NO_BRACE_ARGS },
1601cc83814Sespie   { "defunx", cm_defun, NO_BRACE_ARGS },
1611cc83814Sespie   { "defvar", cm_defun, NO_BRACE_ARGS },
1621cc83814Sespie   { "defvarx", cm_defun, NO_BRACE_ARGS },
1631cc83814Sespie   { "defvr", cm_defun, NO_BRACE_ARGS },
1641cc83814Sespie   { "defvrx", cm_defun, NO_BRACE_ARGS },
1651cc83814Sespie   { "detailmenu", cm_detailmenu, NO_BRACE_ARGS },
1661cc83814Sespie   { "dfn", cm_dfn, BRACE_ARGS },
1671cc83814Sespie   { "dircategory", cm_dircategory, NO_BRACE_ARGS },
1681cc83814Sespie   { "direntry", cm_direntry, NO_BRACE_ARGS },
1691cc83814Sespie   { "display", cm_display, NO_BRACE_ARGS },
1701076333cSespie   { "dmn", cm_dmn, BRACE_ARGS },
1711076333cSespie   { "docbook", cm_docbook, NO_BRACE_ARGS },
1723fb98d4aSespie   { "documentdescription", cm_documentdescription, NO_BRACE_ARGS },
1731cc83814Sespie   { "documentencoding", cm_documentencoding, NO_BRACE_ARGS },
1741cc83814Sespie   { "documentlanguage", cm_documentlanguage, NO_BRACE_ARGS },
1751cc83814Sespie   { "dotaccent", cm_accent, MAYBE_BRACE_ARGS },
1761cc83814Sespie   { "dotless", cm_dotless, BRACE_ARGS },
1771cc83814Sespie   { "dots", cm_dots, BRACE_ARGS },
1781cc83814Sespie   { "email", cm_email, BRACE_ARGS },
1791cc83814Sespie   { "emph", cm_emph, BRACE_ARGS },
1801cc83814Sespie   { "end", cm_end, NO_BRACE_ARGS },
1811cc83814Sespie   { "enddots", cm_enddots, BRACE_ARGS },
1821cc83814Sespie   { "enumerate", cm_enumerate, NO_BRACE_ARGS },
1831cc83814Sespie   { "env", cm_code, BRACE_ARGS },
1841cc83814Sespie   { "equiv", cm_equiv, BRACE_ARGS },
1851cc83814Sespie   { "error", cm_error, BRACE_ARGS },
1861076333cSespie   { "euro", cm_special_char, BRACE_ARGS },
1873fb98d4aSespie   { "evenfooting", cm_ignore_line, NO_BRACE_ARGS },
1883fb98d4aSespie   { "evenheading", cm_ignore_line, NO_BRACE_ARGS },
1893fb98d4aSespie   { "everyfooting", cm_ignore_line, NO_BRACE_ARGS },
1903fb98d4aSespie   { "everyheading", cm_ignore_line, NO_BRACE_ARGS },
1911cc83814Sespie   { "example", cm_example, NO_BRACE_ARGS },
1921cc83814Sespie   { "exampleindent", cm_exampleindent, NO_BRACE_ARGS },
1931cc83814Sespie   { "exclamdown", cm_special_char, BRACE_ARGS },
1941cc83814Sespie   { "exdent", cm_exdent, NO_BRACE_ARGS },
1951cc83814Sespie   { "expansion", cm_expansion, BRACE_ARGS },
1961cc83814Sespie   { "file", cm_code, BRACE_ARGS },
1971cc83814Sespie   { "finalout", cm_no_op, NO_BRACE_ARGS },
1981cc83814Sespie   { "findex", cm_findex, NO_BRACE_ARGS },
1991076333cSespie   { "firstparagraphindent", cm_firstparagraphindent, NO_BRACE_ARGS },
2001076333cSespie   { "float", cm_float, NO_BRACE_ARGS },
2011cc83814Sespie   { "flushleft", cm_flushleft, NO_BRACE_ARGS },
2021cc83814Sespie   { "flushright", cm_flushright, NO_BRACE_ARGS },
2031cc83814Sespie   { "footnote", cm_footnote, NO_BRACE_ARGS}, /* self-arg eater */
2041cc83814Sespie   { "footnotestyle", cm_footnotestyle, NO_BRACE_ARGS },
2051cc83814Sespie   { "format", cm_format, NO_BRACE_ARGS },
2061cc83814Sespie   { "ftable", cm_ftable, NO_BRACE_ARGS },
2071cc83814Sespie   { "group", cm_group, NO_BRACE_ARGS },
2081cc83814Sespie   { "heading", cm_heading, NO_BRACE_ARGS },
2091cc83814Sespie   { "headings", cm_ignore_line, NO_BRACE_ARGS },
2101076333cSespie   { "headitem", cm_headitem, NO_BRACE_ARGS },
2111cc83814Sespie   { "html", cm_html, NO_BRACE_ARGS },
2121cc83814Sespie   { "hyphenation", cm_ignore_arg, BRACE_ARGS },
2131cc83814Sespie   { "i", cm_i, BRACE_ARGS },
2141cc83814Sespie   { "ifclear", cm_ifclear, NO_BRACE_ARGS },
2151cc83814Sespie   { "ifeq", cm_ifeq, NO_BRACE_ARGS },
2161076333cSespie   { "ifdocbook", cm_ifdocbook, NO_BRACE_ARGS },
2171cc83814Sespie   { "ifhtml", cm_ifhtml, NO_BRACE_ARGS },
2181cc83814Sespie   { "ifinfo", cm_ifinfo, NO_BRACE_ARGS },
2191076333cSespie   { "ifnotdocbook", cm_ifnotdocbook, NO_BRACE_ARGS },
2201cc83814Sespie   { "ifnothtml", cm_ifnothtml, NO_BRACE_ARGS },
2211cc83814Sespie   { "ifnotinfo", cm_ifnotinfo, NO_BRACE_ARGS },
2223fb98d4aSespie   { "ifnotplaintext", cm_ifnotplaintext, NO_BRACE_ARGS },
2231cc83814Sespie   { "ifnottex", cm_ifnottex, NO_BRACE_ARGS },
2241076333cSespie   { "ifnotxml", cm_ifnotxml, NO_BRACE_ARGS },
2253fb98d4aSespie   { "ifplaintext", cm_ifplaintext, NO_BRACE_ARGS },
2261cc83814Sespie   { "ifset", cm_ifset, NO_BRACE_ARGS },
2271cc83814Sespie   { "iftex", cm_iftex, NO_BRACE_ARGS },
2281076333cSespie   { "ifxml", cm_ifxml, NO_BRACE_ARGS },
2291cc83814Sespie   { "ignore", command_name_condition, NO_BRACE_ARGS },
2301cc83814Sespie   { "image", cm_image, BRACE_ARGS },
2311cc83814Sespie   { "include", cm_include, NO_BRACE_ARGS },
2321076333cSespie   { "indent", cm_indent, NO_BRACE_ARGS },
2331076333cSespie   { "indicateurl", cm_indicate_url, BRACE_ARGS },
2341cc83814Sespie   { "inforef", cm_inforef, BRACE_ARGS },
2353fb98d4aSespie   { "insertcopying", cm_insert_copying, NO_BRACE_ARGS },
2361cc83814Sespie   { "item", cm_item, NO_BRACE_ARGS },
2371cc83814Sespie   { "itemize", cm_itemize, NO_BRACE_ARGS },
2381cc83814Sespie   { "itemx", cm_itemx, NO_BRACE_ARGS },
2391cc83814Sespie   { "kbd", cm_kbd, BRACE_ARGS },
2401cc83814Sespie   { "kbdinputstyle", cm_ignore_line, NO_BRACE_ARGS },
2411cc83814Sespie   { "key", cm_key, BRACE_ARGS },
2421cc83814Sespie   { "kindex", cm_kindex, NO_BRACE_ARGS },
2431cc83814Sespie   { "l", cm_special_char, BRACE_ARGS },
2441cc83814Sespie   { "lisp", cm_lisp, NO_BRACE_ARGS },
2451076333cSespie   { "listoffloats", cm_listoffloats, NO_BRACE_ARGS },
2461cc83814Sespie   { "lowersections", cm_lowersections, NO_BRACE_ARGS },
2471cc83814Sespie   { "macro", cm_macro, NO_BRACE_ARGS },
2481cc83814Sespie   { "majorheading", cm_majorheading, NO_BRACE_ARGS },
2491076333cSespie   { "math", cm_math, BRACE_ARGS },
2501cc83814Sespie   { "menu", cm_menu, NO_BRACE_ARGS },
2511cc83814Sespie   { "minus", cm_minus, BRACE_ARGS },
2521cc83814Sespie   { "multitable", cm_multitable, NO_BRACE_ARGS },
2531cc83814Sespie   { "need", cm_ignore_line, NO_BRACE_ARGS },
2541cc83814Sespie   { "node", cm_node, NO_BRACE_ARGS },
2551076333cSespie   { "noindent", cm_noindent_cmd, NO_BRACE_ARGS },
2561076333cSespie   { "novalidate", cm_novalidate, NO_BRACE_ARGS },
2571cc83814Sespie   { "nwnode", cm_node, NO_BRACE_ARGS },
2581cc83814Sespie   { "o", cm_special_char, BRACE_ARGS },
2593fb98d4aSespie   { "oddfooting", cm_ignore_line, NO_BRACE_ARGS },
2603fb98d4aSespie   { "oddheading", cm_ignore_line, NO_BRACE_ARGS },
2611cc83814Sespie   { "oe", cm_special_char, BRACE_ARGS },
2621cc83814Sespie   { "option", cm_code, BRACE_ARGS },
2631076333cSespie   { "ordf", cm_special_char, BRACE_ARGS },
2641076333cSespie   { "ordm", cm_special_char, BRACE_ARGS },
2651cc83814Sespie   { "page", cm_no_op, NO_BRACE_ARGS },
2661cc83814Sespie   { "pagesizes", cm_ignore_line, NO_BRACE_ARGS },
2671cc83814Sespie   { "paragraphindent", cm_paragraphindent, NO_BRACE_ARGS },
2681cc83814Sespie   { "pindex", cm_pindex, NO_BRACE_ARGS },
2691cc83814Sespie   { "point", cm_point, BRACE_ARGS },
2701cc83814Sespie   { "pounds", cm_special_char, BRACE_ARGS },
2711cc83814Sespie   { "print", cm_print, BRACE_ARGS },
2721cc83814Sespie   { "printindex", cm_printindex, NO_BRACE_ARGS },
2731cc83814Sespie   { "pxref", cm_pxref, BRACE_ARGS },
2741cc83814Sespie   { "questiondown", cm_special_char, BRACE_ARGS },
2751cc83814Sespie   { "quotation", cm_quotation, NO_BRACE_ARGS },
2761cc83814Sespie   { "r", cm_r, BRACE_ARGS },
2771cc83814Sespie   { "raisesections", cm_raisesections, NO_BRACE_ARGS },
2781cc83814Sespie   { "ref", cm_ref, BRACE_ARGS },
2791cc83814Sespie   { "refill", cm_no_op, NO_BRACE_ARGS },
2801076333cSespie   { "registeredsymbol", cm_registeredsymbol, BRACE_ARGS },
2811cc83814Sespie   { "result", cm_result, BRACE_ARGS },
2821cc83814Sespie   { "ringaccent", cm_accent, MAYBE_BRACE_ARGS },
2831cc83814Sespie   { "rmacro", cm_rmacro, NO_BRACE_ARGS },
2841cc83814Sespie   { "samp", cm_code, BRACE_ARGS },
2851076333cSespie   { "sansserif", cm_sansserif, BRACE_ARGS },
2861cc83814Sespie   { "sc", cm_sc, BRACE_ARGS },
2871cc83814Sespie   { "section", cm_section, NO_BRACE_ARGS },
2881cc83814Sespie   { "set", cm_set, NO_BRACE_ARGS },
2891cc83814Sespie   { "setchapternewpage", cm_ignore_line, NO_BRACE_ARGS },
2901cc83814Sespie   { "setchapterstyle", cm_obsolete, NO_BRACE_ARGS },
2911cc83814Sespie   { "setcontentsaftertitlepage", cm_no_op, NO_BRACE_ARGS },
2921cc83814Sespie   { "setfilename", cm_setfilename, NO_BRACE_ARGS },
2931cc83814Sespie   { "setshortcontentsaftertitlepage", cm_no_op, NO_BRACE_ARGS },
2941cc83814Sespie   { "settitle", cm_settitle, NO_BRACE_ARGS },
2951076333cSespie   { "shortcaption", cm_caption, BRACE_ARGS },
2961076333cSespie   { "shortcontents", cm_contents, NO_BRACE_ARGS },
2971cc83814Sespie   { "shorttitlepage", cm_ignore_line, NO_BRACE_ARGS },
2981076333cSespie   { "slanted", cm_slanted, BRACE_ARGS },
2991cc83814Sespie   { "smallbook", cm_ignore_line, NO_BRACE_ARGS },
3001cc83814Sespie   { "smalldisplay", cm_smalldisplay, NO_BRACE_ARGS },
3011cc83814Sespie   { "smallexample", cm_smallexample, NO_BRACE_ARGS },
3021cc83814Sespie   { "smallformat", cm_smallformat, NO_BRACE_ARGS },
3031cc83814Sespie   { "smalllisp", cm_smalllisp, NO_BRACE_ARGS },
3041cc83814Sespie   { "sp", cm_sp, NO_BRACE_ARGS },
3051cc83814Sespie   { "ss", cm_special_char, BRACE_ARGS },
3061cc83814Sespie   { "strong", cm_strong, BRACE_ARGS },
3071cc83814Sespie   { "subheading", cm_subheading, NO_BRACE_ARGS },
3081cc83814Sespie   { "subsection", cm_subsection, NO_BRACE_ARGS },
3091cc83814Sespie   { "subsubheading", cm_subsubheading, NO_BRACE_ARGS },
3101cc83814Sespie   { "subsubsection", cm_subsubsection, NO_BRACE_ARGS },
3111076333cSespie   { "subtitle", cm_titlepage_cmds, NO_BRACE_ARGS },
3121076333cSespie   { "summarycontents", cm_contents, NO_BRACE_ARGS },
3131cc83814Sespie   { "syncodeindex", cm_synindex, NO_BRACE_ARGS },
3141cc83814Sespie   { "synindex", cm_synindex, NO_BRACE_ARGS },
3151cc83814Sespie   { "t", cm_tt, BRACE_ARGS },
3161cc83814Sespie   { "tab", cm_tab, NO_BRACE_ARGS },
3171cc83814Sespie   { "table", cm_table, NO_BRACE_ARGS },
3181cc83814Sespie   { "tex", cm_tex, NO_BRACE_ARGS },
3191076333cSespie   { "tie", cm_tie, BRACE_ARGS },
3201cc83814Sespie   { "tieaccent", cm_accent, MAYBE_BRACE_ARGS },
3211cc83814Sespie   { "tindex", cm_tindex, NO_BRACE_ARGS },
3221076333cSespie   { "title", cm_titlepage_cmds, NO_BRACE_ARGS },
3231cc83814Sespie   { "titlefont", cm_titlefont, BRACE_ARGS },
3241076333cSespie   { "titlepage", cm_titlepage, NO_BRACE_ARGS },
3251cc83814Sespie   { "today", cm_today, BRACE_ARGS },
3261cc83814Sespie   { "top", cm_top, NO_BRACE_ARGS  },
3271cc83814Sespie   { "u", cm_accent, MAYBE_BRACE_ARGS },
3281cc83814Sespie   { "ubaraccent", cm_accent, MAYBE_BRACE_ARGS },
3291cc83814Sespie   { "udotaccent", cm_accent, MAYBE_BRACE_ARGS },
3301cc83814Sespie   { "unmacro", cm_unmacro, NO_BRACE_ARGS },
3311cc83814Sespie   { "unnumbered", cm_unnumbered, NO_BRACE_ARGS },
3321cc83814Sespie   { "unnumberedsec", cm_unnumberedsec, NO_BRACE_ARGS },
3331cc83814Sespie   { "unnumberedsubsec", cm_unnumberedsubsec, NO_BRACE_ARGS },
3341cc83814Sespie   { "unnumberedsubsubsec", cm_unnumberedsubsubsec, NO_BRACE_ARGS },
3351cc83814Sespie   { "uref", cm_uref, BRACE_ARGS },
3361076333cSespie   { "url", cm_uref, BRACE_ARGS },
3371cc83814Sespie   { "v", cm_accent, MAYBE_BRACE_ARGS },
3381cc83814Sespie   { "value", cm_value, BRACE_ARGS },
3391cc83814Sespie   { "var", cm_var, BRACE_ARGS },
3403fb98d4aSespie   { "verb", cm_verb, NO_BRACE_ARGS },
3413fb98d4aSespie   { "verbatim", cm_verbatim, NO_BRACE_ARGS },
3423fb98d4aSespie   { "verbatiminclude", cm_verbatiminclude, NO_BRACE_ARGS },
3431cc83814Sespie   { "vindex", cm_vindex, NO_BRACE_ARGS },
3441cc83814Sespie   { "vtable", cm_vtable, NO_BRACE_ARGS },
3451076333cSespie   { "vskip", cm_ignore_line, NO_BRACE_ARGS },
3461cc83814Sespie   { "w", cm_w, BRACE_ARGS },
3471076333cSespie   { "xml", cm_xml, NO_BRACE_ARGS },
3481cc83814Sespie   { "xref", cm_xref, BRACE_ARGS },
3491cc83814Sespie 
3501cc83814Sespie   /* Deprecated commands.  These used to be for italics.  */
3511cc83814Sespie   { "iappendix", cm_ideprecated, NO_BRACE_ARGS },
3521cc83814Sespie   { "iappendixsec", cm_ideprecated, NO_BRACE_ARGS },
3531cc83814Sespie   { "iappendixsection", cm_ideprecated, NO_BRACE_ARGS },
3541cc83814Sespie   { "iappendixsubsec", cm_ideprecated, NO_BRACE_ARGS },
3551cc83814Sespie   { "iappendixsubsubsec", cm_ideprecated, NO_BRACE_ARGS },
3561cc83814Sespie   { "ichapter", cm_ideprecated, NO_BRACE_ARGS },
3571cc83814Sespie   { "isection", cm_ideprecated, NO_BRACE_ARGS },
3581cc83814Sespie   { "isubsection", cm_ideprecated, NO_BRACE_ARGS },
3591cc83814Sespie   { "isubsubsection", cm_ideprecated, NO_BRACE_ARGS },
3601cc83814Sespie   { "iunnumbered", cm_ideprecated, NO_BRACE_ARGS },
3611cc83814Sespie   { "iunnumberedsec", cm_ideprecated, NO_BRACE_ARGS },
3621cc83814Sespie   { "iunnumberedsubsec", cm_ideprecated, NO_BRACE_ARGS },
3631cc83814Sespie   { "iunnumberedsubsubsec", cm_ideprecated, NO_BRACE_ARGS },
3641cc83814Sespie 
3651cc83814Sespie   /* Now @include does what this was used to. */
3661cc83814Sespie   { "infoinclude", cm_obsolete, NO_BRACE_ARGS },
3671cc83814Sespie   { "titlespec", cm_obsolete, NO_BRACE_ARGS },
3681cc83814Sespie 
3691cc83814Sespie   { NULL, NULL, NO_BRACE_ARGS }
3701cc83814Sespie };
3711cc83814Sespie 
3721cc83814Sespie /* The bulk of the Texinfo commands. */
3731cc83814Sespie 
3741cc83814Sespie /* Commands which insert their own names. */
3751cc83814Sespie void
insert_self(int arg)3761076333cSespie insert_self (int arg)
3771cc83814Sespie {
3781cc83814Sespie   if (arg == START)
3791cc83814Sespie     add_word (command);
3801cc83814Sespie }
3811cc83814Sespie 
3821cc83814Sespie void
insert_space(int arg)3831076333cSespie insert_space (int arg)
3841cc83814Sespie {
3851cc83814Sespie   if (arg == START)
3863fb98d4aSespie     {
3873fb98d4aSespie       if (xml && !docbook)
3883fb98d4aSespie         xml_insert_entity ("space");
3893fb98d4aSespie       else
3901cc83814Sespie         add_char (' ');
3911cc83814Sespie     }
3923fb98d4aSespie }
3931cc83814Sespie 
3941076333cSespie /* Insert a comma.  Useful when a literal , would break our parsing of
3951076333cSespie    multiple arguments.  */
3961076333cSespie void
cm_comma(int arg)3971076333cSespie cm_comma (int arg)
3981076333cSespie {
3991076333cSespie   if (arg == START)
4001076333cSespie     add_char (',');
4011076333cSespie }
4021076333cSespie 
4031076333cSespie 
4041cc83814Sespie /* Force a line break in the output. */
4051cc83814Sespie void
cm_asterisk(void)4061076333cSespie cm_asterisk (void)
4071cc83814Sespie {
4081cc83814Sespie   if (html)
4091cc83814Sespie     add_word ("<br>");
4103fb98d4aSespie   else if (xml && !docbook)
4113fb98d4aSespie     xml_insert_entity ("linebreak");
4123fb98d4aSespie   else if (docbook)
4133fb98d4aSespie     xml_asterisk ();
4141cc83814Sespie   else
4151cc83814Sespie     {
4161cc83814Sespie       close_single_paragraph ();
4171cc83814Sespie       cm_noindent ();
4181cc83814Sespie     }
4191cc83814Sespie }
4201cc83814Sespie 
4211cc83814Sespie /* Insert ellipsis. */
4221cc83814Sespie void
cm_dots(int arg)4231076333cSespie cm_dots (int arg)
4241cc83814Sespie {
4251cc83814Sespie   if (arg == START)
4263fb98d4aSespie     {
4273fb98d4aSespie       if (xml && !docbook)
4283fb98d4aSespie         xml_insert_entity ("dots");
4293fb98d4aSespie       else if (docbook)
4303fb98d4aSespie         xml_insert_entity ("hellip");
4313fb98d4aSespie       else
4321076333cSespie 	if (html && !in_fixed_width_font)
4331076333cSespie 	  insert_string ("<small class=\"dots\">...</small>");
4341076333cSespie 	else
4351076333cSespie 	  add_word ("...");
4361cc83814Sespie     }
4373fb98d4aSespie }
4381cc83814Sespie 
4391cc83814Sespie /* Insert ellipsis for sentence end. */
4401cc83814Sespie void
cm_enddots(int arg)4411076333cSespie cm_enddots (int arg)
4421cc83814Sespie {
4431cc83814Sespie   if (arg == START)
4443fb98d4aSespie     {
4453fb98d4aSespie       if (xml && !docbook)
4463fb98d4aSespie 	xml_insert_entity ("enddots");
4473fb98d4aSespie       else if (docbook)
4483fb98d4aSespie 	{
4493fb98d4aSespie 	  xml_insert_entity ("hellip");
4503fb98d4aSespie 	  add_char ('.');
4513fb98d4aSespie 	}
4523fb98d4aSespie       else
4531076333cSespie 	if (html && !in_fixed_width_font)
4541076333cSespie 	  insert_string ("<small class=\"enddots\">....</small>");
4551076333cSespie 	else
4561076333cSespie 	  add_word ("....");
4571cc83814Sespie     }
4583fb98d4aSespie }
4591cc83814Sespie 
4601cc83814Sespie void
cm_bullet(int arg)4611076333cSespie cm_bullet (int arg)
4621cc83814Sespie {
4631cc83814Sespie   if (arg == START)
4641cc83814Sespie     {
4651cc83814Sespie       if (html)
4661076333cSespie         add_word ("&bull;");
4673fb98d4aSespie       else if (xml && !docbook)
4683fb98d4aSespie 	xml_insert_entity ("bullet");
4693fb98d4aSespie       else if (docbook)
4703fb98d4aSespie 	xml_insert_entity ("bull");
4711cc83814Sespie       else
4721cc83814Sespie         add_char ('*');
4731cc83814Sespie     }
4741cc83814Sespie }
4751cc83814Sespie 
4761cc83814Sespie void
cm_minus(int arg)4771076333cSespie cm_minus (int arg)
4781cc83814Sespie {
4791cc83814Sespie   if (arg == START)
4803fb98d4aSespie     {
4813fb98d4aSespie       if (xml)
4823fb98d4aSespie 	xml_insert_entity ("minus");
4831076333cSespie       else if (html)
4841076333cSespie         add_word ("&minus;");
4853fb98d4aSespie       else
4861cc83814Sespie 	add_char ('-');
4871cc83814Sespie     }
4883fb98d4aSespie }
4891cc83814Sespie 
4901076333cSespie /* Formatting a dimension unit.  */
4911076333cSespie void
cm_dmn(int arg)4921076333cSespie cm_dmn (int arg)
4931076333cSespie {
4941076333cSespie   if (html)
4951076333cSespie     insert_html_tag_with_attribute (arg, "span", "class=\"dmn\"");
4961076333cSespie   else if (docbook)
4971076333cSespie     /* No units in docbook yet.  */
4981076333cSespie     ;
4991076333cSespie   else if (xml)
5001076333cSespie     xml_insert_element (DIMENSION, arg);
5011076333cSespie }
5021076333cSespie 
5031cc83814Sespie /* Insert "TeX". */
5041cc83814Sespie void
cm_TeX(int arg)5051076333cSespie cm_TeX (int arg)
5061cc83814Sespie {
5071076333cSespie   static int last_position;
5081076333cSespie 
5091cc83814Sespie   if (arg == START)
5103fb98d4aSespie     {
5111076333cSespie       if (xml)
5123fb98d4aSespie 	xml_insert_entity ("tex");
5133fb98d4aSespie       else
5141cc83814Sespie 	add_word ("TeX");
5151076333cSespie 
5161076333cSespie       last_position = output_paragraph_offset;
5171076333cSespie     }
5181076333cSespie   else if (last_position != output_paragraph_offset)
5191076333cSespie     {
5201076333cSespie       warning (_("arguments to @%s ignored"), command);
5211076333cSespie       output_paragraph_offset = last_position;
5221076333cSespie     }
5231076333cSespie }
5241076333cSespie 
5251076333cSespie /* Insert "LaTeX".  */
5261076333cSespie void
cm_LaTeX(int arg)5271076333cSespie cm_LaTeX (int arg)
5281076333cSespie {
5291076333cSespie   static int last_position;
5301076333cSespie 
5311076333cSespie   if (arg == START)
5321076333cSespie     {
5331076333cSespie       if (xml)
5341076333cSespie         xml_insert_entity ("latex");
5351076333cSespie       else
5361076333cSespie         add_word ("LaTeX");
5371076333cSespie 
5381076333cSespie       last_position = output_paragraph_offset;
5391076333cSespie     }
5401076333cSespie   else if (last_position != output_paragraph_offset)
5411076333cSespie     {
5421076333cSespie       warning (_("arguments to @%s ignored"), command);
5431076333cSespie       output_paragraph_offset = last_position;
5441cc83814Sespie     }
5453fb98d4aSespie }
5461cc83814Sespie 
5471cc83814Sespie /* Copyright symbol.  */
5481cc83814Sespie void
cm_copyright(int arg)5491076333cSespie cm_copyright (int arg)
5501cc83814Sespie {
5511cc83814Sespie   if (arg == START)
5523fb98d4aSespie     {
5531cc83814Sespie     if (html)
5541cc83814Sespie       add_word ("&copy;");
5553fb98d4aSespie     else if (xml && !docbook)
5563fb98d4aSespie       xml_insert_entity ("copyright");
5573fb98d4aSespie     else if (docbook)
5583fb98d4aSespie       xml_insert_entity ("copy");
5591cc83814Sespie     else
5601cc83814Sespie       add_word ("(C)");
5611cc83814Sespie     }
5623fb98d4aSespie }
5631cc83814Sespie 
5641076333cSespie /* Registered symbol.  */
5651cc83814Sespie void
cm_registeredsymbol(int arg)5661076333cSespie cm_registeredsymbol (int arg)
5671076333cSespie {
5681076333cSespie   if (arg == START)
5691076333cSespie     {
5701076333cSespie       if (html)
5711076333cSespie         add_word ("&reg;");
5721076333cSespie       else if (docbook)
5731076333cSespie         xml_insert_entity ("reg");
5741076333cSespie       else if (xml && !docbook)
5751076333cSespie         xml_insert_entity ("registered");
5761076333cSespie       else
5771076333cSespie         add_word ("(R)");
5781076333cSespie     }
5791076333cSespie }
5801076333cSespie 
5811076333cSespie void
cm_today(int arg)5821076333cSespie cm_today (int arg)
5831cc83814Sespie {
5841cc83814Sespie   static char *months[12] =
5851cc83814Sespie     { N_("January"), N_("February"), N_("March"), N_("April"), N_("May"),
5861cc83814Sespie       N_("June"), N_("July"), N_("August"), N_("September"), N_("October"),
5871cc83814Sespie       N_("November"), N_("December") };
5881cc83814Sespie   if (arg == START)
5891cc83814Sespie     {
5901cc83814Sespie       time_t timer = time (0);
5911cc83814Sespie       struct tm *ts = localtime (&timer);
5921cc83814Sespie       add_word_args ("%d %s %d", ts->tm_mday, _(months[ts->tm_mon]),
5931cc83814Sespie                      ts->tm_year + 1900);
5941cc83814Sespie     }
5951cc83814Sespie }
5961cc83814Sespie 
5971cc83814Sespie void
cm_comment(void)5981076333cSespie cm_comment (void)
5991cc83814Sespie {
6001076333cSespie   /* For HTML, do not output comments before HTML header is written,
6011076333cSespie      otherwise comments before @settitle cause an empty <title> in the
6021076333cSespie      header.  */
6031076333cSespie   if ((html && html_output_head_p) || xml)
6041076333cSespie     {
6051076333cSespie       char *line;
6061076333cSespie       get_rest_of_line (0, &line);
6071076333cSespie 
6081076333cSespie       if (strlen (line) > 0)
6091076333cSespie         {
6101076333cSespie           int save_inhibit_indentation = inhibit_paragraph_indentation;
6111076333cSespie           int save_paragraph_is_open = paragraph_is_open;
6121076333cSespie           int save_escape_html = escape_html;
6131076333cSespie           int save_xml_no_para = xml_no_para;
6141076333cSespie           int i;
6151076333cSespie 
6161076333cSespie           inhibit_paragraph_indentation = 1;
6171076333cSespie           escape_html = 0;
6181076333cSespie           xml_no_para = 1;
6191076333cSespie 
6201076333cSespie           /* @c and @comment can appear between @item and @itemx,
6211076333cSespie              @deffn and @deffnx.  */
6221076333cSespie           xml_dont_touch_items_defs++;
6231076333cSespie 
6241076333cSespie           /* Use insert for HTML, and XML when indentation is enabled.
6251076333cSespie              For Docbook, use add_char.  */
6261076333cSespie           if (xml && xml_indentation_increment > 0
627*1f65d55cSotto               && output_paragraph_offset > 0
6281076333cSespie               && output_paragraph[output_paragraph_offset-1] != '\n')
6291076333cSespie             insert ('\n');
6301076333cSespie 
6311076333cSespie           /* Crunch double hyphens in comments.  */
6321076333cSespie           add_html_block_elt ("<!-- ");
6331076333cSespie           for (i = 0; i < strlen (line); i++)
6341076333cSespie             if (line[i] != '-' || (i && line[i-1] != '-'))
6351076333cSespie               add_char (line[i]);
6361076333cSespie           add_word (" -->");
6371076333cSespie 
6381cc83814Sespie           if (html)
6391076333cSespie             add_char ('\n');
6401076333cSespie 
6411076333cSespie           inhibit_paragraph_indentation = save_inhibit_indentation;
6421076333cSespie           paragraph_is_open = save_paragraph_is_open;
6431076333cSespie           escape_html = save_escape_html;
6441076333cSespie           xml_no_para = save_xml_no_para;
6451076333cSespie           xml_dont_touch_items_defs--;
6461076333cSespie         }
6471076333cSespie 
6481076333cSespie       free (line);
6491076333cSespie     }
6501076333cSespie   else
6511076333cSespie     cm_ignore_line ();
6521076333cSespie }
6531076333cSespie 
6541076333cSespie 
6551076333cSespie 
6561076333cSespie /* We keep acronyms with two arguments around, to be able to refer to them
6571076333cSespie    later with only one argument.  */
6581076333cSespie static ACRONYM_DESC *acronyms_stack = NULL;
6591076333cSespie 
6601076333cSespie static void
cm_acronym_or_abbr(int arg,int is_abbr)6611076333cSespie cm_acronym_or_abbr (int arg, int is_abbr)
6621076333cSespie {
6631076333cSespie   char *aa, *description;
6641076333cSespie   unsigned len;
6651076333cSespie 
6661076333cSespie   /* We do everything at START.  */
6671076333cSespie   if (arg == END)
6681076333cSespie     return;
6691076333cSespie 
6701076333cSespie   get_until_in_braces (",", &aa);
6711076333cSespie   if (input_text[input_text_offset] == ',')
6721076333cSespie     input_text_offset++;
6731076333cSespie   get_until_in_braces ("}", &description);
6741076333cSespie 
6751076333cSespie   canon_white (aa);
6761076333cSespie   canon_white (description);
6771076333cSespie 
6781076333cSespie   /* If not enclosed in braces, strip after comma to be compatible
6791076333cSespie      with texinfo.tex.  */
6801076333cSespie   if (description[0] != '{' && strchr (description, ',') != NULL)
6811076333cSespie     {
6821076333cSespie       int i = 0;
6831076333cSespie       while (description[i] != ',')
6841076333cSespie         i++;
6851076333cSespie       /* For now, just terminate the string at comma.  */
6861076333cSespie       description[i] = 0;
6871076333cSespie     }
6881076333cSespie 
6891076333cSespie   /* Get description out of braces.  */
6901076333cSespie   if (description[0] == '{')
6911076333cSespie     description++;
6921076333cSespie 
6931076333cSespie   len = strlen (description);
6941076333cSespie   if (len && description[len-1] == '}')
6951076333cSespie     description[len-1] = 0;
6961076333cSespie 
6971076333cSespie   /* Save new description.  */
6981076333cSespie   if (strlen (description) > 0)
6991076333cSespie     {
7001076333cSespie       ACRONYM_DESC *new = xmalloc (sizeof (ACRONYM_DESC));
7011076333cSespie 
7021076333cSespie       new->acronym = xstrdup (aa);
7031076333cSespie       new->description = xstrdup (description);
7041076333cSespie       new->next = acronyms_stack;
7051076333cSespie       acronyms_stack = new;
7061076333cSespie     }
7071076333cSespie 
7081076333cSespie   if (html)
7091076333cSespie     {
7101076333cSespie       add_word (is_abbr ? "<abbr" : "<acronym");
7111076333cSespie 
7121076333cSespie       if (strlen (description) > 0)
7131076333cSespie         add_word_args (" title=\"%s\"", text_expansion (description));
7141076333cSespie       else if (acronyms_stack)
7151076333cSespie         {
7161076333cSespie           /* No second argument, get from previous.  Search order is from
7171076333cSespie              last to first defined, so we get the most recent version of
7181076333cSespie              the description.  */
7191076333cSespie           ACRONYM_DESC *temp = acronyms_stack;
7201076333cSespie 
7211076333cSespie           while (temp)
7221076333cSespie             {
7231076333cSespie               if (STREQ (aa, temp->acronym)
7241076333cSespie                   && strlen (temp->description) > 0)
7251076333cSespie                 {
7261076333cSespie                   add_word_args (" title=\"%s\"",
7271076333cSespie                                  text_expansion (temp->description));
7281076333cSespie                   break;
7291076333cSespie                 }
7301076333cSespie               temp = temp->next;
7311076333cSespie             }
7321076333cSespie         }
7331076333cSespie 
7341076333cSespie       add_char ('>');
7351076333cSespie       execute_string ("%s", aa);
7361076333cSespie       add_word (is_abbr ? "</abbr>" : "</acronym>");
7371076333cSespie     }
7381076333cSespie   else if (docbook)
7391076333cSespie     {
7401076333cSespie       xml_insert_element (is_abbr ? ABBREV : ACRONYM, START);
7411076333cSespie       execute_string ("%s", aa);
7421076333cSespie       xml_insert_element (is_abbr ? ABBREV : ACRONYM, END);
7431076333cSespie     }
7443fb98d4aSespie   else if (xml)
7451076333cSespie     {
7461076333cSespie       xml_insert_element (is_abbr ? ABBREV : ACRONYM, START);
7471076333cSespie 
7481076333cSespie       xml_insert_element (is_abbr ? ABBREVWORD : ACRONYMWORD, START);
7491076333cSespie       execute_string ("%s", aa);
7501076333cSespie       xml_insert_element (is_abbr ? ABBREVWORD : ACRONYMWORD, END);
7511076333cSespie 
7521076333cSespie       if (strlen (description) > 0)
7531076333cSespie         {
7541076333cSespie           xml_insert_element (is_abbr ? ABBREVDESC : ACRONYMDESC, START);
7551076333cSespie           execute_string ("%s", description);
7561076333cSespie           xml_insert_element (is_abbr ? ABBREVDESC : ACRONYMDESC, END);
7571076333cSespie         }
7581076333cSespie 
7591076333cSespie       xml_insert_element (is_abbr ? ABBREV : ACRONYM, END);
7601076333cSespie     }
7611076333cSespie   else
7621076333cSespie     execute_string ("%s", aa);
7631076333cSespie 
7641076333cSespie   /* Put description into parenthesis after the acronym for all outputs
7651076333cSespie      except XML.  */
7661076333cSespie   if (strlen (description) > 0 && (!xml || docbook))
7671076333cSespie     add_word_args (" (%s)", description);
7681cc83814Sespie }
7691cc83814Sespie 
7701cc83814Sespie void
cm_acronym(int arg)7711076333cSespie cm_acronym (int arg)
7721076333cSespie {
7731076333cSespie   cm_acronym_or_abbr (arg, 0);
7741076333cSespie }
7751076333cSespie 
7761076333cSespie void
cm_abbr(int arg)7771076333cSespie cm_abbr (int arg)
7781076333cSespie {
7791076333cSespie   cm_acronym_or_abbr (arg, 1);
7801076333cSespie }
7811076333cSespie 
7821076333cSespie void
cm_tt(int arg)7831076333cSespie cm_tt (int arg)
7841cc83814Sespie {
7851cc83814Sespie   /* @t{} is a no-op in Info.  */
7861cc83814Sespie   if (html)
7871cc83814Sespie     insert_html_tag (arg, "tt");
7883fb98d4aSespie   else if (xml)
7893fb98d4aSespie     xml_insert_element (TT, arg);
7901cc83814Sespie }
7911cc83814Sespie 
7921cc83814Sespie void
cm_code(int arg)7931076333cSespie cm_code (int arg)
7941cc83814Sespie {
7951076333cSespie   if (arg == START)
7961076333cSespie     in_fixed_width_font++;
7971076333cSespie 
7983fb98d4aSespie   if (xml)
7991076333cSespie     {
8001076333cSespie       if (STREQ (command, "command"))
8011076333cSespie 	xml_insert_element (COMMAND_TAG, arg);
8021076333cSespie       else if (STREQ (command, "env"))
8031076333cSespie 	xml_insert_element (ENV, arg);
8041076333cSespie       else if (STREQ (command, "file"))
8051076333cSespie 	xml_insert_element (FILE_TAG, arg);
8061076333cSespie       else if (STREQ (command, "option"))
8071076333cSespie 	xml_insert_element (OPTION, arg);
8081076333cSespie       else if (STREQ (command, "samp"))
8091076333cSespie         {
8101076333cSespie           if (docbook && arg == START)
8111076333cSespie             {
8121076333cSespie               /* Even though @samp is in_fixed_width_font, it
8131076333cSespie                  should always start a paragraph.  Unfortunately,
8141076333cSespie                  in_fixed_width_font inhibits that.  */
8151076333cSespie               xml_start_para ();
8161076333cSespie               xml_insert_entity ("lsquo");
8171076333cSespie             }
8181076333cSespie           xml_insert_element (SAMP, arg);
8191076333cSespie           if (docbook && arg == END)
8201076333cSespie             xml_insert_entity ("rsquo");
8211076333cSespie         }
8221076333cSespie       else
8233fb98d4aSespie 	xml_insert_element (CODE, arg);
8241076333cSespie     }
8251076333cSespie   else if (html)
8261076333cSespie     {
8271076333cSespie       if (STREQ (command, "code"))
8281076333cSespie         insert_html_tag (arg, "code");
8291076333cSespie       else
8301076333cSespie         { /* Use <samp> tag in general to get typewriter.  */
8311076333cSespie           if (arg == START)
8321076333cSespie             { /* If @samp specifically, add quotes a la TeX output.  */
8331076333cSespie               if (STREQ (command, "samp")) add_char ('`');
8341076333cSespie               add_word ("<samp>");
8351076333cSespie             }
8361076333cSespie           insert_html_tag_with_attribute (arg, "span", "class=\"%s\"",command);
8371076333cSespie           if (arg == END)
8381076333cSespie             {
8391076333cSespie               add_word ("</samp>");
8401076333cSespie               if (STREQ (command, "samp")) add_char ('\'');
8411076333cSespie             }
8421076333cSespie         }
8431076333cSespie     }
8443fb98d4aSespie   else
8453fb98d4aSespie     {
8461cc83814Sespie       extern int printing_index;
8471cc83814Sespie 
8481cc83814Sespie       if (!printing_index)
8491076333cSespie         {
8501076333cSespie           if (arg == START)
8511076333cSespie             add_char ('`');
8521076333cSespie           else
8531cc83814Sespie             add_meta_char ('\'');
8541cc83814Sespie         }
8551cc83814Sespie     }
8563fb98d4aSespie }
8571cc83814Sespie 
8581cc83814Sespie void
cm_kbd(int arg)8591076333cSespie cm_kbd (int arg)
8601cc83814Sespie {
8613fb98d4aSespie   if (xml)
8623fb98d4aSespie     xml_insert_element (KBD, arg);
8633fb98d4aSespie   else if (html)
8641cc83814Sespie     { /* Seems like we should increment in_fixed_width_font for Info
8651cc83814Sespie          format too, but then the quote-omitting special case gets
8661cc83814Sespie          confused.  Punt.  */
8671cc83814Sespie       if (arg == START)
8681cc83814Sespie         in_fixed_width_font++;
8691cc83814Sespie       insert_html_tag (arg, "kbd");
8701cc83814Sespie     }
8711cc83814Sespie   else
8721cc83814Sespie     { /* People use @kbd in an example to get the "user input" font.
8731cc83814Sespie          We don't want quotes in that case.  */
8741cc83814Sespie       if (!in_fixed_width_font)
8751cc83814Sespie         cm_code (arg);
8761cc83814Sespie     }
8771cc83814Sespie }
8781cc83814Sespie 
8791076333cSespie /* Just show a url (http://example.org/..., for example), don't link to it.  */
8801cc83814Sespie void
cm_indicate_url(int arg,int start,int end)8811076333cSespie cm_indicate_url (int arg, int start, int end)
8821cc83814Sespie {
8833fb98d4aSespie   if (xml)
8843fb98d4aSespie     xml_insert_element (URL, arg);
8853fb98d4aSespie   else if (html)
8861cc83814Sespie     {
8871cc83814Sespie       if (arg == START)
8881076333cSespie         add_word ("&lt;");
8891076333cSespie       insert_html_tag (arg, "code");
8901076333cSespie       if (arg != START)
8911076333cSespie         add_word ("&gt;");
8921cc83814Sespie     }
8931cc83814Sespie   else
8941cc83814Sespie     if (arg == START)
8951cc83814Sespie       add_word ("<");
8961cc83814Sespie     else
8971cc83814Sespie       add_word (">");
8981cc83814Sespie }
8991cc83814Sespie 
9001cc83814Sespie void
cm_key(int arg)9011076333cSespie cm_key (int arg)
9021cc83814Sespie {
9033fb98d4aSespie   if (xml)
9043fb98d4aSespie     xml_insert_element (KEY, arg);
9053fb98d4aSespie   else if (html)
9061cc83814Sespie     add_word (arg == START ? "&lt;" : "&gt;");
9071cc83814Sespie   else
9081cc83814Sespie     add_char (arg == START ? '<' : '>');
9091cc83814Sespie }
9101cc83814Sespie 
9111cc83814Sespie /* Handle a command that switches to a non-fixed-width font.  */
9121cc83814Sespie void
not_fixed_width(int arg)9131076333cSespie not_fixed_width (int arg)
9141cc83814Sespie {
9151cc83814Sespie   if (arg == START)
9161cc83814Sespie     in_fixed_width_font = 0;
9171cc83814Sespie }
9181cc83814Sespie 
9191cc83814Sespie /* @var in makeinfo just uppercases the text. */
9201cc83814Sespie void
cm_var(int arg,int start_pos,int end_pos)9211076333cSespie cm_var (int arg, int start_pos, int end_pos)
9221cc83814Sespie {
9233fb98d4aSespie   if (xml)
9243fb98d4aSespie     xml_insert_element (VAR, arg);
9253fb98d4aSespie   else
9263fb98d4aSespie     {
9271cc83814Sespie   not_fixed_width (arg);
9281cc83814Sespie 
9291cc83814Sespie   if (html)
9301cc83814Sespie     insert_html_tag (arg, "var");
9311cc83814Sespie   else if (arg == END)
9321cc83814Sespie     {
9331cc83814Sespie       while (start_pos < end_pos)
9341cc83814Sespie         {
9351cc83814Sespie           unsigned char c = output_paragraph[start_pos];
9361cc83814Sespie           if (strchr ("[](),", c))
9371cc83814Sespie             warning (_("unlikely character %c in @var"), c);
9381cc83814Sespie           output_paragraph[start_pos] = coerce_to_upper (c);
9391cc83814Sespie           start_pos++;
9401cc83814Sespie         }
9411cc83814Sespie     }
9421cc83814Sespie     }
9433fb98d4aSespie }
9441cc83814Sespie 
9451cc83814Sespie void
cm_sc(int arg,int start_pos,int end_pos)9461076333cSespie cm_sc (int arg, int start_pos, int end_pos)
9471cc83814Sespie {
9483fb98d4aSespie   if (xml)
9493fb98d4aSespie     xml_insert_element (SC, arg);
9503fb98d4aSespie   else
9513fb98d4aSespie     {
9521cc83814Sespie       not_fixed_width (arg);
9531cc83814Sespie 
9541cc83814Sespie       if (arg == START)
9551cc83814Sespie         {
9561cc83814Sespie           if (html)
9571076333cSespie             insert_html_tag_with_attribute (arg, "span", "class=\"sc\"");
9581cc83814Sespie         }
9591cc83814Sespie       else
9601cc83814Sespie         {
9613fb98d4aSespie           int all_upper;
9621cc83814Sespie 
9631cc83814Sespie           if (html)
9641076333cSespie             start_pos += sizeof ("<span class=\"sc\">") - 1; /* skip <span> */
9651cc83814Sespie 
9663fb98d4aSespie           /* Avoid the warning below if there's no text inside @sc{}, or
9673fb98d4aSespie              when processing menus under --no-headers.  */
9683fb98d4aSespie           all_upper = start_pos < end_pos;
9693fb98d4aSespie 
9701cc83814Sespie           while (start_pos < end_pos)
9711cc83814Sespie             {
9721cc83814Sespie               unsigned char c = output_paragraph[start_pos];
9731cc83814Sespie               if (!isupper (c))
9741cc83814Sespie                 all_upper = 0;
9751076333cSespie               if (!html)
9761cc83814Sespie                 output_paragraph[start_pos] = coerce_to_upper (c);
9771cc83814Sespie               start_pos++;
9781cc83814Sespie             }
9791cc83814Sespie           if (all_upper)
9801cc83814Sespie             warning (_("@sc argument all uppercase, thus no effect"));
9811cc83814Sespie 
9821cc83814Sespie           if (html)
9831076333cSespie             insert_html_tag (arg, "span");
9841cc83814Sespie         }
9851cc83814Sespie     }
9863fb98d4aSespie }
9871cc83814Sespie 
9881cc83814Sespie void
cm_dfn(int arg,int position)9891076333cSespie cm_dfn (int arg, int position)
9901cc83814Sespie {
9913fb98d4aSespie   if (xml)
9923fb98d4aSespie     xml_insert_element (DFN, arg);
9933fb98d4aSespie   else
9943fb98d4aSespie     {
9951cc83814Sespie   if (html)
9961cc83814Sespie     insert_html_tag (arg, "dfn");
9971cc83814Sespie   else if (arg == START)
9981cc83814Sespie     add_char ('"');
9991cc83814Sespie   else
10001cc83814Sespie     add_meta_char ('"');
10011cc83814Sespie     }
10023fb98d4aSespie }
10031cc83814Sespie 
10041cc83814Sespie void
cm_emph(int arg)10051076333cSespie cm_emph (int arg)
10061cc83814Sespie {
10073fb98d4aSespie   if (xml)
10083fb98d4aSespie     xml_insert_element (EMPH, arg);
10093fb98d4aSespie   else if (html)
10101cc83814Sespie     insert_html_tag (arg, "em");
10111cc83814Sespie   else
10121cc83814Sespie     add_char ('_');
10131cc83814Sespie }
10141cc83814Sespie 
10151cc83814Sespie void
cm_verb(int arg)10161076333cSespie cm_verb (int arg)
10173fb98d4aSespie {
10183fb98d4aSespie   int character;
10191076333cSespie   int delimiter = 0; /* avoid warning */
10203fb98d4aSespie   int seen_end = 0;
10213fb98d4aSespie 
10223fb98d4aSespie   in_fixed_width_font++;
10233fb98d4aSespie   /* are these necessary ? */
10243fb98d4aSespie   last_char_was_newline = 0;
10253fb98d4aSespie 
10263fb98d4aSespie   if (html)
10271076333cSespie     add_word ("<tt>");
10283fb98d4aSespie 
10293fb98d4aSespie   if (input_text_offset < input_text_length)
10303fb98d4aSespie     {
10313fb98d4aSespie       character = curchar ();
10323fb98d4aSespie       if (character == '{')
10333fb98d4aSespie 	input_text_offset++;
10343fb98d4aSespie       else
10353fb98d4aSespie 	line_error (_("`{' expected, but saw `%c'"), character);
10363fb98d4aSespie     }
10373fb98d4aSespie 
10383fb98d4aSespie   if (input_text_offset < input_text_length)
10393fb98d4aSespie     {
10403fb98d4aSespie       delimiter = curchar ();
10413fb98d4aSespie       input_text_offset++;
10423fb98d4aSespie     }
10433fb98d4aSespie 
10443fb98d4aSespie   while (input_text_offset < input_text_length)
10453fb98d4aSespie     {
10463fb98d4aSespie       character = curchar ();
10473fb98d4aSespie 
10483fb98d4aSespie       if (character == '\n')
10493fb98d4aSespie         {
10501076333cSespie           line_number++;
10511076333cSespie           if (html)
10521076333cSespie             add_word ("<br>\n");
10531076333cSespie         }
10541076333cSespie 
10551076333cSespie       else if (html && character == '<')
10561076333cSespie         add_word ("&lt;");
10571076333cSespie 
10581076333cSespie       else if (html && character == '&')
10591076333cSespie         add_word ("&amp;");
10601076333cSespie 
10611076333cSespie       else if (character == delimiter && input_text[input_text_offset+1] == '}')
10621076333cSespie 	{ /* Assume no newlines in END_VERBATIM. */
10633fb98d4aSespie 	  seen_end = 1;
10643fb98d4aSespie 	  input_text_offset++;
10653fb98d4aSespie 	  break;
10663fb98d4aSespie 	}
10673fb98d4aSespie 
10681076333cSespie       else
10693fb98d4aSespie         add_char (character);
10701076333cSespie 
10713fb98d4aSespie       input_text_offset++;
10723fb98d4aSespie     }
10733fb98d4aSespie 
10743fb98d4aSespie   if (!seen_end)
10753fb98d4aSespie     warning (_("end of file inside verb block"));
10763fb98d4aSespie 
10773fb98d4aSespie   if (input_text_offset < input_text_length)
10783fb98d4aSespie     {
10793fb98d4aSespie       character = curchar ();
10803fb98d4aSespie       if (character == '}')
10813fb98d4aSespie 	input_text_offset++;
10823fb98d4aSespie       else
10833fb98d4aSespie 	line_error (_("`}' expected, but saw `%c'"), character);
10843fb98d4aSespie     }
10853fb98d4aSespie 
10863fb98d4aSespie   if (html)
10871076333cSespie     add_word ("</tt>");
10881076333cSespie 
10891076333cSespie   in_fixed_width_font--;
10903fb98d4aSespie }
10913fb98d4aSespie 
10921076333cSespie 
10933fb98d4aSespie void
cm_strong(int arg,int start_pos,int end_pos)10941076333cSespie cm_strong (int arg, int start_pos, int end_pos)
10951cc83814Sespie {
10961076333cSespie   if (docbook && arg == START)
10971076333cSespie     xml_insert_element_with_attribute (B, arg, "role=\"bold\"");
10981076333cSespie   else if (xml)
10993fb98d4aSespie     xml_insert_element (STRONG, arg);
11003fb98d4aSespie   else if (html)
11011cc83814Sespie     insert_html_tag (arg, "strong");
11021cc83814Sespie   else
11031cc83814Sespie     add_char ('*');
11041076333cSespie 
11051076333cSespie   if (!xml && !html && !docbook && !no_headers
11061076333cSespie       && arg == END
11071076333cSespie       && end_pos - start_pos >= 6
11081076333cSespie       && (STRNCASEEQ ((char *) output_paragraph + start_pos, "*Note:", 6)
11091076333cSespie           || STRNCASEEQ ((char *) output_paragraph + start_pos, "*Note ", 6)))
11101076333cSespie     {
11111076333cSespie       /* Translators: "Note:" is literal here and should not be
11121076333cSespie          translated.  @strong{Nota}, say, does not cause the problem.  */
11131076333cSespie       warning (_("@strong{Note...} produces a spurious cross-reference in Info; reword to avoid that"));
11141076333cSespie       /* Adjust the output to avoid writing the bad xref.  */
11151076333cSespie       output_paragraph[start_pos + 5] = '_';
11161076333cSespie     }
11171cc83814Sespie }
11181cc83814Sespie 
11191cc83814Sespie void
cm_cite(int arg,int position)11201076333cSespie cm_cite (int arg, int position)
11211cc83814Sespie {
11223fb98d4aSespie   if (xml)
11233fb98d4aSespie     xml_insert_element (CITE, arg);
11243fb98d4aSespie   else if (html)
11251cc83814Sespie     insert_html_tag (arg, "cite");
11261cc83814Sespie   else
11271cc83814Sespie     {
11281cc83814Sespie       if (arg == START)
11291cc83814Sespie         add_char ('`');
11301cc83814Sespie       else
11311cc83814Sespie         add_char ('\'');
11321cc83814Sespie     }
11331cc83814Sespie }
11341cc83814Sespie 
11351cc83814Sespie /* No highlighting, but argument switches fonts.  */
11361cc83814Sespie void
cm_not_fixed_width(int arg,int start,int end)11371076333cSespie cm_not_fixed_width (int arg, int start, int end)
11381cc83814Sespie {
11393fb98d4aSespie   if (xml)
11403fb98d4aSespie     xml_insert_element (NOTFIXEDWIDTH, arg);
11411cc83814Sespie   not_fixed_width (arg);
11421cc83814Sespie }
11431cc83814Sespie 
11441cc83814Sespie void
cm_i(int arg)11451076333cSespie cm_i (int arg)
11461cc83814Sespie {
11471076333cSespie   /* Make use of <lineannotation> of Docbook, if we are
11481076333cSespie      inside an @example or similar.  */
11491076333cSespie   extern int printing_index;
11501076333cSespie   if (docbook && !filling_enabled && !printing_index)
11511076333cSespie     xml_insert_element (LINEANNOTATION, arg);
11521076333cSespie   else if (xml)
11533fb98d4aSespie     xml_insert_element (I, arg);
11543fb98d4aSespie   else if (html)
11551cc83814Sespie     insert_html_tag (arg, "i");
11561cc83814Sespie   else
11571cc83814Sespie     not_fixed_width (arg);
11581cc83814Sespie }
11591cc83814Sespie 
11601cc83814Sespie void
cm_slanted(int arg)11611076333cSespie cm_slanted (int arg)
11621cc83814Sespie {
11631076333cSespie   /* Make use of <lineannotation> of Docbook, if we are
11641076333cSespie      inside an @example or similar.  */
11651076333cSespie   extern int printing_index;
11661076333cSespie   if (docbook && !filling_enabled && !printing_index)
11671076333cSespie     xml_insert_element (LINEANNOTATION, arg);
11681076333cSespie   else if (xml)
11691076333cSespie     xml_insert_element (SLANTED, arg);
11701076333cSespie   else if (html)
11711076333cSespie     insert_html_tag (arg, "i");
11721076333cSespie   else
11731076333cSespie     not_fixed_width (arg);
11741076333cSespie }
11751076333cSespie 
11761076333cSespie void
cm_b(int arg)11771076333cSespie cm_b (int arg)
11781076333cSespie {
11791076333cSespie   /* See cm_i comments.  */
11801076333cSespie   extern int printing_index;
11811076333cSespie   if (docbook && !filling_enabled && !printing_index)
11821076333cSespie     xml_insert_element (LINEANNOTATION, arg);
11831076333cSespie   else if (docbook && arg == START)
11841076333cSespie     xml_insert_element_with_attribute (B, arg, "role=\"bold\"");
11851076333cSespie   else if (xml)
11863fb98d4aSespie     xml_insert_element (B, arg);
11873fb98d4aSespie   else if (html)
11881cc83814Sespie     insert_html_tag (arg, "b");
11891cc83814Sespie   else
11901cc83814Sespie     not_fixed_width (arg);
11911cc83814Sespie }
11921cc83814Sespie 
11931cc83814Sespie void
cm_r(int arg)11941076333cSespie cm_r (int arg)
11951cc83814Sespie {
11961076333cSespie   /* See cm_i comments.  */
11971cc83814Sespie   extern int printing_index;
11981076333cSespie   if (docbook && !filling_enabled && !printing_index)
11991076333cSespie     xml_insert_element (LINEANNOTATION, arg);
12001076333cSespie   else if (xml)
12011076333cSespie     xml_insert_element (R, arg);
12021076333cSespie   else if (html)
12031076333cSespie     insert_html_tag_with_attribute (arg, "span", "class=\"roman\"");
12041076333cSespie   else
12051cc83814Sespie     not_fixed_width (arg);
12061cc83814Sespie }
12071cc83814Sespie 
12081cc83814Sespie void
cm_sansserif(int arg)12091076333cSespie cm_sansserif (int arg)
12101076333cSespie {
12111076333cSespie   /* See cm_i comments.  */
12121076333cSespie   extern int printing_index;
12131076333cSespie   if (docbook && !filling_enabled && !printing_index)
12141076333cSespie     xml_insert_element (LINEANNOTATION, arg);
12151076333cSespie   else if (xml)
12161076333cSespie     xml_insert_element (SANSSERIF, arg);
12171076333cSespie   else if (html)
12181076333cSespie     insert_html_tag_with_attribute (arg, "span", "class=\"sansserif\"");
12191076333cSespie   else
12201076333cSespie     not_fixed_width (arg);
12211076333cSespie }
12221076333cSespie 
12231076333cSespie void
cm_titlefont(int arg)12241076333cSespie cm_titlefont (int arg)
12251cc83814Sespie {
12263fb98d4aSespie   if (xml)
12273fb98d4aSespie     xml_insert_element (TITLEFONT, arg);
12283fb98d4aSespie   else
12291076333cSespie    {
12301cc83814Sespie      not_fixed_width (arg);
12311076333cSespie      if (html)
12321076333cSespie 	{
12331076333cSespie 	  html_title_written = 1; /* suppress title from @settitle */
12341076333cSespie 	  if (arg == START)
12351076333cSespie 	    add_word ("<h1 class=\"titlefont\">");
12361076333cSespie 	  else
12371076333cSespie 	    add_word ("</h1>\n");
12381076333cSespie 	}
12391076333cSespie    }
12401076333cSespie }
12411076333cSespie 
12421076333cSespie 
12431076333cSespie /* Unfortunately, we cannot interpret @math{} contents like TeX does.  We just
12441076333cSespie    pass them through.  */
12451076333cSespie void
cm_math(int arg)12461076333cSespie cm_math (int arg)
12471076333cSespie {
12481076333cSespie   if (xml && !docbook)
12491076333cSespie     xml_insert_element (MATH, arg);
12501cc83814Sespie }
12511cc83814Sespie 
12521cc83814Sespie /* Various commands are no-op's. */
12531cc83814Sespie void
cm_no_op(void)12541076333cSespie cm_no_op (void)
12551cc83814Sespie {
12561cc83814Sespie }
12571cc83814Sespie 
12581cc83814Sespie 
12591cc83814Sespie /* For proofing single chapters, etc.  */
12601cc83814Sespie void
cm_novalidate(void)12611076333cSespie cm_novalidate (void)
12621cc83814Sespie {
12631cc83814Sespie   validating = 0;
12641cc83814Sespie }
12651cc83814Sespie 
12661cc83814Sespie 
12671cc83814Sespie /* Prevent the argument from being split across two lines. */
12681cc83814Sespie void
cm_w(int arg)12691076333cSespie cm_w (int arg)
12701cc83814Sespie {
12711cc83814Sespie   if (arg == START)
12721cc83814Sespie     non_splitting_words++;
12731cc83814Sespie   else
12741076333cSespie     {
12751076333cSespie       if (docbook || html || xml)
12761076333cSespie         /* This is so @w{$}Log$ doesn't end up as <dollar>Log<dollar>
12771076333cSespie            in the output.  */
12781076333cSespie         insert_string ("<!-- /@w -->");
12791076333cSespie 
12801cc83814Sespie       non_splitting_words--;
12811cc83814Sespie     }
12821076333cSespie }
12831cc83814Sespie 
12841cc83814Sespie 
12851076333cSespie /* An unbreakable word space.  Same as @w{ } for makeinfo, but different
12861076333cSespie    for TeX (the space stretches and stretches, and does not inhibit
12871076333cSespie    hyphenation).  */
12881076333cSespie void
cm_tie(int arg)12891076333cSespie cm_tie (int arg)
12901076333cSespie {
12911076333cSespie   if (arg == START)
12921076333cSespie     {
12931076333cSespie       cm_w (START);
12941076333cSespie       add_char (' ');
12951076333cSespie     }
12961076333cSespie   else
12971076333cSespie     cm_w (END);
12981076333cSespie }
12991076333cSespie 
13001cc83814Sespie /* Explain that this command is obsolete, thus the user shouldn't
13011cc83814Sespie    do anything with it. */
13021cc83814Sespie static void
cm_obsolete(int arg,int start,int end)13031076333cSespie cm_obsolete (int arg, int start, int end)
13041cc83814Sespie {
13051cc83814Sespie   if (arg == START)
13061cc83814Sespie     warning (_("%c%s is obsolete"), COMMAND_PREFIX, command);
13071cc83814Sespie }
13081cc83814Sespie 
13091cc83814Sespie 
13101076333cSespie /* Inhibit the indentation of the next paragraph, but not of following
13111076333cSespie    paragraphs.  */
13121cc83814Sespie void
cm_noindent(void)13131076333cSespie cm_noindent (void)
13141cc83814Sespie {
13151cc83814Sespie   if (!inhibit_paragraph_indentation)
13161cc83814Sespie     inhibit_paragraph_indentation = -1;
13171cc83814Sespie }
13181cc83814Sespie 
13191076333cSespie void
cm_noindent_cmd(void)13201076333cSespie cm_noindent_cmd (void)
13211076333cSespie {
13221076333cSespie   cm_noindent ();
13231076333cSespie   xml_no_indent = 1;
13241076333cSespie   skip_whitespace_and_newlines();
13251076333cSespie 
13261076333cSespie   if (xml)
13271076333cSespie     xml_start_para ();
13281076333cSespie   else if (html && !paragraph_is_open)
13291076333cSespie     add_html_block_elt ("<p class=\"noindent\">");
13301076333cSespie   else
13311076333cSespie     {
13321076333cSespie       paragraph_is_open = 0;
13331076333cSespie       start_paragraph ();
13341076333cSespie     }
13351076333cSespie }
13361076333cSespie 
13371076333cSespie /* Force indentation of the next paragraph. */
13381076333cSespie void
cm_indent(void)13391076333cSespie cm_indent (void)
13401076333cSespie {
13411076333cSespie   inhibit_paragraph_indentation = 0;
13421076333cSespie   xml_no_indent = 0;
13431076333cSespie   skip_whitespace_and_newlines();
13441076333cSespie 
13451076333cSespie   if (xml)
13461076333cSespie     xml_start_para ();
13471076333cSespie   else if (html && !paragraph_is_open)
13481076333cSespie     add_html_block_elt ("<p class=\"indent\">");
13491076333cSespie   else
13501076333cSespie     start_paragraph ();
13511076333cSespie }
13521076333cSespie 
13531cc83814Sespie /* I don't know exactly what to do with this.  Should I allow
13541cc83814Sespie    someone to switch filenames in the middle of output?  Since the
13551cc83814Sespie    file could be partially written, this doesn't seem to make sense.
13561076333cSespie    Another option: ignore it, since they don't really want to
13571cc83814Sespie    switch files.  Finally, complain, or at least warn.  It doesn't
13581cc83814Sespie    really matter, anyway, since this doesn't get executed.  */
13591cc83814Sespie void
cm_setfilename(void)13601076333cSespie cm_setfilename (void)
13611cc83814Sespie {
13621cc83814Sespie   char *filename;
13631cc83814Sespie   get_rest_of_line (1, &filename);
13641cc83814Sespie   /* warning ("`@%s %s' encountered and ignored", command, filename); */
13653fb98d4aSespie   if (xml)
13663fb98d4aSespie     add_word_args ("<setfilename>%s</setfilename>", filename);
13671cc83814Sespie   free (filename);
13681cc83814Sespie }
13691cc83814Sespie 
13701cc83814Sespie void
cm_settitle(void)13711076333cSespie cm_settitle (void)
13721cc83814Sespie {
13733fb98d4aSespie   if (xml)
13743fb98d4aSespie     {
13753fb98d4aSespie       xml_begin_document (current_output_filename);
13763fb98d4aSespie       xml_insert_element (SETTITLE, START);
13771076333cSespie       xml_in_book_title = 1;
13783fb98d4aSespie       get_rest_of_line (0, &title);
13793fb98d4aSespie       execute_string ("%s", title);
13801076333cSespie       xml_in_book_title = 0;
13813fb98d4aSespie       xml_insert_element (SETTITLE, END);
13823fb98d4aSespie     }
13833fb98d4aSespie   else
13841cc83814Sespie     get_rest_of_line (0, &title);
13851cc83814Sespie }
13861cc83814Sespie 
13873fb98d4aSespie 
13881cc83814Sespie /* Ignore argument in braces.  */
13891cc83814Sespie void
cm_ignore_arg(int arg,int start_pos,int end_pos)13901076333cSespie cm_ignore_arg (int arg, int start_pos, int end_pos)
13911cc83814Sespie {
13921cc83814Sespie   if (arg == END)
13931cc83814Sespie     output_paragraph_offset = start_pos;
13941cc83814Sespie }
13951cc83814Sespie 
13961cc83814Sespie /* Ignore argument on rest of line.  */
13971cc83814Sespie void
cm_ignore_line(void)13981076333cSespie cm_ignore_line (void)
13991cc83814Sespie {
14001cc83814Sespie   discard_until ("\n");
14011cc83814Sespie }
14021cc83814Sespie 
14031cc83814Sespie /* Insert the number of blank lines passed as argument. */
14041cc83814Sespie void
cm_sp(void)14051076333cSespie cm_sp (void)
14061cc83814Sespie {
14071cc83814Sespie   int lines;
14081cc83814Sespie   char *line;
14091cc83814Sespie 
14101076333cSespie   /* Due to tricky stuff in execute_string(), @value{} can't be expanded.
14111076333cSespie      So there is really no reason to enable expansion for @sp parameters.  */
14121076333cSespie   get_rest_of_line (0, &line);
14131cc83814Sespie 
14141cc83814Sespie   if (sscanf (line, "%d", &lines) != 1 || lines <= 0)
14151cc83814Sespie     line_error (_("@sp requires a positive numeric argument, not `%s'"), line);
14161cc83814Sespie   else
14173fb98d4aSespie     {
14183fb98d4aSespie       if (xml)
14193fb98d4aSespie 	{
14201076333cSespie           /* @sp can appear between @item and @itemx, @deffn and @deffnx.  */
14211076333cSespie           xml_dont_touch_items_defs++;
14223fb98d4aSespie 	  xml_insert_element_with_attribute (SP, START, "lines=\"%s\"", line);
14233fb98d4aSespie 	  /*	  insert_string (line);*/
14243fb98d4aSespie 	  xml_insert_element (SP, END);
14251076333cSespie           xml_dont_touch_items_defs--;
14263fb98d4aSespie 	}
14273fb98d4aSespie       else
14283fb98d4aSespie         {
14293fb98d4aSespie           /* Must disable filling since otherwise multiple newlines is like
14301cc83814Sespie              multiple spaces.  Must close paragraph since that's what the
14311cc83814Sespie              manual says and that's what TeX does.  */
14321cc83814Sespie           int save_filling_enabled = filling_enabled;
14331cc83814Sespie           filling_enabled = 0;
14341cc83814Sespie 
14353fb98d4aSespie           /* close_paragraph generates an extra blank line.  */
14363fb98d4aSespie           close_single_paragraph ();
14373fb98d4aSespie 
14383fb98d4aSespie           if (lines && html && !executing_string)
14393fb98d4aSespie             html_output_head ();
14401cc83814Sespie 
14411cc83814Sespie           if (html)
14421076333cSespie             add_html_block_elt ("<pre class=\"sp\">\n");
14431076333cSespie 
14441076333cSespie           while (lines--)
14451cc83814Sespie             add_char ('\n');
14461076333cSespie 
14471076333cSespie           if (html)
14481076333cSespie             add_html_block_elt ("</pre>\n");
14491cc83814Sespie 
14501cc83814Sespie           filling_enabled = save_filling_enabled;
14511cc83814Sespie         }
14523fb98d4aSespie     }
14531cc83814Sespie   free (line);
14541cc83814Sespie }
14551cc83814Sespie 
14561cc83814Sespie /* @dircategory LINE outputs INFO-DIR-SECTION LINE, unless --no-headers.  */
14571cc83814Sespie void
cm_dircategory(void)14581076333cSespie cm_dircategory (void)
14591cc83814Sespie {
14601cc83814Sespie   char *line;
14611cc83814Sespie 
14623fb98d4aSespie   if (html || docbook)
14631cc83814Sespie     cm_ignore_line ();
14643fb98d4aSespie   else if (xml)
14653fb98d4aSespie     {
14663fb98d4aSespie       xml_insert_element (DIRCATEGORY, START);
14673fb98d4aSespie       get_rest_of_line (1, &line);
14683fb98d4aSespie       insert_string (line);
14693fb98d4aSespie       free (line);
14703fb98d4aSespie       xml_insert_element (DIRCATEGORY, END);
14713fb98d4aSespie     }
14721cc83814Sespie   else
14731cc83814Sespie     {
14741cc83814Sespie       get_rest_of_line (1, &line);
14751cc83814Sespie 
14761cc83814Sespie       if (!no_headers && !html)
14771cc83814Sespie         {
14781cc83814Sespie           kill_self_indent (-1); /* make sure there's no indentation */
14791cc83814Sespie           insert_string ("INFO-DIR-SECTION ");
14801cc83814Sespie           insert_string (line);
14811cc83814Sespie           insert ('\n');
14821cc83814Sespie         }
14831cc83814Sespie 
14841cc83814Sespie       free (line);
14851cc83814Sespie     }
14861cc83814Sespie }
14871cc83814Sespie 
14881cc83814Sespie /* Start a new line with just this text on it.
14891cc83814Sespie    Then center the line of text.
14903fb98d4aSespie    */
14911cc83814Sespie void
cm_center(void)14921076333cSespie cm_center (void)
14931cc83814Sespie {
14943fb98d4aSespie   if (xml)
14953fb98d4aSespie     {
14961076333cSespie       char *line;
14973fb98d4aSespie       xml_insert_element (CENTER, START);
14981076333cSespie       get_rest_of_line (0, &line);
14991076333cSespie       execute_string ("%s", line);
15003fb98d4aSespie       free (line);
15013fb98d4aSespie       xml_insert_element (CENTER, END);
15023fb98d4aSespie     }
15033fb98d4aSespie   else
15043fb98d4aSespie     {
15051cc83814Sespie       int i, start, length;
15061076333cSespie       char *line;
15071cc83814Sespie       int save_indented_fill = indented_fill;
15081cc83814Sespie       int save_filling_enabled = filling_enabled;
15091cc83814Sespie       int fudge_factor = 1;
15101cc83814Sespie 
15111cc83814Sespie       filling_enabled = indented_fill = 0;
15121cc83814Sespie       cm_noindent ();
15131cc83814Sespie       start = output_paragraph_offset;
15141cc83814Sespie 
15151cc83814Sespie       if (html)
15161076333cSespie         add_html_block_elt ("<div align=\"center\">");
15171cc83814Sespie 
15181cc83814Sespie       inhibit_output_flushing ();
15191076333cSespie       get_rest_of_line (0, &line);
15201076333cSespie       execute_string ("%s", line);
15211cc83814Sespie       free (line);
15221cc83814Sespie       uninhibit_output_flushing ();
15231cc83814Sespie       if (html)
15241076333cSespie         add_html_block_elt ("</div>");
15251cc83814Sespie 
15261cc83814Sespie        else
15271cc83814Sespie          {
15281cc83814Sespie            i = output_paragraph_offset - 1;
15291cc83814Sespie            while (i > (start - 1) && output_paragraph[i] == '\n')
15301cc83814Sespie              i--;
15311cc83814Sespie 
15321cc83814Sespie            output_paragraph_offset = ++i;
15331cc83814Sespie            length = output_paragraph_offset - start;
15341cc83814Sespie 
15351cc83814Sespie            if (length < (fill_column - fudge_factor))
15361cc83814Sespie              {
15371cc83814Sespie                line = xmalloc (1 + length);
15381cc83814Sespie                memcpy (line, (char *)(output_paragraph + start), length);
15391cc83814Sespie 
15401cc83814Sespie                i = (fill_column - fudge_factor - length) / 2;
15411cc83814Sespie                output_paragraph_offset = start;
15421cc83814Sespie 
15431cc83814Sespie                while (i--)
15441cc83814Sespie                  insert (' ');
15451cc83814Sespie 
15461cc83814Sespie                for (i = 0; i < length; i++)
15471cc83814Sespie                  insert (line[i]);
15481cc83814Sespie 
15491cc83814Sespie                free (line);
15501cc83814Sespie              }
15511cc83814Sespie          }
15521cc83814Sespie 
15531cc83814Sespie       insert ('\n');
15541cc83814Sespie       filling_enabled = save_filling_enabled;
15551cc83814Sespie       indented_fill = save_indented_fill;
15561076333cSespie       close_single_paragraph ();
15571076333cSespie       if (looking_at("\n"))
15581076333cSespie         insert ('\n');
15591cc83814Sespie     }
15603fb98d4aSespie }
15611cc83814Sespie 
15621cc83814Sespie /* Show what an expression returns. */
15631cc83814Sespie void
cm_result(int arg)15641076333cSespie cm_result (int arg)
15651cc83814Sespie {
15661cc83814Sespie   if (arg == END)
15671cc83814Sespie     add_word (html ? "=&gt;" : "=>");
15681cc83814Sespie }
15691cc83814Sespie 
15701cc83814Sespie /* What an expression expands to. */
15711cc83814Sespie void
cm_expansion(int arg)15721076333cSespie cm_expansion (int arg)
15731cc83814Sespie {
15741cc83814Sespie   if (arg == END)
15751cc83814Sespie     add_word (html ? "==&gt;" : "==>");
15761cc83814Sespie }
15771cc83814Sespie 
15781cc83814Sespie /* Indicates two expressions are equivalent. */
15791cc83814Sespie void
cm_equiv(int arg)15801076333cSespie cm_equiv (int arg)
15811cc83814Sespie {
15821cc83814Sespie   if (arg == END)
15831cc83814Sespie     add_word ("==");
15841cc83814Sespie }
15851cc83814Sespie 
15861cc83814Sespie /* What an expression may print. */
15871cc83814Sespie void
cm_print(int arg)15881076333cSespie cm_print (int arg)
15891cc83814Sespie {
15901cc83814Sespie   if (arg == END)
15911cc83814Sespie     add_word ("-|");
15921cc83814Sespie }
15931cc83814Sespie 
15941cc83814Sespie /* An error signaled. */
15951cc83814Sespie void
cm_error(int arg)15961076333cSespie cm_error (int arg)
15971cc83814Sespie {
15981cc83814Sespie   if (arg == END)
15991cc83814Sespie     add_word (html ? "error--&gt;" : "error-->");
16001cc83814Sespie }
16011cc83814Sespie 
16021cc83814Sespie /* The location of point in an example of a buffer. */
16031cc83814Sespie void
cm_point(int arg)16041076333cSespie cm_point (int arg)
16051cc83814Sespie {
16061cc83814Sespie   if (arg == END)
16071cc83814Sespie     add_word ("-!-");
16081cc83814Sespie }
16091cc83814Sespie 
16101cc83814Sespie /* @exdent: Start a new line with just this text on it.
16111cc83814Sespie    The text is outdented one level if possible. */
16121cc83814Sespie void
cm_exdent(void)16131076333cSespie cm_exdent (void)
16141cc83814Sespie {
16151cc83814Sespie   char *line;
16161cc83814Sespie   int save_indent = current_indent;
16171cc83814Sespie   int save_in_fixed_width_font = in_fixed_width_font;
16181cc83814Sespie 
16191076333cSespie   /* Read argument.  */
16201cc83814Sespie   get_rest_of_line (0, &line);
16211cc83814Sespie 
16221cc83814Sespie   /* Exdent the output.  Actually this may be a no-op.   */
16231cc83814Sespie   if (current_indent)
16241cc83814Sespie     current_indent -= default_indentation_increment;
16251cc83814Sespie 
16261cc83814Sespie   /* @exdent arg is supposed to be in roman.  */
16271cc83814Sespie   in_fixed_width_font = 0;
16281cc83814Sespie 
16291cc83814Sespie   /* The preceding newline already inserted the `current_indent'.
16301cc83814Sespie      Remove one level's worth.  */
16311cc83814Sespie   kill_self_indent (default_indentation_increment);
16321cc83814Sespie 
16331cc83814Sespie   if (html)
16341cc83814Sespie     add_word ("<br>");
16351076333cSespie   else if (docbook)
16361076333cSespie     xml_insert_element (LINEANNOTATION, START);
16371076333cSespie   else if (xml)
16381076333cSespie     xml_insert_element (EXDENT, START);
16391cc83814Sespie 
16401cc83814Sespie   /* Can't close_single_paragraph, then we lose preceding blank lines.  */
16411cc83814Sespie   flush_output ();
16421cc83814Sespie   execute_string ("%s", line);
16431cc83814Sespie   free (line);
16441cc83814Sespie 
16451cc83814Sespie   if (html)
16461cc83814Sespie     add_word ("<br>");
16471076333cSespie   else if (xml)
16481076333cSespie     {
16491076333cSespie       xml_insert_element (docbook ? LINEANNOTATION : EXDENT, END);
16501076333cSespie       insert ('\n');
16511076333cSespie     }
16521076333cSespie 
16531cc83814Sespie   close_single_paragraph ();
16541cc83814Sespie 
16551cc83814Sespie   current_indent = save_indent;
16561cc83814Sespie   in_fixed_width_font = save_in_fixed_width_font;
16571076333cSespie   if (!xml)
16581076333cSespie     start_paragraph ();
16591cc83814Sespie }
16601cc83814Sespie 
16613fb98d4aSespie /*
16623fb98d4aSespie   Read include-filename, process the include-file:
16633fb98d4aSespie     verbatim_include == 0: process through reader_loop
16643fb98d4aSespie     verbatim_include != 0: process through handle_verbatim_environment
16653fb98d4aSespie  */
16663fb98d4aSespie static void
handle_include(int verbatim_include)16671076333cSespie handle_include (int verbatim_include)
16681cc83814Sespie {
1669f12f0912Skettenis   char *arg, *filename;
16701cc83814Sespie 
16711cc83814Sespie   if (macro_expansion_output_stream && !executing_string)
16721cc83814Sespie     me_append_before_this_command ();
16731cc83814Sespie 
16741076333cSespie   if (!insertion_stack)
16751076333cSespie     close_paragraph ();  /* No blank lines etc. if not at outer level.  */
16761076333cSespie 
1677f12f0912Skettenis   get_rest_of_line (0, &arg);
1678f12f0912Skettenis   /* We really only want to expand @value, but it's easier to just do
1679f12f0912Skettenis      everything.  TeX will only work with @value.  */
1680f12f0912Skettenis   filename = text_expansion (arg);
1681f12f0912Skettenis   free (arg);
16821cc83814Sespie 
16831cc83814Sespie   if (macro_expansion_output_stream && !executing_string)
16841cc83814Sespie     remember_itext (input_text, input_text_offset);
16851cc83814Sespie 
16861cc83814Sespie   pushfile ();
16871cc83814Sespie 
16881cc83814Sespie   /* In verbose mode we print info about including another file. */
16891cc83814Sespie   if (verbose_mode)
16901cc83814Sespie     {
16911cc83814Sespie       int i = 0;
16921cc83814Sespie       FSTACK *stack = filestack;
16931cc83814Sespie 
16941cc83814Sespie       for (i = 0, stack = filestack; stack; stack = stack->next, i++);
16951cc83814Sespie 
16961cc83814Sespie       i *= 2;
16971cc83814Sespie 
16981cc83814Sespie       printf ("%*s", i, "");
16993fb98d4aSespie       printf ("%c%s `%s'\n", COMMAND_PREFIX, command, filename);
17001cc83814Sespie       fflush (stdout);
17011cc83814Sespie     }
17021cc83814Sespie 
17031076333cSespie   if (!find_and_load (filename, 1))
17041cc83814Sespie     {
17051cc83814Sespie       popfile ();
17061cc83814Sespie       line_number--;
17071cc83814Sespie 
17083fb98d4aSespie       /* /wh/bar:5: @include/@verbatiminclude `foo': No such file or dir */
17093fb98d4aSespie       line_error ("%c%s `%s': %s", COMMAND_PREFIX, command, filename,
17101cc83814Sespie                   strerror (errno));
17111cc83814Sespie 
17121cc83814Sespie       free (filename);
17131cc83814Sespie       return;
17141cc83814Sespie     }
17151cc83814Sespie   else
17161cc83814Sespie     {
17171cc83814Sespie       if (macro_expansion_output_stream && !executing_string)
17181cc83814Sespie 	remember_itext (input_text, input_text_offset);
17193fb98d4aSespie 
17203fb98d4aSespie       if (!verbatim_include)
17211cc83814Sespie 	reader_loop ();
17223fb98d4aSespie       else
17233fb98d4aSespie 	handle_verbatim_environment (0);
17241cc83814Sespie     }
17251cc83814Sespie   free (filename);
17261cc83814Sespie   popfile ();
17271cc83814Sespie }
17281cc83814Sespie 
17291cc83814Sespie 
17303fb98d4aSespie /* Include file as if put in @verbatim environment */
17313fb98d4aSespie void
cm_verbatiminclude(void)17321076333cSespie cm_verbatiminclude (void)
17333fb98d4aSespie {
17343fb98d4aSespie   handle_include (1);
17353fb98d4aSespie }
17363fb98d4aSespie 
17373fb98d4aSespie 
17383fb98d4aSespie /* Remember this file, and move onto the next. */
17393fb98d4aSespie void
cm_include(void)17401076333cSespie cm_include (void)
17413fb98d4aSespie {
17423fb98d4aSespie   handle_include (0);
17433fb98d4aSespie }
17443fb98d4aSespie 
17453fb98d4aSespie 
17461cc83814Sespie /* @bye: Signals end of processing.  Easy to make this happen. */
17471cc83814Sespie 
17481cc83814Sespie void
cm_bye(void)17491076333cSespie cm_bye (void)
17501cc83814Sespie {
17511cc83814Sespie   discard_braces (); /* should not have any unclosed braces left */
17521cc83814Sespie   input_text_offset = input_text_length;
17531cc83814Sespie }
17541cc83814Sespie 
17551cc83814Sespie /* @paragraphindent */
17561cc83814Sespie 
17571cc83814Sespie static void
cm_paragraphindent(void)17581076333cSespie cm_paragraphindent (void)
17591cc83814Sespie {
17601cc83814Sespie   char *arg;
17611cc83814Sespie 
17621cc83814Sespie   get_rest_of_line (1, &arg);
17631cc83814Sespie   if (set_paragraph_indent (arg) != 0)
17641cc83814Sespie     line_error (_("Bad argument to %c%s"), COMMAND_PREFIX, command);
17651cc83814Sespie 
17661cc83814Sespie   free (arg);
17671cc83814Sespie }
17681cc83814Sespie 
17691076333cSespie 
17701cc83814Sespie /* @exampleindent: change indentation of example-like environments.   */
17711cc83814Sespie static int
set_example_indentation_increment(char * string)17721076333cSespie set_example_indentation_increment (char *string)
17731cc83814Sespie {
17741cc83814Sespie   if (strcmp (string, "asis") == 0 || strcmp (string, _("asis")) == 0)
17751cc83814Sespie     ;
17761cc83814Sespie   else if (strcmp (string, "none") == 0 || strcmp (string, _("none")) == 0)
17771076333cSespie     example_indentation_increment = 0;
17781076333cSespie   else if (sscanf (string, "%d", &example_indentation_increment) != 1)
17791cc83814Sespie     return -1;
17801cc83814Sespie   return 0;
17811cc83814Sespie }
17821cc83814Sespie 
17831cc83814Sespie static void
cm_exampleindent(void)17841076333cSespie cm_exampleindent (void)
17851cc83814Sespie {
17861cc83814Sespie   char *arg;
17871cc83814Sespie 
17881cc83814Sespie   get_rest_of_line (1, &arg);
17891076333cSespie   if (set_example_indentation_increment (arg) != 0)
17901076333cSespie     line_error (_("Bad argument to @%s"), command);
17911076333cSespie 
17921076333cSespie   if (input_text[input_text_offset] == '\n')
17931076333cSespie     close_single_paragraph ();
17941076333cSespie 
17951076333cSespie   free (arg);
17961076333cSespie }
17971076333cSespie 
17981076333cSespie 
17991076333cSespie /* @firstparagraphindent: suppress indentation in first paragraphs after
18001076333cSespie    headings. */
18011076333cSespie static int
set_firstparagraphindent(char * string)18021076333cSespie set_firstparagraphindent (char *string)
18031076333cSespie {
18041076333cSespie   if (STREQ (string, "insert") || STREQ (string, _("insert")))
18051076333cSespie     do_first_par_indent = 1;
18061076333cSespie   else if (STREQ (string, "none") || STREQ (string, _("none")))
18071076333cSespie     do_first_par_indent = 0;
18081076333cSespie   else
18091076333cSespie     return -1;
18101076333cSespie   return 0;
18111076333cSespie }
18121076333cSespie 
18131076333cSespie static void
cm_firstparagraphindent(void)18141076333cSespie cm_firstparagraphindent (void)
18151076333cSespie {
18161076333cSespie   char *arg;
18171076333cSespie 
18181076333cSespie   get_rest_of_line (1, &arg);
18191076333cSespie   if (set_firstparagraphindent (arg) != 0)
18201cc83814Sespie     line_error (_("Bad argument to %c%s"), COMMAND_PREFIX, command);
18211cc83814Sespie 
18221cc83814Sespie   free (arg);
18231cc83814Sespie }
18241076333cSespie 
18251076333cSespie /* For DocBook and XML, produce &period; for `.@:'. This gives the processing
18261076333cSespie    software a fighting chance to treat it specially by not adding extra space.
18271076333cSespie 
18281076333cSespie    Do this also for ?, !, and :.  */
18291076333cSespie void
cm_colon(void)18301076333cSespie cm_colon (void)
18311076333cSespie {
18321076333cSespie   if (xml)
18331076333cSespie     {
18341076333cSespie       if (strchr (".?!:", input_text[input_text_offset-3]) != NULL)
18351076333cSespie         {
18361076333cSespie           /* Erase literal character that's there, except `>', which is
18371076333cSespie              part of the XML tag.  */
18381076333cSespie           if (output_paragraph[output_paragraph_offset-1] != '>')
18391076333cSespie             output_paragraph_offset--;
18401076333cSespie 
18411076333cSespie           switch (input_text[input_text_offset-3])
18421076333cSespie             {
18431076333cSespie             case '.':
18441076333cSespie               xml_insert_entity ("period");
18451076333cSespie               break;
18461076333cSespie             case '?':
18471076333cSespie               xml_insert_entity ("quest");
18481076333cSespie               break;
18491076333cSespie             case '!':
18501076333cSespie               xml_insert_entity ("excl");
18511076333cSespie               break;
18521076333cSespie             case ':':
18531076333cSespie               xml_insert_entity ("colon");
18541076333cSespie               break;
18551076333cSespie             }
18561076333cSespie         }
18571076333cSespie     }
18581076333cSespie }
18591076333cSespie 
18601076333cSespie /* Ending sentences explicitly.  Currently, only outputs entities for XML
18611076333cSespie    output, for other formats it calls insert_self.  */
18621076333cSespie void
cm_punct(int arg)18631076333cSespie cm_punct (int arg)
18641076333cSespie {
18651076333cSespie   if (xml && !docbook)
18661076333cSespie     {
18671076333cSespie       switch (input_text[input_text_offset-1])
18681076333cSespie         {
18691076333cSespie         case '.':
18701076333cSespie           xml_insert_entity ("eosperiod");
18711076333cSespie           break;
18721076333cSespie         case '?':
18731076333cSespie           xml_insert_entity ("eosquest");
18741076333cSespie           break;
18751076333cSespie         case '!':
18761076333cSespie           xml_insert_entity ("eosexcl");
18771076333cSespie           break;
18781076333cSespie         }
18791076333cSespie     }
18801076333cSespie   else
18811076333cSespie     {
18821076333cSespie       insert_self (arg);
18831076333cSespie     }
18841076333cSespie }
1885