n62@np1.hep.nl (Klamer Schutte) (03/29/89)
Here are some patches to program sed.
There were bugs in the following fields:
1 strcmp was called with a NULL pointer
2 the regular expression . was interpreted as .*
i was getting the idea the only thing sed was tested for is s/^X// !
The changes in sedexec.c from static to Static is for debugging purposes;
When not static debugging (using mdb ) is easier. Not neccessary to have
the program running!
When patch is run on the source of sed (sed.c, as mailed by ast to me;
probably the same as on the pc distribution ) a shar file is created;
this file unshars to 3 files: sed.h; sedcomp.c and sedexec.c. (reason :
on a single floppy ST it is very difficult to compile a 40k+ file! )
The program is tested on a ST; but i do not know a reason it will not
work on a PC.
Compile, run, enjoy!
Klamer Schutte (.signature at end )
PS the context diff is created on a bsd4.3 system using diff -b -c;
But this should be compatible with minix patch.
-----------------------------------------------------------------------
*** sed.c Wed Mar 29 17:13:44 1989
--- sed.shar Wed Mar 29 17:10:00 1989
***************
*** 1,28 ****
! /* sed - stream editor Author: Eric S. Raymond */
!
! /* This used to be three different files with the following makefile:
! * (Note the chmem).
!
! CFLAGS= -F -T.
!
! OBJS= sedcomp.s sedexec.s
!
! sed: $(OBJS)
! cc -T. -o sed $(OBJS)
! @chmem =13312 sed
!
! $(OBJS): sed.h
!
! * If you want longer lines: increase MAXBUF.
! * If you want scripts with more text: increase POOLSIZE.
! * If you want more commands per script: increase MAXCMDS.
! */
!
! #include <stdio.h>
! #include <ctype.h>
!
! /*+++++++++++++++*/
!
/* sed.h -- types and constants for the stream editor */
/* data area sizes used by both modules */
--- 1,18 ----
! #! /bin/sh
! # This is a shell archive, meaning:
! # 1. Remove everything above the #! /bin/sh line.
! # 2. Save the resulting text in a file.
! # 3. Execute the file with /bin/sh (not csh) to create the files:
! # sed.h
! # sedcomp.c
! # sedexec.c
! # This archive created: Wed Mar 29 17:10:00 1989
! export PATH; PATH=/bin:$PATH
! if test -f 'sed.h'
! then
! echo shar: will not over-write existing file "'sed.h'"
! else
! cat << \SHAR_EOF > 'sed.h'
/* sed.h -- types and constants for the stream editor */
/* data area sizes used by both modules */
***************
*** 98,110 ****
/* sed.h ends here */
! #define CMASK 0xFF /* some char type should have been unsigned char? */
- /*+++++++++++++++*/
-
/* sed - stream editor Author: Eric S. Raymond */
/*
The stream editor compiles its command input (from files or -e options)
into an internal form using compile() then executes the compiled form using
execute(). Main() just initializes data structures, interprets command line
--- 88,108 ----
/* sed.h ends here */
! SHAR_EOF
! fi # end of overwriting check
! if test -f 'sedcomp.c'
! then
! echo shar: will not over-write existing file "'sedcomp.c'"
! else
! cat << \SHAR_EOF > 'sedcomp.c'
/* sed - stream editor Author: Eric S. Raymond */
/*
+ * If you want longer lines: increase MAXBUF.
+ * If you want scripts with more text: increase POOLSIZE.
+ * If you want more commands per script: increase MAXCMDS.
+
The stream editor compiles its command input (from files or -e options)
into an internal form using compile() then executes the compiled form using
execute(). Main() just initializes data structures, interprets command line
***************
*** 120,128 ****
The operation of execute() is described in its source module.
*/
! /* #include <stdio.h> /* uses getc, fprintf, fopen, fclose */
extern FILE *fopen(); /* should this be in stdio.h? */
! /* #include "sed.h" /* command type struct and name defines */
/* imported functions */
extern int strcmp(); /* test strings for equality */
--- 118,126 ----
The operation of execute() is described in its source module.
*/
! #include <stdio.h> /* uses getc, fprintf, fopen, fclose */
extern FILE *fopen(); /* should this be in stdio.h? */
! #include "sed.h" /* command type struct and name defines */
/* imported functions */
extern int strcmp(); /* test strings for equality */
***************
*** 500,506 ****
if (nwfiles >= WFILES) ABORT(TMWFI);
fp=gettext(fname[nwfiles]=fp); /* filename will be in pool */
for(i = nwfiles-1; i >= 0; i--) /* match it in table */
! if (strcmp(fname[nwfiles], fname[i]) == 0)
{
cmdp->fout = fout[i];
return(0);
--- 498,505 ----
if (nwfiles >= WFILES) ABORT(TMWFI);
fp=gettext(fname[nwfiles]=fp); /* filename will be in pool */
for(i = nwfiles-1; i >= 0; i--) /* match it in table */
! if ((fname[i] != 0) &&
! (strcmp(fname[nwfiles], fname[i]) == 0))
{
cmdp->fout = fout[i];
return(0);
***************
*** 639,644 ****
--- 638,644 ----
case '.': /* match any char except newline */
*ep++ = CDOT;
+ break;
case '*': /* 0..n repeats of previous pattern */
if (lastep == NULL) /* if * isn't first on line */
***************
*** 832,838 ****
{
register label *rp;
for(rp = lablst; rp < ptr; rp++)
! if (strcmp(rp->name, ptr->name) == 0)
return(rp);
return(NULL);
}
--- 832,838 ----
{
register label *rp;
for(rp = lablst; rp < ptr; rp++)
! if ((rp->name != NULL) && (strcmp(rp->name, ptr->name) == 0))
return(rp);
return(NULL);
}
***************
*** 913,924 ****
int n;
{
/* Flush buffers and exit. */
_cleanup();
exit(n);
}
- /*+++++++++++++++*/
-
/*
sedexec.c -- execute compiled form of stream editor commands
--- 913,932 ----
int n;
{
/* Flush buffers and exit. */
+ #ifndef ATARI_ST
_cleanup();
+ #endif
exit(n);
}
+ SHAR_EOF
+ fi # end of overwriting check
+ if test -f 'sedexec.c'
+ then
+ echo shar: will not over-write existing file "'sedexec.c'"
+ else
+ cat << \SHAR_EOF > 'sedexec.c'
+ /* sed - stream editor Author: Eric S. Raymond */
/*
sedexec.c -- execute compiled form of stream editor commands
***************
*** 933,942 ****
readout() and memcmp() are output and string-comparison utilities.
*/
! /* #include <stdio.h> /* {f}puts, {f}printf, getc/putc, f{re}open, fclose */
extern FILE *fopen();
! /* #include <ctype.h> /* for isprint(), isdigit(), toascii() macros */
! /* #include "sed.h" /* command type structures & miscellaneous constants */
extern char *strcpy(); /* used in dosub */
--- 941,952 ----
readout() and memcmp() are output and string-comparison utilities.
*/
! #define Static /* Not static but debugable ! */
!
! #include <stdio.h> /* {f}puts, {f}printf, getc/putc, f{re}open, fclose */
extern FILE *fopen();
! #include <ctype.h> /* for isprint(), isdigit(), toascii() macros */
! #include "sed.h" /* command type structures & miscellaneous constants */
extern char *strcpy(); /* used in dosub */
***************
*** 961,991 ****
#define TRUE 1
#define FALSE 0
! static char LTLMSG[] = "sed: line too long\n";
! static char *spend; /* current end-of-line-buffer pointer */
! static long lnum = 0L; /* current source line number */
/* append buffer maintenance */
! static sedcmd *appends[MAXAPPENDS]; /* array of ptrs to a,i,c commands */
! static sedcmd **aptr = appends; /* ptr to current append */
/* genbuf and its pointers */
! static char genbuf[GENSIZ];
! static char *loc1;
! static char *loc2;
! static char *locs;
/* command-logic flags */
! static int lastline; /* do-line flag */
! static int jump; /* jump to cmd's link address if set */
! static int delete; /* delete command flag */
/* tagged-pattern tracking */
! static char *bracend[MAXTAGS]; /* tagged pattern start pointers */
! static char *brastart[MAXTAGS]; /* tagged pattern end pointers */
! static int anysub; /* true if any s on current line succeeded */
void execute()
--- 971,1001 ----
#define TRUE 1
#define FALSE 0
! Static char LTLMSG[] = "sed: line too long\n";
! Static char *spend; /* current end-of-line-buffer pointer */
! Static long lnum = 0L; /* current source line number */
/* append buffer maintenance */
! Static sedcmd *appends[MAXAPPENDS]; /* array of ptrs to a,i,c commands */
! Static sedcmd **aptr = appends; /* ptr to current append */
/* genbuf and its pointers */
! Static char genbuf[GENSIZ];
! Static char *loc1;
! Static char *loc2;
! Static char *locs;
/* command-logic flags */
! Static int lastline; /* do-line flag */
! Static int jump; /* jump to cmd's link address if set */
! Static int delete; /* delete command flag */
/* tagged-pattern tracking */
! Static char *bracend[MAXTAGS]; /* tagged pattern start pointers */
! Static char *brastart[MAXTAGS]; /* tagged pattern end pointers */
! Static int anysub; /* true if any s on current line succeeded */
void execute()
***************
*** 1053,1059 ****
}
}
! static int selected(ipc)
/* is current command selected */
sedcmd *ipc;
{
--- 1063,1069 ----
}
}
! Static int selected(ipc)
/* is current command selected */
sedcmd *ipc;
{
***************
*** 1105,1111 ****
return ipc->flags.allbut ? !sel : sel;
}
! static int match(expbuf, gf) /* uses genbuf */
/* match RE at expbuf against linebuf; if gf set, copy linebuf from genbuf */
char *expbuf;
{
--- 1115,1121 ----
return ipc->flags.allbut ? !sel : sel;
}
! Static int match(expbuf, gf) /* uses genbuf */
/* match RE at expbuf against linebuf; if gf set, copy linebuf from genbuf */
char *expbuf;
{
***************
*** 1159,1165 ****
return(FALSE);
}
! static int advance(lp, ep)
/* attempt to advance match pointer by one pattern element */
register char *lp; /* source (linebuf) ptr */
register char *ep; /* regular expression element ptr */
--- 1169,1175 ----
return(FALSE);
}
! Static int advance(lp, ep)
/* attempt to advance match pointer by one pattern element */
register char *lp; /* source (linebuf) ptr */
register char *ep; /* regular expression element ptr */
***************
*** 1300,1306 ****
}
}
! static int substitute(ipc)
/* perform s command */
sedcmd *ipc; /* ptr to s command struct */
{
--- 1310,1316 ----
}
}
! Static int substitute(ipc)
/* perform s command */
sedcmd *ipc; /* ptr to s command struct */
{
***************
*** 1320,1326 ****
return(TRUE); /* we succeeded */
}
! static void dosub(rhsbuf) /* uses linebuf, genbuf, spend */
/* generate substituted right-hand side (of s command) */
char *rhsbuf; /* where to put the result */
{
--- 1330,1336 ----
return(TRUE); /* we succeeded */
}
! Static void dosub(rhsbuf) /* uses linebuf, genbuf, spend */
/* generate substituted right-hand side (of s command) */
char *rhsbuf; /* where to put the result */
{
***************
*** 1358,1364 ****
spend = lp-1;
}
! static char *place(asp, al1, al2) /* uses genbuf */
/* place chars at *al1...*(al1 - 1) at asp... in genbuf[] */
register char *asp, *al1, *al2;
{
--- 1368,1374 ----
spend = lp-1;
}
! Static char *place(asp, al1, al2) /* uses genbuf */
/* place chars at *al1...*(al1 - 1) at asp... in genbuf[] */
register char *asp, *al1, *al2;
{
***************
*** 1371,1377 ****
return(asp);
}
! static void listto(p1, fp)
/* write a hex dump expansion of *p1... to fp */
register char *p1; /* the source */
FILE *fp; /* output stream to write to */
--- 1381,1387 ----
return(asp);
}
! Static void listto(p1, fp)
/* write a hex dump expansion of *p1... to fp */
register char *p1; /* the source */
FILE *fp; /* output stream to write to */
***************
*** 1396,1402 ****
putc('\n', fp);
}
! static void truncated(h) int h;
{
static long last = 0L;
--- 1406,1412 ----
putc('\n', fp);
}
! Static void truncated(h) int h;
{
static long last = 0L;
***************
*** 1408,1414 ****
fprintf(stderr, " truncated to %d characters\n", MAXBUF);
}
! static void command(ipc)
/* execute compiled command pointed at by ipc */
sedcmd *ipc;
{
--- 1418,1424 ----
fprintf(stderr, " truncated to %d characters\n", MAXBUF);
}
! Static void command(ipc)
/* execute compiled command pointed at by ipc */
sedcmd *ipc;
{
***************
*** 1604,1610 ****
}
}
! static void openfile(file) char *file;
/* Replace stdin by given file */
{
if (freopen(file, "r", stdin)==NULL) {
--- 1614,1620 ----
}
}
! Static void openfile(file) char *file;
/* Replace stdin by given file */
{
if (freopen(file, "r", stdin)==NULL) {
***************
*** 1615,1621 ****
static int c; /* Will be the next char to read, a kind of lookahead */
! static void get()
/* Read next character into c treating all argument files as run through cat */
{
while ((c=getchar())==EOF && --eargc>=0)
--- 1625,1631 ----
static int c; /* Will be the next char to read, a kind of lookahead */
! Static void get()
/* Read next character into c treating all argument files as run through cat */
{
while ((c=getchar())==EOF && --eargc>=0)
***************
*** 1622,1628 ****
openfile(*eargv++);
}
! static void initget()
/* Initialise character input */
{
if (--eargc>=0) openfile(*eargv++); /* else input == stdin */
--- 1632,1638 ----
openfile(*eargv++);
}
! Static void initget()
/* Initialise character input */
{
if (--eargc>=0) openfile(*eargv++); /* else input == stdin */
***************
*** 1629,1635 ****
get();
}
! static char *getline(buf)
/* get next line of text to be edited, return pointer to end */
register char *buf; /* where to send the input */
{
--- 1639,1645 ----
get();
}
! Static char *getline(buf)
/* get next line of text to be edited, return pointer to end */
register char *buf; /* where to send the input */
{
***************
*** 1651,1657 ****
return buf;
}
! static int memcmp(a, b, count)
/* return TRUE if *a... == *b... for count chars, FALSE otherwise */
register char *a, *b;
{
--- 1661,1667 ----
return buf;
}
! Static int memcmp(a, b, count)
/* return TRUE if *a... == *b... for count chars, FALSE otherwise */
register char *a, *b;
{
***************
*** 1661,1667 ****
return(TRUE); /* compare succeeded */
}
! static void readout()
/* write file indicated by r command to output */
{
register int t; /* hold input char or EOF */
--- 1671,1677 ----
return(TRUE); /* compare succeeded */
}
! Static void readout()
/* write file indicated by r command to output */
{
register int t; /* hold input char or EOF */
***************
*** 1688,1690 ****
--- 1698,1704 ----
/* sedexec.c ends here */
+ SHAR_EOF
+ fi # end of overwriting check
+ # End of shell archive
+ exit 0
--
________________________________________________________________________________
Klamer Schutte mcvax!nikhefh!n62 n62@nikhefh.hep.nl