From 414c76a461489167b0ba3f699f1d996a499efb8c Mon Sep 17 00:00:00 2001
From: Akim Demaille <demaille@gostai.com>
Date: Fri, 18 Jul 2008 10:20:31 +0200
Subject: [PATCH] Fail on parse error in calc++.

	* doc/bison.texinfo (calc++.cc): Propagate failures to the exit
	status.
	* examples/calc++/test ($me, $number, $exit, run): New.
	Use them to propagate errors to the exit status.
---
 ChangeLog            |  8 ++++++++
 doc/bison.texinfo    |  4 ++++
 examples/calc++/test | 37 +++++++++++++++++++++++++++++++++----
 3 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 63d66944..c8bb3016 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-11-03  Akim Demaille  <demaille@gostai.com>
+
+	Fail on parse error in calc++.
+	* doc/bison.texinfo (calc++.cc): Propagate failures to the exit
+	status.
+	* examples/calc++/test ($me, $number, $exit, run): New.
+	Use them to propagate errors to the exit status.
+
 2008-11-03  Akim Demaille  <demaille@gostai.com>
 
 	Don't specify the skeleton twice in the example.
diff --git a/doc/bison.texinfo b/doc/bison.texinfo
index 71e9a16a..6570c0cd 100644
--- a/doc/bison.texinfo
+++ b/doc/bison.texinfo
@@ -8713,6 +8713,7 @@ The top level file, @file{calc++.cc}, poses no problem.
 int
 main (int argc, char *argv[])
 @{
+  int res = 0;
   calcxx_driver driver;
   for (++argv; argv[0]; ++argv)
     if (*argv == std::string ("-p"))
@@ -8721,6 +8722,9 @@ main (int argc, char *argv[])
       driver.trace_scanning = true;
     else if (!driver.parse (*argv))
       std::cout << driver.result << std::endl;
+    else
+      res = 1;
+  return res;
 @}
 @end example
 
diff --git a/examples/calc++/test b/examples/calc++/test
index 2f8a0454..b6f0942c 100755
--- a/examples/calc++/test
+++ b/examples/calc++/test
@@ -5,6 +5,33 @@ test -z "$VERBOSE" && {
    set -x
 }
 
+me=`basename $0`
+
+# Number of the current test.
+number=1
+
+# Exit status of this script.
+exit=true
+
+# run EXPECTED-EXIT-STATUS [PARSER-OPTIONS]
+# -----------------------------------------
+run ()
+{
+  # Effective and expected exit status.
+  local sta_exp=$1
+  shift
+  ./calc++ "$@" input
+  local sta_eff=$?
+  if test $sta_eff -eq $sta_exp; then
+    printf "$me: PASS: %2d\n" $number
+  else
+    printf "$me: FAIL: %2d (expected status: %d, effective: %d\n" \
+        $number $sta_exp $sta_eff
+    exit=false
+  fi
+  number=`expr $number + 1`
+}
+
 cat >input <<EOF
 a := 1
 b := 2
@@ -12,20 +39,22 @@ c := 3
 d := a + b * c
 d
 EOF
+run 0
+run 0 -p
 
-./calc++ input
-./calc++ -p input
 
 cat >input <<EOF
 a := 1
 d := a + b * c
 EOF
-./calc++ input
+run 1 input
+
 
 cat >input <<EOF
 toto := 1
 toto
 EOF
-./calc++ -s input
+run 0 -s
 
 rm input
+$exit
-- 
2.47.2