Research V7 development
authorDennis Ritchie <dmr@research.uucp>
Wed, 10 Jan 1979 19:59:44 +0000 (14:59 -0500)
committerDennis Ritchie <dmr@research.uucp>
Wed, 10 Jan 1979 19:59:44 +0000 (14:59 -0500)
Work on file usr/src/libc/gen/swab.c
Work on file usr/src/libc/gen/ctype_.c
Work on file usr/src/libc/gen/tell.c
Work on file usr/src/libc/gen/index.c
Work on file usr/src/libc/gen/strncmp.c
Work on file usr/src/libc/gen/strcat.c
Work on file usr/src/libc/gen/rindex.c
Work on file usr/src/libc/gen/strncpy.c
Work on file usr/src/libc/gen/strcmp.c
Work on file usr/src/libc/gen/strncat.c
Work on file usr/src/libc/crt/aldiv.s
Work on file usr/src/libc/gen/strcpy.c
Work on file usr/src/libc/gen/strlen.c
Work on file usr/src/libc/crt/almul.s
Work on file usr/src/libc/crt/cerror.s
Work on file usr/src/libc/crt/alrem.s
Work on file usr/src/libc/crt/ldiv.s
Work on file usr/src/libc/crt/lmul.s
Work on file usr/src/libc/crt/lrem.s
Work on file usr/src/libc/crt/csv.s
Work on file usr/src/libc/crt/mcount.s
Work on file usr/src/libc/csu/fcrt0.s
Work on file usr/src/libc/csu/fmcrt0.s
Work on file usr/src/libc/csu/crt0.s
Work on file usr/src/libc/sys/utime.s
Work on file usr/src/libc/csu/mcrt0.s
Work on file usr/src/libc/sys/access.s
Work on file usr/src/libc/sys/acct.s
Work on file usr/src/libc/sys/chdir.s
Work on file usr/src/libc/sys/chroot.s
Work on file usr/src/libc/sys/alarm.s
Work on file usr/src/libc/sys/close.s
Work on file usr/src/libc/sys/chmod.s
Work on file usr/src/libc/sys/chown.s
Work on file usr/src/libc/sys/dup.s
Work on file usr/src/libc/sys/execl.s
Work on file usr/src/libc/sys/creat.s
Work on file usr/src/libc/sys/execv.s
Work on file usr/src/libc/sys/execle.s
Work on file usr/src/libc/sys/fork.s
Work on file usr/src/libc/sys/exit.s
Work on file usr/src/libc/sys/fstat.s
Work on file usr/src/libc/sys/execve.s
Work on file usr/src/libc/sys/getpid.s
Work on file usr/src/libc/sys/getgid.s
Work on file usr/src/libc/sys/ioctl.s
Work on file usr/src/libc/sys/kill.s
Work on file usr/src/libc/sys/getuid.s
Work on file usr/src/libc/sys/lseek.s
Work on file usr/src/libc/sys/mknod.s
Work on file usr/src/libc/sys/link.s
Work on file usr/src/libc/sys/mount.s
Work on file usr/src/libc/sys/nice.s
Work on file usr/src/libc/sys/pipe.s
Work on file usr/src/libc/sys/open.s
Work on file usr/src/libc/sys/pause.s
Work on file usr/src/libc/sys/profil.s
Work on file usr/src/libc/sys/ptrace.s
Work on file usr/src/libc/sys/read.s
Work on file usr/src/libc/sys/setgid.s
Work on file usr/src/libc/sys/setuid.s
Work on file usr/src/libc/sys/sbrk.s
Work on file usr/src/libc/sys/stat.s
Work on file usr/src/libc/sys/signal.s
Work on file usr/src/libc/sys/stime.s
Work on file usr/src/libc/sys/sync.s
Work on file usr/src/libc/sys/time.s
Work on file usr/src/libc/sys/umask.s
Work on file usr/src/libc/sys/times.s
Work on file usr/src/libc/sys/umount.s
Work on file usr/src/libc/sys/write.s
Work on file usr/src/libc/sys/unlink.s
Work on file usr/src/libc/sys/wait.s
Work on file usr/src/libc/sys/phys.s
Work on file usr/src/libc/sys/lock.s
Work on file usr/src/libc/stdio/doprnt.s
Work on file usr/src/libc/stdio/getgrgid.c
Work on file usr/src/libc/stdio/getgrnam.c
Work on file usr/src/libc/stdio/getpwnam.c
Work on file usr/src/libc/stdio/getpass.c
Work on file usr/src/libc/stdio/getgrent.c
Work on file usr/src/libc/stdio/getpwuid.c
Work on file usr/src/libc/stdio/getpwent.c
Work on file usr/src/libc/stdio/fgetc.c
Work on file usr/src/libc/stdio/getchar.c
Work on file usr/src/libc/stdio/fputc.c
Work on file usr/src/libc/stdio/putchar.c
Work on file usr/src/libc/stdio/popen.c
Work on file usr/src/libc/stdio/getpw.c
Work on file usr/src/libc/stdio/fgets.c
Work on file usr/src/libc/stdio/fputs.c
Work on file usr/src/libc/stdio/rdwr.c
Work on file usr/src/libc/stdio/system.c
Work on file usr/src/libc/stdio/scanf.c
Work on file usr/src/libc/stdio/doscan.c
Work on file usr/src/libc/stdio/fprintf.c
Work on file usr/src/libc/stdio/getw.c
Work on file usr/src/libc/stdio/printf.c
Work on file usr/src/libc/stdio/gets.c
Work on file usr/src/libc/stdio/puts.c
Work on file usr/src/libc/stdio/sprintf.c
Work on file usr/src/libc/stdio/putw.c
Work on file usr/src/libc/stdio/setbuf.c
Work on file usr/src/libc/stdio/ungetc.c
Work on file usr/src/libc/stdio/gcvt.c
Work on file usr/src/libc/stdio/strout.c
Work on file usr/src/libc/stdio/data.c
Work on file usr/src/libc/stdio/clrerr.c
Work on file usr/src/libc/stdio/ffltpr.s
Work on file usr/src/libc/stdio/fltpr.s
Work on file usr/src/libc/v6/access.c
Work on file usr/src/libc/v6/syscall.s
Work on file usr/src/libc/v6/gtty.c
Work on file usr/src/libc/v6/chown.c
Work on file usr/src/libc/v6/ftime.c
Work on file usr/src/libc/v6/execl.c
Work on file usr/src/libc/v6/stat.c
Work on file usr/src/libc/v6/lseek.c

Synthesized-from: v7

118 files changed:
usr/src/libc/crt/aldiv.s [new file with mode: 0644]
usr/src/libc/crt/almul.s [new file with mode: 0644]
usr/src/libc/crt/alrem.s [new file with mode: 0644]
usr/src/libc/crt/cerror.s [new file with mode: 0644]
usr/src/libc/crt/csv.s [new file with mode: 0644]
usr/src/libc/crt/ldiv.s [new file with mode: 0644]
usr/src/libc/crt/lmul.s [new file with mode: 0644]
usr/src/libc/crt/lrem.s [new file with mode: 0644]
usr/src/libc/crt/mcount.s [new file with mode: 0644]
usr/src/libc/csu/crt0.s [new file with mode: 0644]
usr/src/libc/csu/fcrt0.s [new file with mode: 0644]
usr/src/libc/csu/fmcrt0.s [new file with mode: 0644]
usr/src/libc/csu/mcrt0.s [new file with mode: 0644]
usr/src/libc/gen/ctype_.c [new file with mode: 0644]
usr/src/libc/gen/index.c [new file with mode: 0644]
usr/src/libc/gen/rindex.c [new file with mode: 0644]
usr/src/libc/gen/strcat.c [new file with mode: 0644]
usr/src/libc/gen/strcmp.c [new file with mode: 0644]
usr/src/libc/gen/strcpy.c [new file with mode: 0644]
usr/src/libc/gen/strlen.c [new file with mode: 0644]
usr/src/libc/gen/strncat.c [new file with mode: 0644]
usr/src/libc/gen/strncmp.c [new file with mode: 0644]
usr/src/libc/gen/strncpy.c [new file with mode: 0644]
usr/src/libc/gen/swab.c [new file with mode: 0644]
usr/src/libc/gen/tell.c [new file with mode: 0644]
usr/src/libc/stdio/clrerr.c [new file with mode: 0644]
usr/src/libc/stdio/data.c [new file with mode: 0644]
usr/src/libc/stdio/doprnt.s [new file with mode: 0644]
usr/src/libc/stdio/doscan.c [new file with mode: 0644]
usr/src/libc/stdio/ffltpr.s [new file with mode: 0644]
usr/src/libc/stdio/fgetc.c [new file with mode: 0644]
usr/src/libc/stdio/fgets.c [new file with mode: 0644]
usr/src/libc/stdio/fltpr.s [new file with mode: 0644]
usr/src/libc/stdio/fprintf.c [new file with mode: 0644]
usr/src/libc/stdio/fputc.c [new file with mode: 0644]
usr/src/libc/stdio/fputs.c [new file with mode: 0644]
usr/src/libc/stdio/gcvt.c [new file with mode: 0644]
usr/src/libc/stdio/getchar.c [new file with mode: 0644]
usr/src/libc/stdio/getgrent.c [new file with mode: 0644]
usr/src/libc/stdio/getgrgid.c [new file with mode: 0644]
usr/src/libc/stdio/getgrnam.c [new file with mode: 0644]
usr/src/libc/stdio/getpass.c [new file with mode: 0644]
usr/src/libc/stdio/getpw.c [new file with mode: 0644]
usr/src/libc/stdio/getpwent.c [new file with mode: 0644]
usr/src/libc/stdio/getpwnam.c [new file with mode: 0644]
usr/src/libc/stdio/getpwuid.c [new file with mode: 0644]
usr/src/libc/stdio/gets.c [new file with mode: 0644]
usr/src/libc/stdio/getw.c [new file with mode: 0644]
usr/src/libc/stdio/popen.c [new file with mode: 0644]
usr/src/libc/stdio/printf.c [new file with mode: 0644]
usr/src/libc/stdio/putchar.c [new file with mode: 0644]
usr/src/libc/stdio/puts.c [new file with mode: 0644]
usr/src/libc/stdio/putw.c [new file with mode: 0644]
usr/src/libc/stdio/rdwr.c [new file with mode: 0644]
usr/src/libc/stdio/scanf.c [new file with mode: 0644]
usr/src/libc/stdio/setbuf.c [new file with mode: 0644]
usr/src/libc/stdio/sprintf.c [new file with mode: 0644]
usr/src/libc/stdio/strout.c [new file with mode: 0644]
usr/src/libc/stdio/system.c [new file with mode: 0644]
usr/src/libc/stdio/ungetc.c [new file with mode: 0644]
usr/src/libc/sys/access.s [new file with mode: 0644]
usr/src/libc/sys/acct.s [new file with mode: 0644]
usr/src/libc/sys/alarm.s [new file with mode: 0644]
usr/src/libc/sys/chdir.s [new file with mode: 0644]
usr/src/libc/sys/chmod.s [new file with mode: 0644]
usr/src/libc/sys/chown.s [new file with mode: 0644]
usr/src/libc/sys/chroot.s [new file with mode: 0644]
usr/src/libc/sys/close.s [new file with mode: 0644]
usr/src/libc/sys/creat.s [new file with mode: 0644]
usr/src/libc/sys/dup.s [new file with mode: 0644]
usr/src/libc/sys/execl.s [new file with mode: 0644]
usr/src/libc/sys/execle.s [new file with mode: 0644]
usr/src/libc/sys/execv.s [new file with mode: 0644]
usr/src/libc/sys/execve.s [new file with mode: 0644]
usr/src/libc/sys/exit.s [new file with mode: 0644]
usr/src/libc/sys/fork.s [new file with mode: 0644]
usr/src/libc/sys/fstat.s [new file with mode: 0644]
usr/src/libc/sys/getgid.s [new file with mode: 0644]
usr/src/libc/sys/getpid.s [new file with mode: 0644]
usr/src/libc/sys/getuid.s [new file with mode: 0644]
usr/src/libc/sys/ioctl.s [new file with mode: 0644]
usr/src/libc/sys/kill.s [new file with mode: 0644]
usr/src/libc/sys/link.s [new file with mode: 0644]
usr/src/libc/sys/lock.s [new file with mode: 0644]
usr/src/libc/sys/lseek.s [new file with mode: 0644]
usr/src/libc/sys/mknod.s [new file with mode: 0644]
usr/src/libc/sys/mount.s [new file with mode: 0644]
usr/src/libc/sys/nice.s [new file with mode: 0644]
usr/src/libc/sys/open.s [new file with mode: 0644]
usr/src/libc/sys/pause.s [new file with mode: 0644]
usr/src/libc/sys/phys.s [new file with mode: 0644]
usr/src/libc/sys/pipe.s [new file with mode: 0644]
usr/src/libc/sys/profil.s [new file with mode: 0644]
usr/src/libc/sys/ptrace.s [new file with mode: 0644]
usr/src/libc/sys/read.s [new file with mode: 0644]
usr/src/libc/sys/sbrk.s [new file with mode: 0644]
usr/src/libc/sys/setgid.s [new file with mode: 0644]
usr/src/libc/sys/setuid.s [new file with mode: 0644]
usr/src/libc/sys/signal.s [new file with mode: 0644]
usr/src/libc/sys/stat.s [new file with mode: 0644]
usr/src/libc/sys/stime.s [new file with mode: 0644]
usr/src/libc/sys/sync.s [new file with mode: 0644]
usr/src/libc/sys/time.s [new file with mode: 0644]
usr/src/libc/sys/times.s [new file with mode: 0644]
usr/src/libc/sys/umask.s [new file with mode: 0644]
usr/src/libc/sys/umount.s [new file with mode: 0644]
usr/src/libc/sys/unlink.s [new file with mode: 0644]
usr/src/libc/sys/utime.s [new file with mode: 0644]
usr/src/libc/sys/wait.s [new file with mode: 0644]
usr/src/libc/sys/write.s [new file with mode: 0644]
usr/src/libc/v6/access.c [new file with mode: 0644]
usr/src/libc/v6/chown.c [new file with mode: 0644]
usr/src/libc/v6/execl.c [new file with mode: 0644]
usr/src/libc/v6/ftime.c [new file with mode: 0644]
usr/src/libc/v6/gtty.c [new file with mode: 0644]
usr/src/libc/v6/lseek.c [new file with mode: 0644]
usr/src/libc/v6/stat.c [new file with mode: 0644]
usr/src/libc/v6/syscall.s [new file with mode: 0644]

diff --git a/usr/src/libc/crt/aldiv.s b/usr/src/libc/crt/aldiv.s
new file mode 100644 (file)
index 0000000..d1c3706
--- /dev/null
@@ -0,0 +1,102 @@
+/ Long quotient
+
+.globl aldiv
+.globl csv, cret
+aldiv:
+       jsr     r5,csv
+       mov     8.(r5),r3
+       sxt     r4
+       bpl     1f
+       neg     r3
+1:
+       cmp     r4,6.(r5)
+       bne     hardldiv
+       mov     4(r5),r1
+       mov     2(r1),r2
+       mov     (r1),r1
+       bge     1f
+       neg     r1
+       neg     r2
+       sbc     r1
+       com     r4
+1:
+       mov     r4,-(sp)
+       clr     r0
+       div     r3,r0
+       mov     r0,r4           /high quotient
+       mov     r1,r0
+       mov     r2,r1
+       div     r3,r0
+       bvc     1f
+       sub     r3,r0           / this is the clever part
+       div     r3,r0
+       tst     r1
+       sxt     r1
+       add     r1,r0           / cannot overflow!
+1:
+       mov     r0,r1
+       mov     r4,r0
+       tst     (sp)+
+       bpl     9f
+       neg     r0
+       neg     r1
+       sbc     r0
+9:
+       mov     4.(r5),r2
+       mov     r0,(r2)+
+       mov     r1,(r2)
+       jmp     cret
+
+/ The divisor is known to be >= 2^15 so only 16 cycles are needed.
+hardldiv:
+       clr     -(sp)
+       mov     4.(r5),r0
+       mov     2(r0),r2
+       mov     (r0),r1
+       bpl     1f
+       com     (sp)
+       neg     r1
+       neg     r2
+       sbc     r1
+1:
+       clr     r0
+       mov     6.(r5),r3
+       bge     1f
+       neg     r3
+       neg     8.(r5)
+       sbc     r3
+       com     (sp)
+1:
+       mov     $16.,r4
+1:
+       clc
+       rol     r2
+       rol     r1
+       rol     r0
+       cmp     r3,r0
+       bgt     3f
+       blt     2f
+       cmp     8.(r5),r1
+       blos    2f
+3:
+       sob     r4,1b
+       br      1f
+2:
+       sub     8.(r5),r1
+       sbc     r0
+       sub     r3,r0
+       inc     r2
+       sob     r4,1b
+1:
+       mov     r2,r1
+       clr     r0
+       tst     (sp)+
+       beq     1f
+       neg     r0
+       neg     r1
+       sbc     r0
+1:
+       mov     4.(r5),r2
+       mov     r0,(r2)+
+       mov     r1,(r2)
+       jmp     cret
diff --git a/usr/src/libc/crt/almul.s b/usr/src/libc/crt/almul.s
new file mode 100644 (file)
index 0000000..d1d8b84
--- /dev/null
@@ -0,0 +1,24 @@
+/
+/ 32-bit multiplication routine for fixed pt hardware.
+/  Implements *= operator
+/ Credit to an unknown author who slipped it under the door.
+.globl almul
+.globl csv, cret
+
+almul:
+       jsr     r5,csv
+       mov     4(r5),r4
+       mov     2(r4),r2
+       sxt     r1
+       sub     (r4),r1
+       mov     8.(r5),r0
+       sxt     r3
+       sub     6.(r5),r3
+       mul     r0,r1
+       mul     r2,r3
+       add     r1,r3
+       mul     r2,r0
+       sub     r3,r0
+       mov     r0,(r4)+
+       mov     r1,(r4)
+       jmp     cret
diff --git a/usr/src/libc/crt/alrem.s b/usr/src/libc/crt/alrem.s
new file mode 100644 (file)
index 0000000..720bd54
--- /dev/null
@@ -0,0 +1,92 @@
+/ Long remainder
+
+.globl alrem
+.globl csv, cret
+alrem:
+       jsr     r5,csv
+       mov     8.(r5),r3
+       sxt     r4
+       bpl     1f
+       neg     r3
+1:
+       cmp     r4,6.(r5)
+       bne     hardlrem
+       mov     4.(r5),r0
+       mov     2(r0),r2
+       mov     (r0),r1
+       mov     r1,r4
+       bge     1f
+       neg     r1
+       neg     r2
+       sbc     r1
+1:
+       clr     r0
+       div     r3,r0
+       mov     r1,r0
+       mov     r2,r1
+       div     r3,r0
+       bvc     1f
+       sub     r3,r0
+       div     r3,r0
+       tst     r1
+       beq     9f
+       add     r3,r1
+1:
+       tst     r4
+       bpl     9f
+       neg     r1
+9:
+       sxt     r0
+       mov     4.(r5),r3
+       mov     r0,(r3)+
+       mov     r1,(r3)
+       jmp     cret
+
+/ The divisor is known to be >= 2^15.  Only 16 cycles are
+/ needed to get a remainder.
+hardlrem:
+       mov     4.(r5),r0
+       mov     2(r0),r2
+       mov     (r0),r1
+       bpl     1f
+       neg     r1
+       neg     r2
+       sbc     r1
+1:
+       clr     r0
+       mov     6.(r5),r3
+       bge     1f
+       neg     r3
+       neg     8.(r5)
+       sbc     r3
+1:
+       mov     $16.,r4
+1:
+       clc
+       rol     r2
+       rol     r1
+       rol     r0
+       cmp     r3,r0
+       blt     2f
+       bgt     3f
+       cmp     8.(r5),r1
+       blos    2f
+3:
+       sob     r4,1b
+       br      1f
+2:
+       sub     8.(r5),r1
+       sbc     r0
+       sub     r3,r0
+       sob     r4,1b
+1:
+       mov     4.(r5),r3
+       tst     (r3)
+       bge     1f
+       neg     r0
+       neg     r1
+       sbc     r0
+1:
+       mov     r0,(r3)+
+       mov     r1,(r3)
+       jmp     cret
diff --git a/usr/src/libc/crt/cerror.s b/usr/src/libc/crt/cerror.s
new file mode 100644 (file)
index 0000000..d7e2231
--- /dev/null
@@ -0,0 +1,12 @@
+/ C return sequence which
+/ sets errno, returns -1.
+
+.globl cerror
+.comm  _errno,2
+
+cerror:
+       mov     r0,_errno
+       mov     $-1,r0
+       mov     r5,sp
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/crt/csv.s b/usr/src/libc/crt/csv.s
new file mode 100644 (file)
index 0000000..858b79b
--- /dev/null
@@ -0,0 +1,21 @@
+/ C register save and restore -- version 7/75
+
+.globl csv
+.globl cret
+
+csv:
+       mov     r5,r0
+       mov     sp,r5
+       mov     r4,-(sp)
+       mov     r3,-(sp)
+       mov     r2,-(sp)
+       jsr     pc,(r0)         / jsr part is sub $2,sp
+
+cret:
+       mov     r5,r2
+       mov     -(r2),r4
+       mov     -(r2),r3
+       mov     -(r2),r2
+       mov     r5,sp
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/crt/ldiv.s b/usr/src/libc/crt/ldiv.s
new file mode 100644 (file)
index 0000000..31aafe2
--- /dev/null
@@ -0,0 +1,95 @@
+/ Long quotient
+
+.globl ldiv
+.globl csv, cret
+
+ldiv:
+       jsr     r5,csv
+       mov     10.(r5),r3
+       sxt     r4
+       bpl     1f
+       neg     r3
+1:
+       cmp     r4,8.(r5)
+       bne     hardldiv
+       mov     6.(r5),r2
+       mov     4.(r5),r1
+       bge     1f
+       neg     r1
+       neg     r2
+       sbc     r1
+       com     r4
+1:
+       mov     r4,-(sp)
+       clr     r0
+       div     r3,r0
+       mov     r0,r4           /high quotient
+       mov     r1,r0
+       mov     r2,r1
+       div     r3,r0
+       bvc     1f
+       sub     r3,r0           / this is the clever part
+       div     r3,r0
+       tst     r1
+       sxt     r1
+       add     r1,r0           / cannot overflow!
+1:
+       mov     r0,r1
+       mov     r4,r0
+       tst     (sp)+
+       bpl     9f
+       neg     r0
+       neg     r1
+       sbc     r0
+9:
+       jmp     cret
+
+/ The divisor is known to be >= 2^15 so only 16 cycles are needed.
+hardldiv:
+       clr     -(sp)
+       mov     6.(r5),r2
+       mov     4.(r5),r1
+       bpl     1f
+       com     (sp)
+       neg     r1
+       neg     r2
+       sbc     r1
+1:
+       clr     r0
+       mov     8.(r5),r3
+       bge     1f
+       neg     r3
+       neg     10.(r5)
+       sbc     r3
+       com     (sp)
+1:
+       mov     $16.,r4
+1:
+       clc
+       rol     r2
+       rol     r1
+       rol     r0
+       cmp     r3,r0
+       bgt     3f
+       blt     2f
+       cmp     10.(r5),r1
+       blos    2f
+3:
+       sob     r4,1b
+       br      1f
+2:
+       sub     10.(r5),r1
+       sbc     r0
+       sub     r3,r0
+       inc     r2
+       sob     r4,1b
+1:
+       mov     r2,r1
+       clr     r0
+       tst     (sp)+
+       beq     1f
+       neg     r0
+       neg     r1
+       sbc     r0
+1:
+       jmp     cret
diff --git a/usr/src/libc/crt/lmul.s b/usr/src/libc/crt/lmul.s
new file mode 100644 (file)
index 0000000..1d24660
--- /dev/null
@@ -0,0 +1,21 @@
+/
+/ 32-bit multiplication routine for fixed pt hardware.
+/  Implements * operator
+/ Credit to an unknown author who slipped it under the door.
+.globl lmul
+.globl csv, cret
+
+lmul:
+       jsr     r5,csv
+       mov     6(r5),r2
+       sxt     r1
+       sub     4(r5),r1
+       mov     10.(r5),r0
+       sxt     r3
+       sub     8.(r5),r3
+       mul     r0,r1
+       mul     r2,r3
+       add     r1,r3
+       mul     r2,r0
+       sub     r3,r0
+       jmp     cret
diff --git a/usr/src/libc/crt/lrem.s b/usr/src/libc/crt/lrem.s
new file mode 100644 (file)
index 0000000..b37a3d8
--- /dev/null
@@ -0,0 +1,85 @@
+/ Long remainder
+
+.globl lrem
+.globl csv, cret
+
+lrem:
+       jsr     r5,csv
+       mov     10.(r5),r3
+       sxt     r4
+       bpl     1f
+       neg     r3
+1:
+       cmp     r4,8.(r5)
+       bne     hardlrem
+       mov     6.(r5),r2
+       mov     4.(r5),r1
+       mov     r1,r4
+       bge     1f
+       neg     r1
+       neg     r2
+       sbc     r1
+1:
+       clr     r0
+       div     r3,r0
+       mov     r1,r0
+       mov     r2,r1
+       div     r3,r0
+       bvc     1f
+       sub     r3,r0
+       div     r3,r0
+       tst     r1
+       beq     9f
+       add     r3,r1
+1:
+       tst     r4
+       bpl     9f
+       neg     r1
+9:
+       sxt     r0
+       jmp     cret
+
+/ The divisor is known to be >= 2^15.  Only 16 cycles are
+/ needed to get a remainder.
+hardlrem:
+       mov     6.(r5),r2
+       mov     4.(r5),r1
+       bpl     1f
+       neg     r1
+       neg     r2
+       sbc     r1
+1:
+       clr     r0
+       mov     8.(r5),r3
+       bge     1f
+       neg     r3
+       neg     10.(r5)
+       sbc     r3
+1:
+       mov     $16.,r4
+1:
+       clc
+       rol     r2
+       rol     r1
+       rol     r0
+       cmp     r3,r0
+       blt     2f
+       bgt     3f
+       cmp     10.(r5),r1
+       blos    2f
+3:
+       sob     r4,1b
+       br      1f
+2:
+       sub     10.(r5),r1
+       sbc     r0
+       sub     r3,r0
+       sob     r4,1b
+1:
+       tst     4(r5)
+       bge     1f
+       neg     r0
+       neg     r1
+       sbc     r0
+1:
+       jmp     cret
diff --git a/usr/src/libc/crt/mcount.s b/usr/src/libc/crt/mcount.s
new file mode 100644 (file)
index 0000000..a3d91d2
--- /dev/null
@@ -0,0 +1,20 @@
+/ count subroutine calls during profiling
+
+.globl mcount
+.comm  countbase,2
+
+mcount:
+       mov     (r0),r1
+       bne     1f
+       mov     countbase,r1
+       beq     2f
+       add     $6,countbase
+       mov     (sp),(r1)+
+       mov     r1,(r0)
+1:
+       inc     2(r1)
+       bne     2f
+       inc     (r1)
+2:
+       rts     pc
+
diff --git a/usr/src/libc/csu/crt0.s b/usr/src/libc/csu/crt0.s
new file mode 100644 (file)
index 0000000..816c7fd
--- /dev/null
@@ -0,0 +1,36 @@
+/ C runtime startoff
+
+.globl _exit, _environ
+.globl start
+.globl _main
+exit = 1.
+
+start:
+       setd
+       mov     2(sp),r0
+       clr     -2(r0)
+       mov     sp,r0
+       sub     $4,sp
+       mov     4(sp),(sp)
+       tst     (r0)+
+       mov     r0,2(sp)
+1:
+       tst     (r0)+
+       bne     1b
+       cmp     r0,*2(sp)
+       blo     1f
+       tst     -(r0)
+1:
+       mov     r0,4(sp)
+       mov     r0,_environ
+       jsr     pc,_main
+       cmp     (sp)+,(sp)+
+       mov     r0,(sp)
+       jsr     pc,*$_exit
+       sys     exit
+
+.bss
+_environ:
+       .=.+2
+.data
+       .=.+2           / loc 0 for I/D; null ptr points here.
diff --git a/usr/src/libc/csu/fcrt0.s b/usr/src/libc/csu/fcrt0.s
new file mode 100644 (file)
index 0000000..a61ca3b
--- /dev/null
@@ -0,0 +1,39 @@
+/ C runtime startoff
+/ with floating point interpreter
+
+.globl fptrap
+.globl _exit
+.globl _main
+.globl _environ
+exit = 1.
+signal = 48.
+
+start:
+       sys     signal; 4; fptrap
+       setd
+       mov     2(sp),r0
+       clr     -2(r0)
+       mov     sp,r0
+       sub     $4,sp
+       mov     4(sp),(sp)
+       tst     (r0)+
+       mov     r0,2(sp)
+1:
+       tst     (r0)+
+       bne     1b
+       cmp     r0,*2(sp)
+       blo     1f
+       tst     -(r0)
+1:
+       mov     r0,4(sp)
+       mov     r0,_environ
+       jsr     pc,_main
+       cmp     (sp)+,(sp)+
+       mov     r0,(sp)
+       jsr     pc,*$_exit
+       sys     exit
+.bss
+_environ:
+       .=.+2
+.data
+       .=.+2
diff --git a/usr/src/libc/csu/fmcrt0.s b/usr/src/libc/csu/fmcrt0.s
new file mode 100644 (file)
index 0000000..330b387
--- /dev/null
@@ -0,0 +1,87 @@
+/ C runtime startoff including monitoring
+
+cbufs  = 300.
+exit   = 1.
+write  = 4.
+signal = 48.
+
+.globl _monitor
+.globl _sbrk
+.globl _main
+.globl _exit
+.globl _environ
+.globl _etext
+.globl __cleanup
+.globl countbase
+.globl fptrap
+
+
+start:
+       sys     signal; 4; fptrap
+       setd
+       mov     2(sp),r0
+       clr     -2(r0)
+       mov     sp,r0
+       sub     $4,sp
+       mov     4(sp),(sp)
+       tst     (r0)+
+       mov     r0,2(sp)
+1:
+       tst     (r0)+
+       bne     1b
+       cmp     r0,*2(sp)
+       blo     1f
+       tst     -(r0)
+1:
+       mov     r0,4(sp)
+       mov     r0,_environ
+
+       mov     $_etext,r1
+       sub     $eprol,r1
+       add     $7,r1
+       ash     $-3,r1
+       bic     $!17777,r1
+       mov     $cbufs,-(sp)
+       add     $3*[cbufs+1],r1
+       mov     r1,-(sp)
+       asl     r1
+       mov     r1,-(sp)
+       jsr     pc,_sbrk
+       tst     (sp)+
+       cmp     r0,$-1
+       beq     9f
+       mov     r0,-(sp)
+       add     $6,r0
+       mov     r0,countbase
+       mov     $_etext,-(sp)
+       mov     $eprol,-(sp)
+       jsr     pc,_monitor
+       add     $10.,sp
+       jsr     pc,_main
+       cmp     (sp)+,(sp)+
+       mov     r0,(sp)
+       jsr     pc,_exit
+
+9:
+       mov     $2,r0
+       sys     write; 8f; 9f-8f
+
+.data; 8: <No space for monitor buffer\n>; 9:.even; .text
+
+_exit:
+       mov     r5,-(sp)
+       mov     sp,r5
+       jsr     pc,__cleanup
+       clr     -(sp)
+       jsr     pc,_monitor
+       tst     (sp)+
+       mov     4(r5),r0
+       sys     exit
+eprol:
+.bss
+_environ:
+       .=.+2
+countbase:
+       .=.+2
+.data
+       .=.+2
diff --git a/usr/src/libc/csu/mcrt0.s b/usr/src/libc/csu/mcrt0.s
new file mode 100644 (file)
index 0000000..3c1a21c
--- /dev/null
@@ -0,0 +1,84 @@
+/ C runtime startoff including monitoring
+
+cbufs  = 300.
+exit   = 1
+write  = 4
+
+.globl _monitor
+.globl _sbrk
+.globl _main
+.globl _exit
+.globl _environ
+.globl _etext
+.globl __cleanup
+.globl countbase
+
+
+start:
+       setd
+       mov     2(sp),r0
+       clr     -2(r0)
+       mov     sp,r0
+       sub     $4,sp
+       mov     4(sp),(sp)
+       tst     (r0)+
+       mov     r0,2(sp)
+1:
+       tst     (r0)+
+       bne     1b
+       cmp     r0,*2(sp)
+       blo     1f
+       tst     -(r0)
+1:
+       mov     r0,4(sp)
+       mov     r0,_environ
+
+       mov     $_etext,r1
+       sub     $eprol,r1
+       add     $7,r1
+       ash     $-3,r1
+       bic     $!17777,r1
+       mov     $cbufs,-(sp)
+       add     $3*[cbufs+1],r1
+       mov     r1,-(sp)
+       asl     r1
+       mov     r1,-(sp)
+       jsr     pc,_sbrk
+       tst     (sp)+
+       cmp     r0,$-1
+       beq     9f
+       mov     r0,-(sp)
+       add     $6,r0
+       mov     r0,countbase
+       mov     $_etext,-(sp)
+       mov     $eprol,-(sp)
+       jsr     pc,_monitor
+       add     $10.,sp
+       jsr     pc,_main
+       cmp     (sp)+,(sp)+
+       mov     r0,(sp)
+       jsr     pc,_exit
+
+9:
+       mov     $2,r0
+       sys     write; 8f; 9f-8f
+
+.data; 8: <No space for monitor buffer\n>; 9:.even; .text
+
+_exit:
+       mov     r5,-(sp)
+       mov     sp,r5
+       jsr     pc,__cleanup
+       clr     -(sp)
+       jsr     pc,_monitor
+       tst     (sp)+
+       mov     4(r5),r0
+       sys     exit
+eprol:
+.bss
+_environ:
+       .=.+2
+countbase:
+       .=.+2
+.data
+       .=.+2
diff --git a/usr/src/libc/gen/ctype_.c b/usr/src/libc/gen/ctype_.c
new file mode 100644 (file)
index 0000000..927df28
--- /dev/null
@@ -0,0 +1,21 @@
+#include       <ctype.h>
+
+char _ctype_[] = {
+       0,
+       _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C,
+       _C,     _S,     _S,     _S,     _S,     _S,     _C,     _C,
+       _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C,
+       _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C,
+       _S,     _P,     _P,     _P,     _P,     _P,     _P,     _P,
+       _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P,
+       _N,     _N,     _N,     _N,     _N,     _N,     _N,     _N,
+       _N,     _N,     _P,     _P,     _P,     _P,     _P,     _P,
+       _P,     _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U,
+       _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U,
+       _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U,
+       _U,     _U,     _U,     _P,     _P,     _P,     _P,     _P,
+       _P,     _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L,
+       _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L,
+       _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L,
+       _L,     _L,     _L,     _P,     _P,     _P,     _P,     _C
+};
diff --git a/usr/src/libc/gen/index.c b/usr/src/libc/gen/index.c
new file mode 100644 (file)
index 0000000..f525edb
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Return the ptr in sp at which the character c appears;
+ * NULL if not found
+ */
+
+#define        NULL    0
+
+char *
+index(sp, c)
+register char *sp, c;
+{
+       do {
+               if (*sp == c)
+                       return(sp);
+       } while (*sp++);
+       return(NULL);
+}
diff --git a/usr/src/libc/gen/rindex.c b/usr/src/libc/gen/rindex.c
new file mode 100644 (file)
index 0000000..af1ff76
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Return the ptr in sp at which the character c last
+ * appears; NULL if not found
+*/
+
+#define NULL 0
+
+char *
+rindex(sp, c)
+register char *sp, c;
+{
+       register char *r;
+
+       r = NULL;
+       do {
+               if (*sp == c)
+                       r = sp;
+       } while (*sp++);
+       return(r);
+}
diff --git a/usr/src/libc/gen/strcat.c b/usr/src/libc/gen/strcat.c
new file mode 100644 (file)
index 0000000..9d2a52c
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Concatenate s2 on the end of s1.  S1's space must be large enough.
+ * Return s1.
+ */
+
+char *
+strcat(s1, s2)
+register char *s1, *s2;
+{
+       register char *os1;
+
+       os1 = s1;
+       while (*s1++)
+               ;
+       --s1;
+       while (*s1++ = *s2++)
+               ;
+       return(os1);
+}
diff --git a/usr/src/libc/gen/strcmp.c b/usr/src/libc/gen/strcmp.c
new file mode 100644 (file)
index 0000000..3159719
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * Compare strings:  s1>s2: >0  s1==s2: 0  s1<s2: <0
+ */
+
+strcmp(s1, s2)
+register char *s1, *s2;
+{
+
+       while (*s1 == *s2++)
+               if (*s1++=='\0')
+                       return(0);
+       return(*s1 - *--s2);
+}
diff --git a/usr/src/libc/gen/strcpy.c b/usr/src/libc/gen/strcpy.c
new file mode 100644 (file)
index 0000000..da2acb5
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copy string s2 to s1.  s1 must be large enough.
+ * return s1
+ */
+
+char *
+strcpy(s1, s2)
+register char *s1, *s2;
+{
+       register char *os1;
+
+       os1 = s1;
+       while (*s1++ = *s2++)
+               ;
+       return(os1);
+}
diff --git a/usr/src/libc/gen/strlen.c b/usr/src/libc/gen/strlen.c
new file mode 100644 (file)
index 0000000..2abf6a5
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Returns the number of
+ * non-NULL bytes in string argument.
+ */
+
+strlen(s)
+register char *s;
+{
+       register n;
+
+       n = 0;
+       while (*s++)
+               n++;
+       return(n);
+}
diff --git a/usr/src/libc/gen/strncat.c b/usr/src/libc/gen/strncat.c
new file mode 100644 (file)
index 0000000..34dcabe
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Concatenate s2 on the end of s1.  S1's space must be large enough.
+ * At most n characters are moved.
+ * Return s1.
+ */
+
+char *
+strncat(s1, s2, n)
+register char *s1, *s2;
+register n;
+{
+       register char *os1;
+
+       os1 = s1;
+       while (*s1++)
+               ;
+       --s1;
+       while (*s1++ = *s2++)
+               if (--n < 0) {
+                       *--s1 = '\0';
+                       break;
+               }
+       return(os1);
+}
diff --git a/usr/src/libc/gen/strncmp.c b/usr/src/libc/gen/strncmp.c
new file mode 100644 (file)
index 0000000..a46514e
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Compare strings (at most n bytes):  s1>s2: >0  s1==s2: 0  s1<s2: <0
+ */
+
+strncmp(s1, s2, n)
+register char *s1, *s2;
+register n;
+{
+
+       while (--n >= 0 && *s1 == *s2++)
+               if (*s1++ == '\0')
+                       return(0);
+       return(n<0 ? 0 : *s1 - *--s2);
+}
diff --git a/usr/src/libc/gen/strncpy.c b/usr/src/libc/gen/strncpy.c
new file mode 100644 (file)
index 0000000..40c511e
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copy s2 to s1, truncating or null-padding to always copy n bytes
+ * return s1
+ */
+
+char *
+strncpy(s1, s2, n)
+register char *s1, *s2;
+{
+       register i;
+       register char *os1;
+
+       os1 = s1;
+       for (i = 0; i < n; i++)
+               if ((*s1++ = *s2++) == '\0') {
+                       while (++i < n)
+                               *s1++ = '\0';
+                       return(os1);
+               }
+       return(os1);
+}
diff --git a/usr/src/libc/gen/swab.c b/usr/src/libc/gen/swab.c
new file mode 100644 (file)
index 0000000..9b11fe9
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Swap bytes in 16-bit [half-]words
+ * for going between the 11 and the interdata
+ */
+
+swab(pf, pt, n)
+register short *pf, *pt;
+register n;
+{
+
+       n /= 2;
+       while (--n >= 0) {
+               *pt++ = (*pf << 8) + ((*pf >> 8) & 0377);
+               pf++;
+       }
+}
diff --git a/usr/src/libc/gen/tell.c b/usr/src/libc/gen/tell.c
new file mode 100644 (file)
index 0000000..12e6bf2
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * return offset in file.
+ */
+
+long   lseek();
+
+long tell(f)
+{
+       return(lseek(f, 0L, 1));
+}
diff --git a/usr/src/libc/stdio/clrerr.c b/usr/src/libc/stdio/clrerr.c
new file mode 100644 (file)
index 0000000..d0bb284
--- /dev/null
@@ -0,0 +1,7 @@
+#include       <stdio.h>
+
+clearerr(iop)
+register struct _iobuf *iop;
+{
+       iop->_flag &= ~(_IOERR|_IOEOF);
+}
diff --git a/usr/src/libc/stdio/data.c b/usr/src/libc/stdio/data.c
new file mode 100644 (file)
index 0000000..56141c4
--- /dev/null
@@ -0,0 +1,13 @@
+#include <stdio.h>
+char   _sibuf[BUFSIZ];
+char   _sobuf[BUFSIZ];
+
+struct _iobuf  _iob[_NFILE] = {
+       { _sibuf, 0, _sibuf, _IOREAD, 0},
+       { NULL, 0, NULL, _IOWRT, 1},
+       {NULL, 0, NULL, _IOWRT+_IONBF, 2},
+};
+/*
+ * Ptr to end of buffers
+ */
+struct _iobuf  *_lastbuf = { &_iob[_NFILE] };
diff --git a/usr/src/libc/stdio/doprnt.s b/usr/src/libc/stdio/doprnt.s
new file mode 100644 (file)
index 0000000..bed67a0
--- /dev/null
@@ -0,0 +1,323 @@
+/ C library -- conversions
+
+width=-8.
+formp=-10.
+rjust=-12.
+ndfnd=-14.
+ndigit=-16.
+zfill=-18.
+.globl __doprnt
+
+.globl pfloat
+.globl pscien
+.globl pgen
+
+.globl __strout
+.globl csv
+.globl cret
+
+__doprnt:
+       jsr     r5,csv
+       sub     $128.+12.,sp
+       mov     4(r5),formp(r5)         / format
+       mov     6(r5),r4
+loop:
+       mov     sp,r3
+       mov     formp(r5),r1
+2:
+       movb    (r1)+,r2
+       beq     2f
+       cmp     r2,$'%
+       beq     2f
+       movb    r2,(r3)+
+       br      2b
+2:
+       mov     r1,formp(r5)
+       cmp     r3,sp
+       beq     2f
+       mov     sp,r0
+       mov     8(r5),-(sp)
+       clr     -(sp)
+       mov     r3,-(sp)
+       sub     r0,(sp)
+       mov     r0,-(sp)
+       jsr     pc,__strout
+       add     $8,sp
+2:
+       tst     r2
+       bne     2f
+       jmp     cret
+2:
+       mov     sp,r3
+2:
+       clr     rjust(r5)
+       clr     ndigit(r5)
+       mov     $' ,zfill(r5)
+       cmpb    *formp(r5),$'-
+       bne     2f
+       inc     formp(r5)
+       inc     rjust(r5)
+2:
+       cmpb    *formp(r5),$'0
+       bne     2f
+       mov     $'0,zfill(r5)
+2:
+       jsr     r3,gnum
+       mov     r1,width(r5)
+       clr     ndfnd(r5)
+       cmp     r0,$'.
+       bne     1f
+       jsr     r3,gnum
+       mov     r1,ndigit(r5)
+1:
+       mov     $swtab,r1
+1:
+       mov     (r1)+,r2
+       bne     2f
+       movb    r0,(r3)+
+       jmp     prbuf
+2:
+       cmp     r0,(r1)+
+       bne     1b
+       jmp     (r2)
+       .data
+swtab:
+       decimal;        'd
+       octal;          'o
+       hex;            'x
+       float;          'f
+       scien;          'e
+       general;        'g
+       charac;         'c
+       string;         's
+       longorunsg;     'l
+       longorunsg;     'L
+       unsigned;       'u
+       remote;         'r
+       long;           'D
+       loct;           'O
+       lhex;           'X
+       lunsigned;      'U
+       0;  0
+       .text
+
+general:
+       mov     ndigit(r5),r0
+       mov     ndfnd(r5),r2
+       jsr     pc,pgen
+       jbr     prbuf
+
+longorunsg:
+       movb    *formp(r5),r0
+       inc     formp(r5)
+       cmp     r0,$'o
+       beq     loct
+       cmp     r0,$'x
+       beq     lhex
+       cmp     r0,$'d
+       beq     long
+       cmp     r0,$'u
+       beq     lunsigned
+       dec     formp(r5)
+       br      unsigned
+
+octal:
+       clr     r0
+       br      1f
+loct:
+       mov     (r4)+,r0
+1:
+       mov     $8.,r2
+       br      2f
+
+hex:
+       clr     r0
+       br      1f
+
+lhex:
+       mov     (r4)+,r0
+1:
+       mov     $16.,r2
+2:
+       mov     (r4)+,r1
+       br      compute
+
+decimal:
+       mov     (r4)+,r1
+       sxt     r0
+       bmi     3f
+       br      2f
+
+unsigned:
+       clr     r0
+       br      1f
+
+long:
+       mov     (r4)+,r0
+       bge     1f
+       mov     (r4)+,r1
+3:
+       neg     r0
+       neg     r1
+       sbc     r0
+       movb    $'-,(r3)+
+       br      2f
+
+lunsigned:
+       mov     (r4)+,r0
+1:
+       mov     (r4)+,r1
+2:
+       mov     $10.,r2
+
+/
+/ Algorithm courtesy Keith Davis
+/
+compute:
+       mov     r5,-(sp)
+       mov     r4,-(sp)
+       mov     r0,r4
+       mov     ndigit(r5),r0
+       mov     r1,r5
+       ashc    $0,r4
+       beq     1f
+       tst     r0
+       beq     1f
+       movb    $'0,(r3)+
+1:
+       jsr     pc,1f
+       mov     (sp)+,r4
+       mov     (sp)+,r5
+       br      prbuf
+
+1:
+       clr     r0
+       mov     r4,r1
+       beq     2f
+       div     r2,r0
+       mov     r0,r4
+       mov     r1,r0
+2:
+       mov     r5,r1
+       asl     r2
+       div     r2,r0
+       asr     r2
+       asl     r0
+       cmp     r2,r1
+       bgt     2f
+       sub     r2,r1
+       inc     r0
+2:
+       mov     r1,-(sp)
+       mov     r0,r5
+       bne     2f
+       tst     r4
+       beq     1f
+2:
+       jsr     pc,1b
+1:
+       mov     (sp)+,r0
+       add     $'0,r0
+       cmp     r0,$'9
+       ble     1f
+       add     $'a-'0-10.,r0
+1:
+       movb    r0,(r3)+
+       rts     pc
+       
+charac:
+       mov     $' ,zfill(r5)
+       mov     (r4)+,r0
+       bic     $!377,r0
+       beq     prbuf
+       movb    r0,(r3)+
+       br      prbuf
+
+string:
+       mov     $' ,zfill(r5)
+       mov     ndigit(r5),r1
+       mov     (r4),r2
+       mov     r2,r3
+       bne     1f
+       mov     $nulstr,r2
+       mov     r2,r3
+       mov     r2,(r4)
+1:
+       tstb    (r2)+
+       beq     1f
+       inc     r3
+       sob     r1,1b
+1:
+       mov     (r4)+,r2
+       br      prstr
+
+float:
+       mov     ndigit(r5),r0
+       mov     ndfnd(r5),r2
+       jsr     pc,pfloat
+       br      prbuf
+
+scien:
+       mov     ndigit(r5),r0
+       inc     r0
+       tst     ndfnd(r5)
+       bne     1f
+       mov     $7,r0
+1:
+       mov     pc,r2
+       jsr     pc,pscien
+       br      prbuf
+
+remote:
+       mov     (r4)+,r4
+       mov     (r4)+,formp(r5)
+       jmp     loop
+
+prbuf:
+       mov     sp,r2
+prstr:
+       sub     r2,r3
+       mov     width(r5),r1
+       sub     r3,r1
+       bge     1f
+       clr     r1
+1:
+       tst     rjust(r5)
+       bne     1f
+       neg     r1
+1:
+       mov     zfill(r5),-(sp)
+       mov     8(r5),-(sp)
+       mov     r1,-(sp)
+       mov     r3,-(sp)
+       mov     r2,-(sp)
+       jsr     pc,__strout
+       add     $10.,sp
+       jmp     loop
+
+gnum:
+       clr     ndfnd(r5)
+       clr     r1
+1:
+       movb    *formp(r5),r0
+       inc     formp(r5)
+       sub     $'0,r0
+       cmp     r0,$'*-'0
+       bne     2f
+       mov     (r4)+,r0
+       br      3f
+2:
+       cmp     r0,$9.
+       bhi     1f
+3:
+       inc     ndfnd(r5)
+       mul     $10.,r1
+       add     r0,r1
+       br      1b
+1:
+       add     $'0,r0
+       rts     r3
+
+.data
+nulstr:
+       <(null)\0>
diff --git a/usr/src/libc/stdio/doscan.c b/usr/src/libc/stdio/doscan.c
new file mode 100644 (file)
index 0000000..95a9bb0
--- /dev/null
@@ -0,0 +1,275 @@
+#include <stdio.h>
+#include       <ctype.h>
+
+#define        SPC     01
+#define        STP     02
+
+#define        SHORT   0
+#define        REGULAR 1
+#define        LONG    2
+#define        INT     0
+#define        FLOAT   1
+
+char   *_getccl();
+
+char   _sctab[128] = {
+       0,0,0,0,0,0,0,0,
+       0,SPC,SPC,0,0,0,0,0,
+       0,0,0,0,0,0,0,0,
+       0,0,0,0,0,0,0,0,
+       SPC,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,
+};
+
+_doscan(iop, fmt, argp)
+FILE *iop;
+register char *fmt;
+register int **argp;
+{
+       register int ch;
+       int nmatch, len, ch1;
+       int **ptr, fileended, size;
+
+       nmatch = 0;
+       fileended = 0;
+       for (;;) switch (ch = *fmt++) {
+       case '\0': 
+               return (nmatch);
+       case '%': 
+               if ((ch = *fmt++) == '%')
+                       goto def;
+               ptr = 0;
+               if (ch != '*')
+                       ptr = argp++;
+               else
+                       ch = *fmt++;
+               len = 0;
+               size = REGULAR;
+               while (isdigit(ch)) {
+                       len = len*10 + ch - '0';
+                       ch = *fmt++;
+               }
+               if (len == 0)
+                       len = 30000;
+               if (ch=='l') {
+                       ch = *fmt++;
+                       size = LONG;
+               } else if (ch=='h') {
+                       size = SHORT;
+                       ch = *fmt++;
+               } else if (ch=='[')
+                       fmt = _getccl(fmt);
+               if (isupper(ch)) {
+                       ch = tolower(ch);
+                       size = LONG;
+               }
+               if (ch == '\0')
+                       return(-1);
+               if (_innum(ptr, ch, len, size, iop, &fileended) && ptr)
+                       nmatch++;
+               if (fileended)
+                       return(nmatch? nmatch: -1);
+               break;
+
+       case ' ':
+       case '\n':
+       case '\t': 
+               while ((ch1 = getc(iop))==' ' || ch1=='\t' || ch1=='\n')
+                       ;
+               if (ch1 != EOF)
+                       ungetc(ch1, iop);
+               break;
+
+       default: 
+       def:
+               ch1 = getc(iop);
+               if (ch1 != ch) {
+                       if (ch1==EOF)
+                               return(-1);
+                       ungetc(ch1, iop);
+                       return(nmatch);
+               }
+       }
+}
+
+_innum(ptr, type, len, size, iop, eofptr)
+int **ptr, *eofptr;
+struct _iobuf *iop;
+{
+       extern double atof();
+       register char *np;
+       char numbuf[64];
+       register c, base;
+       int expseen, scale, negflg, c1, ndigit;
+       long lcval;
+
+       if (type=='c' || type=='s' || type=='[')
+               return(_instr(ptr? *(char **)ptr: (char *)NULL, type, len, iop, eofptr));
+       lcval = 0;
+       ndigit = 0;
+       scale = INT;
+       if (type=='e'||type=='f')
+               scale = FLOAT;
+       base = 10;
+       if (type=='o')
+               base = 8;
+       else if (type=='x')
+               base = 16;
+       np = numbuf;
+       expseen = 0;
+       negflg = 0;
+       while ((c = getc(iop))==' ' || c=='\t' || c=='\n');
+       if (c=='-') {
+               negflg++;
+               *np++ = c;
+               c = getc(iop);
+               len--;
+       } else if (c=='+') {
+               len--;
+               c = getc(iop);
+       }
+       for ( ; --len>=0; *np++ = c, c = getc(iop)) {
+               if (isdigit(c)
+                || base==16 && ('a'<=c && c<='f' || 'A'<=c && c<='F')) {
+                       ndigit++;
+                       if (base==8)
+                               lcval <<=3;
+                       else if (base==10)
+                               lcval = ((lcval<<2) + lcval)<<1;
+                       else
+                               lcval <<= 4;
+                       c1 = c;
+                       if ('0'<=c && c<='9')
+                               c -= '0';
+                       else if ('a'<=c && c<='f')
+                               c -= 'a'-10;
+                       else
+                               c -= 'A'-10;
+                       lcval += c;
+                       c = c1;
+                       continue;
+               } else if (c=='.') {
+                       if (base!=10 || scale==INT)
+                               break;
+                       ndigit++;
+                       continue;
+               } else if ((c=='e'||c=='E') && expseen==0) {
+                       if (base!=10 || scale==INT || ndigit==0)
+                               break;
+                       expseen++;
+                       *np++ = c;
+                       c = getc(iop);
+                       if (c!='+'&&c!='-'&&('0'>c||c>'9'))
+                               break;
+               } else
+                       break;
+       }
+       if (negflg)
+               lcval = -lcval;
+       if (c != EOF) {
+               ungetc(c, iop);
+               *eofptr = 0;
+       } else
+               *eofptr = 1;
+       if (ptr==NULL || np==numbuf)
+               return(0);
+       *np++ = 0;
+       switch((scale<<4) | size) {
+
+       case (FLOAT<<4) | SHORT:
+       case (FLOAT<<4) | REGULAR:
+               **(float **)ptr = atof(numbuf);
+               break;
+
+       case (FLOAT<<4) | LONG:
+               **(double **)ptr = atof(numbuf);
+               break;
+
+       case (INT<<4) | SHORT:
+               **(short **)ptr = lcval;
+               break;
+
+       case (INT<<4) | REGULAR:
+               **(int **)ptr = lcval;
+               break;
+
+       case (INT<<4) | LONG:
+               **(long **)ptr = lcval;
+               break;
+       }
+       return(1);
+}
+
+_instr(ptr, type, len, iop, eofptr)
+register char *ptr;
+register struct _iobuf *iop;
+int *eofptr;
+{
+       register ch;
+       register char *optr;
+       int ignstp;
+
+       *eofptr = 0;
+       optr = ptr;
+       if (type=='c' && len==30000)
+               len = 1;
+       ignstp = 0;
+       if (type=='s')
+               ignstp = SPC;
+       while (_sctab[ch = getc(iop)] & ignstp)
+               if (ch==EOF)
+                       break;
+       ignstp = SPC;
+       if (type=='c')
+               ignstp = 0;
+       else if (type=='[')
+               ignstp = STP;
+       while (ch!=EOF && (_sctab[ch]&ignstp)==0) {
+               if (ptr)
+                       *ptr++ = ch;
+               if (--len <= 0)
+                       break;
+               ch = getc(iop);
+       }
+       if (ch != EOF) {
+               if (len > 0)
+                       ungetc(ch, iop);
+               *eofptr = 0;
+       } else
+               *eofptr = 1;
+       if (ptr && ptr!=optr) {
+               if (type!='c')
+                       *ptr++ = '\0';
+               return(1);
+       }
+       return(0);
+}
+
+char *
+_getccl(s)
+register char *s;
+{
+       register c, t;
+
+       t = 0;
+       if (*s == '^') {
+               t++;
+               s++;
+       }
+       for (c = 0; c < 128; c++)
+               if (t)
+                       _sctab[c] &= ~STP;
+               else
+                       _sctab[c] |= STP;
+       while (((c = *s++)&0177) != ']') {
+               if (t)
+                       _sctab[c++] |= STP;
+               else
+                       _sctab[c++] &= ~STP;
+               if (c==0)
+                       return(--s);
+       }
+       return(s);
+}
diff --git a/usr/src/libc/stdio/ffltpr.s b/usr/src/libc/stdio/ffltpr.s
new file mode 100644 (file)
index 0000000..d816bf8
--- /dev/null
@@ -0,0 +1,12 @@
+/ C library-- fake floating output
+
+.globl pfloat
+.globl pscien
+.globl pgen
+
+pfloat:
+pscien:
+pgen:
+       add     $8,r4
+       movb    $'?,(r3)+
+       rts     pc
diff --git a/usr/src/libc/stdio/fgetc.c b/usr/src/libc/stdio/fgetc.c
new file mode 100644 (file)
index 0000000..3fdee12
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+fgetc(fp)
+FILE *fp;
+{
+       return(getc(fp));
+}
diff --git a/usr/src/libc/stdio/fgets.c b/usr/src/libc/stdio/fgets.c
new file mode 100644 (file)
index 0000000..fc7ee73
--- /dev/null
@@ -0,0 +1,21 @@
+#include       <stdio.h>
+
+char *
+fgets(s, n, iop)
+char *s;
+register FILE *iop;
+{
+       register c;
+       register char *cs;
+
+       cs = s;
+       while (--n>0 && (c = getc(iop))>=0) {
+               *cs++ = c;
+               if (c=='\n')
+                       break;
+       }
+       if (c<0 && cs==s)
+               return(NULL);
+       *cs++ = '\0';
+       return(s);
+}
diff --git a/usr/src/libc/stdio/fltpr.s b/usr/src/libc/stdio/fltpr.s
new file mode 100644 (file)
index 0000000..51cf7da
--- /dev/null
@@ -0,0 +1,129 @@
+/ C library-- floating output
+
+.globl pfloat
+.globl pscien
+.globl pgen
+.globl fltused
+
+.globl _ecvt
+.globl _fcvt
+.globl _gcvt
+
+fltused:               / force loading
+
+pgen:
+       mov     r3,-(sp)
+       mov     r0,-(sp)
+       tst     r2
+       bne     1f
+       mov     $6,(sp)
+1:
+       movf    (r4)+,fr0
+       movf    fr0,-(sp)
+       jsr     pc,_gcvt
+       add     $8+2+2,sp
+1:
+       tstb    (r3)+
+       bne     1b
+       dec     r3
+       rts     pc
+
+pfloat:
+       mov     $sign,-(sp)
+       mov     $decpt,-(sp)
+       tst     r2
+       bne     1f
+       mov     $6,r0
+1:
+       mov     r0,-(sp)
+       mov     r0,ndigit
+       movf    (r4)+,fr0
+       movf    fr0,-(sp)
+       jsr     pc,_fcvt
+       add     $8+2+2+2,sp
+       tst     sign
+       beq     1f
+       movb    $'-,(r3)+
+1:
+       mov     decpt,r2
+       bgt     1f
+       movb    $'0,(r3)+
+1:
+       mov     r2,r1
+       ble     1f
+2:
+       movb    (r0)+,(r3)+
+       sob     r1,2b
+1:
+       mov     ndigit,r1
+       beq     1f
+       movb    $'.,(r3)+
+1:
+       neg     r2
+       ble     1f
+2:
+       dec     r1
+       blt     1f
+       movb    $'0,(r3)+
+       sob     r2,2b
+1:
+       tst     r1
+       ble     2f
+1:
+       movb    (r0)+,(r3)+
+       sob     r1,1b
+2:
+       rts     pc
+
+pscien:
+       mov     $sign,-(sp)
+       mov     $decpt,-(sp)
+       mov     r0,-(sp)
+       mov     r0,ndigit
+       tst     r2
+       bne     1f
+       mov     $6,(sp)
+1:
+       movf    (r4)+,fr0
+       movf    fr0,-(sp)
+       jsr     pc,_ecvt
+       add     $8+2+2+2,sp
+       tst     sign
+       beq     1f
+       movb    $'-,(r3)+
+1:
+       cmpb    (r0),$'0
+       bne     1f
+       inc     decpt
+1:
+       movb    (r0)+,(r3)+
+       movb    $'.,(r3)+
+       mov     ndigit,r1
+       dec     r1
+       ble     1f
+2:
+       movb    (r0)+,(r3)+
+       sob     r1,2b
+1:
+       movb    $'e,(r3)+
+       mov     decpt,r2
+       dec     r2
+       mov     r2,r1
+       bge     1f
+       movb    $'-,(r3)+
+       neg     r1
+       br      2f
+1:
+       movb    $'+,(r3)+
+2:
+       clr     r0
+       div     $10.,r0
+       add     $'0,r0
+       movb    r0,(r3)+
+       add     $'0,r1
+       movb    r1,(r3)+
+       rts     pc
+.data
+sign:  .=.+2
+ndigit:        .=.+2
+decpt: .=.+2
diff --git a/usr/src/libc/stdio/fprintf.c b/usr/src/libc/stdio/fprintf.c
new file mode 100644 (file)
index 0000000..3abd1f9
--- /dev/null
@@ -0,0 +1,9 @@
+#include       <stdio.h>
+
+fprintf(iop, fmt, args)
+FILE *iop;
+char *fmt;
+{
+       _doprnt(fmt, &args, iop);
+       return(ferror(iop)? EOF: 0);
+}
diff --git a/usr/src/libc/stdio/fputc.c b/usr/src/libc/stdio/fputc.c
new file mode 100644 (file)
index 0000000..780547f
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+fputc(c, fp)
+FILE *fp;
+{
+       return(putc(c, fp));
+}
diff --git a/usr/src/libc/stdio/fputs.c b/usr/src/libc/stdio/fputs.c
new file mode 100644 (file)
index 0000000..f543586
--- /dev/null
@@ -0,0 +1,13 @@
+#include       <stdio.h>
+
+fputs(s, iop)
+register char *s;
+register FILE *iop;
+{
+       register r;
+       register c;
+
+       while (c = *s++)
+               r = putc(c, iop);
+       return(r);
+}
diff --git a/usr/src/libc/stdio/gcvt.c b/usr/src/libc/stdio/gcvt.c
new file mode 100644 (file)
index 0000000..db39bb7
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * gcvt  - Floating output conversion to
+ * minimal length string
+ */
+
+char   *ecvt();
+
+char *
+gcvt(number, ndigit, buf)
+double number;
+char *buf;
+{
+       int sign, decpt;
+       register char *p1, *p2;
+       register i;
+
+       p1 = ecvt(number, ndigit, &decpt, &sign);
+       p2 = buf;
+       if (sign)
+               *p2++ = '-';
+       for (i=ndigit-1; i>0 && p1[i]=='0'; i--)
+               ndigit--;
+       if (decpt >= 0 && decpt-ndigit > 4
+        || decpt < 0 && decpt < -3) { /* use E-style */
+               decpt--;
+               *p2++ = *p1++;
+               *p2++ = '.';
+               for (i=1; i<ndigit; i++)
+                       *p2++ = *p1++;
+               *p2++ = 'e';
+               if (decpt<0) {
+                       decpt = -decpt;
+                       *p2++ = '-';
+               } else
+                       *p2++ = '+';
+               *p2++ = decpt/10 + '0';
+               *p2++ = decpt%10 + '0';
+       } else {
+               if (decpt<=0) {
+                       if (*p1!='0')
+                               *p2++ = '.';
+                       while (decpt<0) {
+                               decpt++;
+                               *p2++ = '0';
+                       }
+               }
+               for (i=1; i<=ndigit; i++) {
+                       *p2++ = *p1++;
+                       if (i==decpt)
+                               *p2++ = '.';
+               }
+               if (ndigit<decpt) {
+                       while (ndigit++<decpt)
+                               *p2++ = '0';
+                       *p2++ = '.';
+               }
+       }
+       if (p2[-1]=='.')
+               p2--;
+       *p2 = '\0';
+       return(buf);
+}
diff --git a/usr/src/libc/stdio/getchar.c b/usr/src/libc/stdio/getchar.c
new file mode 100644 (file)
index 0000000..99382bb
--- /dev/null
@@ -0,0 +1,11 @@
+/*
+ * A subroutine version of the macro getchar.
+ */
+#include <stdio.h>
+
+#undef getchar
+
+getchar()
+{
+       return(getc(stdin));
+}
diff --git a/usr/src/libc/stdio/getgrent.c b/usr/src/libc/stdio/getgrent.c
new file mode 100644 (file)
index 0000000..bbe7ab7
--- /dev/null
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <grp.h>
+
+#define        CL      ':'
+#define        CM      ','
+#define        NL      '\n'
+#define        MAXGRP  100
+
+static char GROUP[] = "/etc/group";
+static FILE *grf = NULL;
+static char line[BUFSIZ+1];
+static struct group group;
+static char *gr_mem[MAXGRP];
+
+setgrent()
+{
+       if( !grf )
+               grf = fopen( GROUP, "r" );
+       else
+               rewind( grf );
+}
+
+endgrent()
+{
+       if( grf ){
+               fclose( grf );
+               grf = NULL;
+       }
+}
+
+static char *
+grskip(p,c)
+register char *p;
+register c;
+{
+       while( *p && *p != c ) ++p;
+       if( *p ) *p++ = 0;
+       return( p );
+}
+
+struct group *
+getgrent()
+{
+       register char *p, **q;
+
+       if( !grf && !(grf = fopen( GROUP, "r" )) )
+               return(NULL);
+       if( !(p = fgets( line, BUFSIZ, grf )) )
+               return(NULL);
+       group.gr_name = p;
+       group.gr_passwd = p = grskip(p,CL);
+       group.gr_gid = atoi( p = grskip(p,CL) );
+       group.gr_mem = gr_mem;
+       p = grskip(p,CL);
+       grskip(p,NL);
+       q = gr_mem;
+       while( *p ){
+               *q++ = p;
+               p = grskip(p,CM);
+       }
+       *q = NULL;
+       return( &group );
+}
diff --git a/usr/src/libc/stdio/getgrgid.c b/usr/src/libc/stdio/getgrgid.c
new file mode 100644 (file)
index 0000000..62fa18c
--- /dev/null
@@ -0,0 +1,14 @@
+#include <grp.h>
+
+struct group *
+getgrgid(gid)
+register gid;
+{
+       register struct group *p;
+       struct group *getgrent();
+
+       setgrent();
+       while( (p = getgrent()) && p->gr_gid != gid );
+       endgrent();
+       return(p);
+}
diff --git a/usr/src/libc/stdio/getgrnam.c b/usr/src/libc/stdio/getgrnam.c
new file mode 100644 (file)
index 0000000..28e4612
--- /dev/null
@@ -0,0 +1,14 @@
+#include <grp.h>
+
+struct group *
+getgrnam(name)
+register char *name;
+{
+       register struct group *p;
+       struct group *getgrent();
+
+       setgrent();
+       while( (p = getgrent()) && strcmp(p->gr_name,name) );
+       endgrent();
+       return(p);
+}
diff --git a/usr/src/libc/stdio/getpass.c b/usr/src/libc/stdio/getpass.c
new file mode 100644 (file)
index 0000000..51bf36b
--- /dev/null
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <signal.h>
+#include <sgtty.h>
+
+char *
+getpass(prompt)
+char *prompt;
+{
+       struct sgttyb ttyb;
+       int flags;
+       register char *p;
+       register c;
+       FILE *fi;
+       static char pbuf[9];
+       int (*signal())();
+       int (*sig)();
+
+       if ((fi = fopen("/dev/tty", "r")) == NULL)
+               fi = stdin;
+       else
+               setbuf(fi, (char *)NULL);
+       sig = signal(SIGINT, SIG_IGN);
+       gtty(fileno(fi), &ttyb);
+       flags = ttyb.sg_flags;
+       ttyb.sg_flags &= ~ECHO;
+       stty(fileno(fi), &ttyb);
+       fprintf(stderr, prompt);
+       for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
+               if (p < &pbuf[8])
+                       *p++ = c;
+       }
+       *p = '\0';
+       fprintf(stderr, "\n");
+       ttyb.sg_flags = flags;
+       stty(fileno(fi), &ttyb);
+       signal(SIGINT, sig);
+       if (fi != stdin)
+               fclose(fi);
+       return(pbuf);
+}
diff --git a/usr/src/libc/stdio/getpw.c b/usr/src/libc/stdio/getpw.c
new file mode 100644 (file)
index 0000000..22fc86c
--- /dev/null
@@ -0,0 +1,39 @@
+#include       <stdio.h>
+
+getpw(uid, buf)
+int uid;
+char buf[];
+{
+       static FILE *pwf;
+       register n, c;
+       register char *bp;
+
+       if(pwf == 0)
+               pwf = fopen("/etc/passwd", "r");
+       if(pwf == NULL)
+               return(1);
+       rewind(pwf);
+
+       for (;;) {
+               bp = buf;
+               while((c=getc(pwf)) != '\n') {
+                       if(c == EOF)
+                               return(1);
+                       *bp++ = c;
+               }
+               *bp++ = '\0';
+               bp = buf;
+               n = 3;
+               while(--n)
+               while((c = *bp++) != ':')
+                       if(c == '\n')
+                               return(1);
+               while((c = *bp++) != ':') {
+                       if(c<'0' || c>'9')
+                               continue;
+                       n = n*10+c-'0';
+               }
+               if(n == uid)
+                       return(0);
+       }
+}
diff --git a/usr/src/libc/stdio/getpwent.c b/usr/src/libc/stdio/getpwent.c
new file mode 100644 (file)
index 0000000..5aebd40
--- /dev/null
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <pwd.h>
+
+static char PASSWD[]   = "/etc/passwd";
+static char EMPTY[] = "";
+static FILE *pwf = NULL;
+static char line[BUFSIZ+1];
+static struct passwd passwd;
+
+setpwent()
+{
+       if( pwf == NULL )
+               pwf = fopen( PASSWD, "r" );
+       else
+               rewind( pwf );
+}
+
+endpwent()
+{
+       if( pwf != NULL ){
+               fclose( pwf );
+               pwf = NULL;
+       }
+}
+
+static char *
+pwskip(p)
+register char *p;
+{
+       while( *p && *p != ':' )
+               ++p;
+       if( *p ) *p++ = 0;
+       return(p);
+}
+
+struct passwd *
+getpwent()
+{
+       register char *p;
+
+       if (pwf == NULL) {
+               if( (pwf = fopen( PASSWD, "r" )) == NULL )
+                       return(0);
+       }
+       p = fgets(line, BUFSIZ, pwf);
+       if (p==NULL)
+               return(0);
+       passwd.pw_name = p;
+       p = pwskip(p);
+       passwd.pw_passwd = p;
+       p = pwskip(p);
+       passwd.pw_uid = atoi(p);
+       p = pwskip(p);
+       passwd.pw_gid = atoi(p);
+       passwd.pw_quota = 0;
+       passwd.pw_comment = EMPTY;
+       p = pwskip(p);
+       passwd.pw_gecos = p;
+       p = pwskip(p);
+       passwd.pw_dir = p;
+       p = pwskip(p);
+       passwd.pw_shell = p;
+       while(*p && *p != '\n') p++;
+       *p = '\0';
+       return(&passwd);
+}
diff --git a/usr/src/libc/stdio/getpwnam.c b/usr/src/libc/stdio/getpwnam.c
new file mode 100644 (file)
index 0000000..34cc0e7
--- /dev/null
@@ -0,0 +1,14 @@
+#include <pwd.h>
+
+struct passwd *
+getpwnam(name)
+char *name;
+{
+       register struct passwd *p;
+       struct passwd *getpwent();
+
+       setpwent();
+       while( (p = getpwent()) && strcmp(name,p->pw_name) );
+       endpwent();
+       return(p);
+}
diff --git a/usr/src/libc/stdio/getpwuid.c b/usr/src/libc/stdio/getpwuid.c
new file mode 100644 (file)
index 0000000..d086574
--- /dev/null
@@ -0,0 +1,14 @@
+#include <pwd.h>
+
+struct passwd *
+getpwuid(uid)
+register uid;
+{
+       register struct passwd *p;
+       struct passwd *getpwent();
+
+       setpwent();
+       while( (p = getpwent()) && p->pw_uid != uid );
+       endpwent();
+       return(p);
+}
diff --git a/usr/src/libc/stdio/gets.c b/usr/src/libc/stdio/gets.c
new file mode 100644 (file)
index 0000000..da51cb3
--- /dev/null
@@ -0,0 +1,17 @@
+#include       <stdio.h>
+
+char *
+gets(s)
+char *s;
+{
+       register c;
+       register char *cs;
+
+       cs = s;
+       while ((c = getchar()) != '\n' && c >= 0)
+               *cs++ = c;
+       if (c<0 && cs==s)
+               return(NULL);
+       *cs++ = '\0';
+       return(s);
+}
diff --git a/usr/src/libc/stdio/getw.c b/usr/src/libc/stdio/getw.c
new file mode 100644 (file)
index 0000000..572520e
--- /dev/null
@@ -0,0 +1,12 @@
+#include       <stdio.h>
+
+getw(iop)
+register struct _iobuf *iop;
+{
+       register i;
+
+       i = getc(iop);
+       if (iop->_flag&_IOEOF)
+               return(-1);
+       return(i | (getc(iop)<<8));
+}
diff --git a/usr/src/libc/stdio/popen.c b/usr/src/libc/stdio/popen.c
new file mode 100644 (file)
index 0000000..44fea97
--- /dev/null
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <signal.h>
+#define        tst(a,b)        (*mode == 'r'? (b) : (a))
+#define        RDR     0
+#define        WTR     1
+static int     popen_pid[20];
+
+FILE *
+popen(cmd,mode)
+char   *cmd;
+char   *mode;
+{
+       int p[2];
+       register myside, hisside, pid;
+
+       if(pipe(p) < 0)
+               return NULL;
+       myside = tst(p[WTR], p[RDR]);
+       hisside = tst(p[RDR], p[WTR]);
+       if((pid = fork()) == 0) {
+               /* myside and hisside reverse roles in child */
+               close(myside);
+               dup2(hisside, tst(0, 1));
+               close(hisside);
+               execl("/bin/sh", "sh", "-c", cmd, 0);
+               _exit(1);
+       }
+       if(pid == -1)
+               return NULL;
+       popen_pid[myside] = pid;
+       close(hisside);
+       return(fdopen(myside, mode));
+}
+
+pclose(ptr)
+FILE *ptr;
+{
+       register f, r, (*hstat)(), (*istat)(), (*qstat)();
+       int status;
+
+       f = fileno(ptr);
+       fclose(ptr);
+       istat = signal(SIGINT, SIG_IGN);
+       qstat = signal(SIGQUIT, SIG_IGN);
+       hstat = signal(SIGHUP, SIG_IGN);
+       while((r = wait(&status)) != popen_pid[f] && r != -1)
+               ;
+       if(r == -1)
+               status = -1;
+       signal(SIGINT, istat);
+       signal(SIGQUIT, qstat);
+       signal(SIGHUP, hstat);
+       return(status);
+}
diff --git a/usr/src/libc/stdio/printf.c b/usr/src/libc/stdio/printf.c
new file mode 100644 (file)
index 0000000..bfc28fb
--- /dev/null
@@ -0,0 +1,8 @@
+#include       <stdio.h>
+
+printf(fmt, args)
+char *fmt;
+{
+       _doprnt(fmt, &args, stdout);
+       return(ferror(stdout)? EOF: 0);
+}
diff --git a/usr/src/libc/stdio/putchar.c b/usr/src/libc/stdio/putchar.c
new file mode 100644 (file)
index 0000000..83ad2c6
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * A subroutine version of the macro putchar
+ */
+#include <stdio.h>
+
+#undef putchar
+
+putchar(c)
+register c;
+{
+       putc(c, stdout);
+}
diff --git a/usr/src/libc/stdio/puts.c b/usr/src/libc/stdio/puts.c
new file mode 100644 (file)
index 0000000..45fd37b
--- /dev/null
@@ -0,0 +1,11 @@
+#include       <stdio.h>
+
+puts(s)
+register char *s;
+{
+       register c;
+
+       while (c = *s++)
+               putchar(c);
+       return(putchar('\n'));
+}
diff --git a/usr/src/libc/stdio/putw.c b/usr/src/libc/stdio/putw.c
new file mode 100644 (file)
index 0000000..accd47e
--- /dev/null
@@ -0,0 +1,9 @@
+#include       <stdio.h>
+
+putw(i, iop)
+register i;
+register struct _iobuf *iop;
+{
+       putc(i, iop);
+       putc(i>>8, iop);
+}
diff --git a/usr/src/libc/stdio/rdwr.c b/usr/src/libc/stdio/rdwr.c
new file mode 100644 (file)
index 0000000..26385a8
--- /dev/null
@@ -0,0 +1,44 @@
+#include       <stdio.h>
+
+fread(ptr, size, count, iop)
+unsigned size, count;
+register char *ptr;
+register FILE *iop;
+{
+       register c;
+       unsigned ndone, s;
+
+       ndone = 0;
+       if (size)
+       for (; ndone<count; ndone++) {
+               s = size;
+               do {
+                       if ((c = getc(iop)) >= 0)
+                               *ptr++ = c;
+                       else
+                               return(ndone);
+               } while (--s);
+       }
+       return(ndone);
+}
+
+fwrite(ptr, size, count, iop)
+unsigned size, count;
+register char *ptr;
+register FILE *iop;
+{
+       register unsigned s;
+       unsigned ndone;
+
+       ndone = 0;
+       if (size)
+       for (; ndone<count; ndone++) {
+               s = size;
+               do {
+                       putc(*ptr++, iop);
+               } while (--s);
+               if (ferror(iop))
+                       break;
+       }
+       return(ndone);
+}
diff --git a/usr/src/libc/stdio/scanf.c b/usr/src/libc/stdio/scanf.c
new file mode 100644 (file)
index 0000000..012c567
--- /dev/null
@@ -0,0 +1,28 @@
+#include       <stdio.h>
+
+scanf(fmt, args)
+char *fmt;
+{
+       return(_doscan(stdin, fmt, &args));
+}
+
+fscanf(iop, fmt, args)
+FILE *iop;
+char *fmt;
+{
+       return(_doscan(iop, fmt, &args));
+}
+
+sscanf(str, fmt, args)
+register char *str;
+char *fmt;
+{
+       FILE _strbuf;
+
+       _strbuf._flag = _IOREAD|_IOSTRG;
+       _strbuf._ptr = _strbuf._base = str;
+       _strbuf._cnt = 0;
+       while (*str++)
+               _strbuf._cnt++;
+       return(_doscan(&_strbuf, fmt, &args));
+}
diff --git a/usr/src/libc/stdio/setbuf.c b/usr/src/libc/stdio/setbuf.c
new file mode 100644 (file)
index 0000000..58aa65a
--- /dev/null
@@ -0,0 +1,15 @@
+#include       <stdio.h>
+
+setbuf(iop, buf)
+register struct _iobuf *iop;
+char *buf;
+{
+       if (iop->_base != NULL && iop->_flag&_IOMYBUF)
+               free(iop->_base);
+       iop->_flag &= ~(_IOMYBUF|_IONBF);
+       if ((iop->_base = buf) == NULL)
+               iop->_flag |= _IONBF;
+       else
+               iop->_ptr = iop->_base;
+       iop->_cnt = 0;
+}
diff --git a/usr/src/libc/stdio/sprintf.c b/usr/src/libc/stdio/sprintf.c
new file mode 100644 (file)
index 0000000..a9c5ef9
--- /dev/null
@@ -0,0 +1,14 @@
+#include       <stdio.h>
+
+char *sprintf(str, fmt, args)
+char *str, *fmt;
+{
+       struct _iobuf _strbuf;
+
+       _strbuf._flag = _IOWRT+_IOSTRG;
+       _strbuf._ptr = str;
+       _strbuf._cnt = 32767;
+       _doprnt(fmt, &args, &_strbuf);
+       putc('\0', &_strbuf);
+       return(str);
+}
diff --git a/usr/src/libc/stdio/strout.c b/usr/src/libc/stdio/strout.c
new file mode 100644 (file)
index 0000000..f981583
--- /dev/null
@@ -0,0 +1,23 @@
+#include       <stdio.h>
+
+_strout(string, count, adjust, file, fillch)
+register char *string;
+register count;
+int adjust;
+register struct _iobuf *file;
+{
+       while (adjust < 0) {
+               if (*string=='-' && fillch=='0') {
+                       putc(*string++, file);
+                       count--;
+               }
+               putc(fillch, file);
+               adjust++;
+       }
+       while (--count>=0)
+               putc(*string++, file);
+       while (adjust) {
+               putc(fillch, file);
+               adjust--;
+       }
+}
diff --git a/usr/src/libc/stdio/system.c b/usr/src/libc/stdio/system.c
new file mode 100644 (file)
index 0000000..1649353
--- /dev/null
@@ -0,0 +1,22 @@
+#include       <signal.h>
+
+system(s)
+char *s;
+{
+       int status, pid, w;
+       register int (*istat)(), (*qstat)();
+
+       if ((pid = fork()) == 0) {
+               execl("/bin/sh", "sh", "-c", s, 0);
+               _exit(127);
+       }
+       istat = signal(SIGINT, SIG_IGN);
+       qstat = signal(SIGQUIT, SIG_IGN);
+       while ((w = wait(&status)) != pid && w != -1)
+               ;
+       if (w == -1)
+               status = -1;
+       signal(SIGINT, istat);
+       signal(SIGQUIT, qstat);
+       return(status);
+}
diff --git a/usr/src/libc/stdio/ungetc.c b/usr/src/libc/stdio/ungetc.c
new file mode 100644 (file)
index 0000000..23c5254
--- /dev/null
@@ -0,0 +1,16 @@
+#include <stdio.h>
+
+ungetc(c, iop)
+register FILE *iop;
+{
+       if (c == EOF)
+               return(-1);
+       if ((iop->_flag&_IOREAD)==0 || iop->_ptr <= iop->_base)
+               if (iop->_ptr == iop->_base && iop->_cnt==0)
+                       *iop->_ptr++;
+               else
+                       return(-1);
+       iop->_cnt++;
+       *--iop->_ptr = c;
+       return(0);
+}
diff --git a/usr/src/libc/sys/access.s b/usr/src/libc/sys/access.s
new file mode 100644 (file)
index 0000000..78c88ef
--- /dev/null
@@ -0,0 +1,26 @@
+/ access(file, request)
+/  test ability to access file in all indicated ways
+/  1 - read
+/  2 - write
+/  4 - execute
+
+.globl _access
+.globl csv, cret
+.comm  _errno,2
+
+.access = 33.
+
+_access:
+       jsr     r5,csv
+       mov     4(r5),0f+2
+       mov     6(r5),0f+4
+       clr     r0
+       sys     0; 0f
+.data
+0:     sys     .access; ..; ..
+.text
+       bec     1f
+       mov     r0,_errno
+       mov     $-1,r0
+1:
+       jmp     cret
diff --git a/usr/src/libc/sys/acct.s b/usr/src/libc/sys/acct.s
new file mode 100644 (file)
index 0000000..ecbbe47
--- /dev/null
@@ -0,0 +1,22 @@
+/ C library -- acct
+
+/ error = acct(string);
+
+.globl _acct
+.globl cerror
+.acct = 51.
+
+_acct:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .acct; 0:..
diff --git a/usr/src/libc/sys/alarm.s b/usr/src/libc/sys/alarm.s
new file mode 100644 (file)
index 0000000..e5f0068
--- /dev/null
@@ -0,0 +1,12 @@
+/ C library - alarm
+
+.globl _alarm
+.alarm = 27.
+
+_alarm:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       sys     .alarm
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/chdir.s b/usr/src/libc/sys/chdir.s
new file mode 100644 (file)
index 0000000..646f5e8
--- /dev/null
@@ -0,0 +1,22 @@
+/ C library -- chdir
+
+/ error = chdir(string);
+
+.globl _chdir
+.globl cerror
+.chdir = 12.
+
+_chdir:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .chdir; 0:..
diff --git a/usr/src/libc/sys/chmod.s b/usr/src/libc/sys/chmod.s
new file mode 100644 (file)
index 0000000..da58b90
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- chmod
+
+/ error = chmod(string, mode);
+
+.globl _chmod
+.globl cerror
+.chmod = 15.
+
+_chmod:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .chmod; 0:..; ..
diff --git a/usr/src/libc/sys/chown.s b/usr/src/libc/sys/chown.s
new file mode 100644 (file)
index 0000000..09dc3ee
--- /dev/null
@@ -0,0 +1,24 @@
+/ C library -- chown
+
+/ error = chown(string, owner);
+
+.globl _chown,
+.globl cerror
+.chown = 16.
+
+_chown:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       mov     8(r5),0f+4
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .chown; 0:..; ..; ..
diff --git a/usr/src/libc/sys/chroot.s b/usr/src/libc/sys/chroot.s
new file mode 100644 (file)
index 0000000..b7e3814
--- /dev/null
@@ -0,0 +1,22 @@
+/ C library -- chroot
+
+/ error = chroot(string);
+
+.globl _chroot
+.globl cerror
+.chroot = 61.
+
+_chroot:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .chroot; 0:..
diff --git a/usr/src/libc/sys/close.s b/usr/src/libc/sys/close.s
new file mode 100644 (file)
index 0000000..a540e6f
--- /dev/null
@@ -0,0 +1,19 @@
+/ C library -- close
+
+/ error =  close(file);
+
+.globl _close,
+.globl cerror
+.close = 6.
+
+_close:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       sys     .close
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/creat.s b/usr/src/libc/sys/creat.s
new file mode 100644 (file)
index 0000000..d9e3178
--- /dev/null
@@ -0,0 +1,24 @@
+/ C library -- creat
+
+/ file = creat(string, mode);
+/
+/ file == -1 if error
+
+.globl _creat
+.globl cerror
+.creat = 8.
+
+_creat:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .creat; 0:..; ..
diff --git a/usr/src/libc/sys/dup.s b/usr/src/libc/sys/dup.s
new file mode 100644 (file)
index 0000000..907df94
--- /dev/null
@@ -0,0 +1,28 @@
+/ C library -- dup
+
+/      f = dup(of [ ,nf])
+/      f == -1 for error
+
+.globl _dup,_dup2
+.globl cerror
+.dup = 41.
+
+_dup2:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       bis     $100,r0
+       br      1f
+
+_dup:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+1:
+       mov     6(r5),r1
+       sys     .dup
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/execl.s b/usr/src/libc/sys/execl.s
new file mode 100644 (file)
index 0000000..3195d81
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- execl
+
+/ execl(file, arg1, arg2, ... , 0);
+/
+/ environment automatically passed
+
+.globl _execl
+.globl cerror, _environ
+.exece = 59.
+
+_execl:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     r5,r0
+       add     $6,r0
+       mov     r0,0f+2
+       mov     _environ,0f+4
+       sys     0; 9f
+       jmp     cerror
+.data
+9:
+       sys     .exece; 0:..; ..; ..
diff --git a/usr/src/libc/sys/execle.s b/usr/src/libc/sys/execle.s
new file mode 100644 (file)
index 0000000..ccfd5e6
--- /dev/null
@@ -0,0 +1,25 @@
+/ C library -- execle
+
+/ execle(file, arg1, arg2, ... , 0, env);
+/
+
+.globl _execle
+.globl cerror
+.exece = 59.
+
+_execle:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     r5,r0
+       add     $6,r0
+       mov     r0,0f+2
+1:
+       tst     (r0)+
+       bne     1b
+       mov     (r0),0f+4
+       sys     0; 9f
+       jmp     cerror
+.data
+9:
+       sys     .exece; 0:..; ..; ..
diff --git a/usr/src/libc/sys/execv.s b/usr/src/libc/sys/execv.s
new file mode 100644 (file)
index 0000000..c4abfd0
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- execv
+
+/ execv(file, argv);
+/
+/ where argv is a vector argv[0] ... argv[x], 0
+/ last vector element must be 0
+/ environment passed automatically
+
+.globl _execv,
+.globl cerror, _environ
+.exece = 59.
+
+_execv:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       mov     _environ,0f+4
+       sys     0; 9f
+       jmp     cerror
+.data
+9:
+       sys     .exece; 0:..; ..; ..
diff --git a/usr/src/libc/sys/execve.s b/usr/src/libc/sys/execve.s
new file mode 100644 (file)
index 0000000..a270d0c
--- /dev/null
@@ -0,0 +1,22 @@
+/ C library -- execve
+
+/ execve(file, argv, env);
+/
+/ where argv is a vector argv[0] ... argv[x], 0
+/ last vector element must be 0
+
+.globl _execve
+.globl cerror
+.exece = 59.
+
+_execve:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       mov     8(r5),0f+4
+       sys     0; 9f
+       jmp     cerror
+.data
+9:
+       sys     .exece; 0:..; ..; ..
diff --git a/usr/src/libc/sys/exit.s b/usr/src/libc/sys/exit.s
new file mode 100644 (file)
index 0000000..2fc69de
--- /dev/null
@@ -0,0 +1,15 @@
+/ C library -- _exit
+
+/ _exit(code)
+/ code is return in r0 to system
+/ Same as plain exit, for user who want to define their own exit.
+
+.globl __exit
+.exit = 1.
+
+__exit:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       sys     .exit
+
diff --git a/usr/src/libc/sys/fork.s b/usr/src/libc/sys/fork.s
new file mode 100644 (file)
index 0000000..3d248ff
--- /dev/null
@@ -0,0 +1,26 @@
+/ C library -- fork
+
+/ pid = fork();
+/
+/ pid == 0 in child process; pid == -1 means error return
+/ in child, parents id is in par_uid if needed
+
+.globl _fork, _par_uid
+.globl cerror
+.fork = 2.
+
+_fork:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .fork
+               br 1f
+       bec     2f
+       jmp     cerror
+1:
+       mov     r0,_par_uid
+       clr     r0
+2:
+       mov     (sp)+,r5
+       rts     pc
+.bss
+_par_uid: .=.+2
diff --git a/usr/src/libc/sys/fstat.s b/usr/src/libc/sys/fstat.s
new file mode 100644 (file)
index 0000000..9c8bf77
--- /dev/null
@@ -0,0 +1,27 @@
+/ C library -- fstat
+
+/ error = fstat(file, statbuf);
+
+/ int statbuf[17] or
+/ char statbuf[34]
+/ as appropriate
+
+.globl _fstat
+.globl cerror
+.fstat = 28.
+
+_fstat:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       mov     6(r5),0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .fstat; 0:..
diff --git a/usr/src/libc/sys/getgid.s b/usr/src/libc/sys/getgid.s
new file mode 100644 (file)
index 0000000..0a017f1
--- /dev/null
@@ -0,0 +1,26 @@
+/ C library -- getgid, getegid
+
+/ gid = getgid();
+
+.globl _getgid
+.getgid = 47.
+
+_getgid:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .getgid
+       mov     (sp)+,r5
+       rts     pc
+
+/ gid = getegid();
+/ returns effective gid
+
+.globl _getegid
+
+_getegid:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .getgid
+       mov     r1,r0
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/getpid.s b/usr/src/libc/sys/getpid.s
new file mode 100644 (file)
index 0000000..4ed1dd3
--- /dev/null
@@ -0,0 +1,11 @@
+/ getpid -- get process ID
+
+.globl _getpid
+.getpid        = 20.
+
+_getpid:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .getpid
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/getuid.s b/usr/src/libc/sys/getuid.s
new file mode 100644 (file)
index 0000000..5f2f639
--- /dev/null
@@ -0,0 +1,27 @@
+/ C library -- getuid, geteuid
+
+/ uid = getuid();
+
+.globl _getuid
+.getuid = 24.
+
+_getuid:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .getuid
+       mov     (sp)+,r5
+       rts     pc
+
+
+/ uid = geteuid();
+/  returns effective uid
+
+.globl _geteuid
+
+_geteuid:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .getuid
+       mov     r1,r0
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/ioctl.s b/usr/src/libc/sys/ioctl.s
new file mode 100644 (file)
index 0000000..8a1b821
--- /dev/null
@@ -0,0 +1,26 @@
+/ C library -- ioctl
+
+/ ioctl(fdes, command, arg)
+/ struct * arg;
+/
+/ result == -1 if error
+
+.globl _ioctl, cerror
+.ioctl = 54.
+
+_ioctl:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       mov     8(r5),0f+4
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       clr     r0
+       rts     pc
+.data
+9:
+       sys     .ioctl; 0:..; ..; ..
diff --git a/usr/src/libc/sys/kill.s b/usr/src/libc/sys/kill.s
new file mode 100644 (file)
index 0000000..0a28e4a
--- /dev/null
@@ -0,0 +1,21 @@
+/ C library -- kill
+
+.globl _kill, cerror
+.kill = 37.
+
+_kill:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(sp),r0
+       mov     6(sp),8f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+
+.data
+9:
+       sys     .kill; 8:..
diff --git a/usr/src/libc/sys/link.s b/usr/src/libc/sys/link.s
new file mode 100644 (file)
index 0000000..525cd49
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- link
+
+/ error = link(old-file, new-file);
+
+.globl _link
+.globl cerror
+.link = 9.
+
+_link:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .link; 0:..; ..
diff --git a/usr/src/libc/sys/lock.s b/usr/src/libc/sys/lock.s
new file mode 100644 (file)
index 0000000..a5084b5
--- /dev/null
@@ -0,0 +1,22 @@
+/ lock -- C library
+
+/      lock(f)
+
+.globl _lock, cerror
+
+.lock = 53.
+
+_lock:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       .data
+9:
+       sys     .lock; 0:..
+       .text
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/lseek.s b/usr/src/libc/sys/lseek.s
new file mode 100644 (file)
index 0000000..df0bfa7
--- /dev/null
@@ -0,0 +1,26 @@
+/ C library -- lseek
+
+/ error = lseek(file, offset, ptr);
+/ long offset
+/ long lseek()
+
+.globl _lseek, cerror
+.lseek = 19.
+
+_lseek:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       mov     6(r5),0f
+       mov     8(r5),0f+2
+       mov     10.(r5),0f+4
+       sys     0; 9f
+       bec     1f
+       mov     $1,r1
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .lseek; 0:..; ..; ..
diff --git a/usr/src/libc/sys/mknod.s b/usr/src/libc/sys/mknod.s
new file mode 100644 (file)
index 0000000..8064307
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- mknod
+
+/ error = mknod(string, mode, major.minor);
+
+.globl _mknod, cerror
+
+.mknod = 14.
+_mknod:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       mov     8(r5),0f+4
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .mknod; 0:..; ..; ..
diff --git a/usr/src/libc/sys/mount.s b/usr/src/libc/sys/mount.s
new file mode 100644 (file)
index 0000000..f3f38c2
--- /dev/null
@@ -0,0 +1,24 @@
+/ C library -- mount
+
+/ error = mount(dev, file, flag)
+
+.globl _mount,
+.globl cerror
+.mount = 21.
+
+_mount:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(sp),0f
+       mov     6(sp),0f+2
+       mov     8(sp),0f+4
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .mount; 0:..; ..; ..
diff --git a/usr/src/libc/sys/nice.s b/usr/src/libc/sys/nice.s
new file mode 100644 (file)
index 0000000..3dda6d5
--- /dev/null
@@ -0,0 +1,19 @@
+/ C library-- nice
+
+/ error = nice(hownice)
+
+.globl _nice,
+.globl cerror
+.nice = 34.
+
+_nice:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(sp),r0
+       sys     .nice
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/open.s b/usr/src/libc/sys/open.s
new file mode 100644 (file)
index 0000000..b69cbb8
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- open
+
+/ file = open(string, mode)
+/ file == -1 means error
+
+.globl _open,
+.globl cerror
+.open = 5.
+
+_open:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .open; 0:..; ..
diff --git a/usr/src/libc/sys/pause.s b/usr/src/libc/sys/pause.s
new file mode 100644 (file)
index 0000000..1ebe761
--- /dev/null
@@ -0,0 +1,11 @@
+/ C library - pause
+
+.globl _pause
+.pause = 29.
+
+_pause:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .pause
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/phys.s b/usr/src/libc/sys/phys.s
new file mode 100644 (file)
index 0000000..e1279a1
--- /dev/null
@@ -0,0 +1,24 @@
+/ phys -- C library
+
+/      phys(seg, size, physad)
+
+.globl _phys, cerror
+
+.phys = 52.
+
+_phys:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       mov     8(r5),0f+4
+       sys     0; 9f
+       .data
+9:
+       sys     .phys; 0: ..; ..; ..
+       .text
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/pipe.s b/usr/src/libc/sys/pipe.s
new file mode 100644 (file)
index 0000000..04c8e59
--- /dev/null
@@ -0,0 +1,24 @@
+/ pipe -- C library
+
+/      pipe(f)
+/      int f[2];
+
+.globl _pipe, cerror
+
+.pipe = 42.
+
+_pipe:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .pipe
+       bec     1f
+       jmp     cerror
+1:
+       mov     r2,-(sp)
+       mov     4(r5),r2
+       mov     r0,(r2)+
+       mov     r1,(r2)
+       clr     r0
+       mov     (sp)+,r2
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/profil.s b/usr/src/libc/sys/profil.s
new file mode 100644 (file)
index 0000000..bc4abb9
--- /dev/null
@@ -0,0 +1,18 @@
+/ profil
+
+.globl _profil
+.prof = 44.
+
+_profil:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       mov     10(r5),0f+4
+       mov     12(r5),0f+6
+       sys     0; 9f
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .prof; 0:..; ..; ..; ..
diff --git a/usr/src/libc/sys/ptrace.s b/usr/src/libc/sys/ptrace.s
new file mode 100644 (file)
index 0000000..d400429
--- /dev/null
@@ -0,0 +1,28 @@
+/ ptrace -- C library
+
+/      result = ptrace(req, pid, addr, data);
+
+.ptrace = 26.
+indir = 0
+
+.globl _ptrace
+.globl cerror, _errno
+
+_ptrace:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4.(r5),0f+4
+       mov     6.(r5),0f+0
+       mov     8.(r5),0f+2
+       mov     10.(r5),r0
+       clr     _errno
+       sys     indir; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
+
+.data
+9:
+       sys     .ptrace; 0: .=.+6
diff --git a/usr/src/libc/sys/read.s b/usr/src/libc/sys/read.s
new file mode 100644 (file)
index 0000000..5225cf6
--- /dev/null
@@ -0,0 +1,24 @@
+/ C library -- read
+
+/ nread = read(file, buffer, count);
+/ nread ==0 means eof; nread == -1 means error
+
+.globl _read
+.globl cerror
+.read = 3.
+
+_read:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       mov     6(r5),0f
+       mov     8(r5),0f+2
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .read; 0:..; ..
diff --git a/usr/src/libc/sys/sbrk.s b/usr/src/libc/sys/sbrk.s
new file mode 100644 (file)
index 0000000..78e15e0
--- /dev/null
@@ -0,0 +1,45 @@
+/old = sbrk(increment);
+/
+/sbrk gets increment more core, and returns a pointer
+/      to the beginning of the new core area
+/
+.globl _sbrk, _brk
+.globl _end, cerror
+.break = 17.
+
+_sbrk:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       beq     1f
+       add     nd,0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     nd,r0
+       add     4(r5),nd
+       mov     (sp)+,r5
+       rts     pc
+
+/ brk(value)
+/ as described in man2.
+/ returns 0 for ok, -1 for error.
+
+_brk:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     4(r5),nd
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+
+.data
+9:
+       sys     .break; 0:..
+nd:    _end
diff --git a/usr/src/libc/sys/setgid.s b/usr/src/libc/sys/setgid.s
new file mode 100644 (file)
index 0000000..d781e6e
--- /dev/null
@@ -0,0 +1,19 @@
+/ C library -- setgid
+
+/ error = setgid(uid);
+
+.globl _setgid
+.globl cerror
+.setgid = 46.
+
+_setgid:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       sys     .setgid
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/setuid.s b/usr/src/libc/sys/setuid.s
new file mode 100644 (file)
index 0000000..25d2ef8
--- /dev/null
@@ -0,0 +1,19 @@
+/ C library -- setuid
+
+/ error = setuid(uid);
+
+.globl _setuid
+.globl cerror
+.setuid = 23.
+
+_setuid:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       sys     .setuid
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/signal.s b/usr/src/libc/sys/signal.s
new file mode 100644 (file)
index 0000000..ee2896c
--- /dev/null
@@ -0,0 +1,89 @@
+/ C library -- signal
+
+/ signal(n, 0); /* default action on signal(n) */
+/ signal(n, odd); /* ignore signal(n) */
+/ signal(n, label); /* goto label on signal(n) */
+/ returns old label, only one level.
+
+rtt    = 6
+.signal        = 48.
+.globl _signal, cerror
+
+_signal:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r1
+       cmp     r1,$NSIG
+       bhis    2f
+       mov     6(r5),r0
+       mov     r1,0f
+       asl     r1
+       mov     dvect(r1),-(sp)
+       mov     r0,dvect(r1)
+       mov     r0,0f+2
+       beq     1f
+       bit     $1,r0
+       bne     1f
+       asl     r1
+       add     $tvect,r1
+       mov     r1,0f+2
+1:
+       sys     0; 9f
+       bes     3f
+       bit     $1,r0
+       beq     1f
+       mov     r0,(sp)
+1:
+       mov     (sp)+,r0
+       mov     (sp)+,r5
+       rts     pc
+2:
+       mov     $22.,r0         / EINVAL
+3:
+       jmp     cerror
+
+NSIG = 0
+tvect:
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+       jsr     r0,1f; NSIG=NSIG+1
+
+1:
+       mov     r1,-(sp)
+       mov     r2,-(sp)
+       mov     r3,-(sp)
+       mov     r4,-(sp)
+       sub     $tvect+4,r0
+       asr     r0
+       mov     r0,-(sp)
+       asr     (sp)
+       jsr     pc,*dvect(r0)
+       tst     (sp)+
+       mov     (sp)+,r4
+       mov     (sp)+,r3
+       mov     (sp)+,r2
+       mov     (sp)+,r1
+       mov     (sp)+,r0
+       rtt
+.data
+9:
+       sys     .signal; 0:..; ..
+.bss
+dvect: .=.+[NSIG*2]
diff --git a/usr/src/libc/sys/stat.s b/usr/src/libc/sys/stat.s
new file mode 100644 (file)
index 0000000..1ed4cbc
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- stat
+
+/ error = stat(string, statbuf);
+
+.globl _stat
+.globl cerror
+.stat = 18.
+
+_stat:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .stat; 0:..; ..
diff --git a/usr/src/libc/sys/stime.s b/usr/src/libc/sys/stime.s
new file mode 100644 (file)
index 0000000..beeb26d
--- /dev/null
@@ -0,0 +1,19 @@
+/ error = stime(&long)
+
+.globl _stime
+.globl cerror
+.stime = 25.
+
+_stime:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(sp),r1
+       mov     (r1)+,r0
+       mov     (r1),r1
+       sys     .stime
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/sync.s b/usr/src/libc/sys/sync.s
new file mode 100644 (file)
index 0000000..a99cd2f
--- /dev/null
@@ -0,0 +1,9 @@
+.globl _sync
+.sync = 36.
+
+_sync:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .sync
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/time.s b/usr/src/libc/sys/time.s
new file mode 100644 (file)
index 0000000..3a56f6a
--- /dev/null
@@ -0,0 +1,37 @@
+/ C library -- time
+
+/ tvec = time(tvec);
+/
+/ tvec[0], tvec[1] contain the time
+
+.globl _time
+.time = 13.
+
+
+_time:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .time
+       mov     r2,-(sp)
+       mov     4(r5),r2
+       beq     1f
+       mov     r0,(r2)+
+       mov     r1,(r2)+
+1:
+       mov     (sp)+,r2
+       mov     (sp)+,r5
+       rts     pc
+
+.globl _ftime
+.ftime = 35.
+
+_ftime:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       .data
+9:     sys     .ftime; 0:..
+       .text
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/times.s b/usr/src/libc/sys/times.s
new file mode 100644 (file)
index 0000000..1ac8e4e
--- /dev/null
@@ -0,0 +1,15 @@
+/ C library -- times
+
+.globl _times
+.times = 43.
+
+_times:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .times; 0:..
diff --git a/usr/src/libc/sys/umask.s b/usr/src/libc/sys/umask.s
new file mode 100644 (file)
index 0000000..4c88760
--- /dev/null
@@ -0,0 +1,21 @@
+/ C library -- umask
+
+/ omask = umask(mode);
+
+.globl _umask
+.globl cerror
+.umask = 60.
+
+_umask:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .umask; 0:..
diff --git a/usr/src/libc/sys/umount.s b/usr/src/libc/sys/umount.s
new file mode 100644 (file)
index 0000000..a98a648
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- umount
+
+.globl _umount
+.globl cerror
+indir  = 0
+.umount = 22.
+.comm  _errno,2
+
+_umount:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(sp),0f
+       sys     indir; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+
+.data
+9:
+       sys     .umount; 0:..
diff --git a/usr/src/libc/sys/unlink.s b/usr/src/libc/sys/unlink.s
new file mode 100644 (file)
index 0000000..9aeb18a
--- /dev/null
@@ -0,0 +1,22 @@
+/ C library -- unlink
+
+/ error = unlink(string);
+
+.globl _unlink,
+.globl cerror
+.unlink = 10.
+
+_unlink:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .unlink; 0:..
diff --git a/usr/src/libc/sys/utime.s b/usr/src/libc/sys/utime.s
new file mode 100644 (file)
index 0000000..14a3071
--- /dev/null
@@ -0,0 +1,23 @@
+/ C library -- utime
+
+/ error = utime(string, timev);
+
+.globl _utime
+.globl cerror
+.utime = 30.
+
+_utime:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),0f+2
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .utime; 0:..; ..
diff --git a/usr/src/libc/sys/wait.s b/usr/src/libc/sys/wait.s
new file mode 100644 (file)
index 0000000..b4de107
--- /dev/null
@@ -0,0 +1,26 @@
+/ C library -- wait
+
+/ pid = wait(0);
+/   or,
+/ pid = wait(&status);
+/
+/ pid == -1 if error
+/ status indicates fate of process, if given
+
+.globl _wait
+.globl cerror
+.wait = 7.
+
+_wait:
+       mov     r5,-(sp)
+       mov     sp,r5
+       sys     .wait
+       bec     1f
+       jmp     cerror
+1:
+       tst     4(r5)
+       beq     1f
+       mov     r1,*4(r5)       / status return
+1:
+       mov     (sp)+,r5
+       rts     pc
diff --git a/usr/src/libc/sys/write.s b/usr/src/libc/sys/write.s
new file mode 100644 (file)
index 0000000..505795c
--- /dev/null
@@ -0,0 +1,25 @@
+/ C library -- write
+
+/ nwritten = write(file, buffer, count);
+/
+/ nwritten == -1 means error
+
+.globl _write
+.globl cerror
+.write = 4.
+
+_write:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       mov     6(r5),0f
+       mov     8(r5),0f+2
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       mov     (sp)+,r5
+       rts     pc
+.data
+9:
+       sys     .write; 0:..; ..
diff --git a/usr/src/libc/v6/access.c b/usr/src/libc/v6/access.c
new file mode 100644 (file)
index 0000000..bb4c968
--- /dev/null
@@ -0,0 +1,9 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+
+access(name, mode)
+{
+       struct stat foo;
+
+       return(stat(name, &foo));
+}
diff --git a/usr/src/libc/v6/chown.c b/usr/src/libc/v6/chown.c
new file mode 100644 (file)
index 0000000..ec0f9e8
--- /dev/null
@@ -0,0 +1,6 @@
+chown(name, owner, group)
+char *name;
+int owner, group;
+{
+       return(syscall(16, 0, 0, name, (group<<8)|(owner&0377), 0));
+}
diff --git a/usr/src/libc/v6/execl.c b/usr/src/libc/v6/execl.c
new file mode 100644 (file)
index 0000000..d19879e
--- /dev/null
@@ -0,0 +1,14 @@
+execl(name, arg1, a2, a3, a4, a5)
+char *name, arg1, a2, a3, a4, a5;
+{
+       char *args[6];
+
+       args[0] = arg1;
+       args[1] = a2;
+       args[2] = a3;
+       args[3] = a4;
+       args[4] = a5;
+       args[5] = 0;
+
+       syscall(11, 0, 0, name, args, 0);
+}
diff --git a/usr/src/libc/v6/ftime.c b/usr/src/libc/v6/ftime.c
new file mode 100644 (file)
index 0000000..2a069e7
--- /dev/null
@@ -0,0 +1,16 @@
+#include <sys/types.h>
+#include <sys/timeb.h>
+
+static struct timeb gorp = {
+       0L,
+       0,
+       5*60,
+       1
+};
+
+ftime(gorpp)
+struct timeb *gorpp;
+{
+       *gorpp = gorp;
+       return(0);
+}
diff --git a/usr/src/libc/v6/gtty.c b/usr/src/libc/v6/gtty.c
new file mode 100644 (file)
index 0000000..62c2913
--- /dev/null
@@ -0,0 +1,8 @@
+gtty(fd, buf)
+int fd;
+int *buf;
+{
+       if (syscall(32, fd, 0, buf, 0, 0) < 0)
+               return(-1);
+       return(0);
+}
diff --git a/usr/src/libc/v6/lseek.c b/usr/src/libc/v6/lseek.c
new file mode 100644 (file)
index 0000000..c3f0e0a
--- /dev/null
@@ -0,0 +1,14 @@
+lseek(fd, off, ptr)
+int fd, ptr;
+long off;
+{
+       unsigned a;
+
+       a = off;
+
+       if (a == off)
+               return (syscall(19, fd, 0, a, ptr, 0));
+       a = off/512;
+       syscall(19, fd, 0, a, ptr+3, 0);
+       return(syscall(19, fd, 0, (int) (off%512), ptr, 0));
+}
diff --git a/usr/src/libc/v6/stat.c b/usr/src/libc/v6/stat.c
new file mode 100644 (file)
index 0000000..2cefcd4
--- /dev/null
@@ -0,0 +1,57 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+
+struct ostat {
+       short os_dev;
+       short os_inum;
+       short os_flags;
+       char  os_nlinks;
+       char  os_uid;
+       char  os_gid;
+       char  os_size0;
+       short os_size1;
+       short os_addr[8];
+       long  os_actime;
+       long  os_modtime;
+} osbuf;
+
+stat(name, buf)
+char *name;
+struct stat *buf;
+{
+       if (syscall(18, 0, 0, name, &osbuf, 0) < 0)
+               return(-1);
+
+       stcopyit(buf);
+       return(0);
+}
+
+fstat(fd, buf)
+int fd;
+struct stat *buf;
+{
+       if (syscall(28, fd, 0, &osbuf, 0, 0) < 0)
+               return(-1);
+       stcopyit(buf);
+       return(0);
+}
+
+static
+stcopyit(buf)
+struct stat *buf;
+{
+       buf->st_dev = osbuf.os_dev;
+       buf->st_ino = osbuf.os_inum;
+       buf->st_mode = osbuf.os_flags;
+       buf->st_mode &= 067777;
+       if ((buf->st_mode&060000) == 0)
+               buf->st_mode |= 0100000;
+       buf->st_nlink = osbuf.os_nlinks;
+       buf->st_uid = osbuf.os_uid;
+       buf->st_gid = osbuf.os_gid;
+       buf->st_rdev = 0;
+       buf->st_size = ( (long) osbuf.os_size0 << 16) | osbuf.os_size1;
+       buf->st_atime = osbuf.os_actime;
+       buf->st_mtime = osbuf.os_modtime;
+       buf->st_ctime = buf->st_mtime;
+}
diff --git a/usr/src/libc/v6/syscall.s b/usr/src/libc/v6/syscall.s
new file mode 100644 (file)
index 0000000..d5ed33b
--- /dev/null
@@ -0,0 +1,27 @@
+/ syscall
+
+.globl _syscall,csv,cret,cerror
+_syscall:
+       jsr     r5,csv
+       mov     r5,r2
+       add     $04,r2
+       mov     $9f,r3
+       mov     (r2)+,r0
+       bic     $!0377,r0
+       bis     $sys,r0
+       mov     r0,(r3)+
+       mov     (r2)+,r0
+       mov     (r2)+,r1
+       mov     (r2)+,(r3)+
+       mov     (r2)+,(r3)+
+       mov     (r2)+,(r3)+
+       mov     (r2)+,(r3)+
+       mov     (r2)+,(r3)+
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       jmp     cret
+
+       .data
+9:     .=.+12.