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