xref: /dragonfly/contrib/gdb-7/gdb/observer.sh (revision 73e0051e)
1#!/bin/sh -e
2
3# Make certain that the script is not running in an internationalized
4# environment.
5LANG=C ; export LANG
6LC_ALL=C ; export LC_ALL
7
8if test $# -ne 3
9then
10    echo "Usage: $0 <h|inc> <observer.texi> <observer.out>" 1>&2
11    exit 0
12fi
13
14lang=$1 ; shift
15texi=$1 ; shift
16o=$1
17case $lang in
18  h) tmp=htmp ;;
19  inc) tmp=itmp ;;
20esac
21otmp="`echo $1 | sed -e 's,\.[^.]*$,,'`.$tmp"; shift
22echo "Creating ${otmp}" 1>&2
23rm -f ${otmp}
24
25# Can use any of the following: cat cmp cp diff echo egrep expr false
26# grep install-info ln ls mkdir mv pwd rm rmdir sed sleep sort tar
27# test touch true
28
29cat <<EOF >>${otmp}
30/* GDB Notifications to Observers.
31
32   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
33
34   This file is part of GDB.
35
36   This program is free software; you can redistribute it and/or modify
37   it under the terms of the GNU General Public License as published by
38   the Free Software Foundation; either version 3 of the License, or
39   (at your option) any later version.
40  
41   This program is distributed in the hope that it will be useful,
42   but WITHOUT ANY WARRANTY; without even the implied warranty of
43   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
44   GNU General Public License for more details.
45  
46   You should have received a copy of the GNU General Public License
47   along with this program.  If not, see <http://www.gnu.org/licenses/>.
48
49   --
50
51   This file was generated using observer.sh and observer.texi.  */
52
53EOF
54
55
56case $lang in
57    h) cat <<EOF >>${otmp}
58#ifndef OBSERVER_H
59#define OBSERVER_H
60
61struct observer;
62struct bpstats;
63struct so_list;
64struct objfile;
65struct thread_info;
66EOF
67        ;;
68esac
69
70# We are about to set IFS=:, so DOS-style file names with a drive
71# letter and a colon will be in trouble.
72
73if test -n "$DJGPP"
74then
75     texi=`echo $texi | sed -e 's,^\([a-zA-Z]\):/,/dev/\1/,'`
76fi
77
78# generate a list of events that can be observed
79
80IFS=:
81sed -n '
82/@deftypefun void/{
83# Save original line for later processing into the actual parameter
84    h
85# Convert from: @deftypefun void EVENT (TYPE @var{PARAM},...)
86# to event and formals: EVENT:TYPE PARAM, ...:
87    s/^.* void \([a-z_][a-z_]*\) (\(.*\))$/\1:\2/
88    s/@var{//g
89    s/}//g
90# Switch to held
91    x
92# Convert from: @deftypefun void FUNC (TYPE @var{PARAM},...)
93# to actuals: PARAM, ...
94    s/^[^{]*[{]*//
95    s/[}]*[^}]*$//
96    s/}[^{]*{/, /g
97# Combine held (EVENT:TYPE PARAM, ...:) and pattern (PARAM, ...) into
98# FUNC:TYPE PARAM, ...:PARAM, ...
99    H
100    x
101    s/\n/:/g
102    p
103}
104' $texi | while read event formal actual
105do
106  case $lang in
107      h) cat <<EOF >>${otmp}
108
109/* ${event} notifications.  */
110
111typedef void (observer_${event}_ftype) (${formal});
112
113extern struct observer *observer_attach_${event} (observer_${event}_ftype *f);
114extern void observer_detach_${event} (struct observer *observer);
115extern void observer_notify_${event} (${formal});
116EOF
117	;;
118
119      inc)
120      	cat <<EOF >>${otmp}
121
122/* ${event} notifications.  */
123
124static struct observer_list *${event}_subject = NULL;
125
126EOF
127	if test "$formal" != "void"; then
128	    cat<<EOF >>${otmp}
129struct ${event}_args { `echo "${formal}" | sed -e 's/,/;/g'`; };
130
131EOF
132	fi
133	cat <<EOF >>${otmp}
134static void
135observer_${event}_notification_stub (const void *data, const void *args_data)
136{
137  observer_${event}_ftype *notify = (observer_${event}_ftype *) data;
138  const struct ${event}_args *args = args_data;
139  notify (`echo ${actual} | sed -e 's/\([a-z0-9_][a-z0-9_]*\)/args->\1/g'`);
140}
141
142struct observer *
143observer_attach_${event} (observer_${event}_ftype *f)
144{
145  return generic_observer_attach (&${event}_subject,
146				  &observer_${event}_notification_stub,
147				  (void *) f);
148}
149
150void
151observer_detach_${event} (struct observer *observer)
152{
153  generic_observer_detach (&${event}_subject, observer);
154}
155
156void
157observer_notify_${event} (${formal})
158{
159EOF
160	if test "$formal" != "void"; then
161	    cat<<EOF >>${otmp}
162  struct ${event}_args args;
163  `echo ${actual} | sed -e 's/\([a-z0-9_][a-z0-9_]*\)/args.\1 = \1/g'`;
164
165EOF
166	else
167	    echo "char *args = NULL;" >> ${otmp}
168	fi
169	cat<<EOF >>${otmp}
170  if (observer_debug)
171    fprintf_unfiltered (gdb_stdlog, "observer_notify_${event}() called\n");
172  generic_observer_notify (${event}_subject, &args);
173}
174EOF
175	;;
176    esac
177done
178
179
180case $lang in
181    h) cat <<EOF >>${otmp}
182
183#endif /* OBSERVER_H */
184EOF
185esac
186
187
188echo Moving ${otmp} to ${o}
189mv ${otmp} ${o}
190