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