diff --git a/deroff/.dockerignore b/deroff/.dockerignore new file mode 100644 index 0000000..9df3658 --- /dev/null +++ b/deroff/.dockerignore @@ -0,0 +1,5 @@ +* +!deroff.c +!inputs +!outputs +!test.sh diff --git a/deroff/Dockerfile b/deroff/Dockerfile new file mode 100644 index 0000000..f1cd54e --- /dev/null +++ b/deroff/Dockerfile @@ -0,0 +1,28 @@ +FROM ubuntu:16.04 + +# create docker user +RUN apt-get update \ + && apt-get install --no-install-recommends -y sudo \ + && useradd -ms /bin/bash docker \ + && echo 'docker ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \ + && adduser docker sudo \ + && apt-get clean \ + && mkdir -p /home/docker \ + && sudo chown -R docker /home/docker \ + && sudo chown -R docker /usr/local/bin \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +USER docker + +# install dependencies +RUN sudo apt-get update \ + && sudo apt-get install -y --no-install-recommends \ + gcc \ + libc6-dev \ + gcovr \ + && sudo apt-get clean \ + && sudo rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +WORKDIR /experiment +COPY . /experiment/ +RUN sudo chown -R docker . /tmp \ + && gcc -o deroff deroff.c diff --git a/deroff/README.txt b/deroff/README.txt new file mode 100644 index 0000000..658be81 --- /dev/null +++ b/deroff/README.txt @@ -0,0 +1,69 @@ +***************************** +* deroff utx 4.3 * +***************************** + +Description: Document processing. This benchmark and its test inputs are taken +from Miller et al.'s work on fuzz testing. + +Bug: Segmentation fault. + +Notes: + +(0) deroff-original.c is the original source code. deroff.c is a preprocessed +version of deroff-original. Regenerate deroff.c for your machine: + + gcc -E deroff_original.c > deroff.c + +Files: + +README.txt: this file + +deroff-coverage.c: deroff instrumented for path information + +deroff-original.c: original, un-preprocessed source + +deroff.c: preprocessed source + +deroff.c-baseline.c: CIL-processed program baseline output by modify + +deroff.c-best.c: a repaired variant (seed=0, mut=0.06, good_path_factor=0.01) + +deroff.c-reference.debug: output from a successful run of modify (seed=0, +mut=0.06, good_path_factor=0.01). + +deroff.c.ast: +deroff.c.ht: binary data needed by modify, information about program statements + +deroff.c.goodpath: +deroff.c.path: a "good path" and a "bad path". Required by modify. + +minimized-baseline.c: +minimized.c: Files from the minimization process. Baseline is a processed +version of deroff.c-baseline.c; minimized.c is a minimized version of some +deroff.c-best.c + +output.t1: +output.t2: +output.t4: +output.t7: +output.t8: Test reference output. + +t1: +t2: +t4: +t5: +t7: +t8: Test inputs. "Random" (taken from fuzz testing work). t5 is the "bad" test. + +test-bad.sh: "bad test" script. Passes t5 to the program under test and outputs +"t5" to the output file if the program terminates without error. + +test-good.sh: "good tests" script. Calls deroff on 5 other inputs on which +unmodified deroff doesn't segfault, compares their output to the reference +output, and outputs a line per passed test to the passed in output file. + +test-deroff.sh: script that runs modify on deroff on 100 deterministic seeds, +copies the .debug output to results/debug (which it creates) and the "best" +solution found for each to results/best. Some proportion of these runs should +succeed, but not all of them. PATH_TO_MODIFY must be set. +ultrix-deroff.patch: a minimized repair, in diff patch format. diff --git a/deroff/deroff.bugzoo.yml b/deroff/deroff.bugzoo.yml new file mode 100644 index 0000000..ab42522 --- /dev/null +++ b/deroff/deroff.bugzoo.yml @@ -0,0 +1,30 @@ +version: "1.0" + +blueprints: + - type: docker + tag: squareslab/tse2012:deroff + +bugs: + - name: tse2012:deroff + dataset: tse2012 + program: deroff + image: squareslab/tse2012:deroff + languages: + - c + source-location: /experiment + compiler: + time-limit: 20 + type: simple + context: /experiment + command: gcc -o deroff deroff.c + command_clean: rm deroff + command_with_instrumentation: | + gcc --coverage -o deroff deroff.c + coverage: + files-to-instrument: + - deroff.c + test-harness: + failing: 1 + passing: 5 + time-limit: 5 + type: genprog diff --git a/deroff/deroff.c b/deroff/deroff.c new file mode 100644 index 0000000..6950269 --- /dev/null +++ b/deroff/deroff.c @@ -0,0 +1,1476 @@ +#ifndef lint +static char *sccsid = "@(#)deroff.c 7.1 ULTRIX 7/23/92"; +#endif lint + +/************************************************************************ + * * + * Copyright (c) 1985 by * + * Digital Equipment Corporation, Maynard, MA * + * All rights reserved. * + * * + * This software is furnished under a license and may be used and * + * copied only in accordance with the terms of such license and * + * with the inclusion of the above copyright notice. This * + * software or any other copies thereof may not be provided or * + * otherwise made available to any other person. No title to and * + * ownership of the software is hereby transferred. * + * * + * This software is derived from software received from the * + * University of California, Berkeley, and from Bell * + * Laboratories. Use, duplication, or disclosure is subject to * + * restrictions under license agreements with University of * + * California and with AT&T. * + * * + * The information in this software is subject to change without * + * notice and should not be construed as a commitment by Digital * + * Equipment Corporation. * + * * + * Digital assumes no responsibility for the use or reliability * + * of its software on equipment which is not supplied by Digital. * + * * + ************************************************************************/ +/************************************************************************ + * Modification History + * + * 001 David L Ballenger, 14-Mar-1986 + * Change use of "const" as an identifier, since it is now a keyword. + * + * Based on: deroff.c 4.4 (Berkeley) 83/04/29 + * + ************************************************************************/ + +#include + +/* + * Deroff command -- strip troff, eqn, and Tbl sequences from + * a file. Has two flags argument, -w, to cause output one word per line + * rather than in the original format. + * -mm (or -ms) causes the corresponding macro's to be interpreted + * so that just sentences are output + * -ml also gets rid of lists. + * Deroff follows .so and .nx commands, removes contents of macro + * definitions, equations (both .EQ ... .EN and $...$), + * Tbl command sequences, and Troff backslash constructions. + * + * All input is through the Cget macro; + * the most recently read character is in c. + * + * Modified by Robert Henry to process -me and -man macros. + */ + +#define Cget ( (c=getc(infile)) == EOF ? eof() : ((c==ldelim)&&(filesp==files) ? skeqn() : c) ) +#define C1get ( (c=getc(infile)) == EOF ? eof() : c) + +#ifdef DEBUG +# define C _C() +# define C1 _C1() +#else not DEBUG +# define C Cget +# define C1 C1get +#endif not DEBUG + +#define SKIP while(C != '\n') +#define SKIP_TO_COM SKIP; SKIP; pc=c; while(C != '.' || pc != '\n' || C > 'Z')pc=c + +#define YES 1 +#define NO 0 +#define MS 0 /* -ms */ +#define MM 1 /* -mm */ +#define ME 2 /* -me */ +#define MA 3 /* -man */ + +#ifdef DEBUG +char *mactab[] = {"-ms", "-mm", "-me", "-ma"}; +#endif DEBUG + +#define ONE 1 +#define TWO 2 + +#define NOCHAR -2 +#define SPECIAL 0 +#define APOS 1 +#define PUNCT 2 +#define DIGIT 3 +#define LETTER 4 + +int wordflag; +int msflag; /* processing a source written using a mac package */ +int mac; /* which package */ +int disp; +int parag; +int inmacro; +int intable; +int keepblock; /* keep blocks of text; normally false when msflag */ + +char chars[128]; /* SPECIAL, PUNCT, APOS, DIGIT, or LETTER */ + +char line[512]; +char *lp; + +int c; +int pc; +int ldelim; +int rdelim; + + +int argc; +char **argv; + +char fname[50]; +FILE *files[15]; +FILE **filesp; +FILE *infile; +FILE *opn(); +/* + * Flags for matching conditions other than + * the macro name + */ +#define NONE 0 +#define FNEST 1 /* no nested files */ +#define NOMAC 2 /* no macro */ +#define MAC 3 /* macro */ +#define PARAG 4 /* in a paragraph */ +#define MSF 5 /* msflag is on */ +#define NBLK 6 /* set if no blocks to be kept */ + +/* + * Return codes from macro minions, determine where to jump, + * how to repeat/reprocess text + */ +#define COMX 1 /* goto comx */ +#define COM 2 /* goto com */ + +main(ac, av) +int ac; +char **av; +{ + register int i; + int errflg = 0; + register optchar; + FILE *opn(); + int kflag = NO; + char *p; + + wordflag = NO; + msflag = NO; + mac = ME; + disp = NO; + parag = NO; + inmacro = NO; + intable = NO; + ldelim = NOCHAR; + rdelim = NOCHAR; + keepblock = YES; + + for(argc = ac - 1, argv = av + 1; + ( (argc > 0) + && (argv[0][0] == '-') + && (argv[0][1] != '\0') ); + --argc, ++argv + ){ + for(p = argv[0]+1; *p; ++p) { + switch(*p) { + case 'p': + parag=YES; + break; + case 'k': + kflag = YES; + break; + case 'w': + wordflag = YES; + kflag = YES; + break; + case 'm': + msflag = YES; + keepblock = NO; + switch(p[1]){ + case 'm': mac = MM; p++; break; + case 's': mac = MS; p++; break; + case 'e': mac = ME; p++; break; + case 'a': mac = MA; p++; break; + case 'l': disp = YES; p++; break; + default: errflg++; break; + } + break; + default: + errflg++; + } + } + } + + if (kflag) + keepblock = YES; + if (errflg) + fatal("usage: deroff [ -w ] [ -k] [ -m (a e m s l) ] [ file ] ... \n", + (char *) NULL); + +#ifdef DEBUG + printf("msflag = %d, mac = %s, keepblock = %d, disp = %d\n", + msflag, mactab[mac], keepblock, disp); +#endif DEBUG + if (argc == 0){ + infile = stdin; + } else { + infile = opn(argv[0]); + --argc; + ++argv; + } + + + files[0] = infile; + filesp = &files[0]; + + for(i='a'; i<='z' ; ++i) + chars[i] = LETTER; + for(i='A'; i<='Z'; ++i) + chars[i] = LETTER; + for(i='0'; i<='9'; ++i) + chars[i] = DIGIT; + chars['\''] = APOS; + chars['&'] = APOS; + chars['.'] = PUNCT; + chars[','] = PUNCT; + chars[';'] = PUNCT; + chars['?'] = PUNCT; + chars[':'] = PUNCT; + work(); +} +char *calloc(); + +skeqn() +{ + while((c = getc(infile)) != rdelim) + if(c == EOF) + c = eof(); + else if(c == '"') + while( (c = getc(infile)) != '"') + if(c == EOF) + c = eof(); + else if(c == '\\') + if((c = getc(infile)) == EOF) + c = eof(); + if(msflag)return(c='x'); + return(c = ' '); +} + +FILE *opn(p) +register char *p; +{ + FILE *fd; + + if( (fd = fopen(p, "r")) == NULL) { + fprintf(stderr, "Deroff: "); + perror(p); + exit(1); + } + + return(fd); +} + +eof() +{ + if(infile != stdin) + fclose(infile); + if(filesp > files) + infile = *--filesp; + else if (argc > 0) { + infile = opn(argv[0]); + --argc; + ++argv; + } else + exit(0); + return(C); +} + +getfname() +{ + register char *p; + struct chain { + struct chain *nextp; + char *datap; + } *chainblock; + register struct chain *q; + static struct chain *namechain = NULL; + char *copys(); + + while(C == ' ') ; + + for(p = fname ; (*p=c)!= '\n' && c!=' ' && c!='\t' && c!='\\' ; ++p) + C; + *p = '\0'; + while(c != '\n') + C; + + /* see if this name has already been used */ + + for(q = namechain ; q; q = q->nextp) + if( ! strcmp(fname, q->datap)) + { + fname[0] = '\0'; + return; + } + + q = (struct chain *) calloc(1, sizeof(*chainblock)); + q->nextp = namechain; + q->datap = copys(fname); + namechain = q; +} + +fatal(s,p) +char *s, *p; +{ + fprintf(stderr, "Deroff: "); + fprintf(stderr, s, p); + exit(1); +} + +/*ARGSUSED*/ +textline(str, const_val) + char *str; + int const_val; +{ + if (wordflag) { + msputwords(0); + return; + } + puts(str); +} + +work() +{ + for( ;; ) + { + C; +#ifdef FULLDEBUG + printf("Starting work with `%c'\n", c); +#endif FULLDEBUG + if(c == '.' || c == '\'') + comline(); + else + regline(textline, TWO); + } +} + +regline(pfunc, const_val) + int (*pfunc)(); + int const_val; +{ + line[0] = c; + lp = line; + for( ; ; ) + { + if(c == '\\') { + *lp = ' '; + backsl(); + } + if(c == '\n') + break; + if(intable && c=='T') { + *++lp = C; + if(c=='{' || c=='}') { + lp[-1] = ' '; + *lp = C; + } + } else { + *++lp = C; + } + } + + *lp = '\0'; + + if(line[0] != '\0') + (*pfunc)(line, const_val); +} + +macro() +{ + if(msflag){ + do { + SKIP; + } while(C!='.' || C!='.' || C=='.'); /* look for .. */ + if(c != '\n')SKIP; + return; + } + SKIP; + inmacro = YES; +} + +tbl() +{ + while(C != '.'); + SKIP; + intable = YES; +} +stbl() +{ + while(C != '.'); + SKIP_TO_COM; + if(c != 'T' || C != 'E'){ + SKIP; + pc=c; + while(C != '.' || pc != '\n' || C != 'T' || C != 'E')pc=c; + } +} + +eqn() +{ + register int c1, c2; + register int dflg; + char last; + + last=0; + dflg = 1; + SKIP; + + for( ;;) + { + if(C1 == '.' || c == '\'') + { + while(C1==' ' || c=='\t') + ; + if(c=='E' && C1=='N') + { + SKIP; + if(msflag && dflg){ + putchar('x'); + putchar(' '); + if(last){ + putchar(last); + putchar('\n'); + } + } + return; + } + } + else if(c == 'd') /* look for delim */ + { + if(C1=='e' && C1=='l') + if( C1=='i' && C1=='m') + { + while(C1 == ' '); + if((c1=c)=='\n' || (c2=C1)=='\n' + || (c1=='o' && c2=='f' && C1=='f') ) + { + ldelim = NOCHAR; + rdelim = NOCHAR; + } + else { + ldelim = c1; + rdelim = c2; + } + } + dflg = 0; + } + + if(c != '\n') while(C1 != '\n'){ + if(chars[c] == PUNCT)last = c; + else if(c != ' ')last = 0; + } + } +} + +backsl() /* skip over a complete backslash construction */ +{ + int bdelim; + +sw: + switch(C) + { + case '"': + SKIP; + return; + case 's': + if(C == '\\') backsl(); + else { + while(C>='0' && c<='9') ; + ungetc(c,infile); + c = '0'; + } + --lp; + return; + + case 'f': + case 'n': + case '*': + if(C != '(') + return; + + case '(': + if(msflag){ + if(C == 'e'){ + if(C == 'm'){ + *lp = '-'; + return; + } + } + else if(c != '\n')C; + return; + } + if(C != '\n') C; + return; + + case '$': + C; /* discard argument number */ + return; + + case 'b': + case 'x': + case 'v': + case 'h': + case 'w': + case 'o': + case 'l': + case 'L': + if( (bdelim=C) == '\n') + return; + while(C!='\n' && c!=bdelim) + if(c == '\\') backsl(); + return; + + case '\\': + if(inmacro) + goto sw; + default: + return; + } +} + +char *copys(s) +register char *s; +{ + register char *t, *t0; + + if( (t0 = t = calloc( (unsigned)(strlen(s)+1), sizeof(*t) ) ) == NULL) + fatal("Cannot allocate memory", (char *) NULL); + + while( *t++ = *s++ ) + ; + return(t0); +} + +sce() +{ + register char *ap; + register int n, i; + char a[10]; + for(ap=a;C != '\n';ap++){ + *ap = c; + if(ap == &a[9]){ + SKIP; + ap=a; + break; + } + } + if(ap != a)n = atoi(a); + else n = 1; + for(i=0;i>8)&0xFF),((c2) =(src)&0xFF)) + +struct mactab{ + int condition; + pacmac macname; + int (*func)(); +}; +extern struct mactab troffmactab[]; +extern struct mactab ppmactab[]; +extern struct mactab msmactab[]; +extern struct mactab mmmactab[]; +extern struct mactab memactab[]; +extern struct mactab manmactab[]; +/* + * macro table initialization + */ +#define M(cond, c1, c2, func) {cond, tomac(c1, c2), func} + +/* + * Put out a macro line, using ms and mm conventions. + */ +msputmac(s, const_val) + register char *s; + int const_val; +{ + register char *t; + register found; + int last; + found = 0; + + if (wordflag) { + msputwords(YES); + return; + } + while(*s) + { + while(*s==' ' || *s=='\t') + putchar(*s++); + for(t = s ; *t!=' ' && *t!='\t' && *t!='\0' ; ++t) + ; + if(*s == '\"')s++; + if(t>s+const_val && chars[ s[0] ]==LETTER && chars[ s[1] ]==LETTER){ + while(s < t) + if(*s == '\"')s++; + else + putchar(*s++); + last = *(t-1); + found++; + } + else if(found && chars[ s[0] ] == PUNCT && s[1] == '\0') + putchar(*s++); + else{ + last = *(t-1); + s = t; + } + } + putchar('\n'); + if(msflag && chars[last] == PUNCT){ + putchar(last); + putchar('\n'); + } +} +/* + * put out words (for the -w option) with ms and mm conventions + */ +msputwords(macline) + int macline; /* is this is a macro line */ +{ + register char *p, *p1; + int i, nlet; + + for(p1 = line ; ;) { + /* + * skip initial specials ampersands and apostrophes + */ + while( chars[*p1] < DIGIT) + if(*p1++ == '\0') return; + nlet = 0; + for(p = p1 ; (i=chars[*p]) != SPECIAL ; ++p) + if(i == LETTER) ++nlet; + + if ( (macline && nlet > 1) + || (!macline && nlet > 2 + && chars[p1[0]] == LETTER + && chars[p1[1]] == LETTER) ) + { + /* + * delete trailing ampersands and apostrophes + */ + while( (p[-1]=='\'') + || (p[-1]=='&') + || (chars[p[-1]] == PUNCT) ){ + --p; + } + while(p1 < p) + putchar(*p1++); + putchar('\n'); + } else { + p1 = p; + } + } +} +/* + * put out a macro using the me conventions + */ +#define SKIPBLANK(cp) while(*cp == ' ' || *cp == '\t') { cp++; } +#define SKIPNONBLANK(cp) while(*cp !=' ' && *cp !='\cp' && *cp !='\0') { cp++; } + +meputmac(cp, const_val) + reg char *cp; + int const_val; +{ + reg char *np; + int found; + int argno; + int last; + int inquote; + + if (wordflag) { + meputwords(YES); + return; + } + for (argno = 0; *cp; argno++){ + SKIPBLANK(cp); + inquote = (*cp == '"'); + if (inquote) + cp++; + for (np = cp; *np; np++){ + switch(*np){ + case '\n': + case '\0': break; + case '\t': + case ' ': if (inquote) { + continue; + } else { + goto endarg; + } + case '"': if(inquote && np[1] == '"'){ + strcpy(np, np + 1); + np++; + continue; + } else { + *np = ' '; /* bye bye " */ + goto endarg; + } + default: continue; + } + } + endarg: ; + /* + * cp points at the first char in the arg + * np points one beyond the last char in the arg + */ + if ((argconcat == 0) || (argconcat != argno)) { + putchar(' '); + } +#ifdef FULLDEBUG + { + char *p; + printf("[%d,%d: ", argno, np - cp); + for (p = cp; p < np; p++) { + putchar(*p); + } + printf("]"); + } +#endif FULLDEBUG + /* + * Determine if the argument merits being printed + * + * const_val is the cut off point below which something + * is not a word. + */ + if ( ( (np - cp) > const_val) + && ( inquote + || (chars[cp[0]] == LETTER)) ){ + for (cp = cp; cp < np; cp++){ + putchar(*cp); + } + last = np[-1]; + found++; + } else + if(found && (np - cp == 1) && chars[*cp] == PUNCT){ + putchar(*cp); + } else { + last = np[-1]; + } + cp = np; + } + if(msflag && chars[last] == PUNCT) + putchar(last); + putchar('\n'); +} +/* + * put out words (for the -w option) with ms and mm conventions + */ +meputwords(macline) + int macline; +{ + msputwords(macline); +} +/* + * + * Skip over a nested set of macros + * + * Possible arguments to noblock are: + * + * fi end of unfilled text + * PE pic ending + * DE display ending + * + * for ms and mm only: + * KE keep ending + * + * NE undocumented match to NS (for mm?) + * LE mm only: matches RL or *L (for lists) + * + * for me: + * ([lqbzcdf] + */ + +noblock(a1, a2) + char a1, a2; +{ + register int c1,c2; + register int eqnf; + int lct; + lct = 0; + eqnf = 1; + SKIP; + while(1){ + while(C != '.') + if(c == '\n') + continue; + else + SKIP; + if((c1=C) == '\n') + continue; + if((c2=C) == '\n') + continue; + if(c1==a1 && c2 == a2){ + SKIP; + if(lct != 0){ + lct--; + continue; + } + if(eqnf) + putchar('.'); + putchar('\n'); + return; + } else if(a1 == 'L' && c2 == 'L'){ + lct++; + SKIP; + } + /* + * equations (EQ) nested within a display + */ + else if(c1 == 'E' && c2 == 'Q'){ + if ( (mac == ME && a1 == ')') + || (mac != ME && a1 == 'D') ) { + eqn(); + eqnf=0; + } + } + /* + * turning on filling is done by the paragraphing + * macros + */ + else if(a1 == 'f') { /* .fi */ + if ( (mac == ME && (c2 == 'h' || c2 == 'p')) + ||(mac != ME && (c1 == 'P' || c2 == 'P')) ) { + SKIP; + return; + } + } else { + SKIP; + } + } +} + +EQ() +{ + eqn(); + return(0); +} +domacro() +{ + macro(); + return(0); +} +PS() +{ + if (!msflag) { + inpic(); + } else { + noblock('P', 'E'); + } + return(0); +} + +skip() +{ + SKIP; + return(0); +} + +intbl() +{ + if(msflag){ + stbl(); + } + else tbl(); + return(0); +} + +outtbl(){ intable = NO; } + +so() +{ + getfname(); + if( fname[0] ) + infile = *++filesp = opn( fname ); + return(0); +} +nx() +{ + getfname(); + if(fname[0] == '\0') exit(0); + if(infile != stdin) + fclose(infile); + infile = *filesp = opn(fname); + return(0); +} +skiptocom(){ SKIP_TO_COM; return(COMX); } + +PP(c12) + pacmac c12; +{ + int c1, c2; + + frommac(c12, c1, c2); + printf(".%c%c",c1,c2); + while(C != '\n')putchar(c); + putchar('\n'); + return(0); +} +AU() +{ + if(mac==MM) { + return(0); + } else { + SKIP_TO_COM; + return(COMX); + } +} + +SH(c12) + pacmac c12; +{ + int c1, c2; + + frommac(c12, c1, c2); + + if(parag){ + printf(".%c%c",c1,c2); + while(C != '\n')putchar(c); + putchar(c); + putchar('!'); + while(1){ + while(C != '\n')putchar(c); + putchar('\n'); + if(C == '.') + return(COM); + putchar('!'); + putchar(c); + } + /*NOTREACHED*/ + } else { + SKIP_TO_COM; + return(COMX); + } +} + +UX() +{ + if(wordflag) + printf("UNIX\n"); + else + printf("UNIX "); + return(0); +} + +MMHU(c12) + pacmac c12; +{ + int c1, c2; + + frommac(c12, c1, c2); + if(parag){ + printf(".%c%c",c1,c2); + while(C != '\n')putchar(c); + putchar('\n'); + } else { + SKIP; + } + return(0); +} + +mesnblock(c12) + pacmac c12; +{ + int c1, c2; + + frommac(c12, c1, c2); + noblock(')',c2); + return(0); +} +mssnblock(c12) + pacmac c12; +{ + int c1, c2; + + frommac(c12, c1, c2); + noblock(c1,'E'); + return(0); +} +nf() +{ + noblock('f','i'); + return(0); +} + +ce() +{ + sce(); + return(0); +} + +meip(c12) + pacmac c12; +{ + if(parag) + mepp(c12); + else if (wordflag) /* save the tag */ + regline(meputmac, ONE); + else { + SKIP; + } + return(0); +} +/* + * only called for -me .pp or .sh, when parag is on + */ +mepp(c12) + pacmac c12; +{ + PP(c12); /* eats the line */ + return(0); +} +/* + * Start of a section heading; output the section name if doing words + */ +mesh(c12) + pacmac c12; +{ + if (parag) + mepp(c12); + else if (wordflag) + defcomline(c12); + else { + SKIP; + } + return(0); +} +/* + * process a font setting + */ +mefont(c12) + pacmac c12; +{ + argconcat = 1; + defcomline(c12); + argconcat = 0; + return(0); +} +manfont(c12) + pacmac c12; +{ + return(mefont(c12)); +} +manpp(c12) + pacmac c12; +{ + return(mepp(c12)); +} + +defcomline(c12) + pacmac c12; +{ + int c1, c2; + + frommac(c12, c1, c2); + if(msflag && mac==MM && c2=='L'){ + if(disp || c1 == 'R') { + noblock('L','E'); + } else { + SKIP; + putchar('.'); + } + } + else if(c1=='.' && c2=='.'){ + if(msflag){ + SKIP; + return; + } + while(C == '.') + /*VOID*/; + } + ++inmacro; + /* + * Process the arguments to the macro + */ + switch(mac){ + default: + case MM: + case MS: + if(c1 <= 'Z' && msflag) + regline(msputmac, ONE); + else + regline(msputmac, TWO); + break; + case ME: + regline(meputmac, ONE); + break; + } + --inmacro; +} + +comline() +{ + reg int c1; + reg int c2; + pacmac c12; + reg int mid; + int lb, ub; + int hit; + static int tabsize = 0; + static struct mactab *mactab = (struct mactab *)0; + reg struct mactab *mp; + + if (mactab == 0){ + buildtab(&mactab, &tabsize); + } +com: + while(C==' ' || c=='\t') + ; +comx: + if( (c1=c) == '\n') + return; + c2 = C; + if(c1=='.' && c2 !='.') + inmacro = NO; + if(msflag && c1 == '['){ + refer(c2); + return; + } + if(parag && mac==MM && c1 == 'P' && c2 == '\n'){ + printf(".P\n"); + return; + } + if(c2 == '\n') + return; + /* + * Single letter macro + */ + if (mac == ME && (c2 == ' ' || c2 == '\t') ) + c2 = ' '; + c12 = tomac(c1, c2); + /* + * binary search through the table of macros + */ + lb = 0; + ub = tabsize - 1; + while(lb <= ub){ + mid = (ub + lb) / 2; + mp = &mactab[mid]; + if (mp->macname < c12) + lb = mid + 1; + else if (mp->macname > c12) + ub = mid - 1; + else { + hit = 1; +#ifdef FULLDEBUG + printf("preliminary hit macro %c%c ", c1, c2); +#endif FULLDEBUG + switch(mp->condition){ + case NONE: hit = YES; break; + case FNEST: hit = (filesp == files); break; + case NOMAC: hit = !inmacro; break; + case MAC: hit = inmacro; break; + case PARAG: hit = parag; break; + case NBLK: hit = !keepblock; break; + default: hit = 0; + } + if (hit) { +#ifdef FULLDEBUG + printf("MATCH\n"); +#endif FULLDEBUG + switch( (*(mp->func))(c12) ) { + default: return; + case COMX: goto comx; + case COM: goto com; + } + } +#ifdef FULLDEBUG + printf("FAIL\n"); +#endif FULLDEBUG + break; + } + } + defcomline(c12); +} + +int macsort(p1, p2) + struct mactab *p1, *p2; +{ + return(p1->macname - p2->macname); +} + +int sizetab(mp) + reg struct mactab *mp; +{ + reg int i; + i = 0; + if (mp){ + for (; mp->macname; mp++, i++) + /*VOID*/ ; + } + return(i); +} + +struct mactab *macfill(dst, src) + reg struct mactab *dst; + reg struct mactab *src; +{ + if (src) { + while(src->macname){ + *dst++ = *src++; + } + } + return(dst); +} + +buildtab(r_back, r_size) + struct mactab **r_back; + int *r_size; +{ + int size; + + struct mactab *p, *p1, *p2; + struct mactab *back; + + size = sizetab(troffmactab); + size += sizetab(ppmactab); + p1 = p2 = (struct mactab *)0; + if (msflag){ + switch(mac){ + case ME: p1 = memactab; break; + case MM: p1 = msmactab; + p2 = mmmactab; break; + + case MS: p1 = msmactab; break; + case MA: p1 = manmactab; break; + default: break; + } + } + size += sizetab(p1); + size += sizetab(p2); + back = (struct mactab *)calloc(size+2, sizeof(struct mactab)); + + p = macfill(back, troffmactab); + p = macfill(p, ppmactab); + p = macfill(p, p1); + p = macfill(p, p2); + + qsort(back, size, sizeof(struct mactab), macsort); + *r_size = size; + *r_back = back; +} + +/* + * troff commands + */ +struct mactab troffmactab[] = { + M(NONE, '\\','"', skip), /* comment */ + M(NOMAC, 'd','e', domacro), /* define */ + M(NOMAC, 'i','g', domacro), /* ignore till .. */ + M(NOMAC, 'a','m', domacro), /* append macro */ + M(NBLK, 'n','f', nf), /* filled */ + M(NBLK, 'c','e', ce), /* centered */ + + M(NONE, 's','o', so), /* source a file */ + M(NONE, 'n','x', nx), /* go to next file */ + + M(NONE, 't','m', skip), /* print string on tty */ + M(NONE, 'h','w', skip), /* exception hyphen words */ + M(NONE, 0,0, 0) +}; +/* + * Preprocessor output + */ +struct mactab ppmactab[] = { + M(FNEST, 'E','Q', EQ), /* equation starting */ + M(FNEST, 'T','S', intbl), /* table starting */ + M(FNEST, 'T','C', intbl), /* alternative table? */ + M(FNEST, 'T','&', intbl), /* table reformatting */ + M(NONE, 'T','E', outtbl),/* table ending */ + M(NONE, 'P','S', PS), /* picture starting */ + M(NONE, 0,0, 0) +}; +/* + * Particular to ms and mm + */ +struct mactab msmactab[] = { + M(NONE, 'T','L', skiptocom), /* title follows */ + M(NONE, 'F','S', skiptocom), /* start footnote */ + M(NONE, 'O','K', skiptocom), /* Other kws */ + + M(NONE, 'N','R', skip), /* undocumented */ + M(NONE, 'N','D', skip), /* use supplied date */ + + M(PARAG, 'P','P', PP), /* begin parag */ + M(PARAG, 'I','P', PP), /* begin indent parag, tag x */ + M(PARAG, 'L','P', PP), /* left blocked parag */ + + M(NONE, 'A','U', AU), /* author */ + M(NONE, 'A','I', AU), /* authors institution */ + + M(NONE, 'S','H', SH), /* section heading */ + M(NONE, 'S','N', SH), /* undocumented */ + M(NONE, 'U','X', UX), /* unix */ + + M(NBLK, 'D','S', mssnblock), /* start display text */ + M(NBLK, 'K','S', mssnblock), /* start keep */ + M(NBLK, 'K','F', mssnblock), /* start float keep */ + M(NONE, 0,0, 0) +}; + +struct mactab mmmactab[] = { + M(NONE, 'H',' ', MMHU), /* -mm ? */ + M(NONE, 'H','U', MMHU), /* -mm ? */ + M(PARAG, 'P',' ', PP), /* paragraph for -mm */ + M(NBLK, 'N','S', mssnblock), /* undocumented */ + M(NONE, 0,0, 0) +}; + +struct mactab memactab[] = { + M(PARAG, 'p','p', mepp), + M(PARAG, 'l','p', mepp), + M(PARAG, 'n','p', mepp), + M(NONE, 'i','p', meip), + + M(NONE, 's','h', mesh), + M(NONE, 'u','h', mesh), + + M(NBLK, '(','l', mesnblock), + M(NBLK, '(','q', mesnblock), + M(NBLK, '(','b', mesnblock), + M(NBLK, '(','z', mesnblock), + M(NBLK, '(','c', mesnblock), + + M(NBLK, '(','d', mesnblock), + M(NBLK, '(','f', mesnblock), + M(NBLK, '(','x', mesnblock), + + M(NONE, 'r',' ', mefont), + M(NONE, 'i',' ', mefont), + M(NONE, 'b',' ', mefont), + M(NONE, 'u',' ', mefont), + M(NONE, 'q',' ', mefont), + M(NONE, 'r','b', mefont), + M(NONE, 'b','i', mefont), + M(NONE, 'b','x', mefont), + M(NONE, 0,0, 0) +}; + + +struct mactab manmactab[] = { + M(PARAG, 'B','I', manfont), + M(PARAG, 'B','R', manfont), + M(PARAG, 'I','B', manfont), + M(PARAG, 'I','R', manfont), + M(PARAG, 'R','B', manfont), + M(PARAG, 'R','I', manfont), + + M(PARAG, 'P','P', manpp), + M(PARAG, 'L','P', manpp), + M(PARAG, 'H','P', manpp), + M(NONE, 0,0, 0) +}; diff --git a/deroff/inputs/n1 b/deroff/inputs/n1 new file mode 100644 index 0000000..0a450b2 Binary files /dev/null and b/deroff/inputs/n1 differ diff --git a/deroff/inputs/p1 b/deroff/inputs/p1 new file mode 100644 index 0000000..4ba41af Binary files /dev/null and b/deroff/inputs/p1 differ diff --git a/deroff/inputs/p2 b/deroff/inputs/p2 new file mode 100644 index 0000000..05e2c63 Binary files /dev/null and b/deroff/inputs/p2 differ diff --git a/deroff/inputs/p3 b/deroff/inputs/p3 new file mode 100644 index 0000000..26017d5 Binary files /dev/null and b/deroff/inputs/p3 differ diff --git a/deroff/inputs/p4 b/deroff/inputs/p4 new file mode 100644 index 0000000..2cc8598 --- /dev/null +++ b/deroff/inputs/p4 @@ -0,0 +1,6 @@ +'"]M"@-ѓm^2)ڟD;:;Q[(wV/,1rW^əGEZ .]3aJgZHqG D!mv=lsm4`jpV=wGn ڲO׆kVh*^YeiV"1z=C$;a8P!FM|+`O[iUe`w"nuuFApok@&W ol22wFgi`SUY.= ak=7ϋkNk˔؂$!?EmV:Y*{Zg5jh=2[H ]4&5ODS9&A/{l !nbrɷPB66E\CcURO= +n](\ԉAbSQ%fMA}O+Ja9_JDB$* Ce$'# +QAdycd3*LJp݈?Q(LmЗdX_зZ7d~@\s=:mSFlKKJխ=j<gBP4o +4aNѐTKrEbGO9q'bC[lM&װ`䡄 sxYH u#os2mn?)${t5tl/l +RzylvpA<]*]FoũQ@INX +N`޴F9͟!=h sn;ކӾd1rL@p ݎ@r6_"-GTTo|a,Pk` +J/Ku=(B5[H\`054-p4zICMYONc5j[63~ޫ%gzr:%3m \ No newline at end of file diff --git a/deroff/inputs/p5 b/deroff/inputs/p5 new file mode 100644 index 0000000..33df727 --- /dev/null +++ b/deroff/inputs/p5 @@ -0,0 +1,42 @@ +'"]M"@-ѓm^2)ڟD;:;Q[(wV/,1rW^əGEZ .]3aJgZHqG D!mv=lsm4`jpV=wGn ڲO׆kVh*^YeiV"1z=C$;a8P!FM|+`O[iUe`w"nuuFApok@&W ol22wFgi`SUY.= ak=7ϋkNk˔؂$!?EmV:Y*{Zg5jh=2[H ]4&5ODS9&A/{l !nbrɷPB66E\CcURO= +n](\ԉAbSQ%fMA}O+Ja9_JDB$* Ce$'# +QAdycd3*LJp݈?Q(LmЗdX_зZ7d~@\s=:mSFlKKJխ=j<gBP4o +4aNѐTKrEbGO9q'bC[lM&װ`䡄 sxYH u#os2mn?)${t5tl/l +RzylvpA<]*]FoũQ@INX +N`޴F9͟!=h sn;ކӾd1rL@p ݎ@r6_"-GTTo|a,Pk` +J/Ku=(B5[H\`054-p4zICMYONc5j[63~ޫ%gzr:%3m] qD\`VsLzZsJ>lmXJ츟2'@7+`(]K:!&X2 ¼afhK u3Ңq` ."ǎm`ks0 ;~mQPAj7yd;r]yQt.q?+Dqż)VB}ܿCMOlQ7Gy e +);MV)ЁNM9X#(ii!uM۴= _A:lpȥ$ZħcWcc) nm]Ckďn6Q >n/FQѸRZl6`!_c^z.ZLdiÇlxv{Xc+tZkW|iOKQ׵]߄aZC̶73B"gq2z,?R`$nqL#ϗX+NdA#tj%>cH|dT,A+Bkd Tw/74kWpC`@ aaDk:E?;=ֆ}8E4 !7^O'{pӘv#aZ WDdYA7zQ +Ȅ"2AqXv,PIꏽVڗֲ8cOS=Ǐ@BtZ>gx^Sn%(/kmB`.I~,18mg}/ru+h,Y75ɪԑ8]/bSIX؄* T(t?O%ƦTv->Zin6O a:ۆE#G?mp]+z/fe)Uʛ9 JHv&by#8MSd T ^UKxL\egof:I(sˈao< uDh.ԩGO=SrdQsEg,Lt2iSt +FrCdii}O#fB*'bPaTA#)5zo1oZ|w,;ܫ_;˰ES^tm#|Қqӿjhxpkldn4ٻ#s"_8Z7I +4<7IR'Šf+·wȲP̺@嬴oD!7^--l+peW9oQ &uHC|ȹ8M+ +8`ߏS(}#ƘH; +cr7≄m +mL-r )JƸ<I "aT{ 3|vc1qN2<_?s/#U@ AӲO؝8ۭ!$^3=w}ɮlM+G(URctQ27s |p<6QM8 + %qRVT[W +/U+\H= N}23hWقևH$wJKi&tsI(]|S]vb·7t*A=43~_fˏcE-/ɷu [j U1(3" YͶЫ}$v~_'S%I2Uܥ:H9m'*6w +`z+ݘv3m=`^_[4tIn {2 Mz9Riy10O!'9S5Md+5# ~6;ȉJ/Xgh n_"D8C)Wn>q%ڲ^v%Go0tE abL9熐sϚht[FNO.ǏlZ%?B*}ђD=a .[\雌DK.݊dǂDQIqm5E{_1"F"#5]k&IpfDQWB_9l^89tL!><1L g3gA]53)ci.K+]VYrxȶ)#Fʞv3d1UNƸ[(|ckJ؈?#)jōUSUtVxSxgR!p-ϗVTIƞQLibIőò^]k0R)Α@q7yJ}(W4 +BŏT^$i fUi4D}OK]3YYn1)-pW@VeE ]P@xGZP)n 10uf0l+p:lL<#pM8'-CI[_pc:u/_%M*> Quu⪁cj ^D (ʖ| |p^َ3<U +Y \{'e2g.]^@RǪapepcCgHnw^Um,\f¥v1nuc8ӑ,<'Ch@l:;U'I'rmvSد)~q)9H$b2X/^! ԟ1 2-qOykx@eH*칖]~v+2#yHU) pu1;x ? 7T!qQ FG/TTˉ@(*Fv?]mTR]BKJ3a֐. #᤽NwQ-`.A*sS#lFhVQc<,YEOӕrh3x%o`jnLwg#w o +'Ơ0 T[n:jj;&Ţp=iJEx\~W|l0C7_-o˭knB=k+c]5N7adtT^ \]Y쇄}惞>f?RFܵ vIraҊmG ;Z+Awu^SLy2g3 YӶ$m+Jjæʌi3tgNo}ldow[!(k.9savfGDwQ|8)AU8 _Qƶ^ +;N7zA-<{IIp&#Sq;v4N5%ݼ#(Ҏw³]VF;Oۃnx 5Pb]kgLD)O{7=o8oTb|a;+!/:H%K߇Cͱ.!_sc 3ԷN~$HΩBlSk{Πg@/# ҧlߘ?^f;L{Uy<'%K ^L"T+9i*6$/_iUkNs+ѮOLJKԳA~qYx1ε9&;tGemq4,ވE&D_ r tPe /hD=^"Q/D(209>8tzҔ]gDz5BHSMrl B;}OZ? Hvpze!Qw>GlgHz1Qfƶ&=ԷqOYhMby&*b`̳?>EF+Ɣj1fL^R WQڒ7Qm.hS^ȐSNb뗅(QZ)0܂P֪[3:T҆bj*,uDu匩aM#7o=dP4g4lrJ>ji}v9r,3 MM7 +9d.hGqA.e)p3:LrO~UΫBqɯ 5]S0 4~[Өې=MB0Rp]`i^CR1@wH> mJqvYVY QK!<niK@Մg WmY56?rt^DsEfMY| TFfM73g?To|2]fKS ZRWXm+aOE['>ɶ$߮щܺdtq̲rI݅bM}ڏr5^֩7U2xPql$h2,#Ry60cnzro]"ĖCa3%]o[c=ۀ`ڂ6>GUvcJnO)>N=rMH*cU#KK~$;bBp+Qu=Z)VYWDY:N[+9^dyFπou2hl!_$ۼjI#8WiR6۔ߌzBvF>u}QaDJHĊO3ʱJfݸa KMZTXqS6V_?]xc%|(r2XKCAv]kaCŋi E w~}PGncvXjldZ]UXREo!I0LszTWۚ*~N%!yj|`gGRB2;U1aXyrʕ4bx(z^+,ac:63RD'(EHU2 +6+MlS2H%os3HVGxȨ{ك0;Uc93>&| 7FX;YgsW"ݽӅBY%S-:@|vW4葌OaBe`Ғ9eK{'^ZHRgWF)I~-cPo[^e- pAX V8&FU~g"?:For3M#f"b8MnZ'%GJ&WTdDIpp_K*\ \Ifd $ӃːM7>+RAqoe\C ,qcBSrP( 8DL`G{{{ЃiCґ C;Wt5ۡ,‹#+Mtw6J TG>(4nTCB/}TvVyMi&1 ,Zo/KI; _十ŔCR@5 #Nc~$CR@ Z6uJЗph8Hz< >ҙG=ڔ4k޾(>'_kUl>e.:JГ;x(8~%` 2W27S/Cƥ4]2LR3phu^@gqKky| pO+4#RJsգi #čk`V]+Ail,K2P "RAǗ0>-!сBjޙUq{H,h'mVf&~K-1 MKrrH"5Jka/vln;ܞ" b +%i +``wunɰJ AL.ȵ'L4Nfǔ\nɝ-MW "V~>(gR.Oh=KYwBCuNV݅f,gt?6&pg vT#bYfw]*)i|ɢ=@?b:.A0Y"݁G},-(ߒd,HN41Dh]Bb[йaq]>Ū^!Zn7S\{/Exk7 \ No newline at end of file diff --git a/deroff/outputs/p1 b/deroff/outputs/p1 new file mode 100644 index 0000000..b033c30 --- /dev/null +++ b/deroff/outputs/p1 @@ -0,0 +1,5 @@ +o&5Ƀ׋ H68Ub v}<mୣm0.,'@_::A~$K= Cc[攉sRܩuy%?/'Tyo +aKOh_d@I~ҍALq(v? lT;dV`#0N/ Co܏}H-ho0*=a {- n+2ڀJPAz9LJ~w4t>u%F$tw(i-Z-Z] +-#aXHd> +:95 ǐlL1 gp"ZV`11EzIT0)P+`qXҐϕI a!r'3)TNߵw xe ~qEBœ"zS]ij2UxB/7)B0p@J5׭E:n5QJ%AWGy|P)WL}.c +> /ZKVMB&&stY4s"m diff --git a/deroff/outputs/p2 b/deroff/outputs/p2 new file mode 100644 index 0000000..4738e37 --- /dev/null +++ b/deroff/outputs/p2 @@ -0,0 +1,45 @@ +o&5Ƀ׋ H68Ub v}<mୣm0.,'@_::A~$K= Cc[攉sRܩuy%?/'Tyo +aKOh_d@I~ҍALq(v? lT;dV`#0N/ Co܏}H-ho0*=a {- n+2ڀJPAz9LJ~w4t>u%F$tw(i-Z-Z] +-#aXHd> +:95 ǐlL1 gp"ZV`11EzIT0)P+`qXҐϕI a!r'3)TNߵw xe ~qEBœ"zS]ij2UxB/7)B0p@J5׭E:n5QJ%AWGy|P)WL}.c +> /ZKVMB&&stY4s"m +6_T|O@S Ɉ P]m8R-mr!N۹`vqJd97ykY?dD?c/|[V + +NWSu q X^Sc,t"e4 di$%l,^Ev ct o뤃'=NM2& Ak2Q+.k$(rZyH%&Egp۬b +=Y3GlreF/-7tP.PaJ$hS6hO/s yj7!~ќؾ`vD~VɪB`'ߗH]N.c6C3#g.kM?ugn [F04'cCUg5Z%d6+ˤ8{oiKQuL簦N=:i)5| d`aHS| %vNZ>Ff_U?~9DH,ksĭSKUgq/43cSG(`} $n+Ɲ*H|H~B4R{z2f$G /w0`;-|I%{OM" +:X~QflLcKiۤwz.1A>GSXX:Lba =ā:;Bj,)"gip /f[ O4 Jvvwķ*?/ފGĮ@tGX[9yJxW37z%/*@O{-@swa=ra=-2BLƇ2t#ETд2_,o5势>k S} qJIf;jy z,=a.h9;[sKk5naWE0˘r #͒j%d[Z_][ ۽ӻkݛ-YY2R%趼C +O~_8t E.`rK@+~y<غ.7RfUzT4l̎Grtj/iVX|%7&{+S--ko.Zt 6e)r`V`d[R#a햏H AQ jYW%PK1 8ݿ QF.x 3ԦBھ.Q!ؠ ~̰>VR_[`h&Dx P`+O +erfk|yz)}:[ 0h5z7eQ%2A +l34nlN(]0E).`䓲*)ȘX>1Qx}5e( hpȯh|}G/[}s"4a ԉ&on+ 2 V 8)7'7I]{jOؕh.8=O7h#ʃM媕nn6*L9UlC~uSr9&Q~g)1'†q)6%#Iir}p4 +DsUZWQt 9$pGA4lMDH#@?S#4 i!gΒO2"6OZpjv)5>HEN mG;]n&k.B +4|D;XtX4uO! n;hˢ^Hۡx`On +IɸYz T :3b2H$]]h =3 SGG/ 0獬؂ +re-a,δsj5RB*[e/ ip* !Dhf&WlgtT_ +d(Fa-I[le=DjT+A;B( ++vP_"Kiʪ 2ŦяEʸ})tgq{a(ԁcƩٜ# +EN"p0z Qq&{%DeWB5aJstuD]dWa%i2QvRf@"r ۏMi ]ts|&g }Q luu0j+JxB"C|A+^ cj9zge+we -b!Dw$|10Fyg.w}M1jp+إq4e(PVWӏFqI]wary.N^&8{NT"~0Q|#6I]cdjyW4Q~Q񴛐9"[(]tŽq=/仁oeloPK6UۍL|^A-KV^8>@]o7N7L 4bMnLz<1|x4Z`'[P⩿.#y: {z2b+rBBrÝ¥Fj |]bC_WQN$nM| S2f4 rm8{l>F'Dj5ik֑8 WVH !)gVnd;,I9OB/0")-&Nύd`,Ie^4>6wne2'_{Sw׷sbXHi9[]HGÚ:Q*4LiBmICfcANRW||BYvT1/%ck/U.:-1=XoPu1i9㒅8qr3#/P3V(yH]y}*y.M$̀om祁/ި7tL砽4ĊzdUGXGt +ZS8 &ͅTE@|9wn!) |px]"pol[U|0hLhnbQUsIgxDC|{ƒ%LzZ_&{ e).9",Xsg.4BTkF 3EldX$ vRVNEɐQ]X~&? f{fʕsnyEV =}RmWyhFKܾ?, D_N:3i7'wS0 +"CN4zWs)ؒvZF:2 9% ƭ5*ciT~tHa +7ΓzOLd˳,.ݍ_^.he7=s8؞4=>*-aS2I_^) BD +7rmk@U_;Xq +k/Wƒ@﵎'_R} Y}uf.H5 E-3m8VN>Z~6Cכp +I]#Iq4s%%&3 P/xQ}HtN>5qlTQDUJ h1rMH" w ],mb&q㧿^~oo{ F[ + +zIc 57fKrO$<OPXՍ;3~5|G':LX'P`:p #SьMBp5JPg ;u7K'9 +]Ap(g))Y +įF ʎz:ZNbajK 7!I0v1Û"W/ P+}LsߵWys^Glx/Cy@1>Z}ś$=]SQAڕEv(A>CRiYaQDו%ΨsdX[.S{kd kƤ|6$N!iF1tk~J綖nMC.Kt}EhtDC 7IwFv;=MIaw}U>N)ġ܂hz`LP1S-);* y"=~INGXpٔ+ +*C$.A ^4k`ȻҜTIw=;VGDof/˃gXbJ߽>'XMnD9iWܿ +AfkWQr' aPmؖDsYI#K^gy4{UEEe8QާAyS90qX*Qko- +y~W&ywɆ4oS.(#T.o diff --git a/deroff/outputs/p3 b/deroff/outputs/p3 new file mode 100644 index 0000000..e69de29 diff --git a/deroff/outputs/p4 b/deroff/outputs/p4 new file mode 100644 index 0000000..6baa4a0 --- /dev/null +++ b/deroff/outputs/p4 @@ -0,0 +1,5 @@ +'"]M"@-ѓm^2)ڟD;:;Q[(wV/,1rW^əGEZ .]3aJgZHqG D!mv=lsm4`jpV=wGn ڲO׆kVh*^YeiV"1z=C$;a8P!FM|+`O[iUe`w"nuuFApok@&W ol22wFgi`SUY.= ak=7ϋkNk˔؂$!?EmV:Y*{Zg5jh=2[H ]4&5ODS9&A/{l !nbrɷPB66E cURO= +n]( AbSQ%fMA}O+Ja9_JDB$* Ce$'# +QAdycd3*LJp݈?Q(LmЗdX_зZ7d~@ s=:mSFlKKJխ=j<gBP4o +4aNѐTKrEbGO9q'bC[lM&װ`䡄 sxYH u#os2mn?)${t5tl/l +RzylvpA<]*]FoũQ@INX +N`޴F9͟!=h sn;ކӾd1rL@p ݎ@r6_"-GTTo|a,Pk` diff --git a/deroff/outputs/p5 b/deroff/outputs/p5 new file mode 100644 index 0000000..0d0e338 --- /dev/null +++ b/deroff/outputs/p5 @@ -0,0 +1,41 @@ +'"]M"@-ѓm^2)ڟD;:;Q[(wV/,1rW^əGEZ .]3aJgZHqG D!mv=lsm4`jpV=wGn ڲO׆kVh*^YeiV"1z=C$;a8P!FM|+`O[iUe`w"nuuFApok@&W ol22wFgi`SUY.= ak=7ϋkNk˔؂$!?EmV:Y*{Zg5jh=2[H ]4&5ODS9&A/{l !nbrɷPB66E cURO= +n]( AbSQ%fMA}O+Ja9_JDB$* Ce$'# +QAdycd3*LJp݈?Q(LmЗdX_зZ7d~@ s=:mSFlKKJխ=j<gBP4o +4aNѐTKrEbGO9q'bC[lM&װ`䡄 sxYH u#os2mn?)${t5tl/l +RzylvpA<]*]FoũQ@INX +N`޴F9͟!=h sn;ކӾd1rL@p ݎ@r6_"-GTTo|a,Pk` +J/Ku=(B5[H `054-p4zICMYONc5j[63~ޫ%gzr:%3m] qD `VsLzZsJ>lmXJ츟2'@7+`(]K:!&X2 ¼afhK u3Ңq` ."ǎm`ks0 ;~mQPAj7yd;r]yQt.q?+Dqż)VB}ܿCMOlQ7Gy e +);MV)ЁNM9X#(ii!uM۴= _A:lpȥ$ZħcWcc) nm]Ckďn6Q >n/FQѸRZl6`!_c^z.ZLdiÇlxv{Xc+tZkW|iOKQ׵]߄aZC̶73B"gq2z,?R`$nqL#ϗX+NdA#tj%>cH|dT,A+Bkd Tw/74kWpC`@ aaDk:E?;=ֆ}8E4 !7^O'{pӘv#aZ WDdYA7zQ +Ȅ"2AqXv,PIꏽVڗֲ8cOS=Ǐ@BtZ>gx^Sn%(/kmB`.I~,18mg}/ru+h,Y75ɪԑ8]/bSIX؄* T(t?O%ƦTv->Zin6O a:ۆE#G?mp]+z/fe)Uʛ9 JHv&by#8MSd T ^UKxL egof:I(sˈao< uDh.ԩGO=SrdQsEg,Lt2iSt +FrCdii}O#fB*'bPaTA#)5zo1oZ|w,;ܫ_;˰ES^tm#|Қqӿjhxpkldn4ٻ#s"_8Z7I +4<7IR'Šf+·wȲP̺@嬴oD!7^--l+peW9oQ &uHC|ȹ8M+ +8`ߏS(}#ƘH; +cr7≄m +mL-r )JƸ<I "aT{ 3|vc1qN2<_?s/#U@ AӲO؝8ۭ!$^3=w}ɮlM+G(URctQ27s |p<6QM8 + %qRVT[W +/U+ H= N}23hWقևH$wJKi&tsI(]|S]vb·7t*A=43~_fˏcE-/ɷu [j U1(3" YͶЫ}$v~_'S%I2Uܥ:H9m'*6w +`z+ݘv3m=`^_[4tIn {2 Mz9Riy10O!'9S5Md+5# ~6;ȉJ/Xgh n_"D8C)Wn>q%ڲ^v%Go0tE abL9熐sϚht[FNO.ǏlZ%?B*}ђD=a .[ DK.݊dǂDQIqm5E{_1"F"#5]k&IpfDQWB_9l^89tL!><1L g3gA]53)ci.K+]VYrxȶ)#Fʞv3d1UNƸ[(|ckJ؈?#)jōUSUtVxSxgR!p-ϗVTIƞQLibIőò^]k0R)Α@q7yJ}(W4 +BŏT^$i fUi4D}OK]3YYn1)-pW@VeE ]P@xGZP)n 10uf0l+p:lL<#pM8'-CI[_pc:u/_%M*> Quu⪁cj ^D (ʖ| |p^َ3<U +Y {'e2g.]^@RǪapepcCgHnw^Um, ¥v1nuc8ӑ,<'Ch@l:;U'I'rmvSد)~q)9H$b2X/^! ԟ1 2-qOykx@eH*칖]~v+2#yHU) pu1;x ? 7T!qQ FG/TTˉ@(*Fv?]mTR]BKJ3a֐. #᤽NwQ-`.A*sS#lFhVQc<,YEOӕrh3x%o`jnLwg#w o +'Ơ0 T[n:jj;&Ţp=iJEx ~W|l0C7_-o˭knB=k+c]5N7adtT^ ]Y쇄}惞>f?RFܵ vIraҊmG ;Z+Awu^SLy2g3 YӶ$m+Jjæʌi3tgNo}ldow[!(k.9savfGDwQ|8)AU8 _Qƶ^ +;N7zA-<{IIp&#Sq;v4N5%ݼ#(Ҏw³]VF;Oۃnx 5Pb]kgLD)O{7=o8oTb|a;+!/:H%K߇Cͱ.!_sc 3ԷN~$HΩBlSk{Πg@/# ҧlߘ?^f;L{Uy<'%K ^L"T+9i*6$/_iUkNs+ѮOLJKԳA~qYx1ε9&;tGemq4,ވE&D_ r tPe /hD=^"Q/D(209>8tzҔ]gDz5BHSMrl B;}OZ? Hvpze!Qw>GlgHz1Qfƶ&=ԷqOYhMby&*b`̳?>EF+Ɣj1fL^R WQڒ7Qm.hS^ȐSNb뗅(QZ)0܂P֪[3:T҆bj*,uDu匩aM#7o=dP4g4lrJ>ji}v9r,3 MM7 +9d.hGqA.e)p3:LrO~UΫBqɯ 5]S0 4~[Өې=MB0Rp]`i^CR1@wH> mJqvYVY QK!<niK@Մg WmY56?rt^DsEfMY| TFfM73g?To|2]fKS ZRWXm+aOE['>ɶ$߮щܺdtq̲rI݅bM}ڏr5^֩7U2xPql$h2,#Ry60cnzro]"ĖCa3%]o[c=ۀ`ڂ6>GUvcJnO)>N=rMH*cU#KK~$;bBp+Qu=Z)VYWDY:N[+9^dyFπou2hl!_$ۼjI#8WiR6۔ߌzBvF>u}QaDJHĊO3ʱJfݸa KMZTXqS6V_?]xc%|(r2XKCAv]kaCŋi E w~}PGncvXjldZ]UXREo!I0LszTWۚ*~N%!yj|`gGRB2;U1aXyrʕ4bx(z^+,ac:63RD'(EHU2 +6+MlS2H%os3HVGxȨ{ك0;Uc93>&| 7FX;YgsW"ݽӅBY%S-:@|vW4葌OaBe`Ғ9eK{'^ZHRgWF)I~-cPo[^e- pAX V8&FU~g"?:For3M#f"b8MnZ'%GJ&WTdDIpp_K* Ifd $ӃːM7>+RAqoe ,qcBSrP( 8DL`G{{{ЃiCґ C;Wt5ۡ,‹#+Mtw6J TG>(4nTCB/}TvVyMi&1 ,Zo/KI; _十ŔCR@5 #Nc~$CR@ Z6uJЗph8Hz< >ҙG=ڔ4k޾(>'_kUl>e.:JГ;x(8~%` 2W27S/Cƥ4]2LR3phu^@gqKky| pO+4#RJsգi #čk`V]+Ail,K2P "RAǗ0>-!сBjޙUq{H,h'mVf&~K-1 MKrrH"5Jka/vln;ܞ" b +%i diff --git a/deroff/test.sh b/deroff/test.sh new file mode 100755 index 0000000..e57557e --- /dev/null +++ b/deroff/test.sh @@ -0,0 +1,17 @@ +#!/bin/bash +ulimit -c 8 +test_id=$1 +here_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +inputs="${here_dir}/inputs" +outputs="${here_dir}/outputs" +executable="${here_dir}/deroff" + +case $test_id in + p1) "${executable}" < "${inputs}/p1" |& diff "${outputs}/p1" - && exit 0;; + p2) "${executable}" < "${inputs}/p2" |& diff "${outputs}/p2" - && exit 0;; + p3) "${executable}" < "${inputs}/p3" |& diff "${outputs}/p3" - && exit 0;; + p4) "${executable}" < "${inputs}/p4" |& diff "${outputs}/p4" - && exit 0;; + p5) "${executable}" < "${inputs}/p5" |& diff "${outputs}/p5" - && exit 0;; + n1) "${executable}" < "${inputs}/n1" && exit 0;; +esac +exit 1