1b725ae77Skettenis#!/bin/sh 2b725ae77Skettenis 3b725ae77Skettenis# User Interface Events. 4b725ae77Skettenis# Copyright 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc. 5b725ae77Skettenis# 6b725ae77Skettenis# Contributed by Cygnus Solutions. 7b725ae77Skettenis# 8b725ae77Skettenis# This file is part of GDB. 9b725ae77Skettenis# 10b725ae77Skettenis# This program is free software; you can redistribute it and/or modify 11b725ae77Skettenis# it under the terms of the GNU General Public License as published by 12b725ae77Skettenis# the Free Software Foundation; either version 2 of the License, or 13b725ae77Skettenis# (at your option) any later version. 14b725ae77Skettenis# 15b725ae77Skettenis# This program is distributed in the hope that it will be useful, 16b725ae77Skettenis# but WITHOUT ANY WARRANTY; without even the implied warranty of 17b725ae77Skettenis# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18b725ae77Skettenis# GNU General Public License for more details. 19b725ae77Skettenis# 20b725ae77Skettenis# You should have received a copy of the GNU General Public License 21b725ae77Skettenis# along with this program; if not, write to the Free Software 22b725ae77Skettenis# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 23b725ae77Skettenis 24b725ae77SkettenisIFS=: 25b725ae77Skettenis 26b725ae77Skettenisread="class returntype function formal actual attrib" 27b725ae77Skettenis 28b725ae77Skettenisfunction_list () 29b725ae77Skettenis{ 30b725ae77Skettenis # category: 31b725ae77Skettenis # # -> disable 32b725ae77Skettenis # * -> compatibility - pointer variable that is initialized 33b725ae77Skettenis # by set_gdb_events(). 34b725ae77Skettenis # ? -> Predicate and function proper. 35b725ae77Skettenis # f -> always call (must have a void returntype) 36b725ae77Skettenis # return-type 37b725ae77Skettenis # name 38b725ae77Skettenis # formal argument list 39b725ae77Skettenis # actual argument list 40b725ae77Skettenis # attributes 41b725ae77Skettenis # description 42b725ae77Skettenis cat <<EOF | 43b725ae77Skettenisf:void:breakpoint_create:int b:b 44b725ae77Skettenisf:void:breakpoint_delete:int b:b 45b725ae77Skettenisf:void:breakpoint_modify:int b:b 46b725ae77Skettenisf:void:tracepoint_create:int number:number 47b725ae77Skettenisf:void:tracepoint_delete:int number:number 48b725ae77Skettenisf:void:tracepoint_modify:int number:number 49b725ae77Skettenisf:void:architecture_changed:void 50b725ae77SkettenisEOF 51b725ae77Skettenis grep -v '^#' 52b725ae77Skettenis} 53b725ae77Skettenis 54b725ae77Sketteniscopyright () 55b725ae77Skettenis{ 56b725ae77Skettenis cat <<EOF 57b725ae77Skettenis/* User Interface Events. 58b725ae77Skettenis 59*11efff7fSkettenis Copyright 1999, 2001, 2002, 2004 Free Software Foundation, Inc. 60b725ae77Skettenis 61b725ae77Skettenis Contributed by Cygnus Solutions. 62b725ae77Skettenis 63b725ae77Skettenis This file is part of GDB. 64b725ae77Skettenis 65b725ae77Skettenis This program is free software; you can redistribute it and/or modify 66b725ae77Skettenis it under the terms of the GNU General Public License as published by 67b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or 68b725ae77Skettenis (at your option) any later version. 69b725ae77Skettenis 70b725ae77Skettenis This program is distributed in the hope that it will be useful, 71b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of 72b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 73b725ae77Skettenis GNU General Public License for more details. 74b725ae77Skettenis 75b725ae77Skettenis You should have received a copy of the GNU General Public License 76b725ae77Skettenis along with this program; if not, write to the Free Software 77b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 78b725ae77Skettenis 79b725ae77Skettenis/* Work in progress */ 80b725ae77Skettenis 81b725ae77Skettenis/* This file was created with the aid of \`\`gdb-events.sh''. 82b725ae77Skettenis 83b725ae77Skettenis The bourn shell script \`\`gdb-events.sh'' creates the files 84b725ae77Skettenis \`\`new-gdb-events.c'' and \`\`new-gdb-events.h and then compares 85b725ae77Skettenis them against the existing \`\`gdb-events.[hc]''. Any differences 86b725ae77Skettenis found being reported. 87b725ae77Skettenis 88b725ae77Skettenis If editing this file, please also run gdb-events.sh and merge any 89b725ae77Skettenis changes into that script. Conversely, when making sweeping changes 90b725ae77Skettenis to this file, modifying gdb-events.sh and using its output may 91b725ae77Skettenis prove easier. */ 92b725ae77Skettenis 93b725ae77SkettenisEOF 94b725ae77Skettenis} 95b725ae77Skettenis 96b725ae77Skettenis# 97b725ae77Skettenis# The .h file 98b725ae77Skettenis# 99b725ae77Skettenis 100b725ae77Skettenisexec > new-gdb-events.h 101b725ae77Sketteniscopyright 102b725ae77Sketteniscat <<EOF 103b725ae77Skettenis 104b725ae77Skettenis#ifndef GDB_EVENTS_H 105b725ae77Skettenis#define GDB_EVENTS_H 106b725ae77SkettenisEOF 107b725ae77Skettenis 108b725ae77Skettenis# pointer declarations 109b725ae77Skettenisecho "" 110b725ae77Skettenisecho "" 111b725ae77Sketteniscat <<EOF 112b725ae77Skettenis/* COMPAT: pointer variables for old, unconverted events. 113b725ae77Skettenis A call to set_gdb_events() will automatically update these. */ 114b725ae77SkettenisEOF 115b725ae77Skettenisecho "" 116b725ae77Skettenisfunction_list | while eval read $read 117b725ae77Skettenisdo 118b725ae77Skettenis case "${class}" in 119b725ae77Skettenis "*" ) 120b725ae77Skettenis echo "extern ${returntype} (*${function}_event) (${formal})${attrib};" 121b725ae77Skettenis ;; 122b725ae77Skettenis esac 123b725ae77Skettenisdone 124b725ae77Skettenis 125b725ae77Skettenis# function typedef's 126b725ae77Skettenisecho "" 127b725ae77Skettenisecho "" 128b725ae77Sketteniscat <<EOF 129b725ae77Skettenis/* Type definition of all hook functions. 130b725ae77Skettenis Recommended pratice is to first declare each hook function using 131b725ae77Skettenis the below ftype and then define it. */ 132b725ae77SkettenisEOF 133b725ae77Skettenisecho "" 134b725ae77Skettenisfunction_list | while eval read $read 135b725ae77Skettenisdo 136b725ae77Skettenis echo "typedef ${returntype} (gdb_events_${function}_ftype) (${formal});" 137b725ae77Skettenisdone 138b725ae77Skettenis 139b725ae77Skettenis# gdb_events object 140b725ae77Skettenisecho "" 141b725ae77Skettenisecho "" 142b725ae77Sketteniscat <<EOF 143b725ae77Skettenis/* gdb-events: object. */ 144b725ae77SkettenisEOF 145b725ae77Skettenisecho "" 146b725ae77Skettenisecho "struct gdb_events" 147b725ae77Skettenisecho " {" 148b725ae77Skettenisfunction_list | while eval read $read 149b725ae77Skettenisdo 150b725ae77Skettenis echo " gdb_events_${function}_ftype *${function}${attrib};" 151b725ae77Skettenisdone 152b725ae77Skettenisecho " };" 153b725ae77Skettenis 154b725ae77Skettenis# function declarations 155b725ae77Skettenisecho "" 156b725ae77Skettenisecho "" 157b725ae77Sketteniscat <<EOF 158b725ae77Skettenis/* Interface into events functions. 159b725ae77Skettenis Where a *_p() predicate is present, it must be called before 160b725ae77Skettenis calling the hook proper. */ 161b725ae77SkettenisEOF 162b725ae77Skettenisfunction_list | while eval read $read 163b725ae77Skettenisdo 164b725ae77Skettenis case "${class}" in 165b725ae77Skettenis "*" ) continue ;; 166b725ae77Skettenis "?" ) 167b725ae77Skettenis echo "extern int ${function}_p (void);" 168b725ae77Skettenis echo "extern ${returntype} ${function}_event (${formal})${attrib};" 169b725ae77Skettenis ;; 170b725ae77Skettenis "f" ) 171b725ae77Skettenis echo "extern ${returntype} ${function}_event (${formal})${attrib};" 172b725ae77Skettenis ;; 173b725ae77Skettenis esac 174b725ae77Skettenisdone 175b725ae77Skettenis 176b725ae77Skettenis# our set function 177b725ae77Sketteniscat <<EOF 178b725ae77Skettenis 179b725ae77Skettenis/* Install custom gdb-events hooks. */ 180*11efff7fSkettenisextern struct gdb_events *deprecated_set_gdb_event_hooks (struct gdb_events *vector); 181b725ae77Skettenis 182b725ae77Skettenis/* Deliver any pending events. */ 183b725ae77Skettenisextern void gdb_events_deliver (struct gdb_events *vector); 184b725ae77Skettenis 185b725ae77Skettenis/* Clear event handlers */ 186b725ae77Skettenisextern void clear_gdb_event_hooks (void); 187b725ae77SkettenisEOF 188b725ae77Skettenis 189b725ae77Skettenis# close it off 190b725ae77Skettenisecho "" 191b725ae77Skettenisecho "#endif" 192b725ae77Skettenisexec 1>&2 193b725ae77Skettenis#../move-if-change new-gdb-events.h gdb-events.h 194b725ae77Skettenisif test -r gdb-events.h 195b725ae77Skettenisthen 196b725ae77Skettenis diff -c gdb-events.h new-gdb-events.h 197b725ae77Skettenis if [ $? = 1 ] 198b725ae77Skettenis then 199b725ae77Skettenis echo "gdb-events.h changed? cp new-gdb-events.h gdb-events.h" 1>&2 200b725ae77Skettenis fi 201b725ae77Sketteniselse 202b725ae77Skettenis echo "File missing? mv new-gdb-events.h gdb-events.h" 1>&2 203b725ae77Skettenisfi 204b725ae77Skettenis 205b725ae77Skettenis 206b725ae77Skettenis 207b725ae77Skettenis# 208b725ae77Skettenis# C file 209b725ae77Skettenis# 210b725ae77Skettenis 211b725ae77Skettenisexec > new-gdb-events.c 212b725ae77Sketteniscopyright 213b725ae77Sketteniscat <<EOF 214b725ae77Skettenis 215b725ae77Skettenis#include "defs.h" 216b725ae77Skettenis#include "gdb-events.h" 217b725ae77Skettenis#include "gdbcmd.h" 218b725ae77Skettenis 219b725ae77Skettenisstatic struct gdb_events null_event_hooks; 220b725ae77Skettenisstatic struct gdb_events queue_event_hooks; 221b725ae77Skettenisstatic struct gdb_events *current_event_hooks = &null_event_hooks; 222b725ae77Skettenis 223b725ae77Skettenisint gdb_events_debug; 224b725ae77SkettenisEOF 225b725ae77Skettenis 226b725ae77Skettenis# function bodies 227b725ae77Skettenisfunction_list | while eval read $read 228b725ae77Skettenisdo 229b725ae77Skettenis case "${class}" in 230b725ae77Skettenis "*" ) continue ;; 231b725ae77Skettenis "?" ) 232b725ae77Sketteniscat <<EOF 233b725ae77Skettenis 234b725ae77Skettenisint 235b725ae77Skettenis${function}_event_p (${formal}) 236b725ae77Skettenis{ 237b725ae77Skettenis return current_event_hooks->${function}; 238b725ae77Skettenis} 239b725ae77Skettenis 240b725ae77Skettenis${returntype} 241b725ae77Skettenis${function}_event (${formal}) 242b725ae77Skettenis{ 243b725ae77Skettenis return current_events->${function} (${actual}); 244b725ae77Skettenis} 245b725ae77SkettenisEOF 246b725ae77Skettenis ;; 247b725ae77Skettenis "f" ) 248b725ae77Sketteniscat <<EOF 249b725ae77Skettenis 250b725ae77Skettenisvoid 251b725ae77Skettenis${function}_event (${formal}) 252b725ae77Skettenis{ 253b725ae77Skettenis if (gdb_events_debug) 254b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "${function}_event\n"); 255b725ae77Skettenis if (!current_event_hooks->${function}) 256b725ae77Skettenis return; 257b725ae77Skettenis current_event_hooks->${function} (${actual}); 258b725ae77Skettenis} 259b725ae77SkettenisEOF 260b725ae77Skettenis ;; 261b725ae77Skettenis esac 262b725ae77Skettenisdone 263b725ae77Skettenis 264b725ae77Skettenis# Set hooks function 265b725ae77Skettenisecho "" 266b725ae77Sketteniscat <<EOF 267b725ae77Skettenisstruct gdb_events * 268*11efff7fSkettenisdeprecated_set_gdb_event_hooks (struct gdb_events *vector) 269b725ae77Skettenis{ 270b725ae77Skettenis struct gdb_events *old_events = current_event_hooks; 271b725ae77Skettenis if (vector == NULL) 272b725ae77Skettenis current_event_hooks = &queue_event_hooks; 273b725ae77Skettenis else 274b725ae77Skettenis current_event_hooks = vector; 275b725ae77Skettenis return old_events; 276b725ae77SkettenisEOF 277b725ae77Skettenisfunction_list | while eval read $read 278b725ae77Skettenisdo 279b725ae77Skettenis case "${class}" in 280b725ae77Skettenis "*" ) 281b725ae77Skettenis echo " ${function}_event = hooks->${function};" 282b725ae77Skettenis ;; 283b725ae77Skettenis esac 284b725ae77Skettenisdone 285b725ae77Sketteniscat <<EOF 286b725ae77Skettenis} 287b725ae77SkettenisEOF 288b725ae77Skettenis 289b725ae77Skettenis# Clear hooks function 290b725ae77Skettenisecho "" 291b725ae77Sketteniscat <<EOF 292b725ae77Skettenisvoid 293b725ae77Skettenisclear_gdb_event_hooks (void) 294b725ae77Skettenis{ 295*11efff7fSkettenis deprecated_set_gdb_event_hooks (&null_event_hooks); 296b725ae77Skettenis} 297b725ae77SkettenisEOF 298b725ae77Skettenis 299b725ae77Skettenis# event type 300b725ae77Skettenisecho "" 301b725ae77Sketteniscat <<EOF 302b725ae77Skettenisenum gdb_event 303b725ae77Skettenis{ 304b725ae77SkettenisEOF 305b725ae77Skettenisfunction_list | while eval read $read 306b725ae77Skettenisdo 307b725ae77Skettenis case "${class}" in 308b725ae77Skettenis "f" ) 309b725ae77Skettenis echo " ${function}," 310b725ae77Skettenis ;; 311b725ae77Skettenis esac 312b725ae77Skettenisdone 313b725ae77Sketteniscat <<EOF 314b725ae77Skettenis nr_gdb_events 315b725ae77Skettenis}; 316b725ae77SkettenisEOF 317b725ae77Skettenis 318b725ae77Skettenis# event data 319b725ae77Skettenisecho "" 320b725ae77Skettenisfunction_list | while eval read $read 321b725ae77Skettenisdo 322b725ae77Skettenis case "${class}" in 323b725ae77Skettenis "f" ) 324b725ae77Skettenis if test ${actual} 325b725ae77Skettenis then 326b725ae77Skettenis echo "struct ${function}" 327b725ae77Skettenis echo " {" 328b725ae77Skettenis echo " `echo ${formal} | tr '[,]' '[;]'`;" 329b725ae77Skettenis echo " };" 330b725ae77Skettenis echo "" 331b725ae77Skettenis fi 332b725ae77Skettenis ;; 333b725ae77Skettenis esac 334b725ae77Skettenisdone 335b725ae77Skettenis 336b725ae77Skettenis# event queue 337b725ae77Sketteniscat <<EOF 338b725ae77Skettenisstruct event 339b725ae77Skettenis { 340b725ae77Skettenis enum gdb_event type; 341b725ae77Skettenis struct event *next; 342b725ae77Skettenis union 343b725ae77Skettenis { 344b725ae77SkettenisEOF 345b725ae77Skettenisfunction_list | while eval read $read 346b725ae77Skettenisdo 347b725ae77Skettenis case "${class}" in 348b725ae77Skettenis "f" ) 349b725ae77Skettenis if test ${actual} 350b725ae77Skettenis then 351b725ae77Skettenis echo " struct ${function} ${function};" 352b725ae77Skettenis fi 353b725ae77Skettenis ;; 354b725ae77Skettenis esac 355b725ae77Skettenisdone 356b725ae77Sketteniscat <<EOF 357b725ae77Skettenis } 358b725ae77Skettenis data; 359b725ae77Skettenis }; 360b725ae77Skettenisstruct event *pending_events; 361b725ae77Skettenisstruct event *delivering_events; 362b725ae77SkettenisEOF 363b725ae77Skettenis 364b725ae77Skettenis# append 365b725ae77Skettenisecho "" 366b725ae77Sketteniscat <<EOF 367b725ae77Skettenisstatic void 368b725ae77Skettenisappend (struct event *new_event) 369b725ae77Skettenis{ 370b725ae77Skettenis struct event **event = &pending_events; 371b725ae77Skettenis while ((*event) != NULL) 372b725ae77Skettenis event = &((*event)->next); 373b725ae77Skettenis (*event) = new_event; 374b725ae77Skettenis (*event)->next = NULL; 375b725ae77Skettenis} 376b725ae77SkettenisEOF 377b725ae77Skettenis 378b725ae77Skettenis# schedule a given event 379b725ae77Skettenisfunction_list | while eval read $read 380b725ae77Skettenisdo 381b725ae77Skettenis case "${class}" in 382b725ae77Skettenis "f" ) 383b725ae77Skettenis echo "" 384b725ae77Skettenis echo "static void" 385b725ae77Skettenis echo "queue_${function} (${formal})" 386b725ae77Skettenis echo "{" 387b725ae77Skettenis echo " struct event *event = XMALLOC (struct event);" 388b725ae77Skettenis echo " event->type = ${function};" 389b725ae77Skettenis for arg in `echo ${actual} | tr '[,]' '[:]' | tr -d '[ ]'`; do 390b725ae77Skettenis echo " event->data.${function}.${arg} = ${arg};" 391b725ae77Skettenis done 392b725ae77Skettenis echo " append (event);" 393b725ae77Skettenis echo "}" 394b725ae77Skettenis ;; 395b725ae77Skettenis esac 396b725ae77Skettenisdone 397b725ae77Skettenis 398b725ae77Skettenis# deliver 399b725ae77Skettenisecho "" 400b725ae77Sketteniscat <<EOF 401b725ae77Skettenisvoid 402b725ae77Skettenisgdb_events_deliver (struct gdb_events *vector) 403b725ae77Skettenis{ 404b725ae77Skettenis /* Just zap any events left around from last time. */ 405b725ae77Skettenis while (delivering_events != NULL) 406b725ae77Skettenis { 407b725ae77Skettenis struct event *event = delivering_events; 408b725ae77Skettenis delivering_events = event->next; 409b725ae77Skettenis xfree (event); 410b725ae77Skettenis } 411b725ae77Skettenis /* Process any pending events. Because one of the deliveries could 412b725ae77Skettenis bail out we move everything off of the pending queue onto an 413b725ae77Skettenis in-progress queue where it can, later, be cleaned up if 414b725ae77Skettenis necessary. */ 415b725ae77Skettenis delivering_events = pending_events; 416b725ae77Skettenis pending_events = NULL; 417b725ae77Skettenis while (delivering_events != NULL) 418b725ae77Skettenis { 419b725ae77Skettenis struct event *event = delivering_events; 420b725ae77Skettenis switch (event->type) 421b725ae77Skettenis { 422b725ae77SkettenisEOF 423b725ae77Skettenisfunction_list | while eval read $read 424b725ae77Skettenisdo 425b725ae77Skettenis case "${class}" in 426b725ae77Skettenis "f" ) 427b725ae77Skettenis echo " case ${function}:" 428b725ae77Skettenis if test ${actual} 429b725ae77Skettenis then 430b725ae77Skettenis echo " vector->${function}" 431b725ae77Skettenis sep=" (" 432b725ae77Skettenis ass="" 433b725ae77Skettenis for arg in `echo ${actual} | tr '[,]' '[:]' | tr -d '[ ]'`; do 434b725ae77Skettenis ass="${ass}${sep}event->data.${function}.${arg}" 435b725ae77Skettenis sep=", 436b725ae77Skettenis " 437b725ae77Skettenis done 438b725ae77Skettenis echo "${ass});" 439b725ae77Skettenis else 440b725ae77Skettenis echo " vector->${function} ();" 441b725ae77Skettenis fi 442b725ae77Skettenis echo " break;" 443b725ae77Skettenis ;; 444b725ae77Skettenis esac 445b725ae77Skettenisdone 446b725ae77Sketteniscat <<EOF 447b725ae77Skettenis } 448b725ae77Skettenis delivering_events = event->next; 449b725ae77Skettenis xfree (event); 450b725ae77Skettenis } 451b725ae77Skettenis} 452b725ae77SkettenisEOF 453b725ae77Skettenis 454b725ae77Skettenis# Finally the initialization 455b725ae77Skettenisecho "" 456b725ae77Sketteniscat <<EOF 457b725ae77Skettenisvoid _initialize_gdb_events (void); 458b725ae77Skettenisvoid 459b725ae77Skettenis_initialize_gdb_events (void) 460b725ae77Skettenis{ 461b725ae77Skettenis struct cmd_list_element *c; 462b725ae77SkettenisEOF 463b725ae77Skettenisfunction_list | while eval read $read 464b725ae77Skettenisdo 465b725ae77Skettenis case "${class}" in 466b725ae77Skettenis "f" ) 467b725ae77Skettenis echo " queue_event_hooks.${function} = queue_${function};" 468b725ae77Skettenis ;; 469b725ae77Skettenis esac 470b725ae77Skettenisdone 471b725ae77Sketteniscat <<EOF 472b725ae77Skettenis 473b725ae77Skettenis c = add_set_cmd ("eventdebug", class_maintenance, var_zinteger, 474b725ae77Skettenis (char *) (&gdb_events_debug), "Set event debugging.\n\\ 475b725ae77SkettenisWhen non-zero, event/notify debugging is enabled.", &setlist); 476b725ae77Skettenis deprecate_cmd (c, "set debug event"); 477*11efff7fSkettenis deprecate_cmd (deprecated_add_show_from_set (c, &showlist), 478*11efff7fSkettenis "show debug event"); 479b725ae77Skettenis 480*11efff7fSkettenis deprecated_add_show_from_set 481*11efff7fSkettenis (add_set_cmd ("event", 482b725ae77Skettenis class_maintenance, 483b725ae77Skettenis var_zinteger, 484b725ae77Skettenis (char *) (&gdb_events_debug), 485b725ae77Skettenis "Set event debugging.\n\\ 486b725ae77SkettenisWhen non-zero, event/notify debugging is enabled.", &setdebuglist), 487b725ae77Skettenis &showdebuglist); 488b725ae77Skettenis} 489b725ae77SkettenisEOF 490b725ae77Skettenis 491b725ae77Skettenis# close things off 492b725ae77Skettenisexec 1>&2 493b725ae77Skettenis#../move-if-change new-gdb-events.c gdb-events.c 494b725ae77Skettenis# Replace any leading spaces with tabs 495b725ae77Skettenissed < new-gdb-events.c > tmp-gdb-events.c \ 496b725ae77Skettenis -e 's/\( \)* /\1 /g' 497b725ae77Skettenismv tmp-gdb-events.c new-gdb-events.c 498b725ae77Skettenis# Move if changed? 499b725ae77Skettenisif test -r gdb-events.c 500b725ae77Skettenisthen 501b725ae77Skettenis diff -c gdb-events.c new-gdb-events.c 502b725ae77Skettenis if [ $? = 1 ] 503b725ae77Skettenis then 504b725ae77Skettenis echo "gdb-events.c changed? cp new-gdb-events.c gdb-events.c" 1>&2 505b725ae77Skettenis fi 506b725ae77Sketteniselse 507b725ae77Skettenis echo "File missing? mv new-gdb-events.c gdb-events.c" 1>&2 508b725ae77Skettenisfi 509