home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-12-06 | 43.3 KB | 2,590 lines |
- head 1.5;
- branch ;
- access ;
- symbols ;
- locks ; strict;
- comment @ * @;
-
-
- 1.5
- date 89.09.17.10.58.39; author rick; state Exp;
- branches ;
- next 1.4;
-
- 1.4
- date 89.09.04.18.52.56; author rick; state Exp;
- branches ;
- next 1.3;
-
- 1.3
- date 89.09.01.11.02.22; author rick; state Exp;
- branches ;
- next 1.2;
-
- 1.2
- date 89.08.27.19.01.04; author rick; state Exp;
- branches ;
- next 1.1;
-
- 1.1
- date 89.08.27.17.44.11; author rick; state Exp;
- branches ;
- next ;
-
-
- desc
- @Initial checkin
- @
-
-
- 1.5
- log
- @Cleanup so no errors when compiled with Lattice C
- @
- text
- @/* ed - standard editor Authors: Brian Beattie, Kees Bot, and others */
-
- /* Modifications for Amiga made by Rick Schaeffer */
-
- /*
- * Copyright 1987 Brian Beattie Rights Reserved.
- *
- * Permission to copy and/or distribute granted under the
- * following conditions:
- *
- * 1). No charge may be made other than reasonable charges
- * for reproduction.
- *
- * 2). This notice must remain intact.
- *
- * 3). No further restrictions may be added.
- *
- */
-
- /* This program used to be in many little pieces, with this makefile:
- .SUFFIXES: .c .s
-
- CFLAGS = -F
-
- OBJS = append.s catsub.s ckglob.s deflt.s del.s docmd.s doglob.s\
- doprnt.s doread.s dowrite.s ed.s egets.s find.s getfn.s getlst.s\
- getnum.s getone.s getptr.s getrhs.s gettxt.s ins.s join.s maksub.s\
- move.s optpat.s set.s setbuf.s subst.s getpat.s matchs.s amatch.s\
- unmkpat.s omatch.s makepat.s bitmap.s dodash.s esc.s system.s
-
- ed: $(OBJS)
- cc -T. -i -o ed $(OBJS)
- */
-
- #include <stdio.h>
- #include <ios1.h>
- /****************************/
-
- /* tools.h */
- static char tools_h[] =
- "$Header: Rodime:ricks/rcs2/src/ked/ked.c,v 1.4 89/09/04 18:52:56 rick Exp Lock
- r: rick $";
- /*
- * #defines for non-printing ASCII characters
- */
-
- #define NUL 0x00 /* ^@@ */
- #define EOS 0x00 /* end of string */
- #define SOH 0x01 /* ^A */
- #define STX 0x02 /* ^B */
- #define ETX 0x03 /* ^C */
- #define EOT 0x04 /* ^D */
- #define ENQ 0x05 /* ^E */
- #define ACK 0x06 /* ^F */
- #define BEL 0x07 /* ^G */
- #define BS 0x08 /* ^H */
- #define HT 0x09 /* ^I */
- #define LF 0x0a /* ^J */
- #define NL '\n'
- #define VT 0x0b /* ^K */
- #define FF 0x0c /* ^L */
- #define CR 0x0d /* ^M */
- #define SO 0x0e /* ^N */
- #define SI 0x0f /* ^O */
- #define DLE 0x10 /* ^P */
- #define DC1 0x11 /* ^Q */
- #define DC2 0x12 /* ^R */
- #define DC3 0x13 /* ^S */
- #define DC4 0x14 /* ^T */
- #define NAK 0x15 /* ^U */
- #define SYN 0x16 /* ^V */
- #define ETB 0x17 /* ^W */
- #define CAN 0x18 /* ^X */
- #define EM 0x19 /* ^Y */
- #define SUB 0x1a /* ^Z */
- #define ESC 0x1b /* ^[ */
- #define FS 0x1c /* ^\ */
- #define GS 0x1d /* ^] */
- #define RS 0x1e /* ^^ */
- #define US 0x1f /* ^_ */
- #define SP 0x20 /* space */
- #define DEL 0x7f /* DEL*/
-
-
- #define TRUE 1
- #define FALSE 0
- #define ERR -2
-
-
- /* Definitions of meta-characters used in pattern matching
- * routines. LITCHAR & NCCL are only used as token identifiers;
- * all the others are also both token identifier and actual symbol
- * used in the regular expression.
- */
-
-
- #define BOL '^'
- #define EOL '$'
- #define ANY '.'
- #define LITCHAR 'L'
- #define ESCAPE '\\'
- #define CCL '[' /* Character class: [...] */
- #define CCLEND ']'
- #define NEGATE '~'
- #define NCCL '!' /* Negative character class [^...] */
- #define CLOSURE '*'
- #define OR_SYM '|'
- #define DITTO '&'
- #define OPEN '('
- #define CLOSE ')'
-
- /* Largest permitted size for an expanded character class. (i.e. the class
- * [a-z] will expand into 26 symbols; [a-z0-9] will expand into 36.)
- */
- #define CLS_SIZE 128
-
- /*
- * Tokens are used to hold pattern templates. (see makepat())
- */
- typedef char BITMAP;
-
- typedef struct token {
- char tok;
- char lchar;
- BITMAP *bitmap;
- struct token *next;
- } TOKEN;
-
- #define TOKSIZE sizeof (TOKEN)
-
- /*
- * An absolute maximun for strings.
- */
-
- #define MAXSTR 132 /* Maximum numbers of characters in a line */
-
-
- extern char *matchs();
- extern char *amatch();
- extern char *in_string();
- extern TOKEN *getpat();
- extern int esc();
- extern char *dodash();
- extern TOKEN *makepat();
- extern void unmakepat();
- extern int insert();
- extern int delete();
- extern int isalphanum();
- extern char *stoupper();
- extern int pr_tok();
- extern int pr_line();
- extern BITMAP *makebitmap();
-
- /* macros */
- #define toupper(c) (c>='a'&&c<='z'?c-32:c)
-
- /* ed.h */
- #define FATAL (ERR-1)
- struct line {
- int l_stat; /* empty, mark */
- struct line *l_prev;
- struct line *l_next;
- char l_buff[1];
- };
-
- typedef struct line LINE;
-
- #define LINFREE 1 /* entry not in use */
- #define LGLOB 2 /* line marked global */
-
- #define MAXLINE 256 /* max number of chars per line */
- #define MAXPAT 256 /* max number of chars per replacement pattern */
- #define MAXFNAME 256 /* max file name size */
-
- extern LINE line0;
- extern int curln, lastln, line1, line2, nlines;
- extern int nflg; /* print line number flag */
- extern int lflg; /* print line in verbose mode */
- extern int pflg; /* print current line after each command */
- extern char *inptr; /* tty input buffer */
- extern char linbuf[], *linptr; /* current line */
- extern int truncflg; /* truncate long line flag */
- extern int eightbit; /* save eighth bit */
- extern int nonascii; /* count of non-ascii chars read */
- extern int nullchar; /* count of null chars read */
- extern int truncated; /* count of lines truncated */
- extern int fchanged; /* file changed */
-
- #define nextln(l) ((l)+1 > lastln ? 0 : (l)+1)
- #define prevln(l) ((l)-1 < 0 ? lastln : (l)-1)
-
- extern char *getfn();
- extern LINE *getptr();
- extern char *gettxt();
- extern char *maksub();
- extern TOKEN *optpat();
-
- extern char *catsub();
-
- extern char *strcpy();
- extern int *malloc();
- extern void putcntl(),prntln(),relink(),clrbuf(),edsetbuf();
-
- /* amatch.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
-
- /* Scans throught the pattern template looking for a match
- * with lin. Each element of lin is compared with the template
- * until either a mis-match is found or the end of the template
- * is reached. In the former case a 0 is returned; in the latter,
- * a pointer into lin (pointing to the character following the
- * matched pattern) is returned.
- *
- * "lin" is a pointer to the line being searched.
- * "pat" is a pointer to a template made by makepat().
- * "boln" is a pointer into "lin" which points at the
- * character at the beginning of the line.
- */
-
- char *paropen[9], *parclose[9];
- int between, parnum;
- static char *match();
-
- char *
- amatch(lin, pat, boln)
- char *lin;
- TOKEN *pat;
- char *boln;
- {
-
- between=0;
- parnum=0;
-
- lin=match(lin, pat, boln);
-
- if (between) return 0;
-
- while (parnum<9) {
- paropen[parnum] = parclose[parnum] = "";
- parnum++;
- }
- return lin;
- }
-
- static char *
- match(lin, pat, boln)
- char *lin;
- TOKEN *pat;
- char *boln;
- {
- register char *bocl, *rval, *strstart;
-
- if(pat == 0)
- return 0;
-
- strstart = lin;
-
- while(pat)
- {
- if(pat->tok == CLOSURE && pat->next)
- {
- /* Process a closure:
- * first skip over the closure token to the
- * object to be repeated. This object can be
- * a character class.
- */
-
- pat = pat->next;
-
- /* Now match as many occurrences of the
- * closure pattern as possible.
- */
- bocl = lin;
-
- while( *lin && omatch(&lin, pat))
- ;
-
- /* 'Lin' now points to the character that made
- * made us fail. Now go on to process the
- * rest of the string. A problem here is
- * a character following the closure which
- * could have been in the closure.
- * For example, in the pattern "[a-z]*t" (which
- * matches any lower-case word ending in a t),
- * the final 't' will be sucked up in the while
- * loop. So, if the match fails, we back up a
- * notch and try to match the rest of the
- * string again, repeating this process
- * recursively until we get back to the
- * beginning of the closure. The recursion
- * goes, at most two levels deep.
- */
-
- if(pat = pat->next)
- {
- int savbtwn=between;
- int savprnm=parnum;
-
- while(bocl <= lin)
- {
- if(rval = match(lin, pat, boln))
- {
- /* success */
- return(rval);
- } else {
- --lin;
- between=savbtwn;
- parnum=savprnm;
- }
- }
- return (0); /* match failed */
- }
- } else
- if (pat->tok == OPEN)
- {
- if (between || parnum>=9) return 0;
- paropen[parnum] = lin;
- between=1;
- pat = pat->next;
- } else
- if (pat->tok == CLOSE)
- {
- if (!between) return 0;
- parclose[parnum++] = lin;
- between=0;
- pat = pat->next;
- } else
- if (omatch(&lin, pat, boln))
- {
- pat = pat->next;
- } else {
- return (0);
- }
- }
- /* Note that omatch() advances lin to point at the next
- * character to be matched. Consequently, when we reach
- * the end of the template, lin will be pointing at the
- * character following the last character matched. The
- * exceptions are templates containing only a BOLN or EOLN
- * token. In these cases omatch doesn't advance.
- *
- * A philosophical point should be mentioned here. Is $
- * a position or a character? (i.e. does $ mean the EOL
- * character itself or does it mean the character at the end
- * of the line.) I decided here to make it mean the former,
- * in order to make the behavior of match() consistent. If
- * you give match the pattern ^$ (match all lines consisting
- * only of an end of line) then, since something has to be
- * returned, a pointer to the end of line character itself is
- * returned.
- */
-
- return ((char *)max(strstart , lin));
- }
-
- /* append.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- append(line, glob)
- int line, glob;
- {
- int stat;
- char lin[MAXLINE];
-
- if(glob)
- return(ERR);
- curln = line;
- while(1)
- {
- if(nflg)
- printf("%d\t",curln+1);
-
- if(fgets(lin, MAXLINE, stdin) == NULL)
- return( EOF );
- if(lin[0] == '.' && lin[1] == '\n')
- return(0);
- stat = ins(lin);
- if(stat < 0)
- return( ERR );
-
- }
- }
-
- /* bitmap.c */
- /*
- * BITMAP.C - makebitmap, setbit, testbit
- * bit-map manipulation routines.
- *
- * Copyright (c) Allen I. Holub, all rights reserved. This program may
- * for copied for personal, non-profit use only.
- *
- */
-
- #ifdef DEBUG
- /* #include <stdio.h> */
- #endif
-
- /* #include "tools.h" */
-
-
- BITMAP *makebitmap( size )
- unsigned size;
- {
- /* Make a bit map with "size" bits. The first entry in
- * the map is an "unsigned int" representing the maximum
- * bit. The map itself is concatenated to this integer.
- * Return a pointer to a map on success, 0 if there's
- * not enough memory.
- */
-
- unsigned *map, numbytes;
-
- numbytes = (size >> 3) + ((size & 0x07) ? 1 : 0 );
-
- #ifdef DEBUG
- printf("Making a %d bit map (%d bytes required)\n", size, numbytes);
- #endif
-
- if( map = (unsigned *) malloc( numbytes + sizeof(unsigned) ))
- *map = size;
-
- return ((BITMAP *)map);
- }
-
- setbit( c, map, val )
- unsigned c, val;
- char *map;
- {
- /* Set bit c in the map to val.
- * If c > map-size, 0 is returned, else 1 is returned.
- */
-
- if( c >= *(unsigned *)map ) /* if c >= map size */
- return 0;
-
- map += sizeof(unsigned); /* skip past size */
-
- if( val )
- map[c >> 3] |= 1 << (c & 0x07);
- else
- map[c >> 3] &= ~(1 << (c & 0x07));
-
- return( 1 );
- }
-
- testbit( c, map )
- unsigned c;
- char *map;
- {
- /* Return 1 if the bit corresponding to c in map is set.
- * 0 if it is not.
- */
-
- if( c >= *(unsigned *)map )
- return 0;
-
- map += sizeof(unsigned);
-
- return(map[ c >> 3 ] & (1 << (c & 0x07)));
- }
-
- /* catsub.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- extern char *paropen[9], *parclose[9];
-
- char *
- catsub(from, to, sub, new, newend)
- char *from, *to, *sub, *new, *newend;
- {
- char *cp, *cp2;
-
- for(cp = new; *sub != EOS && cp < newend;)
- {
- if(*sub == DITTO)
- for(cp2 = from; cp2 < to;)
- {
- *cp++ = *cp2++;
- if(cp >= newend)
- break;
- }
- else
- if (*sub == ESCAPE) {
- sub++;
- if ('1' <= *sub && *sub <= '9') {
- char *parcl = parclose[*sub - '1'];
-
- for (cp2 = paropen[*sub - '1']; cp2 < parcl;)
- {
- *cp++ = *cp2++;
- if (cp >= newend) break;
- }
- } else
- *cp++ = *sub;
- } else
- *cp++ = *sub;
-
- sub++;
- }
-
- return(cp);
- }
-
- /* ckglob.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- ckglob()
- {
- TOKEN *glbpat;
- char c, delim, *lin;
- int num;
- LINE *ptr;
-
- c = *inptr;
-
- if(c != 'g' && c != 'v')
- return(0);
-
- if (deflt(1, lastln) < 0)
- return(ERR);
-
- delim = *++inptr;
- if(delim <= ' ')
- return(ERR);
-
- glbpat = optpat();
-
- if(*inptr == delim)
- inptr++;
-
- for (num=1; num<=lastln; num++)
- {
- ptr = getptr(num);
- ptr->l_stat &= ~LGLOB;
- if (line1 <= num && num <= line2) {
- lin = gettxt(num);
- if(matchs(lin, glbpat, 0)) {
- if (c=='g') ptr->l_stat |= LGLOB;
- } else {
- if (c=='v') ptr->l_stat |= LGLOB;
- }
- }
- }
- return(1);
- }
-
- /* deflt.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- deflt(def1, def2)
- int def1, def2;
- {
- if(nlines == 0)
- {
- line1 = def1;
- line2 = def2;
- }
- if(line1 > line2 || line1 <= 0)
- return (ERR);
- }
-
- /* del.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- del(from, to)
- int from, to;
- {
- LINE *first, *last, *next, *tmp;
-
- if(from < 1)
- from = 1;
- first = getptr(prevln(from));
- last = getptr(nextln(to));
- next = first->l_next;
- while(next != last && next != &line0)
- {
- tmp = next->l_next;
- free(next);
- next = tmp;
- }
- relink(first, last, first, last);
- lastln -= (to - from)+1;
- curln = prevln(from);
- return(1);
- }
-
- /* docmd.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- char fname[MAXFNAME];
- int fchanged;
- extern int nofname;
- extern int prompt;
- extern int mark[];
-
- docmd(glob)
- int glob;
- {
- static char rhs[MAXPAT];
- TOKEN *subpat;
- int c, err, line3;
- int apflg, pflag, gflag;
- int nchng;
- char *fptr;
-
- pflag = FALSE;
- while(*inptr == SP && *inptr == HT)
- inptr++;
-
- c = *inptr++;
-
- switch(c)
- {
- case NL: /* print next line */
- if(nlines == 0)
- {
- if ((line2 = nextln(curln))==0)
- return(ERR);
- }
- curln = line2;
- return (1);
- break;
-
- case '=': /* print current line number */
- printf("%d\n",line2);
- break;
-
- case 'a': /* append lines */
- if(*inptr != NL || nlines > 1)
- return(ERR);
-
- if(append(line1, glob) < 0)
- return(ERR);;
- fchanged = TRUE;
- break;
-
- case 'c': /* changed lines */
- if(*inptr != NL)
- return(ERR);
-
- if(deflt(curln, curln) < 0)
- return(ERR);
-
- if(del(line1, line2) < 0)
- return(ERR);
- if(append(curln, glob) < 0)
- return(ERR);
- fchanged = TRUE;
- break;
-
- case 'd': /* delete lines */
- if(*inptr != NL)
- return(ERR);
-
- if(deflt(curln, curln) < 0)
- return(ERR);
-
- if(del(line1, line2) < 0)
- return(ERR);
- if(nextln(curln) != 0)
- curln = nextln(curln);
- fchanged = TRUE;
- break;
-
- case 'e': /* edit new file with change check */
- if(nlines > 0)
- return(ERR);
- if(fchanged) {
- fchanged = FALSE;
- return(ERR);
- }
- /*FALL THROUGH*/
- case 'E': /* edit new file no check */
- if(nlines > 0)
- return(ERR);
-
- if(*inptr != ' ' && *inptr != HT && *inptr != NL)
- return(ERR);
-
- if((fptr = getfn()) == NULL)
- return(ERR);
-
- clrbuf();
- if((err = doread(0, fptr)) < 0)
- return(err);
-
- strcpy(fname, fptr);
- fchanged = FALSE;
- break;
-
- case 'f': /* set or display current file name */
- if(nlines > 0)
- return(ERR);
-
- if(*inptr != ' ' && *inptr != HT && *inptr != NL)
- return(ERR);
-
- if((fptr = getfn()) == NULL)
- return(ERR);
-
- if (nofname)
- printf("%s\n", fname);
- else
- strcpy(fname, fptr);
- break;
-
- case 'H':
- case 'h': /* print last error */
- return(ERR);
- break;
-
- case 'i': /* insert lines */
- if(*inptr != NL || nlines > 1)
- return(ERR);
-
- if(append(prevln(line1), glob) < 0)
- return(ERR);
- fchanged = TRUE;
- break;
-
- case 'j': /* join lines */
- if (*inptr != NL || deflt(curln, curln+1)<0)
- return(ERR);
-
- if (join(line1, line2) < 0)
- return(ERR);
- break;
-
- case 'k': /* mark line address */
- while (*inptr == ' ' || *inptr == HT) inptr++;
-
- if (*inptr < 'a' || *inptr > 'z')
- return ERR;
- c= *inptr++;
-
- if(*inptr != ' ' && *inptr != HT && *inptr != NL)
- return(ERR);
-
- mark[c-'a'] = line1;
- break;
-
- case 'L': /* toggle verbose print */
- lflg = ~lflg;
- break;
-
- case 'l': /* print lines verbose */
- if(*inptr != NL)
- return(ERR);
- if(deflt(curln,curln) < 0)
- return(ERR);
- if (dolst(line1,line2) < 0)
- return(ERR);
- break;
-
- case 'm': /* move lines */
- if((line3 = getone()) < 0)
- return(ERR);
- if(deflt(curln,curln) < 0)
- return(ERR);
- if(move(line3) < 0)
- return(ERR);
- fchanged = TRUE;
- break;
-
- case 'N': /* toggle print line numbers */
- nflg = ~nflg;
- break;
-
- case 'n': /* print lines with numbers */
- if(*inptr != NL)
- return(ERR);
- if(deflt(curln,curln) < 0)
- return(ERR);
- if (donum(line1,line2) < 0)
- return(ERR);
- break;
-
- case 'P': /* toggle prompt */
- prompt = ~prompt;
- break;
-
- case 'p': /* print lines */
- if(*inptr != NL)
- return(ERR);
- if(deflt(curln,curln) < 0)
- return(ERR);
- if(doprnt(line1,line2) < 0)
- return(ERR);
- break;
-
- case 'q': /* quit, check changed */
- if(fchanged) {
- fchanged = FALSE;
- return(ERR);
- }
- /*FALL THROUGH*/
- case 'Q': /* quit, no check for change */
- if(*inptr == NL && nlines == 0 && !glob)
- return(EOF);
- else
- return(ERR);
-
- case 'r': /* read in file */
- if(nlines > 1)
- return(ERR);
-
- if(nlines == 0)
- line2 = lastln;
-
- if(*inptr != ' ' && *inptr != HT && *inptr != NL)
- return(ERR);
-
- if((fptr = getfn()) == NULL)
- return(ERR);
-
- if((err = doread(line2, fptr)) < 0)
- return(err);
- fchanged = TRUE;
- break;
-
- case 's': /* substitute, set */
- if(*inptr == 'e')
- return(set());
- while(*inptr == SP || *inptr == HT)
- inptr++;
- if((subpat = optpat()) == NULL)
- return(ERR);
- if((gflag = getrhs(rhs)) < 0)
- return(ERR);
- if(*inptr == 'p')
- pflag++;
- if(deflt(curln, curln) < 0)
- return(ERR);
- if((nchng = subst(subpat, rhs, gflag, pflag)) < 0)
- return(ERR);
- if(nchng)
- fchanged = TRUE;
- break;
-
- case 't': /* copy lines */
- if((line3 = getone()) < 0)
- return(ERR);
- if(deflt(curln,curln) < 0)
- return(ERR);
- if(transfer(line3) < 0)
- return(ERR);
- fchanged = TRUE;
- break;
-
- case 'u': /* undo last command */
- return(ERR);
- break;
-
- case 'W': /* write append */
- case 'w': /* write */
- apflg = (c=='W');
-
- if(*inptr != ' ' && *inptr != HT && *inptr != NL)
- return(ERR);
-
- if((fptr = getfn()) == NULL)
- return(ERR);
-
- if(deflt(1, lastln) < 0)
- return(ERR);
- if(dowrite(line1, line2, fptr, apflg) < 0)
- return(ERR);
- fchanged = FALSE;
- break;
-
- case 'x': /* write then quit */
- if(*inptr == NL && nlines == 0 && !glob)
- {
- if((fptr = getfn()) == NULL)
- return(ERR);
- if(dowrite(1, lastln, fptr, 0) >= 0)
- return(EOF);
- }
- return(ERR);
-
- case 'z': /* print +21, -21, -11.+10 lines */
- if(deflt(curln,curln) < 0)
- return(ERR);
-
- switch(*inptr)
- {
- case '-':
- if(doprnt(line1-21,line1) < 0)
- return(ERR);
- break;
-
- case '.':
- if(doprnt(line1-11,line1+10) < 0)
- return(ERR);
- break;
-
- case '+':
- case '\n':
- if(doprnt(line1,line1+21) < 0)
- return(ERR);
- break;
- }
- break;
-
- default:
- return(ERR);
- }
- return (0);
- }
-
- int dolst(line1, line2) int line1, line2;
- {
- int oldlflg=lflg, p;
-
- lflg=1;
- p=doprnt(line1, line2);
- lflg=oldlflg;
-
- return p;
- }
-
- int donum(line1, line2) int line1, line2;
- {
- int oldnflg=nflg, p;
-
- nflg=1;
- p=doprnt(line1, line2);
- nflg=oldnflg;
-
- return p;
- }
-
- /* dodash.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
-
- /* Expand the set pointed to by *src into dest.
- * Stop at delim. Return 0 on error or size of
- * character class on success. Update *src to
- * point at delim. A set can have one element
- * {x} or several elements ( {abcdefghijklmnopqrstuvwxyz}
- * and {a-z} are equivalent ). Note that the dash
- * notation is expanded as sequential numbers.
- * This means (since we are using the ASCII character
- * set) that a-Z will contain the entire alphabet
- * plus the symbols: [\]^_`. The maximum number of
- * characters in a character class is defined by maxccl.
- */
- char *
- dodash(delim, src, map)
-
- int delim;
- char *src, *map;
- {
-
- register int first, last;
- char *start;
-
- start = src;
-
- while( *src && *src != delim )
- {
- if( *src != '-')
- setbit( esc( &src ), map, 1 );
-
- else if( src == start || *(src + 1) == delim )
- setbit( '-', map, 1 );
- else {
- src++;
-
- if( *src < *(src - 2))
- {
- first = *src;
- last = *(src - 2);
- } else {
- first = *(src - 2);
- last = *src;
- }
-
- while( ++first <= last )
- setbit( first, map, 1);
-
- }
- src++;
- }
- return( src );
- }
-
- /* doglob.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- doglob()
- {
- int lin, stat;
- char *cmd;
- LINE *ptr;
-
- cmd = inptr;
-
- while(1)
- {
- for (lin=1; lin<=lastln; lin++) {
- ptr = getptr(lin);
- if (ptr->l_stat & LGLOB) break;
- }
- if (lin>lastln) break;
-
- ptr->l_stat &= ~LGLOB;
- curln = lin;
- inptr = cmd;
- if((stat = getlst()) < 0)
- return(stat);
- if((stat = docmd(1)) < 0)
- return(stat);
- }
- return(0);
- }
-
- /* doprnt.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- doprnt(from, to)
- int from, to;
- {
- int i;
-
- from = from < 1 ? 1 : from;
- to = to > lastln ? lastln : to;
-
- if(to != 0)
- {
- for(i = from; i <= to; i++)
- prntln(gettxt(i), lflg, (nflg ? i : 0));
- curln = to;
- }
-
- return(0);
- }
-
- void prntln(str, vflg, lin)
- char *str;
- int vflg, lin;
- {
- if(lin)
- printf("%d\t",lin);
- while(*str && *str != NL)
- {
- if(*str < ' ' || *str >= 0x7f)
- {
- switch(*str)
- {
- case '\t':
- if(vflg)
- putcntl(*str, stdout);
- else
- putc(*str, stdout);
- break;
-
- case DEL:
- putc('^', stdout);
- putc('?', stdout);
- break;
-
- default:
- putcntl(*str, stdout);
- break;
- }
- } else
- putc(*str, stdout);
- str++;
- }
- if(vflg)
- putc('$',stdout);
- putc('\n', stdout);
- }
-
- void putcntl(c, stream)
- char c;
- FILE *stream;
- {
- putc('^', stream);
- putc((c&31)|'@@', stream);
- }
-
- /* doread.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- extern int diag;
-
- doread(lin, fname)
- int lin;
- char *fname;
- {
- extern FILE *fopen();
- FILE *fp;
- int err;
- long bytes;
- int lines;
- static char str[MAXLINE];
-
- err = 0;
- nonascii = nullchar = truncated = 0;
-
- if (diag) printf("\"%s\" ",fname);
- if((fp = fopen(fname, "r")) == NULL)
- {
- printf("file open err\n");
- return( ERR );
- }
- curln = lin;
- for(lines = 0, bytes = 0;(err = egets(str,MAXLINE,fp)) > 0;)
- {
- bytes += strlen(str);
- if(ins(str) < 0)
- {
- printf("file insert error\n");
- err++;
- break;
- }
- lines++;
- }
- fclose(fp);
- if(err < 0)
- return(err);
- if (diag) {
- printf("%d lines %d bytes",lines,bytes);
- if(nonascii)
- printf(" [%d non-ascii]",nonascii);
- if(nullchar)
- printf(" [%d nul]",nullchar);
- if(truncated)
- printf(" [%d lines truncated]",truncated);
- printf("\n");
- }
- return( err );
- }
-
- /* dowrite.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- dowrite(from, to, fname, apflg)
- int from, to;
- char *fname;
- int apflg;
- {
- extern FILE *fopen();
- FILE *fp;
- int lin, err;
- int lines, bytes;
- char *str;
-
- err = 0;
-
- lines = bytes = 0;
- if (diag)
- printf("\"%s\" ",fname);
-
- if((fp = fopen(fname,(apflg?"a":"w"))) == NULL)
- {
- printf("file open error\n");
- return( ERR );
- }
- for(lin = from; lin <= to; lin++)
- {
- str = gettxt(lin);
- lines++;
- bytes += strlen(str);
- if(fputs(str, fp) == EOF)
- {
- printf("file write error\n");
- err++;
- break;
- }
- }
- if (diag)
- printf("%d lines %d bytes\n",lines,bytes);
-
- fclose(fp);
- return( err );
- }
-
- /* ed.c */
- /*
- * Copyright 1987 Brian Beattie Rights Reserved.
- *
- * Permission to copy and/or distribute granted under the
- * following conditions:
- *
- * 1). No charge may be made other than resonable charges
- * for reproduction.
- *
- * 2). This notice must remain intact.
- *
- * 3). No further restrictions may be added.
- *
- */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
- #include <setjmp.h>
- jmp_buf env;
-
- LINE line0;
- int curln = 0;
- int lastln = 0;
- char *inptr;
- static char inlin[MAXLINE];
- int nflg, lflg, pflg, pflag, prompt;
- int line1, line2, nlines;
- extern char fname[];
- int version = 103;
- int diag=1;
-
- void intr()
- {
- printf("?\n");
- longjmp(env, 1);
- }
-
- void main(argc,argv)
- int argc;
- char **argv;
- {
- int stat, i, doflush;
-
- edsetbuf();
- doflush=isatty(1);
-
- if (argc>1 && argv[1][0]=='-' && argv[1][1]==0) {
- diag=0;
- argc--;
- argv++;
- }
- if(argc > 1)
- {
- for(i = 1; i < argc; i++)
- {
- if(doread(0,argv[i])==0) {
- curln = 1;
- strcpy(fname, argv[i]);
- break;
- }
- }
- }
- while(1)
- {
- setjmp(env);
- signal(2, intr);
-
- if (prompt)
- {
- if (nflg) printf("%d",curln);
- printf("*");
- }
-
- if (doflush) fflush(stdout);
-
- if (fgets(inlin, sizeof(inlin),stdin) == NULL)
- {
- break;
- }
- /*
- if(*inlin == '!')
- {
- for(inptr = inlin; *inptr != NL; inptr++)
- ;
- *inptr = EOS;
- system(inlin+1);
- continue;
- }
- */
- inptr = inlin;
- if(getlst() >= 0)
- if((stat = ckglob()) != 0)
- {
- if(stat >= 0 && (stat = doglob()) >= 0)
- {
- curln = stat;
- continue;
- }
- } else {
- if((stat = docmd(0)) >= 0)
- {
- if(stat == 1)
- doprnt(curln, curln);
- continue;
- }
- }
- if(stat == EOF)
- {
- exit(0);
- }
- if(stat == FATAL)
- {
- fputs("FATAL ERROR\n",stderr);
- exit(1);
- }
- printf("?\n");
- }
- }
-
- /* egets.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- int truncflg = 1; /* truncate long line flag */
- int eightbit = 1; /* save eight bit */
- int nonascii, nullchar, truncated;
- egets(str,size,stream)
- char *str;
- int size;
- FILE *stream;
- {
- int c, count;
- char *cp;
-
- for(count = 0, cp = str; size > count;)
- {
- c = getc(stream);
- if(c == EOF)
- {
- *cp++ = '\n';
- *cp = EOS;
- if(count)
- {
- printf("[Incomplete last line]\n");
- }
- return(count);
- }
- if(c == NL)
- {
- *cp++ = c;
- *cp = EOS;
- return(++count);
- }
- if(c > 127)
- {
- if(!eightbit) /* if not saving eighth bit */
- c = c&127; /* strip eigth bit */
- nonascii++; /* count it */
- }
- if(c)
- {
- *cp++ = c; /* not null, keep it */
- count++;
- } else
- nullchar++; /* count nulls */
- }
- str[count-1] = EOS;
- if(c != NL)
- {
- printf("truncating line\n");
- truncated++;
- while((c = getc(stream)) != EOF)
- if(c == NL)
- break;
- }
- return(count);
- }
-
- /* esc.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
-
- /* Map escape sequences into their equivalent symbols. Returns the
- * correct ASCII character. If no escape prefix is present then s
- * is untouched and *s is returned, otherwise **s is advanced to point
- * at the escaped character and the translated character is returned.
- */
- esc(s)
- char **s;
- {
- register int rval;
-
-
- if (**s != ESCAPE)
- {
- rval = **s;
- } else {
- (*s)++;
-
- switch(toupper(**s))
- {
- case '\000':
- rval = ESCAPE; break;
- case 'S':
- rval = ' '; break;
- case 'N':
- rval = '\n'; break;
- case 'T':
- rval = '\t'; break;
- case 'B':
- rval = '\b'; break;
- case 'R':
- rval = '\r'; break;
- default:
- rval = **s; break;
- }
- }
-
- return (rval);
- }
-
- /* find.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- find(pat, dir)
- TOKEN *pat;
- int dir;
- {
- int i, num;
- char *lin;
-
- num=curln;
- for(i=0; i<lastln; i++)
- {
- lin = gettxt(num);
- if(matchs(lin, pat, 0))
- {
- return(num);
- }
- num = (dir ? nextln(num) : prevln(num));
- }
- return ( ERR );
- }
-
- /* getfn.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- extern char fname[MAXFNAME];
- int nofname;
-
- char *
- getfn()
- {
- static char file[256];
- char *cp;
-
- if(*inptr == NL)
- {
- nofname=TRUE;
- strcpy(file, fname);
- } else {
- nofname=FALSE;
- while(*inptr == SP || *inptr == HT)
- inptr++;
-
- cp = file;
- while(*inptr && *inptr != NL && *inptr != SP && *inptr != HT)
- {
- *cp++ = *inptr++;
- }
- *cp = '\0';
-
- if(strlen(file) == 0)
- {
- printf("bad file name\n");
- return( NULL );
- }
- }
-
- if(strlen(file) == 0)
- {
- printf("no file name\n");
- return(NULL);
- }
- return( file );
- }
-
- /* getlst.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- getlst()
- {
- int num;
-
- line2 = 0;
- for(nlines = 0; (num = getone()) >= 0;)
- {
- line1 = line2;
- line2 = num;
- nlines++;
- if(*inptr != ',' && *inptr != ';')
- break;
- if(*inptr == ';')
- curln = num;
- inptr++;
- }
- nlines = min(nlines, 2);
- if(nlines == 0)
- line2 = curln;
- if(nlines <= 1)
- line1 = line2;
-
- if(num == ERR)
- return(num);
- else
- return(nlines);
- }
-
- /* getnum.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- int mark['z'-'a'+1];
-
- getnum(first) int first;
- {
- TOKEN *srchpat;
- int num;
- char c;
-
- while(*inptr == SP || *inptr == HT)
- inptr++;
-
- if(*inptr >= '0' && *inptr <= '9') /* line number */
- {
- for(num = 0; *inptr >= '0' && *inptr <= '9';)
- {
- num = (num * 10) + *inptr - '0';
- inptr++;
- }
- return num;
- }
-
- switch(c = *inptr)
- {
- case '.':
- inptr++;
- return (curln);
-
- case '$':
- inptr++;
- return (lastln);
-
- case '/':
- case '?':
- srchpat = optpat();
- if(*inptr == c)
- inptr++;
- return(find(srchpat,c == '/'?1:0));
-
- case '-':
- case '+':
- return(first ? curln : 1);
-
- case '\'':
- inptr++;
- if (*inptr < 'a' || *inptr > 'z')
- return(EOF);
-
- return mark[ *inptr++ - 'a' ];
-
- default:
- return ( first ? EOF : 1 ); /* unknown address */
- }
- }
-
- /* getone.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- #define FIRST 1
- #define NOTFIRST 0
-
- getone()
- {
- int c, i, num;
-
- if((num = getnum(FIRST)) >= 0)
- {
- while(1)
- {
- while(*inptr == SP || *inptr == HT)
- inptr++;
-
- if(*inptr != '+' && *inptr != '-')
- break;
- c = *inptr++;
-
- if((i = getnum(NOTFIRST)) < 0)
- return ( i );
-
- if(c == '+')
- {
- num += i;
- } else {
- num -= i;
- }
- }
- }
- return ( num>lastln ? ERR : num );
- }
-
- /* getpat.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
-
- /* Translate arg into a TOKEN string */
- TOKEN *
- getpat (arg)
- char *arg;
- {
-
- return (makepat(arg, '\000'));
- }
-
- /* getptr.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- LINE *
- getptr(num)
- int num;
- {
- LINE *ptr;
- int j;
-
- if (2*num>lastln && num<=lastln) { /* high line numbers */
- ptr = line0.l_prev;
- for (j = lastln; j>num; j--)
- ptr = ptr->l_prev;
- } else { /* low line numbers */
- ptr = &line0;
- for(j = 0; j < num; j++)
- ptr = ptr->l_next;
- }
- return(ptr);
- }
-
- /* getrhs.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- getrhs(sub)
- char *sub;
- {
- if(inptr[0] == NL || inptr[1] == NL) /* check for eol */
- return( ERR );
-
- if(maksub(sub, MAXPAT) == NULL)
- return( ERR );
-
- inptr++; /* skip over delimter */
- while(*inptr == SP || *inptr == HT)
- inptr++;
- if(*inptr == 'g')
- {
- inptr++;
- return( 1 );
- }
- return( 0 );
- }
-
- /* gettxt.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- char *
- gettxt(num)
- int num;
- {
- LINE *lin;
- static char txtbuf[MAXLINE];
-
- lin = getptr(num);
- strcpy(txtbuf,lin->l_buff);
- strcat(txtbuf,"\n");
- return(txtbuf);
- }
-
- /* ins.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- ins(str)
- char *str;
- {
- char buf[MAXLINE], *cp;
- LINE *new, *cur, *nxt;
-
- cp = buf;
- while(1)
- {
- if((*cp = *str++) == NL)
- *cp = EOS;
- if(*cp)
- {
- cp++;
- continue;
- }
- if((new = (LINE *)malloc(sizeof(LINE)+strlen(buf))) == NULL)
- return( ERR ); /* no memory */
-
- new->l_stat=0;
- strcpy(new->l_buff,buf); /* build new line */
- cur = getptr(curln); /* get current line */
- nxt = getptr(nextln(curln)); /* get next line */
- relink(cur, new, new, nxt); /* add to linked list */
- relink(new, nxt, cur, new);
- lastln++;
- curln++;
-
- if(*str == EOS) /* end of line ? */
- return( 1 );
-
- cp = buf;
- }
- }
-
- /* join.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- extern int fchanged;
-
- join(first, last)
- int first, last;
- {
- char buf[MAXLINE];
- char *cp=buf, *str;
- int num;
-
- if (first<=0 || first>last || last>lastln)
- return(ERR);
- if (first==last) {
- curln=first;
- return 0;
- }
- for (num=first; num<=last; num++) {
- str=gettxt(num);
-
- while (*str!=NL && cp<buf+MAXLINE-1) *cp++ = *str++;
-
- if (cp==buf+MAXLINE-1) {
- printf("line too long\n");
- return(ERR);
- }
- }
- *cp++ = NL;
- *cp = EOS;
- del(first, last);
- curln=first-1;
- ins(buf);
- fchanged = TRUE;
- return 0;
- }
-
- /* makepat.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
-
- /*
- * Make a pattern template from the strinng pointed to by arg. Stop
- * when delim or '\000' or '\n' is found in arg. Return a pointer to
- * the pattern template.
- *
- * The pattern template used here are somewhat different than those
- * used in the "Software Tools" book; each token is a structure of
- * the form TOKEN (see tools.h). A token consists of an identifier,
- * a pointer to a string, a literal character and a pointer to another
- * token. This last is 0 if there is no subsequent token.
- *
- * The one strangeness here is caused (again) by CLOSURE which has
- * to be put in front of the previous token. To make this insertion a
- * little easier, the 'next' field of the last to point at the chain
- * (the one pointed to by 'tail) is made to point at the previous node.
- * When we are finished, tail->next is set to 0.
- */
- TOKEN *
- makepat(arg, delim)
- char *arg;
- int delim;
- {
- TOKEN *head, *tail, *ntok;
- int error;
-
- /*
- * Check for characters that aren't legal at the beginning of
- * a template.
- */
-
- if (*arg=='\0' || *arg==delim || *arg=='\n' || *arg==CLOSURE)
- return(0);
-
- error = 0;
- tail = head = NULL;
-
- while (*arg && *arg != delim && *arg != '\n' && !error)
- {
- ntok = (TOKEN *)malloc(TOKSIZE);
- ntok->lchar = '\000';
- ntok->next = 0;
-
- switch(*arg)
- {
- case ANY:
- ntok->tok = ANY;
- break;
-
- case BOL:
- if (head == 0) /* then this is the first symbol */
- ntok->tok = BOL;
- else
- ntok->tok = LITCHAR;
- ntok->lchar = BOL;
- break;
-
- case EOL:
- if(*(arg+1) == delim || *(arg+1) == '\000' ||
- *(arg+1) == '\n')
- {
- ntok->tok = EOL;
- } else {
- ntok->tok = LITCHAR;
- ntok->lchar = EOL;
- }
- break;
-
- case CLOSURE:
- if (head != 0)
- {
- switch (tail->tok)
- {
- case BOL:
- case EOL:
- case CLOSURE:
- return (0);
-
- default:
- ntok->tok = CLOSURE;
- }
- }
- break;
-
- case CCL:
-
- if(*(arg + 1) == NEGATE)
- {
- ntok->tok = NCCL;
- arg += 2;
- } else {
- ntok->tok = CCL;
- arg++;
- }
-
- if( ntok->bitmap = makebitmap(CLS_SIZE) )
- arg = dodash(CCLEND, arg, ntok->bitmap );
- else {
- fprintf(stderr,"Not enough memory for pat\n");
- error = 1;
- }
- break;
-
- default:
- if (*arg == ESCAPE && *(arg+1) == OPEN) {
- ntok->tok = OPEN;
- arg++;
- } else
- if (*arg == ESCAPE && *(arg+1) == CLOSE) {
- ntok->tok = CLOSE;
- arg++;
- } else {
- ntok->tok = LITCHAR;
- ntok->lchar = esc(&arg);
- }
- }
-
- if (error || ntok == 0)
- {
- unmakepat(head);
- return (0);
- } else if (head == 0)
- {
- /* This is the first node in the chain. */
-
- ntok->next = 0;
- head = tail = ntok;
- } else if (ntok->tok != CLOSURE)
- {
- /* Insert at end of list (after tail) */
-
- tail->next = ntok;
- ntok->next = tail;
- tail = ntok;
- } else if (head != tail)
- {
- /*
- * More than one node in the chain. Insert the
- * CLOSURE node immediately in front of tail.
- */
-
- (tail->next)->next = ntok;
- ntok->next = tail;
- } else {
- /*
- * Only one node in the chain, Insert the CLOSURE
- * node at the head of the linked list.
- */
-
- ntok->next = head;
- tail->next = ntok;
- head = ntok;
- }
- arg++;
- }
-
- tail->next = 0;
- return (head);
- }
-
- /* maksub.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- char *
- maksub(sub, subsz)
- char *sub;
- int subsz;
- {
- int size;
- char delim, *cp;
-
- size = 0;
- cp = sub;
-
- delim = *inptr++;
- for(size = 0; *inptr != delim && *inptr != NL && size < subsz; size++)
- {
- if(*inptr == '&')
- {
- *cp++ = DITTO;
- inptr++;
- } else
- if((*cp++ = *inptr++) == ESCAPE)
- {
- if (size>=subsz) return(NULL);
-
- switch(toupper(*inptr))
- {
- case NL:
- *cp++ = ESCAPE;
- break;
- case 'S':
- *cp++ = SP;
- inptr++;
- break;
- case 'N':
- *cp++ = NL;
- inptr++;
- break;
- case 'T':
- *cp++ = HT;
- inptr++;
- break;
- case 'B':
- *cp++ = BS;
- inptr++;
- break;
- case 'R':
- *cp++ = CR;
- inptr++;
- break;
- case '0': {
- int i=3;
- *cp = 0;
- do {
- if (*++inptr<'0' || *inptr >'7')
- break;
-
- *cp = (*cp<<3) | (*inptr-'0');
- } while (--i!=0);
- cp++;
- } break;
- default:
- *cp++ = *inptr++;
- break;
- }
- }
- }
- if(size >= subsz)
- return( NULL );
-
- *cp = EOS;
- return( sub );
- }
-
- /* matchs.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
-
- /*
- * Compares line and pattern. Line is a character string while pat
- * is a pattern template made by getpat().
- * Returns:
- * 1. A zero if no match was found.
- *
- * 2. A pointer to the last character satisfing the match
- * if ret_endp is non-zero.
- *
- * 3. A pointer to the beginning of the matched string if
- * ret_endp is zero.
- *
- * e.g.:
- *
- * matchs ("1234567890", getpat("4[0-9]*7), 0);
- * will return a pointer to the '4', while:
- *
- * matchs ("1234567890", getpat("4[0-9]*7), 1);
- * will return a pointer to the '7'.
- */
- char *
- matchs(line, pat, ret_endp)
- char *line;
- TOKEN *pat;
- int ret_endp;
- {
-
- char *rval, *bptr;
-
- bptr = line;
-
- while(*line)
- {
- if ((rval = amatch(line, pat, bptr)) == 0)
- {
- line++;
- } else {
- if(rval > bptr && rval > line)
- rval--; /* point to last char matched */
- rval = ret_endp ? rval : line;
- break;
- }
- }
- return (rval);
- }
-
- /* move.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- move(num)
- int num;
- {
- LINE *k0, *k1, *k2, *k3;
-
- if(line1 <= 0 || line2 < line1 || line1 <= num && num <= line2)
- return( ERR );
- k0 = getptr(prevln(line1));
- k1 = getptr(line1);
- k2 = getptr(line2);
- k3 = getptr(nextln(line2));
- lastln -= line2-line1+1;
-
- relink(k0, k3, k0, k3);
-
- if (num > line1)
- num -= line2-line1+1;
-
- curln = num + (line2 - line1 + 1);
-
- k0 = getptr(num);
- k3 = getptr(nextln(num));
- lastln += line2-line1+1;
-
- relink(k0, k1, k2, k3);
- relink(k2, k3, k0, k1);
-
- return( 1 );
- }
-
- int transfer(num)
- int num;
- {
- int mid, lin, ntrans;
-
- if (line1<=0 || line1>line2)
- return(ERR);
-
- mid= num<line2 ? num : line2;
-
- curln=num;
- ntrans=0;
-
- for (lin=line1; lin<=mid; lin++) {
- ins(gettxt(lin));
- ntrans++;
- }
- lin+=ntrans;
- line2+=ntrans;
-
- for ( ; lin<=line2; lin+=2) {
- ins(gettxt(lin));
- line2++;
- }
- return(1);
- }
-
- /* omatch.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
-
- /*
- * Match one pattern element, pointed at by pat, with the character at
- * **linp. Return non-zero on match. Otherwise, return 0. *Linp is
- * advanced to skip over the matched character; it is not advanced on
- * failure. The amount of advance is 0 for patterns that match null
- * strings, 1 otherwise. "boln" should point at the position that will
- * match a BOL token.
- */
- omatch(linp, pat, boln)
- char **linp;
- TOKEN *pat;
- char *boln;
- {
-
- register int advance;
-
- advance = -1;
-
- if (**linp)
- {
- switch (pat->tok)
- {
- case LITCHAR:
- if (**linp == pat->lchar)
- advance = 1;
- break;
-
- case BOL:
- if (*linp = boln)
- advance = 0;
- break;
-
- case ANY:
- if (**linp != '\n')
- advance = 1;
- break;
-
- case EOL:
- if (**linp == '\n')
- advance = 0;
- break;
-
- case CCL:
- if( testbit( **linp, pat->bitmap))
- advance = 1;
- break;
-
- case NCCL:
- if (!testbit (**linp, pat->bitmap))
- advance = 1;
- break;
- }
- }
- if (advance >= 0)
- *linp += advance;
-
- return (++advance);
- }
-
- /* optpat.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- TOKEN *oldpat;
-
- TOKEN *
- optpat()
- {
- char delim, str[MAXPAT], *cp;
-
- delim = *inptr++;
- cp = str;
- while(*inptr != delim && *inptr != NL)
- {
- if(*inptr == ESCAPE && inptr[1] != NL)
- *cp++ = *inptr++;
- *cp++ = *inptr++;
- }
-
- *cp = EOS;
- if(*str == EOS)
- return(oldpat);
- if(oldpat)
- unmakepat(oldpat);
- oldpat=getpat(str);
- return(oldpat);
- }
-
- /* set.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- struct tbl {
- char *t_str;
- int *t_ptr;
- int t_val;
- } *t, tbl[] = {
- "number", &nflg, TRUE,
- "nonumber", &nflg, FALSE,
- "list", &lflg, TRUE,
- "nolist", &lflg, FALSE,
- "eightbit", &eightbit, TRUE,
- "noeightbit", &eightbit, FALSE,
- "prompt", &prompt, TRUE,
- "noprompt", &prompt, FALSE,
- 0
- };
-
- set()
- {
- char word[16];
- int i;
-
- inptr++;
- if(*inptr != 't')
- {
- if(*inptr != SP && *inptr != HT && *inptr != NL)
- return(ERR);
- } else
- inptr++;
-
- if(*inptr == NL)
- return(show("all"));
- /* skip white space */
- while(*inptr == SP || *inptr == HT)
- inptr++;
-
- for(i = 0; *inptr != SP && *inptr != HT && *inptr != NL;)
- word[i++] = *inptr++;
- word[i] = EOS;
- for(t = tbl; t->t_str; t++)
- {
- if(strcmp(word,t->t_str) == 0)
- {
- *t->t_ptr = t->t_val;
- return(0);
- }
- }
- }
-
- show()
- {
- extern int version;
-
- printf("ed version %d.%d\n",version/100,version%100);
- printf("number %s, ",nflg?"ON":"OFF");
- printf("list %s, ",lflg?"ON":"OFF");
- printf("prompt %s,\n",prompt?"ON":"OFF");
- return(0);
- }
-
- /* setbuf.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- void relink(a, x, y, b)
- LINE *a, *x, *y, *b;
- {
- x->l_prev = a;
- y->l_next = b;
- }
-
- void clrbuf()
- {
- del(1, lastln);
- }
-
- void edsetbuf()
- {
- relink(&line0, &line0, &line0, &line0);
- curln = lastln = 0;
- }
-
- /* subst.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
- /* #include "ed.h" */
-
- subst(pat, sub, gflg, pflag)
- TOKEN *pat;
- char *sub;
- int gflg, pflag;
- {
- int lin, chngd, nchngd;
- char *txtptr, *txt;
- char *lastm, *m, *new, buf[MAXLINE];
-
- if(line1 <= 0)
- return( ERR );
- nchngd = 0; /* reset count of lines changed */
- for(lin = line1; lin <= line2; lin++)
- {
- txt = txtptr = gettxt(lin);
- new = buf;
- chngd = 0;
- lastm = NULL;
- while(*txtptr)
- {
- if(gflg || !chngd)
- m = amatch(txtptr, pat, txt);
- else
- m = NULL;
- if(m != NULL && lastm != m)
- {
- chngd++;
- new = catsub(txtptr, m, sub, new,
- buf+MAXLINE);
- lastm = m;
- }
- if(m == NULL || m == txtptr)
- {
- *new++ = *txtptr++;
- } else {
- txtptr = m;
- }
- }
- if(chngd)
- {
- if(new >= buf+MAXLINE)
- return( ERR );
- *new++ = EOS;
- del(lin,lin);
- ins(buf);
- nchngd++;
- if(pflag)
- doprnt(curln, curln);
- }
- }
- if(nchngd == 0 && !gflg)
- {
- return(ERR);
- }
- return( nchngd );
- }
-
- #if 0
- /* system.c */
- #define SHELL "/bin/sh"
-
- system(c)
- char *c; {
- int pid, status;
-
- switch (pid = fork()) {
- case -1:
- return -1;
- case 0:
- execl(SHELL, "sh", "-c", c, (char *) 0);
- exit(-1);
- default:
- while (wait(&status) != pid)
- ;
- }
- return status;
- }
- #endif
-
- /* unmkpat.c */
- /* #include <stdio.h> */
- /* #include "tools.h" */
-
- /* Free up the memory usde for token string */
- void unmakepat(head)
- TOKEN *head;
- {
-
- register TOKEN *old_head;
-
- while (head)
- {
- switch (head->tok)
- {
- case CCL:
- case NCCL:
- free(head->bitmap);
- /* fall through to default */
-
- default:
- old_head = head;
- head = head->next;
- free (old_head);
- break;
- }
- }
- }
-
- isatty(fd)
- int fd;
- {
- long IsInteractive();
- struct UFB *ufb;
-
- ufb = chkufb(fd);
- if (ufb == NULL)
- return(-1);
- return(IsInteractive(ufb->ufbfh) != 0);
- }
- @
-
-
- 1.4
- log
- @More amiga changes
- @
- text
- @d3 2
- d36 1
- d41 1
- a41 1
- "$Header: Rodime:ricks/ked2/ked2.c,v 1.3 89/09/01 11:02:22 rick Exp Locker: ric
- $";
- d144 1
- a144 1
- extern int unmakepat();
- a153 2
- #define max(a,b) ((a>b)?a:b)
- #define min(a,b) ((a<b)?a:b)
- d201 1
- a229 1
- register i;
- d594 1
- d614 1
- a614 1
- int i, apflg, pflag, gflag;
- d1056 1
- a1056 1
- prntln(str, vflg, lin)
- d1093 1
- a1093 1
- putcntl(c, stream)
- d1234 1
- a1234 1
- intr()
- d1240 1
- a1240 1
- main(argc,argv)
- d1244 1
- a1244 1
- int stat, i, j, doflush;
- d1246 1
- a1246 1
- setbuf();
- a1809 1
- char buf[CLS_SIZE];
- d2297 1
- a2297 1
- relink(a, x, y, b)
- d2304 1
- a2304 1
- clrbuf()
- d2309 1
- a2309 1
- int setbuf()
- d2404 1
- a2404 1
- unmakepat(head)
- d2428 5
- d2434 5
- @
-
-
- 1.3
- log
- @Amiga changes
- @
- text
- @d38 1
- a38 1
- "$Header: Quantum:ricks/ked2/ed.c,v 1.1 89/08/27 17:44:11 rick Exp Locker: rick
- $";
- d1309 1
- a1309 1
- _cleanup(); exit(0);
- d1314 1
- a1314 1
- _cleanup(); exit(1);
- @
-
-
- 1.2
- log
- @No changes
- @
- text
- @d1280 1
- d1289 1
- d2308 1
- a2308 1
- void setbuf()
- d2376 1
- d2396 1
- @
-
-
- 1.1
- log
- @Initial revision
- @
- text
- @d38 1
- a38 1
- "$Header: ed.c,v 1.6 88/05/23 16:47:56 dnix Exp $";
- @
-