/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 1995-2012 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Glenn Fowler <[email protected]> *17* *18***********************************************************************/19#pragma prototyped2021#include <ast.h>22#include <ccode.h>23#include <error.h>2425#include "regex.h"2627typedef ptrdiff_t word;2829typedef struct {30unsigned char *w; /* write pointer */31unsigned char *e; /* end */32unsigned char *s; /* start */33} Text;3435extern void compile(Text*, Text*);36extern void execute(Text*, Text*);37extern word recomp(Text*, Text*, int);38extern int reexec(regex_t*, char*, size_t, size_t, regmatch_t*, int);39extern int match(unsigned char*, Text*, int);40extern int substitute(regex_t*, Text*);41extern regex_t* readdr(word);42extern void tcopy(Text*, Text*);43extern void printscript(Text*);44extern void vacate(Text*);45extern void synwarn(char*);46extern void syntax(char*);47extern void badre(regex_t*, int);48extern int readline(Text*);49extern int ateof(void);50extern void coda(void);5152#define exch(a, b, t) ((t)=(a), (a)=(b), (b)=(t))5354/* space management; assure room for n more chars in Text */55#define assure(t, n) \56do if((t)->s==0 || (t)->w>=(t)->e-(n)-1) grow((t), (n));while(0)57extern void grow(Text*, word);5859/* round character pointer up to word pointer.60portable to the cray; simpler tricks are not */6162#define wordp(p) (word*)((p) + sizeof(word) - 1 \63- ((p) + sizeof(word) - 1 - (unsigned char*)0)%sizeof(word))6465extern int reflags;66extern int recno;67extern int nflag;68extern int qflag;69extern int sflag;70extern int bflag;71extern char* stdouterr;7273extern Text files;7475extern unsigned char* map;7677/* SCRIPT LAYOUT7879script commands are packed thus:800,1,or2 address words signed + for numbers - for regexp81if 2 addresses, then another word indicates activity82positive: active, the record number where activated83negative: inactive, sign or-ed with number where deactivated84instruction word85high byte IMASK+flags; flags are NEG and SEL86next byte command code (a letter)87next two bytes, length of this command, including addrs88(length is a multiple of 4; capacity could be expanded89by counting the length in words instead of bytes)90after instruction word91on s command92offset of regexp in rebuf93word containing flags p,w plus n (g => n=0)94replacement text95word containing file designator, if flag w96on y command97256-byte transliteration table98on b and t command99offset of label in script100*/101102#define BYTE CHAR_BIT103#define IMASK 0xC0000000 /* instruction flag */104#define NEG 0x01000000 /* instruction written with ! */105#define LMASK 0xffff /* low half word */106#define AMASK 0x7fffffff /* address mask, clear sign bit */107#define INACT (~AMASK) /* inactive bit, the sign bit */108#define DOLLAR AMASK /* huge address */109#define REGADR (~AMASK) /* context address */110111extern word* instr(unsigned char*);112113#define code(inst) ((inst)>>2*BYTE & 0xff)114#define nexti(p) ((p) + (*instr(p)&LMASK))115116117