From ff3a5887fdf672da76c3a286a9b3faf9d0bceb98 Mon Sep 17 00:00:00 2001 From: ChrisTimperley Date: Sun, 28 Oct 2018 16:18:19 -0400 Subject: [PATCH 1/4] added basic deroff files --- deroff/README.txt | 69 ++ deroff/deroff.c | 1476 +++++++++++++++++++++++++++++++++++++++++++ deroff/output.t1 | 5 + deroff/output.t2 | 45 ++ deroff/output.t4 | 0 deroff/output.t7 | 5 + deroff/output.t8 | 41 ++ deroff/t1 | Bin 0 -> 1000 bytes deroff/t2 | Bin 0 -> 10000 bytes deroff/t4 | Bin 0 -> 1000 bytes deroff/t5 | Bin 0 -> 10000 bytes deroff/t7 | 6 + deroff/t8 | 42 ++ deroff/test-bad.sh | 5 + deroff/test-good.sh | 11 + 15 files changed, 1705 insertions(+) create mode 100644 deroff/README.txt create mode 100644 deroff/deroff.c create mode 100644 deroff/output.t1 create mode 100644 deroff/output.t2 create mode 100644 deroff/output.t4 create mode 100644 deroff/output.t7 create mode 100644 deroff/output.t8 create mode 100644 deroff/t1 create mode 100644 deroff/t2 create mode 100644 deroff/t4 create mode 100644 deroff/t5 create mode 100644 deroff/t7 create mode 100644 deroff/t8 create mode 100755 deroff/test-bad.sh create mode 100755 deroff/test-good.sh 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.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/output.t1 b/deroff/output.t1 new file mode 100644 index 0000000..b033c30 --- /dev/null +++ b/deroff/output.t1 @@ -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/output.t2 b/deroff/output.t2 new file mode 100644 index 0000000..4738e37 --- /dev/null +++ b/deroff/output.t2 @@ -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/output.t4 b/deroff/output.t4 new file mode 100644 index 0000000..e69de29 diff --git a/deroff/output.t7 b/deroff/output.t7 new file mode 100644 index 0000000..6baa4a0 --- /dev/null +++ b/deroff/output.t7 @@ -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/output.t8 b/deroff/output.t8 new file mode 100644 index 0000000..0d0e338 --- /dev/null +++ b/deroff/output.t8 @@ -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/t1 b/deroff/t1 new file mode 100644 index 0000000000000000000000000000000000000000..4ba41afcab8f4b728dda23038d0ec6eb205b8918 GIT binary patch literal 1000 zcmVnm?kv>$%EI6!}qlyjYy5aHut;~IIC4+4EXz)c6|pAq&yLAzv=jc;H{%= z^)N0hC+a|7m6gGvjl4PpIzbcOek4mh4MV`~@MBx%l!+3%b5a`!=iI4vnd5oWC5*A7 zu>9b@KcTBH1O^qDk0(?Dd2b3~OSIPHmru96+h|{lWI#!y;q}wy`{;g)5Yml_L73`{ zOu%vD4=AAOk^gq}KfjqEv}^{jRD?TZR>dTrFGgRMkLk-bQg~AmUk%QY1}RNTBI%Ix6fMjT>$k0cF!oh^ZvqT6;M{J z$9|76Tf8Z?U{;$KCG`w~^#O%z(5)xKtLZDiIe}~d0Q)gpw^|Svu&XZBpgUNWJlz2e ziYd@F68rT`ePT>~U47UU*XS&Vlv`aimbJ>#lFZ*6^{`O~t432OsGy|=9eo@1W=DMb zqS-Duj`<59#p*n|nvKCm)D>=gwG@KVk)6l)ph5&Uo0_2to`@~C@*`pS;R5C2l~@5tjLZ~@WWGKG z075&Q+});oWz#ZO_mfcAl{LC6j=Xakh=`=@M&t2EB`o6t35k7gT(8DcLKiF7Oy&aG zqIUEu{+SmAjIkL zH<1CtWa^n6)=GFc@coxBnmg(~YDX6cM=qXc@`qO{7+LImLxq_c&k<3;59sfyBiiSU zA^(ddTC}ZJ z;`dQ<;b5p&ngngKFwB zRd_-#_BZdADZi*fFztl(fu?ZOK=-=g6&FgGf;G$6tqumGMfEyvwBoSj&^6jo+e#%H zLErpW_ebz~e7jI7$ydw|Oa^@c=`Q8DW4{VM2`^ep4_2ZEosxeUP0vCXCJ!ca6{B?i z(OI`N8NqWR@y%@jBM%0_p@rJ-R2>F;EG+Ip&tgEKyZ6=9xk&e_6=bS8bg=prHPi%& W@d^YTHu7HvRG+61mVD$-#oPH_v+R5T literal 0 HcmV?d00001 diff --git a/deroff/t2 b/deroff/t2 new file mode 100644 index 0000000000000000000000000000000000000000..05e2c63e2bf9631ab0ba823f9b90311904ec3a0b GIT binary patch literal 10000 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 literal 0 HcmV?d00001 diff --git a/deroff/t4 b/deroff/t4 new file mode 100644 index 0000000000000000000000000000000000000000..26017d5adcc3ca93ad95dd7143277f1ca9201772 GIT binary patch literal 1000 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 literal 0 HcmV?d00001 diff --git a/deroff/t7 b/deroff/t7 new file mode 100644 index 0000000..2cc8598 --- /dev/null +++ b/deroff/t7 @@ -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/t8 b/deroff/t8 new file mode 100644 index 0000000..33df727 --- /dev/null +++ b/deroff/t8 @@ -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/test-bad.sh b/deroff/test-bad.sh new file mode 100755 index 0000000..d9b41be --- /dev/null +++ b/deroff/test-bad.sh @@ -0,0 +1,5 @@ +#!/bin/sh +ulimit -t 1 +rm -rf my.t5 +($1 < t5 >& my.t5 && (echo "t5" >> $2)) +exit 0 diff --git a/deroff/test-good.sh b/deroff/test-good.sh new file mode 100755 index 0000000..852f603 --- /dev/null +++ b/deroff/test-good.sh @@ -0,0 +1,11 @@ +#!/bin/sh +ulimit -t 2 +rm -rf my.t1 my.t2 my.t4 my.t7 my.t8 +($1 < t1 >& my.t1; diff output.t1 my.t1 && (echo "t1" >> $2)) & +($1 < t2 >& my.t2; diff output.t2 my.t2 && (echo "t2" >> $2)) & +($1 < t4 >& my.t4; diff output.t4 my.t4 && (echo "t4" >> $2)) & +($1 < t7 >& my.t7; diff output.t7 my.t7 && (echo "t7" >> $2)) & +($1 < t8 >& my.t8; diff output.t8 my.t8 && (echo "t8" >> $2)) & + +wait +exit 0 From cf986581e823b17f4906b9a2f5e9641ea114be4a Mon Sep 17 00:00:00 2001 From: ChrisTimperley Date: Sun, 28 Oct 2018 16:22:22 -0400 Subject: [PATCH 2/4] added test harness --- deroff/{t5 => inputs/n1} | Bin deroff/{t1 => inputs/p1} | Bin deroff/{t2 => inputs/p2} | Bin deroff/{t4 => inputs/p3} | Bin deroff/{t7 => inputs/p4} | 0 deroff/{t8 => inputs/p5} | 0 deroff/{output.t1 => outputs/p1} | 0 deroff/{output.t2 => outputs/p2} | 0 deroff/{output.t4 => outputs/p3} | 0 deroff/{output.t7 => outputs/p4} | 0 deroff/{output.t8 => outputs/p5} | 0 deroff/test-bad.sh | 5 ----- deroff/test-good.sh | 11 ----------- deroff/test.sh | 17 +++++++++++++++++ 14 files changed, 17 insertions(+), 16 deletions(-) rename deroff/{t5 => inputs/n1} (100%) rename deroff/{t1 => inputs/p1} (100%) rename deroff/{t2 => inputs/p2} (100%) rename deroff/{t4 => inputs/p3} (100%) rename deroff/{t7 => inputs/p4} (100%) rename deroff/{t8 => inputs/p5} (100%) rename deroff/{output.t1 => outputs/p1} (100%) rename deroff/{output.t2 => outputs/p2} (100%) rename deroff/{output.t4 => outputs/p3} (100%) rename deroff/{output.t7 => outputs/p4} (100%) rename deroff/{output.t8 => outputs/p5} (100%) delete mode 100755 deroff/test-bad.sh delete mode 100755 deroff/test-good.sh create mode 100755 deroff/test.sh diff --git a/deroff/t5 b/deroff/inputs/n1 similarity index 100% rename from deroff/t5 rename to deroff/inputs/n1 diff --git a/deroff/t1 b/deroff/inputs/p1 similarity index 100% rename from deroff/t1 rename to deroff/inputs/p1 diff --git a/deroff/t2 b/deroff/inputs/p2 similarity index 100% rename from deroff/t2 rename to deroff/inputs/p2 diff --git a/deroff/t4 b/deroff/inputs/p3 similarity index 100% rename from deroff/t4 rename to deroff/inputs/p3 diff --git a/deroff/t7 b/deroff/inputs/p4 similarity index 100% rename from deroff/t7 rename to deroff/inputs/p4 diff --git a/deroff/t8 b/deroff/inputs/p5 similarity index 100% rename from deroff/t8 rename to deroff/inputs/p5 diff --git a/deroff/output.t1 b/deroff/outputs/p1 similarity index 100% rename from deroff/output.t1 rename to deroff/outputs/p1 diff --git a/deroff/output.t2 b/deroff/outputs/p2 similarity index 100% rename from deroff/output.t2 rename to deroff/outputs/p2 diff --git a/deroff/output.t4 b/deroff/outputs/p3 similarity index 100% rename from deroff/output.t4 rename to deroff/outputs/p3 diff --git a/deroff/output.t7 b/deroff/outputs/p4 similarity index 100% rename from deroff/output.t7 rename to deroff/outputs/p4 diff --git a/deroff/output.t8 b/deroff/outputs/p5 similarity index 100% rename from deroff/output.t8 rename to deroff/outputs/p5 diff --git a/deroff/test-bad.sh b/deroff/test-bad.sh deleted file mode 100755 index d9b41be..0000000 --- a/deroff/test-bad.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -ulimit -t 1 -rm -rf my.t5 -($1 < t5 >& my.t5 && (echo "t5" >> $2)) -exit 0 diff --git a/deroff/test-good.sh b/deroff/test-good.sh deleted file mode 100755 index 852f603..0000000 --- a/deroff/test-good.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -ulimit -t 2 -rm -rf my.t1 my.t2 my.t4 my.t7 my.t8 -($1 < t1 >& my.t1; diff output.t1 my.t1 && (echo "t1" >> $2)) & -($1 < t2 >& my.t2; diff output.t2 my.t2 && (echo "t2" >> $2)) & -($1 < t4 >& my.t4; diff output.t4 my.t4 && (echo "t4" >> $2)) & -($1 < t7 >& my.t7; diff output.t7 my.t7 && (echo "t7" >> $2)) & -($1 < t8 >& my.t8; diff output.t8 my.t8 && (echo "t8" >> $2)) & - -wait -exit 0 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 From 991268d069b93842a93c57688a14cb6a264ddea6 Mon Sep 17 00:00:00 2001 From: ChrisTimperley Date: Sun, 28 Oct 2018 16:29:51 -0400 Subject: [PATCH 3/4] added Dockerfile --- deroff/.dockerignore | 5 +++++ deroff/Dockerfile | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 deroff/.dockerignore create mode 100644 deroff/Dockerfile 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 From f12ef320d5eb4f815ff775fe96e833da36b52b32 Mon Sep 17 00:00:00 2001 From: ChrisTimperley Date: Sun, 28 Oct 2018 16:31:04 -0400 Subject: [PATCH 4/4] added bugzoo manifest --- deroff/deroff.bugzoo.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 deroff/deroff.bugzoo.yml 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