Re: Interactive behaviour

Eric Blake <[email protected]>
Newsgroups gmane.comp.gnu.m4.patches
Message-ID <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Stepan Kasal on 9/20/2006 5:21 AM:
> Hello,
>   current CVS version of m4 sets interactive mode iff the stdin is a
> tty.  I think it would be better to set interactive mode iff the
> stdin, the stdout, and the stderr are a tty.  (Something like the
> patch below.)

How about something like what POSIX requires of sh (where, of course, m4's
- -e takes the place of sh's -i)?

"If the -i option is present, or if there are no operands and the shell's
standard input and standard error are attached to a terminal, the shell is
considered to be interactive."

As far as I can see, the only reason --interactive is -e instead of -i is
due to command-line compatibility with SysV implementations such as
Solaris m4.  But should I add -i as a synonym for -e as a followon patch?

It didn't help that NEWS didn't mention when -b was added.  Fortunately,
CVS sleuthing isn't too hard, and I found it in version 1.10 of main.c in
Aug 2001, the same month as the mythical 1.4q release (and since I haven't
seen a 1.4q tarball, I just documented it for the upcoming 1.9b).

2006-09-20  Eric Blake  <[email protected]>

	Change the default of interactive sessions to match sh.
	* src/main.c (usage): Document this.
	(enum interactive_choice): New enum.
	(main): Use it to defer decision of interactive until after
	argument processing.
	* doc/m4.texinfo (Invoking m4): Document this.
	* NEWS: Likewise, plus add missing mention of -b.
	Reported by Stepan Kasal.

- --
Life is short - so eat dessert first!

Eric Blake             [email protected]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.1 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFFETp584KuGfSFAYARAuUOAJ9fzLHgnSB67qeDhpuqlGuIOeGj3ACfUO9w
z/d5GK7yAxOcGdKS6HTsMvs=
=9ES4
-----END PGP SIGNATURE-----

_______________________________________________
M4-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/m4-patches
m4.patch162 (text/plain, 5 KB)
Index: NEWS
===================================================================
RCS file: /sources/m4/m4/NEWS,v
retrieving revision 1.17
diff -u -p -r1.17 NEWS
--- NEWS	20 Sep 2006 04:04:29 -0000	1.17
+++ NEWS	20 Sep 2006 12:54:09 -0000
@@ -52,6 +52,12 @@ promoted to 2.0.
 * New `--safer' command-line option cripples the potentially unsafe
   macros `debugfile', `syscmd', `esyscmd', and `maketemp'.
 
+* New `-b'/`--batch' command line option to force non-interactive mode.
+  Also, in addition to `-e'/`--interactive' requesting interactive mode, m4
+  now follows the lead of sh, and automatically enters interactive mode
+  when there are no files specified, and when both standard input and
+  standard error are terminals.
+
 * New `m' flag to `-d'/`--debug' option or `debugmode' macro traces
   actions related to module loading and unloading.  Also, the `--debug'
   option now understands `-' and `+' modifiers, the way `debugmode' has
Index: doc/m4.texinfo
===================================================================
RCS file: /sources/m4/m4/doc/m4.texinfo,v
retrieving revision 1.48
diff -u -p -r1.48 m4.texinfo
--- doc/m4.texinfo	20 Sep 2006 04:04:29 -0000	1.48
+++ doc/m4.texinfo	20 Sep 2006 12:54:10 -0000
@@ -420,8 +420,9 @@ immediately exit @code{m4} without readi
 Makes this invocation of @code{m4} non-interactive.  This means that
 output will be buffered, and interrupts will halt execution.  If neither
 @option{-b} nor @option{-e} are specified, this is activated by default
-if standard input is not a terminal.  If both @option{-b} and
-@option{-e} are specified, only the last one takes effect.
+when any input files are specified, or when either standard input or
+standard error is not a terminal.  If both @option{-b} and @option{-e}
+are specified, only the last one takes effect.
 
 @item -c
 @itemx --discard-comments
@@ -437,8 +438,10 @@ issued, considering all of them to be fa
 Makes this invocation of @code{m4} interactive.  This means that all
 output will be unbuffered, and interrupts will be ignored.  If neither
 @option{-b} nor @option{-e} are specified, this is activated by default
-if standard input is a terminal.  If both @option{-b} and @option{-e}
-are specified, only the last one takes effect.
+when no input files are specified, and when both standard input and
+standard error are terminals (similar to the way that /bin/sh determines
+when to be interactive).  If both @option{-b} and @option{-e} are
+specified, only the last one takes effect.
 
 @item -P
 @itemx --prefix-builtins
Index: src/main.c
===================================================================
RCS file: /sources/m4/m4/src/main.c,v
retrieving revision 1.85
diff -u -p -r1.85 main.c
--- src/main.c	20 Sep 2006 04:04:29 -0000	1.85
+++ src/main.c	20 Sep 2006 12:54:10 -0000
@@ -69,7 +69,8 @@ usage (int status)
       printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
       fputs (_("\
 Process macros in FILEs.\n\
-If no FILE or if FILE is `-', standard input is read.\n\
+If no FILE or if FILE is `-', standard input is read.  With no FILE and both\n\
+standard input and standard output are terminals, -e is implied.\n\
 "), stdout);
       fputs (_("\
 \n\
@@ -225,6 +226,14 @@ static const struct option long_options[
 
 #define OPTSTRING "B:D:EF:GH:I:L:M:N:PQR:S:T:U:bcd::el:m:o:r:st:"
 
+/* For determining whether to be interactive.  */
+enum interactive_choice
+{
+  INTERACTIVE_UNKNOWN,	/* Still processing arguments, no -b or -e yet */
+  INTERACTIVE_YES,	/* -e specified last */
+  INTERACTIVE_NO	/* -b specified last */
+};
+
 int
 main (int argc, char *const *argv, char *const *envp)
 {
@@ -240,6 +249,7 @@ main (int argc, char *const *argv, char 
   bool import_environment = false; /* true to import environment */
   const char *frozen_file_to_read = NULL;
   const char *frozen_file_to_write = NULL;
+  enum interactive_choice interactive = INTERACTIVE_UNKNOWN;
 
   m4 *context;
 
@@ -263,9 +273,6 @@ main (int argc, char *const *argv, char 
   setup_stackovf_trap (argv, envp, stackovf_handler);
 #endif
 
-  if (isatty (STDIN_FILENO))
-    m4_set_interactive_opt (context, true);
-
   if (getenv ("POSIXLY_CORRECT"))
     m4_set_posixly_correct_opt (context, true);
 
@@ -389,7 +396,7 @@ main (int argc, char *const *argv, char 
 	break;
 
       case 'b':
-	m4_set_interactive_opt (context, false);
+	interactive = INTERACTIVE_NO;
 	break;
 
       case 'c':
@@ -410,7 +417,7 @@ main (int argc, char *const *argv, char 
 	break;
 
       case 'e':
-	m4_set_interactive_opt (context, true);
+	interactive = INTERACTIVE_YES;
 	break;
 
       case 'l':
@@ -457,6 +464,15 @@ main (int argc, char *const *argv, char 
 	break;
       }
 
+  /* Interactive if specified, or if no input files and stdin and
+     stderr are terminals, to match sh behavior.  */
+
+  m4_set_interactive_opt (context, (interactive == INTERACTIVE_YES
+				    || (interactive == INTERACTIVE_UNKNOWN
+					&& optind == argc
+					&& isatty (STDIN_FILENO)
+					&& isatty (STDERR_FILENO))));
+
   /* Do the basic initializations.  */
 
   m4_input_init (context);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.