diff -urN ../texinfo-3.12s/ChangeLog ./ChangeLog
--- ../texinfo-3.12s/ChangeLog	Tue Aug 17 23:09:13 1999
+++ ./ChangeLog	Tue Aug 31 12:37:42 1999
@@ -1,3 +1,22 @@
+1999-08-31    <janneke@gnu.org>
+
+	* makeinfo/cmds.c: 
+	* makeinfo/insertion.{c,h},
+	* makeinfo/makeinfo.{c,h}: redo of @verbatim, @verb{<char>..<char>}
+	* doc/texinfo.tex: fixed @verb{<char>..<char>}
+
+1999-08-30  Jan Nieuwenhuizen <janneke@gnu.org>
+
+	* makeinfo/cmds.c,
+	* makeinfo/insertion.{c,h},
+	* makeinfo/makeinfo.{c,h}: added @verbatim (and preliminary @verb)
+	support
+	* doc/texinfo.tex: added @verbatim (and preliminary @verb) support
+
+1999-08-24  Jan Nieuwenhuizen <janneke@gnu.org>
+
+	* bf: empty node: makeinfo/node.c:cm_node ()
+
 1999-08-17  Karl Berry  <karl@gnu.org>
 
 	* makeinfo/multi.c,
diff -urN ../texinfo-3.12s/doc/texinfo.tex ./doc/texinfo.tex
--- ../texinfo-3.12s/doc/texinfo.tex	Thu Aug 19 23:16:42 1999
+++ ./doc/texinfo.tex	Tue Aug 31 12:29:16 1999
@@ -4281,6 +4281,68 @@
   \fi
 }
 
+% latex-like '@verbatim..@end verbatim'
+% and @verb{<char>...<char>}
+% if we want to allow any <char> as delimiter, 
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% '@verbx...x' would look like the '@verbx' command.
+% --jcn
+% [Knuth] pp. 344 and 380
+\def\dospecials{\do\ \do\\\do\@\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=12}\dospecials}%
+%
+% 8 spaces for a tab
+{\catcode`\^^I=\active \gdef^^I{\ \ \ \ \ \ \ \ }}
+%
+% disable ligatures ?` and !` of \tt font
+{\catcode`\`=\active\gdef`{\relax\lq}}
+%
+% [Knuth] p. 381
+\def\ATverbatim{\tt%
+  \spaceskip=0pt \xspaceskip=0pt
+  \catcode`\^^I=\active\catcode`\`=\active
+  % don't skip empty lines
+  \def\par{\leavevmode\endgraf}
+  \obeylines \uncatcodespecials \obeyspaces}
+%
+% [Knuth] pp. 351-352
+% respect spaces and define \endgraf \lq \space \obeylines \obeyspaces
+{\obeyspaces \global\let =\ }
+%
+%
+% Do the magic: define the macro \ATxverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\ATxverbatim#1@end verbatim{...}
+%
+% For Texinfo it's a lot easier than for LaTeX, 
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'
+%
+%% include LaTeX hack for completeness -- never know
+%%\begingroup
+%%\catcode`|=0 \catcode`[=1
+%%\catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
+%%\catcode`\\=12|gdef|ATxverbatim#1@end verbatim[
+%%#1|endgroup|def|Everbatim[]|end[verbatim]]
+%%|endgroup
+\begingroup
+\catcode`\ =\active
+\gdef\ATxverbatim#1@end verbatim{
+#1\endgroup\def\Everbatim{}\end{verbatim}}
+\endgroup
+\def\verbatim{\begingroup\ATverbatim\ATxverbatim}
+%
+% [Knuth] p. 382
+\begingroup
+\catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+\gdef\ATverb#1[\def\next{##1#1}[##1\endgroup]\next]
+\endgroup
+\def\verb{\begingroup\ATverbatim\ATverb}
+%
+
 
 \message{defuns,}
 % @defun etc.
Binary files ../texinfo-3.12s/makeinfo/.insertion.c.swp and ./makeinfo/.insertion.c.swp differ
diff -urN ../texinfo-3.12s/makeinfo/cmds.c ./makeinfo/cmds.c
--- ../texinfo-3.12s/makeinfo/cmds.c	Mon Aug  9 22:47:47 1999
+++ ./makeinfo/cmds.c	Tue Aug 31 12:40:45 1999
@@ -45,7 +45,8 @@
   cm_direntry (), cm_dmn (), cm_dots (), cm_emph (), cm_enddots (), cm_i (),
   cm_image (), cm_kbd (), cm_key (), cm_no_op (), 
   cm_novalidate (), cm_not_fixed_width (), cm_r (), cm_shyph (),
-  cm_strong (), cm_var (), cm_sc (), cm_w (), cm_email (), cm_url ();
+  cm_strong (), cm_var (), cm_sc (), cm_w (), cm_email (), cm_url (),
+  cm_verb ();
 
 void
   cm_anchor (), cm_node (), cm_menu (), cm_xref (), cm_ftable (),
@@ -61,7 +62,8 @@
   cm_defcodeindex (), cm_result (), cm_expansion (), cm_equiv (),
   cm_print (), cm_error (), cm_point (), cm_today (), cm_flushleft (),
   cm_flushright (), cm_finalout (), cm_cartouche (), cm_detailmenu (),
-  cm_multitable (), cm_settitle (), cm_titlefont (), cm_tt ();
+  cm_multitable (), cm_settitle (), cm_titlefont (), cm_tt (),
+  cm_verbatim ();
 
 /* Conditionals. */
 void cm_set (), cm_clear (), cm_ifset (), cm_ifclear ();
@@ -320,6 +322,8 @@
   { "v", cm_accent, MAYBE_BRACE_ARGS },
   { "value", cm_value, BRACE_ARGS },
   { "var", cm_var, BRACE_ARGS },
+  { "verb", cm_verb, NO_BRACE_ARGS },
+  { "verbatim", cm_verbatim, NO_BRACE_ARGS },
   { "vindex", cm_vindex, NO_BRACE_ARGS },
   { "vtable", cm_vtable, NO_BRACE_ARGS },
   { "w", cm_w, BRACE_ARGS },
@@ -637,6 +641,75 @@
     insert_html_tag (arg, "em");
   else
     add_char ('_');
+}
+
+void
+cm_verb (arg)
+     int arg;
+{
+  int character;
+  int delimiter;
+  int seen_end = 0;
+
+  close_single_paragraph ();
+  inhibit_paragraph_indentation = 1;
+  in_fixed_width_font++;
+  /* are these necessary ? */
+  filling_enabled = 0;
+  last_char_was_newline = 0;
+
+  if (html)
+    add_word ("<pre>");
+
+  if (input_text_offset < input_text_length)
+    {
+      character = curchar ();
+      if (character == '{')
+	input_text_offset++;
+      else
+	line_error (_ ("`{' expected, but saw `%c'"), character);
+    }
+    
+  if (input_text_offset < input_text_length)
+    {
+      delimiter = curchar ();
+      input_text_offset++;
+    }
+
+  while (input_text_offset < input_text_length)
+    {
+      character = curchar ();
+
+      if (character == '\n')
+        line_number++;
+      /*
+	Assume no newlines in END_VERBATIM
+      */
+      else if (character == delimiter)
+	{
+	  seen_end = 1;
+	  input_text_offset++;
+	  break;
+	}
+
+      add_char (character);
+      input_text_offset++;
+    }
+
+  if (!seen_end)
+    warning (_ ("end of file encountered inside verbatim block"));
+  
+  if (input_text_offset < input_text_length)
+    {
+      character = curchar ();
+      if (character == '}')
+	input_text_offset++;
+      else
+	line_error (_ ("`}' expected, but saw `%c'"), character);
+    }
+
+  if (html)
+    add_word ("/<pre>");
 }
 
 void
diff -urN ../texinfo-3.12s/makeinfo/insertion.c ./makeinfo/insertion.c
--- ../texinfo-3.12s/makeinfo/insertion.c	Mon Jul 19 23:37:36 1999
+++ ./makeinfo/insertion.c	Tue Aug 31 11:51:44 1999
@@ -35,8 +35,8 @@
   "format", "ftable", "group", "ifclear", "ifhtml", "ifinfo",
   "ifnothtml", "ifnotinfo", "ifnottex", "ifset", "iftex", "itemize",
   "lisp", "menu", "multitable", "quotation", "rawhtml", "rawtex",
-  "smalldisplay", "smallexample", "smallformat", "smalllisp", "table",
-  "tex", "vtable", "bad_type"
+  "smalldisplay", "smallexample", "smallformat", "smalllisp",
+  "verbatim", "table", "tex", "vtable", "bad_type"
 };
 
 /* All nested environments.  */
@@ -917,6 +917,53 @@
 {
   do_enumeration (enumerate, "1");
 }
+
+void
+cm_verbatim ()
+{
+  int character;
+  int seen_end = 0;
+
+  close_single_paragraph ();
+  inhibit_paragraph_indentation = 1;
+  in_fixed_width_font++;
+  /* are these necessary ? */
+  filling_enabled = 0;
+  last_char_was_newline = 0;
+
+  if (html)
+    add_word ("<pre>");
+
+  while (input_text_offset < input_text_length)
+    {
+      character = curchar ();
+
+      if (character == '\n')
+        line_number++;
+      /*
+	Assume no newlines in END_VERBATIM
+      */
+      else if (character == COMMAND_PREFIX /* @ */
+	  && (input_text_length - input_text_offset > sizeof (END_VERBATIM))
+	  && !strncmp (&input_text[input_text_offset+1], END_VERBATIM,
+		       sizeof (END_VERBATIM)-1))
+	{
+	  input_text_offset += sizeof (END_VERBATIM);
+	  seen_end = 1;
+	  break;
+	}
+
+      add_char (character);
+      input_text_offset++;
+    }
+
+  if (!seen_end)
+    warning (_ ("end of file encountered inside verbatim block"));
+
+  if (html)
+    add_word ("/<pre>");
+}
+
 
 void
 cm_table ()
diff -urN ../texinfo-3.12s/makeinfo/insertion.h ./makeinfo/insertion.h
--- ../texinfo-3.12s/makeinfo/insertion.h	Wed Jul  7 01:12:58 1999
+++ ./makeinfo/insertion.h	Mon Aug 30 02:03:33 1999
@@ -30,7 +30,7 @@
   ftable, group, ifclear, ifhtml, ifinfo, ifnothtml, ifnotinfo,
   ifnottex, ifset, iftex, itemize, lisp, menu, multitable, quotation,
   rawhtml, rawtex, smalldisplay, smallexample, smallformat, smalllisp,
-  table, tex, vtable, bad_type
+  verbatim, table, tex, vtable, bad_type
 };
 
 typedef struct istack_elt
diff -urN ../texinfo-3.12s/makeinfo/makeinfo.h ./makeinfo/makeinfo.h
--- ../texinfo-3.12s/makeinfo/makeinfo.h	Mon Jul 19 23:16:46 1999
+++ ./makeinfo/makeinfo.h	Tue Aug 31 11:27:29 1999
@@ -225,6 +225,8 @@
 
 #define COMMAND_PREFIX '@'
 
+#define END_VERBATIM "end verbatim"
+
 /* Stuff for splitting large files. */
 #define SPLIT_SIZE_THRESHOLD 70000  /* What's good enough for Stallman... */
 #define DEFAULT_SPLIT_SIZE 50000    /* Is probably good enough for me. */
diff -urN ../texinfo-3.12s/makeinfo/node.c ./makeinfo/node.c
--- ../texinfo-3.12s/makeinfo/node.c	Tue Aug 17 23:06:40 1999
+++ ./makeinfo/node.c	Mon Aug 30 01:41:54 1999
@@ -836,7 +836,7 @@
   if (this_section >= 0)
     current_section = this_section;
 
-  if (strcmp (current_node, "Top") == 0)
+  if (current_node && strcmp (current_node, "Top") == 0)
     top_node_seen = 1;
 
   filling_enabled = 1;

