From c7a4e8c40015cb3e4844314d0f61913513038ad5 Mon Sep 17 00:00:00 2001 From: Axy Date: Thu, 30 Apr 2026 17:54:08 +0200 Subject: [PATCH 1/1] Value and arcs! --- .editorconfig | 2 + .gitignore | 3 ++ Makefile | 57 +++++++++++++++++++++++ a.out | Bin 0 -> 25184 bytes src/arc.c | 59 ++++++++++++++++++++++++ src/ccera.h | 117 ++++++++++++++++++++++++++++++++++++++++++++++++ src/value_get.c | 67 +++++++++++++++++++++++++++ src/value_new.c | 94 ++++++++++++++++++++++++++++++++++++++ test.c | 27 +++++++++++ 9 files changed, 426 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 Makefile create mode 100755 a.out create mode 100644 src/arc.c create mode 100644 src/ccera.h create mode 100644 src/value_get.c create mode 100644 src/value_new.c create mode 100644 test.c diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0b225af --- /dev/null +++ b/.editorconfig @@ -0,0 +1,2 @@ +[*] +indent_style = tab diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c181c9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.build +*.a +.norm diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2ab5fa8 --- /dev/null +++ b/Makefile @@ -0,0 +1,57 @@ +NAME=ccera.a + +SRCS=src/arc.c src/value_get.c src/value_new.c + +HEADERS=src/ccera.h + +BUILDDIR=.build + +THIS=Makefile + +OBJS=${SRCS:src/%.c=${BUILDDIR}/%.o} + +CFLAGS=-Wall -Wextra -Werror -g -pthread -O3 + +CC=cc + +MAKEFLAGS += --no-print-directory + +all : ${NAME} + +${BUILDDIR}/%.o : src/%.c ${HEADERS} | ${BUILDDIR} + ${CC} ${CFLAGS} -c -o $@ $< + +${BUILDDIR} : + mkdir ${BUILDDIR} + +${NAME} : ${OBJS} + ar rcs $@ $^ + +clean : + rm -f ${OBJS} + +fclean : clean + rm -f ${NAME} + rm -fd ${BUILDDIR} + +re : fclean all + +remakefile : clean + sed -i "s?^SRCS=.*?$$(echo -n SRCS=; echo -n src/*.c)?" ${THIS} + sed -i "s?^HEADERS=.*?$$(echo -n HEADERS=; echo -n src/*.h)?" ${THIS} + +.norm: ${SRCS} ${HEADERS} ${THIS} + @rm -f .norm_fail + @norminette ${SRCS} ${HEADERS} > .norm || touch .norm_fail + +norm: .norm + @cat .norm + @test ! -e .norm_fail + +norm-watch: + watch -c -n 1 make norm + +build-watch: + watch -c -n 1 make + +.PHONY : all clean fclean re remakefile norm norm-watch build-watch diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..96b966188a30754903aff391899c5e8dde0f9491 GIT binary patch literal 25184 zcmb<-^>JfjWMqH=W(GS35buBhM8p9?F)WCHG8h;b92hJZco`fR)EU$m*cccXSioWs zd6;?_eS--i4x>3BTn1*SJ_!(mfq?;?4u-0O(I7X0gg`XNJ`fu#hFJikq5c5rV+Cn| z@)^+RhhRwt1{e*K2k8UbrvTE-z`%e;H$dGFqmlK2!e)amMBfHmRC)$9ToyoSm_85} zr0)P!-vOvT7|j4u05S?n!@LP{BM2)fgCrRk&}mqFz-V-R2~d6LG@5t8aSgH|_-RQB zIrarW^%+17MyHp63};|qfYBg3Kth2}OHx4L0%8+`VbL1|wGUT31VFT`Qk)DZ> zuBoAZPG*vRPKs_$W?pH9ZiR)Ju9=BmalW1r$W#V!y60tJVBln6VBlt8VBmoWgGrFx zQ0IWvfs!Q5|DgC{XJ7#5H!cPSa54bt1?ho=OC#6}kQj(@G4)(7h{lCMZV1>dBnHCBW`Nip3=9m|#2s;nb21{bB1k_BOX5&3fkQngT9ja# zk?G=+qU3@~hJwv#=O$+6F~r9w zS0u)#W#%R3WLBjzq%nXLgHnMRgS(HXlXJY0p0Np>X{2Y$Kv8WNdC~oNJb8o>`n;R#lLZlUQVsXi<@5VUnI>X_l#*o}8>}XsTzVXP^sCs+ma) z@tz^R@hPcAsp*-;C81*fMb%8z?tKLd8m@GC4seq<|DNFfhQ%OHeuj2`vx=kqitwpyeS< zJOL{104>;H;xPUJdx$U_k~3h8sxYpnMAxe}E(o z%X?rssCz(p7L-T8Vhjun97y7@ybY2QKoSS#dyp6iOCX7Z`~VUIVFe^{kR2c~5Y|8v zhlK@5+yF@&RDOWOM)7C}jE2By2#kinXb6mkz{m`N&-`+~JeuEdcyzNK)MsGuXgyHE z^#6iK^AV22-~jn=dP<*x;lJt`eFg@8c?X97svv#_Nbco>|NsC0S3RW9z>ooI;=H^7 z=I;XWK~1ff2f+MIAU>#x^>PE4zY4?$HGN(#0P`1t_@E}w%L!oqED#^m)Opze=3D7A zFr-ZYS%?jT+;8~Sv-4t{N9QAt<|iKlLR<|G7@qX#wLQha!0=!6wjKk+mozAN85<^uvCrH)AAM?vD9hdg>&U-N_*V zHzP>DE8Ib|;d-W`>3R6~|9_aXMd7Nl(NyjJ`~N@KB_|Jq(jzEXf;~Ea?+11GK?(VV z7f5UCff7-V;~)n!cr+j2@aUBA=#Kqy^6&%@wF8t|LE2py7((}JFn}ER^o0;qpXz7+ zd{+UFFdw7CJ=MRt0pB@Ka*p>=;9DL4fc*&#r zxB&m8LmsV{O1QwP;O+!RUuWnCk51noFBXHsrS(8bo=3Ouk2DYdyo3B=tbIHT4E%x& z9<3)!{5_g~GJ14}ekif==sdRz-lS2!J%7^k_aHaCpK=h?COb`JwX%NTSFK7LXpD z$HBqK40WFx$jZYWowq!CD+CO`@r$v32V^N))?<6)%y z*ZHIQ0b{9vM|1rT1`mFhMF!OZE(X<{O!yQ5s3Q*w zCQt_+L^Db=TZ86ig&7zaKD__`{{{mCL&1mt|3ST_2_OFdKfu7iQ2Fuyf6#o}girtf zTQD*(T=?|=e*z-|gTUwi|64%(&;S3gVPs%1`11e%4MqkAhcEyCe_&)_Nci&qKMNBB zL&KN<|0S3h7&d(Q{~y$!eemV~e+MQ8h7Vu<|Bql|U{Lt_|9=A$14F{s|NlYr=M%pE z|9^mqfnmYd|NpN*9V`NJECT}rV^t6XV}$^tG!Hw+1V#o1khly31H*~;|NpCj)VQ#N zdX5Y#3=9k=pt-2`|NnzKczgnGd=g&#+~ph%4E9piTE;5iX+n_x7zPH0jQ9WlBhRmZ z%q(GGV2J$i|GzM(zvaj$(8lD<%f`&d$ivP7Hh&5O14F>a|NpH)_QK>Ho0&7Yc-T3d zxV=E?K=ZGAK<0n^{~tWH1Xkz4%a+c?!_MKs?Z(5-0dngD1_p+fkN^K~2bq-#wTr0^ zq{xli5o8hr1E^=q!N|ZM^XdP8&^#N17gU{NGjkb8r3=_j$HT`U;bOwbz!321|9{Zn z3&>ay1_h1}s4MvC|9@$a04R(Y7#KkD8G=|Nldm5`gFWIv5!kYLLW0;Wvko zfnmm{|NoKatw4U-!pOh?N;4pLGq^+D8U}KxBeydTJBQ;j1_n?#-+}5k2Dv8zs?LLl zox}AQSpE+q1H+C_|Nk3+Q+90`iXx69dDEPyheJ=IcOW222bLM?U@k4~jaF zHW&sCRDsL^4N$rJg)%TTFdP7h!PGG_FoOB8xk4r=A0`h{3o;+X2k8fy3(8CI3iy@A@5Af=$Sbs$<6M1cBaP#V_8 z1vkbS7#Kk7K0#7fL_s7218BV@hy`132W#WQ`ZiJ^Ne0BaJ5c)@Bm|QOwQoWE0#Kut zfq~)czyJ9l{thS~)NTgxC7=vg-{JvO9@Y*vf_enDwoU@1iGhIu>P#pPv|bS>U@R|P`(#b{wI_V^)ASW0m1O~<7l>0jR6U zz`(E^DvwS<)F*Pn)GI)f%0_gBP`(Z;0|P4qBiJ#b7a15BWSQN?AkhNy6E^2DGjgnD zU|?WoVozdZU|?op-^Rqiz|6tE5kxVvtp|-S^ntvoCJyS0GBdG)lCu~KYi3>v12YF} z0TTm*I0rK$+cuC&&>9A23E?mh8#GkF;v-xDVi$w9LikIARzNedF)=W(ii*qtiLYX0 zU|g^__lvY@1hfz_0&oPmLXua$v; z!Hj1Ei20I{fx(=AIVjj!cZ0g`(gGTc3=CXpc?_~#ps^eVuEe5r201XBgMrZyWWGEz z$Vf(K1_lOJMNtPv1_l;aMg|6{6ATOtA&d+R>>vgMD`<^{g0jFwMg|5ZUj_ySRj?rp zO!F8S7}U5y!W>Ltj0_CwU~vJakBkfq8eG#D85krOSU^UwfSkf;0kTq)8DubjEoeTT zfq_B$5F=!{I|Bn-CMXOT_)9?p5ey6rRv<628G<5~t)G#BfsxG;q0u6&?T4h{y^Qy`aka2PW&Fn|?#K^0wMWMJ^-nav1FR;-{= z2?0Nj6eb1+F3{rd0A6r-fi(nzHE=M2(qRxUNQnT00LV+lObiTypx9(!^#F}}g>o!` z=?_QJ9|6@Lz{tQ5$pum(z#sq``q>QE&j?Bftl5H~7!^tat^T*=1F`QjF)*-$80?^c zVF%kKqy`GZTyBu=uONA_OQjn@!4u92au=fvGXsN69s^^zJSbfV7o`?6L~?;-7`Vll z7#Li@OiM}6!D&*y$qmWcIN{b zBb>+J!3R<2ZC~Yvx%YzaJ(?kZa zg^J=J8PJFyFCzm34=4nbz!viILCpY}5ArmJ1_J{NC{1!-2c-&-HLx-VJRk`6+j|xU z1_e+$WfV{aB~*Pz1_o77S_Fl*kQ7Kdn2~|O7iO0*IJ9}MLCaRCU5pM43@o6OuLw#B z3DA&+)<_JDb3kFP#Kz3Pz!<75z|6pq$;iNv3MwB|K#2^r(~F&fL6-$mUaB%NFz_Rl zmmtT3!WNo9K-7Csz9U>#GC|8qeQ=oyE-M94%1S|4S;+(~D}z9VE3~Z40kOde#9!J4 z#DmX$W3veFSW)O-Xq-pk0qAPQo@ z%gSC*js#^HRW6Vr42+Pn5+uyQ2q`N;;sT72vT_ontOOas0&)ryw5$Xb8$6)05)>BN z`_Riu9#B~clCpXVk|I=AaxpP5FoHbqA`CK$ff1AjUHJ?^Ne^CD>cbRyK^1}WgE!A~ zh$3iNnZU%rzzHfY0(e2*fS4Kx*1*9CDJwxr1Q>WhUIMKk;{!PpURHtz^uhYWk@QDE z^@BVe$pum(z`zSy1-71vfdQhQnS(VOR4ogzRDw#sSSAJr2To9&3P9Thu$CX=oKH*) z3>@{KO^fm%H%wtsqX%nS@0Fbo5Uf(_Hq1sV2;k%8eJ%rGr+knBH3 z28JJC!$6_V?#INyAj5funSo&f)G$~>opBCG6l|D`0?06VCI$v+P=y0>nVk4dW(Edx zCI$vm(8LG}D6UvQkpavFt`|JcLH9-muMo0sT5z@e7gfy@i zp$#lZqlynwP%uIoRs0-`kVX|VC<8M=8c)oi0)bgn1XNxygKAFZY{6_$sR~IMj2!H1 zKz?4%#K6F^o{4uSsM!UQXApb`5?a8-2jYQ>3KnpU%JGtkfx+S#XtN%uw6Fjh#=r_H zQjOWf7#SE2KvNc|Is_FBjB`MuLWxDm42;H7;C5Rm10y5TEl_$p3`!36pt1xcuOR`F z7CsLO0}T}~P(+J>NEVP27`Q;{SRXJkFvzll)CE8-0yQ!r7QF%$Dk%3_j69dCECI$v>P)7?z6*EYc1{+uvsC~Nuri!Nm zYR)nS1_pMVqkd6#K6F#548dm8Bi;fIT#qYKpG`LewhGO0Gfk=cpYRG*s;va z3=Drk%{P#j)R-9NR^%K44~GU;?SmW@cbWWoBTIghe6Li_GN( zpjuK2ln5?B4FSas#AfMRAPiC2ia%?wo4er=?n}atYF7N?S^_qRFF}XPndfGBlko`HfDKgd5~)b#2FaGpy9>A zz#z`gz|GCTAR!J3EU+~o7f6DA59We`N=lRwWI0Gi8r?+-+#q2YunXWCWFejh$;f#y zK*B+u6%;^FB}@_w3<@X$knmU3V>CnwRwY&jLt&6=WfKqsqDn=N!CulvGLH|EFhB_f zC6Ga>f(bR*keo=M{)D6tkncgk2a9YDu+t%Op2E-o=L82DB*A$KgWSM{5>HTN+$c_E zVBo=(9(ZBtfe)S@_|fAuR9uh|6sH1+I2DA%sStXc3WJ>o4Sxm(5k#DdLNWvcBh(N+ z1_mZ@utP$d88swXAgWpM1`wMpqoHsR;|?e8Q1J*w#z^jPP{xC0E)Hb9ifrnV3W|)N zw89BaMX+FHVBmshXKs*t7#MgU>574Y7d;?Au>%SSKByl!7#R2=0U-djjN6*kl3QI8 zl7j?M1wDl!!a`sNK*I=>>V&}&4HbX}8px%hC<-CrB!;XO8rkCD6adu^6_Y@u@fvV; zmIV2#iBS?%T1X)zt0Wm1q(S}$IfUUgXi$QIgCPWz+8G&t^YJn;GJ?;N0G0lXjPfj? zdLPu<2UT2kp!PVUJQF_$Xv~liOn_P!OlLq6w?Tb^Cm@5~fLLEaB`zx?11A%#kHjp% z$jT%vEW*mj#>dLh#>yDN%HhY##1_fQ%Erjb#1_TM52j05IoU*6`Q2HW*ldM`SsB@c zy;zyqn5%498QCPfBG}52Oi=-w;(%fb51TM6e>f`>8^j@2u5g;}}50v!6ntlW&O zB5WKJPp~qxd9jMHF|u;AJ!WO*5Qeh*S(!wjHgn3eGJ1pTFVSOVWMk%GRES_(i0p)J zRwlMiuw9JIl{Ty#fykbM+8N2p-OtLzHa`+#C^%foB0%PGF?vOSOfS;|JDw|ot(BEY z7-Tsgn;vbI@IVrnz!u%$NQN~*A(1QsjnWojRxUP? zcdU%YY?&bE5EN!(6ZD$E%C#D#<0h&ObSYLzkWbUW9t(n|W6)UxjMzNJ3`@uGG|Vaj zO5$JwlyaHCDOUW|rvY zq$Z~6rWGaTrs@{tgKR8P(9JC=%}cdSPt8j$%1lco01gF+sn7@no1Bta zoLrQd3vn6)L>{CRELjp?3O2h08kP`guwTIPiABlr$wjG&C8-Q0kWepygf>JWID*ns zOOTC4a6x_p@pAI>(iOl2C=9@il>AcA=@k%DV6FwJg^GXzGakeTpX~wG0wz#G6Xdv* z)Z&t&{7MEeU7B2yU&Ijal%Jo&0Fq43FQ{b5%g-->9SZ^y%q)&C&C4t-O=T!9O4f(i zmzP?um&~A_k)NBYpO~JRlarZPq+d{!pOu3tD^$QjUBMNQOaXfkB2@VS#ye zvQc@id2V@DVtP(?MMY9oZdOsI3F^5sx+$q;`k8sjIi)G7`bn83#nds1p`@}PwOB8M zp|~U^Gp|G!l#BA3SIqHsH|K&CIg{c?jzN^wbi)WH3LmC>g{m zNy*7f(#v3If|k9Y`W_jx9ALV_#2CtQg{hgDF_@*9xs{n^F=Oa_mR9B-kU$UfWT?Po z=9$clp_Ffs|tER#56I3WfjwU zCZ_TNmi0^ppvcP*5I%Kt6*SY5mRFf zU{TWt>({qr3}9epVPRldz`TH&y_CUFW&UIimIcg9nK?lmL&f=%IT)Tpt9FP99IzoX zHc+@SGBU8ihQnAuL&hu&%FLmYIY48cpeczL&;cnH1{UVhg83{gyo>=XynG-w11N;p zV8dV7H18m!88+Mn)hrFQnPUc2BNuaN#e9f8uto&B(h3x%d>9Fi#lVI!l*J~TF@PmJ z84{3?K0k{GSS$i8#u5?5WH29mE)xR-HW^6Ru`sYOhO)5mftW?aC?R$c&NgEfPdgs@CyT)@b(m@#BN zSP(?8ls16$HZl@4f`I|7HiQMN7TGLN@UTKBY1v_cxSWvz)Z2%Nvv~Nk1O%`IM=-FI zb}+I`V4TGWb|lCRSTQIBSr|V4N0$W6uQM_TGr-On1Fd%ksR2!vU{fy->KrieGJF6v z!9WV3800u623`gQL8t(f0kqKGA2dgdO&l~4i%lG~XBnILS?>qlY0uFA#N<;sS6HgBy*um8_;AklOzLd9S2mH z!4o9Tzz;uU4b)u+$$|D?fb4}8>M-}GgWU;Ifr_iZ;=CBs7M);sN-+eW#XD$Z8Du`} z{7LX04F(2=KBzh9L*bw)8<2X~!XNNH2hge!sQIw`4s#V~dK{#FCA8cC&D?_Ic0kRC zReiA8qGM2T^cmr+P;vC}>4#8pSPu|3F8&4-o=lkO@CS}~5dw{8gB*s2b(t9$gqXMx z2dP2jjX~m|Q#nBeDbjQ~LvV6YiJ@LTLwtNF+upuo+NUJfqs3bKn z1?2Adc())&U)Ok7KbQD;hIp4qKSy6rXNLHAcfZhhR}ZMHhf5Gcyt|LTlcP_(znfdI zYe;;Eqmz$oJorRE2iQ@3p!4@I&hvxI8k;~4y+Z^Q%K3PZa{}S2L1uwF1fYWhQAFcY zQxZ!O8Ni_g?mQs%6Tn9cqNs+P8;BwV2@i1VIx`R4cY%t)`!bLYF&<5zt}a9qsOtpc z#m9qO1v%aiSx8L z=B0qW4em2R9D(Qt#>XcW7eieEK1~s#0OU%LW(W^#7Rb?{UKY4NmR|`m64HT;j}P&6 zh9wEmk%m~$DMUS|5yi>iWQpuGkYx;d#g(}wiAfB4#U(`$Is?W6clHYy^wRT6^)eER zGZ^$zD)Wjfb0Ks|5k#gewWv5VKM#cyU&NqSl$w(W(g0-@nU|QGnalvP5@a=l9>k)g;$jB9Y^1<^394(=Ht)|tZAxx#4hOfk4^2GIdtUWmj8)sNr){|BuI z04sp4i-pmk$ybmBtbT>*2Z@0&=onzonpl|oVe4jLG-!V%NF8W-Ey(RK{h(!9AaPUB zXgatJ4dO8{z}DfyXwYmZLB~m{jhbdFdDW#80LPMIv5QaEC#Ka zh4EqQW??jJUKic{5Zf6TK=nDuY?yx7x?LCzTek~R1JZ-;|72)fIDsS?5bJ

w!V- zc90ZEKPb%5^@9%41%(M{S{S4bwvHM`gVGmR97=%9fil4qXmuL0eg$Yh21bJ>y1@#e z1XLPkJOgNb1G4@FPz5j==3c0FXg3bDco8B3S_OryAJ(pd(So3WhbRS;=xy{SP#*x) z%?Haez}w5Pb~9`}IaC^cJ~WIET9E~^9~OV;=V!y>AEqANKcIzR$ogUZ6BrFz0SMCz zqS3=2w2ly2{|%@IVYCa}VIbXzaD(s|7(nR*)E0y(!*#AUOg*~$LH#^r{jh#7jD|V~ zrX3^vPJ&kOLh~?45p114>^y69`(S(+4Vtv!N7BCol%YZE`9TE>Xz?(}P$Ue~2csWC z;~uh5ngQN#gq=^$01X&eGJ@%YCQ}B`DpgSU!}UX#R2~3L3o=0VC?i>qk$zu6(;rMf ztRMOUsvmWf4-tPbcYH?E59?=IKocI!oiI1R^uhQ)p0$C0%!=kGNt)>KtL7fXXILZye z1T6xBuplHzEr +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/04/29 16:40:27 by agilliar #+# #+# */ +/* Updated: 2026/04/30 15:04:33 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ccera.h" +#include + +t_arc arc_create(t_usize size) +{ + t_usize *res; + + if (__builtin_add_overflow(size, sizeof(t_usize), &size)) + return (NULL); + res = malloc(size); + if (!res) + return (NULL); + res[0] = 1; + return ((void *) &res[1]); +} + +t_arc arc_copy(t_arc arc) +{ + if (!arc) + return (NULL); + if (__atomic_add_fetch(((t_usize *)arc) - 1, 1, __ATOMIC_RELAXED) + < ((t_usize) 1) << (sizeof(t_usize) * 8 - 1)) + return (arc); + arc_destroy(arc, noop); + return (NULL); +} + +void arc_destroy(t_arc arc, void (*destructor)(void *)) +{ + if (!arc) + return ; + if (__atomic_sub_fetch(((t_usize *)arc) - 1, 1, __ATOMIC_RELEASE) != 0) + return ; + __atomic_thread_fence(__ATOMIC_ACQUIRE); + destructor(arc); + free(arc - 8); +} + +bool arc_is_unique(t_arc arc) +{ + return (__atomic_load_n(((t_usize *)arc) - 1, __ATOMIC_ACQUIRE) == 1); +} + +void noop(void *ptr) +{ + (void) ptr; +} diff --git a/src/ccera.h b/src/ccera.h new file mode 100644 index 0000000..8c8a077 --- /dev/null +++ b/src/ccera.h @@ -0,0 +1,117 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ccera.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/04/29 16:08:57 by agilliar #+# #+# */ +/* Updated: 2026/04/30 17:48:05 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef CCERA_H +# define CCERA_H + +# include +# include + +# if UINTPTR_MAX == 0xFFFFFFFFFFFFFFFF + +typedef uintptr_t t_usize; +typedef intptr_t t_isize; +typedef uint8_t t_u8; + +typedef union u_value t_value; + +typedef struct s_expr +{ + t_usize fn; + t_usize arg; +} t_expr; + +typedef t_value (*t_builtin)(t_value); + +typedef struct s_func +{ + t_usize consts_cnt; + t_value *consts; + t_usize exprs_count; + t_expr *exprs; +} t_func; + +enum e_value: t_usize +{ + VALUE_PTR = 0, + VALUE_INT = 1, +}; + +# define VALUE_MASK 0x1 + +typedef union u_value +{ + void *ptr; + t_isize integral; + enum e_value discrim; +} t_value; + +enum e_value_ptr: t_usize +{ + VALUE_PTR_BUILTIN, + VALUE_PTR_FUNC, + VALUE_PTR_LIST, + VALUE_PTR_BYTES, +}; + +struct s_value_builtin +{ + enum e_value_ptr discrim; + t_builtin builtin; +}; + +struct s_value_func +{ + enum e_value_ptr discrim; + t_func func; +}; + +struct s_value_list +{ + t_usize len; + enum e_value_ptr discrim; + t_value list[0]; +}; + +struct s_value_bytes +{ + t_usize len; + enum e_value_ptr discrim; + t_u8 bytes[0]; +}; + +t_value value_builtin_new(t_builtin builtin); +t_value value_func_new(t_func func); +t_value value_list_new(t_usize len); +t_value value_bytes_new(t_usize len); +t_value value_int_new(t_isize n); + +t_builtin *value_builtin_get(t_value value); +t_func *value_func_get(t_value value); +struct s_value_list *value_list_get(t_value value); +struct s_value_bytes *value_bytes_get(t_value value); +t_isize value_int_get(t_value value); + +void t_value_destroy(t_value value); +t_value t_value_copy(t_value value); + +typedef void *t_arc; + +t_arc arc_create(t_usize size); +t_arc arc_copy(t_arc arc); +void arc_destroy(t_arc arc, void (*destructor)(void *)); +bool arc_is_unique(t_arc arc); + +void noop(void *ptr); + +# endif +#endif diff --git a/src/value_get.c b/src/value_get.c new file mode 100644 index 0000000..6f76a46 --- /dev/null +++ b/src/value_get.c @@ -0,0 +1,67 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* value_get.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/04/30 17:27:40 by agilliar #+# #+# */ +/* Updated: 2026/04/30 17:48:45 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ccera.h" +#include + +t_builtin *value_builtin_get(t_value value) +{ + struct s_value_builtin *res; + + if ((value.discrim & VALUE_MASK) != VALUE_PTR) + return (NULL); + res = value.ptr - offsetof(struct s_value_builtin, builtin); + if (res->discrim != VALUE_PTR_BUILTIN) + return (NULL); + return (&res->builtin); +} + +t_func *value_func_get(t_value value) +{ + struct s_value_func *res; + + if ((value.discrim & VALUE_MASK) != VALUE_PTR) + return (NULL); + res = value.ptr - offsetof(struct s_value_func, func); + if (res->discrim != VALUE_PTR_FUNC) + return (NULL); + return (&res->func); +} + +struct s_value_list *value_list_get(t_value value) +{ + struct s_value_list *res; + + if ((value.discrim & VALUE_MASK) != VALUE_PTR) + return (NULL); + res = value.ptr - offsetof(struct s_value_list, list); + if (res->discrim != VALUE_PTR_LIST) + return (NULL); + return (res); +} + +struct s_value_bytes *value_bytes_get(t_value value) +{ + struct s_value_bytes *res; + + if ((value.discrim & VALUE_MASK) != VALUE_PTR) + return (NULL); + res = value.ptr - offsetof(struct s_value_bytes, bytes); + if (res->discrim != VALUE_PTR_BYTES) + return (NULL); + return (res); +} + +t_isize value_int_get(t_value value) +{ + return (value.integral >> 1); +} diff --git a/src/value_new.c b/src/value_new.c new file mode 100644 index 0000000..b461a2c --- /dev/null +++ b/src/value_new.c @@ -0,0 +1,94 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* value_new.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/04/30 16:25:42 by agilliar #+# #+# */ +/* Updated: 2026/04/30 17:48:17 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ccera.h" +#include + +t_value value_builtin_new(t_builtin builtin) +{ + struct s_value_builtin *res; + t_value res_raw; + + res = arc_create(sizeof(struct s_value_builtin)); + if (!res) + return (value_int_new(0)); + res->discrim = VALUE_PTR_BUILTIN; + res->builtin = builtin; + res_raw.ptr = &res->builtin; + res_raw.discrim |= VALUE_PTR; + return (res_raw); +} + +t_value value_func_new(t_func func) +{ + struct s_value_func *res; + t_value res_raw; + + res = arc_create(sizeof(struct s_value_func)); + if (!res) + return (value_int_new(0)); + res->discrim = VALUE_PTR_FUNC; + res->func = func; + res_raw.ptr = &res->func; + res_raw.discrim |= VALUE_PTR; + return (res_raw); +} + +t_value value_list_new(t_usize len) +{ + struct s_value_list *res; + t_value res_raw; + t_usize n; + + if (__builtin_mul_overflow(len, sizeof(t_value), &n) + || __builtin_add_overflow(n, sizeof(struct s_value_list), &n)) + return (value_int_new(0)); + res = arc_create(n); + if (!res) + return (value_int_new(0)); + res->discrim = VALUE_PTR_LIST; + res->len = len; + n = 0; + while (n < len) + res->list[n++] = value_int_new(0); + res_raw.ptr = &res->list; + res_raw.discrim |= VALUE_PTR; + return (res_raw); +} + +t_value value_bytes_new(t_usize len) +{ + struct s_value_bytes *res; + t_value res_raw; + t_usize n; + + if (__builtin_add_overflow(len, sizeof(struct s_value_bytes), &n)) + return (value_int_new(0)); + res = arc_create(n); + if (!res) + return (value_int_new(0)); + res->discrim = VALUE_PTR_BYTES; + res->len = len; + memset(&res->bytes, 0, len); + res_raw.ptr = &res->bytes; + res_raw.discrim |= VALUE_PTR; + return (res_raw); +} + +t_value value_int_new(t_isize n) +{ + t_value res; + + res.integral = n << 1; + res.discrim |= VALUE_INT; + return (res); +} diff --git a/test.c b/test.c new file mode 100644 index 0000000..162a8e6 --- /dev/null +++ b/test.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/04/30 17:19:58 by agilliar #+# #+# */ +/* Updated: 2026/04/30 17:53:30 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "src/ccera.h" +#include +#include + +int main(void) +{ + char *s = "Hello cera!"; + t_value value = value_bytes_new(strlen(s) + 1); + strcpy(&value_bytes_get(value)->bytes[0], s); + printf("%s\n", &value_bytes_get(value)->bytes); + printf("%p\n", value_bytes_get(value)); + printf("%p\n", value_list_get(value)); + value = value_int_new(128); + printf("%li\n", value_int_get(value)); +} -- 2.53.0