chasm@killer.DALLAS.TX.US (Charles Marslett) (02/19/89)
# The following two files are: one to patch the GNU e?grep utility # source files so as to compile with Microsoft C (and probably # Turbo C) for use under MSDOS. The routine "wild.c" distributed # by Microsoft is also used to expand wild card file name references # in the command line. A bug fix for that routine is also included # int this diff file to use it in the compact memory model, and a # second bug (handling quoted arguments) is also corrected. (Even # Microsoft isn't perfect. ;^) # # The second file is a modified Makefile to generate e?grep in the # compact memory model. Two changes in the syntax of the command # line have been made as concessions to MSDOS (no real pipes and # no file linking). One is the new flag -E (to effect egrep syntax) # and the other is controlled with the new flag -u (by default, the # printed lines, etc., are written following a header line with the # file name, rather than concatenated with the file name in normal # e?grep fashion -- "-u" restores the normal mode). The blocked # report can be disabled by undefining -DBLOCKS if desired. Undefining # -DMSC_WILD will eliminate the need for the Microsoft C compiler # routine "wild.c" (and an alternative file name expansion technique # should be substituted). # # I am also submitting the executable result of these patches to # comp.binaries.ibm.pc. # # Thank you, # Charles Marslett # # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # diffs # makefile.msc # This archive created: Sat Feb 18 12:23:54 1989 sed 's/^X//' << \SHAR_EOF > diffs X*** README X--- NEW/README X*************** X*** 77,82 **** X -w print only lines where the match is a complete word X -x print only lines where the match is a whole line X X The options understood by GNU e?grep are meant to be (nearly) compatible X with both the BSD and System V versions of grep and egrep. X X--- 77,85 ---- X -w print only lines where the match is a complete word X -x print only lines where the match is a whole line X X+ -E behave as if the command were "egrep" X+ -u unblock the output (if blocked output is enabled) X+ X The options understood by GNU e?grep are meant to be (nearly) compatible X with both the BSD and System V versions of grep and egrep. X X*************** X*** 85,90 **** X -b prints a byte offset instead of a block offset X the \{m,n\} construct of System V grep is not implemented X X GNU e?grep has been thoroughly debugged and tested by several people X over a period of several months; we think it's a reliable beast or we X wouldn't distribute it. If by some fluke of the universe you discover X--- 88,99 ---- X -b prints a byte offset instead of a block offset X the \{m,n\} construct of System V grep is not implemented X X+ In addition, if GNU e?grep is compiled with -DBLOCKS, any filenames X+ printed are printed on a seperate lines, double spaced from the previous X+ matched lines. This can be overridden by the -u command line option. X+ Also, if compiled with -DMSDOS, the command name is ignored and "egrep" X+ is specified by means of the command line option -E. X+ X GNU e?grep has been thoroughly debugged and tested by several people X over a period of several months; we think it's a reliable beast or we X wouldn't distribute it. If by some fluke of the universe you discover X*************** X*** 119,124 **** X X Paul Placeway wrote the manual page, based on this README. X X If you are interested in improving this program, you may wish to try X any of the following: X X--- 128,136 ---- X X Paul Placeway wrote the manual page, based on this README. X X+ Charles Marslett made the very minor changes to permit use of X+ this program in an MSDOS environment. X+ X If you are interested in improving this program, you may wish to try X any of the following: X X*** GETOPT.C X--- NEW/GETOPT.C X************** X*** 110,115 X X #include <stdio.h> X X #ifdef sparc X #include <alloca.h> X #endif X--- 110,123 ----- X X #include <stdio.h> X X+ #ifndef __GNUC__ X+ #include <stdlib.h> X+ #endif X+ X+ #ifdef MSDOS X+ char *alloca(int); X+ #endif X+ X #ifdef sparc X #include <alloca.h> X #endif X************** X*** 114,119 X #include <alloca.h> X #endif X #ifdef USG X #define bcopy(s, d, l) memcpy((d), (s), (l)) X #endif X X--- 122,129 ----- X #include <alloca.h> X #endif X #ifdef USG X+ #include <string.h> X+ #define index strchr X #define bcopy(s, d, l) memcpy((d), (s), (l)) X #endif X X*** DFA.H X--- NEW/DFA.H X************** X*** 105,112 X X #ifdef __STDC__ X X! /* Missing include files for GNU C. */ X! /* #include <stdlib.h> */ X typedef int size_t; X extern void *calloc(int, size_t); X extern void *malloc(size_t); X--- 105,112 ----- X X #ifdef __STDC__ X X! #ifdef __GNUC__ X! /* Missing include files for GNU C. Missing define for NULL*/ X typedef int size_t; X extern void *calloc(int, size_t); X extern void *malloc(size_t); X************** X*** 113,118 X extern void *realloc(void *, size_t); X extern void free(void *); X X #ifndef USG X extern char *strchr(), *strrchr(), *memcpy(); X #else X--- 113,127 ----- X extern void *realloc(void *, size_t); X extern void free(void *); X X+ #define NULL 0 X+ X+ #else X+ #include <stdlib.h> X+ #ifndef NULL X+ #define NULL 0 X+ #endif X+ #endif X+ X #ifndef USG X extern char *strchr(), *strrchr(), *memcpy(); X #else X************** X*** 186,194 X #define RE_SYNTAX_GREP (RE_BK_PLUS_QM | RE_NEWLINE_OR) X #define RE_SYNTAX_EMACS 0 X X- /* The NULL pointer. */ X- #define NULL 0 X- X /* Number of bits in an unsigned char. */ X #define CHARBITS 8 X X--- 195,200 ----- X #define RE_SYNTAX_GREP (RE_BK_PLUS_QM | RE_NEWLINE_OR) X #define RE_SYNTAX_EMACS 0 X X /* Number of bits in an unsigned char. */ X #define CHARBITS 8 X X************** X*** 380,386 X a constraint. */ X typedef struct X { X! unsigned index:24, /* Index into the parse array. */ X constraint:8; /* Constraint for matching this position. */ X } _position; X X--- 386,392 ----- X a constraint. */ X typedef struct X { X! unsigned long index:24, /* Index into the parse array. */ X constraint:8; /* Constraint for matching this position. */ X } _position; X X*** GREP.C X--- NEW/GREP.C X************** X*** 125,132 X extern char *strrchr(); X #endif X X! extern char *optarg; X! extern optind, opterr; X extern errno; X extern char *sys_errlist[]; X X--- 125,131 ----- X extern char *strrchr(); X #endif X X! #ifdef __GNUC__ X extern errno; X extern char *sys_errlist[]; X #endif X************** X*** 129,134 X extern optind, opterr; X extern errno; X extern char *sys_errlist[]; X X #define MAX(a, b) ((a) > (b) ? (a) : (b)) X X--- 128,134 ----- X #ifdef __GNUC__ X extern errno; X extern char *sys_errlist[]; X+ #endif X X extern char *optarg; X extern optind, opterr; X************** X*** 130,136 X extern errno; X extern char *sys_errlist[]; X X! #define MAX(a, b) ((a) > (b) ? (a) : (b)) X X /* Exit status codes. */ X #define MATCHES_FOUND 0 /* Exit 0 if no errors and matches found. */ X--- 130,137 ----- X extern char *sys_errlist[]; X #endif X X! extern char *optarg; X! extern optind, opterr; X X #define MAX(a, b) ((a) > (b) ? (a) : (b)) X X************** X*** 132,137 X X #define MAX(a, b) ((a) > (b) ? (a) : (b)) X X /* Exit status codes. */ X #define MATCHES_FOUND 0 /* Exit 0 if no errors and matches found. */ X #define NO_MATCHES_FOUND 1 /* Exit 1 if no matches were found. */ X--- 133,140 ----- X extern char *optarg; X extern optind, opterr; X X+ #define MAX(a, b) ((a) > (b) ? (a) : (b)) X+ X /* Exit status codes. */ X #define MATCHES_FOUND 0 /* Exit 0 if no errors and matches found. */ X #define NO_MATCHES_FOUND 1 /* Exit 1 if no matches were found. */ X************** X*** 537,542 X usage_and_die() X { X fprintf(stderr, X "usage: %s [-CVbchilnsvwx] [-<num>] [-AB <num>] [-f file] [-e] expr [files]\n", X prog); X exit(ERROR); X--- 540,548 ----- X usage_and_die() X { X fprintf(stderr, X+ #ifdef MSDOS X+ "usage: %s [-ECVbchilnsvwx] [-<num>] [-AB <num>] [-f file] [-e] expr [files]\n", X+ #else X "usage: %s [-CVbchilnsvwx] [-<num>] [-AB <num>] [-f file] [-e] expr [files]\n", X #endif X prog); X************** X*** 538,543 X { X fprintf(stderr, X "usage: %s [-CVbchilnsvwx] [-<num>] [-AB <num>] [-f file] [-e] expr [files]\n", X prog); X exit(ERROR); X } X--- 544,550 ----- X "usage: %s [-ECVbchilnsvwx] [-<num>] [-AB <num>] [-f file] [-e] expr [files]\n", X #else X "usage: %s [-CVbchilnsvwx] [-<num>] [-AB <num>] [-f file] [-e] expr [files]\n", X+ #endif X prog); X exit(ERROR); X } X************** X*** 562,567 X char *regex_errmesg; /* Error message from regex routines. */ X char translate[_NOTCHAR]; /* Translate table for case conversion X (needed by the backtracking matcher). */ X X if (prog = strrchr(argv[0], '/')) X ++prog; X--- 569,577 ----- X char *regex_errmesg; /* Error message from regex routines. */ X char translate[_NOTCHAR]; /* Translate table for case conversion X (needed by the backtracking matcher). */ X+ #ifdef MSDOS X+ char *cp; X+ char egrep_flag; X X #ifdef MSC_WILD X extern int __argc; X************** X*** 563,568 X char translate[_NOTCHAR]; /* Translate table for case conversion X (needed by the backtracking matcher). */ X X if (prog = strrchr(argv[0], '/')) X ++prog; X else X--- 573,589 ----- X char *cp; X char egrep_flag; X X+ #ifdef MSC_WILD X+ extern int __argc; X+ extern char **__argv; X+ X+ if (_cwild()) { X+ printf("Unable to expand file names: check command line!\n"); X+ exit (1); X+ } X+ argv = __argv; X+ argc = __argc; X+ #endif X if (prog = strrchr(argv[0], '/')) X ++prog; X else X************** X*** 567,572 X ++prog; X else X prog = argv[0]; X X opterr = 0; X while ((c = getopt(argc, argv, "0123456789A:B:CVbce:f:hilnsvwx")) != EOF) X--- 588,605 ----- X ++prog; X else X prog = argv[0]; X+ if (cp = strrchr(prog, '\\')) { X+ prog = cp; X+ ++prog; X+ } X+ if (cp = strrchr(prog, '.')) X+ *cp = 0; X+ #else X+ if (prog = strrchr(argv[0], '/')) X+ ++prog; X+ else X+ prog = argv[0]; X+ #endif X X opterr = 0; X #ifdef MSDOS X************** X*** 569,574 X prog = argv[0]; X X opterr = 0; X while ((c = getopt(argc, argv, "0123456789A:B:CVbce:f:hilnsvwx")) != EOF) X switch (c) X { X--- 602,611 ----- X #endif X X opterr = 0; X+ #ifdef MSDOS X+ egrep_flag = 0; X+ while ((c = getopt(argc, argv, "0123456789A:B:CEVbce:f:hilnsvwx")) != EOF) X+ #else X while ((c = getopt(argc, argv, "0123456789A:B:CVbce:f:hilnsvwx")) != EOF) X #endif X switch (c) X************** X*** 570,575 X X opterr = 0; X while ((c = getopt(argc, argv, "0123456789A:B:CVbce:f:hilnsvwx")) != EOF) X switch (c) X { X case '?': X--- 607,613 ----- X while ((c = getopt(argc, argv, "0123456789A:B:CEVbce:f:hilnsvwx")) != EOF) X #else X while ((c = getopt(argc, argv, "0123456789A:B:CVbce:f:hilnsvwx")) != EOF) X+ #endif X switch (c) X { X #ifdef MSDOS X************** X*** 572,577 X while ((c = getopt(argc, argv, "0123456789A:B:CVbce:f:hilnsvwx")) != EOF) X switch (c) X { X case '?': X usage_and_die(); X break; X--- 610,621 ----- X #endif X switch (c) X { X+ #ifdef MSDOS X+ case 'E': X+ egrep_flag = 1; X+ break; X+ #endif X+ X case '?': X usage_and_die(); X break; X************** X*** 679,684 X break; X } X X /* Set the syntax depending on arg 0 and whether to ignore case. */ X if (*prog == 'e') X { X--- 723,732 ----- X break; X } X X+ #ifdef MSDOS X+ /* Set the syntax and whether to ignore case based on -E. */ X+ if (egrep_flag) X+ #else X /* Set the syntax depending on arg 0 and whether to ignore case. */ X if (*prog == 'e') X #endif X************** X*** 681,686 X X /* Set the syntax depending on arg 0 and whether to ignore case. */ X if (*prog == 'e') X { X regsyntax(RE_SYNTAX_EGREP, ignore_case); X re_set_syntax(RE_SYNTAX_EGREP); X--- 729,735 ----- X #else X /* Set the syntax depending on arg 0 and whether to ignore case. */ X if (*prog == 'e') X+ #endif X { X regsyntax(RE_SYNTAX_EGREP, ignore_case); X re_set_syntax(RE_SYNTAX_EGREP); X*** REGEX.C X--- NEW/REGEX.C X************** X*** 120,125 X X #else /* not emacs */ X X #ifdef USG X #define bcopy(s,d,n) memcpy((d),(s),(n)) X #define bcmp(s1,s2,n) memcmp((s1),(s2),(n)) X--- 120,132 ----- X X #else /* not emacs */ X X+ #ifdef __STDC__ X+ #include <stdlib.h> X+ #endif X+ #ifdef MSDOS X+ char *alloca(int); X+ #endif X+ X #ifdef USG X #define bcopy(s,d,n) memcpy((d),(s),(n)) X #define bcmp(s1,s2,n) memcmp((s1),(s2),(n)) X************** X*** 247,253 X X #define EXTEND_BUFFER \ X { char *old_buffer = bufp->buffer; \ X! if (bufp->allocated == (1<<16)) goto too_big; \ X bufp->allocated *= 2; \ X if (bufp->allocated > (1<<16)) bufp->allocated = (1<<16); \ X if (!(bufp->buffer = (char *) realloc (bufp->buffer, bufp->allocated))) \ X--- 254,260 ----- X X #define EXTEND_BUFFER \ X { char *old_buffer = bufp->buffer; \ X! if (bufp->allocated == (1<<14)) goto too_big; \ X bufp->allocated *= 2; \ X if (bufp->allocated > (1<<14)) bufp->allocated = (1<<14); \ X if (!(bufp->buffer = (char *) realloc (bufp->buffer, bufp->allocated))) \ X************** X*** 249,255 X { char *old_buffer = bufp->buffer; \ X if (bufp->allocated == (1<<16)) goto too_big; \ X bufp->allocated *= 2; \ X! if (bufp->allocated > (1<<16)) bufp->allocated = (1<<16); \ X if (!(bufp->buffer = (char *) realloc (bufp->buffer, bufp->allocated))) \ X goto memory_exhausted; \ X c = bufp->buffer - old_buffer; \ X--- 256,262 ----- X { char *old_buffer = bufp->buffer; \ X if (bufp->allocated == (1<<14)) goto too_big; \ X bufp->allocated *= 2; \ X! if (bufp->allocated > (1<<14)) bufp->allocated = (1<<14); \ X if (!(bufp->buffer = (char *) realloc (bufp->buffer, bufp->allocated))) \ X goto memory_exhausted; \ X c = bufp->buffer - old_buffer; \ X*** DFA.C X--- NEW/DFA.C X************** X*** 148,154 X { X ptr_t r = realloc(p, n); X X! if (r) X return r; X else X regerror("Memory exhausted"); X--- 148,154 ----- X { X ptr_t r = realloc(p, n); X X! if (r || (n == 0)) X return r; X else X regerror("Memory exhausted"); X************** X*** 1190,1197 X struct regexp *r; X int trans[]; X { X- _position_set grps[_NOTCHAR]; /* As many as will ever be needed. */ X- _charset labels[_NOTCHAR]; /* Labels corresponding to the groups. */ X int ngrps = 0; /* Number of groups actually used. */ X _position pos; /* Current position being considered. */ X _charset matches; /* Set of matching characters. */ X--- 1190,1195 ----- X struct regexp *r; X int trans[]; X { X int ngrps = 0; /* Number of groups actually used. */ X _position pos; /* Current position being considered. */ X _charset matches; /* Set of matching characters. */ X************** X*** 1211,1216 X int state_letter; /* New state on a letter transition. */ X static initialized; /* Flag for static initialization. */ X int i, j, k; X X /* Initialize the set of letters, if necessary. */ X if (! initialized) X--- 1209,1217 ----- X int state_letter; /* New state on a letter transition. */ X static initialized; /* Flag for static initialization. */ X int i, j, k; X+ _position_set grps[_NOTCHAR]; /* As many as will ever be needed. */ X+ _charset labels[_NOTCHAR]; /* Labels corresponding to the groups. */ X+ X X /* Initialize the set of letters, if necessary. */ X if (! initialized) X*** WILD.C X--- NEW/WILD.C X*************** X*** 16,21 **** X #include <register.h> X #include <ctype.h> X #include <msdos.h> X X X /* X--- 16,25 ---- X #include <register.h> X #include <ctype.h> X #include <msdos.h> X+ char *strlwr(char *arg); X+ static int match (char *arg, char *ptr); X+ static int add (char *arg); X+ static void sort (struct argnode *first); X X X /* X*************** X*** 64,73 **** X char *malloc(); X char *_find(); X X- static int match (); X- static int add (); X- static sort (); X- X extern int __argc; X extern char **__argv; X X--- 68,73 ---- X char *malloc(); X char *_find(); X X extern int __argc; X extern char **__argv; X X*************** X*** 112,121 **** X arghead = argend = NULL; X X for (argv = __argv; *argv; argv++) /* for each arg... */ X! if ( *(*argv)++ == '"' ) X! /* strip leading quote from quoted arg */ X! { X! if (add(*argv)) X return(-1); X } X else if (wchar = strpbrk( *argv, WILDSTRING )) { X--- 112,119 ---- X arghead = argend = NULL; X X for (argv = __argv; *argv; argv++) /* for each arg... */ X! if ( **argv == '"' ) { /* strip leading quote from quoted arg */ X! if (add(*argv + 1)) X return(-1); X } X else if (wchar = strpbrk( *argv, WILDSTRING )) { X*************** X*** 204,210 **** X if (*ptr != SLASHCHAR && *ptr != ':' X && *ptr != FWDSLASHCHAR ) { X /* current directory; don't need path */ X! if (!(arg = strdup(new)) || add(arg)) X return(-1); X } X else /* add full pathname */ X--- 202,208 ---- X if (*ptr != SLASHCHAR && *ptr != ':' X && *ptr != FWDSLASHCHAR ) { X /* current directory; don't need path */ X! if (!(arg = strdup(new)) || add(strlwr(arg))) X return(-1); X } X else /* add full pathname */ X*************** X*** 209,216 **** X } X else /* add full pathname */ X if (!(all=malloc(length+strlen(new)+1)) X! || add(strcpy(strncpy(all,arg,length)+length,new) X! - length)) X return(-1); X X gotone++; X--- 207,214 ---- X } X else /* add full pathname */ X if (!(all=malloc(length+strlen(new)+1)) X! || add(strlwr(strcpy(strncpy(all,arg,length)+length,new) X! - length))) X return(-1); X X gotone++; X*************** X*** 276,282 **** X * X *******************************************************************************/ X X! static X sort (first) X REG2 struct argnode *first; X { X--- 274,280 ---- X * X *******************************************************************************/ X X! static void X sort (first) X REG2 struct argnode *first; X { SHAR_EOF sed 's/^X//' << \SHAR_EOF > makefile.msc X# X# Makefile for GNU e?grep (using a PD MSDOS development environment) X# X X# -DUSG for System V, -DMSDOS for IBM/PCs (if the compiler doesn't). X# -DMSC_WILD to use the Microsoft C compiler's wild card function _cwild(). X# -DBLOCKS to print file names seperate from matched lines. X#CFLAGS = -Oalt -DUSG -AC -Zi XCFLAGS = -Oailt -Gs -DUSG -DMSC_WILD -DBLOCKS -AC X X# You may add getopt.obj if your C library lacks getopt(); note that X# 4.3BSD getopt() is said to be somewhat broken. X# Add alloca.obj if your machine does not support alloca(). X# Add wild.obj if you are using the Microsoft C compiler. XOBJS = grep.obj dfa.obj regex.obj getopt.obj wild.obj X Xall: regress X Xregress: grep.exe X cd tests; sh regress.sh X Xgrep.exe: $(OBJS) X $(CC) $(CFLAGS) -F 4000 -o grep $(OBJS) -link /noe X Xclean: X del grep.exe *.obj tests/tmp.scr X Xdfa.obj grep.obj: dfa.h Xgrep.obj regex.obj: regex.h SHAR_EOF # End of shell archive exit 0 =========================================================================== Charles Marslett STB Systems, Inc. <== Apply all standard disclaimers Wordmark Systems <== No disclaimers required -- that's just me chasm@killer.dallas.tx.us