MiniUnix/usr/source/s1/chgrp.s
/ chgrp -- change group
.globl fopen, getc, mesg
mov sp,r5
mov (r5),r4
cmp r4,$3
bge 1f
jsr r5,mesg; <chown uid f1 ...\n\0>; .even
1:
add $4,r5
mov (r5),r3
cmpb (r3),$'0
blt 1f
cmpb (r3),$'9
bgt 1f
jsr r5,cvnum; geta
br do
1:
mov $uids,r0
jsr r5,fopen; ubuf
bec 1f
jsr r5,mesg; <Can't open /etc/uids\n\0>; .even
sys exit
1:
mov r3,r2
2:
jsr r5,getc; ubuf
bcc 3f
who:
jsr r5,mesg; <Who?\n\0>; .even
sys exit
3:
cmp r0,$':
beq 3f
cmpb (r2)+,r0
beq 2b
2:
jsr r5,getc; ubuf
bcs who
cmp r0,$'\n
bne 2b
br 1b
3:
tstb (r2)
bne 2b
3:
jsr r5,getc; ubuf
cmpb r0,$':
bne 3b
jsr r5,cvnum; getc
do:
sub $2,r4
swab r1
mov r1,0f+2
tst (r5)+
1:
mov (r5),0f
mov (r5)+,9f
sys stat; 9:..; statb
movb statb+7,0f+2
sys chown; 0:..; 0
bec 2f
mov 0b,r0
mov r0,0f
clr 0f+2
3:
tstb (r0)+
beq 3f
inc 0f+2
br 3b
3:
mov $1,r0
sys write; 0:..; ..
jsr r5,mesg; <?\n\0>; .even
2:
dec r4
bgt 1b
sys exit
cvnum:
clr r1
1:
jsr r5,*(r5); ubuf
bcs 1f
sub $'0,r0
cmp r0,$9.
bhi 1f
mpy $10.,r1
add r0,r1
br 1b
1:
tst (r5)+
rts r5
geta:
movb (r3)+,r0
tst (r5)+
rts r5
uids: </etc/group\0>
.bss
statb: .=.+36.
ubuf: .=.+518.