mirror of
https://github.com/DoctorWkt/unix-jun72.git
synced 2026-02-02 06:51:49 +00:00
frag54 -> cp.c with a few char pointer changes
frag19 -> ls.s
This commit is contained in:
50
src/cmd/cp.c
Normal file
50
src/cmd/cp.c
Normal file
@@ -0,0 +1,50 @@
|
||||
main(argc,argv)
|
||||
char argv[][];
|
||||
{
|
||||
char buf[512];
|
||||
int fold, fnew, n;
|
||||
char p1[], p2[], bp[];
|
||||
int mode;
|
||||
if(argc != 3) {
|
||||
write(1,"Usage: cp oldfile newfile\n",26);
|
||||
exit();
|
||||
}
|
||||
if((fold = open(argv[1],0)) < 0){
|
||||
write(1,"Cannot open old file.\n",22);
|
||||
exit();
|
||||
}
|
||||
fstat(fold,buf);
|
||||
mode = buf[2] & 037;
|
||||
if((fnew = creat(argv[2],mode)) < 0){
|
||||
stat(argv[2], buf);
|
||||
if((buf[3] & 0100) != 0){
|
||||
p1 = argv[1] - 1;
|
||||
p2 = argv[2] - 1;
|
||||
bp = buf - 1;
|
||||
while(*++bp = *++p2);
|
||||
*bp = '/';
|
||||
p2 = bp;
|
||||
while(*++bp = *++p1)
|
||||
if(*bp == '/')
|
||||
bp = p2;
|
||||
if((fnew = creat(buf,mode)) < 0){
|
||||
write(1,"Cannot creat new file.\n",23);
|
||||
exit();
|
||||
}
|
||||
}else{
|
||||
write(1,"Cannot creat new file.\n",23);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
while(n = read(fold, buf, 512))
|
||||
if(n < 0){
|
||||
write(1,"Read error\n",11);
|
||||
exit();
|
||||
}else
|
||||
if(write(fnew,buf,n) != n){
|
||||
write(1,"Write error.\n",13);
|
||||
exit();
|
||||
}
|
||||
fstat(fnew,buf);
|
||||
exit();
|
||||
}
|
||||
584
src/cmd/ls.s
Normal file
584
src/cmd/ls.s
Normal file
@@ -0,0 +1,584 @@
|
||||
/ ls -- list file or directory
|
||||
|
||||
.globl flush
|
||||
.globl fopen
|
||||
.globl getw
|
||||
.globl getc
|
||||
.globl putc
|
||||
.globl ctime
|
||||
.globl end
|
||||
|
||||
sys break; end+512.
|
||||
mov $1,obuf
|
||||
mov sp,r5
|
||||
mov (r5)+,count
|
||||
tst (r5)+
|
||||
dec count
|
||||
mov count,ocount
|
||||
bgt loop
|
||||
mov $dotp,r5
|
||||
loop:
|
||||
mov (r5)+,r4
|
||||
cmpb (r4)+,$'-
|
||||
bne 1f
|
||||
dec ocount
|
||||
3:
|
||||
movb (r4)+,r0
|
||||
beq eloop
|
||||
cmp r0,$'l
|
||||
bne 4f
|
||||
inc longf
|
||||
br 3b
|
||||
4:
|
||||
cmpb r0,$'t
|
||||
bne 4f
|
||||
mov $14.,sortoff
|
||||
br 3b
|
||||
4:
|
||||
cmpb r0,$'a
|
||||
bne 4f
|
||||
inc allflg
|
||||
br 3b
|
||||
4:
|
||||
cmpb r0,$'s
|
||||
bne 4f
|
||||
incb longf+1
|
||||
br 3b
|
||||
4:
|
||||
cmpb r0,$'d
|
||||
bne 3b
|
||||
inc dirflg
|
||||
br 3b
|
||||
1:
|
||||
dec r4
|
||||
jsr pc,do
|
||||
eloop:
|
||||
dec count
|
||||
bgt loop
|
||||
tst dnp
|
||||
bne 1f
|
||||
mov $dotp,r5
|
||||
br loop
|
||||
1:
|
||||
jsr r5,flush; obuf
|
||||
sys exit
|
||||
|
||||
do:
|
||||
clr tblocks
|
||||
mov $end,r1
|
||||
mov $filnam,r3
|
||||
mov r4,dnp
|
||||
clr isadir
|
||||
tst dirflg
|
||||
bne nondir
|
||||
sys stat; dnp: 0; statb
|
||||
bec 1f
|
||||
jsr r5,questf; < nonexistent\n\0>; .even
|
||||
rts pc
|
||||
1:
|
||||
bit $40000,statb+2 /test directory
|
||||
beq nondir
|
||||
inc isadir
|
||||
mov r4,r0
|
||||
jsr r5,fopen; dbuf
|
||||
bcc 1f
|
||||
jsr r5,questf; < unreadable\n\0>; .even
|
||||
rts pc
|
||||
1:
|
||||
movb (r4)+,(r3)+
|
||||
bne 1b
|
||||
dec r3
|
||||
cmpb -1(r3),$'/
|
||||
beq 1f
|
||||
movb $'/,(r3)+
|
||||
1:
|
||||
jsr r5,getw; dbuf
|
||||
bcs pass2
|
||||
mov $4,-(sp)
|
||||
tst r0
|
||||
bne 2f
|
||||
3:
|
||||
jsr r5,getw; dbuf
|
||||
dec (sp)
|
||||
bne 3b
|
||||
tst (sp)+
|
||||
br 1b
|
||||
2:
|
||||
mov r3,r2
|
||||
2:
|
||||
jsr r5,getw; dbuf
|
||||
mov r0,(r1)+
|
||||
movb r0,(r2)+
|
||||
swab r0
|
||||
movb r0,(r2)+
|
||||
dec (sp)
|
||||
bne 2b
|
||||
tst (sp)+
|
||||
clrb (r2)+
|
||||
tst allflg
|
||||
bne 2f
|
||||
cmpb (r3),$'.
|
||||
bne 2f
|
||||
sub $8.,r1
|
||||
br 1b
|
||||
2:
|
||||
jsr r5,gstat
|
||||
br 1b
|
||||
nondir:
|
||||
mov r3,r2
|
||||
1:
|
||||
movb (r4)+,(r2)+
|
||||
bne 1b
|
||||
1:
|
||||
cmp r2,r3
|
||||
blos 1f
|
||||
cmpb -(r2),$'/
|
||||
bne 1b
|
||||
inc r2
|
||||
1:
|
||||
mov $8.,-(sp)
|
||||
1:
|
||||
movb (r2)+,(r1)+
|
||||
bne 2f
|
||||
dec r2
|
||||
2:
|
||||
dec (sp)
|
||||
bne 1b
|
||||
jsr r5,gstat
|
||||
tst (sp)+
|
||||
|
||||
pass2:
|
||||
mov dbuf,r0
|
||||
sys close
|
||||
mov $end,r2
|
||||
cmp r1,r2
|
||||
bne 1f
|
||||
rts pc
|
||||
1:
|
||||
mov r5,-(sp)
|
||||
mov r1,-(sp)
|
||||
add sortoff,r2
|
||||
1:
|
||||
mov r2,(r1)+
|
||||
add $20.,r2
|
||||
cmp r2,(sp)
|
||||
blo 1b
|
||||
mov (sp),r2
|
||||
tst -(r1)
|
||||
1:
|
||||
mov r2,r3
|
||||
2:
|
||||
tst (r3)+
|
||||
cmp r3,r1
|
||||
bhi 2f
|
||||
mov (r2),r4
|
||||
mov (r3),r5
|
||||
tst sortoff
|
||||
beq 4f
|
||||
cmp (r4)+,(r5)+
|
||||
blo 3f
|
||||
bhi 2b
|
||||
cmp (r4)+,(r5)+
|
||||
blo 3f
|
||||
br 2b
|
||||
4:
|
||||
4:
|
||||
cmpb (r4)+,(r5)+
|
||||
bhi 3f
|
||||
blo 2b
|
||||
dec r0
|
||||
br 4b
|
||||
3:
|
||||
mov (r2),-(sp)
|
||||
mov (r3),(r2)
|
||||
mov (sp)+,(r3)
|
||||
br 2b
|
||||
2:
|
||||
tst (r2)+
|
||||
cmp r2,r1
|
||||
blo 1b
|
||||
1:
|
||||
mov (sp)+,r2
|
||||
mov (sp)+,r5
|
||||
|
||||
pass3:
|
||||
cmp ocount,$1
|
||||
ble 1f
|
||||
tst isadir
|
||||
beq 2f
|
||||
mov dnp,0f
|
||||
jsr r5,pstring; 0:..
|
||||
jsr r5,pstring; colon
|
||||
1:
|
||||
tst longf
|
||||
beq 1f
|
||||
jsr r5,pstring; totmes
|
||||
mov tblocks,r0
|
||||
jsr r5,decimal; 4
|
||||
jsr r5,pstring; nl
|
||||
2:
|
||||
tstb longf
|
||||
beq 1f
|
||||
mov $passwd,r0
|
||||
jsr r5,fopen; iobuf
|
||||
bes 1f
|
||||
mov $uidbuf,r3
|
||||
3:
|
||||
2:
|
||||
jsr r5,getc; iobuf
|
||||
bes 3f
|
||||
movb r0,(r3)+
|
||||
cmpb r0,$':
|
||||
bne 2b
|
||||
2:
|
||||
jsr r5,getc; iobuf
|
||||
cmpb r0,$':
|
||||
bne 2b
|
||||
2:
|
||||
jsr r5,getc; iobuf
|
||||
cmpb r0,$':
|
||||
beq 2f
|
||||
movb r0,(r3)+
|
||||
br 2b
|
||||
2:
|
||||
movb $'\n,(r3)+
|
||||
cmp r3,$euidbuf
|
||||
bhis 3f
|
||||
2:
|
||||
jsr r5,getc; iobuf
|
||||
cmpb r0,$'\n
|
||||
bne 2b
|
||||
br 3b
|
||||
3:
|
||||
mov r3,euids
|
||||
sys close
|
||||
1:
|
||||
cmp r2,r1
|
||||
bhi 1f
|
||||
mov (r2)+,r3
|
||||
sub sortoff,r3
|
||||
jsr r5,pentry
|
||||
mov $8.,-(sp)
|
||||
2:
|
||||
movb (r3)+,r0
|
||||
beq 2f
|
||||
jsr r5,putc; obuf
|
||||
dec (sp)
|
||||
bne 2b
|
||||
2:
|
||||
tst (sp)+
|
||||
jsr r5,pstring; nl
|
||||
br 1b
|
||||
1:
|
||||
cmp ocount,$1
|
||||
ble 1f
|
||||
tst isadir
|
||||
beq 1f
|
||||
jsr r5,pstring; nl
|
||||
1:
|
||||
rts pc
|
||||
|
||||
pentry:
|
||||
mov r2,-(sp)
|
||||
tstb longf
|
||||
bne listl
|
||||
tstb longf+1
|
||||
bne 2f
|
||||
mov (sp)+,r2
|
||||
rts r5
|
||||
2:
|
||||
mov 12.(r3),r0
|
||||
jsr r5,calcb
|
||||
jsr r5,decimal; 3
|
||||
jsr r5,pstring; space
|
||||
mov (sp)+,r2
|
||||
rts r5
|
||||
pstring:
|
||||
mov r5,-(sp)
|
||||
mov (r5),r5
|
||||
1:
|
||||
movb (r5)+,r0
|
||||
beq 1f
|
||||
jsr r5,putc; obuf
|
||||
br 1b
|
||||
1:
|
||||
mov (sp)+,r5
|
||||
tst (r5)+
|
||||
rts r5
|
||||
|
||||
questf:
|
||||
mov r4,0f
|
||||
jsr r5,pstring; 0:..
|
||||
mov r5,0f
|
||||
jsr r5,pstring; 0:..
|
||||
1:
|
||||
tstb (r5)+
|
||||
bne 1b
|
||||
inc r5
|
||||
bic $1,r5
|
||||
rts r5
|
||||
listl:
|
||||
mov 18.(r3),r0 / inode
|
||||
jsr r5,decimal; 4
|
||||
jsr r5,pstring; space
|
||||
mov r3,r4
|
||||
add $8.,r4 / get to flags
|
||||
bit $10000,(r4) /large
|
||||
beq 2f
|
||||
jsr r5,mode; 'l
|
||||
br 3f
|
||||
2:
|
||||
jsr r5,mode; 's
|
||||
3:
|
||||
bit $40000,(r4) /directory
|
||||
beq 2f
|
||||
jsr r5,mode; 'd
|
||||
br 3f
|
||||
2:
|
||||
bit $40,(r4) /set uid
|
||||
beq 2f
|
||||
jsr r5,mode; 'u
|
||||
br 3f
|
||||
2:
|
||||
bit $20,(r4) /executable
|
||||
beq 2f
|
||||
jsr r5,mode; 'x
|
||||
br 3f
|
||||
2:
|
||||
jsr r5,mode; '-
|
||||
3:
|
||||
bit $10,(r4) /read owner
|
||||
beq 2f
|
||||
jsr r5,mode; 'r
|
||||
br 3f
|
||||
2:
|
||||
jsr r5, mode; '-
|
||||
3:
|
||||
bit $4,(r4) /write owner
|
||||
beq 2f
|
||||
jsr r5,mode; 'w
|
||||
br 3f
|
||||
2:
|
||||
jsr r5,mode; '-
|
||||
3:
|
||||
bit $2,(r4) /read non-owner
|
||||
beq 2f
|
||||
jsr r5,mode; 'r
|
||||
br 3f
|
||||
2:
|
||||
jsr r5,mode; '-
|
||||
3:
|
||||
bit $1,(r4)+ /write non-owner
|
||||
beq 2f
|
||||
jsr r5,mode; 'w
|
||||
br 3f
|
||||
2:
|
||||
jsr r5,mode; '-
|
||||
3:
|
||||
jsr r5,pstring; space
|
||||
movb (r4)+,r0
|
||||
jsr r5,decimal; 2
|
||||
movb (r4)+,r2
|
||||
jsr pc,puid
|
||||
mov (r4)+,r0
|
||||
jsr r5,decimal; 5
|
||||
jsr r5,pstring; space
|
||||
mov r1,-(sp)
|
||||
mov (r4)+,r0
|
||||
mov (r4)+,r1
|
||||
sub $16.,sp
|
||||
mov sp,r2
|
||||
jsr pc,ctime
|
||||
mov sp,r2
|
||||
mov $15.,-(sp)
|
||||
1:
|
||||
movb (r2)+,r0
|
||||
jsr r5,putc; obuf
|
||||
dec (sp)
|
||||
bne 1b
|
||||
add $18.,sp
|
||||
mov (sp)+,r1
|
||||
jsr r5,pstring; space
|
||||
mov (sp)+,r2
|
||||
rts r5
|
||||
|
||||
puid:
|
||||
mov r1,-(sp)
|
||||
mov $uidbuf,r1
|
||||
1:
|
||||
cmp r1,euids
|
||||
bhis 1f
|
||||
mov r1,0f
|
||||
2:
|
||||
tstb (r1)+
|
||||
beq 3f
|
||||
cmpb -1(r1),$':
|
||||
bne 2b
|
||||
clrb -1(r1)
|
||||
3:
|
||||
clr -(sp)
|
||||
3:
|
||||
movb (r1)+,r0
|
||||
sub $'0,r0
|
||||
cmp r0,$9.
|
||||
bhi 3f
|
||||
mov r1,-(sp)
|
||||
mov 2(sp),r1
|
||||
mpy $10.,r1
|
||||
add r0,r1
|
||||
mov r1,2(sp)
|
||||
mov (sp)+,r1
|
||||
br 3b
|
||||
3:
|
||||
mov (sp)+,r0
|
||||
cmp r0,r2
|
||||
bne 1b
|
||||
jsr r5,pstring; space
|
||||
jsr r5,pstring; 0:..
|
||||
mov 0b,r1
|
||||
mov $6,-(sp)
|
||||
3:
|
||||
tstb (r1)+
|
||||
beq 3f
|
||||
dec (sp)
|
||||
br 3b
|
||||
3:
|
||||
jsr r5,pstring; space
|
||||
dec (sp)
|
||||
bgt 3b
|
||||
tst (sp)+
|
||||
mov (sp)+,r1
|
||||
rts pc
|
||||
1:
|
||||
jsr r5,pstring; space
|
||||
mov r2,r0
|
||||
jsr r5,decimal; 3
|
||||
jsr r5,pstring; space3
|
||||
mov (sp)+,r1
|
||||
rts pc
|
||||
|
||||
mode:
|
||||
mov (r5)+,r0
|
||||
jsr r5,putc; obuf
|
||||
rts r5
|
||||
|
||||
|
||||
gstat:
|
||||
mov r1,-(sp)
|
||||
add $512.,r1
|
||||
cmp r1,0f
|
||||
blo 1f
|
||||
mov r1,0f
|
||||
sys break; 0: end+512.
|
||||
1:
|
||||
mov (sp)+,r1
|
||||
tst longf
|
||||
bne 2f
|
||||
tst sortoff
|
||||
beq 1f
|
||||
2:
|
||||
sys stat; filnam; statb
|
||||
bec 2f
|
||||
mov r4,-(sp)
|
||||
mov $filnam,r4
|
||||
jsr r5,questf; < unstatable\n\0>; .even
|
||||
mov (sp)+,r4
|
||||
add $12.,r1
|
||||
rts r5
|
||||
2:
|
||||
mov $statb+2,r0
|
||||
mov (r0)+,(r1)+ /flags
|
||||
mov (r0)+,(r1)+ /nlinks, uid
|
||||
mov r0,-(sp)
|
||||
mov (r0),r0
|
||||
jsr r5,calcb
|
||||
add r0,tblocks
|
||||
mov (sp)+,r0
|
||||
mov (r0)+,(r1)+ /size
|
||||
add $20.,r0 /dska, ctim
|
||||
mov (r0)+,(r1)+ /mtim
|
||||
mov (r0)+,(r1)+
|
||||
mov statb,(r1)+ /inode
|
||||
rts r5
|
||||
1:
|
||||
add $12.,r1
|
||||
rts r5
|
||||
|
||||
decimal:
|
||||
mov r1,-(sp)
|
||||
mov r2,-(sp)
|
||||
mov r3,-(sp)
|
||||
mov $6,r2
|
||||
mov $numbuf+6,r3
|
||||
1:
|
||||
mov r0,r1
|
||||
clr r0
|
||||
dvd $10.,r0
|
||||
add $'0,r1
|
||||
movb r1,-(r3)
|
||||
sob r2,1b
|
||||
1:
|
||||
cmp r3,$numbuf+5
|
||||
beq 1f
|
||||
cmpb (r3),$'0
|
||||
bne 1f
|
||||
movb $' ,(r3)+
|
||||
br 1b
|
||||
1:
|
||||
mov $numbuf+6,r1
|
||||
sub (r5),r1
|
||||
mov (r5)+,-(sp)
|
||||
1:
|
||||
movb (r1)+,r0
|
||||
jsr r5,putc; obuf
|
||||
dec (sp)
|
||||
bne 1b
|
||||
tst (sp)+
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r2
|
||||
mov (sp)+,r1
|
||||
rts r5
|
||||
|
||||
calcb:
|
||||
add $511.,r0
|
||||
clrb r0
|
||||
swab r0
|
||||
asr r0
|
||||
cmp r0,$8
|
||||
blo 1f
|
||||
inc r0
|
||||
1:
|
||||
1:
|
||||
rts r5
|
||||
|
||||
|
||||
dotp: dot
|
||||
euids: uidbuf
|
||||
|
||||
dot: <.\0>
|
||||
nl: <\n\0>
|
||||
totmes: <total \0>
|
||||
space3: < >
|
||||
space: < \0>
|
||||
passwd: </etc/passwd\0>
|
||||
colon: <:\n\0>
|
||||
.even
|
||||
|
||||
.bss
|
||||
|
||||
count: .=.+2
|
||||
ocount: .=.+2
|
||||
longf: .=.+2
|
||||
sortoff: .=.+2
|
||||
allflg: .=.+2
|
||||
dirflg: .=.+2
|
||||
isadir: .=.+2
|
||||
filnam: .=.+32.
|
||||
statb: .=.+34.
|
||||
dbuf: .=.+518.
|
||||
obuf: .=.+518.
|
||||
numbuf: .=.+6
|
||||
tblocks: .=.+2
|
||||
uidbuf: .=.+1024.
|
||||
euidbuf:
|
||||
iobuf: .=.+518.
|
||||
Reference in New Issue
Block a user