ast@cs.vu.nl (Andy Tanenbaum) (09/14/87)
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin
echo Extracting \o\m\a\t\c\h\.\c
sed 's/^X//' > \o\m\a\t\c\h\.\c << '+ END-OF-FILE '\o\m\a\t\c\h\.\c
X#include <stdio.h>
X#include "tools.h"
X
X/*
X * Match one pattern element, pointed at by pat, with the character at
X * **linp. Return non-zero on match. Otherwise, return 0. *Linp is
X * advanced to skip over the matched character; it is not advanced on
X * failure. The amount of advance is 0 for patterns that match null
X * strings, 1 otherwise. "boln" should point at the position that will
X * match a BOL token.
X */
Xomatch(linp, pat, boln)
Xchar **linp;
XTOKEN *pat;
Xchar *boln;
X{
X
X register int advance;
X
X advance = -1;
X
X if (**linp)
X {
X switch (pat->tok)
X {
X case LITCHAR:
X if (**linp == pat->lchar)
X advance = 1;
X break;
X
X case BOL:
X if (*linp = boln)
X advance = 0;
X break;
X
X case ANY:
X if (**linp != '\n')
X advance = 1;
X break;
X
X case EOL:
X if (**linp == '\n')
X advance = 0;
X break;
X
X case CCL:
X if( testbit( **linp, pat->bitmap))
X advance = 1;
X break;
X
X case NCCL:
X if (!testbit (**linp, pat->bitmap))
X advance = 1;
X break;
X
X default:
X printf("omatch: can't happen\n");
X }
X }
X if (advance >= 0)
X *linp += advance;
X
X return (++advance);
X}
+ END-OF-FILE omatch.c
chmod 'u=rw,g=r,o=r' \o\m\a\t\c\h\.\c
set `sum \o\m\a\t\c\h\.\c`
sum=$1
case $sum in
11662) :;;
*) echo 'Bad sum in '\o\m\a\t\c\h\.\c >&2
esac
echo Extracting \o\p\t\p\a\t\.\c
sed 's/^X//' > \o\p\t\p\a\t\.\c << '+ END-OF-FILE '\o\p\t\p\a\t\.\c
X/*
X * Copyright 1987 Brian Beattie Rights Reserved.
X *
X * Permission to copy and/or distribute granted under the
X * following conditions:
X *
X * 1). No charge may be made other than resonable charges
X * for reproduction.
X *
X * 2). This notice must remain intact.
X *
X * 3). No further restrictions may be added.
X *
X */
X#include <stdio.h>
X#include "tools.h"
X#include "ed.h"
X
XTOKEN *
Xoptpat(oldpat)
XTOKEN *oldpat;
X{
X char delim, str[MAXPAT], *cp;
X
X delim = *inptr++;
X cp = str;
X while(*inptr != delim && *inptr != NL)
X {
X if(*inptr == ESCAPE)
X if(inptr[1] == '/' || inptr[1] == '?')
X inptr++;
X *cp++ = *inptr++;
X }
X
X *cp = EOS;
X if(*str == EOS)
X return(oldpat);
X if(oldpat)
X unmakepat(oldpat);
X return(getpat(str));
X}
+ END-OF-FILE optpat.c
chmod 'u=rw,g=r,o=r' \o\p\t\p\a\t\.\c
set `sum \o\p\t\p\a\t\.\c`
sum=$1
case $sum in
05262) :;;
*) echo 'Bad sum in '\o\p\t\p\a\t\.\c >&2
esac
echo Extracting \s\e\t\.\c
sed 's/^X//' > \s\e\t\.\c << '+ END-OF-FILE '\s\e\t\.\c
X/*
X * Copyright 1987 Brian Beattie Rights Reserved.
X *
X * Permission to copy and/or distribute granted under the
X * following conditions:
X *
X * 1). No charge may be made other than resonable charges
X * for reproduction.
X *
X * 2). This notice must remain intact.
X *
X * 3). No further restrictions may be added.
X *
X */
X#include <stdio.h>
X#include "tools.h"
X#include "ed.h"
X
Xstruct tbl {
X char *t_str;
X int *t_ptr;
X int t_val;
X} *t, tbl[] = {
X "number", &nflg, TRUE,
X "nonumber", &nflg, FALSE,
X "list", &lflg, TRUE,
X "nolist", &lflg, FALSE,
X "eightbit", &eightbit, TRUE,
X "noeightbit", &eightbit, FALSE,
X 0
X};
X
Xset()
X{
X char word[16];
X int i;
X
X inptr++;
X if(toupper(*inptr) != 'T')
X {
X if(*inptr != SP && *inptr != HT && *inptr != NL)
X return(ERR);
X } else
X inptr++;
X
X if(*inptr == NL)
X return(show("all"));
X /* skip white space */
X while(*inptr == SP || *inptr == HT)
X inptr++;
X
X for(i = 0; *inptr != SP && *inptr != HT && *inptr != NL;)
X word[i++] = *inptr++;
X word[i] = EOS;
X for(t = tbl; t->t_str; t++)
X {
X if(strcmp(word,t->t_str) == 0)
X {
X *t->t_ptr = t->t_val;
X return(0);
X }
X }
X}
X
Xshow()
X{
X extern int version;
X
X printf("ed version %d.%d\n",version/100,version%100);
X printf("number %s, list %s\n",nflg?"ON":"OFF",lflg?"ON":"OFF");
X return(0);
X}
+ END-OF-FILE set.c
chmod 'u=rw,g=r,o=r' \s\e\t\.\c
set `sum \s\e\t\.\c`
sum=$1
case $sum in
09185) :;;
*) echo 'Bad sum in '\s\e\t\.\c >&2
esac
echo Extracting \s\e\t\b\u\f\.\c
sed 's/^X//' > \s\e\t\b\u\f\.\c << '+ END-OF-FILE '\s\e\t\b\u\f\.\c
X/*
X * Copyright 1987 Brian Beattie Rights Reserved.
X *
X * Permission to copy and/or distribute granted under the
X * following conditions:
X *
X * 1). No charge may be made other than resonable charges
X * for reproduction.
X *
X * 2). This notice must remain intact.
X *
X * 3). No further restrictions may be added.
X *
X */
X#include <stdio.h>
X#include "tools.h"
X#include "ed.h"
X
Xrelink(a, x, y, b)
XLINE *a, *x, *y, *b;
X{
X x->l_prev = a;
X y->l_next = b;
X}
X
Xclrbuf()
X{
X del(1, lastln);
X}
X
Xsetbuf()
X{
X relink(&line0, &line0, &line0, &line0);
X curln = lastln = 0;
X}
+ END-OF-FILE setbuf.c
chmod 'u=rw,g=r,o=r' \s\e\t\b\u\f\.\c
set `sum \s\e\t\b\u\f\.\c`
sum=$1
case $sum in
35684) :;;
*) echo 'Bad sum in '\s\e\t\b\u\f\.\c >&2
esac
echo Extracting \s\u\b\s\t\.\c
sed 's/^X//' > \s\u\b\s\t\.\c << '+ END-OF-FILE '\s\u\b\s\t\.\c
X/*
X * Copyright 1987 Brian Beattie Rights Reserved.
X *
X * Permission to copy and/or distribute granted under the
X * following conditions:
X *
X * 1). No charge may be made other than resonable charges
X * for reproduction.
X *
X * 2). This notice must remain intact.
X *
X * 3). No further restrictions may be added.
X *
X */
X#include <stdio.h>
X#include "tools.h"
X#include "ed.h"
Xsubst(pat, sub, gflg, pflag)
XTOKEN *pat;
Xchar *sub;
Xint gflg, pflag;
X{
X int lin, chngd, nchngd;
X char *txtptr, *txt;
X char *lastm, *m, *new, buf[MAXLINE];
X
X if(line1 <= 0)
X return( ERR );
X nchngd = 0; /* reset count of lines changed */
X for(lin = line1; lin <= line2; lin++)
X {
X txt = txtptr = gettxt(lin);
X new = buf;
X chngd = 0;
X lastm = NULL;
X while(*txtptr)
X {
X if(gflg || !chngd)
X m = amatch(txtptr, pat, txt);
X else
X m = NULL;
X if(m != NULL && lastm != m)
X {
X chngd++;
X new = catsub(txtptr, m, sub, new,
X buf+MAXLINE);
X lastm = m;
X }
X if(m == NULL || m == txtptr)
X {
X *new++ = *txtptr++;
X } else {
X txtptr = m;
X }
X }
X if(chngd)
X {
X if(new >= buf+MAXLINE)
X return( ERR );
X *new++ = EOS;
X del(lin,lin);
X ins(buf);
X nchngd++;
X if(pflag)
X doprnt(curln, curln);
X }
X }
X if(nchngd == 0 && !gflg)
X {
X printf("string not found\n");
X return(ERR);
X }
X return( nchngd );
X}
+ END-OF-FILE subst.c
chmod 'u=rw,g=r,o=r' \s\u\b\s\t\.\c
set `sum \s\u\b\s\t\.\c`
sum=$1
case $sum in
38978) :;;
*) echo 'Bad sum in '\s\u\b\s\t\.\c >&2
esac
echo Extracting \s\y\s\t\e\m\.\c
sed 's/^X//' > \s\y\s\t\e\m\.\c << '+ END-OF-FILE '\s\y\s\t\e\m\.\c
X#define SHELL "/bin/sh"
X
Xsystem(c)
Xchar *c; {
X int pid, status;
X
X switch (pid = fork()) {
X case -1:
X return -1;
X case 0:
X execl(SHELL, "sh", "-c", c, (char *) 0);
X exit(-1);
X default:
X while (wait(&status) != pid)
X ;
X }
X return status;
X}
+ END-OF-FILE system.c
chmod 'u=rw,g=r,o=r' \s\y\s\t\e\m\.\c
set `sum \s\y\s\t\e\m\.\c`
sum=$1
case $sum in
07747) :;;
*) echo 'Bad sum in '\s\y\s\t\e\m\.\c >&2
esac
echo Extracting \t\o\o\l\s\.\h
sed 's/^X//' > \t\o\o\l\s\.\h << '+ END-OF-FILE '\t\o\o\l\s\.\h
Xstatic char tools_h[] =
X"$Header: tools.h,v 2.1 85/11/14 11:30:00 beattie Exp $";
X/*
X * #defines for non-printing ASCII characters
X */
X
X#define NUL 0x00 /* ^@ */
X#define EOS 0x00 /* end of string */
X#define SOH 0x01 /* ^A */
X#define STX 0x02 /* ^B */
X#define ETX 0x03 /* ^C */
X#define EOT 0x04 /* ^D */
X#define ENQ 0x05 /* ^E */
X#define ACK 0x06 /* ^F */
X#define BEL 0x07 /* ^G */
X#define BS 0x08 /* ^H */
X#define HT 0x09 /* ^I */
X#define LF 0x0a /* ^J */
X#define NL '\n'
X#define VT 0x0b /* ^K */
X#define FF 0x0c /* ^L */
X#define CR 0x0d /* ^M */
X#define SO 0x0e /* ^N */
X#define SI 0x0f /* ^O */
X#define DLE 0x10 /* ^P */
X#define DC1 0x11 /* ^Q */
X#define DC2 0x12 /* ^R */
X#define DC3 0x13 /* ^S */
X#define DC4 0x14 /* ^T */
X#define NAK 0x15 /* ^U */
X#define SYN 0x16 /* ^V */
X#define ETB 0x17 /* ^W */
X#define CAN 0x18 /* ^X */
X#define EM 0x19 /* ^Y */
X#define SUB 0x1a /* ^Z */
X#define ESC 0x1b /* ^[ */
X#define FS 0x1c /* ^\ */
X#define GS 0x1d /* ^] */
X#define RS 0x1e /* ^^ */
X#define US 0x1f /* ^_ */
X#define SP 0x20 /* space */
X#define DEL 0x7f /* DEL*/
X
X
X#define TRUE 1
X#define FALSE 0
X#define ERR -2
X
X
X/* Definitions of meta-characters used in pattern matching
X * routines. LITCHAR & NCCL are only used as token identifiers;
X * all the others are also both token identifier and actual symbol
X * used in the regular expression.
X */
X
X
X#define BOL '^'
X#define EOL '$'
X#define ANY '.'
X#define LITCHAR 'L'
X#define ESCAPE '\\'
X#define CCL '[' /* Character class: [...] */
X#define CCLEND ']'
X#define NEGATE '~'
X#define NCCL '!' /* Negative character class [^...] */
X#define CLOSURE '*'
X#define OR_SYM '|'
X#define DITTO '&'
X
X/* Largest permitted size for an expanded character class. (i.e. the class
X * [a-z] will expand into 26 symbols; [a-z0-9] will expand into 36.)
X */
X#define CLS_SIZE 128
X
X/*
X * Tokens are used to hold pattern templates. (see makepat())
X */
Xtypedef char BITMAP;
X
Xtypedef struct token {
X char tok;
X char lchar;
X BITMAP *bitmap;
X struct token *next;
X} TOKEN;
X
X#define TOKSIZE sizeof (TOKEN)
X
X/*
X * An absolute maximun for strings.
X */
X
X#define MAXSTR 132 /* Maximum numbers of characters in a line */
X
X
Xextern char *matchs();
Xextern char *amatch();
Xextern char *in_string();
Xextern TOKEN *getpat();
Xextern int esc();
Xextern char *dodash();
Xextern TOKEN *makepat();
Xextern int unmakepat();
Xextern int insert();
Xextern int delete();
Xextern int isalphanum();
Xextern char *stoupper();
Xextern int pr_tok();
Xextern int pr_line();
Xextern BITMAP *makebitmap();
X
X/* macros */
X#define max(a,b) ((a>b)?a:b)
X#define min(a,b) ((a<b)?a:b)
X#define toupper(c) (c>='a'&&c<='z'?c-32:c)
+ END-OF-FILE tools.h
chmod 'u=rw,g=r,o=r' \t\o\o\l\s\.\h
set `sum \t\o\o\l\s\.\h`
sum=$1
case $sum in
24721) :;;
*) echo 'Bad sum in '\t\o\o\l\s\.\h >&2
esac
echo Extracting \u\n\m\k\p\a\t\.\c
sed 's/^X//' > \u\n\m\k\p\a\t\.\c << '+ END-OF-FILE '\u\n\m\k\p\a\t\.\c
X#include <stdio.h>
X#include "tools.h"
X
X/* Free up the memory usde for token string */
Xunmakepat(head)
XTOKEN *head;
X{
X
X register TOKEN *old_head;
X
X while (head)
X {
X switch (head->tok)
X {
X case CCL:
X case NCCL:
X free(head->bitmap);
X /* fall through to default */
X
X default:
X old_head = head;
X head = head->next;
X free (old_head);
X break;
X }
X }
X}
+ END-OF-FILE unmkpat.c
chmod 'u=rw,g=r,o=r' \u\n\m\k\p\a\t\.\c
set `sum \u\n\m\k\p\a\t\.\c`
sum=$1
case $sum in
43211) :;;
*) echo 'Bad sum in '\u\n\m\k\p\a\t\.\c >&2
esac
:4lecpa