/
/

/ f22 -- allocate common

.globl	calloc
.globl	entry

.globl	declimpl
.globl	size
.globl	getc
.globl	getw
.globl	xbuf
.globl	code
.globl	typ

calloc:
	clr	r3
1:
	cmp	r3,symtp
	bhis	1f
	mov	symtab(r3),r0
	bic	$!70,r0		/ class
	cmp	r0,$40		/ common block
	bne	3f
	mov	r3,-(sp)
	mov	symtab+2(r3),r3
	clr	r2		/ byte offset
2:
	tst	r3
	beq	2f
	jsr	r5,declimpl
	mov	symtab+4(r3),-(sp)
	mov	2(sp),symtab+4(r3)
	mov	r2,symtab+6(r3)
	jsr	r5,size
	add	r0,r2
	mov	(sp)+,r3
	br	2b
2:
	mov	(sp)+,r3
	clr	symtab+2(r3)
	mov	r2,symtab+6(r3)		/ common block size
3:
	add	$8,r3
	br	1b
1:
	rts	r5

entry:
	mov	progt,r0
	jmp	*1f(r0)
1:
	main
	subr
	funct
	blocd

main:
	jsr	r5,code
		<main:\n\0>; .even

	rts	r5

subr:
funct:
	jsr	r5,code
		<%n.:	%n_\n\0>; .even
		8
		8
	jsr	r5,code
		<	entry; name\n\0>; .even
	clr	r3
1:
	cmp	r3,symtp
	bhis	1f
	mov	symtab+2(r3),r0
	beq	2f
	mov	(r0)+,r1	/ num dims
	asl	r1
	add	r0,r1		/ ptr to last dim
	mov	r3,-(sp)
	mov	(r1),-(sp)	/ dope id
	clr	r2		/ dope offset
3:
	add	$2,r2
	mov	-(r1),r3
	cmp	r0,r1
	bhi	3f
	neg	r3		/ adjustable dimension
	ble	3b
	mov	r0,-(sp)
	jsr	r5,declimpl
	mov	symtab(r3),r0
	clrb	r0
	swab	r0
	jsr	r5,code
		<	rval%dp; %n_\n\0>; .even
		r0
		r3
	mov	symtab(r3),r3
	bic	$![377\<8+7],r3
	cmp	r3,$2\<8+1		/ is it i*2
	beq	4f
	bic	$!7,r3
	movb	typ(r3),r3
	jsr	r5,code
		<	%c%di2\n\0>; .even
		r3
		r0
4:
	mov	2(sp),r0
	jsr	r5,code
		<	stst; d%d+%d.\n\0>; .even
		r0
		r2
	mov	(sp)+,r0
	br	3b
3:
	tst	(sp)+
	mov	(sp)+,r3
2:
	add	$8,r3
	br	1b
1:
blocd:
	rts	r5

