|
|
researchv10 Norman
mkdir math fio libc
# To unbundle, sh this file
echo ./libc/README 1>&2
sed 's/.//' >./libc/README <<'//GO.SYSIN DD ./libc/README'
-here (as in ../fio) you have to add whatever commands
-you need to set up an archive in the shell file `gen'.
//GO.SYSIN DD ./libc/README
echo ./libc/doprint.c 1>&2
sed 's/.//' >./libc/doprint.c <<'//GO.SYSIN DD ./libc/doprint.c'
-#include <varargs.h>
-
-#define SIZE 1024
-#define FUNSIGN 4
-#define FSHORT 2
-#define FLONG 1
-#define PTR sizeof (char *)
-#define SHORT sizeof (int)
-#define INT sizeof (int)
-#define LONG sizeof (long)
-#define FLOAT sizeof (double)
-#define FDIGIT 30
-#define FDEFLT 8
-#define IDIGIT 40
-#define MAXCONV 30
-
-static char *out, *eout;
-static convcount = { 13 };
-
-static noconv();
-static cconv(), dconv(), hconv(), lconv();
-static oconv(), sconv(), uconv(), xconv();
-
-static econv(), fconv(), gconv(), percent();
-int printcol;
-static
-int (*fmtconv[MAXCONV])() =
-{
- noconv,
- cconv, dconv, hconv, lconv,
- oconv, sconv, uconv, xconv,
- econv, fconv, gconv, percent,
-};
-static
-char fmtindex[128] =
-{
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 2, 9,10,11, 3, 0, 0, 0, 4, 0, 0, 5,
- 0, 0, 0, 6, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
-};
-
-fmtinstall(c, f)
-char c;
-int (*f)();
-{
-
- c &= 0177;
- if(fmtindex[c] == 0) {
- if(convcount >= MAXCONV)
- return 1;
- fmtindex[c] = convcount++;
- }
- fmtconv[fmtindex[c]] = f;
- return 0;
-}
-
-char*
-donprint(s, es, fmt, argpp)
-char *s, *es;
-register char *fmt;
-va_list *argpp;
-{
- register int f1, f2, f3, sf1, c;
- char *sout, *seout;
-
- sout = out;
- seout = eout;
- out = s;
- eout = es-1;
-loop:
- c = *fmt++;
- if(c != '%') {
- if(c == 0) {
- *out = 0;
- s = out;
- out = sout;
- eout = seout;
- return s;
- }
- if(out < eout)
- *out++ = c;
- printcol++;
- if(c == '\n')
- printcol = 0; else
- if(c == '\t')
- printcol = (printcol+7) & ~7;
- goto loop;
- }
- f1 = 0;
- f2 = -1;
- f3 = 0;
- c = *fmt++;
- sf1 = 0;
- if(c == '-') {
- sf1 = 1;
- c = *fmt++;
- }
- while(c >= '0' && c <= '9') {
- f1 = f1*10 + c-'0';
- c = *fmt++;
- }
- if(sf1)
- f1 = -f1;
- if(c != '.')
- goto l1;
- c = *fmt++;
- while(c >= '0' && c <= '9') {
- if(f2 < 0)
- f2 = 0;
- f2 = f2*10 + c-'0';
- c = *fmt++;
- }
-l1:
- if(c == 0)
- fmt--;
- /* NB: first arg is now a (va_list *) */
- c = (*fmtconv[fmtindex[c&0177]])(argpp, f1, f2, f3);
- if(c < 0) {
- f3 |= -c;
- c = *fmt++;
- goto l1;
- }
-#ifdef notdef
- argp += c; /* increment is now done in called routine by va_arg() */
-#endif
- goto loop;
-}
-
-numbconv(o, f1, f2, f3, b)
-va_list *o;
-{
- char s[IDIGIT];
- register long v;
- register int i, f, n, r;
-
- switch(f3 & (FLONG|FSHORT|FUNSIGN)) {
- case FLONG:
- v = va_arg(*o, long);
- r = LONG;
- break;
-
- case FUNSIGN|FLONG:
- v = va_arg(*o, unsigned long);
- r = LONG;
- break;
-
- /* NB: a (unsigned) short argument is promoted to an (unsigned) int arg. */
- case FSHORT:
- v = (short)va_arg(*o, int);
- r = SHORT;
- break;
-
- case FUNSIGN|FSHORT:
- v = (unsigned short)va_arg(*o, unsigned);
- r = SHORT;
- break;
-
- default:
- v = va_arg(*o, int);
- r = INT;
- break;
-
- case FUNSIGN:
- v = va_arg(*o, unsigned);
- r = INT;
- break;
- }
- f = 0;
- if(!(f3 & FUNSIGN) && v < 0) {
- v = -v;
- f = 1;
- }
- s[IDIGIT-1] = 0;
- for(i = IDIGIT-2; i >= 1; i--) {
- n = (unsigned long)v % b;
- n += '0';
- if(n > '9')
- n += 'a' - ('9'+1);
- s[i] = n;
- v = (unsigned long)v / b;
- if(f2 >= 0 && i >= IDIGIT-f2)
- continue;
- if(v <= 0)
- break;
- }
- if(f)
- s[--i] = '-';
- strconv(s+i, f1, -1);
- return r;
-}
-
-char*
-doprint(s, fmt, argp)
-char *s, *fmt;
-va_list *argp;
-{
-
- return donprint(s, s+SIZE, fmt, argp);
-}
-
-/*
- if you change this, change chconv
-*/
-
-strconv(o, f1, f2)
-char *o;
-{
- register int n, c;
- register char *s;
-
- n = 0;
- for(s = o; *s++;)
- n++;
- if(f1 >= 0)
- while(n < f1) {
- if(out < eout)
- *out++ = ' ';
- printcol++;
- n++;
- }
- for(s=o; c = *s++;)
- if(f2 != 0) {
- if(out < eout)
- *out++ = c;
- printcol++;
- if(c == '\n')
- printcol = 0; else
- if(c == '\t')
- printcol = (printcol+7) & ~7;
- f2--;
- }
- if(f1 < 0) {
- f1 = -f1;
- while(n < f1) {
- if(out < eout)
- *out++ = ' ';
- printcol++;
- n++;
- }
- }
-}
-
-chconv(o, f1)
-char o;
-{
- register int n;
-
- n = 1;
- if(f1 >= 0)
- while(n < f1) {
- if(out < eout)
- *out++ = ' ';
- printcol++;
- n++;
- }
- if(out < eout)
- *out++ = o;
- printcol++;
- if(o == '\n')
- printcol = 0; else
- if(o == '\t')
- printcol = (printcol+7) & ~7;
- if(f1 < 0) {
- f1 = -f1;
- while(n < f1) {
- if(out < eout)
- *out++ = ' ';
- printcol++;
- n++;
- }
- }
-}
-
-/* ARGSUSED */
-static
-noconv(o, f1, f2, f3)
-char *o;
-{
-
- strconv("***", 0, -1);
- return 0;
-}
-
-/* ARGSUSED */
-static
-cconv(o, f1, f2, f3)
-va_list *o;
-{
- chconv((char)va_arg(*o, int), f1);
- return INT;
-}
-
-static
-dconv(o, f1, f2, f3)
-va_list *o;
-{
- int r;
-
- r = numbconv(o, f1, f2, f3, 10);
- return r;
-}
-
-/* ARGSUSED */
-static
-hconv(o, f1, f2, f3)
-{
- return -FSHORT;
-}
-
-/* ARGSUSED */
-static
-lconv(o, f1, f2, f3)
-{
-
- return -FLONG;
-}
-
-static
-oconv(o, f1, f2, f3)
-va_list *o;
-{
- int r;
-
- r = numbconv(o, f1, f2, f3, 8);
- return r;
-}
-
-/* ARGSUSED */
-static
-sconv(o, f1, f2, f3)
-va_list *o;
-{
-
- strconv(va_arg(*o, char *), f1, f2);
- return PTR;
-}
-
-/* ARGSUSED */
-static
-uconv(o, f1, f2, f3)
-{
- return -FUNSIGN;
-}
-
-static
-xconv(o, f1, f2, f3)
-va_list *o;
-{
- int r;
-
- r = numbconv(o, f1, f2, f3, 16);
- return r;
-}
-
-double pow10(), frexp();
-/* ARGSUSED */
-fltconv(f, f1, f2, f3, c)
-register double f;
-{
- char s1[FDIGIT+10], s2[FDIGIT+10];
- register double g;
- register int d, i, n, s;
- double h;
- int e;
- int c1, c2, c3;
-
- s = 0;
- if(f < 0) {
- f = -f;
- s++;
- }
-
-loop:
- e = 0;
- g = 0;
- if(f != 0) {
- g = frexp(f, &e);
- e = e * .30103;
- d = e/2;
- h = f * pow10(-d); /* 10**-e in 2 parts */
- g = h * pow10(d-e);
- while(g < 1) {
- e--;
- g = h * pow10(d-e);
- }
- while(g >= 10) {
- e++;
- g = h * pow10(d-e);
- }
- }
- if(f2 < 0)
- f2 = FDEFLT;
- if(c == 'g' && f2 > 0)
- f2--;
- if(f2 > FDIGIT)
- f2 = FDIGIT;
- /*
- * n is number of digits to convert
- * 1 before, f2 after, 1 extra for rounding
- */
- n = f2 + 2;
- if(c == 'f') {
- /*
- * e+1 before, f2 after, 1 extra
- */
- n += e;
- if(n <= 0) {
- n = 1;
- g = 0;
- }
- }
- if(n >= FDIGIT+2) {
- if(c == 'e')
- f2 = -1;
- c = 'e';
- goto loop;
- }
- /*
- * convert n digits
- */
- for(i=0; i<n; i++) {
- d = g;
- if(d > g)
- d--;
- g -= d;
- s1[i+1] = d + '0';
- g *= 10;
- }
- /*
- * round by adding .5 into extra digit
- */
- d = 5;
- for(i=n-1; i>=0; i--) {
- s1[i+1] += d;
- d = 0;
- if(s1[i+1] > '9') {
- s1[i+1] -= 10;
- d++;
- }
- }
- i = 1;
- if(d) {
- s1[0] = '1';
- e++;
- i = 0;
- }
- /*
- * copy into final place
- * c1 digits of leading '0'
- * c2 digits from conversion
- * c3 digits after '.'
- */
- d = 0;
- if(s)
- s2[d++] = '-';
- c1 = 0;
- c2 = f2 + 1;
- c3 = f2;
- if(c == 'g')
- if(e >= -5 && e <= f2) {
- c1 = -e - 1;
- c3 = c1;
- if(c1 < 0)
- c1 = 0;
- c3 = f2 - e;
- c = 'h';
- }
- if(c == 'f') {
- c1 = -e;
- if(c1 < 0)
- c1 = 0;
- if(c1 > f2)
- c1 = c2;
- c2 += e;
- if(c2 < 0)
- c2 = 0;
- }
- while(c1 > 0) {
- if(c1+c2 == c3)
- s2[d++] = '.';
- s2[d++] = '0';
- c1--;
- }
- while(c2 > 0) {
- if(c1+c2 == c3)
- s2[d++] = '.';
- s2[d++] = s1[i++];
- c2--;
- }
- /*
- * strip trailing '0' on g conv
- */
- if(c == 'g' || c == 'h') {
- for(n=d-1; n>=0; n--)
- if(s2[n] != '0')
- break;
- for(i=n; i>=0; i--)
- if(s2[i] == '.') {
- d = n;
- if(i != n)
- d++;
- break;
- }
- }
- if(c == 'e' || c == 'g') {
- s2[d++] = 'e';
- s2[d++] = '+';
- c1 = e;
- if(c1 < 0) {
- s2[d-1] = '-';
- c1 = -c1;
- }
- if(c1 >= 100) {
- s2[d++] = c1/100 + '0';
- c1 %= 100;
- }
- s2[d++] = c1/10 + '0';
- s2[d++] = c1%10 + '0';
- }
- s2[d] = 0;
- strconv(s2, f1, -1);
- return FLOAT;
-}
-
-static
-econv(o, f1, f2, f3)
-va_list *o;
-{
-
- return fltconv(va_arg(*o, double), f1, f2, f3, 'e');
-}
-
-static
-fconv(o, f1, f2, f3)
-va_list *o;
-{
-
- return fltconv(va_arg(*o, double), f1, f2, f3, 'f');
-}
-
-static
-gconv(o, f1, f2, f3)
-va_list *o;
-{
-
- return fltconv(va_arg(*o, double), f1, f2, f3, 'g');
-}
-
-static
-percent()
-{
-
- if(out < eout)
- *out++ = '%';
- return 0;
-}
//GO.SYSIN DD ./libc/doprint.c
echo ./libc/exit.c 1>&2
sed 's/.//' >./libc/exit.c <<'//GO.SYSIN DD ./libc/exit.c'
-#include <libc.h>
-
-extern int (*_onexitfns[])();
-
-void
-exit(status)
-{
- int i, (*f)();
-
- for(i = NONEXIT-1; i >= 0; i--)
- if(_onexitfns[i]){
- f = _onexitfns[i];
- _onexitfns[i] = 0; /* self defense against bozos */
- (*f)();
- }
- _exit(status);
-}
//GO.SYSIN DD ./libc/exit.c
echo ./libc/regcomp.c 1>&2
sed 's/.//' >./libc/regcomp.c <<'//GO.SYSIN DD ./libc/regcomp.c'
-#include <libc.h>
-#include "regprog.h"
-
-/*
- * Parser Information
- */
-typedef struct Node{
- Inst *first;
- Inst *last;
-}Node;
-#define NSTACK 20
-static Node andstack[NSTACK];
-static Node *andp;
-static int atorstack[NSTACK];
-static int *atorp;
-static int cursubid; /* id of current subexpression */
-static int subidstack[NSTACK]; /* parallel to atorstack */
-static int *subidp;
-static int lastwasand; /* Last token was operand */
-static int nbra;
-static char *exprp; /* pointer to next character in source expression */
-static int nclass;
-static Class *classp;
-static Inst *freep;
-static int errors;
-
-/* predeclared crap */
-static void operator();
-static void pushand();
-static void pushator();
-static void evaluntil();
-static void bldcclass();
-
-static void
-rcerror(s)
- char *s;
-{
- errors++;
- regerror(s);
-}
-
-static Inst *
-newinst(t)
- int t;
-{
- freep->type=t;
- freep->left=0;
- freep->right=0;
- return freep++;
-}
-
-static void
-operand(t)
- int t;
-{
- register Inst *i;
- if(lastwasand)
- operator(CAT); /* catenate is implicit */
- i=newinst(t);
- if(t==CCLASS) /* ugh */
- i->right=(Inst *)&(classp[nclass-1]); /* UGH! */
- pushand(i, i);
- lastwasand=TRUE;
-}
-
-static void
-operator(t)
- int t;
-{
- if(t==RBRA && --nbra<0)
- rcerror("unmatched right paren");
- if(t==LBRA) {
- if (++cursubid >= NSUBEXP)
- rcerror ("too many subexpressions");
- nbra++;
- if (lastwasand)
- operator(CAT);
- } else
- evaluntil(t);
- if(t!=RBRA)
- pushator(t);
- lastwasand=FALSE;
- if(t==STAR || t==QUEST || t==PLUS || t==RBRA)
- lastwasand=TRUE; /* these look like operands */
-}
-
-static void
-regerr2(s, c)
- char *s;
-{
- char buf[100];
- char *cp = buf;
- while(*s)
- *cp++ = *s++;
- *cp++ = c;
- *cp = '\0';
- rcerror(buf);
-}
-
-static void
-cant(s)
- char *s;
-{
- char buf[100];
- strcpy(buf, "can't happen: ");
- strcat(buf, s);
- rcerror(buf);
-}
-
-static void
-pushand(f, l)
- Inst *f, *l;
-{
- if(andp >= &andstack[NSTACK])
- cant("operand stack overflow");
- andp->first=f;
- andp->last=l;
- andp++;
-}
-
-static void
-pushator(t)
- int t;
-{
- if(atorp >= &atorstack[NSTACK])
- cant("operator stack overflow");
- *atorp++=t;
- *subidp++=cursubid;
-}
-
-static Node *
-popand(op)
-{
- register Inst *inst;
-
- if(andp <= &andstack[0]) {
- regerr2("missing operand for ", op);
- inst=newinst(NOP);
- pushand(inst,inst);
- }
- return --andp;
-}
-
-static int
-popator()
-{
- if(atorp <= &atorstack[0])
- cant("operator stack underflow");
- --subidp;
- return *--atorp;
-}
-
-static void
-evaluntil(pri)
- register pri;
-{
- register Node *op1, *op2;
- register Inst *inst1, *inst2;
-
- while(pri==RBRA || atorp[-1]>=pri){
- switch(popator()){
- default:
- rcerror("unknown operator in evaluntil");
- break;
- case LBRA: /* must have been RBRA */
- op1=popand('(');
- inst2=newinst(RBRA);
- inst2->subid = *subidp;
- op1->last->next = inst2;
- inst1=newinst(LBRA);
- inst1->subid = *subidp;
- inst1->next=op1->first;
- pushand(inst1, inst2);
- return;
- case OR:
- op2=popand('|');
- op1=popand('|');
- inst2=newinst(NOP);
- op2->last->next=inst2;
- op1->last->next=inst2;
- inst1=newinst(OR);
- inst1->right=op1->first;
- inst1->left=op2->first;
- pushand(inst1, inst2);
- break;
- case CAT:
- op2=popand(0);
- op1=popand(0);
- op1->last->next=op2->first;
- pushand(op1->first, op2->last);
- break;
- case STAR:
- op2=popand('*');
- inst1=newinst(OR);
- op2->last->next=inst1;
- inst1->right=op2->first;
- pushand(inst1, inst1);
- break;
- case PLUS:
- op2=popand('+');
- inst1=newinst(OR);
- op2->last->next=inst1;
- inst1->right=op2->first;
- pushand(op2->first, inst1);
- break;
- case QUEST:
- op2=popand('?');
- inst1=newinst(OR);
- inst2=newinst(NOP);
- inst1->left=inst2;
- inst1->right=op2->first;
- op2->last->next=inst2;
- pushand(inst1, inst2);
- break;
- }
- }
-}
-
-static Prog *
-optimize(pp)
- Prog *pp;
-{
- register Inst *inst, *target;
- int size;
- Prog *npp;
- int diff;
-
- /*
- * get rid of NOOP chains
- */
- for(inst=pp->firstinst; inst->type!=END; inst++){
- target=inst->next;
- while(target->type == NOP)
- target=target->next;
- inst->next=target;
- }
-
- /*
- * The original allocation is for an area larger than
- * necessary. Reallocate to the actual space used
- * and then relocate the code.
- */
- size = sizeof(Prog) + (freep - pp->firstinst)*sizeof(Inst);
- npp = (Prog *)realloc((char *)pp, size);
- if(npp==NULL || npp==pp)
- return(pp);
- diff = (char *)npp - (char *)pp;
- freep = (Inst *)((char *)freep + diff);
- for(inst=npp->firstinst; inst<freep; inst++){
- switch(inst->type){
- case OR:
- case STAR:
- case PLUS:
- case QUEST:
- case CCLASS:
- *(char **)&inst->right += diff;
- break;
- }
- *(char **)&inst->left += diff;
- }
- *(char **)&npp->startinst += diff;
- return(npp);
-}
-
-#ifdef DEBUG
-static void
-dumpstack(){
- Node *stk;
- int *ip;
-
- printf("operators\n");
- for(ip=atorstack; ip<atorp; ip++)
- printf("0%o\n", *ip);
- printf("operands\n");
- for(stk=andstack; stk<andp; stk++)
- printf("0%o\t0%o\n", stk->first->type, stk->last->type);
-}
-
-static void
-dump(pp)
- Prog *pp;
-{
- Inst *l;
-
- l=pp->firstinst;
- do{
- printf("%d:\t0%o\t%d\t%d\n", l-pp->firstinst, l->type,
- l->left-pp->firstinst, l->right-pp->firstinst);
- }while(l++->type);
-}
-#endif
-
-static void
-startlex(s)
- char *s;
-{
- exprp=s;
- nclass=0;
- nbra=0;
-}
-
-static Class *
-newclass(){
- register Class *p;
- register n;
-
- if(nclass >= NCLASS)
- regerr2("too many character classes; limit", NCLASS+'0');
- p = &(classp[nclass++]);
- for(n=0; n<16; n++)
- p->map[n]=0;
- return p;
-}
-
-static int
-lex(){
- register c= *exprp++;
-
- switch(c){
- case '\\':
- if(*exprp)
- c= *exprp++;
- break;
- case 0:
- c=END;
- --exprp; /* In case we come here again */
- break;
- case '*':
- c=STAR;
- break;
- case '?':
- c=QUEST;
- break;
- case '+':
- c=PLUS;
- break;
- case '|':
- c=OR;
- break;
- case '.':
- c=ANY;
- break;
- case '(':
- c=LBRA;
- break;
- case ')':
- c=RBRA;
- break;
- case '^':
- c=BOL;
- break;
- case '$':
- c=EOL;
- break;
- case '[':
- c=CCLASS;
- bldcclass();
- break;
- }
- return c;
-}
-
-static int
-nextc(){
- if(exprp[0]==0 || (exprp[0]=='\\' && exprp[1]==0))
- rcerror("malformed '[]'");
- if(exprp[0]=='\\'){
- exprp++;
- return *exprp++|0200;
- }
- return *exprp++;
-}
-
-static void
-bldcclass(){
- register c1, c2;
- register Class *classp;
- register negate=FALSE;
-
- classp=newclass();
- /* we have already seen the '[' */
- if(*exprp=='^'){
- negate=TRUE;
- exprp++;
- }
- while((c1=c2=nextc()) != ']'){
- if(*exprp=='-'){
- exprp++; /* eat '-' */
- if((c2=nextc()) == ']')
- rcerror("malformed '[]'");
- }
- for((c1&=0177), (c2&=0177); c1<=c2; c1++)
- classp->map[c1/8] |= 1<<(c1&07);
- }
- if(negate)
- for(c1=0; c1<16; c1++)
- classp->map[c1]^=0377;
- classp->map[0] &= 0376; /* exclude NUL */
-}
-
-extern regexp *
-regcomp(s)
- char *s;
-{
- register token;
- Prog *pp;
-
- /* get memory for the program */
- pp = (Prog *)malloc(sizeof(Prog) + 3*sizeof(Inst)*strlen(s));
- if (pp == NULL) {
- rcerror("out of memory");
- return NULL;
- }
- freep = pp->firstinst;
- classp = pp->class;
- errors = 0;
-
- /* go compile the sucker */
- startlex(s);
- atorp=atorstack;
- andp=andstack;
- subidp=subidstack;
- lastwasand=FALSE;
- cursubid=0;
-
- /* Start with a low priority operator to prime parser */
- pushator(START-1);
- while((token=lex()) != END){
- if((token&0300) == OPERATOR)
- operator(token);
- else
- operand(token);
- }
-
- /* Close with a low priority operator */
- evaluntil(START);
-
- /* Force END */
- operand(END);
- evaluntil(START);
-#ifdef DEBUG
- dumpstack();
-#endif
- if(nbra)
- rcerror("unmatched left paren");
- --andp; /* points to first and only operand */
- pp->startinst=andp->first;
-#ifdef DEBUG
- dump(pp);
-#endif
- pp = optimize(pp);
-#ifdef DEBUG
- printf("start: %d\n", andp->first-pp->firstinst);
- dump(pp);
-#endif
- if (errors) {
- free((char *)pp);
- pp = NULL;
- }
- return (regexp *)pp;
-}
//GO.SYSIN DD ./libc/regcomp.c
echo ./libc/getfields.c 1>&2
sed 's/.//' >./libc/getfields.c <<'//GO.SYSIN DD ./libc/getfields.c'
-#include <libc.h>
-
-static char is_sep[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-static char is_field[256] = {
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-static char last_sep[256];
-
-char *
-setfields(arg)
- char *arg;
-{
- register unsigned char *s;
- register i;
-
- for(i = 1, s = (unsigned char *)last_sep; i < 256; i++)
- if(is_sep[i])
- *s++ = i;
- *s = 0;
- memset(is_sep, 0, sizeof is_sep);
- memset(is_field, 1, sizeof is_field);
- for(s = (unsigned char *)arg; *s;){
- is_sep[*s] = 1;
- is_field[*s++] = 0;
- }
- is_field[0] = 0;
- return(last_sep);
-}
-
-getfields(ss, sp, nptrs)
- char *ss;
- char **sp;
-{
- register unsigned char *s = (unsigned char *)ss;
- register unsigned char **p = (unsigned char **)sp;
- register unsigned c;
-
- for(;;){
- if(--nptrs < 0) break;
- *p++ = s;
- while(is_field[c = *s++])
- ;
- if(c == 0) break;
- s[-1] = 0;
- }
- if(nptrs > 0)
- *p = 0;
- else if(--s >= (unsigned char *)ss)
- *s = c;
- return(p - (unsigned char **)sp);
-}
-
-getmfields(ss, sp, nptrs)
- char *ss;
- char **sp;
-{
- register unsigned char *s = (unsigned char *)ss;
- register unsigned char **p = (unsigned char **)sp;
- register unsigned c;
- register unsigned d;
-
- if(nptrs <= 0)
- return(0);
- goto flushdelim;
- for(;;){
- *p++ = s;
- if(--nptrs == 0) break;
- while(is_field[c = *s++])
- ;
- /*
- * s is now pointing 1 past the delimiter of the last field
- * c is the delimiter
- */
- if(c == 0) break;
- s[-1] = 0;
- flushdelim:
- while(is_sep[c = *s++])
- ;
- /*
- * s is now pointing 1 past the beginning of the next field
- * c is the first letter of the field
- */
- if(c == 0) break;
- s--;
- /*
- * s is now pointing to the beginning of the next field
- * c is the first letter of the field
- */
- }
- if(nptrs > 0)
- *p = 0;
- return(p - (unsigned char **)sp);
-}
-
-#ifdef MAIN
-#include <fio.h>
-
-main()
-{
- char *fields[256];
- char *s;
- int n, i;
- char buf[1024];
-
- print("go:\n");
- while(s = Frdline(0)){
- strcpy(buf, s);
- Fprint(1, "getf:");
- n = getfields(s, fields, 4);
- for(i = 0; i < n; i++)
- Fprint(1, " >%s<", fields[i]);
- Fputc(1, '\n');
- Fprint(1, "getmf:");
- n = getmfields(buf, fields, 4);
- for(i = 0; i < n; i++)
- Fprint(1, " >%s<", fields[i]);
- Fputc(1, '\n');
- Fflush(1);
- }
- exit(0);
-}
-#endif
//GO.SYSIN DD ./libc/getfields.c
echo ./libc/libc.h 1>&2
sed 's/.//' >./libc/libc.h <<'//GO.SYSIN DD ./libc/libc.h'
-/* system calls */
-extern unsigned alarm();
-extern void nap(), pause();
-extern char *sbrk();
-extern void exit(), _exit();
-extern long lseek();
-extern void nice();
-extern void profil();
-extern unsigned long settod();
-extern void sync();
-extern long time();
-
-/* libc et al */
-extern long lcm();
-extern double atof(), strtod();
-extern long atol();
-extern char *crypt();
-extern char *ctime();
-extern char *ecvt(), *fcvt(), *gcvt();
-extern char *galloc();
-extern char *getenv();
-extern char *getlogin();
-extern char *getpass();
-extern char *getwd(), *getcwd();
-extern char *malloc(), *realloc(), *calloc();
-extern char *memcpy(), *memchr(), *memccpy(), *memset();
-extern char *mktemp();
-extern double frand();
-extern char *setfields();
-extern char *strcpy(), *strncpy(), *strcat(), *strncat(), *strchr(), *strrchr();
-extern char *strpbrk(), *strtok(), *strdup();
-extern int atoi();
-extern char *tgetstr(), tgoto();
-extern char *ttyname(), *cttyname();
-
-#define NONEXIT 33
//GO.SYSIN DD ./libc/libc.h
echo ./libc/onexit.c 1>&2
sed 's/.//' >./libc/onexit.c <<'//GO.SYSIN DD ./libc/onexit.c'
-#include <libc.h>
-
-int (*_onexitfns[NONEXIT])();
-
-atexit(f)
-int (*f)();
-{
- onexit(f);
-}
-
-onexit(f)
-int (*f)();
-{
- int i;
-
- for(i=0; i<NONEXIT; i++)
- if(!_onexitfns[i]){
- _onexitfns[i] = f;
- return(1);
- }
- return(0);
-}
//GO.SYSIN DD ./libc/onexit.c
echo ./libc/regexp.h 1>&2
sed 's/.//' >./libc/regexp.h <<'//GO.SYSIN DD ./libc/regexp.h'
-/* the structure describing a sub-expression match */
-typedef struct {
- char *sp;
- char *ep;
-} regsubexp;
-
-/* a compiled regular expression */
-typedef char *regexp;
-
-/* the routines */
-extern regexp *regcomp();
-extern int regexec();
-extern void regsub();
//GO.SYSIN DD ./libc/regexp.h
echo ./libc/print.c 1>&2
sed 's/.//' >./libc/print.c <<'//GO.SYSIN DD ./libc/print.c'
-#include <varargs.h>
-
-#define SIZE 1024
-extern int printcol;
-
-char *doprint();
-
-/* VARARGS 1 */
-print(fmt, va_alist)
-char *fmt;
-va_dcl
-{
- char buf[SIZE], *out;
- va_list ap;
-
- va_start(ap);
- out = doprint(buf, fmt, &ap);
- va_end(ap);
- return write(1, buf, (int)(out-buf));
-}
-
-/* VARARGS 2 */
-fprint(fd, fmt, va_alist)
-char *fmt;
-va_dcl
-{
- char buf[SIZE], *out;
- va_list ap;
-
- va_start(ap);
- out = doprint(buf, fmt, &ap);
- va_end(ap);
- return write(fd, buf, (int)(out-buf));
-}
-
-/* VARARGS 2 */
-sprint(buf, fmt, va_alist)
-char *buf;
-char *fmt;
-va_dcl
-{
- char *out;
- int scol;
- va_list ap;
-
- scol = printcol;
- va_start(ap);
- out = doprint(buf, fmt, &ap);
- va_end(ap);
- printcol = scol;
- return out-buf;
-}
//GO.SYSIN DD ./libc/print.c
echo ./libc/strdup.c 1>&2
sed 's/.//' >./libc/strdup.c <<'//GO.SYSIN DD ./libc/strdup.c'
-/* @(#)strdup.c 1.2 */
-/*LINTLIBRARY*/
-/* string duplication
- returns pointer to a new string which is the duplicate of string
- pointed to by s1
- NULL is returned if new string can't be created
-*/
-
-#include <string.h>
-#ifndef NULL
-#define NULL 0
-#endif
-
-extern int strlen();
-extern char *malloc();
-
-char *
-strdup(s1)
-
- char * s1;
-
-{
- char * s2;
-
- s2 = malloc((unsigned) strlen(s1)+1) ;
- return(s2==NULL ? NULL : strcpy(s2,s1) );
-}
//GO.SYSIN DD ./libc/strdup.c
echo ./libc/Makefile 1>&2
sed 's/.//' >./libc/Makefile <<'//GO.SYSIN DD ./libc/Makefile'
-OBJ=doprint.o exit.o getfields.o onexit.o print.o strdup.o regcomp.o regexec.o regsub.o dup2.o
-
-libc.a: $(OBJ)
- ar r libc.a $(OBJ)
- $(RANLIB) libc.a
-
-cray: libc.o
-
-libc.o: $(OBJ)
- cat $(OBJ) > libc.o
//GO.SYSIN DD ./libc/Makefile
echo ./libc/regexec.c 1>&2
sed 's/.//' >./libc/regexec.c <<'//GO.SYSIN DD ./libc/regexec.c'
-#include "regprog.h"
-
-/*
- * Machine state
- */
-#define LISTINCREMENT 8
-typedef struct List{
- Inst *inst; /* Instruction of the thread */
- Subexp se; /* matched subexpressions in this thread */
-}List;
-static List *tl, *nl; /* This list, next list */
-static List *tle, *nle; /* ends of this and next list */
-static List *list[2];
-static List *liste[2];
-static int listsize = LISTINCREMENT;
-
-static Subexp sempty; /* empty set of matches */
-static int match; /* true if match is found */
-
-/*
- * Note optimization in addinst:
- * *lp must be pending when addinst called; if *l has been looked
- * at already, the optimization is a bug.
- */
-static List *
-newthread(lp, ip, sep)
- List *lp; /* list to add to */
- Inst *ip; /* instruction to add */
- register Subexp *sep; /* pointers to subexpressions */
-{
- register List *p;
-
- for(p=lp; p->inst != NULL; p++){
- if(p->inst==ip){
- if((sep)->m[0].sp < p->se.m[0].sp)
- p->se = *sep;
- return NULL;
- }
- }
- p->inst = ip;
- p->se = *sep;
- (++p)->inst = NULL;
- return p;
-}
-
-static void
-newmatch(mp, ms, sp)
- regsubexp *mp;
- int ms;
- register Subexp *sp;
-{
- register int i;
-
- if (mp==NULL || ms <=0)
- return;
- if(mp[0].sp==0 || sp->m[0].sp<mp[0].sp ||
- (sp->m[0].sp==mp[0].sp && sp->m[0].ep>mp[0].ep)) {
- for (i=0; i<ms && i<NSUBEXP; i++)
- mp[i] = sp->m[i];
- for (; i<ms; i++)
- mp[i].sp = mp[i].ep = NULL;
- }
-}
-
-extern int
-regexec(progp, starts, mp, ms)
- Prog *progp; /* program to run */
- char *starts; /* string to run machine on */
- regsubexp *mp; /* subexpression elements */
- int ms; /* number of elements pointed to by mp */
-{
- register flag=0;
- register Inst *inst;
- register List *tlp;
- register char *s;
- int startchar=progp->startinst->type<OPERATOR? progp->startinst->type : 0;
- int i, checkstart;
-
-restart:
- match = 0;
- checkstart = startchar;
- sempty.m[0].sp = NULL;
- if (mp!=NULL && ms >0)
- mp[0].sp = mp[0].ep = NULL;
- if (list[0] == NULL) {
- list[0] = (List *)malloc(2*listsize*sizeof(List));
- list[1] = list[0] + listsize;
- liste[0] = list[0] + listsize - 1;
- liste[1] = list[1] + listsize - 1;
- if (list[0] == NULL)
- regerror("list overflow");
- }
- list[0][0].inst = list[1][0].inst = NULL;
-
- /* Execute machine once for each character, including terminal NUL */
- s=starts;
- do{
- /* fast check for first char */
- if(checkstart && *s!=startchar)
- continue;
- tl=list[flag];
- tle=liste[flag];
- nl=list[flag^=1];
- nle=liste[flag];
- nl->inst=0;
- /* Add first instruction to this list */
- sempty.m[0].sp = s;
- (void)newthread(tl, progp->startinst, &sempty);
- /* Execute machine until this list is empty */
- for(tlp=tl; inst=tlp->inst; tlp++){ /* assignment = */
- Switchstmt:
- switch(inst->type){
- default: /* regular character */
- if(inst->type == *s){
- Addinst:
- if(newthread(nl, inst->next, &tlp->se)==nle)
- goto realloc;
- }
- break;
- case LBRA:
- tlp->se.m[inst->subid].sp = s;
- inst=inst->next;
- goto Switchstmt;
- case RBRA:
- tlp->se.m[inst->subid].ep = s;
- inst=inst->next;
- goto Switchstmt;
- case ANY:
- goto Addinst;
- case BOL:
- if(s == starts){
- inst=inst->next;
- goto Switchstmt;
- }
- break;
- case EOL:
- if(*s=='\0'){
- inst=inst->next;
- goto Switchstmt;
- }
- break;
- case CCLASS:
- if(((char *)inst->right)[*s/8]&(1<<(*s&07)))
- goto Addinst;
- break;
- case OR:
- /* evaluate right choice later */
- if (newthread(tlp, inst->right, &tlp->se) == tle)
- goto realloc;
- /* efficiency: advance and re-evaluate */
- inst=inst->left;
- goto Switchstmt;
- case END: /* Match! */
- match = 1;
- tlp->se.m[0].ep = s;
- if (mp != NULL && ms > 0) newmatch(mp, ms, &tlp->se);
- break;
- }
- }
- checkstart = startchar && nl->inst==NULL;
- }while(*s++);
- return match;
-realloc:
- free(list[0]);
- list[0] = NULL;
- listsize += LISTINCREMENT;
- goto restart;
-}
-
//GO.SYSIN DD ./libc/regexec.c
echo ./libc/regprog.h 1>&2
sed 's/.//' >./libc/regprog.h <<'//GO.SYSIN DD ./libc/regprog.h'
-#include <regexp.h>
-
-/* useful constants */
-#define NULL 0
-#define TRUE 1
-#define FALSE 0
-#define HAT '\177' /* character to mark real beg. of line */
-
-/*
- * Sub expression matches
- */
-#define NSUBEXP 10
-typedef struct {
- regsubexp m[NSUBEXP];
-}Subexp;
-
-/*
- * character class
- */
-typedef struct {
- char map[16]; /* 16 bytes == 128 bits, one bit per char */
-}Class;
-
-/*
- * Machine instructions
- */
-typedef struct Inst{
- int type; /* < 0200 ==> literal, otherwise action */
- union {
- int sid; /* sub-expression id for RBRA and LBRA */
- struct Inst *other; /* instructions pointer */
- } u;
- struct Inst *left;
-}Inst;
-#define next left /* Left branch is usually just next ptr */
-#define subid u.sid
-#define right u.other
-
-/*
- * Program definition
- */
-#define NCLASS 16
-typedef struct Program{
- Inst *startinst; /* start pc */
- Class class[NCLASS]; /* .data */
- Inst firstinst[5]; /* .text */
-}Prog;
-
-/*
- * Actions and Tokens
- *
- * 02xx are operators, value == precedence
- * 03xx are tokens, i.e. operands for operators
- */
-#define OPERATOR 0200 /* Bitmask of all operators */
-#define START 0200 /* Start, used for marker on stack */
-#define RBRA 0201 /* Right bracket, ) */
-#define LBRA 0202 /* Left bracket, ( */
-#define OR 0203 /* Alternation, | */
-#define CAT 0204 /* Concatentation, implicit operator */
-#define STAR 0205 /* Closure, * */
-#define PLUS 0206 /* a+ == aa* */
-#define QUEST 0207 /* a? == a|nothing, i.e. 0 or 1 a's */
-#define ANY 0300 /* Any character, . */
-#define NOP 0301 /* No operation, internal use only */
-#define BOL 0302 /* Beginning of line, ^ */
-#define EOL 0303 /* End of line, $ */
-#define CCLASS 0304 /* Character class, [] */
-#define END 0377 /* Terminate: match found */
//GO.SYSIN DD ./libc/regprog.h
echo ./libc/regsub.c 1>&2
sed 's/.//' >./libc/regsub.c <<'//GO.SYSIN DD ./libc/regsub.c'
-#include "regprog.h"
-
-/* substitute into one string using the matches from the last regexec() */
-extern void
-regsub (sp, dp, mp, ms)
- char *sp; /* source string */
- char *dp; /* destination string */
- regsubexp *mp; /* subexpression elements */
- int ms; /* number of elements pointed to by mp */
-{
- char *ssp;
- register int i;
-
- while (*sp != '\0') {
- if (*sp == '\\') {
- switch (*++sp) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- i = *sp-'0';
- if (mp[i].sp != NULL && mp!=NULL && ms>i)
- for (ssp = mp[i].sp;
- ssp < mp[i].ep;
- ssp++)
- *dp++ = *ssp;
- break;
- case '\\':
- *dp++ = '\\';
- break;
- case '\0':
- sp--;
- break;
- default:
- *dp++ = *sp;
- break;
- }
- } else if (*sp == '&') {
- if (mp[0].sp != NULL && mp!=NULL && ms>0)
- if (mp[0].sp != NULL)
- for (ssp = mp[0].sp;
- ssp < mp[0].ep; ssp++)
- *dp++ = *ssp;
- } else
- *dp++ = *sp;
- sp++;
- }
- *dp = '\0';
-}
//GO.SYSIN DD ./libc/regsub.c
echo ./libc/dup2.c 1>&2
sed 's/.//' >./libc/dup2.c <<'//GO.SYSIN DD ./libc/dup2.c'
-#ifdef SYSV
-/*
- dup2(a, b)
-
- dup a as value b
-*/
-
-dup2(a, b)
-{
- int poot[256]; /* greater than NFILES i hope! */
- register i, ret;
-
- close(b);
- for(i = 0; (poot[i] = dup(a)) >= 0; i++)
- if(poot[i] == b) break;
- ret = i;
- while(--i >= 0)
- close(poot[i]); /* don't need 'em anymore */
- return(poot[ret]);
-}
-#endif
//GO.SYSIN DD ./libc/dup2.c
echo ./libc/new.mk 1>&2
sed 's/.//' >./libc/new.mk <<'//GO.SYSIN DD ./libc/new.mk'
-#ifdef DEBUG
-#include <stdio.h>
-#endif
-#include <libc.h>
-#include "regprog.h"
-
-/*
- * Parser Information
- */
-typedef struct Node{
- Inst *first;
- Inst *last;
-}Node;
-#define NSTACK 20
-static Node andstack[NSTACK];
-static Node *andp;
-static int atorstack[NSTACK];
-static int *atorp;
-static int cursubid; /* id of current subexpression */
-static int subidstack[NSTACK]; /* parallel to atorstack */
-static int *subidp;
-static int lastwasand; /* Last token was operand */
-static int nbra;
-static char *exprp; /* pointer to next character in source expression */
-static int nclass;
-static Class *classp;
-static Inst *freep;
-static int errors;
-
-/* predeclared crap */
-static void operator();
-static void pushand();
-static void pushator();
-static void evaluntil();
-static void bldcclass();
-
-static void
-rcerror(s)
- char *s;
-{
- errors++;
- regerror(s);
-}
-
-static Inst *
-newinst(t)
- int t;
-{
- freep->type=t;
- freep->left=0;
- freep->right=0;
- return freep++;
-}
-
-static void
-operand(t)
- int t;
-{
- register Inst *i;
- if(lastwasand)
- operator(CAT); /* catenate is implicit */
- i=newinst(t);
- if(t==CCLASS) /* ugh */
- i->right=(Inst *)&(classp[nclass-1]); /* UGH! */
- pushand(i, i);
- lastwasand=TRUE;
-}
-
-static void
-operator(t)
- int t;
-{
- if(t==RBRA && --nbra<0)
- rcerror("unmatched right paren");
- if(t==LBRA) {
- if (++cursubid >= NSUBEXP)
- rcerror ("too many subexpressions");
- nbra++;
- if (lastwasand)
- operator(CAT);
- } else
- evaluntil(t);
- if(t!=RBRA)
- pushator(t);
- lastwasand=FALSE;
- if(t==STAR || t==QUEST || t==PLUS || t==RBRA)
- lastwasand=TRUE; /* these look like operands */
-}
-
-static void
-regerr2(s, c)
- char *s;
-{
- char buf[100];
- char *cp = buf;
- while(*s)
- *cp++ = *s++;
- *cp++ = c;
- *cp = '\0';
- rcerror(buf);
-}
-
-static void
-cant(s)
- char *s;
-{
- char buf[100];
- strcpy(buf, "can't happen: ");
- strcat(buf, s);
- rcerror(buf);
-}
-
-static void
-pushand(f, l)
- Inst *f, *l;
-{
- if(andp >= &andstack[NSTACK])
- cant("operand stack overflow");
- andp->first=f;
- andp->last=l;
- andp++;
-}
-
-static void
-pushator(t)
- int t;
-{
- if(atorp >= &atorstack[NSTACK])
- cant("operator stack overflow");
- *atorp++=t;
- *subidp++=cursubid;
-}
-
-static Node *
-popand(op)
-{
- register Inst *inst;
-
- if(andp <= &andstack[0]) {
- regerr2("missing operand for ", op);
- inst=newinst(NOP);
- pushand(inst,inst);
- }
- return --andp;
-}
-
-static int
-popator()
-{
- if(atorp <= &atorstack[0])
- cant("operator stack underflow");
- --subidp;
- return *--atorp;
-}
-
-static void
-evaluntil(pri)
- register pri;
-{
- register Node *op1, *op2;
- register Inst *inst1, *inst2;
-
- while(pri==RBRA || atorp[-1]>=pri){
- switch(popator()){
- default:
- rcerror("unknown operator in evaluntil");
- break;
- case LBRA: /* must have been RBRA */
- op1=popand('(');
- inst2=newinst(RBRA);
- inst2->subid = *subidp;
- op1->last->next = inst2;
- inst1=newinst(LBRA);
- inst1->subid = *subidp;
- inst1->next=op1->first;
- pushand(inst1, inst2);
- return;
- case OR:
- op2=popand('|');
- op1=popand('|');
- inst2=newinst(NOP);
- op2->last->next=inst2;
- op1->last->next=inst2;
- inst1=newinst(OR);
- inst1->right=op1->first;
- inst1->left=op2->first;
- pushand(inst1, inst2);
- break;
- case CAT:
- op2=popand(0);
- op1=popand(0);
- op1->last->next=op2->first;
- pushand(op1->first, op2->last);
- break;
- case STAR:
- op2=popand('*');
- inst1=newinst(OR);
- op2->last->next=inst1;
- inst1->right=op2->first;
- pushand(inst1, inst1);
- break;
- case PLUS:
- op2=popand('+');
- inst1=newinst(OR);
- op2->last->next=inst1;
- inst1->right=op2->first;
- pushand(op2->first, inst1);
- break;
- case QUEST:
- op2=popand('?');
- inst1=newinst(OR);
- inst2=newinst(NOP);
- inst1->left=inst2;
- inst1->right=op2->first;
- op2->last->next=inst2;
- pushand(inst1, inst2);
- break;
- }
- }
-}
-
-static Prog *
-optimize(pp)
- Prog *pp;
-{
- register Inst *inst, *target;
- int size;
- Prog *npp;
-
- /*
- * get rid of NOOP chains
- */
- for(inst=pp->firstinst; inst->type!=END; inst++){
- target=inst->next;
- while(target->type == NOP)
- target=target->next;
- inst->next=target;
- }
-
- /*
- * The original allocation is for an area larger than
- * necessary. Reallocate to the actual space used
- * and then relocate the code.
- */
- size = sizeof(Prog) + (freep - pp->firstinst)*sizeof(Inst);
- npp = (Prog *)realloc((char *)pp, size);
- if(npp==NULL || npp==pp)
- return(pp);
- freep = &npp->firstinst[freep - pp->firstinst];
- npp->startinst = &npp->firstinst[pp->startinst - pp->firstinst];
- for(inst=npp->firstinst; inst<freep; inst++){
- switch(inst->type){
- case OR:
- case STAR:
- case PLUS:
- case QUEST:
- inst->right = &npp->firstinst[inst->right - pp->firstinst];
- break;
- case CCLASS:
- inst->right = (Inst *) &npp->class[(Class*)inst->right - pp->class];
- break;
- }
- inst->left = &npp->firstinst[inst->left - pp->firstinst];
- }
- return(npp);
-}
-
-#ifdef DEBUG
-static char *
-dumptype(t){
- static char ordinary[4] = "'.'";
-
- switch(t){
- case START: return "START";
- case RBRA: return "RBRA";
- case LBRA: return "LBRA";
- case OR: return "OR";
- case CAT: return "CAT";
- case STAR: return "STAR";
- case PLUS: return "PLUS";
- case QUEST: return "QUEST";
- case ANY: return "ANY";
- case NOP: return "NOP";
- case BOL: return "BOL";
- case EOL: return "EOL";
- case CCLASS: return "CCLASS";
- case END: return "END";
- default:
- ordinary[1] = t;
- return ordinary;
- }
-}
-
-static void
-dumpstack(){
- Node *stk;
- int *ip;
-
- printf("operators\n");
- for(ip=atorstack; ip<atorp; ip++)
- printf("0%o\n", *ip);
- printf("operands\n");
- for(stk=andstack; stk<andp; stk++){
- printf("%s\t", dumptype(stk->first->type));
- printf("%s\n", dumptype(stk->last->type));
- }
-}
-
-static void
-putC(c)
-{
- if(c < ' ' || '~' < c){
- switch(c){
- default:
- putchar('^');
- putchar((c + '@') & 0x7f);
- return;
- case '\b':
- c = 'b';
- break;
- case '\t':
- c = 't';
- break;
- case '\n':
- c = 'n';
- break;
- case '\v':
- c = 'v';
- break;
- case '\f':
- c = 'f';
- break;
- case '\r':
- c = 'r';
- break;
- }
- putchar('\\');
- }
- putchar(c);
-}
-
-static void
-putCHAR(from, to)
-{
- if(from != 0)
- if(from == to)
- putC(from);
- else{
- putC(from);
- putchar('-');
- putC(to);
- }
-}
-
-static void
-dump(pp)
- Prog *pp;
-{
- int c, from;
- Inst *l;
- Class *classp;
-
- l=pp->firstinst;
- do{
- printf("%d:\t%s\t%d\t", l-pp->firstinst, dumptype(l->type),
- l->left-pp->firstinst);
- if(l->type == CCLASS){
- classp = (Class*) l->right;
- putchar('[');
- if(classp->map[0] & 02){ /* ^A? */
- putchar('^'); /* assume negation */
- for(from=0, c=1; c < 128; ++c){
- if(classp->map[c/8] & (1<<(c&07))){
- putCHAR(from, c-1);
- from = 0;
- } else {
- if(from == 0)
- from = c;
- }
- }
- putCHAR(from, c-1);
- } else {
- for(from=0, c=1; c < 128; ++c){
- if(classp->map[c/8] & (1<<(c&07))){
- if(from == 0)
- from = c;
- } else {
- putCHAR(from, c-1);
- from = 0;
- }
- }
- putCHAR(from, c-1);
- }
- putchar(']');
- } else
- printf("%d", l->right-pp->firstinst);
- putchar('\n');
- }while(l++->type);
-}
-#endif
-
-static void
-startlex(s)
- char *s;
-{
- exprp=s;
- nclass=0;
- nbra=0;
-}
-
-static Class *
-newclass(){
- register Class *p;
- register n;
-
- if(nclass >= NCLASS)
- regerr2("too many character classes; limit", NCLASS+'0');
- p = &(classp[nclass++]);
- for(n=0; n<16; n++)
- p->map[n]=0;
- return p;
-}
-
-static int
-lex(){
- register c= *exprp++;
-
- switch(c){
- case '\\':
- if(*exprp)
- c= *exprp++;
- break;
- case 0:
- c=END;
- --exprp; /* In case we come here again */
- break;
- case '*':
- c=STAR;
- break;
- case '?':
- c=QUEST;
- break;
- case '+':
- c=PLUS;
- break;
- case '|':
- c=OR;
- break;
- case '.':
- c=ANY;
- break;
- case '(':
- c=LBRA;
- break;
- case ')':
- c=RBRA;
- break;
- case '^':
- c=BOL;
- break;
- case '$':
- c=EOL;
- break;
- case '[':
- c=CCLASS;
- bldcclass();
- break;
- }
- return c;
-}
-
-static int
-nextc(){
- if(exprp[0]==0 || (exprp[0]=='\\' && exprp[1]==0))
- rcerror("malformed '[]'");
- if(exprp[0]=='\\'){
- exprp++;
- return *exprp++|0200;
- }
- return *exprp++;
-}
-
-static void
-bldcclass(){
- register c1, c2;
- register Class *classp;
- register negate=FALSE;
-
- classp=newclass();
- /* we have already seen the '[' */
- if(*exprp=='^'){
- negate=TRUE;
- exprp++;
- }
- while((c1=c2=nextc()) != ']'){
- if(*exprp=='-'){
- exprp++; /* eat '-' */
- if((c2=nextc()) == ']')
- rcerror("malformed '[]'");
- }
- for((c1&=0177), (c2&=0177); c1<=c2; c1++)
- classp->map[c1/8] |= 1<<(c1&07);
- }
- if(negate)
- for(c1=0; c1<16; c1++)
- classp->map[c1]^=0377;
- classp->map[0] &= 0376; /* exclude NUL */
-}
-
-extern regexp *
-regcomp(s)
- char *s;
-{
- register token;
- Prog *pp;
-
- /* get memory for the program */
- pp = (Prog *)malloc(sizeof(Prog) + 3*sizeof(Inst)*strlen(s));
- if (pp == NULL) {
- rcerror("out of memory");
- return NULL;
- }
- freep = pp->firstinst;
- classp = pp->class;
- errors = 0;
-
- /* go compile the sucker */
- startlex(s);
- atorp=atorstack;
- andp=andstack;
- subidp=subidstack;
- lastwasand=FALSE;
- cursubid=0;
-
- /* Start with a low priority operator to prime parser */
- pushator(START-1);
- while((token=lex()) != END){
- if((token&0300) == OPERATOR)
- operator(token);
- else
- operand(token);
- }
-
- /* Close with a low priority operator */
- evaluntil(START);
-
- /* Force END */
- operand(END);
- evaluntil(START);
-#ifdef DEBUG
- dumpstack();
-#endif
- if(nbra)
- rcerror("unmatched left paren");
- --andp; /* points to first and only operand */
- pp->startinst=andp->first;
-#ifdef DEBUG
- dump(pp);
-#endif
- pp = optimize(pp);
-#ifdef DEBUG
- printf("start: %d\n", pp->startinst-pp->firstinst);
- dump(pp);
- fflush(stdout);
-#endif
- if (errors) {
- free((char *)pp);
- pp = NULL;
- }
- return (regexp *)pp;
-}
-
-#ifdef DEBUG
-#include <setjmp.h>
-
-jmp_buf jmpbuf;
-
-main( argc, argv )
- char **argv;
-{
- regexp *prog = NULL;
- regsubexp match[NSUBEXP];
- char line[256];
- int i;
-
- while( TRUE ) {
- setjmp( jmpbuf );
-
- if(prog)
- free( prog );
-
- do {
- fputs( "Enter re: ", stdout );
- if ( gets(line) == NULL )
- exit(0);
- } while( (prog = regcomp(line)) == NULL );
-
- fputs( "Enter string: ", stdout );
- while( gets(line) != NULL ) {
- if ( !regexec(prog,line,match,NSUBEXP) )
- puts( "*** NO MATCH ***" );
- else
- for( i = 0; i < NSUBEXP; ++i )
- if ( match[i].sp )
- printf( "match[%d] = \"%.*s\"\n", i, match[i].ep - match[i].sp, match[i].sp );
- }
- }
-}
-
-regerror( s )
- char *s;
-{
- puts( s );
- longjmp( jmpbuf );
-}
-
-#endif
//GO.SYSIN DD ./libc/new.mk
echo ./fio/README 1>&2
sed 's/.//' >./fio/README <<'//GO.SYSIN DD ./fio/README'
-here (as in ../libc) you have to add whatever commands
-you need to set up an archive in the shell file `gen'.
//GO.SYSIN DD ./fio/README
echo ./fio/fio.h 1>&2
sed 's/.//' >./fio/fio.h <<'//GO.SYSIN DD ./fio/fio.h'
-#define FIOBSIZE 4096
-
-typedef struct Fbuffer
-{
- unsigned char *next; /* next char to be used */
- unsigned char *end; /* first invalid char */
- unsigned char *lnext; /* previous value of next */
- unsigned short flags; /* see FIO_.* below */
- short oflush; /* if >= 0 fd to flush on read */
- long offset; /* seek of end */
- unsigned char buf[FIOBSIZE];
-} Fbuffer;
-extern Fbuffer *Ffb[];
-
-#define FIORESET(f) ((f)->next=(f)->lnext=(f)->end=(f)->buf, (f)->flags&= ~FIO_MALLOCED, (f)->oflush= -1)
-#define FIOSET(f, fd) if((f=Ffb[fd&=0x7f]) == 0){Finit(fd,(char *)0);f=Ffb[fd];}
-/* FIOLINELEN is length of last input */
-#define FIOLINELEN(fd) (((int)(Ffb[fd]->next - Ffb[fd]->lnext))-1)
-/* FIOSEEK is lseek of next char to be processed */
-#define FIOSEEK(fd) (Ffb[fd]->offset - (Ffb[fd]->end - Ffb[fd]->next))
-#define FIOFLUSH(fd) if((fd >= 0) && Ffb[fd]) Fflush(fd)
-
-#define FIO_RDLAST 0x0001 /* true if last input was rdline */
-#define FIO_WRITING 0x0002 /* true if last action was write */
-#define FIO_MALLOCED 0x0004 /* set if Finit did the malloc */
-
-extern void Finit();
-extern char *Frdline();
-extern void Fundo();
-extern int Fgetc();
-extern long Fread();
-extern long Fwrite();
-extern long Fseek();
-extern int Fflush();
-
-#ifdef FIO_IMP
-/* COUNT is the type of counts to things like read, write, memcpy etc */
-#ifdef GNOT
-#define COUNT long
-#define FIOMALLOC(n) malloc(n)
-#define SEEK(a,b,c) seek(a,b,c)
-#else
-#define COUNT int
-#define FIOMALLOC(n) malloc(n)
-#define SEEK(a,b,c) lseek(a,b,c)
-#endif
-extern COUNT read(), write();
-#endif
//GO.SYSIN DD ./fio/fio.h
echo ./fio/fiofillbuf.c 1>&2
sed 's/.//' >./fio/fiofillbuf.c <<'//GO.SYSIN DD ./fio/fiofillbuf.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-Ffillbuf(fd)
-{
- register COUNT n;
- register Fbuffer *f = Ffb[fd];
-
- if(n = &f->buf[FIOBSIZE]-f->end){
- FIOFLUSH(f->oflush);
- n = read(fd, f->end, n);
- if(n <= 0)
- return(-1);
- f->end += n;
- f->offset += n;
- }
- return(1);
-}
//GO.SYSIN DD ./fio/fiofillbuf.c
echo ./fio/fioflush.c 1>&2
sed 's/.//' >./fio/fioflush.c <<'//GO.SYSIN DD ./fio/fioflush.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-Fflush(fd)
-{
- register Fbuffer *f;
-
- FIOSET(f, fd);
- if(f->flags&FIO_WRITING)
- return(F_flush(f, fd));
- else
- return(0);
-}
-
-F_flush(f, fd)
- register Fbuffer *f;
-{
- register COUNT n;
-
- f->flags &= ~FIO_WRITING;
- if(n = f->next - f->buf){
- if(write(fd, f->buf, n) != n)
- return(-1);
- f->next = f->buf;
- }
- return(0);
-}
//GO.SYSIN DD ./fio/fioflush.c
echo ./fio/fiogetc.c 1>&2
sed 's/.//' >./fio/fiogetc.c <<'//GO.SYSIN DD ./fio/fiogetc.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-Fgetc(fd)
-{
- register Fbuffer *f;
-
- FIOSET(f, fd);
- if(f->next >= f->end){
- if(f->end >= &f->buf[FIOBSIZE])
- f->end = f->next = f->buf;
- else
- f->next = f->end;
- if(Ffillbuf(fd) <= 0)
- return(-1);
- }
- f->lnext = f->next;
- f->flags &= ~(FIO_RDLAST|FIO_WRITING);
- return(*f->next++);
-}
//GO.SYSIN DD ./fio/fiogetc.c
echo ./fio/fioinit.c 1>&2
sed 's/.//' >./fio/fioinit.c <<'//GO.SYSIN DD ./fio/fioinit.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-static Fdie()
-{
- Fexit(0);
-}
-
-void
-Finit(fd, buf)
- char *buf;
-{
- register Fbuffer *f;
- static setfioexit = 1;
-
- if(setfioexit){
- setfioexit = 0;
- atexit(Fdie);
- }
- fd &= 0x7f;
- if(buf){
- Ffb[fd] = (Fbuffer *)buf;
- Ffb[fd]->flags = 0;
- } else if(!Ffb[fd]){
- Ffb[fd] = (Fbuffer *)FIOMALLOC((COUNT)sizeof(Fbuffer));
- Ffb[fd]->flags = FIO_MALLOCED;
- }
- f = Ffb[fd];
- FIORESET(f);
- f->offset = SEEK(fd, 0L, 1);
- if(f->offset < 0)
- f->offset = 0; /* file not been written yet */
-}
-
-#ifdef GNOT
-#define NOFILE 128
-#endif
-#ifndef GNOT
-#include <sys/param.h>
-#endif
-
-Fbuffer *Ffb[NOFILE];
-
-Fexit(type)
-{
- register n;
-
- for(n = 0; n < NOFILE; n++)
- if(Ffb[n])
- if(type == 0)
- Fflush(n);
- else
- Fclose(n);
-}
//GO.SYSIN DD ./fio/fioinit.c
echo ./fio/fioprint.c 1>&2
sed 's/.//' >./fio/fioprint.c <<'//GO.SYSIN DD ./fio/fioprint.c'
-#define FIO_IMP
-#include <varargs.h>
-#include <fio.h>
-
-/* VARARGS 2 */
-Fprint(f, fmt, va_alist)
-int f;
-char *fmt;
-va_dcl
-{
- char buf[FIOBSIZE], *out;
- register long n;
- va_list ap;
- extern char *doprint();
-
- va_start(ap);
- out = doprint(buf, fmt, &ap);
- va_end(ap);
- n = out-buf;
- if(Fwrite(f, buf, n) != n)
- return(-1);
- else
- return((int)n);
-}
//GO.SYSIN DD ./fio/fioprint.c
echo ./fio/fioputc.c 1>&2
sed 's/.//' >./fio/fioputc.c <<'//GO.SYSIN DD ./fio/fioputc.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-Fputc(fd, c)
-{
- register Fbuffer *f;
-
- FIOSET(f, fd);
- if(f->next >= &f->buf[FIOBSIZE]){
- if(F_flush(f, fd))
- return(-1);
- }
- *f->next++ = c;
- f->end = f->next;
- f->offset++;
- f->flags |= FIO_WRITING;
- return(0);
-}
//GO.SYSIN DD ./fio/fioputc.c
echo ./fio/fiordline.c 1>&2
sed 's/.//' >./fio/fiordline.c <<'//GO.SYSIN DD ./fio/fiordline.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-char *
-Frdline(fd)
-{
- register unsigned char *p;
- register Fbuffer *f;
- register n;
- register char *nextnl;
-
- FIOSET(f, fd);
- while((nextnl = memchr(f->next, '\n', (COUNT)(f->end-f->next))) == 0){
- if(f->next == f->buf){
- if(f->end >= &f->buf[FIOBSIZE])
- f->end = &f->buf[FIOBSIZE-64]; /* full buffer, no newline */
- } else {
- n = f->next-f->buf;
- memcpy(f->buf, f->next, (COUNT)(FIOBSIZE-n));
- f->next -= n;
- f->end -= n;
- }
- if(Ffillbuf(fd) <= 0)
- return((char *)0);
- }
- f->lnext = f->next;
- f->next = (unsigned char *)(nextnl+1);
- *nextnl = 0;
- f->flags = (f->flags|FIO_RDLAST)&~FIO_WRITING;
- return((char *)f->lnext);
-}
//GO.SYSIN DD ./fio/fiordline.c
echo ./fio/fioread.c 1>&2
sed 's/.//' >./fio/fioread.c <<'//GO.SYSIN DD ./fio/fioread.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-#define MAXREAD 0xff00 /* 64K - 4K */
-#define FIOSHORT 100
-
-long
-Fread(fd, addr, n)
- char *addr;
- long n;
-{
- register unsigned char *p;
- register Fbuffer *f;
- COUNT k;
- char *oaddr = addr;
- char *goal = addr+n;
-
- FIOSET(f, fd);
-again:
- k = f->end - f->next;
- if(n < k) k = n;
- memcpy(addr, (char *)f->next, k);
- f->next += k;
- f->lnext = f->next; /* effectively disable undo */
- n -= k;
- addr += k;
- if((n > 0) && (n < FIOSHORT)){ /* buffer reads of less than FIOSHORT */
- if(f->next == f->end)
- f->next = f->end = f->buf;
- if(Ffillbuf(fd) < 0)
- return((long)(addr - oaddr));
- goto again;
- }
- if(n > 0)
- FIOFLUSH(f->oflush);
- while(n > 0){ /* buffer is empty so do real reads */
- k = n;
- if(k > MAXREAD) k = MAXREAD;
- if((k = read(fd, addr, k)) < 0)
- return(-1L);
- if(k == 0) break;
- addr += k;
- n -= k;
- f->offset += k;
- }
- return((long)(addr - oaddr));
-}
//GO.SYSIN DD ./fio/fioread.c
echo ./fio/fioseek.c 1>&2
sed 's/.//' >./fio/fioseek.c <<'//GO.SYSIN DD ./fio/fioseek.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-long
-Fseek(fd, n, cmd)
- long n;
-{
- register Fbuffer *f;
- register long dest, k;
-
- FIOSET(f, fd);
- switch(cmd)
- {
- case 0:
- dest = n;
- break;
- case 1:
- /* allow for the fact we are beyond where we think we are */
- dest = f->offset + n + f->next-f->end;
- break;
- case 2:
- if(f->flags&FIO_WRITING)
- F_flush(f, fd);
- dest = SEEK(fd, n, cmd);
- FIORESET(f);
- f->offset = dest;
- break;
- }
- if(dest < 0)
- return(dest);
- k = f->end - ((f->flags&FIO_WRITING)? f->buf : f->lnext);
- if((dest >= f->offset) || (dest < f->offset-k)){
- if(f->flags&FIO_WRITING)
- F_flush(f, fd);
- FIORESET(f);
- f->offset = dest;
- SEEK(fd, f->offset, 0);
- } else {
- f->next = f->lnext + (dest-(f->offset-k));
- if(f->flags&FIO_WRITING){
- f->offset -= f->end - f->next;
- f->end = f->next;
- }
- SEEK(fd, f->offset, 0);
- }
- return(dest);
-}
//GO.SYSIN DD ./fio/fioseek.c
echo ./fio/fioundo.c 1>&2
sed 's/.//' >./fio/fioundo.c <<'//GO.SYSIN DD ./fio/fioundo.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-void
-Fundo(fd)
-{
- register Fbuffer *f;
-
- FIOSET(f, fd);
- if(f->flags&FIO_WRITING)
- return;
- if(f->flags&FIO_RDLAST)
- f->next[-1] = '\n';
- f->next = f->lnext;
-}
//GO.SYSIN DD ./fio/fioundo.c
echo ./fio/fiowrite.c 1>&2
sed 's/.//' >./fio/fiowrite.c <<'//GO.SYSIN DD ./fio/fiowrite.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-long
-Fwrite(fd, addr, nbytes)
- register char *addr;
- register long nbytes;
-{
- register Fbuffer *f;
- register COUNT n;
- long nnbytes = nbytes;
-
- FIOSET(f, fd);
- f->flags |= FIO_WRITING;
- n = &f->buf[FIOBSIZE] - f->next;
- if(nbytes < n) n = nbytes;
- memcpy(f->next, addr, n);
- f->end = (f->next += n);
- f->offset += n;
- nbytes -= n;
- addr += n;
- if(nbytes){
- if(F_flush(f, fd))
- return(-1L);
- while(nbytes >= FIOBSIZE){
- if(write(fd, addr, (COUNT)FIOBSIZE) != FIOBSIZE)
- return(-1L);
- addr += FIOBSIZE;
- nbytes -= FIOBSIZE;
- f->offset += FIOBSIZE;
- }
- memcpy(f->buf, addr, (COUNT)(n = nbytes));
- f->end = f->next = f->buf+n;
- f->offset += n;
- f->flags |= FIO_WRITING;
- }
- return(nnbytes);
-}
//GO.SYSIN DD ./fio/fiowrite.c
echo ./fio/libc.h 1>&2
sed 's/.//' >./fio/libc.h <<'//GO.SYSIN DD ./fio/libc.h'
-/* system calls */
-extern unsigned alarm();
-extern void nap(), pause();
-extern char *sbrk();
-extern void exit(), _exit();
-extern long lseek();
-extern void nice();
-extern void profil();
-extern unsigned long settod();
-extern void sync();
-extern long time();
-
-/* libc et al */
-extern long lcm();
-extern double atof(), strtod();
-extern long atol();
-extern char *crypt();
-extern char *ctime();
-extern char *ecvt(), *fcvt(), *gcvt();
-extern char *galloc();
-extern char *getenv();
-extern char *getlogin();
-extern char *getpass();
-extern char *getwd(), *getcwd();
-extern char *malloc(), *realloc(), *calloc();
-extern char *memcpy(), *memchr(), *memccpy(), *memset();
-extern char *mktemp();
-extern double frand();
-extern char *strcpy(), *strncpy(), *strcat(), *strncat(), *strchr(), *strrchr();
-extern char *strpbrk(), *strtok(), *strdup();
-extern int atoi();
-extern char *tgetstr(), tgoto();
-extern char *ttyname(), *cttyname();
-
-#define NONEXIT 33
//GO.SYSIN DD ./fio/libc.h
echo ./fio/tstrd.c 1>&2
sed 's/.//' >./fio/tstrd.c <<'//GO.SYSIN DD ./fio/tstrd.c'
-#include <fio.h>
-#include <libc.h>
-
-main(argc, argv)
- char **argv;
-{
- register n, c, k;
- int len, fd, cd;
- char *b1, *b2, *p;
-
- if(argc < 2){
- Fprint(2, "Usage: tstrd file\n");
- exit(1);
- }
- len = flen(argv[1]);
- if((fd = open(argv[1], 0)) < 0){
- perror(argv[1]);
- exit(1);
- }
- if((b1 = malloc(len)) == 0){
- Fprint(2, "malloc(%d) failed\n", len);
- exit(1);
- }
- if(read(fd, b1, len) != len){
- perror("read");
- exit(1);
- }
- lseek(fd, 0L, 0);
- if((b2 = malloc(len)) == 0){
- Fprint(2, "malloc(%d) failed\n", len);
- exit(1);
- }
- for(p = b2, cd = 0; cd < len;){
- n = 1000*nrand(6) + nrand(199);
- if(n > len-cd) n = len-cd;
- Fprint(1, "%d getchars\n", n);
- cd += n;
- while(n--)
- *p++ = Fgetc(fd);
- if(cd == len)
- continue;
- n = 1000*nrand(12) + nrand(199);
- if(n > len-cd) n = len-cd;
- cd += n;
- Fprint(1, "%d read\n", n);
- if(Fread(fd, p, (long)n) != (long)n) break;
- p += n;
- }
-done:
- if(memcmp(b1, b2, len)){
- Fprint(2, "memcmp failed!\n");
- exit(1);
- }
- Fprint(2, "tstrd: %d bytes, succeeded\n", len);
- exit(0);
-}
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-flen(s)
- char *s;
-{
- struct stat sb;
- int n;
-
- if(stat(s, &sb) < 0){
- perror(s);
- exit(1);
- }
- n = sb.st_size;
- if(sizeof(int) == 2)
- n &= 0x7FFF;
- return(n);
-}
//GO.SYSIN DD ./fio/tstrd.c
echo ./fio/tstsk.c 1>&2
sed 's/.//' >./fio/tstsk.c <<'//GO.SYSIN DD ./fio/tstsk.c'
-#include <fio.h>
-#include <libc.h>
-
-#define TMP "/tmp/tstsk"
-#define FN(x) (unsigned char)((x&0xFF)^(x/251))
-
-main(argc, argv)
- char **argv;
-{
- register n, c, k;
- int len, fd, cd;
- char *b1, *b2, *p;
-
- if(argc != 1){
- Fprint(2, "Usage: tstsk\n");
- exit(1);
- }
- len = 1000000;
- if(sizeof(int) == 2)
- len &= 0x7FFF;
- if((fd = creat(TMP, 0666)) < 0){
- perror(TMP);
- exit(1);
- }
- close(fd);
- if((fd = open(TMP, 2)) < 0){
- perror(TMP);
- exit(1);
- }
- unlink(TMP);
- if((b2 = malloc(len)) == 0){
- Fprint(2, "malloc(%d) failed\n", len);
- exit(1);
- }
- for(n = 0, p = b2; n < len; n++)
- *p++ = FN(n);
- if(write(fd, b2, len) != len){
- perror("write");
- exit(1);
- }
- lseek(fd, 0L, 0);
- Finit(fd, (char *)0);
- for(n = 0; n < 500; n++){
- k = nrand(len);
- c = nrand(sizeof(Fbuffer))+100;
- if(k+c > len) c = len-k;
- test(fd, k, c, n);
- }
-done:
- Fprint(2, "tstsk: %d bytes, %d seeks, succeeded\n", len, n);
- exit(0);
-}
-
-test(fd, off, n, count)
-{
- long offset;
- int c;
-
- offset = off;
- if(Fseek(fd, offset, 0) != offset){
- fprint(2, "fseek(%ld) != %ld!!\n", offset, offset);
- exit(1);
- }
- while(n-- > 0){
- if((c = Fgetc(fd)) != FN(offset)){
- fprint(2, "tst %d: char mismatch; %ld: %x, expected %x\n",
- count, offset, c, FN(offset));
- dumpfb(fd);
- exit(1);
- }
- offset++;
- }
-}
-
-dumpfb(fd)
-{
- register Fbuffer *f = Ffb[fd];
- register unsigned char *c;
- register long off;
- int i;
-
- fprint(2, "buf@%ld: next=%ld end=%ld lnext=%ld buf=%ld offset=%ld\n",
- f, f->next, f->end, f->lnext, f->buf, f->offset);
- off = f->offset - (f->end - f->buf);
- for(c = f->buf; c < &f->buf[64]; ){
- fprint(2, "%7ld:", off);
- for(i = 0; i < 16; i++, off++)
- fprint(2, " %2x", *c++);
- fprint(2, "\n");
- }
-}
//GO.SYSIN DD ./fio/tstsk.c
echo ./fio/tstwr.c 1>&2
sed 's/.//' >./fio/tstwr.c <<'//GO.SYSIN DD ./fio/tstwr.c'
-#include <fio.h>
-#include <libc.h>
-
-#define TMP "/tmp/tstwr"
-
-main(argc, argv)
- char **argv;
-{
- register n, c, k;
- int len, fd, cd;
- char *b1, *b2, *p;
-
- if(argc < 2){
- Fprint(2, "Usage: tstwr file\n");
- exit(1);
- }
- len = flen(argv[1]);
- if((fd = open(argv[1], 0)) < 0){
- perror(argv[1]);
- exit(1);
- }
- if((b1 = malloc(len)) == 0){
- Fprint(2, "malloc(%d) failed\n", len);
- exit(1);
- }
- if(read(fd, b1, len) != len){
- perror("read");
- exit(1);
- }
- close(fd);
- if((fd = creat(TMP, 0666)) < 0){
- perror(TMP);
- exit(1);
- }
- close(fd);
- if((fd = open(TMP, 2)) < 0){
- perror(TMP);
- exit(1);
- }
-/* unlink(TMP); /**/
- if((b2 = malloc(len)) == 0){
- Fprint(2, "malloc(%d) failed\n", len);
- exit(1);
- }
- for(p = b1, cd = 0; cd < len;){
- n = 1000*nrand(6) + nrand(199);
- if(n > len-cd) n = len-cd;
- Fprint(1, "%d putc's\n", n);
- cd += n;
- while(n--)
- Fputc(fd, *p++);
- if(len == cd)
- continue;
- n = 1000*nrand(12) + nrand(199);
- if(n > len-cd) n = len-cd;
- cd += n;
- Fprint(1, "%d write\n", n);
- if(Fwrite(fd, p, (long)n) != (long)n) break;
- p += n;
- }
-done:
- Fflush(fd);
- lseek(fd, 0L, 0);
- if((n = read(fd, b2, len)) != len){
- fprint(2, "read %d, len=%d: ", n, len);
- perror("read2");
- exit(1);
- }
- if(memcmp(b1, b2, len)){
- Fprint(2, "memcmp failed!\n");
- exit(1);
- }
- Fprint(2, "tstwr: %d bytes, succeeded\n", len);
- exit(0);
-}
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-flen(s)
- char *s;
-{
- struct stat sb;
- int n;
-
- if(stat(s, &sb) < 0){
- perror(s);
- exit(1);
- }
- n = sb.st_size;
- if(sizeof(int) == 2)
- n &= 0x7FFF;
- return(n);
-}
//GO.SYSIN DD ./fio/tstwr.c
echo ./fio/Makefile 1>&2
sed 's/.//' >./fio/Makefile <<'//GO.SYSIN DD ./fio/Makefile'
-OBJ=fiofillbuf.o fioflush.o fiogetc.o fioinit.o fioprint.o fioputc.o\
- fiordline.o fioread.o fioseek.o fioundo.o fiowrite.o fiotie.o fioclose.o
-
-fio.a: $(OBJ)
- ar r fio.a $(OBJ)
- $(RANLIB) fio.a
-
-cray: fio.o
-
-fio.o: $(OBJ)
- cat $(OBJ) > fio.o
//GO.SYSIN DD ./fio/Makefile
echo ./fio/fiotie.c 1>&2
sed 's/.//' >./fio/fiotie.c <<'//GO.SYSIN DD ./fio/fiotie.c'
-#define FIO_IMP
-#include "fio.h"
-
-void
-Ftie(ifd, ofd)
-{
- register Fbuffer *f;
-
- FIOSET(f, ifd);
- f->oflush = ofd;
-}
//GO.SYSIN DD ./fio/fiotie.c
echo ./fio/tstagh.c 1>&2
sed 's/.//' >./fio/tstagh.c <<'//GO.SYSIN DD ./fio/tstagh.c'
-#include <fio.h>
-#include <libc.h>
-
-#define TMP "/tmp/tstsk"
-#define FN(x) (unsigned char)((x&0xFF)^(x/251))
-
-main(argc, argv)
- char **argv;
-{
- register n, c, k;
- int len, fd, cd;
- char *b1, *b2, *p;
-
- Fprint(1, "the letter 'c' is 'c'\n");
- dumpfb(1);
- Fseek(1, -3, 1);
- dumpfb(1);
- Fputc(1, '\n');
- dumpfb(1);
- exit(0);
-}
-
-dumpfb(fd)
-{
- register Fbuffer *f = Ffb[fd];
- register unsigned char *c;
- register long off;
- int i;
-
- fprint(2, "buf@%ld: next=%ld end=%ld lnext=%ld buf=%ld offset=%ld\n",
- f, f->next, f->end, f->lnext, f->buf, f->offset);
- off = f->offset - (f->end - f->buf);
- for(c = f->buf; c < &f->buf[64]; ){
- fprint(2, "%7ld:", off);
- for(i = 0; i < 16; i++, off++)
- fprint(2, " %2x", *c++);
- fprint(2, "\n");
- }
-}
//GO.SYSIN DD ./fio/tstagh.c
echo ./fio/fioclose.c 1>&2
sed 's/.//' >./fio/fioclose.c <<'//GO.SYSIN DD ./fio/fioclose.c'
-#define FIO_IMP
-#include "fio.h"
-#include <libc.h>
-
-void
-Fclose(fd)
-{
- register Fbuffer *f;
-
- FIOSET(f, fd);
- Fflush(fd);
- if(f->flags&FIO_MALLOCED)
- free((char *)f);
- Ffb[fd] = 0;
- close(fd);
-}
//GO.SYSIN DD ./fio/fioclose.c
echo ./README 1>&2
sed 's/.//' >./README <<'//GO.SYSIN DD ./README'
-mk runs on Unix V9. To run on other systems requires some help.
-the help takes the form of the fast i/o library (fio) and some
-libc routines. dir.o provides support for the directory routines
-on V7-style filesystems; on most modern systems you should probably
-not use dir.o.
-
- - edit Makefile by setting the initial variables as
-per the instructions.
-
- - type make (unless on the cray, in which case, type make cray).
-
- - everything should now be compiled and you should have a mk.
-
- - edit mkfile to set the system type as in the Makefile
-
-as a first order test that all is well, try
- mk
-which generates a `correctly compiled' mk in the file nmk.
-
-If things go badly, (core dump hell), try not using alloc.c. it may be
-that your hardware needs special alloc treatment. otherwise, mail
-research!andrew (or [email protected]).
-
-the manual page and a tutorial style document are included.
//GO.SYSIN DD ./README
echo ./fio.h 1>&2
sed 's/.//' >./fio.h <<'//GO.SYSIN DD ./fio.h'
-#define FIOBSIZE 4096
-
-typedef struct Fbuffer
-{
- unsigned char *next; /* next char to be used */
- unsigned char *end; /* first invalid char */
- unsigned char *lnext; /* previous value of next */
- unsigned short flags; /* see FIO_.* below */
- short oflush; /* if >= 0 fd to flush on read */
- long offset; /* seek of end */
- unsigned char buf[FIOBSIZE];
-} Fbuffer;
-extern Fbuffer *Ffb[];
-
-#define FIORESET(f) ((f)->next=(f)->lnext=(f)->end=(f)->buf, (f)->flags&= ~FIO_MALLOCED, (f)->oflush= -1)
-#define FIOSET(f, fd) if((f=Ffb[fd&=0x7f]) == 0){Finit(fd,(char *)0);f=Ffb[fd];}
-/* FIOLINELEN is length of last input */
-#define FIOLINELEN(fd) (((int)(Ffb[fd]->next - Ffb[fd]->lnext))-1)
-/* FIOSEEK is lseek of next char to be processed */
-#define FIOSEEK(fd) (Ffb[fd]->offset - (Ffb[fd]->end - Ffb[fd]->next))
-#define FIOFLUSH(fd) if((fd >= 0) && Ffb[fd]) Fflush(fd)
-
-#define FIO_RDLAST 0x0001 /* true if last input was rdline */
-#define FIO_WRITING 0x0002 /* true if last action was write */
-#define FIO_MALLOCED 0x0004 /* set if Finit did the malloc */
-
-extern void Finit();
-extern char *Frdline();
-extern void Fundo();
-extern int Fgetc();
-extern long Fread();
-extern long Fwrite();
-extern long Fseek();
-extern int Fflush();
-
-#ifdef FIO_IMP
-/* COUNT is the type of counts to things like read, write, memcpy etc */
-#ifdef GNOT
-#define COUNT long
-#define FIOMALLOC(n) malloc(n)
-#define SEEK(a,b,c) seek(a,b,c)
-#else
-#define COUNT int
-#define FIOMALLOC(n) malloc(n)
-#define SEEK(a,b,c) lseek(a,b,c)
-#endif
-extern COUNT read(), write();
-#endif
//GO.SYSIN DD ./fio.h
echo ./regexp.h 1>&2
sed 's/.//' >./regexp.h <<'//GO.SYSIN DD ./regexp.h'
-/* the structure describing a sub-expression match */
-typedef struct {
- char *sp;
- char *ep;
-} regsubexp;
-
-/* a compiled regular expression */
-typedef char *regexp;
-
-/* the routines */
-extern regexp *regcomp();
-extern int regexec();
-extern void regsub();
//GO.SYSIN DD ./regexp.h
echo ./libc.h 1>&2
sed 's/.//' >./libc.h <<'//GO.SYSIN DD ./libc.h'
-/* system calls */
-extern unsigned alarm();
-extern void nap(), pause();
-extern char *sbrk();
-extern void exit(), _exit();
-extern long lseek();
-extern void nice();
-extern void profil();
-extern unsigned long settod();
-extern void sync();
-extern long time();
-
-/* libc et al */
-extern long lcm();
-extern double atof(), strtod();
-extern long atol();
-extern char *crypt();
-extern char *ctime();
-extern char *ecvt(), *fcvt(), *gcvt();
-extern char *galloc();
-extern char *getenv();
-extern char *getlogin();
-extern char *getpass();
-extern char *getwd(), *getcwd();
-extern char *malloc(), *realloc(), *calloc();
-extern char *memcpy(), *memchr(), *memccpy(), *memset();
-extern char *mktemp();
-extern double frand();
-extern char *setfields();
-extern char *strcpy(), *strncpy(), *strcat(), *strncat(), *strchr(), *strrchr();
-extern char *strpbrk(), *strtok(), *strdup();
-extern int atoi();
-extern char *tgetstr(), tgoto();
-extern char *ttyname(), *cttyname();
-
-#define NONEXIT 33
//GO.SYSIN DD ./libc.h
echo ./math/pow10.c 1>&2
sed 's/.//' >./math/pow10.c <<'//GO.SYSIN DD ./math/pow10.c'
-static double p[10] =
-{
- 1.0e0,
- 1.0e1,
- 1.0e2,
- 1.0e3,
- 1.0e4,
- 1.0e5,
- 1.0e6,
- 1.0e7,
- 1.0e8,
- 1.0e9,
-};
-
-double
-pow10(e)
-{
- int i;
-
- if(e < 0)
- return 1 / pow10(-e);
- if(e >= 10) {
- i = e/2;
- return pow10(i) * pow10(e-i);
- }
- return p[e];
-}
//GO.SYSIN DD ./math/pow10.c
echo ./math/Makefile 1>&2
sed 's/.//' >./math/Makefile <<'//GO.SYSIN DD ./math/Makefile'
-OBJ=pow10.o
-
-math.a: $(OBJ)
- ar r math.a $(OBJ)
- $(RANLIB) math.a
-
-cray: math.o
-
-math.o: $(OBJ)
- cat $(OBJ) > math.o
//GO.SYSIN DD ./math/Makefile
echo ./Makefile 1>&2
sed 's/.//' >./Makefile <<'//GO.SYSIN DD ./Makefile'
-OBJ=alloc.o arc.o bquote.o builtins.o dir.o expand.o gen.o glob.o graph.o job.o lex.o main.o makefile.o match.o mk.o parse.o quote.o recipe.o regexp.o rule.o run.o shprint.o sig.o symtab.o t_ar.o t_driver.o t_file.o var.o word.o
-# first define the system type from V9, BSD42, SEQUENT, SYSV
-SYSTEM=SYSV
-# second add any special C flags (and -DCRAY and -g if on the cray)
-CFLAGS=-I. -D$(SYSTEM)
-# third, if you don't have a ranlib, set RANLIB=:
-RANLIB=: # ranlib on other systems
-# now, to make everything just type make
-
-mk: nlib $(OBJ)
- $(CC) $(CFLAGS) -o mk $(OBJ) fio/fio.a libc/libc.a math/math.a
-nlib:
- cd math; make CFLAGS="$(CFLAGS)" CC=$(CC) RANLIB=$(RANLIB)
- cd libc; make CFLAGS="$(CFLAGS)" CC=$(CC) RANLIB=$(RANLIB)
- cd fio; make CFLAGS="$(CFLAGS)" CC=$(CC) RANLIB=$(RANLIB)
-
-clean:
- rm -f *.o mk nmk */*.[oa]
-alloc.o arc.o bquote.o builtins.o dir.o expand.o gen.o glob.o graph.o job.o lex.o main.o makefile.o match.o mk.o parse.o quote.o recipe.o regexp.o rule.o run.o shprint.o sig.o symtab.o t_ar.o t_driver.o t_file.o var.o word.o: fio.h libc.h mk.h ndir.h regexp.h
//GO.SYSIN DD ./Makefile
echo ./mkconv 1>&2
sed 's/.//' >./mkconv <<'//GO.SYSIN DD ./mkconv'
-x=/tmp/mk$$
-trap 'rm -f $x' 0 1 2
-tee $x < $1 | sed -e 's/$(\([^)]*\))\([ :\/]\)/$\1\2/g
- s/$(\([^)]*\))$/$\1/g
- s/$(\([^)]*\))/${\1}/g
- s/^ @/ /
- /^ -/,/[^\\]$/{
- /[^\\]$/s/$/; set -e/
- }
- /^ -/s/ -/ set +e; /
- s/:&/:/
- s/$% /$stem /g
- s/$%\./$stem\./g
- s/$%/${stem}/g
- s/$@/${target}/g
- s/$^/${prereq}/g
- s/$?/$newprereq/g'
-if egrep -s 'cd[ ]|make' < $x
-then
- echo "Warning: recipes containing \`cd' or \`make' need attention."
- egrep 'cd[ ]|make' < $x
-fi 1>&2
//GO.SYSIN DD ./mkconv
echo ./membername 1>&2
sed 's/.//' >./membername <<'//GO.SYSIN DD ./membername'
-echo "$@" | tr " " "\012" | sed -e "s/[^(]*(\([^)]*\)).*/\1/" | tr "\012" " "
//GO.SYSIN DD ./membername
echo ./mk.1 1>&2
sed 's/.//' >./mk.1 <<'//GO.SYSIN DD ./mk.1'
-.TH MK 1
-.CT 1 prog_c writing_troff prog_other
-.SH NAME
-mk, mkconv, membername \- maintain (make) related files
-.SH SYNOPSIS
-.B mk
-[
-.B -f
-.I mkfile
-] ...
-[
-.I option ...
-]
-[
-.I name ...
-]
-.PP
-.B mkconv
-.I makefile
-.PP
-.B membername
-.I aggregate ...
-.SH DESCRIPTION
-.I Mk
-is most often used to keep object files current with the
-source they depend on.
-.PP
-.I Mk
-reads
-.I mkfile
-and builds and executes dependency dags (directed acyclic graphs) for the target
-.IR names .
-If no target is specified, the targets of the first non-metarule in
-the first
-.I mkfile
-are used.
-If no
-.B -f
-option is present,
-.L mkfile
-is tried.
-Other options are:
-.TP \w'\fL-d[egp]\ 'u
-.B -a
-Assume all targets to be out of date.
-Thus, everything gets made.
-.PD 0
-.TP
-.BR -d [ egp ]
-Produce debugging output
-.RB ( p
-is for parsing,
-.B g
-for graph building,
-.B e
-for execution).
-.TP
-.B -e
-Explain why each target is made.
-.TP
-.B -i
-Force any missing intermediate targets to be made.
-.TP
-.B -k
-Do as much work as possible in the face of errors.
-.TP
-.B -m
-Generate an equivalent makefile on standard output.
-Recipes are not handled well.
-.TP
-.B -n
-Print, but do not execute, the commands
-needed to update the targets.
-.TP
-.B -t
-Touch (update the modified date of) non-virtual targets, without
-executing any recipes.
-.TP
-.B -u
-Produce a table of clock seconds spent with
-.I n
-recipes running.
-.TP
-.BI -w name1,name2,...
-Set the initial date stamp for each name
-to the current time.
-The names may also be separated by blanks or newlines.
-(Use with
-.B -n
-to find what else would need to change if the named files
-were modified.)
-.PD
-.PP
-.I Mkconv
-attempts to convert a
-.IR make (1)
-.I makefile
-to a
-.IR mkfile
-on standard output.
-The conversion is not likely to be faithful.
-.PP
-The shell script
-.I membername
-extracts member names
-(see `Aggregates' below)
-from its arguments.
-.SS Definitions
-A
-.I mkfile
-consists of
-.I assignments
-(described under `Environment') and
-.IR rules .
-A rule contains
-.I targets
-and a
-.I tail.
-A target is a literal string, or
-.I label,
-and is normally a file name.
-The tail contains zero or more
-.I prerequisites
-and an optional
-.I recipe,
-which is a shell script.
-.PP
-A
-.I metarule
-has a target of the form
-.IB A % B
-where
-.I A
-and
-.I B
-are (possibly empty) strings.
-A metarule applies to any label that matches the target with
-.B %
-replaced by an arbitrary string, called the
-.IR stem .
-In interpreting a metarule,
-the stem is substituted for all occurrences of
-.B %
-in the prerequisite names.
-A metarule may be marked as using regular expressions (described under `Syntax').
-In this case,
-.B %
-has no special meaning;
-the target is interpreted according to
-.IR regexp (3).
-The dependencies may refer to subexpressions in the normal way, using
-.BI \e n.
-The
-.I dependency dag
-for a target consists of
-.I nodes
-connected by directed
-.IR arcs .
-A node consists of a label
-and a set of arcs leading to prerequisite nodes.
-The root
-node is labeled with an original target
-.I name.
-.SS Building the Dependency Dag
-.PP
-Read the
-.I mkfiles
-in command line order and distribute rule tails over targets
-to get single-target rules.
-.PP
-For a node
-.IR n ,
-for every rule
-.I r
-that matches
-.IR n 's
-label generate an arc to a prerequisite node.
-The node
-.I n
-is then marked as done.
-The process is then repeated for each of the prerequisite nodes.
-The process stops if
-.I n
-is already done,
-or if
-.I n
-has no prerequisites,
-or if any rule would be used more than
-.B $NREP
-times on the current path in the dag.
-A probable node is one where the label exists as a file
-or is a target of a non-metarule.
-.PP
-After the graph is built, it is checked for cycles,
-and subdags containing no probable nodes are deleted.
-Also, for any node with arcs generated by a non-metarule with a recipe,
-arcs generated by a metarule with a recipe
-are deleted.
-Disconnected subdags are deleted.
-.SS Execution
-Labels have an associated date stamp.
-A label is
-.I ready
-if it has no prerequisites, or
-all its prerequisites are made.
-A ready label is
-.I trivially uptodate
-if it is not a target and has a nonzero date stamp, or
-it has a nonzero date stamp,
-and all its prerequisites are made and predate the ready label.
-A ready label is marked
-.I made
-(and given a date stamp)
-if it is trivially uptodate or by executing the recipe
-associated with the arcs leading from the node associated with the ready label.
-The
-.B P
-attribute can be used to generalize
-.IR mk 's
-notion of determining if prerequisites predate a label.
-Rather than comparing date stamps, it executes a specified program
-and uses the exit status.
-.PP
-Date stamps are calculated differently for virtual labels,
-for labels that correspond to extant files,
-and for other labels.
-If a label is
-.I virtual
-(target of a rule with the
-.B V
-attribute),
-its date stamp is initially zero and upon being made is set to
-the most recent date stamp of its prerequisites.
-Otherwise, if a label is nonexistent
-(does not exist as a file),
-its date stamp is set to the most recent date stamp of its prerequisites,
-or zero if it has no prerequisites.
-Otherwise, the label is the name of a file and
-the label's date stamp is always that file's modification date.
-.PP
-Nonexistent labels which have prerequisites
-and are prerequisite to other label(s) are treated specially unless the
-.B -i
-flag is used.
-Such a label
-.I l
-is given the date stamp of its most recent prerequisite
-and if this causes all the labels which have
-.I l
-as a prerequisite to be trivially uptodate,
-.I l
-is considered to be trivially uptodate.
-Otherwise,
-.I l
-is made in the normal fashion.
-.PP
-Two recipes are called identical if they arose by distribution
-from a single rule as described above.
-Identical recipes may be executed only when all
-their prerequisite nodes are ready, and then just one instance of
-the identical recipes is executed to make all their target nodes.
-.PP
-Files may be made in any order that respects
-the preceding restrictions.
-.PP
-A recipe is executed by supplying the recipe as standard input to
-the command
-.B
- /bin/sh -e
-.br
-The environment is augmented by the following variables:
-.TP 14
-.B $alltarget
-all the targets of this rule.
-.TP
-.B $newprereq
-the prerequisites that caused this rule to execute.
-.TP
-.B $nproc
-the process slot for this recipe.
-It satisfies
-.RB 0\(<= $nproc < $NPROC ,
-where
-.B $NPROC
-is the maximum number of recipes that may be executing
-simultaneously.
-.TP
-.B $pid
-the process id for the
-.I mk
-forking the recipe.
-.TP
-.B $prereq
-all the prerequisites for this rule.
-.TP
-.B $stem
-if this is a metarule,
-.B $stem
-is the string that matched
-.BR % .
-Otherwise, it is empty.
-For regular expression metarules, the variables
-.LR stem0 ", ...,"
-.L stem9
-are set to the corresponding subexpressions.
-.TP
-.B $target
-the targets for this rule that need to be remade.
-.PP
-Unless the rule has the
-.B Q
-attribute,
-the recipe is printed prior to execution
-with recognizable shell variables expanded.
-To see the commands print as they execute,
-include a
-.L set -x
-in your rule.
-Commands returning nonzero status (see
-.IR intro (1))
-cause
-.I mk
-to terminate.
-.SS Aggregates
-Names of the form
-.IR a ( b )
-refer to member
-.I b
-of the aggregate
-.IR a .
-Currently, the only aggregates supported are
-.IR ar (1)
-archives.
-.SS Environment
-Rules may make use of shell (or environment) variables.
-A legal shell variable reference of the form
-.B $OBJ
-or
-.B ${name}
-is expanded as in
-.IR sh (1).
-A reference of the form
-.BI ${name: A % B = C\fB%\fID\fB}\fR,
-where
-.I A, B, C, D
-are (possibly empty) strings,
-has the value formed by expanding
-.B $name
-and substituting
-.I C
-for
-.I A
-and
-.I D
-for
-.I B
-in each word in
-.B $name
-that matches pattern
-.IB A % B .
-.PP
-Variables can be set by
-assignments of the form
-.I
- var\fB=\fR[\fIattr\fB=\fR]\fItokens\fR
-.br
-where
-.I tokens
-and the optional attributes
-are defined under `Syntax' below.
-The environment is exported to recipe executions.
-Variable values are taken from (in increasing order of precedence)
-the default values below, the environment, the mkfiles,
-and any command line assignment.
-A variable assignment argument overrides the first (but not any subsequent)
-assignment to that variable.
-.br
-.ne 1i
-.EX
-.ta \n(.lu/3u +\n(.lu/3u
-.nf
-AS=as FFLAGS= NPROC=1
-CC=cc LEX=lex NREP=1
-CFLAGS= LFLAGS= YACC=yacc
-FC=f77 LDFLAGS= YFLAGS=
-BUILTINS='
-.ta 8n
-%.o: %.c
- $CC $CFLAGS -c $stem.c
-%.o: %.s
- $AS -o $stem.o $stem.s
-%.o: %.f
- $FC $FFLAGS -c $stem.f
-%.o: %.y
- $YACC $YFLAGS $stem.y &&
- $CC $CFLAGS -c y.tab.c && mv y.tab.o $stem.o; rm y.tab.c
-%.o: %.l
- $LEX $LFLAGS -t $stem.l > $stem.c &&
- $CC $CFLAGS -c $stem.c && rm $stem.c'
-ENVIRON=
-.EE
-.PP
-The builtin rules are obtained from the variable
-.B BUILTINS
-after all input has been processed.
-The
-.B ENVIRON
-variable is split into parts at control-A characters,
-the control-A characters are deleted, and the parts are
-placed in the environment.
-The variable
-.B MKFLAGS
-contains all the option arguments (arguments starting with
-.L -
-or containing
-.LR = )
-and
-.B MKARGS
-contains all the targets in the call to
-.IR mk .
-.SS Syntax
-Leading white space (blank or tab) is ignored.
-Input after an unquoted
-.B #
-(a comment) is ignored as are blank lines.
-Lines can be spread over several physical lines by
-placing a
-.B \e
-before newlines to be elided.
-Non-recipe lines are processed by substituting for
-.BI ` cmd `
-and then substituting for variable references.
-Finally, the filename metacharacters
-.B []*?
-are expanded.
-.tr #"
-Quoting by
-.BR \&'' ,
-.BR ## ,
-and
-.B \e
-is supported.
-The semantics for substitution and quoting are given in
-.IR sh (1).
-.PP
-The contents of files may be included by lines beginning with
-.B <
-followed by a filename.
-.PP
-.tr ##
-Assignments and rule header lines are distinguished by
-the first unquoted occurrence of
-.B :
-(rule header)
-or
-.B =
-(assignment).
-.PP
-A rule definition consists of a header line followed by a recipe.
-The recipe consists of all lines following the header line
-that start with white space.
-The recipe may be empty.
-The first character on every line of the recipe is elided.
-The header line consists of at least one target followed by the rule separator
-and a possibly empty list of prerequisites.
-The rule separator is either a single
-.LR :
-or is a
-.L :
-immediately followed by attributes and another
-.LR : .
-If any prerequisite is more recent than any of the targets,
-the recipe is executed.
-This meaning is modified by the following attributes
-.TP
-.B <
-The standard output of the recipe is read by
-.I mk
-as an additional mkfile.
-Assignments take effect immediately.
-Rule definitions are used when a new dependency dag is constructed.
-.PD 0
-.TP
-.B D
-If the recipe exits with an error status, the target is deleted.
-.TP
-.B N
-If there is no recipe, the target has its time updated.
-.TP
-.B P
-The characters after the
-.B P
-until the terminating
-.B :
-are taken as a program name.
-It will be invoked as
-.B "sh -c prog 'arg1' 'arg2'"
-and should return 0 exit status
-if and only if arg1 is not out of date with respect to arg2.
-Date stamps are still propagated in the normal way.
-.TP
-.B Q
-The recipe is not printed prior to execution.
-.TP
-.B R
-The rule is a metarule using regular expressions.
-.TP
-.B U
-The targets are considered to have been updated
-even if the recipe did not do so.
-.TP
-.B V
-The targets of this rule are marked as virtual.
-They are distinct from files of the same name.
-.PD
-.PP
-Similarly, assignments may have attributes terminated by
-.BR = .
-The only assignment attribute is
-.TP 3
-.B U
-Do not export this variable to recipe executions.
-.SH EXAMPLES
-A simple mkfile to compile a program.
-.IP
-.EX
-prog: a.o b.o c.o
- $CC $CFLAGS -o $target $prereq
-.EE
-.PP
-Override flag settings in the mkfile.
-.IP
-.EX
-$ mk target CFLAGS='-O -s'
-.EE
-.PP
-To get the prerequisites for an aggregate.
-.IP
-.EX
-$ membername 'libc.a(read.o)' 'libc.a(write.o)'
-read.o write.o
-.EE
-.PP
-Maintain a library.
-.IP
-.EX
-libc.a(%.o):N: %.o
-libc.a: libc.a(abs.o) libc.a(access.o) libc.a(alarm.o) ...
- names=`membername $newprereq`
- ar r libc.a $names && rm $names
-.EE
-.PP
-Backquotes used to derive a list from a master list.
-.IP
-.EX
-NAMES=alloc arc bquote builtins expand main match mk var word
-OBJ=`echo $NAMES|sed -e 's/[^ ][^ ]*/&.o/g'`
-.EE
-.PP
-Regular expression metarules.
-The single quotes are needed to protect the
-.BR \e s.
-.IP
-.EX
-\&'([^/]*)/(.*)\e.o':R: '\e1/\e2.c'
- cd $stem1; $CC $CFLAGS -c $stem2.c
-.EE
-.PP
-A correct way to deal with
-.IR yacc (1)
-grammars.
-The file
-.B lex.c
-includes the file
-.B x.tab.h
-rather than
-.B y.tab.h
-in order to reflect changes in content, not just modification time.
-.IP
-.EX
-YFLAGS=-d
-lex.o: x.tab.h
-x.tab.h: y.tab.h
- cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
-y.tab.c y.tab.h: gram.y
- $YACC $YFLAGS gram.y
-.EE
-.PP
-The above example could also use the
-.B P
-attribute for the
-.B x.tab.h
-rule:
-.IP
-.EX
-x.tab.h:Pcmp -s: y.tab.h
- cp y.tab.h x.tab.h
-.EE
-.SH SEE ALSO
-.IR make (1),
-.IR chdate (1),
-.IR sh (1),
-.IR regexp (3)
-.br
-A. Hume,
-.RI ` Mk :
-a Successor to
-.IR Make ',
-this manual, Volume 2
-.SH BUGS
-Identical recipes for regular expression metarules only have one target.
-.br
-Seemingly appropriate input like
-.B CFLAGS=-DHZ=60
-is parsed as an erroneous attribute; correct it by inserting
-a space after the first
-.LR = .
//GO.SYSIN DD ./mk.1
echo ./alloc.c 1>&2
sed 's/.//' >./alloc.c <<'//GO.SYSIN DD ./alloc.c'
-#include "libc.h"
-
-static int goo; /* so no empty object on cray */
-
-#ifndef CRAY
-
-#define A(x) ((((long)x)+sizeof(long)-1)&~(sizeof(long)-1))
-
-char *next;
-int nleft;
-
-char *
-malloc(n)
-{
- extern char *sbrk();
- char *s;
-
- n = A(n);
- if(n > nleft){
- next = sbrk(nleft = A(32000));
- if(next == (char *)-1){
- perror("mk: sbrk");
- Exit();
- }
- }
- s = next;
- next += n;
- nleft -= n;
- return(s);
-}
-
-free(s)
- char *s;
-{
-}
-
-char *
-realloc(s, n)
- char *s;
- unsigned n;
-{
- char *r;
-
- r = malloc(n);
- memcpy(r, s, n);
- return(r);
-}
-
-#endif
//GO.SYSIN DD ./alloc.c
echo ./arc.c 1>&2
sed 's/.//' >./arc.c <<'//GO.SYSIN DD ./arc.c'
-#include "mk.h"
-
-Arc *
-newarc(n, r, stem, match)
- Node *n;
- Rule *r;
- char *stem;
- regsubexp *match;
-{
- register Arc *a;
-
- a = (Arc *)Malloc(sizeof(Arc));
- a->n = n;
- a->r = r;
- a->stem = strdup(stem);
- memcpy((char *)a->match, (char *)match, sizeof a->match);
- a->next = 0;
- a->flag = 0;
- a->prog = r->prog;
- return(a);
-}
-
-dumpa(s, a)
- char *s;
- register Arc *a;
-{
- char buf[1024];
-
- sprint(buf, "%s ", (*s == ' ')? s:"");
- Fprint(1, "%sArc@%ld: n=%ld r=%ld flag=0x%x stem='%s'",
- s, a, a->n, a->r, a->flag, a->stem);
- if(a->prog)
- Fprint(1, " prog='%s'", a->prog);
- Fprint(1, "\n");
- if(a->n)
- dumpn(buf, a->n);
-}
-
-nrep()
-{
- register Symtab *sym;
-
- if(sym = symlook("NREP", S_VAR, (char *)0))
- nreps = atoi(sym->value);
- if(nreps < 1)
- nreps = 1;
- if(DEBUG(D_GRAPH))
- Fprint(1, "nreps = %d\n", nreps);
-}
//GO.SYSIN DD ./arc.c
echo ./bquote.c 1>&2
sed 's/.//' >./bquote.c <<'//GO.SYSIN DD ./bquote.c'
-#include "mk.h"
-
-bquote(fd, src, dest)
- register char *src, *dest;
-{
- int childin[2], childout[2], pid, i;
- int quotedone = 1;
- char *ldest, *t;
- char *newline = "\n";
- int wearedone = 0;
- int initdone = 0;
- extern char **environ;
-
- while(wearedone == 0)
- switch(*src)
- {
- default:
- *dest++ = *src++;
- break;
- case 0:
- if(quotedone)
- wearedone = 1;
- else {
- if(t = Frdline(fd)){
- inline++;
- *dest++ = '\n'|EBIT;
- strcpy(src, t);
- continue;
- } else {
- SYNERR(-1); Fprint(2, "missing closing `\n");
- break;
- }
- }
- break;
- case '\\':
- if(*src)
- *dest++ = *src++;
- else
- if(t = Frdline(fd)){
- inline++;
- strcpy(src, t);
- }
- break;
- case '`':
- if(quotedone = 1-quotedone){
- if(initdone == 0){
- execinit();
- initdone = 1;
- }
- Fflush(1);
- Fflush(2);
- if(pipe(childin) < 0){
- SYNERR(-1); perror("pipe1");
- Exit();
- }
- if(pipe(childout) < 0){
- SYNERR(-1); perror("pipe2");
- Exit();
- }
- if((pid = fork()) < 0){
- SYNERR(-1); perror("fork");
- Exit();
- }
- if(pid){ /* parent */
- close(childin[0]);
- close(childout[1]);
- if(ldest < dest){
- writeout(childin[1], ldest, dest);
- writeout(childin[1], newline, newline+1);
- }
- close(childin[1]);
- dest = ldest;
- while((i = read(childout[0], dest, 512)) > 0)
- dest += i;
- if((dest > ldest) && (dest[-1] == '\n'))
- dest--;
- close(childout[0]);
- } else {
- dup2(childin[0], 0);
- dup2(childout[1], 1);
- close(childin[0]);
- close(childin[1]);
- close(childout[0]);
- close(childout[1]);
- if(execle(SHELL, "sh", (char *)0, environ) < 0)
- perror("exec");
- _exit(1);
- }
- } else
- ldest = dest;
- src++;
- break;
- }
- *dest = 0;
-}
-
-writeout(fd, b, e)
- register char *b, *e;
-{
- char buf[BIGBLOCK];
- register char *s;
-
- for(s = buf; b < e;){
- if(s >= &buf[BIGBLOCK-1]){
- SYNERR(-1); Fprint(2, "too much text (%d chars) for `expr`\n", s-buf);
- Exit();
- }
- if(*b&EBIT){
- *s++ = '\\';
- *s++ = (~EBIT) & *b++;
- } else
- *s++ = *b++;
- }
- write(fd, buf, s-buf);
-}
//GO.SYSIN DD ./bquote.c
echo ./builtins.c 1>&2
sed 's/.//' >./builtins.c <<'//GO.SYSIN DD ./builtins.c'
-#include "mk.h"
-
-char *bltin[] =
-{
- "AS", "as",
- "CC", "cc",
- "CFLAGS", "",
- "FC", "f77",
- "FFLAGS", "",
- "LDFLAGS", "",
- "LEX", "lex",
- "LFLAGS", "",
- "NPROC", "1",
- "NREP", "1",
- "YACC", "yacc",
- "YFLAGS", "",
- "BUILTINS", "%.o: %.c\n\
- $CC $CFLAGS -c $stem.c\n\
-%.o: %.s\n\
- $AS -o $stem.o $stem.s\n\
-%.o: %.f\n\
- $FC $FFLAGS -c $stem.f\n\
-%.o: %.y\n\
- $YACC $YFLAGS $stem.y && $CC $CFLAGS -c y.tab.c && mv y.tab.o $stem.o; rm y.tab.c\n\
-%.o: %.l\n\
- $LEX $LFLAGS -t $stem.l > /tmp/$$.c && $CC $CFLAGS -c /tmp/$$.c && mv /tmp/$$.o $stem.o; rm /tmp/$$.c\n",
- "ENVIRON", "",
- 0
-};
-
-builtins()
-{
- register char **b;
-
- for(b = bltin; *b; b += 2)
- setvar(b[0], strdup(b[1]));
-}
-
-parsebuiltins()
-{
- char *s, *file;
- int fd;
- int n;
-
- s = symlook("BUILTINS", S_VAR, (char *)0)->value;
- if(*s == 0)
- return;
- file = mktemp("/tmp/mkXXXXXX");
- if((fd = creat(file, 0600)) < 0){
- fprint(2, "mk: builtins in ");
- perror(file);
- Exit();
- }
- if(n = strlen(s)){
- write(fd, s, n);
- if(s[n-1] != '\n')
- write(fd, "\n", 1);
- }
- close(fd);
- parse("BUILTINS", open(file, 0), 0, 0);
- unlink(file);
-}
//GO.SYSIN DD ./builtins.c
echo ./dir.c 1>&2
sed 's/.//' >./dir.c <<'//GO.SYSIN DD ./dir.c'
-#include <sys/types.h>
-#include <sys/stat.h>
-#ifndef SEQUENT
-#include <ndir.h>
-#else
-#include <dir.h>
-#endif
-
-#ifdef SEQUENT
-#define DIRSIZE MAXNAMELEN
-#else
-#define DIRSIZE 14
-#endif
-#ifndef MAXNAMELEN
-#define MAXNAMELEN 255
-#endif
-#ifndef DIRSIZ
-#define DIRSIZ(dp) \
- ((sizeof(struct direct) - MAXNAMLEN + (dp)->d_namlen + sizeof(ino_t) - 1) &\
- ~(sizeof(ino_t) - 1))
-#endif
-
-extern char *strncpy(), *malloc();
-
-DIR *
-opendir(name)
-register char *name;
-{
- DIR dirbuf, *dirp;
- struct stat statb;
- char buf[MAXNAMELEN+1];
- register char *s;
-
- strncpy(buf, name, MAXNAMELEN);
- buf[MAXNAMELEN-1] = 0;
- if ((dirbuf.dd_fd = open(buf, 0)) < 0)
- return((DIR *)0);
- if (fstat(dirbuf.dd_fd, &statb)!=0 || (statb.st_mode & S_IFMT)!=S_IFDIR){
- close(dirbuf.dd_fd);
- return((DIR *)0);
- }
- dirbuf.dd_loc = 0;
- dirp = (DIR *)malloc(sizeof(DIR));
- *dirp = dirbuf;
- return(dirp);
-}
-
-void
-closedir(dirp)
-DIR *dirp;
-{
- close(dirp->dd_fd);
- free((char *)dirp);
-}
-
-/*
- * read an old stlye directory entry and present it as a new one
- */
-#define ODIRSIZ 14
-
-struct olddirect {
- ino_t d_ino;
- char d_name[ODIRSIZ];
-#ifdef CRAY
- char d_pad[10];
-#endif
-};
-
-/*
- * get next entry in a directory.
- */
-struct direct *
-readdir(dirp)
- register DIR *dirp;
-{
- register struct olddirect *dp;
- static struct direct dir;
-
- for (;;) {
- if (dirp->dd_loc == 0) {
- dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
- DIRBLKSIZ);
- if (dirp->dd_size <= 0)
- return((struct direct *)0);
- }
- if (dirp->dd_loc >= dirp->dd_size) {
- dirp->dd_loc = 0;
- continue;
- }
- dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
- dirp->dd_loc += sizeof(struct olddirect);
- if (dp->d_ino == 0)
- continue;
- dir.d_ino = dp->d_ino;
- strncpy(dir.d_name, dp->d_name, ODIRSIZ);
- dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
- dir.d_namlen = strlen(dir.d_name);
- dir.d_reclen = DIRSIZ(&dir);
- return (&dir);
- }
-}
//GO.SYSIN DD ./dir.c
echo ./expand.c 1>&2
sed 's/.//' >./expand.c <<'//GO.SYSIN DD ./expand.c'
-#include "mk.h"
-#include <ctype.h>
-
-static Word *bollard;
-
-static void
-append(s)
- char *s;
-{
- register Word *w;
- register char *p;
-
- if(bollard){
- for(w = bollard; w->next; w = w->next)
- ;
- w = w->next = stow(s);
- } else
- w = bollard = stow(s);
- if(w) /* if we got a word */
- for(p = w->s; *p;)
- *p++ &= ~EBIT;
-}
-
-Word *
-expand(s)
- register char *s;
-{
- char save;
- register char *t;
- Word *head, *w;
-
- w = head = newword("");
- while(*s){
- while(SEP(*s))
- s++;
- if(*s == 0) break;
- for(t = s+1; *t && !SEP(*t); t++)
- ;
- save = *t;
- *t = 0;
- bollard = 0;
- glob(s, append);
- w->next = bollard;
- while(w->next)
- w = w->next;
- *t = save;
- s = t;
- }
- w = head->next;
- delword(head);
- return(w);
-}
//GO.SYSIN DD ./expand.c
echo ./gen.c 1>&2
sed 's/.//' >./gen.c <<'//GO.SYSIN DD ./gen.c'
-#include "mk.h"
-
-#define NMATCH 10
-
-gen(buf)
- char *buf;
-{
- char buf1[BIGBLOCK];
- register char *src, *dest;
- register char *s1, *s2, *s3, *s4;
- regexp *prog;
- regsubexp match[NMATCH];
- char c;
-
- if((s1 = strchr(buf, '@')) == 0)
- return;
- patrule = 0;
- src = buf;
- dest = buf1;
- do {
- while(src != s1)
- *dest++ = *src++;
- if((s2 = strchr(s1+1, '@')) && (s3 = strchr(s2+1, '@'))
- && (s4 = strchr(s3+1, '@')))
- ;
- else {
- SYNERR(-1); Fprint(2, "expected four @\n");
- break;
- }
- src = s4+1;
- *s2++ = *s3++ = *s4 = 0;
- prog = regcomp(s2);
- for(s2 = ++s1; ; s2 = s1){
- while((*s2 == ' ')||(*s2 == '\t'))
- s2++;
- if(s1 != s2) *dest++ = ' ';
- if(*s2 == 0) break;
- for(s1 = s2+1; *s1 && (*s1 != ' ') && (*s1 != '\t');)
- s1++;
- c = *s1;
- *s1 = 0;
- if(regexec(prog, s2, match, NMATCH)){
- regsub(s3, dest, match, NMATCH);
- while(*dest) dest++;
- } else
- while(*dest = *s2++)
- dest++;
- *s1 = c;
- }
- } while(s1 = strchr(src, '@'));
- while(*dest++ = *src++)
- ;
- memcpy(buf, buf1, (int)(dest-buf1));
-}
//GO.SYSIN DD ./gen.c
echo ./glob.c 1>&2
sed 's/.//' >./glob.c <<'//GO.SYSIN DD ./glob.c'
-#include <sys/types.h>
-#include <sys/stat.h>
-#ifndef SEQUENT
-#include <ndir.h>
-#else
-#include <dir.h>
-#endif
-#include <string.h>
-#include "mk.h"
-
-#define MAXPATH BIGBLOCK
-
-static char result[MAXPATH];
-static doit();
-
-/*
- * globals (file name generation)
- *
- * "*" in params matches r.e ".*"
- * "?" in params matches r.e. "."
- * "[...]" in params matches character class
- * "[...a-z...]" in params matches a through z.
- *
- */
-
-static
-gglob(arg, dest, fn)
- char *arg, *dest;
- void (*fn)();
-{
- int meta;
- char *slash, *s;
- DIR *dirf;
-
- /*
- check for meta chars
- */
- for(s = arg, slash = 0, meta = 0; *s && !meta; s++)
- switch(*s)
- {
- case '/':
- slash = s+1;
- break;
- case '\\':
- if(s[1])
- s++;
- break;
- case '[':
- case '*':
- case '?':
- meta = 1;
- break;
- }
- if(meta == 0){
- strcpy(dest, arg);
- (*fn)(result);
- return;
- }
- if(slash){
- memcpy(dest, arg, slash-arg);
- dest += slash-arg;
- *dest = 0;
- } else
- slash = arg;
- s = strchr(slash, '/');
- if(dirf = opendir(result[0] ? result : ".")){
- struct direct *e;
- int found;
-
- found = 0;
- if(s) *s = 0;
- /* slash is null terminated (s) pattern */
- while(e = readdir(dirf)){
- if(e->d_name[0] == '.' && *slash != '.'){
- if (e->d_name[1] == 0)
- continue;
- if (e->d_name[1] == '.' && e->d_name[2] == 0)
- continue;
- }
- if(gmatch(e->d_name, slash)){
- found = 1;
- strcpy(dest, e->d_name);
- doit(s, dest, fn);
- }
- }
- if(!found){
- strcpy(dest, slash);
- doit(s, dest, fn);
- }
- closedir(dirf);
- } else {
- if(s)
- *s = 0;
- strcpy(dest, slash);
- dest = strchr(dest, 0);
- if(s){
- *dest++ = '/';
- *dest = 0;
- gglob(s+1, dest, fn);
- } else
- (*fn)(result);
- }
- if(s) *s = '/';
-}
-
-static
-doit(s, dest, fn)
- char *s, *dest;
- void (*fn)();
-{
- if(s){
- register char *ss;
-
- ss = strchr(dest, 0);
- *ss++ = '/';
- *ss = 0;
- gglob(s+1, ss, fn);
- } else
- (*fn)(result);
-}
-
-gmatch(s, p)
-register char *s, *p;
-{
- register int scc;
- unsigned char c;
-
- scc = *s++&(0xFF&~EBIT);
- switch (c = *p++)
- {
- case '[':
- {
- int ok;
- int lc;
- int notflag = 0;
-
- ok = 0;
- lc = 077777;
- if (*p == '^'){
- notflag = 1;
- p++;
- }
- while (c = *p++){
- if (c == ']')
- return(ok ? gmatch(s, p) : 0);
- else if (c == '-'){
- if (notflag){
- if (scc < lc || scc > *(p++))
- ok++;
- else
- return(0);
- } else {
- if (lc <= scc && scc <= (*p++))
- ok++;
- }
- } else {
- lc = c&~EBIT;
- if (notflag){
- if (scc && scc != lc)
- ok++;
- else
- return(0);
- } else {
- if (scc == lc)
- ok++;
- }
- }
- }
- return(0);
- }
-
- default:
- if ((c&~EBIT) != scc)
- return(0);
-
- case '?':
- return(scc ? gmatch(s, p) : 0);
-
- case '*':
- while (*p == '*')
- p++;
-
- if (*p == 0)
- return(1);
- --s;
- while (*s){
- if (gmatch(s++, p))
- return(1);
- }
- return(0);
-
- case 0:
- return(scc == 0);
- }
-}
-
-glob(s, fn)
- char *s;
- void (*fn)();
-{
- result[0] = 0;
- if(strlen(s) >= MAXPATH){
- SYNERR(inline-1);
- Fprint(2, "too much input for glob expansion; max=%d, given %d\n", MAXPATH, strlen(s));
- Exit();
- }
- gglob(s, result, fn);
-}
-
-#ifdef MAIN
-
-void
-pr(s)
- char *s;
-{
- Fwrite(1, s, strlen(s));
- Fputc(1, '\n');
-}
-
-main(argc, argv)
- char **argv;
-{
- for(argv++; *argv; argv++){
- Fprint(1, "<%s>:\n", *argv);
- glob(*argv, pr);
- Fprint(1, "*******\n");
- }
- exit(0);
-}
-#endif
//GO.SYSIN DD ./glob.c
echo ./graph.c 1>&2
sed 's/.//' >./graph.c <<'//GO.SYSIN DD ./graph.c'
-#include "mk.h"
-
-static Node *newnode(), *applyrules();
-static cyclechk(), vacuous(), ambiguous(), attribute();
-
-Node *
-graph(target)
- char *target;
-{
- Node *node;
- char *cnt;
-
- node = applyrules(target, cnt = rulecnt());
- free(cnt);
- cyclechk(node);
- node->flags |= PROBABLE; /* make sure it doesn't get deleted */
- (void)vacuous(node);
- (void)ambiguous(node);
- (void)attribute(node);
- return(node);
-}
-
-static Node *
-applyrules(target, cnt)
- char *target, *cnt;
-{
- Symtab *sym;
- Node *node;
- Rule *r;
- Arc head, *a = &head;
- Word *w;
- char stem[NAMEBLOCK], buf[NAMEBLOCK];
- regsubexp rmatch[NREGEXP];
-
-/* print("appplyrules(%ld='%s')\n", target, target);/**/
- if(sym = symlook(target, S_NODE, (char *)0)){
- node = (Node *)(sym->value);
- return(node);
- }
- target = strdup(target);
- node = newnode(target);
- head.n = 0;
- head.next = 0;
- sym = symlook(target, S_TARGET, (char *)0);
- for(r = sym? (Rule *)(sym->value):0; r; r = r->chain){
- if(r->attr&META) continue;
- if(strcmp(target, r->target)) continue;
- if(cnt[r->rule] >= nreps) continue;
- cnt[r->rule]++;
- node->flags |= PROBABLE;
- if(r->attr&VIR)
- node->flags |= VIRTUAL;
- if(r->attr&NOREC)
- node->flags |= NORECIPE;
- if(r->attr&DEL)
- node->flags |= DELETE;
- if(r->tail == 0)
- a = a->next = newarc((Node *)0, r, "", rmatch);
- else
- for(w = r->tail; w; w = w->next){
- a = a->next = newarc(applyrules(w->s, cnt), r, "", rmatch);
- }
- cnt[r->rule]--;
- head.n = node;
- }
- for(r = metarules; r; r = r->next){
- if(r->attr®EXP){
- stem[0] = 0;
- patrule = r;
- if(regexec(r->pat, node->name, rmatch, NREGEXP) == 0)
- continue;
- } else {
- if(!match(node->name, r->target, stem)) continue;
- }
- if(cnt[r->rule] >= nreps) continue;
- cnt[r->rule]++;
- if(r->attr&VIR)
- node->flags |= VIRTUAL;
- if(r->attr&NOREC)
- node->flags |= NORECIPE;
- if(r->attr&DEL)
- node->flags |= DELETE;
- if(r->tail == 0)
- a = a->next = newarc((Node *)0, r, strdup(stem), rmatch);
- else
- for(w = r->tail; w; w = w->next){
- if(r->attr®EXP)
- regsub(w->s, buf, rmatch, NREGEXP);
- else
- subst(stem, w->s, buf);
- a = a->next = newarc(applyrules(buf, cnt), r, strdup(stem), rmatch);
- }
- cnt[r->rule]--;
- }
- a->next = node->prereqs;
- node->prereqs = head.next;
- return(node);
-}
-
-static
-togo(node)
- register Node *node;
-{
- register Arc *la, *a;
-
- /* delete them now */
- for(a = node->prereqs; a; la = a, a = a->next)
- if(a->flag&TOGO){
- if(a == node->prereqs)
- node->prereqs = a->next;
- else
- la->next = a->next, a = la;
- }
-}
-
-static
-vacuous(node)
- register Node *node;
-{
- register Arc *la, *a;
- int vac = !(node->flags&PROBABLE);
-
- if(node->flags&READY)
- return(node->flags&VACUOUS);
- node->flags |= READY;
- for(a = node->prereqs; a; a = a->next)
- if(a->n && vacuous(a->n) && (a->r->attr&META))
- a->flag |= TOGO;
- else
- vac = 0;
- /* if a rule generated arcs that DON'T go; no others from that rule go */
- for(a = node->prereqs; a; a = a->next)
- if((a->flag&TOGO) == 0)
- for(la = node->prereqs; la; la = la->next)
- if((la->flag&TOGO) && (la->r == a->r)){
- la->flag &= ~TOGO;
- }
- togo(node);
- if(vac)
- node->flags |= VACUOUS;
- return(vac);
-}
-
-static Node *
-newnode(name)
- char *name;
-{
- register Node *node;
-
- node = (Node *)Malloc(sizeof(Node));
- symlook(name, S_NODE, (char *)node);
- node->name = name;
- node->time = timeof(name, 0);
- node->prereqs = 0;
- node->flags = node->time? PROBABLE : 0;
- node->next = 0;
- return(node);
-}
-
-dumpn(s, n)
- char *s;
- register Node *n;
-{
- char buf[1024];
- register Arc *a;
-
- sprint(buf, "%s ", (*s == ' ')? s:"");
- Fprint(1, "%s%s@%ld: time=%ld flags=0x%x next=%ld\n",
- s, n->name, n, n->time, n->flags, n->next);
- for(a = n->prereqs; a; a = a->next)
- dumpa(buf, a);
-}
-
-static
-trace(s, a)
- char *s;
- register Arc *a;
-{
- Fprint(2, "\t%s", s);
- while(a){
- Fprint(2, " <-(%s:%d)- %s", a->r->file, a->r->line,
- a->n? a->n->name:"");
- if(a->n){
- for(a = a->n->prereqs; a; a = a->next)
- if(*a->r->recipe) break;
- } else
- a = 0;
- }
- Fputc(2, '\n');
-}
-
-static
-cyclechk(n)
- register Node *n;
-{
- register Arc *a;
-
- if((n->flags&CYCLE) && n->prereqs){
- Fprint(2, "mk: cycle in graph detected at target %s\n", n->name);
- Exit();
- }
- n->flags |= CYCLE;
- for(a = n->prereqs; a; a = a->next)
- if(a->n)
- cyclechk(a->n);
- n->flags &= ~CYCLE;
-}
-
-static
-ambiguous(n)
- register Node *n;
-{
- register Arc *a;
- register Rule *r = 0;
- Arc *la;
- int bad = 0;
-
- for(a = n->prereqs; a; a = a->next){
- if(a->n)
- ambiguous(a->n);
- if(*a->r->recipe == 0) continue;
- if(r == 0)
- r = a->r, la = a;
- else{
- if(r->recipe != a->r->recipe){
- if((r->attr&META) && !(a->r->attr&META)){
- la->flag |= TOGO;
- r = a->r, la = a;
- } else if(!(r->attr&META) && (a->r->attr&META)){
- a->flag |= TOGO;
- continue;
- }
- }
- if(r->recipe != a->r->recipe){
- if(bad == 0){
- Fprint(2, "mk: ambiguous recipes for %s:\n", n->name);
- bad = 1;
- trace(n->name, la);
- }
- trace(n->name, a);
- }
- }
- }
- if(bad)
- Exit();
- togo(n);
-}
-
-static
-attribute(n)
- register Node *n;
-{
- register Arc *a;
-
- for(a = n->prereqs; a; a = a->next){
- if(a->r->attr&VIR)
- n->flags |= VIRTUAL;
- if(a->r->attr&NOREC)
- n->flags |= NORECIPE;
- if(a->r->attr&DEL)
- n->flags |= DELETE;
- if(a->n)
- attribute(a->n);
- }
- if(n->flags&VIRTUAL)
- n->time = 0;
-}
//GO.SYSIN DD ./graph.c
echo ./job.c 1>&2
sed 's/.//' >./job.c <<'//GO.SYSIN DD ./job.c'
-#include "mk.h"
-
-Job *
-newjob(r, nlist, stem, match, pre, npre, tar, atar)
- Rule *r;
- Node *nlist;
- char *stem;
- regsubexp *match;
- Word *pre, *npre, *tar, *atar;
-{
- register Job *j;
-
- j = (Job *)Malloc(sizeof(Job));
- j->r = r;
- j->n = nlist;
- j->stem = stem;
- j->match = match;
- j->p = pre;
- j->np = npre;
- j->t = tar;
- j->at = atar;
- j->nproc = -1;
- j->fd = -1;
- j->next = 0;
- return(j);
-}
-
-dumpj(s, j, all)
- char *s;
- Job *j;
-{
- Fprint(1, "%s\n", s);
- while(j){
- Fprint(1, "job@%ld: r=%ld n=%ld stem='%s' nproc=%d\n",
- j, j->r, j->n, j->stem, j->nproc);
- Fprint(1, "\ttarget='%s' alltarget='%s' prereq='%s' nprereq='%s'\n",
- wtos(j->t), wtos(j->at), wtos(j->p), wtos(j->np));
- j = all? j->next : 0;
- }
-}
//GO.SYSIN DD ./job.c
echo ./lex.c 1>&2
sed 's/.//' >./lex.c <<'//GO.SYSIN DD ./lex.c'
-#include "mk.h"
-
-lex(fd, buf)
- char *buf;
-{
- char buf1[BIGBLOCK];
-
- quote1(fd, buf, buf1); /* '..' */
- bquote(fd, buf1, buf); /* `cmd` */
- quote2(fd, buf, buf1); /* ".." and variable expansion */
- strcpy(buf, buf1);
-}
//GO.SYSIN DD ./lex.c
echo ./main.c 1>&2
sed 's/.//' >./main.c <<'//GO.SYSIN DD ./main.c'
-#include "mk.h"
-
-#define MKFILE "mkfile"
-
-static char *version = "@(#)mk general release 3";
-int debug;
-Rule *rules, *metarules;
-int nproclimit;
-int nflag = 0;
-int tflag = 0;
-int iflag = 0;
-int kflag = 0;
-int mflag = 0;
-int aflag = 0;
-int uflag = 0;
-char *explain = 0;
-Word *target1;
-int nreps = 1;
-Job *jobs;
-char *whatif = 0;
-#ifdef PROF
-short buf[10000];
-#endif
-
-main(argc, argv)
- char **argv;
-{
- register Word *w;
- register char *s;
- char *files[256], **f = files, **ff;
- char mkargs[256], *ma = mkargs;
- int i;
- int tfd = -1;
- char *temp = "/tmp/mkargXXXXXX";
-
- *ma = 0;
- for(argv++; *argv && (**argv == '-'); argv++)
- {
- for(s = argv[0]; *s; *ma++ = *s++);
- *ma++ = ' ';
- switch(argv[0][1])
- {
- case 'a':
- aflag = 1;
- break;
- case 'd':
- if(*(s = &argv[0][2]))
- while(*s) switch(*s++)
- {
- case 'p': debug |= D_PARSE; break;
- case 'g': debug |= D_GRAPH; break;
- case 'e': debug |= D_EXEC; break;
- }
- else
- debug = 0xFFFF;
- break;
- case 'e':
- explain = &argv[0][2];
- break;
- case 'f':
- if(*++argv == 0)
- usage();
- *f++ = *argv;
- for(s = argv[0]; *s; *ma++ = *s++);
- *ma++ = ' ';
- break;
- case 'i':
- iflag = 1;
- break;
- case 'k':
- kflag = 1;
- break;
- case 'm':
- mflag = 1;
- aflag = nflag = 1;
- break;
- case 'n':
- nflag = 1;
- break;
- case 't':
- tflag = 1;
- break;
- case 'u':
- uflag = 1;
- break;
- case 'w':
- if(argv[0][2])
- whatif = &argv[0][2];
- else {
- if(*++argv == 0)
- usage();
- whatif = &argv[0][0];
- }
- break;
- default:
- usage();
- }
- }
-#ifdef PROF
- {
- extern etext();
- monitor(main, etext, buf, sizeof buf, 300);
- }
-#endif
-
- if(aflag)
- iflag = 1;
-
- account();
- syminit();
- builtins();
- initenv();
-
- /*
- assignment args become null strings
- */
- for(i = 0; argv[i]; i++) if(strchr(argv[i], '=')){
- for(s = argv[i]; *s; *ma++ = *s++);
- *ma++ = ' ';
- if(tfd < 0){
- mktemp(temp);
- close(creat(temp, 0600));
- if((tfd = open(temp, 2)) < 0){
- perror(temp);
- Exit();
- }
- }
- Fprint(tfd, "%s\n", argv[i]);
- *argv[i] = 0;
- }
- if(tfd >= 0){
- Fflush(tfd);
- lseek(tfd, 0L, 0);
- parse("command line args", tfd, 1, 1);
- unlink(temp);
- }
-
- if(ma != mkargs) ma--;
- *ma = 0;
- symlook("MKFLAGS", S_VAR, strdup(mkargs));
- for(ma = mkargs, i = 0; argv[i]; i++){
- if(*argv[i] == 0) continue;
- if(i) *ma++ = ' ';
- for(s = argv[i]; *s; *ma++ = *s++);
- }
- *ma = 0;
- symlook("MKARGS", S_VAR, strdup(mkargs));
-
- if(f == files){
- if(access(MKFILE, 4) == 0)
- parse(MKFILE, open(MKFILE, 0), 0, 1);
- } else
- for(ff = files; ff < f; ff++)
- parse(*ff, open(*ff, 0), 0, 1);
- parsebuiltins();
- if(DEBUG(D_PARSE)){
- dumpw("default targets", target1);
- dumpr("rules", rules);
- dumpr("metarules", metarules);
- dumpv("variables");
- }
- if(whatif)
- timeinit(whatif);
- execinit();
- /* skip assignment args */
- while(*argv && (**argv == 0))
- argv++;
- sigcatch();
- if(*argv == 0){
- if(target1)
- for(w = target1; w; w = w->next)
- mk(w->s);
- else {
- Fprint(2, "mk: nothing to mk\n");
- Exit();
- }
- } else
- for(; *argv; argv++)
- if(**argv)
- mk(*argv);
- if(uflag)
- praccount();
- if(mflag)
- makefile();
- exit(0);
-}
-
-usage()
-{
-
- Fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n");
- Exit();
-}
-
-char *
-Malloc(n)
-{
- register char *s;
-
- if(s = malloc(n))
- return(s);
- Fprint(2, "mk: cannot alloc %d bytes\n", n);
- Exit();
- return((char *)0); /* shut cyntax up */
-}
-
-Exit()
-{
- while(wait((int *)0) >= 0)
- ;
- exit(1);
-}
-
-char *
-strndup(s, n)
- char *s;
-{
- register char *goo;
-
- goo = Malloc(n);
- memcpy(goo, s, n);
- return(goo);
-}
-
-initenv()
-{
- extern char **environ;
- register char **p, *s, *ss;
-
- for(p = environ; *p; p++){
- s = shname(*p);
- switch(*s)
- {
- case '=':
- *s = 0;
- ss = strdup(s+1);
- symlook(strdup(*p), S_VAR, ss)->value = ss;
- *s = '=';
- break;
- case 0:
- ss = strdup("");
- symlook(strdup(*p), S_VAR, ss)->value = ss;
- break;
- }
- }
-}
-
-assert(s, n)
- char *s;
-{
- if(!n){
- Fprint(2, "mk: Assertion ``%s'' failed.\n", s);
- Exit();
- }
-}
//GO.SYSIN DD ./main.c
echo ./makefile.c 1>&2
sed 's/.//' >./makefile.c <<'//GO.SYSIN DD ./makefile.c'
-#include "mk.h"
-
-#define FOLD 65
-
-static char *first = 0;
-static didit;
-
-maketarget(s)
- char *s;
-{
- if(first == 0)
- first = s;
-}
-
-addmake(n)
- Node *n;
-{
- symlook(n->name, S_MAKEFILE, (char *)n);
-}
-
-static
-fold(s, sep)
- char *s;
-{
- int i = 0;
-
- while(*s){
- i++;
- if((*s == ' ') && (i > FOLD)){
- Fprint(1, "\\\n%c", sep);
- i = 0;
- } else
- Fputc(1, *s++);
- }
-}
-
-static void
-vd(s)
- register Symtab *s;
-{
- Fprint(1, "%s=", s->name);
- fold(symlook(s->name, S_VAR, (char *)0)->value, ' ');
- Fputc(1, '\n');
-}
-
-#define SUB(s) { register char *ss = s; while(*dest++ = *ss++); dest--; copy = 0; }
-
-static char *
-vexpand(ww, dest, j)
- char **ww, *dest;
- Job *j;
-{
- register char *s, *w = *ww;
- char carry, *q;
- int copy;
-
- assert("vexpand no $", *w == '$');
- if(*++w == '{'){
- for(s = ++w; *s != '}'; s++)
- if(*s == 0) break;
- } else
- s = shname(w);
- carry = *s;
- *s = 0;
- copy = 1;
- if(!symlook(w, S_MAKEVAR, (char *)0)){
- if(strcmp(w, "target") == 0){
- SUB("$?")
- } else if(strcmp(w, "stem") == 0){
- SUB(j->stem)
- } else if(strcmp(w, "prereq") == 0){
- SUB("$@")
- } else if(strcmp(w, "pid") == 0){
- SUB("$$$$")
- } else if(strcmp(w, "newprereq") == 0){
- SUB(wtos(j->np))
- } else if(strcmp(w, "alltarget") == 0){
- SUB(wtos(j->at))
- Fprint(2, "Warning; $alltarget expanded to '%s'\n", wtos(j->at));
- } else if((strncmp(w, "stem", 4) == 0) && (w[4] >= '0') && (w[4] <= '9')){
- int i = w[4] - '0';
- int nb = j->match[i].ep - j->match[i].sp;
-
- memcpy(dest, j->match[i].sp, nb);
- dest += nb;
- } else {
- SUB("1");
- Fprint(2, "Warning; $%s expanded to 1\n", w);
- }
- }
- if(copy){
- *dest++ = '$';
- *dest++ = '{';
- for(q = w; q != s;)
- *dest++ = *q++;
- *dest++ = '}';
- }
- *s = carry;
- if(carry == '}')
- s++;
- *ww = s;
- return(dest);
-}
-
-static
-recipepr(s, j)
- char *s;
- Job *j;
-{
- char buf[BIGBLOCK];
- register char *q = buf;
-
- while(*s)
- switch(*s)
- {
- case '\\':
- *q++ = *s++;
- *q++ = *s++;
- break;
- case '$':
- q = vexpand(&s, q, j);
- break;
- case '\n':
- *q = 0;
- Fprint(1, "\t%s\n", buf);
- q = buf;
- s++;
- break;
- default:
- *q++ = *s++;
- break;
- }
- *q = 0;
- if(q != buf)
- Fprint(1, "\t%s\n", buf);
-}
-
-static void
-nd(s)
- Symtab *s;
-{
- Job *j = (Job *)s->value;
- register Node *n = j->n;
- Arc *a;
- int i;
- char *ss, *s, c;
-
- if(strcmp(n->name, first) == 0){
- if(didit)
- return;
- didit = 1;
- }
- Fprint(1, "\n%s:", n->name);
- fold(wtos(j->p), ' ');
- Fputc(1, '\n');
- recipepr(j->r->recipe, j);
-}
-
-makefile()
-{
- symtraverse(S_MAKEVAR, vd);
- didit = 0;
- nd(symlook(first, S_MAKEFILE, (char *)0));
- symtraverse(S_MAKEFILE, nd);
-}
//GO.SYSIN DD ./makefile.c
echo ./match.c 1>&2
sed 's/.//' >./match.c <<'//GO.SYSIN DD ./match.c'
-#include "mk.h"
-
-mninlist(name, list, stem)
- register char *name, *stem;
- Word *list;
-{
- for(; list; list = list->next){
- if(match(name, list->s, stem))
- return(1);
- }
- return(0);
-}
-
-static
-isatomic(p)
- char *p;
-{
- while(*p){
- if((*p == '.') || (*p == '/'))
- return(0);
- p++;
- }
- return(1);
-}
-
-match(name, template, stem)
- char *name, *template, *stem;
-{
- register char *p, *q;
- char *b;
- char *ostem = stem;
-
- for(p = name, q = template; *p && *q && !PERCENT(*q);)
- if(*p++ != *q++) return(0);
- if(!PERCENT(*q))
- return(0);
- b = p;
- while(*p) p++;
- while(*q) q++;
- for(q--; !PERCENT(*q); q--)
- if(*--p != *q) return(0);
- while(b < p)
- *stem++ = *b++;
- *stem = 0;
- if(*q == '&')
- return(isatomic(ostem));
- return(1);
-}
-
-subst(stem, template, dest)
- register char *stem, *template, *dest;
-{
- while(*template){
- if(PERCENT(*template)){
- template++;
- while(*stem)
- *dest++ = *stem++;
- } else
- *dest++ = *template++;
- }
- *dest = 0;
-}
//GO.SYSIN DD ./match.c
echo ./mk.c 1>&2
sed 's/.//' >./mk.c <<'//GO.SYSIN DD ./mk.c'
-#include "mk.h"
-
-int runerrs;
-
-mk(target)
- char *target;
-{
- Node *node;
- int did = 0;
-
- nproc(); /* it can be updated dynamically */
- nrep(); /* it can be updated dynamically */
- runerrs = 0;
- if(mflag)
- maketarget(target);
- node = graph(target);
- if(DEBUG(D_GRAPH)){
- dumpn("new target\n", node);
- Fflush(1);
- }
- clrmade(node);
- while(node->flags&NOTMADE){
- if(work(node, (Node *)0, (Arc *)0))
- did = 1; /* found something to do */
- else {
- if(waitup(1, (int *)0) > 0){
- if(node->flags&(NOTMADE|BEINGMADE)){
- assert("must be run errors", runerrs);
- break; /* nothing more waiting */
- }
- }
- }
- }
- if(node->flags&BEINGMADE)
- waitup(-1, (int *)0);
- while(jobs)
- waitup(-2, (int *)0);
- assert("target didn't get done", runerrs || (node->flags&MADE));
- if(did == 0)
- Fprint(1, "mk: '%s' is up to date\n", node->name);
-}
-
-clrmade(n)
- register Node *n;
-{
- register Arc *a;
-
- n->flags &= ~(CANPRETEND|PRETENDING);
- n->flags |= CANPRETEND;
- MADESET(n, NOTMADE);
- for(a = n->prereqs; a; a = a->next)
- if(a->n)
- clrmade(a->n);
-}
-
-static void
-unpretend(n)
- register Node *n;
-{
- MADESET(n, NOTMADE);
- n->flags &= ~(CANPRETEND|PRETENDING);
- n->time = 0;
-}
-
-work(node, p, parc)
- Node *node, *p;
- Arc *parc;
-{
- register Arc *a, *ra;
- int weoutofdate;
- int ready;
- int did = 0;
-
-/* print("work(%s) flags=0x%x time=%ld\n", node->name, node->flags, node->time);/**/
- if(node->flags&BEINGMADE)
- return(did);
- if((node->flags&MADE) && (node->flags&PRETENDING) && p && outofdate(p, parc, 0)){
- if(explain)
- fprint(1, "unpretending %s(%ld) because %s is out of date(%ld)\n",
- node->name, node->time, p->name, p->time);
- unpretend(node);
- }
- /*
- have a look if we are pretending in case
- someone has been unpretended out from underneath us
- */
- if(node->flags&MADE){
- if(node->flags&PRETENDING){
- node->time = 0;
- }else
- return(did);
- }
- /* consider no prerequsite case */
- if(node->prereqs == 0){
- if(node->time == 0){
- Fprint(2, "mk: don't know how to make '%s'\n", node->name);
- if(kflag){
- node->flags |= BEINGMADE;
- runerrs++;
- } else
- Exit();
- } else
- MADESET(node, MADE);
- return(did);
- }
- /*
- now see if we are out of date or what
- */
- ready = 1;
- weoutofdate = aflag;
- ra = 0;
- for(a = node->prereqs; a; a = a->next)
- if(a->n){
- did = work(a->n, node, a) || did;
- if(a->n->flags&(NOTMADE|BEINGMADE))
- ready = 0;
- if(outofdate(node, a, 0)){
- weoutofdate = 1;
- if((ra == 0) || (ra->n == 0)
- || (ra->n->time < a->n->time))
- ra = a;
- }
- } else {
- if(node->time == 0){
- if(ra == 0)
- ra = a;
- weoutofdate = 1;
- }
- }
- if(ready == 0) /* can't do anything now */
- return(did);
- if(weoutofdate == 0){
- MADESET(node, MADE);
- return(did);
- }
- /*
- can we pretend to be made?
- */
- if((iflag == 0) && (node->time == 0) && (node->flags&(PRETENDING|CANPRETEND)) && p && ra->n && !outofdate(p, ra, 0)){
- node->flags &= ~CANPRETEND;
- MADESET(node, MADE);
- node->time = ra->n->time;
- if(explain && ((node->flags&PRETENDING) == 0))
- fprint(1, "pretending %s has time %ld\n", node->name, node->time);
- node->flags |= PRETENDING;
- return(did);
- }
- /*
- node is out of date and we REALLY do have to do something.
- quickly rescan for pretenders
- */
- for(a = node->prereqs; a; a = a->next)
- if(a->n && (a->n->flags&PRETENDING)){
- if(explain)
- Fprint(1, "unpretending %s because of %s because of %s\n",
- a->n->name, node->name, ra->n? ra->n->name : "rule with no prerequisites");
-
- unpretend(a->n);
- did = work(a->n, node, a) || did;
- ready = 0;
- }
- if(ready == 0) /* try later unless nothing has happened for -k's sake */
- return(did || work(node, p, parc));
- did = dorecipe(node) || did;
- return(did);
-}
-
-update(fake, node)
- register Node *node;
-{
- register Arc *a;
-
- MADESET(node, fake? BEINGMADE : MADE);
- if(((node->flags&VIRTUAL) == 0) && (access(node->name, 0) == 0)){
- node->time = timeof(node->name, 1);
- node->flags &= ~(CANPRETEND|PRETENDING);
- for(a = node->prereqs; a; a = a->next)
- if(a->prog)
- (void)outofdate(node, a, 1);
- } else {
- node->time = 1;
- for(a = node->prereqs; a; a = a->next)
- if(a->n && outofdate(node, a, 1))
- node->time = a->n->time;
- }
-/* print("----node %s time=%ld flags=0x%x\n", node->name, node->time, node->flags);/**/
-}
-
-static
-pcmp(prog, n1, n2)
- char *prog, *n1, *n2;
-{
- char buf[3*NAMEBLOCK];
- int ret, pid;
-
- pid = fork();
- if(pid < 0){
- fprint(2, "mk: ");
- perror("pcmp fork");
- Exit();
- }
- Fexit(0);
- if(pid == 0){
- sprint(buf, "%s '%s' '%s'", prog, n1, n2);
- execl(SHELL, "sh", "-c", buf, (char *)0);
- sprint(buf, "exec %s", SHELL);
- perror(buf);
- _exit(1);
- } else {
- while(waitup(-3, &pid) >= 0)
- ;
- return(pid? 2:1);
- }
-}
-
-
-outofdate(node, arc, eval)
- register Node *node;
- register Arc *arc;
-{
- char buf[3*NAMEBLOCK], *str;
- Symtab *sym;
- int ret;
-
- if(arc->prog){
- sprint(buf, "%s%c%s", node->name, 0377, arc->n->name);
- if(!(sym = symlook(buf, S_OUTOFDATE, (char *)0)) || eval){
- if(!sym)
- str = strdup(buf);
- ret = pcmp(arc->prog, node->name, arc->n->name);
- if(sym)
- sym->value = (char *)ret;
- else
- symlook(str, S_OUTOFDATE, (char *)ret);
- } else
- ret = (int)sym->value;
- return(ret-1);
- } else
- return(node->time < arc->n->time);
-}
-
//GO.SYSIN DD ./mk.c
echo ./mk.h 1>&2
sed 's/.//' >./mk.h <<'//GO.SYSIN DD ./mk.h'
-#include "libc.h"
-#include "fio.h"
-#include "regexp.h"
-
-typedef struct Word
-{
- char *s;
- struct Word *next;
-} Word;
-extern Word *newword(), *expand(), *wsubst(), *stow();
-
-typedef struct Rule
-{
- char *target; /* one target */
- Word *tail; /* constituents of targets */
- char *recipe; /* do it ! */
- short attr; /* attributes */
- short line; /* source line */
- char *file; /* source file */
- Word *alltargets; /* all the targets */
- int rule; /* rule number */
- regexp *pat; /* reg exp goo */
- char *prog; /* to use in out of date */
- struct Rule *chain; /* hashed per target */
- struct Rule *next;
-} Rule;
-extern Rule *rules, *metarules, *patrule;
-
-#define META 0x0001
-#define SEQ 0x0002
-#define UPD 0x0004
-#define RED 0x0008
-#define QUIET 0x0010
-#define VIR 0x0020
-#define REGEXP 0x0040
-#define NOREC 0x0080
-#define DEL 0x0100
-
-#define NREGEXP 10
-
-typedef struct Arc
-{
- short flag;
- struct Node *n;
- Rule *r;
- char *stem;
- char *prog;
- regsubexp match[NREGEXP];
- struct Arc *next;
-} Arc;
-extern Arc *newarc();
-#define TOGO 1
-
-typedef struct Node
-{
- char *name;
- long time;
- unsigned short flags;
- Arc *prereqs;
- struct Node *next; /* list for a rule */
-} Node;
-extern Node *graph();
-#define VIRTUAL 0x0001
-#define CYCLE 0x0002
-#define READY 0x0004
-#define CANPRETEND 0x0008
-#define PRETENDING 0x0010
-#define NOTMADE 0x0020
-#define BEINGMADE 0x0040
-#define MADE 0x0080
-#define MADESET(n,m) n->flags = (n->flags&~(NOTMADE|BEINGMADE|MADE))|(m)
-#define PROBABLE 0x0100
-#define VACUOUS 0x0200
-#define NORECIPE 0x0400
-#define DELETE 0x0800
-
-typedef struct Job
-{
- Rule *r; /* master rule for job */
- Node *n; /* list of node targets */
- char *stem;
- regsubexp *match;
- Word *p; /* prerequisites */
- Word *np; /* new prerequisites */
- Word *t; /* targets */
- Word *at; /* all targets */
- int nproc; /* slot number */
- int fd; /* if redirecting */
- struct Job *next;
-} Job;
-extern Job *newjob(), *jobs;
-
-typedef struct Symtab
-{
- short space;
- char *name;
- char *value;
- struct Symtab *next;
-} Symtab;
-extern Symtab *symlook();
-enum {
- S_VAR, /* variable -> value */
- S_TARGET, /* target -> rule */
- S_TIME, /* file -> time */
- S_PID, /* pid -> products */
- S_NODE, /* target name -> node */
- S_AGG, /* aggregate -> time */
- S_BITCH, /* bitched about aggregate not there */
- S_NOEXPORT, /* var -> noexport */
- S_OVERRIDE, /* can't override */
- S_OUTOFDATE, /* n1\377n2 -> 2(outofdate) or 1(not outofdate) */
- S_MAKEFILE, /* target -> node */
- S_MAKEVAR, /* dumpable mk variable */
-};
-
-extern int debug;
-extern int nflag, tflag, iflag, kflag, aflag, mflag;
-extern int inline;
-extern char *infile;
-extern char *Malloc(), *strndup();
-extern long timeof();
-extern void touch(), delete();
-extern char *shname(), *vexpand();
-extern int nproclimit;
-extern int nreps;
-extern char *explain;
-extern char *envpr(), *wtos();
-extern char *rulecnt();
-
-#define SYNERR(l) (Fprint(2, "mk: %s:%d: syntax error; ", infile, (((l)>=0)?(l):inline)))
-#define RERR(r) (Fprint(2, "mk: %s:%d: rule error; ", (r)->file, (r)->line))
-#define NAMEBLOCK 1000
-#define BIGBLOCK 20000
-
-#ifndef SHELL
-#define SHELL "/bin/sh" /* should be bourne-like */
-#endif
-
-#define SEP(c) (((c)==' ')||((c)=='\t')||((c)=='\n'))
-
-#define DEBUG(x) (debug&(x))
-#define D_PARSE 0x01
-#define D_GRAPH 0x02
-#define D_EXEC 0x04
-
-#define EBIT 0x80 /* sorry japan */
-
-#define PERCENT(ch) (((ch) == '%') || ((ch) == '&'))
//GO.SYSIN DD ./mk.h
echo ./parse.c 1>&2
sed 's/.//' >./parse.c <<'//GO.SYSIN DD ./parse.c'
-#include "mk.h"
-
-char *infile;
-int inline;
-static longline();
-extern Word *target1;
-
-parse(f, fd, varoverride, ruleoverride)
- char *f;
-{
- int hline;
- char *s, *body;
- Word *head, *tail;
- int attr, set;
- char *prog, *inc;
-
- if(fd < 0){
- perror(f);
- Exit();
- }
- ipush();
- infile = strdup(f);
- inline = 1;
- Finit(fd, (char *)0);
- while(s = Frdline(fd)){
- if((*s == '#') || (*s == 0)){
- inline++;
- continue;
- }
- hline = inline;
- switch(rhead(s, fd, &head, &tail, &attr, &prog))
- {
- case '<':
- if((tail == 0) || ((inc = wtos(tail)) == 0)){
- SYNERR(-1);
- Fprint(2, "missing include file name\n");
- Exit();
- }
- parse(inc, open(inc, 0), 0, 1);
- break;
- case ':':
- rbody(fd, &body);
- addrules(head, tail, body, attr, hline, ruleoverride, prog);
- break;
- case '=':
- if(head->next){
- SYNERR(-1);
- Fprint(2, "multiple vars on left side of assignment\n");
- Exit();
- }
- if(symlook(head->s, S_OVERRIDE, (char *)0)){
- set = varoverride;
- symdel(head->s, S_OVERRIDE);
- } else {
- set = 1;
- if(varoverride)
- symlook(head->s, S_OVERRIDE, "");
- }
- if(set)
- setvar(head->s, wtos(tail));
- if(attr)
- (void)symlook(head->s, S_NOEXPORT, "");
- break;
- default:
- SYNERR(hline);
- Fprint(2, "expected : or =\n");
- Exit();
- break;
- }
- }
- close(fd);
- ipop();
-}
-
-addrules(head, tail, body, attr, hline, override, prog)
- Word *head, *tail;
- char *body, *prog;
-{
- register Word *w;
-
- assert("addrules args", head && body);
- if((target1 == 0) && !(attr®EXP))
- frule(head);
- for(w = head; w; w = w->next)
- addrule(w->s, tail, body, head, attr, hline, override, prog);
-}
-
-rhead(s, fd, h, t, attr, prog)
- char *s;
- Word **h, **t;
- int *attr;
- char **prog;
-{
- char buf[BIGBLOCK];
- register char *p;
- char *pp;
- int sep;
-
- longline(fd, s, buf); /* cover \\n guys */
- lex(fd, buf);
- if(p = strchr(buf, '#')) /* comment ? */
- *p = 0;
- for(p = buf; *p; p++)
- if((*p == ':') || (*p == '=') || (*p == '<')) break;
- if(*p == 0){
- return('?');
- }
- sep = *p;
- *p++ = 0;
- *attr = 0;
- *prog = 0;
- if(sep == '='){
- char *le, *e;
-
- le = strchr(p, ' ');
- if(e = strchr(p, '\t'))
- if((le == 0) || (e < le))
- le = e;
- if((e = strchr(p, '=')) && ((le == 0) || (e < le))){
- while(*p != '='){
- switch(*p++)
- {
- case 0:
- SYNERR(-1);
- Fprint(2, "missing trailing =\n");
- Exit();
- default:
- SYNERR(-1);
- Fprint(2, "unknown attribute '%c'\n", p[-1]);
- Exit();
- case 'U':
- *attr = 1;
- break;
- }
- }
- p++;
- }
- }
- if((sep == ':') && *p && (*p != ' ') && (*p != '\t')){
- while(*p != ':')
- switch(*p++)
- {
- case 0:
- eos:
- SYNERR(-1);
- Fprint(2, "missing trailing :\n");
- Exit();
- default:
- SYNERR(-1);
- Fprint(2, "unknown attribute '%c'\n", p[-1]);
- Exit();
- case '<':
- *attr |= RED;
- break;
- case 'D':
- *attr |= DEL;
- break;
- case 'N':
- *attr |= NOREC;
- break;
- case 'P':
- pp = p;
- while(*p && (*p != ':'))
- p++;
- if(*p == 0)
- goto eos;
- *p = 0;
- *prog = strdup(pp);
- *p = ':';
- break;
- case 'Q':
- *attr |= QUIET;
- break;
- case 'R':
- *attr |= REGEXP;
- break;
- case 'U':
- *attr |= UPD;
- break;
- case 'V':
- *attr |= VIR;
- break;
- }
- p++;
- }
- *h = expand(buf);
- if((*h == 0) && (sep != '<')){
- SYNERR(inline-1);
- Fprint(2, "no var on left side of assignment/rule\n");
- Exit();
- }
- while((*p == ' ') || (*p == '\t'))
- p++;
- *t = expand(p);
- return(sep);
-}
-
-rbody(fd, b)
- char **b;
-{
- char buf[BIGBLOCK];
- char *cp, *s;
- register n;
-
- cp = buf;
- while(s = Frdline(fd)){
- inline++;
- if((*s != '\t') && (*s != ' ')){
- inline--;
- Fundo(fd);
- break;
- }
- memcpy(cp, s+1, n = FIOLINELEN(fd)-1);
- cp += n;
- *cp++ = '\n';
- }
- *cp++ = 0;
- assert("rbody overflow", cp <= &buf[BIGBLOCK]);
- *b = (buf[0])? strndup(buf, (int)(cp-buf)) : strdup("");
-}
-
-static
-longline(fd, line, dest)
- register char *line, *dest;
-{
- for(;;){
- inline++;
- while(*dest++ = *line++);
- dest -= 2;
- if(*dest == '\\'){
- *dest = 0;
- if((line = Frdline(fd)) == 0){
- Fundo(fd);
- break;
- }
- } else
- break;
- }
-}
-
-struct input
-{
- char *file;
- int line;
- struct input *next;
-};
-static struct input *inputs = 0;
-
-ipush()
-{
- register struct input *in, *me;
-
- me = (struct input *)Malloc(sizeof(*me));
- me->file = infile;
- me->line = inline;
- me->next = 0;
- if(inputs == 0)
- inputs = me;
- else {
- for(in = inputs; in->next; )
- in = in->next;
- in->next = me;
- }
-}
-
-ipop()
-{
- register struct input *in, *me;
-
- assert("pop input list", inputs != 0);
- if(inputs->next == 0){
- me = inputs;
- inputs = 0;
- } else {
- for(in = inputs; in->next->next; )
- in = in->next;
- me = in->next;
- in->next = 0;
- }
- infile = me->file;
- inline = me->line;
- free((char *)me);
-}
//GO.SYSIN DD ./parse.c
echo ./quote.c 1>&2
sed 's/.//' >./quote.c <<'//GO.SYSIN DD ./quote.c'
-#include "mk.h"
-
-/*
- quoted stuff gets EBIT
-*/
-
-static
-squote(fd, srcp, destp)
- char **srcp, **destp;
-{
- register char *src = *srcp, *dest = *destp;
-
- while(*src != '\''){
- if(*src == 0){
- char *s;
-
- if(s = Frdline(fd)){
- inline++;
- *dest++ = '\n'|EBIT;
- strcpy(src, s);
- continue;
- } else {
- SYNERR(-1); Fprint(2, "missing closing '\n");
- break;
- }
- }
- *dest++ = *src++|EBIT;
- }
- *dest = 0;
- if(*src)
- src++;
- *srcp = src;
- *destp = dest;
-}
-
-static
-dquote(fd, src, dest)
- char **src, **dest;
-{
- char *p = *src, *s = *dest;
- char *t, carry;
- Symtab *sym;
-
- while(*p != '"'){
- switch(*p)
- {
- case 0:
- if(t = Frdline(fd)){
- inline++;
- *s++ = '\n'|EBIT;
- strcpy(p, t);
- continue;
- } else {
- SYNERR(-1); Fprint(2, "missing closing \"\n");
- break;
- }
- break;
- case '\\':
- switch(*++p)
- {
- default:
- *s++ = '\\'|EBIT;
- case '\\': case '"':
- case '\'': case '$':
- *s++ = *p|EBIT;
- }
- p++;
- break;
- case '$':
- varsub(&p, &s, EBIT);
- break;
- default:
- *s++ = *p++|EBIT;
- }
- }
- *s = 0;
- if(*p)
- p++;
- *src = p;
- *dest = s;
-}
-
-quote1(fd, src, dest)
- char *src, *dest;
-{
- char *t;
-
- while(*src){
- switch(*src)
- {
- case '\'':
- src++;
- squote(fd, &src, &dest);
- break;
- case '\\':
- if(src[1]){
- *dest++ = *++src | EBIT;
- src++;
- } else if(t = Frdline(fd)){
- inline++;
- strcpy(src, t);
- }
- break;
- default:
- *dest++ = *src++;
- }
- }
- *dest = 0;
-}
-
-quote2(fd, src, dest)
- char *src, *dest;
-{
- char *t;
-
- while(*src){
- switch(*src)
- {
- case '"':
- src++;
- dquote(fd, &src, &dest);
- break;
- case '\\':
- if(src[1]){
- *dest++ = *++src;
- src++;
- } else if(t = Frdline(fd)){
- inline++;
- strcpy(src, t);
- }
- break;
- case '$':
- varsub(&src, &dest, 0);
- break;
- default:
- *dest++ = *src++;
- }
- }
- *dest = 0;
-}
-
-static char *
-subsub(val, ext, dest, bit)
- char *val, *ext, *dest;
-{
- register char *s;
- char *a, *b, *c, *d;
- int na, nb, nc, nd, n;
- int destsub = 0;
-
- /* prepare literals */
- a = s = ext;
- for(; *s && (*s != '=') && !PERCENT(*s); s++)
- ;
- na = s-a;
- if(PERCENT(*s)) s++;
- b = s;
- for(; *s && (*s != '='); s++)
- ;
- nb = s-b;
- if(*s == '=') s++;
- c = s;
- for(; *s && !PERCENT(*s); s++)
- ;
- nc = s-c;
- if(PERCENT(*s)) s++, destsub = 1;
- d = s;
- for(; *s; s++)
- ;
- nd = s-d;
- /* break into words, do sub */
- while(*val){
- for(s = val; *s && !SEP(*s); s++)
- ;
- /* substitute in val..s */
- if((memcmp(val, a, na) == 0) && (memcmp(s-nb, b, nb) == 0)){
-#define DEST(s,n) if(n) memcpy(dest,s,n), dest += n
- DEST(c, nc);
- n = (s-nb) - (val+na);
- if(destsub)
- DEST(val+na, n);
- DEST(d, nd);
- } else
- while(val < s)
- *dest++ = (*val++&~EBIT)|bit;
- /* clean up */
- while(*s && SEP(*s))
- *dest++ = (*s++&~EBIT)|bit;
- val = s;
- }
- return(dest);
-}
-
-varsub(psrc, pdest, bit)
- char **psrc, **pdest;
-{
- char *t, carry;
- Symtab *sym;
- char *src = *psrc, *dest = *pdest;
- char *v = 0, vc;
-
- if(*++src == '{'){
- for(t = ++src; *src != '}'; src++)
- if(*src == 0){
- SYNERR(-1);
- Fprint(2, "missing '}'\n");
- Exit();
- }
- v = shname(t);
- if(src == v)
- v = 0;
- else {
- if(*v != ':'){
- SYNERR(-1);
- Fprint(2, "bad variable name\n");
- Exit();
- }
- vc = *v;
- *v = 0;
- }
- *src++ = carry = 0;
- } else {
- src = shname(t = src);
- carry = *src;
- *src = 0;
- }
- if(sym = symlook(t, S_VAR, (char *)0)){
- if(v){
-char buf[BIGBLOCK]; strcpy(buf, v+1); lex(-1, buf);
- dest = subsub(sym->value, buf, dest, bit);
- *v = vc;
- } else
- for(t = sym->value; *t; )
- *dest++ = *t++|bit;
- }
- if(carry)
- *src = carry;
- *psrc = src;
- *pdest = dest;
-}
//GO.SYSIN DD ./quote.c
echo ./recipe.c 1>&2
sed 's/.//' >./recipe.c <<'//GO.SYSIN DD ./recipe.c'
-#include "mk.h"
-
-dorecipe(node)
- Node *node;
-{
- char buf[BIGBLOCK];
- register Node *n;
- Rule *r = 0;
- Arc *a, *aa;
- Word head, ahead, lp, ln, *w, *ww, *aw;
- Symtab *s;
- int did = 0;
- regexp rmatch[NREGEXP];
-
- /*
- pick up the rule
- */
- for(a = node->prereqs; a; a = a->next)
- if(*a->r->recipe)
- r = (aa = a)->r;
- /*
- no recipe? go to buggery!
- */
- if(r == 0){
- if(!(node->flags&VIRTUAL) && !(node->flags&NORECIPE)){
- Fprint(2, "mk: no recipe to make '%s'\n", node->name);
- Exit();
- }
- update(0, node);
- if(tflag){
- if(!(node->flags&VIRTUAL))
- touch(node->name);
- else if(explain)
- Fprint(1, "no touch of virtual '%s'\n", node->name);
- }
- return(did);
- }
- /*
- build the node list
- */
- node->next = 0;
- head.next = 0;
- ww = &head;
- ahead.next = 0;
- aw = &ahead;
- if(r->attr®EXP){
- ww->next = newword(node->name);
- aw->next = newword(node->name);
- } else {
- for(w = r->alltargets; w; w = w->next){
- if(r->attr&META)
- subst(aa->stem, w->s, buf);
- else
- strcpy(buf, w->s);
- aw->next = newword(buf);
- aw = aw->next;
- if((s = symlook(buf, S_NODE, (char *)0)) == 0)
- continue; /* not a node we are interested in */
- n = (Node *)s->value;
- ww->next = newword(buf);
- ww = ww->next;
- if(n == node) continue;
- n->next = node->next;
- node->next = n;
- }
- }
- for(n = node; n; n = n->next)
- if((n->flags&READY) == 0)
- return(did);
- /*
- gather the params for the job
- */
- lp.next = ln.next = 0;
- for(n = node; n; n = n->next){
- for(a = n->prereqs; a; a = a->next){
- if(a->n){
- addw(&lp, a->n->name);
- if(outofdate(n, a, 0)){
- addw(&ln, a->n->name);
- if(explain)
- fprint(1, "%s(%ld) < %s(%ld)\n",
- n->name, n->time, a->n->name, a->n->time);
- }
- } else {
- if(explain)
- fprint(1, "%s has no prerequisites\n",
- n->name);
- }
- }
- MADESET(n, BEINGMADE);
- }
-/* print("lt=%s ln=%s lp=%s\n",wtos(head.next),wtos(ln.next),wtos(lp.next));/**/
- run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.next, ahead.next));
- return(1);
-}
-
-addw(w, s)
- register Word *w;
- char *s;
-{
- register Word *lw;
-
- for(lw = w; w = w->next; lw = w){
- if(strcmp(s, w->s) == 0)
- return;
- }
- lw->next = newword(s);
-}
//GO.SYSIN DD ./recipe.c
echo ./regexp.c 1>&2
sed 's/.//' >./regexp.c <<'//GO.SYSIN DD ./regexp.c'
-#include "mk.h"
-
-Rule *patrule;
-
-regerror(s)
- char *s;
-{
- if(patrule)
- Fprint(2, "mk: %s:%d: regular expression error; %s\n",
- patrule->file, patrule->line, s);
- else
- Fprint(2, "mk: %s:%d: regular expression error; %s\n",
- infile, inline, s);
- Exit();
-}
-
-rsub(src, r, a, proto, dest)
- char *src, *dest, *proto;
- Rule *r;
- Arc *a;
-{
- rdump("rsub", a->match);
- print("rsub(src=%d '%s' proto=%d '%s')\n", src, src, proto, proto);
- *dest = 0;
-}
-
-rdump(s, m)
- char *s;
- register regsubexp *m;
-{
- register i;
-
- print("rdump: %s\n", s);
- for(i = 0; i < NREGEXP; i++, m++)
- print("\t%d: %d - %d '%s'\n", i, m->sp, m->ep, m->sp);
-}
//GO.SYSIN DD ./regexp.c
echo ./rule.c 1>&2
sed 's/.//' >./rule.c <<'//GO.SYSIN DD ./rule.c'
-#include "mk.h"
-
-static Rule *lr, *lmr;
-static rcmp();
-static int nrules = 0;
-
-addrule(head, tail, body, ahead, attr, hline, override, prog)
- Word *tail, *ahead;
- char *head, *body, *prog;
-{
- register Rule *r;
- Rule *rr;
- Symtab *sym;
- int reuse;
-
- if(sym = symlook(head, S_TARGET, (char *)0)){
- for(r = (Rule *)sym->value; r; r = r->chain)
- if(rcmp(r, head, tail) == 0) break;
- if(r && !override)
- return;
- } else
- r = 0;
- reuse = r != 0;
- if(r == 0)
- r = (Rule *)Malloc(sizeof(Rule));
- r->target = head;
- r->tail = tail;
- r->recipe = body;
- r->line = hline;
- r->file = infile;
- r->attr = attr;
- r->alltargets = ahead;
- r->prog = prog;
- r->rule = nrules++;
- if(!reuse){
- rr = (Rule *)symlook(head, S_TARGET, (char *)r)->value;
- if(rr != r){
- r->chain = rr->chain;
- rr->chain = r;
- } else
- r->chain = 0;
- }
- if(strchr(head, '%') || strchr(head, '&') || (attr®EXP))
- goto meta;
- if(reuse)
- return;
- r->next = 0;
- r->pat = 0;
- if(rules == 0)
- rules = lr = r;
- else {
- lr->next = r;
- lr = r;
- }
- return;
-meta:
- r->attr |= META;
- if(reuse)
- return;
- r->next = 0;
- if(r->attr®EXP){
- patrule = r;
- r->pat = regcomp(head);
- }
- if(metarules == 0)
- metarules = lmr = r;
- else {
- lmr->next = r;
- lmr = r;
- }
-}
-
-dumpr(s, r)
- char *s;
- register Rule *r;
-{
- Fprint(1, "%s: start=%ld\n", s, r);
- for(; r; r = r->next){
- Fprint(1, "\tRule %ld: %s[%d] attr=%x next=%ld chain=%ld alltarget='%s'",
- r, r->file, r->line, r->attr, r->next, r->chain, wtos(r->alltargets));
- if(r->prog)
- Fprint(1, " prog='%s'", r->prog);
- Fprint(1, "\n\ttarget=%s: %s\n", r->target, wtos(r->tail));
- Fprint(1, "\trecipe@%ld='%s'\n", r->recipe, r->recipe);
- }
-}
-
-frule(w)
- Word *w;
-{
- extern Word *target1;
- register Word *ww;
- register char *s;
-
-#define ADD(s) {if(target1==0)target1=ww=newword(s);else ww=ww->next=newword(s);}
-
- for(ww = w; ww; ww = ww->next)
- if(strchr(w->s, '%') || strchr(w->s, '&'))
- return; /* no metarule targets */
- while(w){
- if(s = strchr(w->s, '+')){
- *s++ = 0;
- if(*w->s)
- ADD(w->s);
- if(*s)
- ADD(s);
- s[-1] = '+';
- } else
- ADD(w->s);
- w = w->next;
- }
-}
-
-static
-rcmp(r, target, tail)
- register Rule *r;
- char *target;
- register Word *tail;
-{
- register Word *w;
-
- if(strcmp(r->target, target))
- return(1);
- for(w = r->tail; w && tail; w = w->next, tail = tail->next)
- if(strcmp(w->s, tail->s))
- return(1);
- return(w || tail);
-}
-
-char *
-rulecnt()
-{
- register char *s;
-
- s = Malloc(nrules);
- memset(s, 0, nrules);
- return(s);
-}
-
-ismeta(s)
- register char *s;
-{
- for(; *s; s++)
- switch(*s)
- {
- case '\\':
- if(s[1])
- s++;
- break;
- case '[':
- case '*':
- case '?':
- return(1);
- break;
- }
- return(0);
-}
//GO.SYSIN DD ./rule.c
echo ./run.c 1>&2
sed 's/.//' >./run.c <<'//GO.SYSIN DD ./run.c'
-#include "mk.h"
-
-typedef struct Event
-{
- int pid;
- Job *job;
-} Event;
-static Event *events;
-static int nevents, nrunning;
-typedef struct Process
-{
- int pid;
- int status;
- struct Process *b, *f;
-} Process;
-static Process *phead, *pfree;
-static void pnew(), pdelete();
-static char *envy[1024];
-static char **special;
-static pidslot();
-
-run(j)
- Job *j;
-{
- register Job *jj;
-
- if(jobs){
- for(jj = jobs; jj->next; jj = jj->next)
- ;
- jj->next = j;
- } else
- jobs = j;
- j->next = 0;
- /* this code also in waitup after parse redirect */
- if(nrunning < nproclimit)
- sched();
-}
-
-sched()
-{
- register Job *j;
- char buf[BIGBLOCK];
- int slot, pip[2], pid;
- Node *n;
-
- if(jobs == 0){
- account();
- return;
- }
- j = jobs;
- jobs = j->next;
- if(DEBUG(D_EXEC))
- fprint(1, "firing up job for target %s\n", wtos(j->t));
- slot = nextslot();
- events[slot].job = j;
- dovars(j, slot);
- shprint(j->r->recipe, envy, buf);
- if(!tflag && !mflag && (nflag || !(j->r->attr&QUIET)))
- Fwrite(1, buf, (long)strlen(buf));
- if(mflag){
- for(n = j->n; n; n = n->next)
- symlook(n->name, S_MAKEFILE, (char *)j);
- }
- if(nflag||tflag){
- for(n = j->n; n; n = n->next){
- if(tflag){
- if(!(n->flags&VIRTUAL))
- touch(n->name);
- else if(explain)
- Fprint(1, "no touch of virtual '%s'\n", n->name);
- }
- n->time = time((long *)0);
- MADESET(n, MADE);
- }
- } else {
- Fexit(0);
- if(j->r->attr&RED){
- if(pipe(pip) < 0){
- perror("pipe");
- Exit();
- }
- }
- if((pid = fork()) < 0){
- perror("mk fork");
- Exit();
- }
- if(pid == 0){
- if(j->r->attr&RED){
- close(pip[0]);
- dup2(pip[1], 1);
- close(pip[1]);
- }
- if(pipe(pip) < 0){
- perror("pipe-i");
- Exit();
- }
- if((pid = fork()) < 0){
- perror("mk fork");
- Exit();
- }
- if(pid != 0){
- close(pip[1]);
- dup2(pip[0], 0);
- close(pip[0]);
- execle(SHELL, "sh", "-e", (char *)0, envy);
- perror(SHELL);
- _exit(1);
- } else {
- int k;
- char *s, *send;
-
- close(pip[0]);
- s = j->r->recipe;
- send = s+strlen(s);
- while(s < send){
- if((k = write(pip[1], s, send-s)) < 0)
- break;
- s += k;
- }
- _exit(0);
- }
- }
- account();
- nrunning++;
- if(j->r->attr&RED)
- close(pip[1]), j->fd = pip[0];
- else
- j->fd = -1;
- if(DEBUG(D_EXEC))
- fprint(1, "pid for target %s = %d\n", wtos(j->t), pid);
- events[slot].pid = pid;
- }
-}
-
-waitup(echildok, retstatus)
- int *retstatus;
-{
- int status, pid;
- int slot;
- Symtab *s;
- Word *w;
- Job *j;
- char buf[64];
- char buf1[BIGBLOCK];
- int uarg = 0;
- int done;
- Node *n;
- Process *p;
- extern int errno, runerrs;
-
- /* first check against the proces slist */
- if(retstatus)
- for(p = phead; p; p = p->f)
- if(p->pid == *retstatus){
- *retstatus = p->status;
- pdelete(p);
- return(-1);
- }
-again: /* rogue processes */
- if((pid = wait(&status)) < 0){
- if(echildok > 0){
- return(1);
- } else {
- fprint(2, "mk: (waitup %d) ", echildok);
- perror("mk wait");
- Exit();
- }
- }
- if(DEBUG(D_EXEC))
- fprint(1, "waitup got pid=%d, status=0x%ux\n", pid, status);
- if(retstatus && (pid == *retstatus)){
- *retstatus = status;
- return(-1);
- }
- slot = pidslot(pid);
- if(slot < 0){
- if(DEBUG(D_EXEC))
- fprint(2, "mk: wait returned unexpected process %d\n", pid);
- pnew(pid, status);
- goto again;
- }
- j = events[slot].job;
- account();
- nrunning--;
- events[slot].pid = -1;
- if(status){
- dovars(j, slot);
- shprint(j->r->recipe, envy, buf1);
- front(buf1);
- Fprint(2, "mk: %s: exit status=%d", buf1, 0xFF&(status>>8));
- status &= 0xFF;
- if(status&0x7F)
- Fprint(2, " signal=%d", status&0x7F);
- if(status&0x80)
- Fprint(2, ", core dumped");
- for(n = j->n, done = 0; n; n = n->next)
- if(n->flags&DELETE){
- if(done++ == 0)
- Fprint(2, ", deleting");
- Fprint(2, " '%s'", n->name);
- }
- Fputc(2, '\n');
- for(n = j->n, done = 0; n; n = n->next)
- if(n->flags&DELETE){
- if(done++ == 0)
- Fflush(2);
- delete(n->name);
- }
- if(kflag){
- runerrs++;
- uarg = 1;
- Fflush(2);
- } else {
- jobs = 0;
- Exit();
- }
- }
- if(j->fd >= 0){
- sprint(buf, "process %d", pid);
- parse(buf, j->fd, 0, 0);
- execinit(); /* reread environ */
- nproc();
- while(jobs && (nrunning < nproclimit))
- sched();
- }
- for(w = j->t; w; w = w->next){
- if((s = symlook(w->s, S_NODE, (char *)0)) == 0)
- continue; /* not interested in this node */
- update(uarg, (Node *)s->value);
- }
- if(nrunning < nproclimit)
- sched();
- return(0);
-}
-
-execinit()
-{
- extern char **environ;
- extern char **vardump();
- register char *s, *ss, c;
- Symtab *st;
-
- environ = envy;
- special = vardump(envy);
- if(st = symlook("ENVIRON", S_VAR, (char *)0))
- for(s = st->value; *s;){
- for(ss = s; *ss && (*ss != 1); ss++);
- c = *ss;
- *ss = 0;
- *special++ = strdup(s);
- s = ss;
- if(*ss = c)
- s++;
- }
- *special = 0;
-}
-
-char *myenv[] =
-{
- "target", "stem", "prereq", "pid", "nproc", "newprereq",
- "alltarget",
- "stem1", "stem2", "stem3", "stem4", "stem5", "stem6",
- "stem7", "stem8", "stem9", "stem0", 0
-};
-
-dovars(j, slot)
- register Job *j;
-{
- char buf[BIGBLOCK];
- char *s, *t;
- int i, n = 0;
-
-#define SPECIAL ((sizeof myenv)/(sizeof myenv[0])-1)
-#define VSET(name, exp) {strcpy(buf, "name="); strcpy(strchr(buf, 0), exp);}
-
- for(i = 0; i < SPECIAL; i++)
- if(special[i])
- free(special[i]);
- VSET(target, s = wtos(j->t));
- special[n++] = strdup(buf);
- free(s);
- /* WATCH OUT; stem set below if reg exp!! */
- VSET(stem, j->stem);
- special[n++] = strdup(buf);
- VSET(prereq, s = wtos(j->p));
- special[n++] = strdup(buf);
- free(s);
- sprint(buf, "pid=%d", getpid());
- special[n++] = strdup(buf);
- sprint(buf, "nproc=%d", slot);
- special[n++] = strdup(buf);
- VSET(newprereq, s = wtos(j->np));
- special[n++] = strdup(buf);
- free(s);
- VSET(alltarget, s = wtos(j->at));
- special[n++] = strdup(buf);
- free(s);
- for(i = 0; i <= 9; i++){
- sprint(buf, "stem%d=", i);
- if(j->r->attr®EXP){
- for(s = buf; *s; s++);
- for(t = j->match[i].sp; t < j->match[i].ep; *s++ = *t++);
- *s = 0;
- }
- special[n+i] = strdup(buf);
- if((i == 1) && (j->r->attr®EXP)){
- buf[1] = 's'; buf[2] = 't'; buf[3] = 'e'; buf[4] = 'm';
- special[1] = strdup(buf+1);
- }
- }
- special[SPECIAL] = 0;
-}
-
-nproc()
-{
- register Symtab *sym;
-
- if(sym = symlook("NPROC", S_VAR, (char *)0))
- nproclimit = atoi(sym->value);
- if(nproclimit < 1)
- nproclimit = 1;
- if(DEBUG(D_EXEC))
- fprint(1, "nprocs = %d\n", nproclimit);
- if(nproclimit > nevents){
- if(nevents)
- events = (Event *)realloc((char *)events, nproclimit*sizeof(Event));
- else
- events = (Event *)malloc(nproclimit*sizeof(Event));
- while(nevents < nproclimit)
- events[nevents++].pid = 0;
- }
-}
-
-nextslot()
-{
- register i;
-
- for(i = 0; i < nproclimit; i++)
- if(events[i].pid <= 0) return(i);
- assert("out of slots!!", 0);
- return(0); /* cyntax */
-}
-
-static
-pidslot(pid)
-{
- register i;
-
- for(i = 0; i < nevents; i++)
- if(events[i].pid == pid) return(i);
- return(-1);
-}
-
-static void
-pnew(pid, status)
-{
- register Process *p;
-
- if(pfree){
- p = pfree;
- pfree = p->f;
- } else
- p = (Process *)Malloc(sizeof(Process));
- p->pid = pid;
- p->status = status;
- p->f = phead;
- phead = p;
- if(p->f)
- p->f->b = p;
- p->b = 0;
-}
-
-static void
-pdelete(p)
- Process *p;
-{
- if(p->f)
- p->f->b = p->b;
- if(p->b)
- p->b->f = p->f;
- else
- phead = p->f;
- p->f = pfree;
- pfree = p;
-}
-
-static long tslot[1000];
-static long tick;
-
-account()
-{
- long t;
-
- time(&t);
- if(tick)
- tslot[nrunning] += (t-tick);
- tick = t;
-}
-
-praccount()
-{
- int i;
-
- account();
- for(i = 0; i <= nevents; i++)
- Fprint(1, "%d: %ld\n", i, tslot[i]);
-}
//GO.SYSIN DD ./run.c
echo ./shprint.c 1>&2
sed 's/.//' >./shprint.c <<'//GO.SYSIN DD ./shprint.c'
-#include "mk.h"
-
-shprint(s, env, dest)
- char *s, **env, *dest;
-{
- register char *q = dest;
-
- while(*s)
- switch(*s)
- {
- case '\\':
- *q++ = *s++;
- *q++ = *s++;
- break;
- case '$':
- q = vexpand(&s, q, env);
- break;
- default:
- *q++ = *s++;
- break;
- }
- *q = 0;
-}
-
-char *
-mygetenv(name, env)
- char *name, **env;
-{
- register char *p, *q;
-
- for(; *env; env++){
- for(p = name, q = *env; *p == *q; p++, q++)
- if(*p == 0) break;
- if((*p == 0) && (*q == '='))
- return(q+1);
- }
- return((char *)0);
-}
-
-char *
-vexpand(ww, dest, env)
- char **ww, *dest, **env;
-{
- register char *s, *w = *ww;
- char carry, *q;
-
- assert("vexpand no $", *w == '$');
- if(*++w == '{'){
- for(s = ++w; *s != '}'; s++)
- if(*s == 0) break;
- } else
- s = shname(w);
- carry = *s;
- *s = 0;
- if(q = mygetenv(w, env)){
- while(*q)
- *dest++ = *q++;
- } else { /* copy name */
- for(q = *ww; q != s;)
- *dest++ = *q++;
- if(carry == '}')
- *dest++ = carry;
- }
- *s = carry;
- if(carry == '}')
- s++;
- *ww = s;
- return(dest);
-}
-
-front(s)
- char *s;
-{
- register char *t;
- register i, j;
- char *flds[512];
- char buf[BIGBLOCK];
-
- setfields(" \t\n");
- strcpy(buf, s);
- i = getfields(buf, flds, 512);
- if(i > 5){
- flds[4] = flds[i-1];
- flds[3] = "...";
- i = 5;
- }
- t = s;
- for(j = 0; j < i; j++){
- for(s = flds[j]; *s; *t++ = *s++);
- *t++ = ' ';
- }
- *t = 0;
-}
//GO.SYSIN DD ./shprint.c
echo ./sig.c 1>&2
sed 's/.//' >./sig.c <<'//GO.SYSIN DD ./sig.c'
-#include "mk.h"
-#include <signal.h>
-
-static
-sigint()
-{
- extern errno;
-
- signal(SIGINT, SIG_IGN);
- kflag = 1; /* to make sure waitup doesn't exit */
- jobs = 0; /* make sure no more get scheduled */
- while(waitup(1, (int *)0) == 0)
- ;
- Fprint(1, "mk: interrupted!\n");
- Exit();
-}
-
-sigcatch()
-{
- if(signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, sigint);
-}
//GO.SYSIN DD ./sig.c
echo ./symtab.c 1>&2
sed 's/.//' >./symtab.c <<'//GO.SYSIN DD ./symtab.c'
-#include "mk.h"
-
-#define NHASH 4099
-#define HASHMUL 79L /* this is a good value */
-static Symtab *hash[NHASH];
-
-syminit()
-{
- register Symtab **s, *ss;
-
- for(s = hash; s < &hash[NHASH]; s++){
- for(ss = *s; ss; ss = ss->next)
- free((char *)ss);
- *s = 0;
- }
-}
-
-Symtab *
-symlook(sym, space, install)
- char *sym;
- char *install;
-{
- register long h;
- register char *p;
- register Symtab *s;
-
- for(p = sym, h = space; *p; h += *p++)
- h *= HASHMUL;
- if(h < 0)
- h = ~h;
- h %= NHASH;
- for(s = hash[h]; s; s = s->next)
- if((s->space == space) && (strcmp(s->name, sym) == 0))
- return(s);
- if(install == 0)
- return((Symtab *)0);
- s = (Symtab *)Malloc(sizeof(Symtab));
- s->space = space;
- s->name = sym;
- s->value = install;
- s->next = hash[h];
- hash[h] = s;
- return(s);
-}
-
-symdel(sym, space)
- char *sym;
-{
- register long h;
- register char *p;
- register Symtab *s, *ls;
-
- for(p = sym, h = space; *p; h += *p++)
- h *= HASHMUL;
- if(h < 0)
- h = ~h;
- h %= NHASH;
- for(s = hash[h], ls = 0; s; ls = s, s = s->next)
- if((s->space == space) && (strcmp(s->name, sym) == 0)){
- if(ls)
- ls->next = s->next;
- else
- hash[h] = s->next;
- free((char *)s);
- }
-}
-
-symtraverse(space, fn)
- void (*fn)();
-{
- register Symtab **s, *ss;
-
- for(s = hash; s < &hash[NHASH]; s++)
- for(ss = *s; ss; ss = ss->next)
- if(ss->space == space)
- (*fn)(ss);
-}
-
-symstat()
-{
- register Symtab **s, *ss;
- register n;
- int l[1000];
-
- memset((char *)l, 0, sizeof(l));
- for(s = hash; s < &hash[NHASH]; s++){
- for(ss = *s, n = 0; ss; ss = ss->next)
- n++;
- l[n]++;
- }
- for(n = 0; n < 1000; n++)
- if(l[n]) Fprint(1, "%ld of length %d\n", l[n], n);
-}
//GO.SYSIN DD ./symtab.c
echo ./t_ar.c 1>&2
sed 's/.//' >./t_ar.c <<'//GO.SYSIN DD ./t_ar.c'
-#include "mk.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <ar.h>
-
-static atimes();
-
-long
-atimeof(force, name, ar, mem)
- char *name, *ar, *mem;
-{
- struct stat sbuf;
- Symtab *sym;
-
- if(stat(ar, &sbuf) < 0)
- sbuf.st_mtime = 0;
- if(sym = symlook(ar, S_AGG, (char *)0)){
- if(force || (sbuf.st_mtime > (long)sym->value)){
- atimes(ar);
- symlook(ar, S_AGG, ar)->value = (char *)sbuf.st_mtime;
- }
- } else {
- atimes(ar);
- symlook(strdup(ar), S_AGG, ar)->value = (char *)sbuf.st_mtime;
- }
- if(sym = symlook(name, S_TIME, (char *)0))
- sbuf.st_mtime = (long)sym->value;
- else
- sbuf.st_mtime = 0;
- return((long)sbuf.st_mtime);
-}
-
-void
-atouch(name, ar, mem)
- char *name, *ar, *mem;
-{
- int fd;
- struct ar_hdr hdr;
- char *s;
- long t;
- char buf[NAMEBLOCK];
-
- strcpy(buf, mem);
-#ifdef SYSV
- strcat(buf, "/");
-#endif
- if((fd = open(ar, 2)) < 0){
- if((fd = creat(ar, 0666)) < 0){
- perror(ar);
- Exit();
- }
- write(fd, ARMAG, SARMAG);
- }
- if(symlook(name, S_TIME, (char *)0)){
- /* hoon off and change it in situ */
- lseek(fd, (long)SARMAG, 0);
- while(read(fd, (char *)&hdr, sizeof(hdr)) == sizeof(hdr)){
- for(s = &hdr.ar_name[sizeof(hdr.ar_name)]; *--s == ' ';);
- s[1] = 0;
- if(strcmp(buf, hdr.ar_name) == 0){
- t = sizeof(hdr.ar_name)-sizeof(hdr);
- lseek(fd, t, 1);
- fprint(fd, "%-12ld", time((long *)0));
- break;
- }
- t = atol(hdr.ar_size);
-#ifdef CRAY
- t = (t+7)&~7;
- t -= sizeof(hdr)-60;
-#else
- if(t&01) t++;
-#endif
- lseek(fd, t, 1);
- }
- } else {
- lseek(fd, 0L, 2);
- fprint(fd, "%-16s%-12ld%-6d%-6d%-8lo%-10ld%2s", buf, time((long *)0),
- getuid(), getgid(), 0100666L, 0L, ARFMAG);
- }
- close(fd);
-}
-
-
-void
-adelete(name, ar, mem)
- char *name, *ar, *mem;
-{
- Fprint(2, "sorry; mk doesn't know how to delete archive members yet\n");
-}
-
-static
-atimes(ar)
- char *ar;
-{
- struct ar_hdr hdr;
- long t;
- int fd;
- char buf[BIGBLOCK];
- register char *s;
-
- if((fd = open(ar, 0)) < 0)
- return;
- if(read(fd, buf, SARMAG) != SARMAG){
- close(fd);
- return;
- }
- while(read(fd, (char *)&hdr, sizeof(hdr)) == sizeof(hdr)){
- for(s = &hdr.ar_name[sizeof(hdr.ar_name)]; *--s == ' ';);
-#ifdef SYSV
- if(*s == '/') /* Damn you Sytem V */
- s--;
-#endif
- s[1] = 0;
- t = atol(hdr.ar_date);
- sprint(buf, "%s(%s)", ar, hdr.ar_name);
- symlook(strdup(buf), S_TIME, (char *)t)->value = (char *)t;
- t = atol(hdr.ar_size);
- if(t&01) t++;
- lseek(fd, t, 1);
- }
- close(fd);
-}
//GO.SYSIN DD ./t_ar.c
echo ./t_driver.c 1>&2
sed 's/.//' >./t_driver.c <<'//GO.SYSIN DD ./t_driver.c'
-#include "mk.h"
-#include <ar.h>
-
-#define AR 123456L
-
-extern long ftimeof(), atimeof();
-extern void ftouch(), atouch();
-extern void fdelete(), adelete();
-static long split();
-
-struct ftype
-{
- long magic;
- long (*time)();
- void (*touch)();
- void (*delete)();
-} ftab[] =
-{
- { 0L, ftimeof, ftouch, fdelete },
- { AR, atimeof, atouch, adelete },
- { 0L, (long (*)())0 }
-};
-
-long
-timeof(name, force)
- char *name;
-{
- char buf[BIGBLOCK], *part2;
- register struct ftype *f;
- long magic;
-
- magic = split(name, buf, &part2);
- for(f = ftab; f->time; f++)
- if(f->magic == magic)
- return((*f->time)(force, name, buf, part2));
- Fprint(2, "mk: '%s' appears to have an unknown magic number (%ld)\n", name, magic);
- Exit();
- return(0L); /* shut cyntax up */
-}
-
-void
-touch(name)
- char *name;
-{
- char buf[BIGBLOCK], *part2;
- register struct ftype *f;
- long magic;
-
- magic = split(name, buf, &part2);
- Fprint(1, "touch(%s)\n", name);
- if(nflag)
- return;
- for(f = ftab; f->time; f++)
- if(f->magic == magic){
- (*f->touch)(name, buf, part2);
- return;
- }
- Fprint(2, "mk: give me a break! I never heard of magic=%ld\n", magic);
- Exit();
-}
-
-void
-delete(name)
- char *name;
-{
- char buf[BIGBLOCK], *part2;
- register struct ftype *f;
- long magic;
-
- magic = split(name, buf, &part2);
- for(f = ftab; f->time; f++)
- if(f->magic == magic){
- (*f->delete)(name, buf, part2);
- return;
- }
- Fprint(2, "mk: give me a break! I never heard of magic=%ld\n", magic);
- Exit();
-}
-
-static long
-type(file)
- char *file;
-{
- int fd;
- char buf[SARMAG];
- short m;
- long goo;
-
- if(access(file, 0) < 0){
- if(symlook(file, S_BITCH, (char *)0) == 0){
- Fprint(1, "%s doesn't exist: assuming it will be an archive\n", file);
- (void)symlook(file, S_BITCH, file);
- }
- return(AR);
- }
- if((fd = open(file, 0)) < 0){
- perror(file);
- Exit();
- }
- if(read(fd, buf, SARMAG) != SARMAG){
- close(fd);
- return(-1L);
- }
- if(strncmp(ARMAG, buf, SARMAG) == 0)
- goo = AR;
- else {
- lseek(fd, 0L, 0);
- if(read(fd, (char *)&m, sizeof m) == sizeof m)
- goo = m;
- else
- goo = -1;
- }
- close(fd);
- return(goo);
-}
-
-static long
-split(name, buf, p2)
- char *name, *buf, **p2;
-{
- register char *s;
-
- strcpy(buf, name);
- if(s = strchr(buf, '(')){
- *s++ = 0;
- *p2 = s;
- while(*s && (*s != ')'))
- s++;
- *s = 0;
- return(type(buf));
- } else
- return(0L);
-}
//GO.SYSIN DD ./t_driver.c
echo ./t_file.c 1>&2
sed 's/.//' >./t_file.c <<'//GO.SYSIN DD ./t_file.c'
-#include "mk.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#define MYSEP(s) ((*s == ' ') || (*s == ',') || (*s == '\n'))
-
-timeinit(s)
- register char *s;
-{
- register long t;
- register char *os;
-
- for(t = time((long *)0); *s; s = os){
- for(os = s; !MYSEP(os); os++)
- if(*os == 0){
- symlook(strdup(s), S_TIME, (char *)t)->value = (char *)t;
- return;
- }
- *os++ = 0;
- symlook(strdup(s), S_TIME, (char *)t)->value = (char *)t;
- while(MYSEP(os))
- os++;
- }
-}
-
-long
-ftimeof(force, name)
- char *name;
-{
- struct stat sbuf;
- Symtab *sym;
-
- if(!force && (sym = symlook(name, S_TIME, (char *)0))){
- return((long)sym->value);
- }
- if(stat(name, &sbuf) < 0)
- sbuf.st_mtime = 0;
- symlook(name, S_TIME, (char *)sbuf.st_mtime);
- return((long)sbuf.st_mtime);
-}
-
-void
-ftouch(name)
- char *name;
-{
- int fd;
- char buf[1];
- struct stat sbuf;
-
- if(stat(name, &sbuf) < 0) /* not there and zero length are same case */
- sbuf.st_size = 0;
- if(sbuf.st_size == 0){
- if((fd = creat(name, 0666)) < 0){
- bad:
- perror(name);
- Exit();
- }
- close(fd);
- return;
- }
- if((fd = open(name, 2)) < 0)
- goto bad;
- if(read(fd, buf, 1) != 1)
- goto bad;
- if(lseek(fd, 0L, 0) < 0)
- goto bad;
- if(write(fd, buf, 1) != 1)
- goto bad;
- close(fd);
-}
-
-void
-fdelete(s)
- char *s;
-{
- if(unlink(s) < 0)
- perror(s);
-}
//GO.SYSIN DD ./t_file.c
echo ./var.c 1>&2
sed 's/.//' >./var.c <<'//GO.SYSIN DD ./var.c'
-#include "mk.h"
-
-setvar(name, value)
- char *name;
- char *value;
-{
- symlook(name, S_VAR, value)->value = value;
- symlook(name, S_MAKEVAR, "");
-}
-
-static char **nextv;
-
-static void
-vcopy(s)
- register Symtab *s;
-{
- register char **p;
- extern char *myenv[];
-
- if(symlook(s->name, S_NOEXPORT, (char *)0))
- return;
- for(p = myenv; *p; p++)
- if(strcmp(*p, s->name) == 0) return;
- if(*nextv)
- free(*nextv);
- *nextv++ = envpr(s->name, s->value);
-}
-
-char **
-vardump(p)
- char **p;
-{
- nextv = p;
- symtraverse(S_VAR, vcopy);
- *nextv = 0;
- return(nextv);
-}
-
-static void
-print1(s)
- register Symtab *s;
-{
- Fprint(1, "\t%s='%s'\n", s->name, s->value);
-}
-
-dumpv(s)
- char *s;
-{
- Fprint(1, "%s:\n", s);
- symtraverse(S_VAR, print1);
-}
-
-char *
-envpr(name, value)
- register char *name;
- register char *value;
-{
- char buf[BIGBLOCK];
-
- sprint(buf, "%s=", name);
- strcpy(strchr(buf, 0), value);
- return(strdup(buf));
-}
-
-#include <ctype.h>
-
-char *
-shname(s)
- char *s;
-{
- register unsigned char *a = (unsigned char *)s;
-
- /* always go one !! */
- a++;
- while(isalnum(*a) || (*a == '_')) a++;
- return((char *)a);
-}
//GO.SYSIN DD ./var.c
echo ./word.c 1>&2
sed 's/.//' >./word.c <<'//GO.SYSIN DD ./word.c'
-#include "mk.h"
-
-Word *
-newword(s)
- char *s;
-{
- register Word *w = (Word *)Malloc(sizeof(Word));
-
- w->s = strdup(s);
- w->next = 0;
- return(w);
-}
-
-Word *
-stow(s)
- char *s;
-{
- char save;
- register char *t;
- Word *head, *w;
-
- w = head = newword("");
- while(*s){
- while(SEP(*s))
- s++;
- if(*s == 0) break;
- for(t = s; *t && !SEP(*t); t++)
- ;
- save = *t;
- *t = 0;
- w->next = newword(s);
- w = w->next;
- *t = save;
- s = t;
- }
- w = head->next;
- delword(head);
- return(w);
-}
-
-char *
-wtos(w)
- register Word *w;
-{
- static char buf[BIGBLOCK];
- register char *s = buf;
- register char *t;
-
- for(; w; w = w->next){
- for(t = w->s; *t;)
- *s++ = *t++;
- if(w->next)
- *s++ = ' ';
- }
- *s = 0;
- return(strdup(buf));
-}
-
-delword(w)
- Word *w;
-{
- free(w->s);
- free((char *)w);
-}
-
-dumpw(s, w)
- char *s;
- Word *w;
-{
- Fprint(1, "%s", s);
- for(; w; w = w->next)
- Fprint(1, " '%s'", w->s);
- Fputc(1, '\n');
-}
//GO.SYSIN DD ./word.c
echo ./ndir.h 1>&2
sed 's/.//' >./ndir.h <<'//GO.SYSIN DD ./ndir.h'
-/* Copyright (c) 1982 Regents of the University of California */
-/* and modified by pjw in 1986 */
-
-/*
- * this must be a power of 2 and a multiple of all the ones in the system
- */
-#define DIRBLKSIZ 512
-
-/*
- * This limits the directory name length. Its main constraint
- * is that it appears twice in the user structure. (u. area) in bsd systems
- */
-#define MAXNAMLEN 255
-
-struct direct {
- unsigned long d_ino;
- short d_reclen;
- short d_namlen;
- char d_name[MAXNAMLEN + 1];
- /* typically shorter */
-};
-
-struct _dirdesc {
- int dd_fd;
- long dd_loc; /* where we left off in dd_buf */
- long dd_size; /* bytes back from system */
- long dd_offset; /* lseek at beginning of dd_buf */
- char dd_buf[DIRBLKSIZ];
-};
-
-/*
- * useful macros.
- */
-#define NDIRSIZ(dp) \
- ((sizeof(struct direct) - MAXNAMLEN + (dp)->d_namlen + sizeof(ino_t) - 1) &\
- ~(sizeof(ino_t) - 1))
-typedef struct _dirdesc DIR;
-#ifndef NULL
-#define NULL 0
-#endif
-
-/*
- * functions defined on directories
- */
-extern DIR *opendir();
-extern struct direct *readdir();
-extern long telldir();
-extern void seekdir();
-#define rewinddir(dirp) seekdir((dirp), 0)
-extern void closedir();
//GO.SYSIN DD ./ndir.h
echo ./tmac.an 1>&2
sed 's/.//' >./tmac.an <<'//GO.SYSIN DD ./tmac.an'
-'''\" PWB Manual Entry Macros - 1.36 of 11/11/80
-'''\" Nroff/Troff Version @(#)1.36
-'''\" Option -rs1 short (9") pages
-'''\" Option -rp# set no. of first page, put no. of pgs. on stderr
-'''\" Option -rd1 give modified date instead of printed date
-.deth
-.tmwrong version of man entry macros - use -man6
-.ab
-..
-.ifn .ds Tm \uTM\d
-.ift .ds Tm \v'-0.5m'\s-4TM\s+4\v'0.5m'
-.de}E
-.}f
-.in\\n()Ru+\\n(INu
-.ll\\n(LLu
-.lt\\n(LLu
-.pl\\n()Lu
-..
-.deDT
-.ift .ta 3.6m 7.2m 10.8m 14.4m 18m 21.6m 25.2m 28.8m 32.4m 36m 39.6m 43.2m 46.8m
-.ifn .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n
-..
-.de HY
-.hy14
-..
-.de}f
-.ift .vs \\n()Vp
-.ps\\n()S
-.ft1
-..
-.de}H
-.ev1
-.}C
-.}E
-.ie\\n()s 'sp |2v
-.el'sp |3v
-.".ps\\n()S-1
-.".iet .bd1 3
-.".el.bd1 0
-.tl \\*(]H\\*(]L\\*(]H
-.bd1
-.ps\\n()S
-.ie\\n()s 'sp 1.5v
-.el'sp 3v
-.ev
-.ns
-.if \\n(CL .2C
-..
-.de}F
-.ev1
-.}E
-.if\\n()s 'sp |\\n(.pu-1v-1p
-.if\\n()t 'sp |\\n(.pu-3v
-.ifn 'sp |\\n(.pu-4v
-.ifn .tl Page %\\*(]D\\*(]W
-.if\\n()s .tl - % -
-.if\\n()t \{.if o .tl Page %\\*(]D\\*(]W
-.ife .tl \\*(]W\\*(]DPage % \}
-.ev
-'bp
-..
-.ifn .ig
-.de}C
-.if "\\*(.T"aps"\{\
-. po0i
-. lt7.5i
-. if\\n()s .tl \l0.25i\l0.25i\h1i\l0.25i
-. if\\n()t .tl \l0.25i\l0.25i
-. lt
-. po\}
-..
-.de}M
-.}N
-.wh-.5p }C
-.ll\\n(LLu
-.}P
-..
-.de}K
-.}N
-.pl1
-.ll\\n(LLu
-..
-.de}P
-.nr )P \\n%+1-\\np
-.if \\nq .tm \\n(.F \\n()P \\np
-.bp
-.if \\nq .nr p \\n%
-..
-.deTH
-.PD
-.nrIN \\n()Mu
-.ift .ds ]H \\$1\^(\^\\$2\^)
-.ifn .ds ]H \\$1(\\$2)
-.if\\n()s .ds ]D
-.if\\n()t .ds ]D Tenth Edition
-.ifn .ds ]D Tenth Edition
-.ds]L
-.if!\\$3 .ds ]L (\^\\$3\^)
-.if!\\$4 .ds ]D \\$4
-.wh0 }H
-.wh-\\n(:mu }F
-.em}M
-.if\\n(nl .}P
-.nr)I \\n()Mu
-.nr)R 0
-.}E
-.DT
-.ifn \{.na
-.nh\}
-.ift \{.bd S 3 3
-.HY \}
-..
-.deSH
-.PD
-.}X 0 "\\$1" smaller
-.nr)E 2
-\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6
-..
-.deSS
-.}X 3n "" ""
-.nr)E 2
-\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6
-..
-.de}X
-.}E
-.ti\\$1
-.sp\\n(PDu
-.ne1.1v
-.nr)R 0
-.fi
-'''ss12
-'''if\\$2SYNOPSIS .ss 18
-.it1 }N
-.if!\\$3 .SM
-.iet .bd1 3
-.el.bd1 0
-..
-.de}2
-.nr)E 0
-.}E
-.nr)I \\n()Mu
-.ns
-.bd1
-..
-.deSM
-.nh
-.ps\\n()S-1
-.if!\\$1 \&\\$1
-.if!\\$2 \&\\$2
-.if!\\$3 \&\\$3
-.if!\\$4 \&\\$4
-.if!\\$5 \&\\$5
-.if!\\$6 \&\\$6
-.if!\\$1 .ps \\n()S
-.if\\$1 .it 1 }N
-.HY
-..
-.deI
-.nh
-.ft2
-.it1 }N
-.if!\\$1 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
-.HY
-..
-.deB
-.nh
-.it1 }N
-.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
-.el .ft5
-.HY
-..
-.deL
-.nh
-.it1 }N
-.ift \{.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
-.el .ft5 \}
-.ifn \{.ft5
-.if!\\$1 \{.ie\\$2 `\\$1'
-.el .ie\\$3 `\\$1 \\$2'
-.el .ie\\$4 `\\$1 \\$2 \\$3'
-.el .ie\\$5 `\\$1 \\$2 \\$3 \\$4'
-.el .ie\\$6 `\\$1 \\$2 \\$3 \\$4 \\$5'
-.el `\\$1 \\$2 \\$3 \\$4 \\$5 \\$6'\}\}
-.HY
-..
-.deF
-.nh
-.it1 }N
-.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
-.el .ft5
-.HY
-..
-.deRI
-.nh
-.}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.HY
-.}f
-..
-.deIR
-.nh
-.}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.HY
-.}f
-..
-.deIB
-.nh
-.ift .}S 2 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.ifn .}S 2 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.HY
-.}f
-..
-.deRB
-.nh
-.ift .}S 1 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.ifn .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.HY
-.}f
-..
-.deBR
-.nh
-.ift .}S 5 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.ifn .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.HY
-.}f
-..
-.deBI
-.nh
-.ift .}S 5 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.ifn .}S 1 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
-.HY
-.}f
-..
-.de LR
-.nh
-.ift \%\&\f5\\$1\f1\\$2
-.ifn \%`\\$1'\\$2
-.HY
-..
-.de RL
-.nh
-.ift \%\&\f1\\$1\\f5\\$2\\f1\\$3
-.ifn \%\\$1`\\$2'\\$3
-.HY
-..
-.de}S
-.ds]F
-.if\\$12 .if !\\$5 .ds ]F \^
-.if\\$22 .if !\\$5 .ds ]F \^
-.ie!\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
-.el\\$3
-.}f
-..
-.deFR
-\%\&\f5\\$1\f1\\$2 \\$3 \\$4 \\$5 \\$6
-..
-.deRF
-\%\&\f1\\$1\f5\\$2\f1\\$3
-..
-.deEX
-.ift .ft5
-.nf
-..
-.deEE
-.ft1
-.fi
-..
-.dePP
-.sp\\n(PDu
-.ne1.1v
-.}E
-.nr)I \\n()Mu
-.ns
-..
-.deP
-.PP
-..
-.deLP
-.PP
-..
-.dePD
-.ift .nr PD .4v
-.ifn .nr PD 1v
-.if!\\$1 .nr PD \\$1v
-..
-.deHP
-.sp\\n(PDu
-.ne1.1v
-.if!\\$1 .nr )I \\$1n
-.ll\\n(LLu
-.in\\n()Ru+\\n(INu+\\n()Iu
-.ti\\n()Ru+\\n(INu
-.}f
-..
-.deIP
-.ie!\\$1 \{.TP "\\$2"
-\&\\$1\}
-.el\{.sp\\n(PDu
-.ne1.1v
-.if!\\$2 .nr )I \\$2n
-.}f
-.ll\\n(LLu
-.in\\n()Ru+\\n(INu+\\n()Iu
-.lg\}
-..
-.deTP
-.if!\\$1 \{.nr )I \\$1n
-.if\\$10 .nr )I \\n()M\}
-.sp\\n(PDu
-.ne1.1v
-.in\\n()Ru
-.lg0
-.ns
-.it1 }N
-.nr)E 1
-.di]B
-..
-.deTF
-.IP "" \w'\f5\\$1\ \ \fP'u
-.PD0
-..
-.de}1
-.ds]X \&\\*(]B\\
-.rm]B
-.nr)E 0
-.if!\\$1 .nr )I \\$1n
-.}f
-.ll\\n(LLu
-.in\\n()Ru+\\n(INu+\\n()Iu
-.ti\\n(INu
-.ie!\\n()Iu+\\n()Ru-\w\\*(]Xu-3p \{\\*(]X
-.br\}
-.el\\*(]X\h|\\n()Iu+\\n()Ru\c
-.}f
-.lg
-..
-.de}N
-.if\\n()E .br
-.if\\n()E1 .di
-.if\\n()E0 .}f
-.if\\n()E1 .}1
-.if\\n()E2 .}2
-..
-.deRS
-.nr]\\n+()p \\n()I
-.nr)\\n()p \\n()R
-.ie!\\$1 .nr )R +\\$1n
-.el.nr )R +\\n()I
-.nr)I \\n()Mu
-.}E
-..
-.deRE
-.if!\\$1 \{.ie \\$10 .nr )p 1 1
-.el.nr )p \\$1 1 \}
-.ds]i \\*(]I\\n()p
-.ds]r \\*(]R\\n()p
-.nr)I \\*(]i
-.nr)R \\*(]r
-.if\\n()p .nr )p -1
-.}E
-..
-'''\" .2C begin 2-column display, by diversion
-'''\" CC=amount of text that will fit on page
-'''\" CL=1 multicolumn in effect, else 0
-'''\" CI saved indent
-'''\" CB contains diverted text
-.de 2C
-.ne 2
-.nf
-.nr CC \\n(.t/1v*2v
-.nr CI \\n(IN
-.nr IN 0
-.di CB
-.nr CL 1
-.}E
-.dt \\n(CCu C1
-..
-'''\" .1C return to 1-column
-.de 1C
-.nr CL 0
-.C1
-.fi
-..
-'''\" end of diversion, at end of page or return to 1-column
-'''\" CC=pos of nominal column end
-.de C1
-.dt
-\!.C3
-.di
-.if \\n(dn \{.nr CC \\n(dnu/2u+\\n(nlu
-.wh \\n(CCu C2
-.mk
-.nf
-.nr IN \\n(CIu
-.}E
-.CB \}
-..
-'''\" end of first column retrieved from diversion
-'''\" CC=pos of actual column end
-.de C2
-.wh \\n(CCu
-.mk CC
-.po +(\\n(LLu/2u)u
-.rt
-.if \\n(dn>1v .ns
-..
-'''\" end of second column
-.de C3
-.br
-.po -(\\n(LLu/2u)u
-.if \\n(CC>\\n(nl .sp |\\n(CCu
-.ne 2
-..
-.dePM
-.if\\$1 .nr !K 0
-.if\w\\$1 \{\
-.ie\\$1P .nr !K 1
-.el.ie \\$1BP .nr !K 3
-.el.ie \\$1BR .nr !K 4
-.el.nr !K 2 \}
-.if\\n(!K .wh -(\\n(:mu+5v) )G
-..
-.de)G
-.if\\n(!K 'sp 2v
-.ie\\n(!K=1 \{\
-.iet .bd1 3
-.el.bd1 0
-.tlPRIVATE
-.bd1
-.tlThis information should not be disclosed to unauthorized persons.
-.tlIt is meant solely for use by authorized Bell System employees. \}
-.el.ie \\n(!K=3 \{\
-.iet .bd1 3
-.el.bd1 0
-.tlBELL LABORATORIES PROPRIETARY
-.bd1
-.tlNot for use or disclosure outside Bell Laboratories except by
-.tlwritten approval of the director of the distributing organization. \}
-.el.ie \\n(!K=4 \{\
-.iet .bd1 3
-.el.bd1 0
-.tlBELL LABORATORIES RESTRICTED
-.bd1
-.tlThe information herein is meant solely for use by authorized
-.tlBell Laboratories employees and is not to be disclosed to others. \}
-.el.if \\n(!K=2 \{\
-.iet .bd1 3
-.el.bd1 0
-.tlNOTICE
-.bd1
-.tlNot for use or disclosure outside the
-.tlBell System except under written agreement. \}
-..
-.nr)s 0
-.ift .if \ns .nr )s 1
-.nr)t 0
-.ift .if !\ns .nr )t 1
-.if\n()s \{.nr )L 9i
-.nrLL 4.75i
-.nr)O .75i
-.nr)S 9
-.nr)V 10 \}
-.if\n()t \{.nr )L 11i
-.nrLL 6.5i
-.nr)O 1i
-.nr)S 10
-.nr)V 12 \}
-.ift \{.ds R \(rg
-.dsS \s\n()S
-..\}
-.ifn \{.nr )L 11i
-.nrLL 6.5i
-.nr)O .463i
-.if '\*(.T'think' \{.nrLL 80n
-.nr)O 0\}
-.if '\*(.T'thinksmall' \{.nrLL 142n
-.vs 9p
-.nr)O 0\}
-.dsR (Reg.)
-.dsS
-..\}
-.if\nT .nr LL 80n
-.if\nV>1 \{
-.nrLL 82n
-.nr)L 84v
-.rmul \}
-.nr)p 0 1
-.ds]I \\\\n(]
-.ds]R \\\\n()
-.if\nd0 .nr m \n(mo-1
-.if\nm0 .ds ]m January
-.if\nm1 .ds ]m February
-.if\nm2 .ds ]m March
-.if\nm3 .ds ]m April
-.if\nm4 .ds ]m May
-.if\nm5 .ds ]m June
-.if\nm6 .ds ]m July
-.if\nm7 .ds ]m August
-.if\nm8 .ds ]m September
-.if\nm9 .ds ]m October
-.if\nm10 .ds ]m November
-.if\nm11 .ds ]m December
-.ifn \{.nr m \nm+1
-.ie\nd .ds ]W (last mod. \nm/\nd/\ny)
-.el.ds ]W (printed \n(mo/\n(dy/\n(yr)
-..\}
-.if\n()s .ds ]W
-.if\n()t \{.ie \nd .ds ]W \*(]m \nd, 19\ny
-.el.ds ]W \*(]m \n(dy, 19\n(yr
-..\}
-.pl\n()Lu
-.ll\n(LLu
-.lt\n(LLu
-.po\n()Ou
-.fp 5 L CW
-.ift .tr \``\''
-.}f
-.if\n()s .nr :m 3.5v
-.if\n()t .nr :m 6v
-.ifn .nr :m 7v
-.ift .nr )M 3.6m
-.ifn .nr )M 5n
-.em}K
-.nr q \np
-.if!\np .nr p 1
-.pn \np
//GO.SYSIN DD ./tmac.an
echo ./mkfile 1>&2
sed 's/.//' >./mkfile <<'//GO.SYSIN DD ./mkfile'
-NAMES=alloc arc bquote builtins dir expand gen glob graph job\
- lex main makefile match mk parse quote\
- recipe regexp rule run shprint sig symtab t_ar t_driver t_file var word
-OBJ=${NAMES:%=%.o}
-NPROC=2
-BUILTINS=
-# for profiling, use -p -DPROF
-CFLAGS=-I.. -DSYSV
-
-nmk: $OBJ
- $CC $CFLAGS -o nmk $OBJ fio/fio.a libc/libc.a math/math.a
-
-goo:V: nmk
- nmk
-
-clean:V:
- rm -f cyntax nmk *.o O/*
-
-install:V: nmk
- cp nmk /usr/bin/mk
- strip /usr/bin/mk
-
-pp:V:
- pr *.h *.c | lp -dpsu -n2
-
-%.o: mk.h
-
-%.o: %.c
- $CC $CFLAGS -c $stem.c
-
-tut.out: tut.ms
- pic tut.ms | tbl | troff -Tpost -ms > tut.out
-
-sane:V: nmk
- cp nmk goo
- rm arc.o; goo -e
- goo -e -wjob.o
-
-poot:V: nmk
- echo 'pooter Any Dk,g nj/fart/whistle.uucp' >> /n/research/usr/lib/uucp/Systems.dk
- ./nmk -k -i -f /usr/lib/upas/mkfile NPROC=1 systems
//GO.SYSIN DD ./mkfile
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.