XSS__text__TEXTV__data__DATAm__cstring__TEXT}|__bss__DATAS__picsymbolstub2__TEXTQ?Sl__la_sym_ptr2__DATA\S\8V__nl_symbol_ptr__DATAS0V.__textcoal_nt__TEXTSV @\f$< P>>B$t:UWVSLS UЍA(E䍋S UЍA0ES?S6S UЍЍGD$S?S6S UЍAЍGD$$pRE܋E܉$IRE؋E؉D$E$REԃ}u D$D$$QE$QƋE$Qt$D$S?S6S UЍЍGD$S?S6S UЍAЍGD$S?S6S UЍЍGD$ SD$ҷD$S$PS6S UЍAF 4S UЍA QS UԉЍAD$$PD$S?S6S UԉЍЍGD$S?S6S UЍЍGD$S?S6S UЍAЍGD$S?S6S UЍЍGD$ SD$2D$S$NE$OD$ S?S6S UЍЍGD$D$S$NS6S UЍAF4S UЍA u[S6S UЍAF 4S UЍA uQS UԉЍAD$$0ND$S?S6S UԉЍЍGD$S?S6S UЍЍGD$S?S6S UЍAЍGD$S?S6S UЍЍGD$ SD$D$S$LS?S6S UЍЍGD$S?S6S UЍAЍGD$S?S6S UЍЍGD$ SD$D$S$KE$KS?S6S UЍЍGD$S?S6S UЍAЍGD$S?S6S UЍЍGD$ SD$һD$S$JS?S6S UЍЍGD$S?S6S UЍAЍGD$S?S6S UЍЍGD$ SD$RD$S$IS?S6S UЍЍGD$S?S6S UЍAЍGD$S?S6S UЍЍGD$ SD$zD$S$HL[^_]UWVSLE E獋I UЍAEI UЍA8E܍I UЍAEԀ}tBI?I6I UЍЍGE}t }tI?I6I U܉ЍЍGD$I?I6I UЍЍGD$ I?I6I U܉ЍЍGD$ID$$GEI?I6I U܉ЍЍGD$I?I6I UЍЍGD$ I?I6I U܉ЍЍGD$ID$$FEЃ} UԉЍ Z2EЉD$D$I$EgEЉD$DzD$I$E?EЉD$ײD$I$EEЉD$D$I$EE$=ED$ EЉD$D$I$HEI UЍApE؋E؉$4EE̍I?I6I U؉ЍЍGD$ẺD$ EЉD$D$I$D#D$խ$MD)$҃L[^_]ÐUS$E E|E UЍA E}uED$E$Xz߮D$E$DED$E$'D$E$CED$E$XD$E$C$[]ÐUWVSA<[^_]UWVSB UЍЍGD$BB?BB6FB UЍAЍGD$BB?BB6>B UЍЍGD$ RBD$®D$:B$?D$FB UЍA@$?E$?ƋE$?t$D$BB?BB6>B UЍЍGD$BB?BB6FB UЍAЍGD$BB?BB6>B UЍЍGD$ RBD$"D$:B$><[^_]UWVS,? UЍA@E}u? UЍAEE$&>E܍???6? UЍЍGD$ E܉D$D$?$=? UЍAEG,[^_]UWVSL> UЍA0EE> UЍA@E؃}uU}uD$>$Q=E> U؉ЍAE> UЍAE܃}t}t E E̋ẺEЋEЉD$>?>6> UЍЍGD$>?>6> UЍЍGD$ >D$D$>$@<> U؉ЍAEL[^_]UWVSU@Mr> UЍAh<Q>U@M)B6J UЍAF 4J UЍA > UЍAD$u$U E؋E$ Eԍ> UЍA<u E xEЋEЉD$E؉D$EԉD$E܉D$ ^D$D$F$R E$` E̍> UЍA<u E xEȋEȉD$ẺD$N?N6> UЍЍGD$E܉D$ ^D$ND$F$ B6J UЍAF4J UЍA u[B6J UЍAF 4J UЍA u> UЍAD$u$8 EċE$ E> UЍA<u E xEED$EĉD$ED$E܉D$ ^D$D$F$5 > UЍA<E9J UЍE}uB6J UЍAF 4J UЍA 6 UЍAD$u$ ƋE$n t$D$N?N6J UЍЍGD$ ^D$ΟD$F$E$ƍ6E B D$$0 t$D$N?N6J UЍЍGD$ ^D$D$F$EB6J UЍAF4J UЍA u[B6J UЍAF 4J UЍA u> UЍAD$u$ƋE$tt$D$N?N6J UЍЍGD$ ^D$ND$F$6 UЍAE\[^_]ÐUWVS<?6 UЍЍGE܍ UЍA4E}u UЍAh<U@Mum?6 UЍЍGD$E܉D$ D$D$$ UЍA<E! UЍE}uE B D$$D$?6 UЍЍGD$ D$D$$ UЍAEB<[^_]ÐUWVS<辱?6 UЍЍGEED$ D$D$$ UЍAh<u{ED$ D$D$$ UЍA<u/ED$ D$>D$$E$O UЍAh<E$bD$ED$ D$~D$$ UЍA<u>E$D$ED$ D$D$$D$$<[^_]ÐUWVS¯E$D$ ?6 UЍЍGD$D$$E$?6 UЍЍGD$ D$˜D$$[^_]UWVS<ҮD$D$$p UЍA,E}uUE${ UЍAh<E$*D$?6 UЍЍGD$ D$D$$ UЍA<uuE$D$?6 UЍЍGD$ D$rD$$ UЍA ED$RD$$<[^_]ÐUWVS\ UЍAD$ E BD$ UЍAD$$D$ D$D$$% UЍADE؃}u{E؍ BD$g$SD$ ?6 U؉ЍЍGD$ND$$x U؉ЍAEԃ}u UԉЍAD$g$D$ ?6 UԉЍЍGD$nD$$ UԉЍA EI U؉ЍAEz UЍA,E}u E BD$g$ƋE$?t$D$?6 UЍЍGD$ ?6 UЍAЍGD$D$$ UЍA<ukE$vD$ ?6 UЍЍGD$D$$D$$U@D$g$3Ǎ6 UЍALЍFD$g$|$ D$D$$M UЍAh<?6 UЍЍGD$(D$$ UЍA<t\?6 UЍЍGD$2D$$[:?D$$=GD$$ UЍA4EЃ}u UЉЍAh<U@MЃEЉ$ƋEЉ$dt$D$?6 UЉЍЍGD$?6 UЍЍGD$ ?6 UЍAЍGD$nD$$ UЉЍA< E̋ŰU̍?6 UЉЍApЍЍUBD$D$$ UЉЍA<uEȋUȋUȍ?6 UЉЍApЍЍUBD$D$$zD$$\U@MЃ UЉЍAD$g$D$?6 UЉЍЍGD$?6 UЍЍGD$ D$ΚD$$`U@$MЃt3D$$  UЉЍA<E UЍE}u5 UЍAEЍE BD$g$ EčE B D$ EUU?6 UЍAЍЍUBD$D$0$uEE B D$$KEEĉD$?6 UЉЍЍGD$UT$ED$?6 UЍЍGD$ ?6 UЍAЍGD$ND$$ UЍA EЃ}u UЉЍAHE܃}u U܉ЍAEԋEЉ$5ƋEЉ$Ǎ UԉЍAD$g$t$|$ D$ΛD$$ U܉ЍAEH UЉЍAlE UЍAE UЍA E\[^_]ÐUWVS,螟D$$D$ D$D$v$!E$Tr UЍA,E}u|~?~6z UЍЍGD$ D$v$z UЍA E|rU@Mt(D$D$v$)lD$v$ ,[^_]ÐUWVS,.E$SƋE$t$D$?6 UЍЍGD$ D$D$$n,[^_]UWVS,蒝E$ƋE$Yt$D$r?r6n UЍЍGD$ D$D$j$,[^_]UWVS,?6 UЍЍGD$ D$D$$V UЍA<tuE$D$?6 UЍЍGD$ D$vD$$,[^_]ÐUWVS< UЍA8EE$RƋE$t$D$?6 UЍЍGD$?6 UЍЍGD$ D$ƒD$$6 UЍAF 4 UЍA  UЍAD$V$D$?6 UЍЍGD$?6 UЍЍGD$ D$D$$FD$$6 UЍAF4 UЍA u[6 UЍAF 4 UЍA u UЍAD$V$!D$?6 UЍЍGD$?6 UЍЍGD$ D$D$$E$ D$?6 UЍЍGD$?6 UЍЍGD$ D$D$$I<[^_]ÐUWVS6F UЍAF 4F UЍA : UЍAD$Q$FD$J?J6: UЍЍGD$J?J6F UЍЍGD$ ZD$ʕD$B$!J?J6: UЍЍGD$J?J6F UЍЍGD$ ZD$*D$B$}>6F UЍAF4F UЍA u[>6F UЍAF 4F UЍA u: UЍAD$Q$D$J?J6: UЍЍGD$J?J6F UЍЍGD$ ZD$D$B$-D$B$<[^_]ÐUWVS< UЍA8EE$jƋE$t$D$?6 UЍЍGD$?6 UЍЍGD$ D$ޒD$$6 UЍAF 4 UЍA  UЍAD$M$D$?6 UЍЍGD$?6 UЍЍGD$ D$^D$$E$D$?6 UЍЍGD$?6 UЍЍGD$ D$D$$?6 UЍЍGD$$3E?6 UЍЍGD$ ?6 UЍЍGD$D$$<VD$ ED$T$E$U6 UЍAF4 UЍA u[6 UЍAF 4 UЍA u UЍAD$M$D$?6 UЍЍGD$?6 UЍЍGD$ D$D$$v?6 UЍЍGD$?6 UЍЍGD$ D$~D$$E$1ƋE$t$D$?6 UЍЍGD$?6 UЍЍGD$ D$D$$<[^_]UWVS<2 UЍA8EE$ƋE$t$D$?6 UЍЍGD$?6 UЍЍGD$ "D$D$ $6 UЍAF 4 UЍA  UЍAD$SF$D$?6 UЍЍGD$?6 UЍЍGD$ "D$2D$ $E$D$ ?6 UЍЍGD$D$ $6 UЍAF4 UЍA u[6 UЍAF 4 UЍA u UЍAD$SF$ D$?6 UЍЍGD$?6 UЍЍGD$ "D$D$ $?6 UЍЍGD$?6 UЍЍGD$ "D$rD$ $W<[^_]ÐUWVSU@ME$$EȀ}t #E <EċEĉD$ ? 6 UЍЍGD$ ? 6 UЍAЍGD$ EȉD$}t JE EED$$0U@ME$EE$E}t #E <EED$$ED$ ? 6 UЍAЍGD$ED$ ? 6 UЍЍGD$ ? 6 UЍЍGD$ ? 6 UЍAЍGD$ D$}t E EED$$}t/D$$] UЍA,Eh|[^_]ÐUWVS\^r: UЍE}u(B UЍA(EBU@MBU@MB UЍ<<E$zE܍>?>6B UЍAЍGD$ND$>?>6: UЍЍGD$>?>6: UЍЍGD$>?>6B UЍAЍGD$ E܉D$~D$6$5LE$>E؋E$0Eԍ>?>6B UЍAЍGD$ E؉D$ND$>?>6: UЍЍGD$>?>6: UЍЍGD$>?>6B UЍAЍGD$ EԉD$ޓD$6$BU@ ME$EЍ>?>6: UЍЍGD$>?>6: UЍЍGD$ EЉD$>D$6$cD$6$B UЍA4E\[^_]ÐUSm UЍA E}uLU@ Mt E& UЍAlEEE[]ÐUWVS\bm> UЍA4E܃}u2U@ M܃>2 U܉ЍAh<2 U܉ЍApEE$訿EЋE$蚿E̍B?B6> UЍЍGD$EЉD$B?B62 U܉ЍЍGD$B?B6> UЍЍGD$ ỦT$D$:$蚾2 U܉ЍA<Em> UЍE}u_E$|** UЍAE؍B?B62 U؉ЍЍGD$B?B6> UЍЍGD$ RD$D$:$y* UЍA E܃}u%2U@ M܃2 U܉ЍAHEԃ}uBEȋUȋUȍB?"6 UԉЍAЍЍUBD$D$:$脼 UԉЍAEV2 U܉ЍApEE$SEčB?B6> UЍЍGD$EĉD$B?B62 U܉ЍЍGD$B?B6> UЍЍGD$ RD$"D$:$N2 U܉ЍAlEbD$:$* UЍAE\[^_]UWVS<h UЍAh<E獋 UЍA<u?6 UЍЍGD$RD$$;}twE$CD$?6 UЍЍGD$ D$RD$$uE$̹D$?6 UЍЍGD$ D$D$$IE$@EEE$2u}uEEE}tD$$?6 UЍЍGD$ D$ҌD$$荸E$E$EE$6}uf?6 UЍЍGD$ D$&D$$V5D$$<[^_]ÐUWVS<e?6 UЍЍGEE$蝷D$ED$ D$FD$޸$Q UЍA<t>E$BD$ED$ D$D$޸$<[^_]US$d܉D$$ƶ UЍA,E}u*E$ UЍA E΍D$$H$[]ÐUWVS,~cnD$$觶E"D$^?^6R UЍЍG$^u /EED$ nD$>D$V$蟵nD$MD$V$wR UЍA,E}u^?^6Z UЍЍGD$ nD$`D$V$Z UЍA EmVD$ $蘳E$,[^_]ÐUWVS,aE$薴D$?6 UЍЍGD$ D$‰D$$,[^_]ÐUWVS\6a UЍA8E䍻?6 UЍЍGE܍?6 UЍЍGE؍U@ME$ƋE$>t$D$E؉D$E܉D$ &D$D$$E$課ƋE$t$D$E؉D$E܉D$ &D$D$$葲U@M UЍAhE UЍA<uJE$8D$E؉D$E܉D$ &D$VD$$X}E$虱ƋE$ױt$D$ UЍA<u $E $EԋEԉD$E؉D$E܉D$ &D$D$$HE B D$B$虱NjE$ݰƋE$|$ t$D$ UЍA<u $E $EЋEЉD$E؉D$E܉D$ &D$vD$$舰\[^_]ÐUWVS<] UЍA0EE$aD$?6 UЍЍGD$?6 UЍAЍGD$ D$ʋD$$蟯<[^_]ÐUS$\ UЍA4E}u*E$P UЍA<E΍ UЍAxE}u| UЍ<u>U@MtE$貮t E$> UЍA,E|$[]ÐUS$[D$H$W UЍA,E}u*E$ UЍA E΍D$B&$$[]ÐUS$[U@Mt EZU@$Mt E- UЍA`<t EEE[]UWVSLZf?f6b UЍЍGE؋E$D$E؉D$ vD$&D$^$Ѭb UЍA4E}uTf?f6b UЍЍGE؍f?f6V UЍЍGEԋE$.V UЍAhE䍋V UЍAE܃}ue} t_}t}t 6E 7EЋEЉD$EԉD$E؉D$ vD$FD$^$wV UЍA<EbU@Mt_}t}t 6E 7E̋ẺD$EԉD$E؉D$ vD$D$^$Ҫ'D$^$趪L[^_]USW UЍA4E}uE UЍA<u E& UЍA<EEE[]ÐUWVSLRWE$_u2?26. UЍЍGE܍. UЍAh<tE$踩E BEԋEԉD$E܉D$ BD$D$*$Y. UЍA4E}u)E$0" UЍA<2?26. UЍЍGE܍2?26" UЍЍGE؍" UЍAhE}u6E؉D$E܉D$ BD$D$*$*" UЍA<ED$*$EԉD$E܉D$ BD$RD$*$趧. UЍA4E}uEE$" UЍA<2?26. UЍЍGE܍2?26" UЍЍGE؍" UЍAhE}uRE؉D$E܉D$ BD$rD$*$臦D$*$k" UЍA<E$D$*$-L[^_]ÐUS$PS@$ڤEED$ @D$D$($ԥ$[]UWVSLRED$D$$$kEE$袥D$$ED$ ED$ED$E D$ED$ڦ?ڦ6֦ UЍЍGD$ D$D$Ҧ$L[^_]ÐUWVS<R$訣EE$ߤD$ED$?6 UЍЍGD$ D$>D$$U<[^_]ÐUWVS= %0%1GetNum%2%3Table(%1)) { resize%1%2%3HashTable(%1); return; } index = (%0%1GetNum%2%3Table(%1) - 1) & ; next%3 = %0%1Geti%2%3Table(%1, index); %0%3SetNextTable%1%2%3(_%3, next%3); %0%1Seti%2%3Table(%1, index, _%3); %0%1SetNum%2%3(%1, %0%1GetNum%2%3(%1) + 1); } /*---------------------------------------------------------------------------------------- Remove the %2%3 from the hash table. ----------------------------------------------------------------------------------------*/ static void remove%1%2%3FromHashTable( %4%1 %1, %5%3 _%3) { uint32 index = (%0%1GetNum%2%3Table(%1) - 1) & ; %5%3 prev%3, next%3; next%3 = %0%1Geti%2%3Table(%1, index); if(next%3 == _%3) { %0%1Seti%2%3Table(%1, index, %0%3GetNextTable%1%2%3(next%3)); } else { do { prev%3 = next%3; next%3 = %0%3GetNextTable%1%2%3(next%3); } while(next%3 != _%3); %0%3SetNextTable%1%2%3(prev%3, %0%3GetNextTable%1%2%3(_%3)); } %0%1SetNum%2%3(%1, %0%1GetNum%2%3(%1) - 1); %0%3SetNextTable%1%2%3(_%3, %5%3Null); } , %0 %1 && Get%0%1%3%2(_%1) == %2/*---------------------------------------------------------------------------------------- Find the %2%3 from the %1 and its hash key. ----------------------------------------------------------------------------------------*/ %5%3 %0%1Find%2%3( %4%1 %1) { uint32 mask = %0%1GetNum%2%3Table(%1) - 1; %5%3 _%3; if(mask + 1 != 0) { _%3 = %0%1Geti%2%3Table(%1, & mask); while(_%3 != %5%3Null) { if() { return _%3; } _%3 = %0%3GetNextTable%1%2%3(_%3); } } return %5%3Null; } /*---------------------------------------------------------------------------------------- Find the %2%3 from the %1 and its name. ----------------------------------------------------------------------------------------*/ void %0%1Rename%2%3( %4%1 %1, %5%3 _%3, utSym sym) { if(%0%3Get%2Sym(_%3) != utSymNull) { remove%1%2%3FromHashTable(%1, _%3); } %0%3Set%2Sym(_%3, sym); if(sym != utSymNull) { add%1%2%3ToHashTable(%1, _%3); } } /*---------------------------------------------------------------------------------------- Add the %2%3 to the head of the list on the %1. ----------------------------------------------------------------------------------------*/ void %0%1Insert%2%3( %4%1 %1, %5%3 _%3) { #if defined(DD_DEBUG) if(%1 == %4%1Null) { utExit("Non-existent %1"); } if(_%3 == %5%3Null) { utExit("Non-existent %3"); } if(%0%2Get%4%1(_%2) != %3%1Null) { utExit("Attempting to add %2 to %1 twice"); } #endif %0%3SetNext%1%2%3(_%3, %0%1GetFirst%2%3(%1)); if(%0%1GetFirst%2%3(%1) != %5%3Null) { %0%3SetPrev%1%2%3(%0%1GetFirst%2%3(%1), _%3); } %0%1SetFirst%2%3(%1, _%3); %0%3SetPrev%1%2%3(_%3, %5%3Null); if(%0%1GetLast%2%3(%1) == %5%3Null) { %0%1SetLast%2%3(%1, _%3); } %0%3SetNext%1%2%3(_%3, %0%1GetFirst%2%3(%1)); %0%1SetFirst%2%3(%1, _%3); if(%0%1GetLast%2%3(%1) == %5%3Null) { %0%1SetLast%2%3(%1, _%3); } %0%3Set%2%1(_%3, %1); if(%0%3Get%2Sym(_%3) != utSymNull) { add%1%2%3ToHashTable(%1, _%3); } add%1%2%3ToHashTable(%1, _%3); } /*---------------------------------------------------------------------------------------- Add the %2%3 to the end of the list on the %1. ----------------------------------------------------------------------------------------*/ void %0%1Append%2%3( %4%1 %1, %5%3 _%3) { #if defined(DD_DEBUG) if(%1 == %4%1Null) { utExit("Non-existent %1"); } if(_%3 == %5%3Null) { utExit("Non-existent %3"); } %0%3SetPrev%1%2%3(_%3, %0%1GetLast%2%3(%1)); if(%0%1GetLast%2%3(%1) != %5%3Null) { %0%3SetNext%1%2%3(%0%1GetLast%2%3(%1), _%3); } %0%1SetLast%2%3(%1, _%3); %0%3SetNext%1%2%3(_%3, %5%3Null); if(%0%1GetFirst%2%3(%1) == %5%3Null) { %0%1SetFirst%2%3(%1, _%3); } if(%0%1GetLast%2%3(%1) != %5%3Null) { %0%3SetNext%1%2%3(%0%1GetLast%2%3(%1), _%3); } else { %0%1SetFirst%2%3(%1, _%3); } %0%1SetLast%2%3(%1, _%3); %0%3SetNext%1%2%3(_%3, %5%3Null); /*---------------------------------------------------------------------------------------- Insert the %2%3 to the %1 after the previous %2%3. ----------------------------------------------------------------------------------------*/ void %0%1InsertAfter%2%3( %4%1 %1, %5%3 prev%3, %5%3 _%3) { %5%3 next%3 = %0%3GetNext%1%2%3(prev%3); #if defined(DD_DEBUG) if(%1 == %4%1Null) { utExit("Non-existent %1"); } if(_%3 == %5%3Null) { utExit("Non-existent %3"); } %0%3SetNext%1%2%3(_%3, next%3); %0%3SetNext%1%2%3(prev%3, _%3); %0%3SetPrev%1%2%3(_%3, prev%3); if(next%3 != %5%3Null) { %0%3SetPrev%1%2%3(next%3, _%3); } if(%0%1GetLast%2%3(%1) == prev%3) { %0%1SetLast%2%3(%1, _%3); } /*---------------------------------------------------------------------------------------- Remove the %2%3 from the %1. ----------------------------------------------------------------------------------------*/ void %0%1Remove%2%3( %4%1 %1, %5%3 _%3) { %5%3 p%3, n%3; #if defined(DD_DEBUG) if(_%3 == %5%3Null) { utExit("Non-existent %3"); } if(%0%3Get%1%2(_%3) != %4%2Null && %0%3Get%1%2(_%3) != %2) { utExit("Delete %3 from non-owning %2"); } #endif n%3 = %0%3GetNext%1%2%3(_%3); p%3 = %0%3GetPrev%1%2%3(_%3); if(p%3 != %5%3Null) { %0%3SetNext%1%2%3(p%3, n%3); } else if(%0%1GetFirst%2%3(%1) == _%3) { %0%1SetFirst%2%3(%1, n%3); } if(n%3 != %5%3Null) { %0%3SetPrev%1%2%3(n%3, p%3); } else if(%0%1GetLast%2%3(%1) == _%3) { %0%1SetLast%2%3(%1, p%3); } %0%3SetNext%1%2%3(_%3, %5%3Null); %0%3SetPrev%1%2%3(_%3, %5%3Null); #endif p%3 = %5%3Null; for(n%3 = %0%1GetFirst%2%3(%1); n%3 != %5%3Null && n%3 != _%3; n%3 = %0%3GetNext%1%2%3(n%3)) { p%3 = n%3; } if(p%3 != %5%3Null) { %0%3SetNext%1%2%3(p%3, %0%3GetNext%1%2%3(_%3)); } else { %0%1SetFirst%2%3(%1, %0%3GetNext%1%2%3(_%3)); } %0%3SetNext%1%2%3(_%3, %5%3Null); if(%0%1GetLast%2%3(%1) == _%3) { %0%1SetLast%2%3(%1, p%3); } %0%3Set%1%2(_%3, %4%2Null); if(%0%3Get%2Sym(_%3) != utSymNull) { remove%1%2%3FromHashTable(%1, _%3); } remove%1%2%3FromHashTable(%1, _%3); /*---------------------------------------------------------------------------------------- Add the indexed %2%3 to the %1. ----------------------------------------------------------------------------------------*/ void %0%1Insert%2%3( %4%1 %1, uint32 x, %5%3 _%3) { #if defined(DD_DEBUG) if(%1 == %4%1Null) { utExit("Non existent %1"); } #endif %0%1Seti%2%3(%1, x, _%3); %0%1SetUsed%2%3(%1, utMax(%0%1GetUsed%2%3(%1), x + 1)); %0%3Set%1%4Index(_%3, x); %0%3Set%2%1(_%3, %1); /*---------------------------------------------------------------------------------------- Add the %2%3 to the end of the %1%2%3% array. ----------------------------------------------------------------------------------------*/ void %0%1Append%2%3( %4%1 %1, %5%3 _%3) { uint32 used%2%3 = %0%1GetUsed%2%3(%1); #if defined(DD_DEBUG) if(%1 == %4%1Null) { utExit("Non existent %1"); } #endif if(used%2%3 >= %0%1GetNum%2%3(%1)) { %0%1Resize%2%3s(%1, used%2%3 + (used%2%3 << 1) + 1); } %0%1Seti%2%3(%1, used%2%3, _%3); %0%1SetUsed%2%3(%1, used%2%3 + 1); %0%3Set%1%4Index(_%3, used%2%3); %0%3Set%2%1(_%3, %1); /*---------------------------------------------------------------------------------------- Remove the %2%3 from the %1. ----------------------------------------------------------------------------------------*/ void %0%1Remove%2%3( %4%1 %1, %5%3 _%3) { #endif %0%1Seti%2%3(%1, %0%3Get%1%2Index(_%3), %5%3Null); %0%3Set%1%2Index(_%3, UINT32_MAX); %0%1Set%2%3(_%1, %4%3Null); 0%s[x%s]union%d%s[x%s].%s%7 { %7 %2 x%1; %7 for(x%1 = (%2)(%3); x%1 < %3 + %4; x%1++) { %7 %0%1s.%6 = %5; %7 } %7 } %s%sUnion%d + 7) >> 3%7 memset(%0%1s.%2 + %5, 0, ((%6%4)*sizeof(%3)); %0%1s.%2 = utNewA(%4, (%3Allocated%1()%5); %sAllocated%s() %0SetUsed%1%2(0); %0SetAllocated%1%2(2); %0SetFree%1%2(0); %0%1s.%2 = utNewA(%4, %0Allocated%1%2()); %0%1s.%3 = utNewA(%4, %2Allocated%1()); utRecordResize(%0ModuleID, %3, (%2Allocated%1()%4, true); utResizeArray(%0%1s.%2, (newSize%4); utRecordResize(%0ModuleID, %3, (newSize%4, false); utRecordResize(%0ModuleID, %3, %2Allocated%1(), true); utResizeArray(%0%1s.%2, newSize); utRecordResize(%0ModuleID, %3, newSize, false); utFree(%0%1s.%2); /*---------------------------------------------------------------------------------------- Allocate the field arrays of %1. ----------------------------------------------------------------------------------------*/ static void alloc%1s(void) { %0SetAllocated%1(2); %0SetUsed%1(0); %0SetFirstFree%1(%0%1Null); %0SetAllocated%1(%2Allocated%1()); %0%1ConstructorCallback = %2%1GetConstructorCallback(); %2%1SetConstructorCallback(init%1); %0%1DestructorCallback = %2%1GetDestructorCallback(); %2%1SetDestructorCallback(destroy%1); /*---------------------------------------------------------------------------------------- Realloc the arrays of properties for class %0. ----------------------------------------------------------------------------------------*/ static void realloc%0s( %1 newSize) { %0SetAllocated%1(newSize); } /*---------------------------------------------------------------------------------------- Free memory used by the %0 database. ----------------------------------------------------------------------------------------*/ void %0DatabaseStop(void) { %2%1SetConstructorCallback(%0%1ConstructorCallback); %0%1ConstructorCallback = NULL; if(%2%1GetDestructorCallback() != destroy%1) { utExit("%0DatabaseClose called out of order"); } %2%1SetDestructorCallback(%0%1DestructorCallback); %0%1DestructorCallback = NULL; utUnregisterModule(%0ModuleID); } %u, %u, %u %0ModuleID = utRegisterModule("%0", %0Hash(), %1, sizeof(struct %0RootType_), &%0RootData, %0DatabaseStart, %0DatabaseStop); utRegisterEnum("%0", %1); utRegisterEntry("%0", %1); utRegisterClass("%1", %3, &%2RootData.used%1, &%2RootData.allocated%1, &%1RootData.firstFree%0, NULL, %0, %1, alloc%0, destroy%0); NULL); NULL, NULL); utRegisterField("%2", &%0%1s.%2, sizeof(%3), %4, "%0"); NULL); utRegisterArray(&%0RootData.used%1%2, &%0RootData.allocated%1%2, get%1%2s, alloc%1%2s); utSetFieldHidden(); utRegisterField("%2", &%0%1s.%2, sizeof(%3), UT_UNION, "%4"); utRegisterUnion("%4", %5); utRegisterUnionCase(%0, %1, sizeof(%2)); 0x%x/*---------------------------------------------------------------------------------------- Allocate memory used by the %0 database. ----------------------------------------------------------------------------------------*/ void %0DatabaseStart(void) { if(!utInitialized()) { utStart(); } %0RootData.hash = %1; alloc%0s(); (void)%0DatadrawRootAlloc(); /*---------------------------------------------------------------------------------------- Allocate more %1s. ----------------------------------------------------------------------------------------*/ void %0%1AllocMore(void) { realloc%1s((%3)(%2Allocated%1() + (%2Allocated%1() >> 1))); } static void realloc%1s(%3 newSize); /*---------------------------------------------------------------------------------------- Initialize a new %1. This is a constructor callback from the base class. ----------------------------------------------------------------------------------------*/ static void init%1( %2%1 %1) { if(%0Allocated%1() != %2Allocated%1()) { realloc%1s(%2Allocated%1()); } %0%1Init(%1); if(%0%1ConstructorCallback != NULL) { %0%1ConstructorCallback(%1); } } /*---------------------------------------------------------------------------------------- Default constructor wrapper for the database manager. ----------------------------------------------------------------------------------------*/ static uint64 alloc%1(void) { %0%1 %1 = %0%1Alloc(); return %0%12Index(%1); } /*---------------------------------------------------------------------------------------- Destructor wrapper for the database manager. ----------------------------------------------------------------------------------------*/ static void destroy%1( uint64 objectIndex) { %0%1Destroy(%0Index2%1((%2)objectIndex)); } /*---------------------------------------------------------------------------------------- Compact the %1.%2 heap to free memory. ----------------------------------------------------------------------------------------*/ void %0Compact%1%2s(void) { uint32 elementSize = sizeof(%4); uint32 usedHeaderSize = (sizeof(%3%1) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(%3%1) + sizeof(uint32) + elementSize - 1)/elementSize; %4 *toPtr = %0%1s.%2; %4 *fromPtr = toPtr; %3%1 %1; uint32 size; while(fromPtr < %0%1s.%2 + %0Used%1%2()) { %1 = *(%3%1 *)(void *)fromPtr; if(%1 != %3%1Null) { /* Need to move it to toPtr */ size = utMax(%0%1GetNum%2(%1) + usedHeaderSize, freeHeaderSize); utRecordArray(%0ModuleID, %3, toPtr - %0%1s.%2, size, true); memmove((void *)toPtr, (void *)fromPtr, size*elementSize); utRecordArray(%0ModuleID, %3, toPtr - %0%1s.%2, size, false); %0%1Set%2Index(%1, toPtr - %0%1s.%2 + usedHeaderSize); toPtr += size; } else { /* Just skip it */ size = *(uint32 *)(void *)(((%3%1 *)(void *)fromPtr) + 1); } fromPtr += size; } %0SetUsed%1%2(toPtr - %0%1s.%2); %0SetFree%1%2(0); } /*---------------------------------------------------------------------------------------- Allocate more memory for the %1.%2 heap. ----------------------------------------------------------------------------------------*/ static void allocMore%1%2s( uint32 spaceNeeded) { uint32 freeSpace = %0Allocated%1%2() - %0Used%1%2(); if((%0Free%1%2() << 2) > %0Used%1%2()) { %0Compact%1%2s(); freeSpace = %0Allocated%1%2() - %0Used%1%2(); } if(freeSpace < spaceNeeded) { utRecordResize(%0ModuleID, %3, %0Allocated%1%2(), true); %0SetAllocated%1%2(%0Allocated%1%2() + spaceNeeded - freeSpace + (%0Allocated%1%2() >> 1)); utResizeArray(%0%1s.%2, %0Allocated%1%2()); utRecordResize(%0ModuleID, %3, %0Allocated%1%2(), false); } } /*---------------------------------------------------------------------------------------- Allocate memory for a new %1.%2 array. ----------------------------------------------------------------------------------------*/ void %0%1Alloc%2s( %3%1 %1, uint32 num%2s) { uint32 freeSpace = %0Allocated%1%2() - %0Used%1%2(); uint32 elementSize = sizeof(%4); uint32 usedHeaderSize = (sizeof(%3%1) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(%3%1) + sizeof(uint32) + elementSize - 1)/elementSize; uint32 spaceNeeded = utMax(num%2s + usedHeaderSize, freeHeaderSize); #if defined(DD_DEBUG) utAssert(%0%1GetNum%2(%1) == 0); #endif if(num%2s == 0) { return; } if(freeSpace < spaceNeeded) { allocMore%1%2s(spaceNeeded); } %0%1Set%2Index(%1, %0Used%1%2() + usedHeaderSize); %0%1SetNum%2(%1, num%2s); utRecordArray(%0ModuleID, %3, %0Used%1%2(), num%2s + usedHeaderSize, true); *(%3%1 *)(void *)(%0%1s.%2 + %0Used%1%2()) = %1; num%ss%0%1Get%2Index(%1) utRecordArray(%0ModuleID, %3, %0Used%1%2(), num%2s + usedHeaderSize, false); %0SetUsed%1%2(%0Used%1%2() + spaceNeeded); } /*---------------------------------------------------------------------------------------- Wrapper around %0%1Get%2s for the database manager. ----------------------------------------------------------------------------------------*/ static void *get%1%2s( uint64 objectNumber, uint32 *numValues) { %3%1 %1 = %3Index2%1((%4)objectNumber); *numValues = %0%1GetNum%2(%1); return %0%1Get%2s(%1); } /*---------------------------------------------------------------------------------------- Wrapper around %0%1Alloc%2s for the database manager. ----------------------------------------------------------------------------------------*/ static void *alloc%1%2s( uint64 objectNumber, uint32 numValues) { %3%1 %1 = %3Index2%1((%4)objectNumber); %0%1Set%2Index(%1, 0); %0%1SetNum%2(%1, 0); if(numValues == 0) { return NULL; } %0%1Alloc%2s(%1, numValues); return %0%1Get%2s(%1); } /*---------------------------------------------------------------------------------------- Free memory used by the %1.%2 array. ----------------------------------------------------------------------------------------*/ void %0%1Free%2s( %3%1 %1) { uint32 elementSize = sizeof(%4); uint32 usedHeaderSize = (sizeof(%3%1) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(%3%1) + sizeof(uint32) + elementSize - 1)/elementSize; uint32 size = utMax(%0%1GetNum%2(%1) + usedHeaderSize, freeHeaderSize); %4 *dataPtr = %0%1Get%2s(%1) - usedHeaderSize; if(%0%1GetNum%2(%1) == 0) { return; } utRecordArray(%0ModuleID, %3, dataPtr - %0%1s.%2, freeHeaderSize, true); *(%1%0 *)(void *)(dataPtr) = %1%0Null; *(uint32 *)(void *)(((%1%0 *)(void *)dataPtr) + 1) = size; utRecordArray(%0ModuleID, %3, dataPtr - %0%1s.%2, freeHeaderSize, false); %0%1SetNum%2(%1, 0); %0SetFree%1%2(%0Free%1%2() + size); } /*---------------------------------------------------------------------------------------- Resize the %1.%2 array. ----------------------------------------------------------------------------------------*/ void %0%1Resize%2s( %3%1 %1, uint32 num%2s) { uint32 freeSpace; uint32 elementSize = sizeof(%4); uint32 usedHeaderSize = (sizeof(%3%1) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(%3%1) + sizeof(uint32) + elementSize - 1)/elementSize; uint32 newSize = utMax(num%2s + usedHeaderSize, freeHeaderSize); uint32 oldSize = utMax(%0%1GetNum%2(%1) + usedHeaderSize, freeHeaderSize); %4 *dataPtr; if(num%2s == 0) { if(%0%1GetNum%2(%1) != 0) { %0%1Free%2s(%1); } return; } if(%0%1GetNum%2(%1) == 0) { %0%1Alloc%2s(%1, num%2s); return; } freeSpace = %0Allocated%1%2() - %0Used%1%2(); if(freeSpace < newSize) { allocMore%1%2s(newSize); } dataPtr = %0%1Get%2s(%1) - usedHeaderSize; utRecordArray(%0ModuleID, %3, %0Used%1%2(), newSize, true); utRecordArray(%0ModuleID, %3, dataPtr - %0%1s.%2, freeHeaderSize, true); memcpy((void *)(%0%1s.%2 + %0Used%1%2()), dataPtr, elementSize*utMin(oldSize, newSize)); if(newSize > oldSize) { %sUsed%s%s() + oldSize newSize - oldSize } *(%1%0 *)(void *)dataPtr = %1%0Null; *(uint32 *)(void *)(((%1%0 *)(void *)dataPtr) + 1) = oldSize; utRecordArray(%0ModuleID, %3, %0Used%1%2(), newSize, false); utRecordArray(%0ModuleID, %3, dataPtr - %0%1s.%2, freeHeaderSize, false); %0SetFree%1%2(%0Free%1%2() + oldSize); %0%1Set%2Index(%1, %0Used%1%2() + usedHeaderSize); %0%1SetNum%2(%1, num%2s); %0SetUsed%1%2(%0Used%1%2() + newSize); } static void %0%1Swap%2%3( %4%1 %1, uint32 x, uint32 y) { %5%3 newY = %0%1Geti%2%3(%1, x); %5%3 newX = %0%1Geti%2%3(%1, y); %0%1Remove%2%3(%1, newY); %0%1Remove%2%3(%1, newX); %0%1Insert%2%3(%1, x, newX); %0%1Insert%2%3(%1, y, newY); } static void %0%1HeapDown%2%3( %4%1 %1, uint32 arg_x) { uint32 x = arg_x; uint32 leftIndex; uint32 rightIndex; %5%3 cur = %0%1Geti%2%3(%1, x); %5%3 left = %5%3Null; %5%3 right = %5%3Null; %5%3 best; utDo { best = cur; leftIndex = (x << 1) + 1; rightIndex = leftIndex + 1; if(leftIndex < %0%1GetUsed%2%3(%1)) { left = %0%1Geti%2%3(%1, leftIndex); if(%0%1Compare%2%3(best, left) > 0) { best = left; } if(rightIndex < %0%1GetUsed%2%3(%1)) { right = %0%1Geti%2%3(%1, rightIndex); if(%0%1Compare%2%3(best, right) > 0) { best = right; } } } } utWhile(best != cur) { if(best == left) { %0%1Swap%2%3(%1, x, leftIndex); x = leftIndex; } else { %0%1Swap%2%3(%1, x, rightIndex); x = rightIndex; } } utRepeat; } static void %0%1HeapUp%2%3( %4%1 %1, uint32 arg_x) { uint32 x = arg_x; %5%3 cur = %0%1Geti%2%3(%1, x); uint32 parentIndex; utDo { parentIndex = (x-1) >> 1; } utWhile(x > 0 && %0%1Compare%2%3(%0%1Geti%2%3(%1, parentIndex), cur) > 0) { %0%1Swap%2%3(%1, parentIndex, x); x = parentIndex; } utRepeat %0%1HeapDown%2%3(%1, x); } void %0%1Push%2%3( %4%1 %1, %5%3 %3) { uint32 index = %0%1GetUsed%2%3(%1); %0%1Append%2%3(%1, %3); %0%1HeapUp%2%3(%1, index); } %5%3 %0%1Peek%2%3( %4%1 %1) { if(%0%1GetUsed%2%3(%1) == 0) { return %5%3Null; } return %0%1Geti%2%3(%1, 0); } %5%3 %0%1Pop%2%3( %4%1 %1) { %5%3 cur; %5%3 retval = %0%1Peek%2%3(%1); uint32 newNum = %0%1GetUsed%2%3(%1) - 1; if(retval == %5%3Null) { return retval; } if(newNum == 0) { %0%1Remove%2%3(%1, retval); %0%1SetUsed%2%3(%1, 0); return retval; } %0%1Remove%2%3(%1, retval); cur = %0%1Geti%2%3(%1, newNum); %0%1Remove%2%3(%1, cur); %0%1Insert%2%3(%1, 0, cur); %0%1SetUsed%2%3(%1, newNum); %0%1HeapDown%2%3(%1, 0); return retval; } void %0%1Improve%2%3( %5%3 %3) { %4%1 %1 = %0%3Get%6%1(%3); uint32 _index = %0%3Get%6%1Index(%3); %0%1HeapUp%2%3(%1, _index); } %0%2 %1%2_, next%1%2_; %0%2 %1%2_; uint32 x%1%2; %0%2 %1%2_; %0%1 owning%2%1 = %3%4Get%2%1(%4); for(%1%2_ = %4%3GetFirst%1%2(%3); %1%2_ != %0%2Null; %1%2_ = next%1%2_) { next%1%2_ = %4%2GetNext%3%1%2(%1%2_); for(x%1%2 = 0; x%1%2 < %4%3GetNum%1%2(%3); x%1%2++) { %1%2_ = %4%3Geti%1%2(%3, x%1%2); %1%2_ = %4%3Get%1%2(%3); %3 if(%1%2_ != %0%2Null) { %3 %0%2Destroy(%1%2_); %3 } %3 %0%2Destroy(%1%2_); %7 if(%5%2_ != %6%2Null) { %7 %0%2Set%1%3(%5%2_, %4%3Null); %7 } %7 %0%2Set%1%3(%5%2_, %4%3Null); } if(owning%5%2 != %0%2Null) { %4%2Remove%1%3(owning%5%2, %3); if(owning%6%2 != %0%2Null) { %4%2Set%1%3(owning%6%2, %5%3Null); #if defined(DD_DEBUG) } else { utExit("%2 without owning %1"); #endif %3 if(%0%1Get%2(%1) != %3%4Null) { %3 %3%4Destroy(%0%1Get%2(%1)); %3 } switch(%0%1Get%2(%1)) { case %0: %3%4Destroy(%0%1Get%2(%1)); break; default: break; } /*---------------------------------------------------------------------------------------- Destroy %0 including everything in it. Remove from parents. ----------------------------------------------------------------------------------------*/ static void destroy%1( %2%1 %1) { void %0%1Destroy( %2%1 %1) { if(%0%1DestructorCallback != NULL) { %0%1DestructorCallback(%1); } %0%1Free(%1); void(*%0%1ConstructorCallback)(%2%1); void(*%0%1DestructorCallback)(%2%1); /*---------------------------------------------------------------------------------------- Constructor/Destructor hooks. ----------------------------------------------------------------------------------------*/ %sdatabase.hDatadrawUtilddutil.h/*---------------------------------------------------------------------------------------- Database %0 ----------------------------------------------------------------------------------------*/ #include "%1" union %0TempType_ %0Temp_; struct %0RootType_ %0RootData; uint8 %0ModuleID; struct %0%1Fields %0%1s; #if defined(DD_DEBUG) /*---------------------------------------------------------------------------------------- Write out all the fields of an object. ----------------------------------------------------------------------------------------*/ void %0Show%1( %2%1 %1) { utDatabaseShowObject("%0", "%1", %2%12Index(%1)); } #endif #undef %0%1Geti%2 %4 %0%1Geti%2( %3%1 _%1, uint32 x) { return (%0%1s.%2)[%0%1Get%2Index(_%1) + x]; } #undef %0%1Get%2s %4 *%0%1Get%2s( %3%1 %1) { return %0%1s.%2 + %0%1Get%2Index(%1); } #undef %0%1Seti%2 void %0%1Seti%2( %3%1 %1, uint32 x, %4 value) { %0%1s.%2[%0%1Get%2Index(%1) + x] = value; } #undef %0%1Get%2 %4 *%0%1Get%2( %3%1 %1) { return %0%1s.%2 + %0%1Get%2Index(%1); } #undef %0%1%2 bool %0%1%2( %3%1 _%1) { return (%0%1s.%2[%3%12Index(_%1) >> 3] >> (%3%12Index(_%1) & 7)) & 1; } #undef %0%1Set%2 void %0%1Set%2( %3%1 _%1, bool value) { uint32 x%1 = %3%12Index(_%1); %0%1s.%2[x%1 >> 3] = (%0%1s.%2[x%1 >> 3] & ~(1 << (x%1 & 7))) | ((value != 0) << (x%1 & 7)); } #undef %0%1%3%2 %5 %0%1%3%2( %4%1 _%1) { return %0%1s.%2[%4%12Index(_%1)]; } #undef %0%1Set%2 void %0%1Set%2( %4%1 _%1, %5 value) { %0%1s.%2[%4%12Index(_%1)] = value; } #undef %0%1%3%2 %5 %0%1%3%2( %4%1 _%1) { return %0%1s.%6[%4%12Index(_%1)].%2; } #undef %0%1Set%2 void %0%1Set%2( %4%1 _%1, %5 value) { %0%1s.%6[%4%12Index(_%1)].%2 = value; } #undef %0%2Get%1Name char *%0%2Get%1Name( %3%2 %2) { return utSymGetName(%0%2Get%1Sym(%2)); } #if defined(DD_DEBUG) /*---------------------------------------------------------------------------------------- Copy the properties of %1. ----------------------------------------------------------------------------------------*/ void %0%1CopyProps( %2%1 old%1, %2%1 new%1) { %0%1Set%2(new%1, %0%1%3%2(old%1)); %0%1CopyAttributes(old%1, new%1); /*---------------------------------------------------------------------------------------- Return the integer equivalent for the bit fields in %1. ----------------------------------------------------------------------------------------*/ uint32 %0%1GetBitfield( %2%1 _%1) { uint32 bitfield = 0; uint8 xLevel = 0; bitfield |= %0%1%2(_%1) << xLevel++; return bitfield; } /*---------------------------------------------------------------------------------------- Set bit fields in %1 using bitfield. ----------------------------------------------------------------------------------------*/ void %0%1SetBitfield( %2%1 _%1, uint32 bitfield) { %0%1Set%2(_%1, bitfield & 1); bitfield >>= 1; /*---------------------------------------------------------------------------------------- Make a copy of the attrlist. ----------------------------------------------------------------------------------------*/ %0Attribute %0CopyAttribute( %0Attribute oldAttribute) { %0Attribute newAttribute = %0AttributeAlloc(); %0AttributeType type = %0AttributeGetType(oldAttribute); %0AttributeSetType(newAttribute, type); switch(type) { case %1_INT64: %0AttributeSetInt64Val(newAttribute, %0AttributeGetInt64Val(oldAttribute)); break; case %1_DOUBLE: %0AttributeSetDoubleVal(newAttribute, %0AttributeGetDoubleVal(oldAttribute)); break; case %1_BOOL: %0AttributeSetBoolVal(newAttribute, %0AttributeBoolVal(oldAttribute)); break; case %1_SYM: %0AttributeSetSymVal(newAttribute, %0AttributeGetSymVal(oldAttribute)); break; case %1_STRING: case %1_BLOB: if(%0AttributeGetNumData(oldAttribute) != 0) { %0AttributeSetData(newAttribute, %0AttributeGetData(oldAttribute), %0AttributeGetNumData(oldAttribute)); } break; default: utExit("Unknown attribute type"); } return newAttribute; } /*---------------------------------------------------------------------------------------- Make a copy of the attrlist. ----------------------------------------------------------------------------------------*/ %0Attrlist %0CopyAttrlist( %0Attrlist oldAttrlist) { %0Attrlist newAttrlist = %0AttrlistAlloc(); %0Attribute oldAttribute, newAttribute; %0ForeachAttrlistAttribute(oldAttrlist, oldAttribute) { newAttribute = %0CopyAttribute(oldAttribute); %0AttrlistAppendAttribute(newAttrlist, newAttribute); } %0EndAttrlistAttribute; return newAttrlist; } %s_%s/*---------------------------------------------------------------------------------------- Get the %1's %2 attribute value. ----------------------------------------------------------------------------------------*/ %3 %0%1Get%2Attribute( %7%1 _%1, utSym sym) { %0Attribute attribute = %0%1FindAttribute(_%1, (sym)); if(attribute == %0AttributeNull || %0AttributeGetType(attribute) != %5) { return %4; } return %0Attribute%6%2Val(attribute); } /*---------------------------------------------------------------------------------------- Set the %1's %2 attribute value. ----------------------------------------------------------------------------------------*/ void %0%1Set%2Attribute( %7%1 _%1, utSym sym, %3 value) { %0Attribute attribute = %0%1AttributeCreate(_%1, sym, %5); %0AttributeSet%2Val(attribute, value); } /*---------------------------------------------------------------------------------------- Get the %1's string attribute value. ----------------------------------------------------------------------------------------*/ char *%0%1GetStringAttribute( %3%1 _%1, utSym sym) { %0Attribute attribute = %0%1FindAttribute(_%1, (sym)); if(attribute == %0AttributeNull || %0AttributeGetType(attribute) != %2_STRING) { return NULL; } return (char *)%0AttributeGetData(attribute); } /*---------------------------------------------------------------------------------------- Set the %1's string attribute value. ----------------------------------------------------------------------------------------*/ void %0%1SetStringAttribute( %3%1 _%1, utSym sym, char *string) { %0Attribute attribute = %0%1AttributeCreate(_%1, sym, %2_STRING); %0AttributeSetData(attribute, (uint8 *)string, strlen(string) + 1); } /*---------------------------------------------------------------------------------------- Get the %1's blob attribute value. ----------------------------------------------------------------------------------------*/ uint8 *%0%1GetBlobAttribute( %3%1 _%1, utSym sym, uint32 *length) { %0Attribute attribute = %0%1FindAttribute(_%1, (sym)); if(attribute == %0AttributeNull || %0AttributeGetType(attribute) != %2_STRING) { return NULL; } *length = %0AttributeGetNumData(attribute); return %0AttributeGetData(attribute); } /*---------------------------------------------------------------------------------------- Set the %1's blob attribute value. ----------------------------------------------------------------------------------------*/ void %0%1SetBlobAttribute( %3%1 _%1, utSym sym, uint8 *data, uint32 length) { %0Attribute attribute = %0%1AttributeCreate(_%1, sym, %2_BLOB); %0AttributeSetData(attribute, data, length); } /*---------------------------------------------------------------------------------------- Create the attribute on the %1. ----------------------------------------------------------------------------------------*/ %0Attribute %0%1AttributeCreate( %2%1 _%1, utSym sym, %0AttributeType type) { %0Attrlist attrlist = %0%1GetAttrlist(_%1); %0Attribute attribute; if(attrlist == %0AttrlistNull) { attrlist = %0AttrlistAlloc(); %0%1SetAttrlist(_%1, attrlist); } attribute = %0AttrlistFindAttribute(attrlist, sym); if(attribute != %0AttributeNull) { return attribute; } attribute = %0AttributeAlloc(); %0AttributeSetSym(attribute, sym); %0AttributeSetType(attribute, type); %0AttrlistAppendAttribute(attrlist, attribute); return attribute; } /*---------------------------------------------------------------------------------------- Delete the attribute from the %1. ----------------------------------------------------------------------------------------*/ void %0%1DeleteAttribute( %2%1 _%1, utSym sym) { %0Attribute attribute = %0%1FindAttribute(_%1, sym); if(attribute == %0AttributeNull) { return; } %0AttributeDestroy(attribute); } /*---------------------------------------------------------------------------------------- Copy attributes from one %1 to another. ----------------------------------------------------------------------------------------*/ void %0%1CopyAttributes( %2%1 old%1, %2%1 new%1) { %0Attrlist oldAttrlist = %0%1GetAttrlist(old%1); %0Attrlist newAttrlist; if(oldAttrlist == %0AttrlistNull) { return; } newAttrlist = %0CopyAttrlist(oldAttrlist); %0%1SetAttrlist(new%1, newAttrlist); } INT64Int64int64DOUBLE0.0DoubledoubleBOOLfalseBoolboolSYMutSymNullSymutSym/*---------------------------------------------------------------------------------------- Get the %1.%2 field. ----------------------------------------------------------------------------------------*/ %4 %0%1%7%2( %3%1 %1) { %0%5 object = %0DatadrawRootFind%5(%0FirstDatadrawRoot(), %1); if(object == %0%5Null) { return %6; } return %0%5%7%2(object); } /*---------------------------------------------------------------------------------------- Set the %1.%2 field. ----------------------------------------------------------------------------------------*/ void %0%1Set%2( %3%1 %1, %4 value) { %0DatadrawRoot theRoot = %0FirstDatadrawRoot(); %0%5 object = %0DatadrawRootFind%5(theRoot, %1); if(object == %0%5Null) { object = %0%5Alloc(); %0%5Set%1Key(object, %1); %0DatadrawRootInsert%5(theRoot, object); } %0%5Set%2(object, value); } %s%c%sdatabase.cwtCould not open file %sGenerating C file %sޮ:⍀:PʮŮ%⍀%P鱮謮⍀P阮蓮⍀Pz⍀Pfa⍀PMH⍀P4/⍀P⍀P}⍀}Ph⍀hPЭ˭S⍀SP鷭貭>⍀>P鞭虭)⍀)P酭耭⍀Plg⍀PSN⍀P:5⍀P!⍀P⍀P⍀P֬Ѭ⍀P齬踬l⍀lP餬*QCQ\QuQQQQQQ R$R=RVRoRRRRRRSS7SPS$Ë$ÅySsh]6S0 SԶSrUC1׵̵S`S8S2'S޴ӴȴS}[SU(S"SSݳSԳSγƳQPSS|PskP-S%SS? βSxȲSxzSxt? _SSʰI@Mʰ=SʰSʰSʰSʰѱSʰɱSʰSʰsSʰkSʰcSʰRSʰ;ʰ0ʰSʰ ̰Sʰư?  M2~M2tM2jM2`2ZK M2AM27L2-L2#2L2L2L2L22ѯL2ǯL22L22S2E2S2SS2KS2CS29.?  SASŮSSSS? maSW >KSSS SSޭ? ƭS:SvSnSfS9+#:S? Sج`3̬SS? SD]SWKSAC3;/S% 3SSSSS~SvSnSMS?S S2S֪ʪS1SS1vSESSSS۩SөS˩SSoSi]SS@0GS.S#SԨS̨SĨS? qS$KS$&S$ ? SzDzSzڧ0zΧSzzzsSzQSzK?Sz5/z)Sz zzɦSzSzlSzdSz\Sz/Sz'SzSzSzSzۥ.zϥSzSzSz|Szv? 8Sܤ SܤޤSܤؤ? ä@S@S@^S@XP.@BS@<? S<ΣS<S<S<nS<h>S<8? #SV .VSVҢSVʢSV¢SVSVSVSVzXSVR? :.Sʞ$@-ʞSʞʞʞҡSʞʞSʞznSʞd,ʞXSʞ:ʞ/ʞSʞݠѠSʞǠ +ʞSʞSʞdSʞ<Sʞ1%Sʞ*ʞSʞ۟ϟSʞş`)ʞSʞcSʞ6Sʞ.Sʞ&SʞSʞSʞSʞ̞Sʞƞ? S>(>S>_S>WS>OS>E:? "$SߝSٝ͝SÝ'SSSySQSK?S5')S#S &S&SSS&&S~? g_$QS2S,SS%? ̛S%SwSqeS[@%OS> SSS? ޚҚSȚDšS%SrSjSbSVK@5)S$SSݙSՙSϙÙS$ymSc$WS)S!SSS@$SSSS{Sq@#CS;S3SSS? SS#zSthS^"RS$SSSSޖS֖SSSSfSDS>2S("SSؕSǕSSwSOSI=S3"'SSSSSSSSPS.S(S@"ݓSՓS͓SSSSZSRSJSA3SSȒSS? `S 3S S ? ՑSϑÑS!S!hS`SXS*S"SSSސҐSȐ!SSSTSLSDSSSSSďSSSSw !AS9S1SSSSŎSSSSzSrSjSa<SSSύSS? kSֆeYSֆO!ֆC7Sֆ' ֆ ֆ SֆیSֆӌSֆˌSֆSֆSֆSֆ_SֆWSֆOSֆSֆSֆ Sֆֆֆ؋ʋSֆSֆve ֆk ֆ/Sֆ'SֆSֆSֆSֆSֆъֆƊֆSֆxSֆnֆ8Sֆ0Sֆ(SֆSֆSֆSֆSֆSֆSֆSֆymSֆcֆ-Sֆ%SֆSֆSֆSֆ߈SֆSֆSֆSֆSֆcWSֆMֆSֆSֆSֆهSֆчSֆɇSֆSֆSֆSֆSֆv0Sֆ"Sֆ؆Sֆ҆? SڄSڄ|ڄGSڄ?Sڄ7SڄSڄSڄSڄSڄSڄSڄSڄSڄ[Sڄ3Sڄ SڄSڄք? SցSցցJSցBSց:Sց SցSցSցك̓SցÃ`ցSցSց}SցOSցGSց?Sց6 Sց?ցɂSցSցSցSցSց{SցrB!SցSց܁Sցҁ? S::S:lS:dS:\S:-S:%S:S:S:S:߀S:S:S:S:{YS:<S:6? SQSQSQSQSSQM? S~ ~~~S~~S~~? ~v~Sxl~@x`~Sx2~Sx*~Sx"~Sx}Sx}Sx}Sx}}Sx}x}Sx}Sx}Sx~}SxP}SxH}Sx@}Sx6}.}!x}Sx|Sx|Sx|Sx|Sxg|Sx_|SxY|M|SxC| x|Sx |Sx|Sx{{{x{x{{x{Sx{Sx{Sxy{SxK{SxC{Sx;{Sx5{){Sx{`x{SxzSxzSxzSxzSxzSxzSxzzSx{zxozSxAzSx9zSx1zSxzSxySxySxyy!xySxySxqySxiySxcyWySxMy xAySxySx ySxySxxSxxSxxSxxxxSxx? kx_xSsUx@ sIxSsxSsxSs xSswSswSswSswwSsw swSswwSsowSsgwSs9wSs1wSs)wSsww!svSsvSsvSsvSsvvSsPvSsHvSsBv6vSs,v` suSsuSsuSsuuuSsu suSsuSsuSsyuSsKuSsCuSs;uSs1u)u!s uSstSstSstSsttSststSs[tSsStSsKtSstSstSs tSssssSss? ssSmsmsSmdsSm\sSmTsSm&sSmsSmsSmsrrrSmrmrSmrSmrSmrSmbrSmZrSmRrSmLr@rSm6r m*rSmqSmqSmqSmqSmqSmqSmqq!m~qSmQqSm+qSm#qSmpSmpSmpSmppmppmpSmcpSm[pSmSpSm%pSmpSmpSm ppmoSmoSmoSmooSmomoSmpoSmhoSm`oSm2oSm*oSm"oSmo ooSmn`mnSmnSmnSmnSmnSmwnSmonSmen]n!m?nSmnSmmSmmSmmmSmmmmSmmSmmSmmSmQmSmImSmAmSm3m&mmSml? llShlhllShlhlShzlShrlShjlShddSdd? ccS cc ccS ccS ccS ccS ccrcS clc`cS cVc cJcS ccS ccS c cS cc? bbSnbbnbbSnbbSnbbSnbbSnbbubjb? TbHbSa>ba2bSabSaaSaaSaaaa? aaSb`aDb`aaSb`ab`waSb`SaSb`1aSb`+aaSb`amb``Sb``Sb``Sb``Sb````Sb`` b``Sb`u`m`b`c`^`? *`SS`SS_SS_SS__SS_S__!Sp_SSh_[_9_SS_SS^SS^^SS^`S^SS^SS^SS`^SSX^SSP^SS^SS ^SS^SS]]S]SS]]BS]SSv]SSn]SSf]SSU]SS<]SS3]+]!S]SS\SS\SS\SS\\SS\ESh\SSb\V\SSL\S@\SS\SS \SS\SS[SS[SS[SS[[!S[SSl[SSf[Z[SSP[SH[<[SS2[SZSSZSSZSSZSSZSSZZSSZSSZSSKZSSCZSS2ZSSZSS ZYSSYSYSSYSSYSSYSSYSSxYSSJYSSBYSS:YSS,YYXSSXSSXSSXXSSXYSXyXSSoXQSgX[XSSQXDS#XSSXSSXSSWSSWWSSW:SWSSWSSWSS{WSSuWiWSS_W1SQWIW!SWSSWSS WW!SVSSVVSSV"SVVSSVSVSSwVSSoVSSeVCVSS=V1VSS'VSUSSUSSUSSUSSUSSUSSUUU!SnUSSFUSS$USSUSSTTSSTSTSSTSSTSSTT!SxTSSPTSSJT>TSS4T`STSSSSSSSSSS!SSSSSSSSSSSSS{SSSqSiSSKSSS2SSSSSSS? RRS.QR.QRS.QRS.QRRS.QR.QRS.Q]RS.QURS.QMRS.QCR!RS.QRRS.QR@.QQS.QQS.QQS.QQS.QQQS.QQXQS.QRQFQS.QPP>PPS>PPS>PPS>PPS>PPPPS>PP>P_PS>PWPS>POPS>PEP:P? #PPSBN PDBNPOSBNO`BNOSBNOOSBNOOSBNOBNOSBNyOSOSBNMOBO6OSBN,OBN OSBNNSBNNNSBNN@BNNSBNNSBNNNSBNN@BNNSBNTNSBNLNSBNDNSBN>N? NSLNMSLMLMSLMSLMSLMSLMMLxMSLMMSL+MSL%MMSLMLMSLLSLLSLLSLLSLyLSLQLSL$LSLLSLLSLL? KSDKKSDKDKSDKSD}KSDuKSDgKZKRK!D4KSDKSDJSDJSDJSDJSDJSD}JqJSDgJD[JSD-JSD%JSDJSDJJDISDIIISDI`DISDISDISD{ISDmI`IXI!D:ISDISDHSDHSDHSDHSDHHSDwH DkHSDFHCD;HNDHSDHHG!DGSDGSDGSDGSD^GSD8GSD0GSD*GGSDGDGSDFSDFSDFSDFCDFNDFSD{FpFdFSDZFDNFSD)FCDFNDFSDEEE!DESDESDrESDjESDBESD!ESDDSDDSDDSDDSDDSDD? [DS?UD9DS?/D?!D?DD?CCS?CCS?C`?CS?CS?~CS?vCS?dCWCOC?6CS?.C&CB?CS?BS?BS?BS?BS?BS?uBS?SBS?MBABS?7B?+BS?AS?AS?AS?AAAA?A?AA?{AUAS?OACAS?9A?-AS?@S?@S?@S?@C?@N?@S?@@^@S?6@S?@S??S??S??S??S??? ??S.<{?`.<o?S.<J?C.<??N.<"?S.<>>.<>S.<>>B.<>S.<x>S.<p>S.<h>S.<W>S.<>>S.<0>>>S.<>.<=S.<===.<==.<q=S.<f=^=.<;=,=.<=S.<<S.<<S.<<S.<<S.<<S.<<S.<x<S.<o<M<S.<0<S.<*<? <<S~8;D~8;;S~8;~8;S~8;S~8;S~8;S~8};P;S~8J;>;S~84;~8(;S~8:S~8:S~8:S~8::::S~8:~8:S~8d:S~8\:S~8T:S~8<::S~8 :9S~89~89S~89999S~89~89S~8g9Z9'9S~89S~89S~88S~88S~88S~88S~88S~88S~88S~8z8? b8V8SB6L8DB6F8:8SB608B6$8SB67SB67SB67SB67SB67SB67SB6p7SB6j7^7SB6T7@B6H7SB67SB6 7SB67SB6666SB66SB66SB66SB6T6SB6L6SB6D6SB6>6? %66S26D2 65S2525S25S25S25S2k5S2c5S2[5S235S2-5!5S252 5S24S24S24S244S24 24S2R4S2J4S2B4S294 4S243S2323S23S23S23S23|3J3S2B3S2:3S23S22S22S22S22? 22S-2D-22S-2-2S-N2S-F2S->2S-/2#2S-2`- 2S-1S-1S-1S-111S-1 -1S-P1S-H1S-@1S-(10S-00S-0-0S-00S-0@-0S-m0`0P0D0S-:0-.0S- 0///S-/-/S-/S-/S-/S-l/?/S-9/-/S-#/-/S-....S-.-.S-..W.S-O.S-G.S-.S-.S- .S--S--S--S--S--S--? v-j-S'`-D'Z-N-S'D- '8-S'-S',S',S',,S',',S',S',S'{,S'j,U,I,S'?,'3,S'+S'+S'+S'+S'++S'+ '+S'd+S'\+S'T+S'3+'+S'+'+S'*S'*S'*S'****S'w*@'k*S'5*S'-*S'%*S'**))S')'))S') ')S'v)S'n)S'f)S'])0)S'*))S')@')S'(S'(S'(S'(((S'R(S'J(S'B(S'%(S''S''S''S''? ''S"'D"''S"' "'S"V'S"N'S"F'S"7'+'S"!'"'S"&S"&S"&S"&&&S"&"&S"Q&S"I&S"A&S"&S"&&S"%`"%S"%S"%S"%S"%%v%j%S"`% "T%S"%S"%S"%S"$$$$S"$"$$S"$ "$S"N$S"F$S">$S"5$$S"$#S"#`"#S"#S"#S"#S"#x#W#S"*#S""#S"#S""S""S""S""S""? ""S"D"y"So" c"S-"S%"S"S""S!!S!S!S!S!!t!Sj!^!S(!S !S!S S  S @ S S S Sj ] H < S2 & SSSSSSVSNSFS1$SS SS~SvSm@S:.S$`SSSSSbSZSRS5SSSS? SZ`ZSZSZSZ|SZMSZESZ=SZSZSZSZSZSZSZySZ\SZV? @4S*SSSSSSSsSkScSUH=2&SSSSSSSSeS]SUSG:/SSSSSSvSnSfS8S0S(S SSSSShS`SXS*S"SS SS? S vS l `S 2S *S "S S S S   S {S qeS [ -S  S ? SSS{SsSjHS S? SSSSSuSmSeS7S/S'S SS`SSSwSHS@S8S SSSSS? xSnbS4S,S$SSSSSSSeSWKSA`5SSSSSSSSSzSl_=S S? SPCPSP@PSP/PXSPL? 2 *"Ƿ S S S S  S z n S d S C 7 S - ڼ   S  ɼ  S  S $ L s T L @ S  S S  S S S S S S S x p d S 6 S . S & S S S S S S S g S _ S W S 4 S  S S ?  S  S S Sx SI SA S9 S S SSS`SSSSfS^SVS(S SS SSSSS~SvSnS@S8S0S" SSSSSSSxSJSBS:S4(S SSSSSSSgS_SWS)S!SS!SSSSfS@S8S2&SSSSS@SySqSiS:S2S*SSSSSSS!~SRS,S$SSSSSSSSSQSISAS3&ǷSSSZSRSJS-SS ? ;e 5SHS-SHS'> "e S/SS/S> e SSSS> e SRSR> e SRSR> e SRSR> e SRSR> e SR~SRx> se mSReSR_> Ze TSgRLSgRF> Ae ;SNR3SNR-> (e "S5RS5R> e SRSR> e SRSR> e |SQ|SQ> e xSQxSQ> e tSQtSQ> e pSQpSQ~> ye slSQklSQe> `e ZhSmQRhSmQL> Ge AdSTQ9dSTQ3> .e (`S;Q `S;Q> e \S"Q\S"Q> XTPLHD@<840,($  W_^X]bZYTGNE[M`OQVD\CcaW_^X]bZYTGNE[M`OQVD\CcaSBHIUKPLJFdRwS D$7LLf"'-246p8 <?5DRLl4N~0P QST`a`bb d)h>lOs_xxq~,ȁ̄Ȇ(G]؛t0H04 Ф1lJ]vԭ|$l?SS1DJ-ZqpO#F??l*_W___i686.get_pc_thunk.bx_needsChildrenProcessed_dvWriteCFile___i686.get_pc_thunk.axdyld_stub_binding_helper_dvSparsegroups_dvCases_dvEntrys_dvEnums_dvUnions_dvKeys_dvPropertys_dvModules_dvFile_dvClasss_utSyms_dvRelationships_fclose_utLogMessage_utError_fopen_utDirectoryExists_utStringToUpperCase_fputs_fprintf_dvSwrtemp_dvComputeDatabaseHash_dvPropertyGetFieldTypeName_dvClassGetReferenceTypeName_strcmp_dvPropertyFindInitializer_utSetFileAndLineAndReturnExitFunc_dvPropertyGetTypeName_dvRelationshipHashedByName_dvWrtemp_dvClassGetPrefix_utAssert__dvClassFindProperty_utSymCreate_utSprintf_writeHashTableResizeFunction_dvPrefix_writeKeyHash_writeHashFunction_writeHashTableAddFunction_writeHashTableRemoveFunction_writeHashKeyParameters_writeHashKeyMatch_writeFindFunction_writeRenameFunction_writeClassInsertFunction_writeClassAppendFunction_writeClassInsertAfter_writeClassRemoveFunction_writeClassArrayInsertFunction_writeClassArrayAppendFunction_writeClassRemoveArray_writePropertyInits_writeClassPropFieldAllocs_writeClassPropFieldReallocs_writeClassPropFieldFrees_writeClassAllocs_writeClassReallocs_writeStop_writeRegisterFields_writeStart_writeClassAllocateMore_writeExtendedClassInitFunc_writeConstructorDestructorWrappers_writeArrayCompact_writeArrayAllocMore_writeArrayAlloc_writeArrayFree_writeArrayResize_writeClassPropertyArrayFunctions_writeRelationshipBinaryHeapFunctions_declareClassChildren_declareClassParents_processClassChildren_processClassParents_unionHasCascadeProperty_processClassCascadeProperties_writeClassDestructor_writeClassConstructorDestructorVariables_writeConstructorDestructorVariables_writeFileTop_writeClassShowFunction_writePropertyDebug_writeChildNameDebugFunction_writeClassDebug_writeDebug_propIsClassProp_writeClassCopyPropFuncs_classHasBitfields_writeClassBitfieldFuncs_writeCopyAttrlistFunction_writeAttributeAccess_writeAttributeStringAccess_writeAttributeBlobAccess_writeClassAttributeFunctions_writeSparseFieldAccessFunction_writeSparseFieldAccessFunctions