From 2854b79f62d6fbc633b9b9099489ff00029d42ac Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Tue, 2 May 2023 11:04:55 -0400 Subject: [PATCH] step: add some scaffolding for envs and functions. --- mumble | Bin 113324 -> 114852 bytes src/mumble.c | 91 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 81 insertions(+), 10 deletions(-) diff --git a/mumble b/mumble index 8f8414497cae06339fcd90d94652879d5bb8ba0f..27e3fda6797e63ec127717de915acf12cb8f2b70 100755 GIT binary patch delta 34898 zcmZ`?30zf0+rM+T+pim;;y*ijyrDUesRG-LeWu&EE8MI%nZc^ zmlD!M%?h*LDATa4_mXC0n_Kcd&&-_5K<{^czjM$0|IaedtY^-ggC6>`@f+)!p>1VdJ+HWb^M>wlr4F(g($To&k=Zp4D;k>lUq+nuvJZG{cZ;^aPXTj@^awY$x)Gsj#g96Ey(NBy%mOvTqcB9N(hNA{?I7va9 z6k(764)E}ke8&m#9FLQZT1h@;q~KrVQiGw3LK{|rP)i8-3)$d8R-KO& zjFJMwU12as@>3eA#jAY!sD9cpZpom zu^#9R$!9bO^he3J|Es?K1If>7z}Ir#(!_A%@A?J~a2LTo;r3AQu{?W&!B_GFei6K# zoLE96zei@E*HA0T`vr*3I9vMZDES{yAIG0=&_@c^H!v71`Ia(JU4N|P?>5k%BKc#o z0J{Ec$v;+jKK>U;LHr|8GTmT>RapQxsefDY zTOU~J8&pfdy#~Ggcgb(MBlPuvo=LviAPO*2X3)5?=tIjTzew_~lAly7{4D164?=$_ z=qYQWtuzRee1}FNg96ESko;ab?t4hSyX4E|=+ONqNZw8sOdm~_;ZhLSKrl=49b}v7 zqhN{T{p8fUUS_;n@)2GlQ0zN+WJ~^moVfIR#CE~M{l7AvD{6#a411)(VNE#dD`>+( z$=BQv`Yk12EcsRq^gqz`8}L^oznV{6P(S(<`;`=2_*rD2SLsiZ50LAC2$}Kkl1~T{ zfxaqv(nPfVSvd-FB<~{mf{sG}8|1Nlf~8<@xB8A^B;UWQ;Kvi;sk`Kd#|wUkpbaUK z_v<70Ba)vX`LgbUkC%Q{0&n4WKY2IPt8}9@AaaGXTsq2^e9t)HXrpvgDEXo;g4Y8& zBKbM8?K??7rz9UcppWRE@5?#ATsM%TK)+94lYB;^$UvWZzn1*cWWisRQ}Xwczdc0o zkuu|ZlDC(BBIWwS@V69PkOo20K(iNZxu=1nrjn1Ajzl&FgSX^8!vtfNe!?Z+O#0Dl zqOC;=O5~DDpFp}w{*4BX5+&cKfunJff388G(4nB?NF&>kVZjb_h z$>&QxU-FawsjvU4urOfdS4d0g_%L_oa^dPEnb;EJ5-bpE>JhfEM9 zSO>!nj~{?H(P6=!^nH&ujh8H4JZ*jkwR(h856|Bsrp;TpV8-NmvzKH%H)WndUMJ63 zyx5jruxvgJ@G7L2y;ix-nz3~9%*6}mbAuTRo}>M|qnj?6@w|?U7kT$>Y{`U7Kf;{h zSPbVIaDE8qc{nG)iN}68akOkhpd5LS-Xie;c|8o*GC1FdQ-4I%n?GIZ;N@MBrelJg zEcy-aW#I6Ej>6d#&Qowsf%648@z^Xb{1@uU@QQ*RA$ErHC>_w*l2?!NPufJoIY?ihjTWZ`jMe0;JOIT zrEo^U`5c^M;lv{q&em|wgL5jJS#aVp9?oo@G8j_e+6K-ZaAv|eAE(%GNZ_#@PJo6N z;amdeEI60JxdP7Ka2CLc$3!^S@s#-4370hr#-tg}eQ@?c0LL^qx5Bv+PF&sWh4Ubs z<1oY5;T#I*DmX{Oxd+a8IFG}L#{oFsgVPDlV{pC$=UF&6!Ku%H&qMk&oOqO+#?fXl z7~%BiDe;qbOz<#PY=!0lrYnL7#UMlBvGeK2a)l@KmySNTNn|^+rL+k!jc8D;kDr}Q z2DPY2jWh|QdiO@91B$dUT@&kL!DiNv5=GilC*fME@R+N9TvB*@orG(J!aFE@rNYa( z0o%u5s8R%uih)((vG3_ejlyGp(~pM=kHge<92YHv!Q(*I5BuYmIspz2{cu$bVssL& zz6#$|;Y|vUBV0eC6keZ-P!^-}SpJT>He9>v0!XVvJ6_?NDf(uG@1*c43XcOqKgKG2 z7a&FbLn2KP;OwOz=?dRXC*hi*@No*iT;Xxv(vM7q$LT>H7DKio=&93i%~yE5N$5v` z!uQrmxE3lrj%58fpz!fJ3D+XdL;0~&@L?*2C5nNwVo<8^eHH$a!sE=W9~BDUUnk*O zsqhK5`UgRkB5+X*tO`Fs;cFD$RpB2hyqm%sPSkaF{r<=Ew^sysZ`Kc2h4<7+xcVx* zm%^JA-do|L6drFs`Vn(tiYPxefv?WOwX0%)H$44_mpsm}>db3a^atw7a7|Hoyk+Re zSQ`)d2k0zZ(`*8R?Z%1XbcI*%%oz$Fr1)8`@WBe7sqnZmu#LZLDZr8qQ4I1G1C=jO z^b-~RLPcNY4=DP$l+X`Lkz$|PLmb%vI9&kOt_q*3@bL2exxY|lXViV=?b5w@EHm(Dpv@XOCGBlmyG(6S*Kt33J8VSbpqQW7WsUI zpMiut3KV{(PQtZN;b$rQ0fkTJJTE`o3>1O7FfLK}If|oFg`cbNmlS@U!dEE#e1)&H zD1rrwpi1EvD!f(UGZel?;c*489}g9Nu}c4BH{APtORrp+mzohUlDtv{)=Lud^Y^5UDq8L;u z{8ojxDtx}e*C_lpg@35<+ZEn$N?HF?MPPqQ3=eFY9SZNN@H-XWSK)Ulyh-xdH0snF zrR(EDk|_o;x&XKWh3~5HFDZQdsVQ_}ke9`*$X{0EDGL9J!jDz>Jqn+u@UJR-y26Jl ze1_ohO}4=hrU;fR2747gQ{f90K3n1UDSW=dzozg73jex#8!uD@Zzu)_6#h+xFH-pZ z3SXk|Zz+7K#e#g+Hk9l?tzxxJvR^qwgsCRz?4i!q))LhY=dQ zs|X${jt(olLGE9m{(A~2 zRQPiWpRMqv3ZJj=WeQ&)`6O)14;4Y7VsKvJ4=8+dg)fpk_Ua4tNNj|6V@s&Poa@wt zUwYcZrPj;QLhr@4(MC?8{+-5YkJ9L}PO;wC(}=;mp_G_&5~|F(aORX--%F$CIz?*x z)97!jeP~)I59d_W%1NjJjha&$UDqjqcJJ)u9s56wUDN2K&XHOZVVt?jj=t8}LpwQ{ zp6nd!y=}5Bw@UC;iMh?6Oi7nWZTe)|s!J!$X)>MCWt?_&5cZY^>t$ve=}I#$g;D!8%^Y)+{>XLhcFiTP zgl;?Uz}$LMlvZ^@uzFf~uRY%aUq$einHCRfy8HEHH$ zQA(gyC)L*0>N!A(M6KmQW0YIJOciL`D#*o??!4*Zn+iU87*jiJB{sHCHwkqe?1;-1Ok28&~P(fa<0YycB?9f$&l&y{r;m z4m9wR>$c%%VxIQ7x$OH!?A`UGNmx!&K3LaaM`|H#^6P9M@FXkSx1M-(&PmD!J!s`} z>%K7%p_nT&fy+d04RX1lV~e`ZmVUa^-WyG!gJdn|9ho=y*fE4I8t=hMhmgi}bKD4R z&=~q%oLO@jLtA!l+q4Gib*9UI5^Ajfp;Nktc>M=(wI{Y?p7D>gQ0`(q-PwJEhlL~T zelRXLf0efG5#TY##_N6mRXVQ6kd}`pqc!SZlKMrXAbf1hjkx8d7xW?o)^OzTSr>=nlNa;MPmj zrEip*HI?fn=6uelA?sFZ?i=NMwgEdj1)BMDxc#&?o7}fI5C*5viRJ+MW#43So`&~p z>F&@#VZ~57x!>%-;Gx8D_jolv$3e5dGLB~~a{Zm&=@;glqf+OoXaAvO37y`*ugkr$ zLKi0{Yx87!yuZo0OmaXOtbfoS`iHjIrBWXyLCF6VvliazqG060wai3YC4{sdB~)$2 zUW3|uQ9I8#PIWUqi7rhT7t<2tcRvE*-7#v|iD2a=tiDtQ-_U;&QpfKFF*ll}%4VYx zK7@j|VX7bn1bkdKzzS{EU})8ebn`&p&gRiPEL(ZP zhuD0LDX}Sk_20{cX_azWoMrWtfEYTMD1m@6j8B2RU>eA#{JHZHE+S zQwGxVAtSVA1887kQpb?tLiQ$n&R*RDeDnJO)&`&M4-epetvXHyHJUNBwd2EK!fs#! zy_VSA@v(&d3G`WFq=TFET20#}wb2gsrxTLeJAW#5*7b+12Gd_tA{{PCDv^Gi6zowg zQ3NX7$5Nl6Pm}g(v-{D#$zE;UfxdeftFbx)gw-baL4=j+-4Ei-Gn%A_F8%238OsLxdY%UvKxNlZWSC{IPZ7LJW2*Q+o6W~iyz z1Q0>%V8vLOTMy#DE0!4PnZ#z6dnux3ZuS9V+&JTPx1qGFIoIBti;HY-lxx4?kww?le3#m_Dr zr1VIlx8nhsLs%brH>I`5YZCqv4;elLzt#=3<*;;zk&<6bcMqHFtAP}9F9mm{B1>M| z?@+hls~rl5ih@2zcMUf=^pb{2^xW{~uH87Yb)(1h!SJxQEIPy_`f{rg(|N{C+yN|^ z09N;-_ec0qyHSCT6D0jZ59oV-G^5bb!k0aH##K_XwTH|~t}}R-`v$$tgt@YMiasgx ziEW59O8s9($I+-g8nvls6d;WvxRC{x;A&R+X!R6|S^c*ttBmh%l4!`9?*AjcxoA|5 zM)-6JRUwVeNTV~lQIHTr2f@0P_{GH%eoRZmfpsk4B@>Xjna?5z^>1 z7>V_o%u7ebtmnc3Y)A^V8g27 zh(B}9B*sx)K}~<+$QcDAmp=&RjDnS_o;f6W<`c27xk;6tl(pCC_+da40Y9dNj>5mPoinz;hBV6^^Z-Q7ow`f~o@QElDK{suHN(lIkv~ z3ZU{N6(uOV{X1GD=M_g^7#H0yiNlMsI9lMb&T6i1G0bg{XwJ z$D$Kq-(chTv5mg&j1PgHY_lV2N}r8SBy;JI2`#h>v9#?pfA5l5G~nA(cyp`7jCaJ+ ziPIuUF8z2y0(q0VP4w{&s#C*G$4m97BORI(X;;$`Zho#gfi!F464H}Cn%K3e9Z=@n zJbV(R?@nz`=TC~V&+LR;f|Vvu@TSF++=3Q$07Bmk!_6SE>GBXGm_ct(@*sWapOd0U zR~kGyfefe9CpU-3i|olApa5qkA0e0N{IsqlpYBharZwwGn@(w|kr*r!`I8Qt;-OuO z=B2nqw@gXUzK@|-rxj|Y?dXE(?X>)M^wsI(?7d)e=OMXGX-*tzn`r@F&)NdjpgO*x z6Q)IxYcy+G0=Y{+p0*FOo*qqJqI;&N!dHzCA>E5c&1gwH>2Ub{nXaDU-}1B8+&QlP z)1YWD)!6ojj_D#O>4Da?bd4u1EwH0s&6rPqD^8f{LK@v}$sgRQ>A&`L@vIcP5p9Tp zg~StYRuN3>w--9n`?LJXMCy>fRSRlKcc%xDwX`I?1%c=L^tGgtPMY0<94XG4y_Ar% z^zobo@*ItyJD&K{SLQxXIuv`(YfkLfhGT?D6_m^krW5Czpr+T(??*P$59dz}ZQlac zfyEFs7N9E>ARE$fLX(wS!<$2s<7Qy$f|cYp{c^z?%_D-2T-cYqN7=$pHP>)DE2B60 zj=q&KpDdzYi*}JK^w6Rpa+O|LlmLHp>AJWl7>A?rekAv@u3 znQ1&^S_El0d8SKf^Chw586CT%n55EXOM7dMCYrQ#EGeSkZCw#G({usXSvwWT=6bE%0!99Yu159a-Fatv?|z(p1YF(w=@~nP-_85o)OZ6i0cU zaWtm+3L(!p64NIHKMd3O(gbuyVH)2_>H7F457J|h=L>{9;|NUSTVmjcU>cu=AO_q+ zBrYE$Jir~%^I#9 zZA#a^(23ljH?l?%FWP?70PU6|4BlYMHf<+?wABm4$=7tv3!OEsDXqZ|Gaf4x9U=Q2jzAQVMxR9;1Ji9X~q0h3r zdo`=mwM}&}Yvn|d?~0$#snSS0I`+jYq&aP#H<5fv*X7-U4xP4TAq=sKEmMK-xV4Ow z(LcA|wqIxv*|OiJ!QAj5e*$SzJapR~jkwd;9igO#j^5Fgl+&#{!l7=D?U)9xeRrmN ze)I%dBPSsfTBq1Glz0B4bjQx*fN3bebqXni{Y||6CQ11q`p?b;(unrkH2?F_MwIiL1dmo$NpgC0+?|J_;A+zb&bAyOy@oVS83HU89&47yOS~eB# zB`?EoHhoss-gWOClWZnFU5uf3j-tXT!lJ1DykVLbG*@3ac^Q?y@2xV z8oQc7Lh0oT=g3W(^U)4srok5nXyjvBa4n2xU#xUCUg0gp<9l?O9(n3X*Ow!-cxhG0hD*TL8*HRDH z8i%8LEU0_Y#E<>SWIF5PUc^NA!|!eSBmBNb!>{%t)9AFTeFFAf&~wdt_zZVO#RZ%_ zPtRRVhFWs|qz73=hkRlNyB(iwBZaiZr-R`in^^SeHrSDD^qCpf1BsuVBd2Mziaz8a zO|I}GpVIV-a z%}anJER(bB5rJhSJ@>_W@&@hu<#RB6PklMt{Ri-S_cRol8-Pj&8vCEw-Ur|nuxu#N zjX<*TG&S9dB&&*V{KtuS{Db+F80;Zp3>xI!>65R9xxS5jZkDgi@n<@rvN`EYGb?Yp z9{I$?+Ba=TWO4L2p2Xudcz;+wqbfT3#xU1pu$BTdr#*koD|XAy4A+J`_X?#<8u@n!`&H0ws6|&)~8Nj>58+yYel?v!S@TY zf-iyUC2Xq2^g>k|GK2nBRp@mLzI$jmCSk#SyA9b;eEqf^@!)yXYw1M#^Y?A+zk?4T zpaBf@+@01w_b`wgef$_?qcko~`@xxbJdYvN^KhK5yVC{+*5Nxne8!`noUEGqLvIEp zKVGu?<722JxZ`L`igr2X3vny+7;aV6&yth|5YL}X%F+;;$PYaX>UOU{0X%+3>sW_^Sd_J z`-ztR(u$m+cYiUF-L%>LF#+xeKpWn>!xCWGsd{k~(6#piEZ?FxAy29=p9&J&OJM%C zKF`>ltCU+$)LBK>w`$YS%DP+E)k8J527=LxHY4tC-oK0-q>;NGLY^_LzD-wp z>sLSTTi7?CF0DU`1T0F7eaq<3C*GP?M!$RLXF1u>H)LORQq)FkX$@2*r)*CM``&C& z8K81TTKx$!*?#BhTh0BqmBqMUnw_gNd!@cvr-o)$4?Qqj1BRB0kR9}LLWS78@b>!^ zJ{7Cqe!qZUe9!(6ryAa6jW^B-H|Iq#*npw+-MsxTHz)PLZC-XtFKg<&{B!~xWBu`9 zrs-ZRwhvG8jGuCya_dPD$_o6C&5U=1wz`>ObwOIKtFyXV-|Fwz8j#p;^gf+3RN2*}PZZCQr37fx7h_scW4o5;az=K`5RTXOcnm@$cc5Y{67PTtjUB zs&G68tNw7rTjxoC=3L_-Ud^^X`5NegUu-jXn-^Z&m9I6Z0Bh$uFCOPCdeiVao>1rJ zi{rY4yV?FPH~2@wyrpuDH$TvIxfky`FT3k|NmRY?D)P7@lpk8JNh^5!eE;_t%Rm9K zUb@(v@OrtqPbpCb)C;HtaFudvd&mHSDuo*AWechlYx8fg!f>t6gi1|GJ2VAJk|0W~ zcSHgFRE{+6exx8Z^bbn_w3^kNJh3zd&v zp6yktn0LKHB21Vrj4L20q03u)y~q)}UZl+n?=vN;7n1=xu&joMRx+Qi_^XBGqOirv zyM7dldLB~cJOvx*#;vxyGTu(*j&PWW1Z#I6Xo^UxFzP5ZzZlH#C*dDsTgi3Ht-tG8 z;-2Q`e+O9F2tt_%zmd1q;ouMI2Xks=i!Rs}-3{BV7IT-;EfC)D8UNuCJ-SMaZt1H^ zo$}~9pstG;wb!{aym6rAf48tK7db02wU9Br3SMMP8^A==*z-JvH5U25Vmd9nVNAn# zHrUQQrqVqPW4eX@jW9!5f24~Zwut#udK9ERI)USX{6t+J`#A*)ZOr8D5|PQi6FieGuZS=%)rC2V zhpF}C3bApoD3xF`U}4rgv@VtE*13>??46##y$~aSx!d?F{q=FMR&^W$&^~#Yx;^%5 zTIW8WCO`2Z%jv$y{$v?l_axB01hN2Ahz?HZ3nj0xj9}v5m=B=0=x4AbDSQQ=4t(gd zC$7y03iV1*uR`@MfNeEU0r>|Xr|q8x!4}ler~cZDyCHucdaj^}v-i7tmvDp>tg=0g z@PfuV0D|y>z3Rr!m4|eNtB|rO*x3|z+Z47)g~sUN!`)Dc{>~F@(iByixtr~6Lqg&p zUcT=Adp9pG#?MQ5QecQ&l;U}@!pg^xn{XR9oO5D)S_+ek>qmb=~)^^u!U$V-EhNh)vpQ@)e2j2C2?a2I&xb7*rBt}QBwWsUmltIWx><{ECSqzSrba*t970bp zR`GzaP@6;uyoZPv&a1bB0et>rupY$}yec(V4?qe`vB$h=GaX_xEfS4w?Slrer*4R~ z{*Bo_gK}Aa5!vE8XpYU+)n-6yB#QP%@XjV|C_(Ix9YtlCIg zm_~zlC>>VJ2AHGJn${KA^p0589XNs&Rm!$B zCO(>(o03kftT8e5+_?GQA>qFT0wEMwy9j^zV7vonBaGz@L1hEg{vZo(0yo1`Z}Zt= zKTBysTD1CgD@5}lRD1Pb7*Yn;=ii}P-@xIXBX>uQhgo405~P{9b^9PN16exk(pZNH zJ@Fx_@g11oFy}LZ72l8=6PSZNSeGB*c^_ka?MXEGgDtivOG0Y$Aa_1OVQ#C2D8L>^ zgP6RhGCKzn;eH5|RJu(z`_7a2SgH$9KhLx+A7xX9fH>GPWx``Go`VAtaUEb0i^wshfb8 zH=<-r!&fhRO}t9JW06fsY!^pG<5?Eh`0Z7pu@$T067*I0oB_X3=eK{c$$gA%Z%S6U z#i2n?0(20u57&wXHY1^AIqTJoc)K6T2K%KL8UOaM+*-wEHY35&?S&PLLHs1K+jX+^HE)y^c`&8va!PIknZ1d-?2XU?Qo z$A?%@H>IGn;I^apof?RSF9bTQhx}w@Em*t@i6ZZ^*)Al&@@%&#&?Aux&H=wk>L)?r z_b5L|>bjsxf%-~PrGhE}>awKX6;x5lYK#kN`5rbjZ!6=tefr&l&*DvU6AHzg>#z?; zM9`-~wE&_mK-2qBJ}||h-28Rc-<7ntWC|4+%J?;jZLWG7HTjDW{F+7kRczBY63Uq% z$rQ?$(CunaE@>shbKyFCte3Qw+!NkW_?R#0ExG@4uA><2?+7C~*b`tRaQEUfa>$`I z4?GKpy)~Lex{(x@`@*LgcXZ+Q!8W;(P9%<l5CA zv-l=+p79_P2F5I=d60H6*S7Z{J`Oi!rys?Jd5{n?iY@XWftCYU8hM|1DoR$#_nnO& z@L>)Olf?;$;HnrWFu{w5_iq*33X$f`azUg^G3pYLF2VF6k>e!|r% zcE+28lfPJ%HwhqfP!dWGuwWn3FY?X`@Xw#(~Im_l$=D5Btv{}Y2(eNmdzD)!iqOd`LqasFf< z8N#0UgX>qAe*kGuPP4=SGKdthT>&ImBhN8-_ZLZ`*ezh&9o~X-3w|uZASFEG^oQkh zhd0@fr)@@bU&i{l5Fckyo@p~1%2o!FQ0>Z6E^806{WjUof4N-$q`u4b!VFzbvY90@ z#~^SSSLd>wO&0Pmmk%D-cllt6Ey|zr^um3`cB9LKLWWVEu*u$nRQ-ZaZQychoy!F_ zv&pPgFu3#=GI*plvf07p7vgeqObB%4W@Hicj;rwA2@ZN~v^U!XUq6u-*f|p!2D5}) zDCtFJvXoFV!!BhBd{tUwBA)D%P%wOveG^KSMh?%xxa4bC#|*edd4ekly_YKZjV%i! zA)S3y?!rRQ!;u3YvbuZ#pNkTgENS~kw&L^^b|sAXcdk&mr44Nx*=!G~dWp=xIoM{a zTzEs<#x~pOs@_vJr#XprZlQ9g*&*~tRBro%2IX+F`MddoQVtlm%}Gqtw>Rm{y`6Ol zC(ZqrsY=i0b7xgJ3?Hzi;UuP6dz*p(CRP+qIyJ4y(p`MbYQjmYmZw2Q3H%VoQPW?HrouAu+cyS%~cJ)om*GPiaF4$5|@z>w)Q#bT31_;L(WUV+U6bZrjewlb8D5` z$*x6`fzFj16uo%XA_}-HmAlJUMUkn_J}S40-HjstE`O|7Y)8yyL9IwU8`+X{@>r}& zK1+x3v6o$2P9oX)mZW)SKUKOIr1iS6uS?dSqWk~8PVqmO1-2s3IWJPVi>$B}8S3n< za-4|B0~)T2Ag2M$ z6ir&R{dEe&VOwb6o~c-V{}=fNA7-3qOQK15+YeBL)gdyt1ZjSA-Bo8&3S23cXED1F z4J-HA?3ZW~N4A`diXlx&Ozlb&WQwaTTnVCH3|8^~_ua|{HmyCGPJ-E`_9To1u)FQa z!nQY72p@UI&v>fb>M#v`==V!~rC?n@3vK{agM-)`9pHXZI*FBcAbrVd=Gc*(vKtQV z!-^bXeBS6t7B!kZ5me)PvAkH)ovdM(W8scHX#$(ynKUPFGp9}j?&~b76N%A&8P9HY zCN1DjvaS>Husbpy{Fu5Blh;2JAPQcI{CiqnGb`99ok*yM`8g3XU)S?n{BcG)lOfup zRF>Qs9+19a^E#7oEn+-#?gZda}e=^@@WryR)G_sVrcPE3juP52K0G8h!_Kw~i#lGoI zrfQEyvR*xig)Be$K@ZY~5SSBt!gECE2)3vZjfckl%O)v$K84T{4Ls=tr_i7Hi+1 zg!wl~M_=Vu|6$z5wt{<{$maJaa|Yf@0$%Qs^i6@Zc)JEI#jD!7AW_Kcy@%(o8v2jY zJsR836Ynk_&DHmW5=fXQU0{-prY|GONH#2ignG{Wm*naQd=_xeHTJJ3vi`_!ClDXE zi2CfLk#$cFL|Texm|Ww}^D)WQNvv5dGL1tbLxSf7zq;PogWTLr-2X6IVjUu`dU~c#U9ggW*~6 zJ2qx83DFh~mddSJ>0r{I+-Alhu*JTgEgwRfyRGLfgu??fwSJsz+sh~8S?fd?_RW&` z{ym$P2sfCEtRj&t_HEvuw+jrtdLR2IveYCJ;(M>3OWMMI5v4L*ZF1uRp{vBn2KIJF|=w(n53T z&k9mt9?f7UQb=n{tQjJUgvfFeu8LyA6J$BO5#ZizK~2O0fEH#^0aSEvkZgB?IUdGFw)myS1Ov6TQ9Pz zVPrl@XUW5%pFLq`hLb7eG7B0(Qr*Znu49`RlUeo%^1Ac7v78o@N8cD{JeaveVnc_TTjG_p$>L}7pyVRYX8%0KuVa#hZX*ciz_GrB~LpT!iHpK9b zf}H<3bG<%yRan_-@I|(HG%<~8Gn(gTz1~AQh1dL&DisuVwLnR|D=6HUbC%R@L1C3@ zl6ryFjwXKNC*pX~|7IQHnvWg2-fYa<M#YhpvRO~%+D?ZOyD%nKA;wC(}I3(H5g5^7OdBy_Cngq-D<-&PHSt)3j zYy5zB1?ZB3fWVLSZOXI59Xsm*c6coGih1nuSTeBNv7THacILze9q-M&&wd4dts1XY zu_&uso84n8$B~v!-;11aqYip)(KzVKh3q0oEW3on9wnQ3mFv56&xVUSSjrn#|2~v| zW{p`JpUPI2a`6$USlSE&M=9_woj@mscj;MHu~GK`EbudzTu$&7WeZYal?3x+D)IAs zR}>O=@vKKgt`(U6l3hzB(V;U0RVtkI=GkNQaRRDuCkq`aWPCY6JTR&$6MM& zLhOI&49a;~HEi2L(vkI?L_B>rVt_f~Q}Ns^z8ec(pLJlfC&4VmTG|7(QKX^V zW%3cFvU(S9aB;Jr9?iEsneSBMlI}dj#QluMQs5mk&uEZTKSAO9g$IL$R*ax<8vC!L zf&_)r*w>PB6ckQlpGfL&wsk7;YyD40p34C!zyXZ@CN@M)LLq4W&3F5-xP>Tron41N zG_q_J3UXdTDR0gwpsiH&5K$Xo(ytSDmT8US0{IWphzp3rxwzpUOnfR>IS>6l$i!;ydGq4Od|>Kr<&~UH2B7&HF|+> z6{Yp+Sd34fx>|sZIw5mj%*odiaZdIr=)m=HCW8^mFHnr5Z0U5;kMv?C(@CJu6!gje zvKmLo(Eoxe=(J{cL1<}*LU^ZOHt|APc;(B#jWG6*>}=+2HR}LTC);qWBwOqKHz&j0AC?~-DD6>n4 zsd+4Gmkv|&DmEk?rsgZ`6+na5pldlcZi_Tu4}2-oe44&2(xq6*?~63A@FOD4r|CBt z?9c?lYAkp*B-XO*+3x#SV~lDW-;HG1zW*_k#VmwZ28nFw zLK3Gjgs3IoURY47Ur5>Be&?F~DK{ItX;~jLlW0+b*3Uw^k#1~_ zh0LV%(3>HYm%ws{k2r_FE0Ca)z+VY?#w1#*Dg zVwEqDS+Lg;pG`8!pR6n!Dq_2X680C7JZz7#B5!fwd4I^>$bmfJrE3le^vG;dm)BBA zS8u-0_N;@qUdBjPzK)zCgW0#6$vMrxG24?%W;)>iS_sV$^$$C;0jBA}FOn`=Y-1(k z=fXvO{rV!**L0@kK^N?8r)QF7#Ty|k@A!qs6J`^_KTyO{@}R-<^T<2o_Q@Vwpow51 z^7mFUOf&CggY%&#;JPxOY$Lz1X4^;$%bXySp*CV3{Nhm?u^Ce75Tl{G3Z~}Ti1mmY zBd*|hC1NNid_KbQV#M}{i#SGq=?;hsIi8Bx5ph1psfc0jH&kaLwnPj^0y=`BI)f_= zMhp#Ts7~X!FJfoJDICWkh7M_{j_0@oVpqg59JfLYeI5SgCXT}pyCZhx*dH+rE_kQ~ zY^jZKM*>DAd_V&Otv13Du@_>TRB9tM#4yyL1~`5k2pHxBr~!^2AofL!H;CGZpAq{Z z#<{;X;(NsYh;eSOjray}0OHJNkbiB&=ST!1k--(NAPz#D#_@-UgAu22d>U~G;&_ga zA~qq8;rJk8m=>W1IDQRr7-CnBcO!0&*zgSUuZ`G_L^u*P(A%L8AdWy>#qoN?Ef805 zyb^IF;!=(mBaT8`#PJ-&EfE)TJQZ;(#Q7YjB5sX1)53}2NVGvBgX6)7+agZmxG!S- z#;rPq<2b}{LxdXOxC3IiQ9%uG+zK%)Goc1J4nqugd#C}9{Sm`z#ZYZAaKar4xN}1d zz`%k&fEZR8Py-xmh+$O;HNf%X0Kl;1h8p1b0phNRi#YxnF+77n4RHKD;yA?l9Djqj zJ77z7CMP~eq6aEu)Zt!;(>T6@a(Ix08sPXt#PNvZIX;aTo(Z7_I6jIPo>!p;I6jCN zb_t*cIDQQ=>{D2v6L4ZT60m0jH2`nHYa=)wh`6c_4?oRTA8LRTE0LIjxCY*^*G4QxJQZ;j$8!)*LtIgZXCN-+cq+=_ zg$dLE$Ek>CAui;2IO24~`5X^MY?+NjCMWtLF$Zx5$8m_~B2MGD1LApzQ#fvgcs}BI zj>8bcOKGS9j{OlYL~P>N9dQO?SB@P4ThbRHVc>*@3X2ifJi;1y><@Se;wp|GAYO{N zg5#eNFGF0)@%M)-c-ig@6abLu{5W8}0i9>=RVcB>M zcsJrIj$5JpWyBR6har9iaVf|Ci1#2a;@BPWtB4CZc0{}vaXw;8goZ>R5}91#u^-@l zh%-2TfcQ1UX&nEI_;ti79Dk4a4aD&re}ni<#4#Lyj(9&}6USE&zlGQpu%$NQLnIC$ zVc-g<5xIm<5La8aNM4Z8~KjL!4X&k#FzJxf1V@Jf75yx|^A-;k*1~6O= z35ypmTpVXwwqWYQWecX8maLdRb>TctFKvNM4`HYpuL$M})pnUhUD)OX;)y3Yf9VM3(k(+0S)gAmwBxgjW?r;HNcW7Y4% zdq58d=6IL{y9b5|vGigvd9b*{q(!6b;wdNLe>zQR%rZgkWZ5y;r-4tholcNw_j?|~ z=AMV}3BHm~kali*R{VcH1yLZ&19e9|i@-2;@dWAY9vddiW5a~Gy$5qXN!q!`cM^Pj zC&6z^W68ifezCI;C%)LpHk~A$9V;cS+{rE?F4`sJMY~wz62Mm_zPgJI0Nk`n;;LN) z{(n|4_DTsc{fqqef02Qwh{;Vc=V4T^q*El?t!STU=%Rh1B`R4S(2h`VTr0bnT|7lP pyP1y(Y(6H`GMLk8P%Akt=#tZHz-iLUp#=YdA2{A&pByJ4{|9#Rn`8h0 delta 32210 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 +// struct lispval; struct lispenv; typedef struct lispval lispval; typedef struct lispenv lispenv; - typedef lispval*(*lispbuiltin)(lispenv*, lispval*); // this defines the lispbuiltin type // which seems to be a pointer to a function which takes in a lispenv* @@ -166,6 +167,68 @@ void delete_lispval(lispval* v) v = NULL; } +// Environment +struct lispenv { + int count; + char** syms; // list of strings + lispval** vals; // list of pointers to vals +}; + +lispenv* new_lispenv(){ + lispenv* n = malloc(sizeof(lispenv)); + n->count = 0; + n->syms = NULL; + n->vals = NULL; + return n; +} + +void destroy_lispenv(lispenv* env){ + for(int i=0; i< env->count; i++){ + free(env->syms[i]); + free(env->vals[i]); + env->syms[i] = NULL; + env->vals[i] = NULL; + } + free(env->syms); + env->syms = NULL; + free(env->vals); + env->vals = NULL; + free(env); + env = NULL; +} + +lispval* clone_lispval(lispval* old); +lispval* get_from_lispenv(char* sym, lispenv* env){ + for(int i=0; icount; i++){ + if(strcmp(env->syms[i], sym) == 0){ + return clone_lispval(env->vals[i]); + } + } + return lispval_err("Error: unbound symbol"); +} + +void insert_in_lispenv(char* sym, lispval* v, lispenv* env){ + int found = 0; + for(int i=0; icount; i++){ + if(strcmp(env->syms[i], sym) == 0){ + delete_lispval(env->vals[i]); + env->vals[i] = clone_lispval(v); + found = 1; + } + } + if(found == 0){ + // Expand memory *for the arrays* + env->count++; + env->syms = realloc(env->syms, sizeof(char*) * env->count); + env->vals = realloc(env->vals, sizeof(lispval*) * env->count); + + // Copy contents over + env->vals[env->count - 1] = clone_lispval(v); + env->syms[env->count - 1] = malloc(strlen(sym) + 1); + strcpy(env->syms[env->count - 1], sym); + } +} + // Read ast into a lispval object lispval* lispval_append_child(lispval* parent, lispval* child) { @@ -467,8 +530,8 @@ lispval* builtin_len(lispval* v) // Returns something that doesn't share pointers with the input: yes. } -lispval* evaluate_lispval(lispval* l); -lispval* builtin_eval(lispval* v) +lispval* evaluate_lispval(lispval* l, lispenv* env); +lispval* builtin_eval(lispval* v, lispenv* env) { // eval { + 1 2 3 } // not sure how this will end up working, but we'll see @@ -477,7 +540,7 @@ lispval* builtin_eval(lispval* v) LISPVAL_ASSERT(old->type == LISPVAL_QEXPR, "Error: Argument passed to eval is not a q-expr, i.e., a bracketed list."); lispval* temp = clone_lispval(old); temp->type = LISPVAL_SEXPR; - lispval* answer = evaluate_lispval(temp); + lispval* answer = evaluate_lispval(temp, env); delete_lispval(temp); return answer; // Returns something that should be freed later: probably. @@ -557,7 +620,7 @@ lispval* builtin_math_ops(char* op, lispval* v) } // Aggregate both math and operations over lists -lispval* builtin_functions(char* func, lispval* v) +lispval* builtin_functions(char* func, lispval* v, lispenv* env) { if (strcmp("list", func) == 0) { return builtin_list(v); @@ -568,7 +631,7 @@ lispval* builtin_functions(char* func, lispval* v) } else if (strcmp("join", func) == 0) { return builtin_join(v); } else if (strcmp("eval", func) == 0) { - return builtin_eval(v); + return builtin_eval(v, env); } else if (strcmp("len", func) == 0) { return builtin_len(v); } else if (strstr("+-/*", func)) { @@ -581,15 +644,19 @@ lispval* builtin_functions(char* func, lispval* v) } // Evaluate the lispval -lispval* evaluate_lispval(lispval* l) +lispval* evaluate_lispval(lispval* l, lispenv* env) { + // Check if this is a symbol + if(l->type == LISPVAL_SYM){ + get_from_lispenv(l->sym, env); + } // Check if this is an s-expression if (l->type != LISPVAL_SEXPR) return l; // Evaluate the children if needed for (int i = 0; i < l->count; i++) { if (l->cell[i]->type == LISPVAL_SEXPR) { - l->cell[i] = evaluate_lispval(l->cell[i]); + l->cell[i] = evaluate_lispval(l->cell[i], env); } } // Check if any are errors. @@ -609,7 +676,7 @@ lispval* evaluate_lispval(lispval* l) // for (int i = 1; i < l->count; i++) { // lispval_append_child(operands, l->cell[i]); // } - lispval* answer = builtin_functions(operation->sym, l); + lispval* answer = builtin_functions(operation->sym, l, env); delete_lispval(operation); delete_lispval(operands); return answer; @@ -674,7 +741,11 @@ int main(int argc, char** argv) printf("\nParenthesis printing: "); print_lispval_parenthesis(l); } - lispval* answer = evaluate_lispval(l); + // Create an environment + lispenv* env = new_lispenv(); + + // Eval the lispval in that environment. + lispval* answer = evaluate_lispval(l, env); { printf("\n\nResult: "); print_lispval_parenthesis(answer);