home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-01-29 | 40.0 KB | 1,323 lines |
- Newsgroups: comp.sources.misc
- From: dvadura@plg.waterloo.edu (Dennis Vadura)
- Subject: v27i104: dmake - dmake Version 3.8, Part03/41
- Message-ID: <1992Jan28.030958.6726@sparky.imd.sterling.com>
- X-Md4-Signature: 9e359ca55bce5ecd2338ef226e7cab20
- Date: Tue, 28 Jan 1992 03:09:58 GMT
- Approved: kent@sparky.imd.sterling.com
-
- Submitted-by: dvadura@plg.waterloo.edu (Dennis Vadura)
- Posting-number: Volume 27, Issue 104
- Archive-name: dmake/part03
- Environment: Atari-ST, Coherent, Mac, MSDOS, OS/2, UNIX
- Supersedes: dmake: Volume 19, Issue 22-58
-
- ---- Cut Here and feed the following to sh ----
- # this is dmake.shar.03 (part 3 of a multipart archive)
- # do not concatenate these parts, unpack them in order with /bin/sh
- # file dmake/dbug/dbug/dbug.c continued
- #
- if test ! -r _shar_seq_.tmp; then
- echo 'Please unpack part 1 first!'
- exit 1
- fi
- (read Scheck
- if test "$Scheck" != 3; then
- echo Please unpack part "$Scheck" next!
- exit 1
- else
- exit 0
- fi
- ) < _shar_seq_.tmp || exit 1
- if test -f _shar_wnt_.tmp; then
- sed 's/^X//' << 'SHAR_EOF' >> 'dmake/dbug/dbug/dbug.c' &&
- X * profiling is enabled, FALSE otherwise.
- X *
- X */
- X
- LOCAL BOOLEAN DoProfile ()
- {
- X REGISTER BOOLEAN profile;
- X
- X profile = FALSE;
- X if (PROFILING) {
- X if (stack -> level <= stack -> maxdepth) {
- X if (InList (stack -> p_functions, func)) {
- X if (InList (stack -> processes, _db_process_)) {
- X profile = TRUE;
- X }
- X }
- X }
- X }
- X return (profile);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * _db_keyword_ test keyword for member of keyword list
- X *
- X * SYNOPSIS
- X *
- X * BOOLEAN _db_keyword_ (keyword)
- X * char *keyword;
- X *
- X * DESCRIPTION
- X *
- X * Test a keyword to determine if it is in the currently active
- X * keyword list. As with the function list, a keyword is accepted
- X * if the list is null, otherwise it must match one of the list
- X * members. When debugging is not on, no keywords are accepted.
- X * After the maximum trace level is exceeded, no keywords are
- X * accepted (this behavior subject to change). Additionally,
- X * the current function and process must be accepted based on
- X * their respective lists.
- X *
- X * Returns TRUE if keyword accepted, FALSE otherwise.
- X *
- X */
- X
- BOOLEAN _db_keyword_ (keyword)
- char *keyword;
- {
- X REGISTER BOOLEAN accept;
- X
- X if (!init_done) {
- X _db_push_ ("");
- X }
- X accept = FALSE;
- X if (DEBUGGING) {
- X if (stack -> level <= stack -> maxdepth) {
- X if (InList (stack -> functions, func)) {
- X if (InList (stack -> keywords, keyword)) {
- X if (InList (stack -> processes, _db_process_)) {
- X accept = TRUE;
- X }
- X }
- X }
- X }
- X }
- X return (accept);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * Indent indent a line to the given indentation level
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID Indent (indent)
- X * int indent;
- X *
- X * DESCRIPTION
- X *
- X * Indent a line to the given level. Note that this is
- X * a simple minded but portable implementation.
- X * There are better ways.
- X *
- X * Also, the indent must be scaled by the compile time option
- X * of character positions per nesting level.
- X *
- X */
- X
- LOCAL VOID Indent (indent)
- int indent;
- {
- X REGISTER int count;
- X AUTO char buffer[PRINTBUF];
- X
- X indent *= INDENT;
- X for (count = 0; (count < (indent - INDENT)) && (count < (PRINTBUF - 1)); count++) {
- X if ((count % INDENT) == 0) {
- X buffer[count] = '|';
- X } else {
- X buffer[count] = ' ';
- X }
- X }
- X buffer[count] = EOS;
- X (VOID) fprintf (_db_fp_, buffer);
- X (VOID) fflush (_db_fp_);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * FreeList free all memory associated with a linked list
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID FreeList (linkp)
- X * struct link *linkp;
- X *
- X * DESCRIPTION
- X *
- X * Given pointer to the head of a linked list, frees all
- X * memory held by the list and the members of the list.
- X *
- X */
- X
- LOCAL VOID FreeList (linkp)
- struct link *linkp;
- {
- X REGISTER struct link *old;
- X
- X while (linkp != NULL) {
- X old = linkp;
- X linkp = linkp -> next_link;
- X if (old -> string != NULL) {
- X free (old -> string);
- X }
- X free ((char *) old);
- X }
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * StrDup make a duplicate of a string in new memory
- X *
- X * SYNOPSIS
- X *
- X * LOCAL char *StrDup (string)
- X * char *string;
- X *
- X * DESCRIPTION
- X *
- X * Given pointer to a string, allocates sufficient memory to make
- X * a duplicate copy, and copies the string to the newly allocated
- X * memory. Failure to allocated sufficient memory is immediately
- X * fatal.
- X *
- X */
- X
- X
- LOCAL char *StrDup (string)
- char *string;
- {
- X REGISTER char *new;
- X
- X new = DbugMalloc (strlen (string) + 1);
- X (VOID) strcpy (new, string);
- X return (new);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * DoPrefix print debugger line prefix prior to indentation
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID DoPrefix (_line_)
- X * int _line_;
- X *
- X * DESCRIPTION
- X *
- X * Print prefix common to all debugger output lines, prior to
- X * doing indentation if necessary. Print such information as
- X * current process name, current source file name and line number,
- X * and current function nesting depth.
- X *
- X */
- X
- X
- LOCAL VOID DoPrefix (_line_)
- int _line_;
- {
- X lineno++;
- X if (stack -> flags & NUMBER_ON) {
- X (VOID) fprintf (_db_fp_, "%5d: ", lineno);
- X }
- X if (stack -> flags & PROCESS_ON) {
- X (VOID) fprintf (_db_fp_, "%s: ", _db_process_);
- X }
- X if (stack -> flags & FILE_ON) {
- X (VOID) fprintf (_db_fp_, "%14s: ", file);
- X }
- X if (stack -> flags & LINE_ON) {
- X (VOID) fprintf (_db_fp_, "%5d: ", _line_);
- X }
- X if (stack -> flags & DEPTH_ON) {
- X (VOID) fprintf (_db_fp_, "%4d: ", stack -> level);
- X }
- X (VOID) fflush (_db_fp_);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * OpenFile open new output stream for debugger output
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID OpenFile (name)
- X * char *name;
- X *
- X * DESCRIPTION
- X *
- X * Given name of a new file (or "-" for stdout) opens the file
- X * and sets the output stream to the new file.
- X *
- X */
- X
- LOCAL VOID OpenFile (name)
- char *name;
- {
- X REGISTER FILE *fp;
- X REGISTER BOOLEAN newfile;
- X
- X if (name != NULL) {
- X if (strcmp (name, "-") == 0) {
- X _db_fp_ = stdout;
- X stack -> out_file = _db_fp_;
- X } else {
- X if (!Writable (name)) {
- X (VOID) fprintf (_db_fp_, ERR_OPEN, _db_process_, name);
- X perror ("");
- X (VOID) fflush (_db_fp_);
- X (VOID) XDelay (stack -> delay);
- X } else {
- X if (EXISTS (name)) {
- X newfile = FALSE;
- X } else {
- X newfile = TRUE;
- X }
- X fp = fopen (name, "a");
- X if (fp == NULL) {
- X (VOID) fprintf (_db_fp_, ERR_OPEN, _db_process_, name);
- X perror ("");
- X (VOID) fflush (_db_fp_);
- X (VOID) XDelay (stack -> delay);
- X } else {
- X _db_fp_ = fp;
- X stack -> out_file = fp;
- X if (newfile) {
- X ChangeOwner (name);
- X }
- X }
- X }
- X }
- X }
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * OpenProfile open new output stream for profiler output
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID OpenProfile (name)
- X * char *name;
- X *
- X * DESCRIPTION
- X *
- X * Given name of a new file, opens the file
- X * and sets the profiler output stream to the new file.
- X *
- X * It is currently unclear whether the prefered behavior is
- X * to truncate any existing file, or simply append to it.
- X * The latter behavior would be desirable for collecting
- X * accumulated runtime history over a number of separate
- X * runs. It might take some changes to the analyzer program
- X * though, and the notes that Binayak sent with the profiling
- X * diffs indicated that append was the normal mode, but this
- X * does not appear to agree with the actual code. I haven't
- X * investigated at this time [fnf; 24-Jul-87].
- X */
- X
- LOCAL VOID OpenProfile (name)
- char *name;
- {
- X REGISTER FILE *fp;
- X REGISTER BOOLEAN newfile;
- X
- X if (name != NULL) {
- X if (!Writable (name)) {
- X (VOID) fprintf (_db_fp_, ERR_OPEN, _db_process_, name);
- X perror ("");
- X (VOID) fflush (_db_fp_);
- X (VOID) XDelay (stack -> delay);
- X } else {
- X if (EXISTS (name)) {
- X newfile = FALSE;
- X } else {
- X newfile = TRUE;
- X }
- X fp = fopen (name, "w");
- X if (fp == NULL) {
- X (VOID) fprintf (_db_fp_, ERR_OPEN, _db_process_, name);
- X perror ("");
- X (VOID) fflush (_db_fp_);
- X (VOID) XDelay (stack -> delay);
- X } else {
- X _db_pfp_ = fp;
- X stack -> prof_file = fp;
- X if (newfile) {
- X ChangeOwner (name);
- X }
- X }
- X }
- X }
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * CloseFile close the debug output stream
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID CloseFile (fp)
- X * FILE *fp;
- X *
- X * DESCRIPTION
- X *
- X * Closes the debug output stream unless it is standard output
- X * or standard error.
- X *
- X */
- X
- LOCAL VOID CloseFile (fp)
- FILE *fp;
- {
- X if (fp != stderr && fp != stdout) {
- X if (fclose (fp) == EOF) {
- X (VOID) fprintf (stderr, ERR_CLOSE, _db_process_);
- X perror ("");
- X (VOID) fflush (stderr);
- X (VOID) XDelay (stack -> delay);
- X }
- X }
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * DbugExit print error message and exit
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID DbugExit (why)
- X * char *why;
- X *
- X * DESCRIPTION
- X *
- X * Prints error message using current process name, the reason for
- X * aborting (typically out of memory), and exits with status 1.
- X * This should probably be changed to use a status code
- X * defined in the user's debugger include file.
- X *
- X */
- X
- LOCAL VOID DbugExit (why)
- char *why;
- {
- X (VOID) fprintf (stderr, ERR_ABORT, _db_process_, why);
- X (VOID) fflush (stderr);
- X (VOID) XDelay (stack -> delay);
- X exit (1);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * DbugMalloc allocate memory for debugger runtime support
- X *
- X * SYNOPSIS
- X *
- X * LOCAL char *DbugMalloc (size)
- X * int size;
- X *
- X * DESCRIPTION
- X *
- X * Allocate more memory for debugger runtime support functions.
- X * Failure to to allocate the requested number of bytes is
- X * immediately fatal to the current process. This may be
- X * rather unfriendly behavior. It might be better to simply
- X * print a warning message, freeze the current debugger state,
- X * and continue execution.
- X *
- X */
- X
- LOCAL char *DbugMalloc (size)
- int size;
- {
- X register char *new;
- X
- X new = malloc ( size );
- X if (new == NULL) {
- X DbugExit ("out of memory");
- X }
- X return (new);
- }
- X
- X
- /*
- X * This function may be eliminated when strtok is available
- X * in the runtime environment (missing from BSD4.1).
- X */
- X
- LOCAL char *strtok (s1, s2)
- char *s1, *s2;
- {
- X static char *end = NULL;
- X REGISTER char *rtnval;
- X
- X rtnval = NULL;
- X if (s2 != NULL) {
- X if (s1 != NULL) {
- X end = s1;
- X rtnval = strtok ((char *) NULL, s2);
- X } else if (end != NULL) {
- X if (*end != EOS) {
- X rtnval = end;
- X while (*end != *s2 && *end != EOS) {end++;}
- X if (*end != EOS) {
- X *end++ = EOS;
- X }
- X }
- X }
- X }
- X return (rtnval);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * BaseName strip leading pathname components from name
- X *
- X * SYNOPSIS
- X *
- X * LOCAL char *BaseName (pathname)
- X * char *pathname;
- X *
- X * DESCRIPTION
- X *
- X * Given pointer to a complete pathname, locates the base file
- X * name at the end of the pathname and returns a pointer to
- X * it.
- X *
- X */
- X
- LOCAL char *BaseName (pathname)
- char *pathname;
- {
- X register char *base;
- X
- X base = strrchr (pathname, '/');
- X if (base++ == NULL) {
- X base = pathname;
- X }
- X return (base);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * Writable test to see if a pathname is writable/creatable
- X *
- X * SYNOPSIS
- X *
- X * LOCAL BOOLEAN Writable (pathname)
- X * char *pathname;
- X *
- X * DESCRIPTION
- X *
- X * Because the debugger might be linked in with a program that
- X * runs with the set-uid-bit (suid) set, we have to be careful
- X * about opening a user named file for debug output. This consists
- X * of checking the file for write access with the real user id,
- X * or checking the directory where the file will be created.
- X *
- X * Returns TRUE if the user would normally be allowed write or
- X * create access to the named file. Returns FALSE otherwise.
- X *
- X */
- X
- LOCAL BOOLEAN Writable (pathname)
- char *pathname;
- {
- X REGISTER BOOLEAN granted;
- #ifdef unix
- X REGISTER char *lastslash;
- #endif
- X
- #ifndef unix
- X granted = TRUE;
- #else
- X granted = FALSE;
- X if (EXISTS (pathname)) {
- X if (WRITABLE (pathname)) {
- X granted = TRUE;
- X }
- X } else {
- X lastslash = strrchr (pathname, '/');
- X if (lastslash != NULL) {
- X *lastslash = EOS;
- X } else {
- X pathname = ".";
- X }
- X if (WRITABLE (pathname)) {
- X granted = TRUE;
- X }
- X if (lastslash != NULL) {
- X *lastslash = '/';
- X }
- X }
- #endif
- X return (granted);
- }
- X
- X
- /*
- X * This function may be eliminated when strrchr is available
- X * in the runtime environment (missing from BSD4.1).
- X * Alternately, you can use rindex() on BSD systems.
- X */
- X
- LOCAL char *strrchr (s, c)
- char *s;
- char c;
- {
- X REGISTER char *scan;
- X
- X for (scan = s; *scan != EOS; scan++) {;}
- X while (scan > s && *--scan != c) {;}
- X if (*scan != c) {
- X scan = NULL;
- X }
- X return (scan);
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * ChangeOwner change owner to real user for suid programs
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID ChangeOwner (pathname)
- X *
- X * DESCRIPTION
- X *
- X * For unix systems, change the owner of the newly created debug
- X * file to the real owner. This is strictly for the benefit of
- X * programs that are running with the set-user-id bit set.
- X *
- X * Note that at this point, the fact that pathname represents
- X * a newly created file has already been established. If the
- X * program that the debugger is linked to is not running with
- X * the suid bit set, then this operation is redundant (but
- X * harmless).
- X *
- X */
- X
- LOCAL VOID ChangeOwner (pathname)
- char *pathname;
- {
- #ifdef unix
- X if (chown (pathname, getuid (), getgid ()) == -1) {
- X (VOID) fprintf (stderr, ERR_CHOWN, _db_process_, pathname);
- X perror ("");
- X (VOID) fflush (stderr);
- X (VOID) XDelay (stack -> delay);
- X }
- #endif
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * _db_setjmp_ save debugger environment
- X *
- X * SYNOPSIS
- X *
- X * VOID _db_setjmp_ ()
- X *
- X * DESCRIPTION
- X *
- X * Invoked as part of the user's DBUG_SETJMP macro to save
- X * the debugger environment in parallel with saving the user's
- X * environment.
- X *
- X */
- X
- VOID _db_setjmp_ ()
- {
- X jmplevel = stack -> level;
- X jmpfunc = func;
- X jmpfile = file;
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * _db_longjmp_ restore previously saved debugger environment
- X *
- X * SYNOPSIS
- X *
- X * VOID _db_longjmp_ ()
- X *
- X * DESCRIPTION
- X *
- X * Invoked as part of the user's DBUG_LONGJMP macro to restore
- X * the debugger environment in parallel with restoring the user's
- X * previously saved environment.
- X *
- X */
- X
- VOID _db_longjmp_ ()
- {
- X stack -> level = jmplevel;
- X if (jmpfunc) {
- X func = jmpfunc;
- X }
- X if (jmpfile) {
- X file = jmpfile;
- X }
- }
- X
- X
- /*
- X * FUNCTION
- X *
- X * DelayArg convert D flag argument to appropriate value
- X *
- X * SYNOPSIS
- X *
- X * LOCAL int DelayArg (value)
- X * int value;
- X *
- X * DESCRIPTION
- X *
- X * Converts delay argument, given in tenths of a second, to the
- X * appropriate numerical argument used by the system to delay
- X * that that many tenths of a second. For example, on the
- X * AMIGA, there is a system call "Delay()" which takes an
- X * argument in ticks (50 per second). On unix, the sleep
- X * command takes seconds. Thus a value of "10", for one
- X * second of delay, gets converted to 50 on the amiga, and 1
- X * on unix. Other systems will need to use a timing loop.
- X *
- X */
- X
- LOCAL int DelayArg (value)
- int value;
- {
- X int delayarg = 0;
- X
- #ifdef unix
- X delayarg = value / 10; /* Delay is in seconds for sleep () */
- #endif
- #ifdef AMIGA
- X delayarg = (HZ * value) / 10; /* Delay in ticks for XDelay () */
- #endif
- X return (delayarg);
- }
- X
- X
- /*
- X * A dummy delay stub for systems that do not support delays.
- X * With a little work, this can be turned into a timing loop.
- X */
- X
- #ifndef unix
- #ifndef AMIGA
- XXDelay ()
- {
- }
- #endif
- #endif
- X
- X
- /*
- X * FUNCTION
- X *
- X * perror perror simulation for systems that don't have it
- X *
- X * SYNOPSIS
- X *
- X * LOCAL VOID perror (s)
- X * char *s;
- X *
- X * DESCRIPTION
- X *
- X * Perror produces a message on the standard error stream which
- X * provides more information about the library or system error
- X * just encountered. The argument string s is printed, followed
- X * by a ':', a blank, and then a message and a newline.
- X *
- X * An undocumented feature of the unix perror is that if the string
- X * 's' is a null string (NOT a NULL pointer!), then the ':' and
- X * blank are not printed.
- X *
- X * This version just complains about an "unknown system error".
- X *
- X */
- X
- #if !unix && !(AMIGA || LATTICE || __TURBOC__ )
- LOCAL VOID perror (s)
- #if __STDC__
- const char *s;
- #else
- char *s;
- #endif
- {
- X if (s && *s != EOS) {
- X (VOID) fprintf (stderr, "%s: ", s);
- X }
- X (VOID) fprintf (stderr, "<unknown system error>\n");
- }
- #endif /* !unix && !(AMIGA && LATTICE) */
- X
- /*
- X * Here we need the definitions of the clock routine. Add your
- X * own for whatever system that you have.
- X */
- X
- #if unix
- X
- # include <sys/param.h>
- # if BSD4_3 || sun
- X
- /*
- X * Definition of the Clock() routine for 4.3 BSD.
- X */
- X
- #include <sys/time.h>
- #include <sys/resource.h>
- X
- /*
- X * Returns the user time in milliseconds used by this process so
- X * far.
- X */
- X
- LOCAL unsigned long Clock ()
- {
- X struct rusage ru;
- X
- X (VOID) getrusage (RUSAGE_SELF, &ru);
- X return ((ru.ru_utime.tv_sec * 1000) + (ru.ru_utime.tv_usec / 1000));
- }
- X
- #else
- X
- LOCAL unsigned long Clock ()
- {
- X return (0);
- }
- X
- # endif
- X
- #else
- X
- #if AMIGA
- X
- struct DateStamp { /* Yes, this is a hack, but doing it right */
- X long ds_Days; /* is incredibly ugly without splitting this */
- X long ds_Minute; /* off into a separate file */
- X long ds_Tick;
- };
- X
- static int first_clock = TRUE;
- static struct DateStamp begin;
- static struct DateStamp elapsed;
- X
- LOCAL unsigned long Clock ()
- {
- X register struct DateStamp *now;
- X register unsigned long millisec = 0;
- X extern VOID *AllocMem ();
- X
- X now = (struct DateStamp *) AllocMem ((long) sizeof (struct DateStamp), 0L);
- X if (now != NULL) {
- X if (first_clock == TRUE) {
- X first_clock = FALSE;
- X (VOID) DateStamp (now);
- X begin = *now;
- X }
- X (VOID) DateStamp (now);
- X millisec = 24 * 3600 * (1000 / HZ) * (now -> ds_Days - begin.ds_Days);
- X millisec += 60 * (1000 / HZ) * (now -> ds_Minute - begin.ds_Minute);
- X millisec += (1000 / HZ) * (now -> ds_Tick - begin.ds_Tick);
- X (VOID) FreeMem (now, (long) sizeof (struct DateStamp));
- X }
- X return (millisec);
- }
- X
- #else
- X
- LOCAL unsigned long Clock ()
- {
- X return (0);
- }
- X
- #endif /* AMIGA */
- X
- #endif /* unix */
- X
- #ifdef AMIGA
- XXDelay(x)
- int x;
- {
- X if (x) Delay(x); /* fix Delay bug in AmigaDOS */
- }
- #endif
- X
- SHAR_EOF
- chmod 0640 dmake/dbug/dbug/dbug.c ||
- echo 'restore of dmake/dbug/dbug/dbug.c failed'
- Wc_c="`wc -c < 'dmake/dbug/dbug/dbug.c'`"
- test 44504 -eq "$Wc_c" ||
- echo 'dmake/dbug/dbug/dbug.c: original size 44504, current size' "$Wc_c"
- rm -f _shar_wnt_.tmp
- fi
- # ============= dmake/dbug/dbug/dbug.h ==============
- if test -f 'dmake/dbug/dbug/dbug.h' -a X"$1" != X"-c"; then
- echo 'x - skipping dmake/dbug/dbug/dbug.h (File already exists)'
- rm -f _shar_wnt_.tmp
- else
- > _shar_wnt_.tmp
- sed 's/^X//' << 'SHAR_EOF' > 'dmake/dbug/dbug/dbug.h' &&
- /******************************************************************************
- X * *
- X * N O T I C E *
- X * *
- X * Copyright Abandoned, 1987, Fred Fish *
- X * *
- X * *
- X * This previously copyrighted work has been placed into the public *
- X * domain by the author and may be freely used for any purpose, *
- X * private or commercial. *
- X * *
- X * Because of the number of inquiries I was receiving about the use *
- X * of this product in commercially developed works I have decided to *
- X * simply make it public domain to further its unrestricted use. I *
- X * specifically would be most happy to see this material become a *
- X * part of the standard Unix distributions by AT&T and the Berkeley *
- X * Computer Science Research Group, and a standard part of the GNU *
- X * system from the Free Software Foundation. *
- X * *
- X * I would appreciate it, as a courtesy, if this notice is left in *
- X * all copies and derivative works. Thank you. *
- X * *
- X * The author makes no warranty of any kind with respect to this *
- X * product and explicitly disclaims any implied warranties of mer- *
- X * chantability or fitness for any particular purpose. *
- X * *
- X ******************************************************************************
- X */
- X
- X
- /*
- X * FILE
- X *
- X * dbug.h user include file for programs using the dbug package
- X *
- X * SYNOPSIS
- X *
- X * #include <local/dbug.h>
- X *
- X * SCCS ID
- X *
- X * @(#)dbug.h 1.11 9/5/87
- X *
- X * DESCRIPTION
- X *
- X * Programs which use the dbug package must include this file.
- X * It contains the appropriate macros to call support routines
- X * in the dbug runtime library.
- X *
- X * To disable compilation of the macro expansions define the
- X * preprocessor symbol "DBUG_OFF". This will result in null
- X * macros expansions so that the resulting code will be smaller
- X * and faster. (The difference may be smaller than you think
- X * so this step is recommended only when absolutely necessary).
- X * In general, tradeoffs between space and efficiency are
- X * decided in favor of efficiency since space is seldom a
- X * problem on the new machines).
- X *
- X * All externally visible symbol names follow the pattern
- X * "_db_xxx..xx_" to minimize the possibility of a dbug package
- X * symbol colliding with a user defined symbol.
- X *
- X * The DBUG_<N> style macros are obsolete and should not be used
- X * in new code. Macros to map them to instances of DBUG_PRINT
- X * are provided for compatibility with older code. They may go
- X * away completely in subsequent releases.
- X *
- X * AUTHOR
- X *
- X * Fred Fish
- X * (Currently employed by Motorola Computer Division, Tempe, Az.)
- X * hao!noao!mcdsun!fnf
- X * (602) 438-3614
- X *
- X */
- X
- X
- /*
- X * Internally used dbug variables which must be global.
- X */
- X
- #ifndef DBUG_OFF
- X extern int _db_on_; /* TRUE if debug currently enabled */
- X extern FILE *_db_fp_; /* Current debug output stream */
- X extern char *_db_process_; /* Name of current process */
- X extern int _db_keyword_ (); /* Accept/reject keyword */
- X extern void _db_push_ (); /* Push state, set up new state */
- X extern void _db_pop_ (); /* Pop previous debug state */
- X extern void _db_enter_ (); /* New user function entered */
- X extern void _db_return_ (); /* User function return */
- X extern void _db_pargs_ (); /* Remember args for line */
- X extern void _db_doprnt_ (); /* Print debug output */
- X extern void _db_setjmp_ (); /* Save debugger environment */
- X extern void _db_longjmp_ (); /* Restore debugger environment */
- # endif
- X
- X
- /*
- X * These macros provide a user interface into functions in the
- X * dbug runtime support library. They isolate users from changes
- X * in the MACROS and/or runtime support.
- X *
- X * The symbols "__LINE__" and "__FILE__" are expanded by the
- X * preprocessor to the current source file line number and file
- X * name respectively.
- X *
- X * WARNING --- Because the DBUG_ENTER macro allocates space on
- X * the user function's stack, it must precede any executable
- X * statements in the user function.
- X *
- X */
- X
- # ifdef DBUG_OFF
- # define DBUG_ENTER(a1)
- # define DBUG_MALLOC(a1)
- # define DBUG_RETURN(a1) return(a1)
- # define DBUG_VOID_RETURN return
- # define DBUG_EXECUTE(keyword,a1)
- # define DBUG_PRINT(keyword,arglist)
- # define DBUG_2(keyword,format) /* Obsolete */
- # define DBUG_3(keyword,format,a1) /* Obsolete */
- # define DBUG_4(keyword,format,a1,a2) /* Obsolete */
- # define DBUG_5(keyword,format,a1,a2,a3) /* Obsolete */
- # define DBUG_PUSH(a1)
- # define DBUG_POP()
- # define DBUG_PROCESS(a1)
- # define DBUG_FILE (stderr)
- # define DBUG_SETJMP setjmp
- # define DBUG_LONGJMP longjmp
- # else
- # define DBUG_ENTER(a) \
- X auto char *_db_func_, *_db_file_; \
- X int _db_level_; \
- X _db_enter_ (a,__FILE__,__LINE__,&_db_func_,&_db_file_,&_db_level_)
- # define DBUG_MALLOC(a) \
- X auto char *_db_func_, *_db_file_; \
- X int _db_level_; \
- X malloc_init();\
- X _db_enter_ (a,__FILE__,__LINE__,&_db_func_,&_db_file_,&_db_level_)
- # define DBUG_LEAVE \
- X (_db_return_ (__LINE__, &_db_func_, &_db_file_, &_db_level_))
- # define DBUG_RETURN(a1) return (DBUG_LEAVE, (a1))
- /* define DBUG_RETURN(a1) {DBUG_LEAVE; return(a1);} Alternate form */
- # define DBUG_VOID_RETURN DBUG_LEAVE; return
- # define DBUG_EXECUTE(keyword,a1) \
- X {if (_db_on_) {if (_db_keyword_ (keyword)) { a1 }}}
- # define DBUG_PRINT(keyword,arglist) \
- X {if (_db_on_) {_db_pargs_(__LINE__,keyword); _db_doprnt_ arglist;}}
- # define DBUG_2(keyword,format) \
- X DBUG_PRINT(keyword,(format)) /* Obsolete */
- # define DBUG_3(keyword,format,a1) \
- X DBUG_PRINT(keyword,(format,a1)) /* Obsolete */
- # define DBUG_4(keyword,format,a1,a2) \
- X DBUG_PRINT(keyword,(format,a1,a2)) /* Obsolete */
- # define DBUG_5(keyword,format,a1,a2,a3) \
- X DBUG_PRINT(keyword,(format,a1,a2,a3)) /* Obsolete */
- # define DBUG_PUSH(a1) _db_push_ (a1)
- # define DBUG_POP() _db_pop_ ()
- # define DBUG_PROCESS(a1) (_db_process_ = a1)
- # define DBUG_FILE (_db_fp_)
- # define DBUG_SETJMP(a1) (_db_setjmp_ (), setjmp (a1))
- # define DBUG_LONGJMP(a1,a2) (_db_longjmp_ (), longjmp (a1, a2))
- # endif
- X
- SHAR_EOF
- chmod 0640 dmake/dbug/dbug/dbug.h ||
- echo 'restore of dmake/dbug/dbug/dbug.h failed'
- Wc_c="`wc -c < 'dmake/dbug/dbug/dbug.h'`"
- test 6259 -eq "$Wc_c" ||
- echo 'dmake/dbug/dbug/dbug.h: original size 6259, current size' "$Wc_c"
- rm -f _shar_wnt_.tmp
- fi
- # ============= dmake/dbug/dbug/dbug.uue ==============
- if test -f 'dmake/dbug/dbug/dbug.uue' -a X"$1" != X"-c"; then
- echo 'x - skipping dmake/dbug/dbug/dbug.uue (File already exists)'
- rm -f _shar_wnt_.tmp
- else
- > _shar_wnt_.tmp
- sed 's/^X//' << 'SHAR_EOF' > 'dmake/dbug/dbug/dbug.uue' &&
- begin 650 dbug.Z
- M'YV,"@*"&$BPH," T2 2$$1!401P0FG&AP" @H<MZ<D1.F#0@B9<34.7,F
- MC9LS%\.,61/F3!F)%&/*!"$F#\R9. <:D5. @C:>:@"4@481($1Y,Z0;"T
- M*14$3Z-*03"UZA,$5[,20;"U:Q4$7\,.03"V;%2H4),B19H5*]:F3)D6C1F$
- M39LW<^B *&.GC)P\(.!DW-@1!!F^9=B\@=.FC!N]CNVDR>BF\6,0=][(H8,&
- M,(@W9A0@Y%QFH)N.I06_D7QX#H@Y;QJ_UJP7M.&0(TN>!&%&91HV:>CD<3&P
- MRIPZ8=BPL3D:35 0=,*L*>.:]$ SFCU^-C,PS$#5A+7?<3X&S<#G(,:$@1-&
- M#)O2VT4?'//F<4;E)E'NQ5-F3!TZ:=0WD&V?D29'8(-QU(9K8;CA4QEX=&12
- M?M"A\1)")M'AUVELO!:=AML5:.&!$/;W'X7@*3@'<2!08>$<I0D'!W4#AH90
- MBAVY=L=O'8I1&D]F^,633W2\ 4(8KD&HH1P<WB8227ZY-H=)8\1HH7P&'?:D
- M2P<^Y\8;>K&W68C6E>@?@+OAV :+1438!ASON19?<^C)"!^!6N;FUWENC,%&
- M'8<-9%T8"!!J*!D((*JH& @PZNB1#KZ&P!R33JIHHHDZVFBC3NHIQQQ8%J0:
- M:SUA%IQYUH4%%EAP-:564E@@$.NL&^ 0 P*WYKI!#I_-R!&:*,V11UYEK#D7
- M14^X49IMUJGF7K$,S@';&&F$H:%/.W)V6U^*P8%B@CF&2I!)W;DQ4&23U6>9
- M7J9J"\(9;[SATWY+-MDIE)^"\!QGUHH[T&'<+E:JFG)J&"ET1H* 1AA]#00<
- M'72\-^"!('S)9[W)^:NO&WG)4<>ZU@;H!HLM.B<G>G4<E]QRIH'9'8)O/.L1
- M=@>2IC' B0E\X)1]EF:AOG.P\-F!UCI<!I+L"O5&'6S,ZZ/0&P/8AK6),7=0
- M;VW\5BW%V9I7(7P9;IC<T&<TF(8>(=<G-!G6>M=Q'6/040=/06O<H$_TV?=&
- MAV8H=@>9/ZM)4QD4WNL2&20GP2YZ86@,HQP!IDR0L^]IQYMF TT=]FD]?P=N
- M&XU]"O5X"8?!D\9UN '<="P7J3##I1U7'F\2 F=Z<)YU+>C/,(<WD(_Y::SY
- M8V&8U!/4=Y&1AAEI'#]T8+25ZGJ#8(ZXEQN24;8NBXIK_%QRL!T)L\Q"(V8N
- MS5]OF[.O0H_G6/J]*^B]G'?U-:_KD%Z?O;J.Z:6[=X))0]8 U##,I0YK6C/=
- MS7"#+Z%ASGP5,U*>\.6"8TTD6>FKWIX6YB"A?2%1'Q3#!^OP091\SUP0Z@B<
- M[L2=_$5-;&Q8X);\PB(A]"<,*2M-<$# DSC483(T"AN3QF:2MX$,0 *R3>-N
- M]#FAW4U?=)!3REH"'S*\@4819-=A9G0P 4'*,W.8$;4RAA#UL$<,6@,0%@ED
- MG?V8"(GFTE^Z*M,_J.WP>VRX0QB&93<[%(\-[9'8$W>DG'/QYTQ@BV.#/(,N
- M[?5O=T7[FL8$!T48L8$[A.R0F?ZCPY$-) GF"@,9E ='H?&L2E $VI$T1I\W
- MO0=$@5$)2UPR$-V)[S5B7%X:QC"0'%),B+VI$M2.I)Q)?DY.F"&/UW)X'G9E
- M\G?P&54:#C,O6TXI:X"4@PQS0R$SMB>-S5O10%STG'*:2RBF@T-ZZD,'CN0%
- M80,RD 4)\H5ZVO.>-RE(#(A3!2<D 0NJ]$X[15DLTZTA1$&@@@FHP)#$=(@)
- M[=&,M303S@H216,YD4D+0! #$+3@HA=%"!&$4(4C..1Q(&A"@Y#3H8S&Y EQ
- MB]F>9) #H<4@!SBP04BOEAW7V$:(32IB.S_6O[29RWT\V8M*O(:S;NWI=:!J
- M#N$H]H8[N$%H*6,IR^+D&F\^2V@T\\A/'P-#P]%08Z!\S<>F]A>A^4@]S/P@
- M&4(XPA(&U%Q '=L$N91*:;:&E?69$K'Z!!B59$1:O?)+R';32/X])FB0\LE;
- M<0BC5 :ECW\,9(R,M#+U.35?._0K%O,F6(.-P3.&Q4M4#])9@FTL?7- C1P=
- M^1B+8K0@+BJ-7.F* !(B "7L60D5]?4FO-"H/BQS&W#.@ :]A+$, W-,<H3S
- M&3=H;)/ BE^.A":C7:X,,&V FWFX6J$&<10&@?%+E1[C1 ?9#03)HXYSSY8:
- MZ;)!.%#KKGJ4XYD8H!>>()#!?WVU7CJ03 A6RU(9F.>&PKDME\SCI44$4P;5
- M5$E:F!-6&\2P-YI4#W#4*8UZK(L0'_&P)W"3GI'TX!<CZ<YBY6F02US3PQ\.
- M25 ):R-LYE8EP![&MC+)[77VYK?" >>=JKRE#W=YT($<!W2F\TR(=G>A^:SG
- MFP\+9XVH/)#=-JJNOXVE<%W"IJ6FY\IH?!A@1CPX[SDH#:S1*F"D^RR?8$YY
- ML:WSD?1B':G!QSO:U<YE,82]-TQG7C21\G.I988\% Y^1X*#:@)(M8&T<FH'
- M XZR[":',Q#UL1;-B9':]$:108<CJ'P-&JI:.#.D+FZF!L%[N&5I=M[GM@GI
- M6U4+0JZ7.;E8:6@!8>! GN\2!-/*HA@(4A8\EYKD,,2#(SR?[5T0*2LO%-HB
- M9T*-$R,]X3]P^$_Z_/BGXW)G90XDFAO 6 <QP(A=H(':=!*,D[QVR(^0T^R*
- M\DD1(S%!@#L\$JP#BV-?+UJ7O/PUNZ9<,=20 =<(<76?X+AOB!?$WP#7B\0'
- M;JZ!HG)ZN.R/+DMU[>QJ&PW<GHF_VY,8I<YN:70(MUXT71K=[5@.J&2>Q!HN
- MF\A:W" TK]C'?"2'E,MDY3YJZ=%F]QEPBUO6QJOEJ4PCVRG[1PX\><S/1961
- M"U=<U!=)F7DP!X?%7*RLABM<7BH-X)55=>L$P:ZI=2>2W^B%7'O-]H)Q>-^O
- M=QL$4N@)$./&Y7L-R.E):^?1M(._M3O(= ]W*<QE/A 4Y,6*_TG!Q'Q]FL;,
- M2^=E8)&0#],;IM$![H>/N;@[MO@D.YYM<IB7D# ' LO3X3!83P')<HOZ$RN/
- M)QR';W\X&!2//*>5*]00RYY=8<= NS8VRNB7Y#"U#EWZB4$?TN"EW78[O&&:
- MJ9=Y[_/6MUU&T;;S=*E& ^Q1D*;_(R0UJ7'VI%(WL%3]R(HIT0-<4X[B5*?O
- M!P4((( $6!54016O@A1-@ +V( )F 1G$14/: 4(0($66 0(@($:^!%<T8%$
- MH($9F(%"@ C6(*J$A9'@ IN((KJ((J^("MPA0MN((M@A91 8(:6!9D019(
- M@ ]^(,QZ$]KD111@ !%>(0G"!8XF(%3@ !-^(3O9Q"@A#$=(E0><T2FAD<\
- M(4J%13O8M#6UUC-P<'JC821W\4YJ$CJ0=4HZ='>ND57&9AW,\REZD7<GH3$:
- M4AX-YD/P\1ZFHRR(@UMYX"W[M1S#) (!=!EKIR'K,@<B0!"F4V4&441^<2U\
- M EM+@W,B)B^E431")%\H\GV/Q5T_0Q^',3\GAGR_42I/A%W.$UF%1S>F5SB3
- M]W2#=A IE#6 ^%KF92V,.(;P=!A+HHLU-R)6DAH9(3- 8W0$(606AF))54Y+
- M$C)],3I3YW)>$QR*Q7V.EAC*<X<(<1=)!8OPI1EW@GA0\T0*(S"NQE^%=W.H
- MQ"Q7PD0Q4SFJA&?TT1<WYB,T<XQ-IWIZ\5:Q02-%8B391$M%LD!CTRY>0WL4
- M)AE+,P<LLS&/8XD>0C6-:!K0121&XB,:PQ/UTQ,L A2>EE0==4+[H4(2(X_[
- M,H@LY#D9!V>26!!VB!)YB 9[6 >AMU,Y,0)4\B>!P@.7%R N@ 8^P&\Q,3RU
- M9SIG, 9.U&EVD *]ER%'TFECL /CMS 'H@),:0=;T 58Z5)[T'M<ER'<@0(B
- MT)5; -= (] (E0 9<X 8B\)1GX)5LF0)AB7\@\ (J0)8%H0(#$7CO9!MJ
- M I@$H0(O@)@(8I:U)P(]\)96I"QNV0-S*0)ZV7M]$(5\B1 D.3>E$0.,61 8
- M$9,- Q);0B%4,'PY^1(@)1-%T!>/(6?I>#!PZ(Y'8@9+ HD+YX=(]AJ(P1$Q
- MA"'32''YQ3N44RQ25TB#<SFIXQ-/1!]8UQ_7PB)!0(8'P1G/47890HJEH2QW
- M,)&4N!FETIB7<9&,V#_TDS+LXI$(<1C3)77;1A#)LBQB )&2 QM_(FW[8B37
- M!"> <1BO=(QM8#?*44-EH!O)]H8JXXY65"'?PQME\#=^]H:/\1M?XQD+TQ=X
- MF# \,2.15"87FE3/B%C!"1A^)C[@21,C 3UP\(9P4$$((60PDC<^<8:U<9^1
- M(R5[<R("TI^ST1BK]C>&$12:164:4XMT #6$8R"[DQ$CX34ZEHFH9(J;"#J/
- M%$QIE <LP$I;*&U*9'CX5BW/ D\F-@?94AZEDD0' AIFD&Z)ACH\HQ]M9!$(
- M4F%=1QVP470$\9E))0-WE9*NM"SG5DS-P1,QPIIIP(<5AY2=>1 ;-0/MYWX:
- M,U(E=5+TMU(+^:@% 5-%LG\T95/_YWXNY9-] I2E(92W1Y1&Z:@30943Y)8@
- M -8V7M*B0),Z915>9=2Z6R7D:M[F1,QMI5J"9:]-Y:=Z9?F20=GF990*:LE
- M@ >7:9=1"0**R9C+4WL3I'F)R*R/J99L":UR29?4NI9=D)G)^I>/*IB )U\A
- M<ICKNIBENCRD]Q%%$'^,V:W-&IF&41^E$9F7B:X9-0+.MSR:R9F<VJ=I4)*E
- M(0.CJ1 ,]!%&6J:KJ8>+JI.@\IHQ401F=I.M"57-)">BY$?$,V/E,B]X-K(-
- M$ATSIC&V1#=BQ"[X0P9YT'F[! )V("4?<K,J04!&94I4NHFGB!"KX1<6(DI"
- M WRQX2V )&TU!D2-6#Y(0JB]!"-0 Z\'L85LDV:XPZ1T, 8D\P3ZR$Q3UD84
- M5J)[.AO[*3(:LV0KL55'0P;5823)N2 ,.1L\)K3PH;58ACLG*SS%0SPFT;?4
- ME4SO U^SN$(#,0((P+B.FP8( +F2:P8(0+F6>RF*4@8(H+F<:[F56[E.E@<;
- MMC<B.XZNXYX'07K&8V<4\YP+MKJ_,[7SXD4'%V&"XI)R@B<,M$!3,B2B]S/P
- MJ+=G9BXF-C6!(I$+VUPL(XX_$K>:I3$UH5;!<:3,%VVF)H^EX;B-V[B2&[F1
- MZ[F7BRF9N[GDNV"?:[F[^FE1!$]3\[6H,H\'4;T[ZT5L5(J<Z%;B]B5ZT5D3
- M]J%YBF'YXG9W@(<FLWN\@UR>\;0@^4B70S$Z%AV/%WO%L2IA$80/."NR(BL$
- M,03&A*=OX'68\QSH8QTG, (GD!Y:V;-[,CV2=C1=TG$_,X=Y 5A_T@97]3M/
- M!T$0*B<P BT.DP;3 8EQ5)5H-%!_(<21=Q"ILX6P<1IE>F(=8WXB0S)^"A^2
- MBI*YJ+@LN5H&,45D1JD:F[ )L5$T,*FD>A"6*G\H57_W)\8#X:DR=2"AZG\Y
- M=<8]^9. DJI#^09%>92V&KA+:974VJL9197 FI6F8ZW%&JPX@:P#.RYF4*\?
- MB*^=J:_?"I7F*J[3NJMX>:Z,/!,C$'=O%GWXYY>CR:Z$"7V!=LKR^LCG$<D+
- M9J^4S)>6C);\.IG_:IET*; ]*<K*0\HXL9FNZL95# (S\+!-8([M*DI'BA$>
- M#,('8AQ4!,;47,UV[,8&L5$U8,9A7!!IC*D'PL:;*L9P#*K]=U-U_'Y&@ #K
- MW,Y)V$]QT10Z:!8VF!9#R!9ND15!6(,1:(!5$00( - "/<]DL81% (&C<&S
- M(M !'= -R( ,2( #.(!,@ 5?=$&C; #<04UQR,7.29N*FLNW&"[$5%/UT9>
- M!4YK!,P$T49>)D*]95=B-DOP$;W+-J<O\Y\2HXO4%&C)M$M#449+RTG5$<,]
- M2U%C$Z9"MV$T1!!I-32X5W"# S%^L4!WP3$#!4MMM''<YW&ET1@QUF!ST :D
- MN)V? S3>,ZCK4BK -S=3PBW#H1,+"YH@4,;[\C-*R=6Q1C,$+,)'G6\=HB;H
- M-Z^GFL<@H*K*P\>MZE+*.G\'XEI*PS0^P4P\H!C[]0)D\"1];*VM?,>%'2@B
- MD-DC490B,,SA",BX*LB<3,@Y8<A6^<DR,:R*C,G&*I:,R1,E02POK!>R>%]"
- MDP9X -LYH20;$C6T$U. 77LIX$1%D@;*7:N=F<9?4 1.0 5%( 6/.3R8*=PX
- M(=U0( 5/, 1%, 53$,AW::Z\K'[H@P+ +:LQL /Z@@>'O:N\9 (FP,E; -Q=
- MD,G\>@(M< +P#=PKL *:Y\B<BJ;!,3NI?=[ZO04Q<*X@8.!NK!Z55<(GH ,/
- M2Q'>7053@ 2U9P(+[I4-+@/GFM[8_#M;N ;<[5*;V9DMSI?K'>#RS0/T+>,#
- M7N 9#G\E]07?G035?<EGX(A"@Y9J&9=M^98E(.3Q7:[ZG0(FSI>]K1=O&4Q%
- MDMRXVMSF+>)X4.(KGE&U+ )QN<E1_N0Y\>+X)]U24 144 52X 2U!P-D3A'"
- MG.,44<PT0.=&\-?5TB$8H1$*DE*!2W/7G!!"U@8(8.B(;BB%4BC=*[EN@ "/
- M'NF\\6K\*2<P&UAI\,3H S->YV#K!EA0=C!01YF]PGU,J;XB>S"D$4?(=R*[
- MX7-,E"$4(H=ZGM3<L73F\25NT *+(6VGOCT\>>($L5$VP,W!3A#?[-B ;G_C
- MG+#E/%/G/*H:_1.349B%R@9"H[^[9"5%TUG8:U8'HM>!Q6E@H];]4YZ2 6AG
- M^[]I"U^I)4[C9#+]2B/ZNT >IW$9X1'6P;=<2UW?;J6P.#73X1HIZQ[-QEJ%
- M%*NJV+2FUDYPMN=+^1KY(3'K_L%ZFF&BRV'87JD>R!4E2((D^,XSJ((?5/((
- M\ 5MD17MS,[LO/+M#%::<6'I,S5CD!'[P1X<(S)SVYSVIQRZ9]H@4!?AH^T?
- M]S-X/"5)U$)M=+11S1NK^"_BFRF;XBAUT%M6/Q*_E?5GX ((P/5>CP8( /9B
- MKS%FD._I8]ECP_1[ GI%"GQ5'M>U)V3ZB/1X]=D]H3'&J$I]YJYSGX5QU$:B
- MK1_!^R]!X? B 4<WLWV:D0>ZUXSRSO9Y$QU%1$P=8AVJVV 4U\"2])X,Q%<T
- M?UCMHTR4_SH-(X?9P8%=X?$@;X(4#!8C?P0F7_(*+2NSCP5>W_5=?_M>K_M=
- M7_NU#V0Q(62IWQ4?S_HG^/JQ?_(&'801"!4&[<]4X>XU;R0F$59%731[M<(+
- MXS\^ SO7158WEC[B;BZ=5RJ(?NB'KNB&TNB1&^F0#NG<HQ?A]4XF9AWZ"!@R
- MC)T&(0+8I5F/&'3DXAWC[T2ZN2>==1A^8CI&E>I);!#\J,R+)")[TO]E2G._
- M6QK#K_K%+_(NN(+)S^,378 ':!7YC!4$+=XAJ(%/Z(1.^(1.Z(32;_.W:! N
- MD6S&ED-VICJ 41^HY"L^[3K5?_J W_E5C1#C433EGSZ"HT>N81+>=V@,^;NE
- M,?RJ7_PB[X(KF/P\/M$$^,Y/Z(1.^(,^Z(/2GQ'"(R\C5]0B-C=95X>=OR>+
- M6!K1&UN2\>IFRQ/XR<4%L8A_=C#OEETJ.J'H61IB(+O5E3Z1?Q\> CG@>!#L
- M(2VLZ!K!P2"=IKZ_6QK#K_K%+_(NN(+)S^,378 '6!4P&,],T?P,)?TVGV0Y
- M=#]O8$Q4"3_DAK$A@NOINRZ:/QY +3Y4CM15R,4%<;I7*G,B&>^E,?RJ7_PB
- M[X(KF/Q? /UI'H(:V/QKWOIL?H!5L<^?GV,.53"\D_W:U!PARCO.MV76<759
- MIW&4;FH+XQH^\CY;J*;0Z5X(P1-RPR0,@K/)H9, AM(KTVJ4/L4$41<M5;\A
- M!KC3KR,>;6+MR#(0 B>!6RKD<ASN5@9\J(C4J?/,.*-&PDR6W_E^X9W'7>40
- M3TGH81+>=V@N.W7><7V1$G3?'E883N=4CM0=T@(C0 8ZH!<=!:C'K#%"!E_H
- MG^B+OO[>Z^CO+^F3/G&QIK1GT& L5C"\(P(M, )DH -T\(@> CFOCB3=L4WX
- M$H;MU&$> CDGT5X^P1[20I _D_U$TVFHKC%H208Z0 >8*=4N#4)?%M-AQD.I
- MDZ)J)6FT,1!0BB98E.Y(*E(=/U*K'_*M7U(NN(+)S^,338#O_(1.Z(0_Z(,^
- M*/T9\;O;:3H XA_9Y"&0PUA.'"?_2'EE'QL$7!K#K_K%+_(NN(+)S^,378 '
- M6!4P&,],T?P,]?DN-G4D3 8GW#<M 8MT%B?70>EL.QJH5CBV1,)T<,)]TQ*_
- M6QI4CM1\0^E96-2.P4HK(SUH@*C0(4#4T3Y3-RB=ANH@( (Q4)<#(0(R4)<G
- M.Q B, ,B(*,'X01@ A_\(K,_X]U2X.,,%1T#GY)QTSH(0 <(0 <(0 =W@ !W
- M@ !W@ "9@0!O@ !O@ "<U6FHWCZG0L"QTQ_U 9V=IKX1'U9%$\4E'2E'!F\M
- MU*W/BQ#DAK&:YQA^8EP^02YBTC\O$A3,*%(1&_GWX2&0<Q)=A>G6?DMJ+P?'
- M"1\BT (C4)=D3V1559XV#6CTH1CG5&&F0S4^<62JG/U$TVFH+J,'P;&SD_U$
- MTVGJ&U 2?Q(2,ZPJ3#%]TQ)#IAQ5=?<E5ECFTNLB,S;7!YQB0C4^<62J_.OJ
- M&7*,=K,)*57O(I/G TA;/Q!3,)""ND(,PA,8WLW"[E$@< /&_G[)OL::VE)N
- M_.QR'.WI#/0XT0(C0 8Z0 <Z\ 9TW@(C0 8L8!(L ',Z\*;#HP-&H -,@)1.
- M ";PP2_L\I [.I%T]AXHV_E/U;,Z;VGF!4V)GV?O(5DH:K]ZTR%1O!LBT (C
- M( + 3Q&C][J8?[W<0>O(#?'C;TH9OS?T!9U<7! BX 0A4)>J5!*RF6@8GN-.
- M$ *RZN:"Z00MT%&"Z0(N0!R *IBBJ3'%O,UW71I4CM0M-?ZU)/K$M4(9N<,&
- M"B^0PQG:T=:?(I/+03). ";PP2]\)N]>XC+*XG6WLQP$7!H^\DYZA*()\Z#'
- M7>5[GNJRAW6T9Z/!H?/=<3H8<@;35RK(-Z#+,=@#B\=!N<=]W'N-C5*0O6J2
- M?=.IBO9L@-F:;92<W7NFZB>&'=J:C0:E/9670>5(W2$H0&XZR=HX@=N%OR=4
- M26XZV>4((>$N)=W4;=W8C994CM1LL-V,Z=U2X.,,A98,1@9U^9@,YA-Q>=Q5
- MON=UB;/)H9-.WN4QD:TH0&XZ"0(^P%$X+L;DII/6.N6UWB$H0&XZZ5$<%><S
- M8>;JY]U2X.,,A9917I>/&>6J%)=UB;/)H9-.WN4Q@>9JSN9NC@+DII-Q/A%S
- M+NP'4<PU0.<%D>?(#?%&0.ELV\T)49]'0@8DR[*E87D#Z>Z H;_KE/-1'7"P
- MH7D QFS@F)V\\])@IA_!1=/G43#;WTQ.UD[U<083Z1CT,3=4Y!KMN!R.,U1Q
- M YIX(R\4HCL(7%VET3]'_$3^NA^A)8J+0V*X:&:3/G%3/!!-D+@2 R&A)8I1
- M9$KB=21)8CHLPQ-RPR1<7!"N0QUFU(FR%B]P(#13 Q@FED-D@+^086:R8Q[<
- M>9X*3!T$#!]D2R"]*&D906D@,ORJ7_PB[X(KF/Q? /UI'H(:V/QKWOIL?H!5
- ML<^8,_RJ7_PB[X(KF/Q?8($56($ICQ4/./Q<D?Q? /UI'H(:V/QKWOIL?H!5
- M$82 ._WH1^=C# (X8.SOE^QKK*DMY<;/+L?1GLY 3P4=^4--4WA4CM0M14E>
- M!&CO;,'W_$\9/"NA2RQD#>I,VXF1HFD'I3O6<7T.@N&H-P:\Q.O'7>40/SPN
- MP$M4CM1LX *\U )-\R1(*60BT )-\R2/^.L,K'QL4#"\HQ@$Y< )HVE-UFLV
- M@Q ><Z&R<1R21AOE2 9,0R,C_#,O#6; )4M4Q":'Y.HV";\&0>5('=AG_3_K
- M%.IVQAVF3WT83N?'7>40WU& *JEE7 -(Z1+)1C5%O2R(IVI55?=.S[ @8 .#
- MG5&BZ5(.ZU(ZY5(R<.<N%0,"-NV<6LPZ)>S'7>40WU& *JEE7 .#[IF4'FNS
- MUG*GYANOCAYT]AY.XQGL(2V%8S.</T,U\S,G0 <GW#<M\5J6'[&1?Q\> CDG
- M,9)SG50W@(KPHZ0#$>6M9O;P<WT'(P)4CM0=\E$(,0)TH -&(JDR( +H9\V4
- M*NS9# *\\E&4*E+Q!\[+WL9N_.QR'.WI?.PRP0<$X0-4CM3#F5%\0!!\0! ^
- M0.5(/9P9Q0<$P0<$P0-4CM3#F5%\0! \0.5(/9P9Y; NQ0<$X0-4CM3#F5%\
- M0!!\0! ^0.5(/9P9Q0<$P0<$P0<$X0-4CM3#F5%\0!!\0!!\0! \0.5(/9P9
- MQ0<$P0<$P0-4CM3#F5%\0! \0.5(/9P9I5,NQ0/#,^V<6LPW0.<%0>5(W2$M
- M, )TH -&(JD.V\T)P;&STS]'[#J8PQ-RPR2\8?;>,?ZJ1&WJ88DUH3$GX ,G
- MK/GPTS]'##U428XGP ,GK/GP R&A)8I+"EANH"QQ4RK1JX\ LE\T83H[+\#N
- M[KZ%PYV/)=6H:Q!',R4L@QW/:;CG5&&F0S62!1@'61IX!L$7!OP404[5@6K+
- M@G@;HSSJH2'7SV=YKT>ISB?!L>>LU%D 1N5(S3=F?ZNNT^H@(@,AL-R7HQQ5
- M52K1NT0',:<2T]:?(I-G5DBN0^5(7?E&TNH@$@,A\+OP,3S&Y.>%\35QI*2Q
- M2!VF-V04(P,A<+*6MC+2 [\&0>5(W5+CWQUETVNVI&/]41_S\NMU-! S(*,'
- MD>?(#?%GIASE&1R6U$)M_2DRV3I&TNH@(@,A (LQ$ )=*E7FPA-RPR2E$OGW
- MP;Z!&_I _8^49__)H9.:/P,A8#>1 B':B#C3[@1@PNU\EO=>8H;64AX4TC]'
- MS)V7(0+#XP./V, $O+=E(#=, CU4*0(\H-V# U>5531])D#^./RJ7_PB[X(K
- MF/S3'8(:R/SU;-TAJ('0+P6 ._V8@20GME2E0B[#PUVH1B%ZY!KZ>SV:Y1-Y
- M4 8&YM3Z7Q!ZE+NJ@UJZ^51M]/D),_RJ7_PB[X(KF/P\/M$$^,Y/Z(1.^(,^
- MZ(.UA"2&5&J[P2_Z7Q >1R&3)1MT]AZ!6#+EY$I:QB]\]C.__DA'IO\%$=E-
- M TV>8_'24IY(<BZF,Y%( CW2DND2PX:C;Z4=7"7?2*>\D_^6UED -ORJ7_PB
- M[X(KF/P\/M$$^,Y/Z(1.^(,^Z(/G@4QZVC][OAQN)AE3\L2N@[E2KRDB<?6]
- M=09:'V8HH)U=95XFEAER<&A5N321$KWCF5U+E)W%4G8<<<0#,?RJ7_PB[X(K
- MF/P\/M$$^,Y/Z(1.^(,^Z(,H@ H@ H@ "XNNB&(@<(( <(( <(T&E:_UMV
- M@ !V@ !V@ !>B0!;@ !;@ .CBNX@BM=@ !=@ !=@ #GB@ I@ I@ ":=QY8
- MJCQ4,Y'=H9M/A:0BU?$CM?HAW_HEY8(KF/S3'8(:R/SU;-TAJ('0+P4H@ H
- M@ H@ !HB0 B@ B@ B</Z)ONCK[[V._OZ1+@((( ((( ((@)D(D ((D ((
- MH'F?S\?=+.P>=5[&_G[)OL::VE)N_.QR'.WI#/3U*6M(DT5EX)VGIA++@G@1
- M1'W&UDIK]'3U0<#P\7J0MQ=8IQDL,@54XH]4CM2!?=;=ZAK!P<4%$>75!5L0
- M#'MVAHY?$XU%'4VJE>E;6B,$?(X .2!_SSO#.+@M!3RO/@<UWQ%ZIB_<T6>9
- MX3B*ER-5^9TN(RQ]@@:405^!6#*28_F=OR?]V30XYK*0 R+!X5.(5UVP!<&P
- M9V>(1Y$:@K0X6RWI<P)O< )D#T@H,:PJS*<#X01@ A_\PBX6 P(G\ 8G3%QP
- MHF7P0WI\I_\%87MW WGG@G6:L=R^=@)O<,)W:S&_KI["UR Z>S>0EZ3H"(O>
- M<0)O<,+_HTB=IKZ9<S0<4[7EV4;EG\0& 7J)XP)% #4B0.5(W2$M, )TH -O
- MP **<09L+ZDR\(B8L31-@QF0 R(V,QJHMBR(]UHBH!AG 'HB@*!P55D$\LX6
- M?,__E,&S<A[F;KWU8>]_!%F!QJ!RQD.I0SNZ;;A'!3G9Y3J7!W,?:2W6PR_G
- M='M"0HI+PUP[K$KZ*SX!)!ND-4W;R+:$ML."ND+H9\W6;,W'+NP;%0,=]5&4
- M*E+Q!\[+WL9N_.QR'.WIC)3O_(1.Z(0(ICQ4NS\ZH[X'%'_*M7U(NN(+)
- MS^,378 '6!4P&,],T?P,]= -R- #O8-E ?W@G<]8,>V%/GQF,]8WK6(P0P8I
- M!@*("#F/80:/F!=YL)*(=QY<7!#6,?RJ7_PB[X(KF/P\/M$%>(!5 8/QS!3-
- MSU"?S\?33@6<I1R[9DG4>;W<H:2\8?:U>[.?CQ?'.9,$D?_=T6GJ"T\GBOH>
- M6/PAW_HEY8(KF/P\/M$%>(!5 8/QS!3-SU"?3_T, @(O#68H,6^9$7LR>A!7
- M8"$P_!SSEAD2O!X@"EHPW(F=IKY0AV3U"Q\G0 8G0/: I!^7"(DT&;$$$?GW
- M01!1?!+#A"3C,L0B\%$(,0)DP +SEAFQ%P,L,&^9$7LRP (NX (NH -T4)?_
- M2'EE'QN%)YV7_F;@>!"?GS#/06?O$8@E4QJDQW?^8R$P[!<ZY!H6<P)D<,)]
- MTQ(;0\";J#<=$L6[ :1TMI*(QQMF/_JH[X'%'_*M7U(NN(+)S^,378 '6!4P
- M&,],T?Q4 +C3WZA!-HC>Q5].Y-//9&(>8R[U(4QW:S'SEAFQQ\4%4;O-0P;Y
- ME3#"Z!?$6$O;#P+SEAFQQR!)-25GT& 1MK(-3, B-C=9%R;):(\H8!WSEAFQ
- MQR D"CEDY1.]UD:?_P9)BG@_K"R-7S+OTRQG_4PFYC&A5#8FT3Y39S.<W[OE
- M.6^9$7N0!6"Y&'75-9&U>[/=P<0$ 1INMB3R!?P40:/]41_0V6GJ"T_>,?RJ
- M7_PB[X(KF/P\/M$%>(!5 8/QS!3-SU"?3_T,<I$1G,0&8<D>D@<[%U:1%,6O
- MKH[^^CS,F[X9F9"QSEZC[QA^8EP^02YBTC\O\ASAPR]\9B%K1F34*9/+ ;W]
- M,9 &-_'P\?FETVGJ:\#H@1Y#BK.W\[P(87],G2^&"3F/<6Z=ANI5&3MU(&G1
- M$XA!SP;ADT7PP2_Z7Q 6<_/ 02WL IY!EV0*S(I\]C/.!V(-W+Z.X_ G89T,
- MXNY4W:;<D1=Y\![<E1G/PQF(^AK5UR'#K_K%+_(NN(+)S^,378 '6!4P&,],
- MT?Q4 +C37[K1!"2*5:8@-Z<[G5IWZQUH,!*E$5;]@A!1?!(C.==)A0.J5E5%
- MO2R(I_FDQW<RBVJ>GL0*IMG63,W"GLT<!:@?1:DB%7_@O.QM[,;/+L?1GL['
- M+A-\ (F=-@<Z@-\D+JO'[%)\0! ^0.5(/9P9Q0<$P0<$P6!DH -.'RF22N5(
- M/9P9Q0<$P0<$X0-4CM3#F5%\0!!\0!!\0! ,1@8ZX/21 JA4CM3#F5%\0!!\
- M0!!\0! ^0.5(/9P9Q0<$P0<$P0<$P0<$P6!DH -.'RD=1>5(/9P9Q0<$P0<$
- MP0<$P0<$$>4Z ,6FITJBZ5)\0!!\0!!\0! \0.5(/9P9Q0<$P0<$P0<$$>4Z
- M ,6FITH.ZU)\0!!\0! \0.5(/9P9Q0<$P0<$$>4Z ,6FITHZY5)\0! \0.5(
- M/9P9I5,NQ0/#,^V<6LPX0.<%0>5(W2$M, )DH -TH -&<LS=3.@_HZ2\8?;6
- M,?RJ7_PB[X(KF/P\/M$%>(!5 8/QS!3-SU#2;_-))K_EF9"G[;Z%Y]7_2'DC
- M',.4[O<_/3O6\?EOD*1C<'7P?@468BXU>1YR0F?O0090<_@M([.H5@;'.9,$
- MH:0?O;Y%8QWOH9ONWFDFT3ZG G,;\WQ&!?P400425"R!E=6QDQC4>;W<4;LW
- M^_EXH?E*VJ41-]?CR"NJ5E4%PSM17DL6 L.E0>5('=AG?8N36&B'=K>6'[&1
- M?Q\> CF[(0(M, )DP )1K@-O( *#G5%4CM1LH -0;'HZ ,6FITJBZ5)4CM1L
- MH -0;'HZ ,6FITH.ZU)4CM1LH -0;'HZ ,6FITHZY5)4CM1LH -0;'HZ ,6F
- MITHR<.<N)0-W#O2<6LPY0.?'7>40WP(C0 8L$.4Z8"1W3JG"GLT<):D?1:DB
- M%7_@O.QM[,;/+L?1GLY KSBJ!!N-4:&WT;M'"F!TX_"$EW:O?C=XB&I_QG$%
- MPUDAQV@W._[/<V2J//[[-J/R_CUC@'Q'9B'8,G5M= )F<,*\ 4CZ,:PJ_$M_
- M#[\*]B1AV$X=YB&0<Q)4/-?CZ%_G43 'C'@@1O:U'MAG;;AQY#%Q9$LH;6L=
- MYB&0\^HB\%$(,0)DH -O2N5(S08Z8 0ZP 0Z\ 8B\+NE<0)&<,)]TQ+7HV_+
- SHAR_EOF
- true || echo 'restore of dmake/dbug/dbug/dbug.uue failed'
- fi
- echo 'End of part 3, continue with part 4'
- echo 4 > _shar_seq_.tmp
- exit 0
- exit 0 # Just in case...
-