Add original unix v6

This commit is contained in:
memnoth
2018-01-27 22:35:41 +09:00
commit 2c7099ee50
664 changed files with 106254 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
#
/*
* C library -- alloc/free
*/
#define logical char *
struct fb {
logical size;
char *next;
};
int freelist[] {
0,
-1,
};
logical slop 2;
alloc(asize)
logical asize;
{
register logical size;
register logical np;
register logical cp;
if ((size = asize) == 0)
return(0);
size =+ 3;
size =& ~01;
for (;;) {
for (cp=freelist; (np= cp->next) != -1; cp=np) {
if (np->size>=size) {
if (size+slop >= np->size) {
cp->next = np->next;
return(&np->next);
}
cp = cp->next = np+size;
cp->size = np->size - size;
cp->next = np->next;
np->size = size;
return(&np->next);
}
}
asize = size<1024? 1024: size;
if ((cp = sbrk(asize)) == -1) {
return (-1);
}
cp->size = asize;
free(&cp->next);
}
}
free(aptr)
char *aptr;
{
register logical ptr;
register logical cp;
register logical np;
ptr = aptr-2;
cp = freelist;
while ((np = cp->next) < ptr)
cp = np;
if (ptr+ptr->size == np) {
ptr->size =+ np->size;
ptr->next = np->next;
np = ptr;
} else
ptr->next = np;
if (cp+cp->size == ptr) {
cp->size =+ ptr->size;
cp->next = ptr->next;
} else
cp->next = ptr;
}
+4
View File
@@ -0,0 +1,4 @@
calloc(n, s)
{
return(alloc(n*s));
}
+24
View File
@@ -0,0 +1,24 @@
# include "ciodec.c"
cclose (fn)
int fn;
{
struct fileps *fp;
extern char *IEH3olbf[10];
if (fn < 0 || fn > 20) return;
fp = &IEH3fpts[fn];
if (fp->nchars > 0 || fp->wrflag == 3)
switch (fp->wrflag)
{
case 3: seek(fn,0,2);
case 2: write (fn, fp->buff, fp->nchars);
break;
case 1: seek(fn, -(fp->nchars), 1);
}
fp -> nchars = fp->eoferr = 0;
fp -> wrflag = 0;
if ( IEH3olbf[fn] != 0 && fp->bsize >4)
free(IEH3olbf[fn]);
IEH3olbf[fn] = 0;
close (fn);
}
char *IEH3olbf[10] {0,0,0,0,0,0,0,0,0,0};
+20
View File
@@ -0,0 +1,20 @@
# include "ciodec.c"
ceof (fn)
int fn;
{
struct fileps *fp;
fp = &IEH3fpts[fn];
if (fp->wrflag > 0 && fp->eoferr == 2)
return(1);
else return(0);
}
cerr (fn)
int fn;
{
struct fileps *fp;
fp = &IEH3fpts[fn];
if (fp->eoferr == 0) fp->eoferr = 1;
if (fp->wrflag > 0 && fp->eoferr == 3)
return(1);
else return(0);
}
+10
View File
@@ -0,0 +1,10 @@
IEH3err (message, a, b, c, d, e)
char message[];
{
extern int cgoof;
printf("ERROR ");
printf(message, a, b, c, d, e);
cputc('\n');
cexit(cgoof);
}
cgoof 127;
+8
View File
@@ -0,0 +1,8 @@
cexit (rcode)
{
/* closes all files and exits */
int i;
for (i = 0; i < 10; i++)
cclose(i);
exit(rcode); /* rcode courtesy of sny */
}
+19
View File
@@ -0,0 +1,19 @@
# include "ciodec.c"
cflush (fn)
int fn;
{
struct fileps *fp;
if (nargs() != 1)
IEHzap("cflush");
if (fn < 0 || fn >15) return;
fp = &IEH3fpts[fn];
if (fp->nchars > 0 && fp->wrflag >= 2)
{
write (fn, fp->buff,fp->nchars);
fp->bptr = fp->buff;
fp -> nchars = fp->eoferr = 0;
}
if (fp->wrflag == 1)
seek(fn, -(fp->nchars),1);
return;
}
+4
View File
@@ -0,0 +1,4 @@
cfree (ptr)
{
free(ptr);
}
+31
View File
@@ -0,0 +1,31 @@
# include "ciodec.c"
char cgetc(fn)
{
struct fileps *fp;
if (nargs() != 1)
IEHzap("cgetc ");
if (fn <0 || fn >15)
IEH3err("cgetc: %d illegal file number",fn);
fp = &IEH3fpts[fn];
if (fp == 0 || fp->wrflag > 1)
IEH3err("cgetc: %d not open to read",fn);
if (fp->wrflag == 0)
/* file not opened with fopen: try making a buffer */
IEH3mbuf (fn, 0);
if (fp->eoferr > 1)
return ('\0');
if (fp->nchars == 0)
switch (fp->nchars = read(fn, fp->bptr=fp->buff, fp->bsize))
{
case -1: /* error */
if (fp->eoferr == 0)
IEH3err("cgetc: error on %d",fn);
fp->eoferr = 3;
return ('\0');
case 0: fp->eoferr = 2;
return ('\0');
}
fp->nchars--;
return (*(fp->bptr++));
}
cin 0;
+7
View File
@@ -0,0 +1,7 @@
struct fileps
{
char *buff, *bptr;
int nchars, bsize;
char eoferr, wrflag;
};
extern struct fileps IEH3fpts[10];
+6
View File
@@ -0,0 +1,6 @@
_clenf (s) /* counts length of string */
char *s;
{
int n;
for (n=0; *s++ != '\0'; n++);
return (n);}
+23
View File
@@ -0,0 +1,23 @@
copen (filename, type)
char *filename;
int type;
{
int fn;
switch (type)
{
case 'r': type = 0;
case 0: fn = open(filename,0);
break;
case 'a': type = 2;
case 2: if ((fn=open(filename,1))>=0)
break; /* courtesy of sny */
/* append defaults to write if file missing */
case 'w': type = 1;
case 1: fn = creat(filename,0666);
break;
default: IEH3err("copen: bad file %s",filename);
}
if (fn >= 0)
IEH3mbuf(fn,type);
return(fn);
}
+30
View File
@@ -0,0 +1,30 @@
# include "ciodec.c"
char cputc(ch, fn)
{
struct fileps *fp;
if (nargs() != 2)
IEHzap("cputc ");
if (fn<0 || fn>20) return(ch);
fp = &IEH3fpts[fn];
if (fp->wrflag == 1)
IEH3err("cputc: %d not open",fn);
if (fp->wrflag == 0)
IEH3mbuf(fn,1);
*(fp->bptr++) = ch;
if (++(fp->nchars) < fp->bsize)
return(ch);
if (fp->wrflag == 3) /* append, seek to end */
{
seek(fn, 0, 2);
fp->wrflag = 2; /* now just write from here on */
}
if ( write(fn, fp->bptr=fp->buff, fp->nchars) < 0)
{
if (fp->eoferr == 0)
IEH3err("cputc: writing %d",fn);
fp->eoferr = 3;
}
fp->nchars = 0;
return (ch);
}
cout 1;
+18
View File
@@ -0,0 +1,18 @@
cwrite (buff, buffp1, len, fn)
char *buff, *buffp1; int len, fn;
{
int unit, nwr;
unit = buffp1-buff;
len =* unit;
nwr = write (fn, buff, len);
return (nwr < 0 ? -1 : nwr/unit);
}
cread (buff, buffp1, len, fn)
char *buff, *buffp1; int len, fn;
{
int unit, nrd;
unit = buffp1 - buff;
len =* unit;
nrd = read(fn, buff, len);
return (nrd < 0 ? -1 : nrd/unit);
}
+4
View File
@@ -0,0 +1,4 @@
.globl ndigit
.globl _ieh305i
ndigit: .=.+2
_ieh305i: .=.+2
+84
View File
@@ -0,0 +1,84 @@
ftoa (x, str, prec, format)
float x;
char *str;
{
/* converts a floating point number to an ascii string */
/* x is stored into str, which should be at least 30 chars long */
int ie, i, k, ndig, fstyle;
double y;
if (nargs() != 7)
IEHzap("ftoa ");
ndig = ( prec<=0) ? 7 : (prec > 22 ? 23 : prec+1);
if (format == 'f' || format == 'F')
fstyle = 1;
else
fstyle = 0;
/* print in e format unless last arg is 'f' */
ie = 0;
/* if x negative, write minus and reverse */
if ( x < 0)
{
*str++ = '-';
x = -x;
}
/* put x in range 1 <= x < 10 */
if (x > 0.0) while (x < 1.0)
{
x =* 10.0;
ie--;
}
while (x >= 10.0)
{
x = x/10.0;
ie++;
}
/* in f format, number of digits is related to size */
if (fstyle) ndig =+ ie;
/* round. x is between 1 and 10 and ndig will be printed to
right of decimal point so rounding is ... */
for (y = i = 1; i < ndig; i++)
y = y/10.;
x =+ y/2.;
if (x >= 10.0) {x = 1.0; ie++;} /* repair rounding disasters */
/* now loop. put out a digit (obtain by multiplying by
10, truncating, subtracting) until enough digits out */
/* if fstyle, and leading zeros, they go out special */
if (fstyle && ie<0)
{
*str++ = '0'; *str++ = '.';
if (ndig < 0) ie = ie-ndig; /* limit zeros if underflow */
for (i = -1; i > ie; i--)
*str++ = '0';
}
for (i=0; i < ndig; i++)
{
k = x;
*str++ = k + '0';
if (i == (fstyle ? ie : 0)) /* where is decimal point */
*str++ = '.';
x =- (y=k);
x =* 10.0;
}
/* now, in estyle, put out exponent if not zero */
if (!fstyle && ie != 0)
{
*str++ = 'E';
if (ie < 0)
{
ie = -ie;
*str++ = '-';
}
for (k=100; k > ie; k =/10);
for (; k > 0; k =/10)
{
*str++ = ie/k + '0';
ie = ie%k;
}
}
*str = '\0';
return;
}
+5
View File
@@ -0,0 +1,5 @@
getchar()
{
extern cin;
return (cgetc(cin));
}
+13
View File
@@ -0,0 +1,13 @@
gets (s)
char *s;
{ /* gets (s) - read a string with cgetc and store in s */
char *p;
extern int cin;
if (nargs () == 2)
IEHzap("gets ");
p=s;
while ((*s = cgetc(cin)) != '\n' && *s != '\0') s++;
if (*p == '\0') return (0);
*s = '\0';
return (p);
}
+4
View File
@@ -0,0 +1,4 @@
getvec (n)
{
return (alloc(n));
}
+7
View File
@@ -0,0 +1,7 @@
IEHzap(s)
{
write(2,s,6);
write(2,": argument count wrong\n",23);
write(2,"That's all, folks\n",18);
exit();
}
+36
View File
@@ -0,0 +1,36 @@
# include "ciodec.c"
IEH3bsz 512;
IEH3mbuf (fn, type)
int fn, type;
{
struct fileps *fp;
extern char *IEH3olbf[], *alloc();
extern int IEHfbak[10];
int bx[19], size, bloc;
fp = &IEH3fpts[fn];
fp->eoferr = fp->nchars = 0;
fp->wrflag = type+1;
/* decide whether to buffer or not */
if (ttyn(fn) != 'x')
size = 1;
else
if (fstat(fn,bx) > 0 && bx[0] == 40 && type == 0)
size = 1;
else
size = IEH3bsz;
for (fp->buff = 0; size >10 && fp->buff == 0; size =/ 4)
if ((bloc = alloc(size+100)) != -1)
{
IEH3olbf[fn] = bloc;
fp->buff = fp->bptr =bloc + 100;
fp->bsize = size;
break;
}
if (fp->buff == 0)
{
fp->buff = fp->bptr = &IEHfbak[fn];
fp->bsize = size>1 ? 2 : 1;
}
}
struct fileps IEH3fpts [10];
int IEHfbak[10];
+17
View File
@@ -0,0 +1,17 @@
char IEH3endm[128] {0};
IEH3mtab (formatp)
char **formatp;
{
/* make up special table of string ending characters */
int i, normal;
char ch;
/* normally all characters end string except those listed */
normal = 1;
if (**formatp == '^')
{normal = 0; (*formatp)++;}
for (i= 0; i < 128; i++)
IEH3endm[i] = normal;
while ((ch = *((*formatp)++)) != ']')
IEH3endm[ch] = !IEH3endm[ch];
}
+10
View File
@@ -0,0 +1,10 @@
IEH3nxch ()
/* returns next character which is not IEH3spce */
{
char ch, cgetc();
extern int IEH3sfil;
while ((ch = cgetc(IEH3sfil)) > 0 && IEH3spce(ch));
if (ch > 0)
return (ch);
return (-1);
}
+13
View File
@@ -0,0 +1,13 @@
IEH3nodg (ch)
char ch;
{
if (IEH3digt(ch)) return (0);
switch (ch)
{
case 'E':
case 'e':
case '.': case '+': case '-':
return (0);
}
return (1);
}
+130
View File
@@ -0,0 +1,130 @@
char *_ptrbf, *_ptrst, *__fmt;
printf(a1,a2,a3,a4){
auto char c, *s, adj, *ptr,*p, buf[30];
extern cputc(),_putstr(), cout;
auto int *adx, x, n, m, width, prec,i, padchar, fd;
double zz, *dblptr;
char (*f)();
_ptrbf = buf;
fd=cout;
adx = &a1;
f = cputc;
if (a1 == -1)
{
f = _putstr;
_ptrst = a2;
adx =+ 2;
}
else if (a1 >= 0 && a1 <= 9)
fd = *adx++;
__fmt = *adx++;
while( c = *__fmt++ ){
if(c != '%') (*f)(c,fd);
else { x = *adx++;
if( *__fmt == '-' ){ adj = 'l'; __fmt++; }
else adj = 'r';
padchar = (*__fmt=='0') ? '0' : ' ';
width = __conv();
if( *__fmt == '.'){++__fmt; prec = __conv();}
else prec = 0;
s = 0;
switch ( c = *__fmt++ ) {
case 'D':
case 'd':
_prt1(x); break;
case 'o':
case 'O':
_prnt8(x); break;
case 'x':
case 'X':
_prntx(x); break;
case 'S':
case 's': s=x;
break;
case 'C':
case 'c': *_ptrbf++ = x&0777;
break;
case 'E':
case 'e':
case 'F':
case 'f':
dblptr = adx-1;
zz = *dblptr;
adx =+ 3;
ftoa (zz, buf, prec, c);
prec = 0;
s = buf;
break;
default: (*f)(c,fd);
adx--;
}
if (s == 0)
{*_ptrbf = '\0'; s = buf;}
n = _clenf (s);
n = (prec<n && prec != 0) ? prec : n;
m = width-n;
if (adj == 'r') while (m-- > 0) (*f)(padchar,fd);
while (n--) (*f)(*s++,fd);
while (m-- > 0) (*f)(padchar,fd);
_ptrbf = buf;
}
}
if(a1 == -1) (*f)('\0',fd);
}
_prnt8 (n)
{ /* print in octal */
int p, k, sw;
if (n==0) {*_ptrbf++ = '0'; return;}
sw = 0;
for (p=15; p >= 0; p =- 3)
if ((k = (n>>p)&07) || sw)
{
*_ptrbf++ = '0' + k;
sw = 1;
}
}
_prntx (n)
{
int d,a;
if (a = n>>4)
_prntx ( a & 07777);
d = n&017;
*_ptrbf++ = d > 9 ? 'A'+d-10 : '0' + d;
}
__conv()
{
auto c,n;
n = 0;
while( ((c = *__fmt++) >= '0') && (c<='9')) n = n*10+c-'0';
__fmt--;
return(n);
}
_putstr(chr,str){
*_ptrst++ = chr;
return; ieh305i(); /* force loading of dummy.s */
}
_prt1(n)
{
int digs[15], *dpt;
dpt = digs;
if (n >= 0)
n = -n;
else
*_ptrbf++ = '-';
for (; n != 0; n = n/10)
*dpt++ = n%10;
if (dpt == digs)
*dpt++ = 0;
while (dpt != digs)
{ --dpt;
*_ptrbf++ = '0' - *dpt;
}
}
+6
View File
@@ -0,0 +1,6 @@
putchar (c)
char c;
{
extern cout;
cputc(c,cout);
}
+13
View File
@@ -0,0 +1,13 @@
puts(str)
char *str;
{
auto char *p,c;
auto int f;
extern int cout;
if (nargs() != 1)
IEHzap("puts ");
p = str;
while( (c = *p++)!= '\0') cputc(c,cout);
cputc('\n',cout);
return(str);
}
+4
View File
@@ -0,0 +1,4 @@
relvec (ptr)
{
free(ptr);
}
+10
View File
@@ -0,0 +1,10 @@
# define bufflen 100
IEH3revp (c)
char c;
{
/* reversed line IEH3outputter */
extern char *IEH3outp, *IEH3outlim;
*IEH3outp++ = c;
if (IEH3outp > IEH3outlim+100)
IEH3err("unprint producing too many chars");
}
+39
View File
@@ -0,0 +1,39 @@
cc -c -O alloc.c
cc -c -O calloc.c
cc -c -O cclose.c
cc -c -O ceof.c
cc -c -O cerror.c
cc -c -O cexit.c
cc -c -O cflush.c
cc -c -O cfree.c
cc -c -O cgetc.c
cc -c -O ciodec.c
cc -c -O clenf.c
cc -c -O copen.c
cc -c -O cputc.c
cc -c -O cwrd.c
as dummy.s; mv a.out dummy.o
cc -c -f -O ftoa.c
cc -c -O getch.c
cc -c -O gets.c
cc -c -O getvec.c
cc -c -O iehzap.c
cc -c -O makbuf.c
cc -c -O maktab.c
cc -c -O nexch.c
cc -c -O nodig.c
cc -c -O printf.c
cc -c -O putch.c
cc -c -O puts.c
cc -c -O relvec.c
cc -c -O revput.c
cc -c -O scan1.c
cc -c -O scan2.c
cc -c -O scan3.c
cc -c -O system.c
cc -c -O tmpnam.c
cc -c -O unget.c
as unprnt.s; mv a.out unprnt.o
cc -c -O wdleng.c
ar r /lib/libp.a *.o
rm *.o
+149
View File
@@ -0,0 +1,149 @@
scanf (p1, p2, p3, p4)
int p1, p2, p3, p4;
{
/* first arg can be a control string, a file id, or -1 */
int ptrs[10], j, ip, flp, k;
char *np;
/* extern int cin;*/
extern (*_Igetc)(), (*_Iungc)(), cgetc(), ungetc(), _Igstr(), _Iungs();
extern char *_Iinpt;
ip = 0;
if (p1 == -1)
{k = 1; _Iinpt = p2;}
else if (p1 >= 0 && p1 < 10)
k = 0;
else
k = -1;
if (k <= 0)
{_Igetc = cgetc; _Iungc = ungetc;}
else
{_Igetc = _Igstr; _Iungc = _Iungs;}
j = 0;
for (np = (&p2)[k]; *np; np++)
if (*np == '%' && *(np+1) != '%' && *(np+1) != '*')
ptrs[ip++] = (&p3)[(j++)+k];
return (_Iscan ((k==0 ? p1 : 0), (&p2)[k], ptrs));
}
_Iscan (fileid, format, listp)
char *format;
int *listp;
{
char ch, _Inxch();
int nmatch;
extern int _Isfil;
_Isfil = fileid;
nmatch = 0;
while (1) switch (ch= *format++)
{
case '\0': return (nmatch);
case '%': switch (_Isfrm(&format, *listp++))
{
case 0: listp--; break;
case -1: return (nmatch > 0 ? nmatch : -1);
default: nmatch++;
}
case ' ':
case '\n':
case '\t': break;
default: if (ch != _Inxch())
return(nmatch);
}
}
int _Isfil 0;
_Ichar (cptr)
char *cptr;
{
char ch, _Inxch();
if ((ch = _Inxch()) < 0)
return (-1);
if (cptr == 0)
return (0);
*cptr = ch;
return (1);
}
_Iflot (fptr, length)
float *fptr;
int length;
{
char temp[75];
int _Inodg();
float x;
double atof();
if (_Isstr(temp, length, _Inodg) < 0)
return (-1);
x = atof(temp);
if (fptr == 0)
return (0);
*fptr = x;
return (1);
}
_Inodg (ch)
char ch;
{
if (_Idigt(ch,10) >= 0) return (0);
switch (ch)
{
case 'E':
case 'e':
case '.': case '+': case '-':
return (0);
}
return (1);
}
_Isfrm (spec, pointer)
char **spec;
int pointer;
{
int length, lflag, _Iestr(), _Ispnd();
char ch;
length = lflag = 0;
while (1) switch (ch = *((*spec)++))
{
case '*': pointer=0; break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
length = length*10 + ch - '0' ;
lflag++;
break;
case 'o': /* octal */
return(_Iint(pointer, lflag ? length : 100, 8));
case 'x': /* hex */
return(_Iint(pointer, lflag ? length : 100, 16));
case 'd': /* decimal */
return (_Iint(pointer, lflag ? length : 100, 10));
case 'c': /* character */
return (_Ichar(pointer));
case 's': /* string */
return (_Isstr(pointer, lflag ? length : 100, _Iestr));
case 'f':
case 'e': /* float */
return (_Iflot(pointer, lflag ? length : 100));
case 'l': /* (long) double or int */
switch(*(*spec)++)
{
case 'f': case 'F':
case 'e': case 'E':
return (_Ilong (pointer, lflag ? length : 100));
default: printf(2, "long not yet implemented\n");
return(0);
}
case '[': /* special strings */
_Imtab(spec);
return (_Isstr (pointer, lflag ? length : 100, _Ispnd));
case '%':
if (_Inxch() != '%')
return (-1);
return(0);
case '\0':
_Ierr("scanf: bad format termination\n");
default: _Ierr ("scanf: format character %c", ch);
}
}
+111
View File
@@ -0,0 +1,111 @@
_Iint (iptr, length, numbase)
int *iptr, length;
{
int n, minus, numdig;
extern int _Isfil, (*_Iungc)(), (*_Igetc)();
int c, dval;
n = minus = numdig = 0;
switch ((c=_Inxch()))
{
case '-': minus = 1;
case '+': break;
default: (*_Iungc)(c,_Isfil);
}
while ((dval=_Idigt(c=((*_Igetc)(_Isfil)), numbase ) ) >= 0 && numdig++ < length)
n = n*numbase + dval;
(*_Iungc)(c,_Isfil);
if (numdig == 0)
return (-1);
if (iptr == 0)
return (0);
*iptr = minus ? -n : n;
return (1);
}
_Idigt (x, base)
{
switch (x)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
return(x-'0');
case '8':
case '9':
if (base > 8)
return(x - '0');
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
if (base >10)
return(x - 'a' + 10);
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
if (base > 10)
return(x-'A' + 10);
}
return(-1);
}
_Ilong (dptr, length)
double *dptr;
int length;
{
char temp[75];
int _Inodg();
double x;
double atof();
if (_Isstr(temp, length, _Inodg) < 0)
return (-1);
x = atof(temp);
if (dptr == 0)
return (0);
*dptr = x;
return (1);
}
_Isstr (sptr, length, stopf)
char *sptr;
int length, (*stopf)();
{
int ch, initlen, _Inxch();
extern int _Isfil, (*_Igetc)(), (*_Iungc)();
initlen = length;
if ((ch=_Inxch()) < 0)
return (-1);
(*_Iungc)(ch,_Isfil);
while (!((*stopf)(ch=(*_Igetc)(_Isfil))) && length-- > 0)
if (sptr != 0)
*(sptr++) = ch;
if (ch >= 0)
(*_Iungc)(ch,_Isfil);
if (length == initlen)
return (-1);
if (sptr == 0)
return (0);
*sptr = '\0';
return (1);
}
_Iestr (c)
char c;
{
if (_Ispce(c)) return (1);
if (c == '\0') return (1);
return (0);
}
+69
View File
@@ -0,0 +1,69 @@
_Ierr (message, a, b, c, d, e)
char message[];
{
extern int cgoof;
printf("ERROR ");
printf(message, a, b, c, d, e);
cputc('\n');
cexit(cgoof);
}
char _Iendm[128] {0};
_Imtab (formatp)
char **formatp;
{
/* make up special table of string ending characters */
int i, normal;
char ch;
/* normally all characters end string except those listed */
normal = 1;
if (**formatp == '^')
{normal = 0; (*formatp)++;}
for (i= 0; i < 128; i++)
_Iendm[i] = normal;
while ((ch = *((*formatp)++)) != ']')
_Iendm[ch] = !_Iendm[ch];
}
_Inxch ()
/* returns next character which is not _Ispce */
{
extern int _Isfil, (*_Igetc)();
int ch;
while ((ch = (*_Igetc)(_Isfil)) > 0 && _Ispce(ch));
if (ch > 0)
return (ch);
return (-1);
}
_Ispce (c)
char c;
{
switch (c)
{
case ' ':
case '\n':
case '\t': return(1);
}
return(0);
}
_Ispnd (ch)
char ch;
{
return (_Iendm[ch] > 0);
}
char *_Iinpt;
int (*_Igetc)(), (*_Iungc)();
_Igstr ()
{
extern char *_Iinpt;
return (*_Iinpt++);
}
_Iungs(ch)
{
extern char *_Iinpt;
*--_Iinpt = ch;
}
+8
View File
@@ -0,0 +1,8 @@
system(str)
char *str;
{
int status;
if(fork() == 0)
execl("/bin/sh", "sh", "-c", str, 0);
wait(&status);
}
+7
View File
@@ -0,0 +1,7 @@
int IEH0958g 0;
tmpnam(s)
char *s;
{
printf(-1,s,"pl%d%c",getpid(),'a'+IEH0958g++);
return(s);
}
+15
View File
@@ -0,0 +1,15 @@
# include "ciodec.c"
ungetc (c, fn)
{
struct fileps *fp;
if (nargs() != 2)
IEHzap("ungetc");
/* push back onto input */
fp = &IEH3fpts[fn];
if (fp->wrflag == 0)
IEH3mbuf(fn,0);
if (fp->bptr <= fp->buff - 100)
IEH3err("ungetc/unprintf: buffer full file %d",fn);
*--fp->bptr = c;
fp->nchars++;
}
+210
View File
@@ -0,0 +1,210 @@
/ C library -- unprintf
.globl _unprintf
.globl ndigix
.globl pfloat
.globl pscien
.globl _IEH3revp
.globl _IEH3bcko
_unprintf:
mov r5,-(sp)
mov sp,r5
mov 4(r5),formp / format
mov r5,r4
add $6,r4 / arglist
sub $128.,sp / buffer
loop:
movb *formp,r0
beq 1f
inc formp
cmp r0,$'%
beq 2f
3:
mov r4,-(sp)
mov r0,-(sp)
jsr pc,*$_IEH3revp
tst (sp)+
mov (sp)+,r4
br loop
1:
add $128.,sp
mov (sp)+,r5
jsr pc,_IEH3bcko
rts pc
2:
clr rjust
clr ndigix
cmpb *formp,$'-
bne 2f
inc formp
inc rjust
2:
jsr r3,gnum; width
clr ndfnd
cmp r0,$'.
bne 1f
jsr r3,gnum; ndigix
1:
mov sp,r3
mov $swtab,r1
1:
mov (r1)+,r2
beq 3b
cmp r0,(r1)+
bne 1b
jmp (r2)
swtab:
decimal; 'd
octal; 'o
float; 'f
scien; 'e
charac; 'c
string; 's
logical; 'l
0; 0
decimal:
mov (r4)+,r1
bge 1f
neg r1
movb $'-,(r3)+
br 1f
logical:
mov (r4)+,r1
1:
jsr pc,1f
br prbuf
1:
clr r0
div $10.,r0
mov r1,-(sp)
mov r0,r1
beq 1f
jsr pc,1b
1:
mov (sp)+,r0
add $'0,r0
movb r0,(r3)+
rts pc
charac:
movb (r4)+,(r3)+
bne 1f
dec r3
1:
movb (r4)+,(r3)+
br prbuf
string:
mov ndigix,r1
1:
mov (r4)+,r2
1:
movb (r2)+,(r3)+
beq prbuf
sob r1,1b
br prbuf
octal:
mov (r4)+,r1
jsr pc,1f
br prbuf
1:
mov r1,-(sp)
beq 1f
ash $-3,r1
bic $!17777,r1
jsr pc,1b
1:
mov (sp)+,r0
bic $!7,r0
add $'0,r0
movb r0,(r3)+
rts pc
float:
mov ndfnd,r2
jsr pc,pfloat
br prbuf
scien:
mov ndfnd,r2
jsr pc,pscien
br prbuf
prbuf:
cmp r3,sp
blos 1f
tstb -1(r3)
bne 1f
dec r3
br prbuf
1:
mov sp,r2
mov r4,-(sp)
mov $' ,-(sp)
mov width,r1
sub r3,r1
clrb (r3)+
add r2,r1
mov r1,spaces
ble 1f
tst rjust
bne 1f
2:
jsr pc,*$_IEH3revp
dec spaces
bne 2b
1:
mov r2,bufp
1:
movb *bufp,(sp)
beq 1f
inc bufp
jsr pc,*$_IEH3revp
br 1b
1:
tst spaces
ble 1f
tst rjust
beq 1f
mov $' ,(sp)
2:
jsr pc,*$_IEH3revp
dec spaces
bne 2b
1:
tst (sp)+
mov (sp)+,r4
jmp loop
gnum:
clr ndfnd
clr r1
1:
movb *formp,r0
inc formp
sub $'0,r0
cmp r0,$9.
bhi 1f
inc ndfnd
mul $10.,r1
add r0,r1
br 1b
1:
add $'0,r0
mov r1,*(r3)+
rts r3
.bss
ndigix: .=.+2
width: .=.+2
formp: .=.+2
rjust: .=.+2
ndfnd: .=.+2
bufp: .=.+2
spaces: .=.+2
+10
View File
@@ -0,0 +1,10 @@
wdleng ()
/* returns number of bits in a machine integer */
/* written so kernighan can tell where he is running */
{
int k, leng;
k = leng = 1;
while (k =<< 1)
leng++;
return (leng);
}