2 TITLE GETPUT ASSOCIATION FUNCTIONS FOR MUDDLE
8 ; COMPONENTS IN AN ASSOCIATION BLOCK
10 ITEM==0 ;ITEM TO WHICH INDUCATOR APPLIES
13 NODPNT==6 ;IF NON ZERO POINTS TO CHAIN
14 PNTRS==7 ;POINTERS NEXT (RH) AND PREV (LH)
16 ASOLNT==8 ;NUMBER OF WORDS IN AN ASSOCIATION BLOCK
18 .GLOBAL ASOVEC ;POINTER TO HASH VECTOR IN TV
19 .GLOBAL ASOLNT,ITEM,INDIC,VAL,TMA,TFA,NODPNT,NODES,IPUTP,IGETP,PUT
21 MFUNCTION GETP,SUBR,[GETPROP]
25 IGETP: CAML AB,[-2,,0] ;DONT SKIP IF TOO FEW
27 CAMG AB,[-6,,0] ;SKIP IF WITHIN RANGE
29 MOVE C,2(AB) ;GET INDICATOR TYPE
30 MOVE D,3(AB) ;AND VALUE
31 PUSHJ P,IGET ;SEE IF ASSOCIATION EXISTS
32 JUMPE B,CHFIN ;IF 0, NONE EXISTS
33 MOVE A,VAL(B) ;ELSE RETURN VALUE
37 CHFIN: CAML AB,[-4,,0] ;IS 3RD ARG SUPPLIED?
38 JRST FINIS ;NO, RETURN FALSE
39 PUSH TP,4(AB) ;YES, EVAL IT
45 ; FUNCTION TO MAKE AN ASSOCIATION
47 MFUNCTION PUTP,SUBR,[PUTPROP]
51 IPUTP: HLRE A,AB ;GET -NUM OF A
53 AOJGE A,TFA ;0 OR 1 ARGS IS TOO FEW
54 AOJE A,REMAS ;TWO ARGS, REMOVE AN ASSOC
55 AOJL A,TMA ;MORE THAN 3 TOO MANY
56 PUSH P,CFINIS ;CAUSE FINIS TO BE POPPED TO
58 IPUT: MOVE C,2(AB) ;GET INDICATOR TYPE AND VALUE
60 IPUT1: PUSHJ P,IGET ;SEE IF THIS ONE EXISTS
62 JUMPE B,NEWASO ;JUMP IF NEED NEW ASSOCIATION BLOCK
63 MOVE C,5(AB) ;GET NEW VALUE
64 MOVEM C,VAL+1(B) ;STORE IT
65 MOVE A,4(AB) ;GET VALS TYPE
71 ; HERE TO CREATE A NEW ASSOCIATION
73 NEWASO: MOVSI A,TUVEC ;GET VECTOR TYPE
74 SKIPE D ;D>0 MEANS SOME EXIST IN CHAIN
75 MOVSI A,TASOC ;IN THIS CASE USE DIFFERENT TYPE
78 PUSH P,D ;SAVE INDICATOR
79 PUSH TP,$TFIX ;GET ARG FOR VECTOR CALL
82 MOVSI A,400000+SASOC ;CLOBBER THE UNIFORM TYPE
87 MOVE C,(TP) ;RESTORE SAVED VALUE
88 POP P,E ;RESTORE SWITCH
89 JUMPE E,PUT1 ;NO OTHERS EXISTED IN THIS BUCKET
90 HRLZM C,PNTRS(B) ;CLOBBER PREV POINTER
91 HRRM B,PNTRS(C) ;AND NEXT POINTER
94 PUT1: HRRZM B,(C) ;STORE INTO VECTOR
95 MOVE C,AB ;COPY ARG POINTER
96 SUB TP,[2,,2] ;POP TP JUNK
97 MOVEI A,0 ;AND COPY POINTER
99 PUT2: MOVE D,(C) ;START COPYING
102 AOBJN C,PUT2 ;NOTE *** DEPENDS ON ORDER IN VECTOR ***
104 MOVE C,B ;RETURN POINTER TO ASSOC. IN C
110 ;HERE TO REMOVE AN ASSOCIATION
112 REMAS: MOVE C,2(AB) ;GET INDIC
114 PUSHJ P,IGET ;LOOK IT UP
115 JUMPE B,FINIS ;NEVER EXISTED, IGNORE
116 HRRZ A,PNTRS(B) ;NEXT POINTER
117 HLRZ E,PNTRS(B) ;PREV POINTER
118 SKIPE A ;DOES A NEXT EXIST?
119 HRLM E,PNTRS(A) ;YES CLOBBER ITS PREV POINTER
120 SKIPN D ;SKIP IF NOT FIRST IN BUCKET
121 MOVEM A,(C) ;FIRST STORE NEW ONE
123 HRRM A,PNTRS(E) ;PATCH NEXT POINTER IN PREVIOUS
124 HRRZ A,NODPNT(B) ;SEE IF MUST UNSPLICE NODE
127 HRLM E,NODPNT(A) ;SPLICE
128 JUMPE E,PUT4 ;FLUSH IF NO PREV POINTER
129 HRRZ C,NODPNT(E) ;GET PREV'S NEXT POINTER
130 CAIN C,(B) ;DOES IT POINT TO THIS NODE
131 HRLM A,NODPNT(E) ;YES, SPLICE
132 GETYP C,VAL(E) ;CHECK VAL
134 CAIN C,TASOC ;IS IT AN ASSOCIATION
135 CAIE D,(B) ;AND DOES IT POINT TO THIS NODE
137 HRRZM A,VAL+1(E) ;YES, CLOBBER
138 PUT4: MOVE A,VAL(B) ;RETURN VALUE
145 ;INTERNAL GET FUNCTION CALLED BY PUT AND GET
146 ;(AB) AND 1(AB) ARE THE ITEM
147 ;C AND D ARE THE INDICATOR
149 IGET: PUSH TP,C ;SAVE C AND D
151 MOVE A,C ;BUILD UP HASH IN A
154 XOR A,1(AB) ;NOW HAVE A HASH
156 HLRE B,ASOVEC+1(TVP) ;GET LENGTH OF HASH VECTOR
158 IDIVI A,(B) ;RELATIVE BUCKET NOW IN B
159 HRLI B,(B) ;IN CASE GC OCCURS
160 ADD B,ASOVEC+1(TVP) ;POINT TO BUCKET
161 MOVEI D,0 ;SET FIRST SWITCH
162 SKIPN A,(B) ;GET CONTENTS OF BUCKET (DONT SKIP IF EMPTY)
165 MOVSI 0,TASOC ;FOR INTGOS, MAKE A TASOC
168 IGET1: INTGO ;IN CASE CIRCULARITY EXISTS
169 GETYPF 0,ITEM(A) ;GET ITEMS TYPE
171 CAMN 0,(AB) ;COMPARE TYPES
172 CAME E,1(AB) ;AND VALUES
174 MOVE 0,INDIC(A) ;MOW TRY INDICATORS
181 MOVE C,B ;RETURN POINTER IN C
182 MOVE B,A ;FOUND, RETURN ASSOCIATION
188 NXTASO: MOVEI D,1 ;SET SWITCH
190 HRRZ A,PNTRS(A) ;STEP
197 GFALSE: MOVE C,B ;PRESERVE VECTOR POINTER
202 ; FUNCTION TO DO A PUT AND ALSO ADD TO THE NODE FOR THIS GOODIE
208 CAML AB,[-4,,0] ;WAS THIS A REMOVAL
211 PUSHJ P,IPUT ;DO THE PUT
212 SKIPE NODPNT(C) ;NODE CHAIN EXISTS?
215 PUSH TP,$TASOC ;NO, START TO BUILD
220 JUMPE B,MAKNOD ;NOT FOUND, LOSE
221 NODSPL: MOVE C,(TP) ;HERE TO SPLICE IN NEW NODE
222 MOVE D,VAL+1(B) ;GET POINTER TO NODE STRING
223 HRRM D,NODPNT(C) ;CLOBBER
225 SKIPE D ;SPLICE ONLY IF THERE IS SOMETHING THERE
227 MOVEM C,VAL+1(B) ;COMPLETE NODE CHAIN
228 MOVE A,2(AB) ;RETURN VALUE
232 MAKNOD: PUSHJ P,NEWASO ;GENERATE THE NEW ASSOCIATION
233 MOVE A,@CHPT ;GET UNIQUE STRING
234 MOVEM A,INDIC(C) ;CLOBBER IN INDIC
237 MOVE B,C ;POINTER TO B
238 HRRZ C,NODES+1(TVP) ;GET POINTER TO CHAIN OF NODES
239 HRRZ D,VAL+1(C) ;SKIP DUMMY NODE
240 HRRM B,VAL+1(C) ;CLOBBER INTO CHAIN
242 SKIPE D ;SPLICE IF ONLY SOMETHING THERE
245 MOVSI A,TASOC ;SET TYPE OF VAL TO ASSOCIATION
248 JRST NODSPL ;GO SPLICE ITEM ONTO NODE