This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[RFA] gdb-events.sh portability update


Hi,

gdb-events.sh will only run on a linux box (maybe BSD, too). It does not
run on Solaris, SunOS, or almost any other host OS because the script does
things like:

1) Assumes that /bin/sh's "if" has built-in logical not.

  if ! test -r file_exits
  then
    # stuf
  fi

and

  if ! diff ...
  then
    # stuff
  fi

2) Some commands assume that IFS is a space:

  for arg in `echo ${args} | tr '[,]' '[ ]'`; do
    # stuff
  done

At the top of this script, we explicitly set it to ":". This bug prevents
using event notifiers with more than one argument, i.e.,

f:void:my_new_event_notifier:int a, void *b:a, b

would produce output like:

  void
  my_new_event_notifier_event (int a, void *b)
  {
      if (gdb_events_debug)
        fprintf_unfiltered (gdb_stdlog, "my_new_event_notifier_event\n");
      if (!current_event_hooks->my_new_event_notifier)
        return;
      current_event_hooks->my_new_event_notifier (a b);
  }

3) Uses "echo" to put strings containing special characters (e.g. \n) into
files:

  echo ""
  echo "fprintf_unfiltered (gdb_stderr, \"This is an error\\n\");"

Different /bin/sh require different levels of escaping. HPUX 10&11, Aix
4.3, and tru64 OSF 1 v 5.1 all exhibit this "problem". (They actually
require: echo "fprintf_unfiltered (gdb_stderr, \"This is an
error\\\\n\");"

The following patch corrects these assumptions/errors. I have tested this
on:

  Red Hat 7.0
  Solaris 5.1, 6, 7, 8
  HPUX B10.20, B11.00
  Aix 4.3
  UnixWare 7.1.0
  tru64 OSF 1 v5.1

This patch does not alter the output of the script at all. It just allows
it to run on more host OSes.

Ok to commit?
Keith

ChangeLog
2001-06-07  Keith Seitz  <keiths@redhat.com>

	* gdb-events.sh: Make if statements and tests
	a little more portable.
	Don't use shell's echo command to put strings containing
	escaped characters into a file -- different flavors of /bin/sh
	require differnt levels of escaping. Use cat <<EOF instead.
	Our internal field separator is a colon. Change all
	commands which assume it is a space.

Patch:
Index: gdb-events.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdb-events.sh,v
retrieving revision 1.7
diff -u -p -r1.7 gdb-events.sh
--- gdb-events.sh	2001/06/06 14:44:42	1.7
+++ gdb-events.sh	2001/06/07 18:14:11
@@ -277,12 +277,15 @@ echo ""
 echo "#endif"
 exec 1>&2
 #../move-if-change new-gdb-events.h gdb-events.h
-if ! test -r gdb-events.h
+if test -r gdb-events.h
 then
+  diff -c gdb-events.h new-gdb-events.h
+  if [ $? = 1 ]
+  then
+    echo "gdb-events.h changed? cp new-gdb-events.h gdb-events.h" 1>&2
+  fi
+else
   echo "File missing? mv new-gdb-events.h gdb-events.h" 1>&2
-elif ! diff -c gdb-events.h new-gdb-events.h
-then
-  echo "gdb-events.h changed? cp new-gdb-events.h gdb-events.h" 1>&2
 fi


@@ -330,30 +333,34 @@ do
   case "${class}" in
     "*" ) continue ;;
     "?" )
-	echo ""
-	echo "int"
-	echo "${function}_event_p (${formal})"
-	echo "{"
-	echo "  return current_event_hooks->${function};"
-	echo "}"
-	echo ""
-	echo "${returntype}"
-	echo "${function}_event (${formal})"
-	echo "{"
-	echo "  return current_events->${function} (${actual});"
-	echo "}"
+cat <<EOF
+
+int
+${function}_event_p (${formal})
+{
+  return current_event_hooks->${function};
+}
+
+${returntype}
+${function}_event (${formal})
+{
+  return current_events->${function} (${actual});
+}
+EOF
 	;;
      "f" )
-	echo ""
-	echo "void"
-	echo "${function}_event (${formal})"
-	echo "{"
-	echo "  if (gdb_events_debug)"
-	echo "    fprintf_unfiltered (gdb_stdlog, \"${function}_event\\n\");"
-	echo "  if (!current_event_hooks->${function})"
-	echo "    return;"
-	echo "  current_event_hooks->${function} (${actual});"
-	echo "}"
+cat <<EOF
+
+void
+${function}_event (${formal})
+{
+  if (gdb_events_debug)
+    fprintf_unfiltered (gdb_stdlog, \"${function}_event\n\");
+  if (!current_event_hooks->${function})
+    return;
+  current_event_hooks->${function} (${actual});
+}
+EOF
 	;;
   esac
 done
@@ -471,7 +478,7 @@ do
       echo "{"
       echo "  struct event *event = XMALLOC (struct event);"
       echo "  event->type = ${function};"
-      for arg in `echo ${actual} | tr '[,]' '[ ]'`; do
+      for arg in `echo ${actual} | tr '[,]' '[:]' | tr -d '[ ]'`; do
         echo "  event->data.${function}.${arg} = ${arg};"
       done
       echo "  append (event);"
@@ -513,7 +520,7 @@ do
       echo "          vector->${function}"
       sep="            ("
       ass=""
-      for arg in `echo ${actual} | tr '[,]' '[ ]'`; do
+      for arg in `echo ${actual} | tr '[,]' '[:]' | tr -d '[ ]'`; do
         ass="${ass}${sep}event->data.${function}.${arg}"
 	sep=",
              "
@@ -576,10 +583,13 @@ sed < new-gdb-events.c > tmp-gdb-events.
     -e 's/\(	\)*        /\1	/g'
 mv tmp-gdb-events.c new-gdb-events.c
 # Move if changed?
-if ! test -r gdb-events.c
+if test -r gdb-events.c
 then
+  diff -c gdb-events.c new-gdb-events.c
+  if [ $? = 1 ]
+  then
+    echo "gdb-events.c changed? cp new-gdb-events.c gdb-events.c" 1>&2
+  fi
+else
   echo "File missing? mv new-gdb-events.c gdb-events.c" 1>&2
-elif ! diff -c gdb-events.c new-gdb-events.c
-then
-  echo "gdb-events.c changed? cp new-gdb-events.c gdb-events.c" 1>&2
 fi



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]