Research V5 development
authorKen Thompson <ken@research.uucp>
Tue, 26 Nov 1974 23:13:21 +0000 (18:13 -0500)
committerKen Thompson <ken@research.uucp>
Tue, 26 Nov 1974 23:13:21 +0000 (18:13 -0500)
Work on file usr/source/s1/lpr.c
Work on file usr/source/s1/db1.s

Co-Authored-By: Dennis Ritchie <dmr@research.uucp>
Synthesized-from: v5

usr/source/s1/db1.s [new file with mode: 0644]
usr/source/s1/lpr.c [new file with mode: 0644]

diff --git a/usr/source/s1/db1.s b/usr/source/s1/db1.s
new file mode 100644 (file)
index 0000000..612cc22
--- /dev/null
@@ -0,0 +1,725 @@
+/ db1 -- debugger
+
+fpp = 1
+eae = 0
+ldfps = 170100^tst
+
+db:
+       mov     sp,r5
+       mov     (r5)+,r4
+       tst     (r5)+
+       cmp     r4,$2
+       blt     1f
+       mov     (r5),dbfile
+       mov     (r5),odbfil
+       mov     (r5)+,namfil
+       cmp     r4,$2
+       beq     1f
+       mov     (r5)+,namfil
+1:
+       sys     open; dbfile: core; 0
+       bec     9f
+       jmp     fnfnd
+9:
+       mov     r0,dbfin
+       clr     dbfout
+       sys     open; odbfil:core; 1
+       bes     1f
+       mov     r0,dbfout
+1:
+       sys     open; namfil: a.out; 0
+       bes     1f
+       mov     r0,r1
+       mov     r0,symfin
+       sys     read; nambuf; 20
+       cmp     nambuf,nobjmagic
+       beq     2f
+       cmp     nambuf,objmagic
+       bne     1f
+2:
+       mov     nambuf+2,r0     / text
+       add     nambuf+4,r0     / data
+       cmp     nambuf+16,$1    / relocation?
+       beq     6f
+       asl     r0              / sym origin
+6:
+       add     $20,r0
+       mov     r0,0f
+       mov     r1,r0
+       sys     seek; 0:..; 0
+       mov     nambuf+10,r0    / symbol size
+       cmp     r0,$maxsym
+       blos    3f
+       mov     $maxsym,r0
+3:
+       add     r0,0f
+       sys     break; 0: nambuf
+       mov     r0,0f
+       mov     r1,r0
+       sys     read; nambuf; 0:..
+       add     $nambuf,r0
+       mov     r0,namsiz
+1:
+       jsr     r5,get; zero    / test new object
+       cmp     r0,nobjmagic
+       beq     2f
+       cmp     r0,objmagic
+       bne     1f
+2:
+       mov     $20,getoff
+1:
+       mov     sp,savsp
+       sys     signal; 2; 1
+       ror     r0
+       bcs     1f
+       sys     signal; 2; errexit
+1:
+       cmp     r4,$2           / arg count
+       beq     9f              / not core image
+       cmp     r4,$4           / no-core image flag
+       beq     9f
+       mov     $1024.,getoff
+       mov     dbfin,r0
+       sys     seek; 0; 0
+       mov     dbfin,r0
+       sys     read; regbuf; 1024.
+       mov     txtsiz,r0
+       ash     $6,r0
+       mov     r0,txtsiz
+       add     $17777,r0
+       bic     $17777,r0
+       mov     r0,rtxtsiz
+       mov     datsiz,r0
+       ash     $6,r0
+       mov     r0,datsiz
+       mov     stksiz,r0
+       ash     $6,r0
+       mov     r0,stksiz
+       mov     *locfpsr,r0
+       bic     $!200,r0
+       mov     r0,fpsr
+       br      loop
+9:
+loop:
+       clr     error
+       jsr     pc,readlin
+       jsr     pc,readexp
+       tst     error
+       bne     errexit
+       mov     $1,count
+       cmpb    r0,$',
+       bne     2f
+       movb    (r4)+,r0
+       mov     addres,-(sp)
+       mov     adrflg,-(sp)
+       jsr     pc,readexp
+       mov     addres,count
+       mov     (sp)+,adrflg
+       mov     (sp)+,addres
+       tst     error
+       bne     errexit
+2:
+       movb    (r4),r0
+       jsr     pc,command
+       tst     error
+       beq     loop
+errexit:
+       sys     signal; 2; errexit
+       mov     savsp,sp
+       jsr     r5,mesg; <?\n\0>; .even
+       br      loop
+
+fnfnd:
+       jsr     r5,mesg; <File not found.\n\0>; .even
+ex:
+       sys     exit
+
+readlin:
+       mov     $inbuf,r4
+1:
+       mov     ttyfin,r0
+       sys     read; ch; 1
+       tst     r0
+       beq     ex
+       cmpb    ch,$'\n
+       beq     1f
+       movb    ch,(r4)+
+       br      1b
+1:
+       clrb    (r4)
+       mov     $inbuf,r4
+       rts     pc
+
+switch:
+       mov     (r5)+,r1
+2:
+       cmp     r0,(r1)+
+       bne     1f
+       tst     (sp)+
+       jmp     *(r1)
+1:
+       tst     (r1)+
+       bne     2b
+       rts     r5
+
+readexp:
+       mov     $'+,lastop
+       clr     addres
+       clr     starmod
+       clr     taddr
+       clr     adrflg
+nextxp:
+       movb    (r4)+,r0
+       cmp     r0,$'0
+       blt     1f
+       cmp     r0,$'9
+       ble     numin
+       cmp     r0,$'a
+       blt     1f
+       cmp     r0,$'z
+       bgt     1f
+       jmp     letin
+1:
+       cmp     r0,$'a-40
+       blt     1f
+       cmp     r0,$'z-40
+       ble     letin
+1:
+       jsr     r5,switch; expsw
+       tstb    -(r4)
+       tst     starmod
+       beq     1f
+       mov     dot,taddr
+       br      operand
+1:
+       rts     pc
+
+expsw:
+       '+;     opex
+       '-;     opex
+       ' ;     nextxp
+       '.;     letin
+       '_;     letin
+       '^;     circumf
+       '*;     star
+       -1;     0
+
+star:
+       mov     pc,starmod
+       br      nextxp
+
+operand:
+       inc     adrflg
+       tst     starmod
+       beq     1f
+       clr     starmod
+       bis     bytemod,error
+       jsr     r5,get; taddr
+       tst     error
+       bne     1f
+       mov     r0,taddr
+1:
+       cmp     lastop,$'+
+       beq     1f
+       sub     taddr,addres
+       br      2f
+1:
+       add     taddr,addres
+2:
+       mov     $'+,lastop
+       br      nextxp
+
+circumf:
+       mov     dot,taddr
+       dec     taddr
+       tst     bytemod
+       bne     operand
+       dec     taddr
+       br      operand
+
+numin:
+       clr     r1
+       clr     r3
+1:
+       sub     $'0,r0
+       asl     r1
+       asl     r1
+       asl     r1
+       mpy     $10.,r3
+       bis     r0,r1
+       add     r0,r3
+       movb    (r4)+,r0
+       cmp     r0,$'0
+       blo     1f
+       cmp     r0,$'9
+       blos    1b
+1:
+       cmp     r0,$'.
+       bne     1f
+       mov     r3,r1
+       inc     r4
+1:
+       mov     r1,taddr
+       dec     r4
+       br      operand
+
+letin:
+       dec     r4
+       mov     $nambuf,namstrt
+letin1:
+       mov     $symbol,r1
+       clr     (r1)+
+       clr     (r1)+
+       clr     (r1)+
+       clr     (r1)
+       mov     $symbol,r1
+       mov     $8.,-(sp)
+       br      2f
+1:
+       tstb    (r4)+
+       cmpb    (r4),$'.
+       beq     2f
+       cmpb    (r4),$'0
+       blo     3f
+       cmpb    (r4),$'9
+       blos    2f
+       cmpb    (r4),$'A
+       blo     3f
+       cmpb    (r4),$'Z
+       blos    2f
+       cmpb    (r4),$'_
+       beq     2f
+       cmpb    (r4),$'a
+       blo     3f
+       cmpb    (r4),$'z
+       bhi     3f
+2:
+       dec     (sp)
+       blt     1b
+       movb    (r4),(r1)+
+       br      1b
+3:
+       tst     (sp)+
+       jsr     pc,lookupn
+       tst     error
+       bne     1f
+       cmpb    (r4),$';
+       beq     2f
+1:
+       jmp     operand
+2:
+       tstb    (r4)+
+       mov     r1,namstrt
+       br      letin1
+
+opex:
+       mov     r0,lastop
+       jmp     nextxp
+
+
+command:
+       jsr     r5,switch; comsw
+       inc     error
+       rts     pc
+
+comsw:
+       '/;     slash
+       '\\;    bslash
+       '?;     quest
+       '\0;    newln
+       '^;     circumf
+       '=;     equal
+       ':;     colon
+       '!;     excla
+       '';     squote
+       '";     dquote
+       '$;     dolr
+       '&;     amper
+       '%;     ex
+       '`;     grave
+       -1;     0
+
+dolr:
+       mov     sigp,r1
+       bic     $!17,r1
+       asl     r1
+       mov     traptab(r1),r1
+       jsr     pc,string
+       jsr     pc,pnl
+       mov     $doltab,r5
+1:
+       mov     (r5)+,r1
+       beq     1f
+       jsr     pc,*(r5)+
+       br      1b
+       .if     fpp
+1:
+       mov     (r5)+,r1
+       beq     1f
+       ldfps   fpsr
+       jsr     pc,*(r5)+
+       br      1b
+1:
+       mov     (r5)+,r1
+       jsr     pc,*(r5)+
+       .endif
+1:
+       rts     pc
+
+traptab:
+       1f; .data; 1:<?0\0>; .text
+       1f; .data; 1:<Hangup\0>; .text
+       1f; .data; 1:<Interrupt\0>; .text
+       1f; .data; 1:<Quit\0>; .text
+       1f; .data; 1:<Illegal instruction\0>; .text
+       1f; .data; 1:<Trace/BPT\0>; .text
+       1f; .data; 1:<IOT\0>; .text
+       1f; .data; 1:<EMT\0>; .text
+       1f; .data; 1:<FP exception\0>; .text
+       1f; .data; 1:<Killed\0>; .text
+       1f; .data; 1:<Bus error\0>; .text
+       1f; .data; 1:<Segmentation violation\0>; .text
+       1f; .data; 1:<Bad system call\0>; .text
+       1f; .data; 1:<?15\0>; .text
+       1f; .data; 1:<?16\0>; .text
+       1f; .data; 1:<?17\0>; .text
+
+locps: regbuf+1776
+locpc: regbuf+1774
+locr0: regbuf+1772
+locr1: regbuf+1766
+locr2: regbuf+1750
+locr3: regbuf+1752
+locr4: regbuf+1754
+locsp: regbuf+1764
+locr5: regbuf+1756
+locfpsr: regbuf+4
+locfr0:        regbuf+6
+locfr4:        regbuf+16
+locfr5:        regbuf+26
+locfr1:        regbuf+36
+locfr2:        regbuf+46
+locfr3:        regbuf+56
+
+doltab:
+       1f; prgreg; locsp; .data; 1:<sp \0>; .text
+       1f; proct; locps; .data; 1:<ps  \0>; .text
+       1f; prgreg; locpc; .data; 1:<pc \0>; .text
+       1f; prgreg; locr0; .data; 1:<r0 \0>; .text
+       1f; prgreg; locr1; .data; 1:<r1 \0>; .text
+       1f; prgreg; locr2; .data; 1:<r2 \0>; .text
+       1f; prgreg; locr3; .data; 1:<r3 \0>; .text
+       1f; prgreg; locr4; .data; 1:<r4 \0>; .text
+       1f; prgreg; locr5; .data; 1:<r5 \0>; .text
+       0
+       .if     fpp
+       1f; prfreg; locfr0; .data; 1:<fr0       \0>; .text
+       1f; prfreg; locfr1; .data; 1:<fr1       \0>; .text
+       1f; prfreg; locfr2; .data; 1:<fr2       \0>; .text
+       1f; prfreg; locfr3; .data; 1:<fr3       \0>; .text
+       1f; prfreg; locfr4; .data; 1:<fr4       \0>; .text
+       1f; prfreg; locfr5; .data; 1:<fr5       \0>; .text
+       0
+       1f; proct; locfpsr; .data; 1:<fpsr      \0>; .text
+       .endif
+.data
+.even
+.text
+
+       .if     fpp
+prfreg:
+       mov     *(r5)+,r4
+       movf    (r4),fr0
+       cfcc
+       beq     1f
+       jsr     pc,string
+       jsr     pc,printf
+       jsr     pc,pnl
+1:
+       rts     pc
+       .endif
+
+prgreg:
+       jsr     pc,string
+       mov     *(r5)+,r4
+       mov     (r4),r0
+       jsr     pc,printo
+       mov     (r4),r0
+       jsr     pc,lookupv
+       tst     r2
+       beq     1f
+       jsr     r5,mesg; <      \0>; .even
+       mov     (r4),r0
+       jsr     pc,pname
+1:
+       jsr     pc,pnl
+       rts     pc
+
+proct:
+       jsr     pc,string
+       mov     *(r5)+,r4
+       mov     (r4),r0
+       jsr     pc,printo
+       jsr     pc,pnl
+       rts     pc
+
+string:
+       movb    (r1)+,r0
+       beq     1f
+       jsr     pc,putc
+       br      string
+1:
+       rts     pc
+
+putc:
+       mov     r0,och
+       mov     $1,r0
+       sys     write; och; 1
+       rts     pc
+
+equal:
+       jsr     r5,coleq; printo
+       rts     pc
+amper:
+       clr     bytemod
+       mov     $2,incdot
+       jsr     r5,cycle; asymp
+       rts     pc
+
+asymp:
+       jsr     pc,pname
+       jsr     pc,pnl
+       rts     pc
+
+bslash:
+       inc     bytemod
+       mov     $1,incdot
+       br      1f
+
+slash:
+       clr     bytemod
+       mov     $2,incdot
+1:
+       jsr     r5,cycle; octp
+       rts     pc
+
+grave:
+       clr     bytemod
+       mov     $2,incdot
+       jsr     r5,cycle;  decp
+       rts     pc
+
+quest:
+       clr     bytemod
+       jsr     r5,cycle; psym
+       rts     pc
+
+decp:
+       jsr     pc,printd
+       jsr     r5,mesg; <.\n\0>; .even
+       rts     pc
+
+octp:
+       jsr     pc,printo
+       jsr     pc,pnl
+       rts     pc
+
+newln:
+       tst     adrflg
+       bne     1f
+       add     incdot,dot
+1:
+       mov     nlcom,r0
+       jmp     command
+
+excla:
+       tst     adrflg
+       bne     1f
+2:
+       inc     error
+       rts     pc
+1:
+       bit     $1,dot
+       beq     1f
+       tst     bytemod
+       beq     2b
+1:
+       jsr     r5,put; dot; addres
+       rts     pc
+
+squote:
+       inc     bytemod
+       mov     $1,incdot
+       br      2f
+dquote:
+       clr     bytemod
+       mov     $2,incdot
+2:
+       jsr     r5,cycle; ascp
+       rts     pc
+
+ascp:
+       mov     r0,-(sp)
+       jsr     pc,ascp1
+       mov     (sp)+,r0
+       tst     bytemod
+       bne     1f
+       swab    r0
+       jsr     pc,ascp1
+1:
+       cmp     count,$1
+       bgt     1f
+       jsr     pc,pnl
+1:
+       rts     pc
+
+ascp1:
+       bic     $!377,r0
+       cmp     r0,$'\n
+       beq     2f
+       cmp     r0,$011
+       beq     2f
+       cmp     r0,$40
+       blo     1f
+       cmp     r0,$177
+       bhis    1f
+2:
+       jsr     pc,putc
+       rts     pc
+1:
+       mov     r0,r1
+       jsr     r5,mesg; <\\\0>
+       clr     r0
+       alsc    $10.,r0
+       add     $'0,r0
+       jsr     pc,putc
+       clr     r0
+       alsc    $3,r0
+       add     $'0,r0
+       jsr     pc,putc
+       clr     r0
+       alsc    $3,r0
+       add     $'0,r0
+       jsr     pc,putc
+       rts     pc
+
+colon:
+       jsr     r5,coleq; pname
+       rts     pc
+
+coleq:
+       jsr     pc,setadr
+       mov     addres,r0
+       jsr     pc,*(r5)+
+       jsr     pc,pnl
+       rts     r5
+
+cycle:
+       mov     r0,nlcom
+       jsr     pc,setadr
+       mov     addres,dot
+       tst     bytemod
+       bne     1f
+       bic     $1,dot
+1:
+       jsr     r5,get; dot
+       tst     error
+       bne     1f
+       tst     bytemod
+       beq     2f
+       bic     $!377,r0
+2:
+       jsr     pc,*(r5)
+       tst     error
+       bne     1f
+       dec     count
+       ble     1f
+       add     incdot,dot
+       br      1b
+1:
+       tst     (r5)+
+       rts     r5
+
+setadr:
+       tst     adrflg
+       bne     1f
+       mov     dot,addres
+1:
+       rts     pc
+
+       .if     fpp
+printf:
+       ldfps   $200            / round+double
+       mov     r4,-(sp)
+       mov     r3,-(sp)
+       movif   $10.,r3
+       movif   $1,r2
+       clr     r4
+       tstf    r0
+       cfcc
+       beq     2f
+       bge     1f
+       negf    r0
+       mov     $'-,r0
+       jsr     pc,putc
+1:
+       cmpf    r3,r0
+       cfcc
+       bgt     1f
+       inc     r4
+       divf    r3,r0
+       br      1b
+1:
+       cmpf    r2,r0
+       cfcc
+       ble     2f
+       dec     r4
+       mulf    r3,r0
+       br      1b
+2:
+       modf    r2,r0
+       movfi   r1,r0
+       add     $'0,r0
+       jsr     pc,putc
+       mov     $'.,r0
+       jsr     pc,putc
+       mov     $8.,r3
+1:
+       modf    r3,r0
+       movfi   r1,r0
+       add     $'0,r0
+       jsr     pc,putc
+       dec     r3
+       bgt     1b
+       mov     $'E,r0
+       jsr     pc,putc
+       mov     r4,r0
+       mov     (sp)+,r3
+       mov     (sp)+,r4
+       br      printd
+       .endif
+
+printd:
+       mov     r1,-(sp)
+       mov     r0,r1
+       bpl     1f
+       neg     r1
+       mov     $'-,r0
+       jsr     pc,putc
+1:
+       jsr     pc,1f
+       mov     (sp)+,r1
+       rts     pc
+1:
+       clr     r0
+       dvd     $10.,r0
+       mov     r1,-(sp)
+       mov     r0,r1
+       beq     1f
+       jsr     pc,1b
+1:
+       mov     (sp)+,r0
+       add     $'0,r0
+       jsr     pc,putc
+       rts     pc
+
diff --git a/usr/source/s1/lpr.c b/usr/source/s1/lpr.c
new file mode 100644 (file)
index 0000000..736877e
--- /dev/null
@@ -0,0 +1,203 @@
+/*
+ *     lpr -- spool printout for online printer.
+ *             normally invoked through opr
+ */
+
+char   *tfname;
+int    nact;
+int    tff;
+int    first;
+int    mailflg;
+char   person[10];
+
+main(argc, argv)
+int argc;
+char *argv[];
+{
+       register char *arg;
+       int c, f, flag;
+
+       flag = 0;
+       tfname = ranname("/usr/lpd/tfxxx");
+       if(tfname)
+               tff = creat(tfname, 0666); else
+               tff = -1;
+       if(tff < 0) {
+               printf("Cannot create in /usr/lpd\n");
+               exit();
+       }
+       while (argc>1 && (arg = argv[1])[0]=='-') {
+               switch (arg[1]) {
+
+               case 'c':
+                       flag = '+';
+                       break;
+
+               case 'r':
+                       flag = '-';
+                       break;
+
+               case 'm':
+                       mailflg = 1;
+                       break;
+               }
+               argc--;
+               argv++;
+       }
+       ident();
+       if(argc == 1)
+               copy(0);
+       while(--argc) {
+               arg = *++argv;
+               if(flag == '+')
+                       goto cf;
+               if(*arg == '/' && flag != '-') {
+                       card('F', arg);
+                       nact++;
+                       continue;
+               }
+               f = ranname("/usr/lpd/lfxxx");
+               if(f) {
+                       if(link(arg, f))
+                               goto cf;
+                       card('F', f);
+                       card('U', f);
+                       nact++;
+                       goto df;
+               }
+       cf:
+               f = open(arg, 0);
+               if(f < 0) {
+                       printf("Cannot open %s\n", arg);
+                       continue;
+               }
+               copy(f);
+               close(f);
+       df:
+               if(flag == '-') {
+                       f = unlink(arg);
+                       if(f < 0)
+                               printf("Cannot remove %s\n", arg);
+               }
+       }
+
+       if(nact) {
+               f = ranname("/usr/lpd/dfxxx");
+               if(f)
+                       link(tfname, f); else
+                       printf("Cannot rename in /usr/lpd\n");
+               unlink(tfname);
+               execl("/etc/lpd", "lpd", 0);
+       }
+       unlink(tfname);
+}
+
+copy(f)
+int f;
+{
+       int fn, ff, i, nr, nc;
+       static int buf[256];
+
+       fn = ranname("/usr/lpd/cfxxx");
+       if(fn)
+               ff = creat(fn, 0666); else
+               ff = -1;
+       if(ff < 0) {
+               printf("Cannot create in /usr/lpd\n");
+               return;
+       }
+       nc = 0;
+       nr = 0;
+       while((i = read(f, buf, 512)) > 0) {
+               write(ff, buf, i);
+               nc =+ i;
+               if(nc >= 512) {
+                       nc =- 512;
+                       nr++;
+                       if(nr > 400) {
+                               printf("Copy file is too large\n");
+                               break;
+                       }
+               }
+       }
+       close(ff);
+       card('F', fn);
+       card('U', fn);
+       nact++;
+}
+
+card(c, s)
+int c;
+char s[];
+{
+       char *p1, *p2;
+       static char buf[512];
+       int col;
+
+       p1 = buf;
+       p2 = s;
+       col = 0;
+       *p1++ = c;
+       while((c = *p2++) != '\0') {
+               *p1++ = c;
+               col++;
+       }
+       *p1++ = '\n';
+       write(tff, buf, col+2);
+}
+
+ident()
+{
+       int c, n;
+       register char *b1p, *pp, *b2p;
+       static char b1[100], b2[100];
+
+       b1p = b1;
+       if(getpw(getuid(), b1p)) {
+               b1p = "pdp::::m0000,m000:";
+       }
+       n = 0;
+       b2p = b2;
+       while(*b2p++ = "$       ident   "[n++]);
+       b2p--;
+       n = 5;
+       while(--n) while(*b1p++ != ':');
+       while((*b2p++ = *b1p++) != ':');
+       b2p[-1] = ',';
+       b1p = b1;
+       pp = person;
+       while((c = *b1p++) != ':') {
+               *b2p++ = c;
+               *pp++ = c;
+       }
+       *b2p++ = 0;
+       *pp++ = 0;
+       card('L', b2);
+}
+
+ranname(s)
+char s[];
+{
+       static int buf[20];
+
+loop:
+       s[11] = ranc();
+       s[12] = ranc();
+       s[13] = ranc();
+       if(stat(s, buf))
+               return(s);
+       goto loop;
+}
+
+ranc()
+{
+       int buf[2], c;
+
+       if(!first) {
+               time(buf);
+               srand(buf[1]);
+               first++;
+       }
+       c = rand();
+       return(((c>>11)%10)+'0');
+}