; read symbol table and output
(def outsym () (i ty ref a2)
  (do
  (set i (read))		; number of symbol
  (print i) (nl)
  (while (> i 0)
    (do
    (tokenise) (prstr tok) (space)  ; name
    (tokenise) (prstr tok) (space)  ; type
    (set ty (atoi tok))
    (tokenise)                      ; ref, reloc
    (if (= ty 3)                    ; FUN
      (do
      (set ref (shift (atoi tok) CS))
      (print (assoc ref)))
      ; else
      (prstr tok))
    (space)
    (tokenise) (prstr tok) (space)  ; arity
    (tokenise) (prstr tok) (nl)     ; lv
   (set i (- i 1))))))

(def genall2 () (i op end)
  (do
  (set i CS)
  (set end DP)
  (while (< i end)
    (do
    (set op (de_op (vec i 0)))
    (if (= op xFUN) (eval i))
    (set i (+ i 2))))
  (set i XP)
  (set XP 1)
  (outa icCall (assoc (shift Start CS)))
  (outs icEnd)
  (set XP i)))

; ---- assoc table for label -----

(enum 2 esizeA)
(enum 490 MAXLAB)		; max no of label

; search assoc for n1
; if found, return n2, else 0
(def assoc n1 (i flag end)
  (do
  (set i 2)						; start at 2
  (set flag 1)
  (set end (+ (* esizeA numLab) 2))
  (while (and flag (< i end))
    (if (= (vec atab i) n1)		; sequential search
      (set flag 0)
      ; else
      (set i (+ i esizeA))))
  (if flag
    0							; not found
    (vec atab (+ i 1)))))		; found, return n2

(def insertLab (n1 n2) (i)
  (do
  (set i (+ (* numLab esizeA) 2)) ; start at 2
  (setv atab i n1)
  (setv atab (+ i 1) n2)
  (set numLab (+ numLab 1))
  (if (> numLab MAXLAB)
    (error "label table full"))))

(def dumpassoc () (i end)
  (do
  (set i 2)
  (set end (+ (* numLab esizeA) 2))
  (while (< i end)
    (do
    (print (vec atab i)) (space)
    (print (vec atab (+ i 1))) (nl)
    (set i (+ i esizeA))))))

;(def testassoc () ()
;  (do
;  (insertLab 1 11)
;  (insertLab 2 22)
;  (insertLab 3 33)
;  (print numLab) (space)
;  (print (assoc 1)) (space)
;  (print (assoc 2)) (space)
;  (print (assoc 10)) (nl)))

