From 30fb9231d8189402092d7ce9dbb39bfee5c4ff05 Mon Sep 17 00:00:00 2001 From: Victor Vobis Date: Tue, 13 May 2025 18:24:52 +0200 Subject: [PATCH] failing to impl stringbuilder --- Makefile | 197 +++++++++++++++++++---- langc | Bin 0 -> 38720 bytes core.lang => lib/core.a | Bin 104946 -> 107354 bytes src/core/string_builder/sappend.s | 77 +++++++++ src/core/string_builder/sb.s | 12 ++ src/core/string_builder/string_builder.s | 56 +++++++ src/core/syscall/fork.s | 9 ++ src/core/syscall/syscall_err.s | 6 +- src/lexer/lexer.s | 9 ++ src/start.s | 43 +++-- 10 files changed, 360 insertions(+), 49 deletions(-) create mode 100755 langc rename core.lang => lib/core.a (71%) create mode 100644 src/core/string_builder/sappend.s create mode 100644 src/core/string_builder/sb.s create mode 100644 src/core/string_builder/string_builder.s create mode 100644 src/core/syscall/fork.s diff --git a/Makefile b/Makefile index 58dfed1..706a415 100644 --- a/Makefile +++ b/Makefile @@ -1,104 +1,243 @@ +# Basic configuration TARGET := langc - - AFLAGS = -felf64 -F dwarf -g ifdef DEBUG AFLAGS += -DDEBUG_BUILD endif +# Directory structure SRCDIR := src +OBJDIR := obj +LIBDIR := lib + +# Core directories COREDIR := $(SRCDIR)/core MATHDIR := $(COREDIR)/math VECDIR := $(COREDIR)/vector STRDIR := $(COREDIR)/string +SBDIR := $(COREDIR)/string_builder PRINTDIR := $(COREDIR)/print MEMDIR := $(COREDIR)/mem SYSCALLDIR := $(COREDIR)/syscall FILEDIR := $(COREDIR)/file + +# Parser directories PARSEDIR := $(SRCDIR)/parse EXPRDIR := $(PARSEDIR)/expression TOKDIR := $(PARSEDIR)/token + +# Lexer directories LEXDIR := $(SRCDIR)/lexer VARDIR := $(LEXDIR)/vars + +# Other directories GLOBALDIR := $(SRCDIR)/global -# Define source files +# Object file directories (mirroring source structure) +OBJCOREDIR := $(OBJDIR)/core +OBJMATHDIR := $(OBJCOREDIR)/math +OBJVECDIR := $(OBJCOREDIR)/vector +OBJSTRDIR := $(OBJCOREDIR)/string +OBJSBDIR := $(OBJCOREDIR)/string_builder +OBJPRINTDIR := $(OBJCOREDIR)/print +OBJMEMDIR := $(OBJCOREDIR)/mem +OBJSYSCALLDIR := $(OBJCOREDIR)/syscall +OBJFILEDIR := $(OBJCOREDIR)/file +OBJPARSEDIR := $(OBJDIR)/parse +OBJEXPRDIR := $(OBJPARSEDIR)/expression +OBJTOKDIR := $(OBJPARSEDIR)/token +OBJLEXDIR := $(OBJDIR)/lexer +OBJVARDIR := $(OBJLEXDIR)/vars +OBJGLOBALDIR := $(OBJDIR)/global + +# All object directories in dependency order +OBJDIRS := $(OBJDIR) \ + $(OBJCOREDIR) \ + $(OBJMATHDIR) \ + $(OBJVECDIR) \ + $(OBJSTRDIR) \ + $(OBJSBDIR) \ + $(OBJPRINTDIR) \ + $(OBJMEMDIR) \ + $(OBJSYSCALLDIR) \ + $(OBJFILEDIR) \ + $(OBJPARSEDIR) \ + $(OBJEXPRDIR) \ + $(OBJTOKDIR) \ + $(OBJLEXDIR) \ + $(OBJVARDIR) \ + $(OBJGLOBALDIR) + +# Source file definitions by module MATHSRC := $(addprefix $(MATHDIR)/, $(addsuffix .s, \ operators \ )) + STRSRC := $(addprefix $(STRDIR)/, $(addsuffix .s, \ strlen split strcpy substr is_num strcmp is_alpha \ )) + MEMSRC := $(addprefix $(MEMDIR)/, $(addsuffix .s, \ malloc memchr memcpy memset \ )) + VECSRC := $(addprefix $(VECDIR)/, $(addsuffix .s, \ vec_create vec_push vec_get vec_pop \ )) + PRINTSRC := $(addprefix $(PRINTDIR)/, $(addsuffix .s, \ print putnumber \ )) + FILESRC := $(addprefix $(FILEDIR)/, $(addsuffix .s, \ read_file get_file_content \ )) + SYSCALLSRC := $(addprefix $(SYSCALLDIR)/, $(addsuffix .s, \ - exit file_ops syscall_err\ + exit file_ops syscall_err fork\ )) + TOKSRC := $(addprefix $(TOKDIR)/, $(addsuffix .s, \ parse_tokens debug_token \ )) + EXPRSRC := $(addprefix $(EXPRDIR)/, $(addsuffix .s, \ create_expressions debug_expression \ )) + LEXSRC := $(addprefix $(LEXDIR)/, $(addsuffix .s, \ lexer lex_err lex_load lex_func program_prologue \ func_boiler_plate \ )) + VARSRC := $(addprefix $(VARDIR)/, $(addsuffix .s, \ get_vars insert_var \ )) + GLOBALSRC := $(addprefix $(GLOBALDIR)/, $(addsuffix .s, \ function_table regs \ )) -# Collect all source files -SRC := $(SRCDIR)/start.s $(MATHSRC) $(STRSRC) $(PRINTSRC) $(FILESRC) $(VARSRC) $(SYSCALLSRC) $(MEMSRC) $(TOKSRC) $(EXPRSRC) $(LEXSRC) $(GLOBALSRC) $(VECSRC) +SBSRC := $(addprefix $(SBDIR)/, $(addsuffix .s, \ + string_builder\ + )) -# Fix: Preserve directory structure in object files -OBJDIR := obj -OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(SRC)) +# Collect all sources and objects +MAIN_SRC := $(SRCDIR)/start.s +ALL_SRC := $(MAIN_SRC) $(MATHSRC) $(STRSRC) $(SBSRC) $(PRINTSRC) $(FILESRC) $(VARSRC) $(SYSCALLSRC) $(MEMSRC) $(TOKSRC) $(EXPRSRC) $(LEXSRC) $(GLOBALSRC) $(VECSRC) -LIBOBJ := $(filter-out start.o, $(OBJ)) -LIBNAME := core.lang +# Generate object file paths +ALL_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(ALL_SRC)) -all: $(TARGET) +# Library settings +LIBNAME := $(LIBDIR)/core.a +LIB_OBJ := $(filter-out $(OBJDIR)/start.o, $(ALL_OBJ)) -lib: $(OBJ) - ar rcs $(LIBNAME) $(LIBOBJ) +# Module-specific object files for staged compilation +MATH_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(MATHSRC)) +STR_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(STRSRC)) +MEM_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(MEMSRC)) +VEC_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(VECSRC)) +PRINT_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(PRINTSRC)) +FILE_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(FILESRC)) +SYSCALL_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(SYSCALLSRC)) +TOK_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(TOKSRC)) +EXPR_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(EXPRSRC)) +LEX_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(LEXSRC)) +VAR_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(VARSRC)) +GLOBAL_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(GLOBALSRC)) +SB_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(SBSRC)) +MAIN_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(MAIN_SRC)) -# Create output directories -$(OBJDIR)/core/math $(OBJDIR)/core/string $(OBJDIR)/core/print $(OBJDIR)/core/mem $(OBJDIR)/core/syscall $(OBJDIR)/core/file $(OBJDIR)/parse/expression $(OBJDIR)/parse/token $(OBJDIR)/lexer $(OBJDIR)/lexer/vars $(OBJDIR)/global: +# Main targets +all: prepare-build build-core build-parser build-lexer build-global build-main link-executable create-library + +# Stage 1: Prepare build environment +prepare-build: create-directories + +create-directories: | $(OBJDIRS) $(LIBDIR) + +$(OBJDIRS): mkdir -p $@ -# Main target -$(TARGET): $(OBJDIR) $(OBJDIR)/core/math $(OBJDIR)/core/string $(OBJDIR)/core/print $(OBJDIR)/core/mem $(OBJDIR)/core/syscall $(OBJDIR)/core/file $(OBJDIR)/parse/expression $(OBJDIR)/parse/token $(OBJDIR)/lexer $(OBJDIR)/lexer/vars $(OBJDIR)/global $(OBJ) - ld -g -o $@ $(OBJ) -nostdlib -static +$(LIBDIR): + mkdir -p $@ -# Fix: Use a more specific pattern rule that preserves paths -$(OBJDIR)/%.o: $(SRCDIR)/%.s - mkdir -p $(dir $@) +# Stage 2: Build core modules +build-core: build-math build-string build-memory build-vector build-print build-file build-syscall build-string-builder + +build-math: $(MATH_OBJ) + +build-string: $(STR_OBJ) + +build-memory: $(MEM_OBJ) + +build-vector: $(VEC_OBJ) + +build-print: $(PRINT_OBJ) + +build-file: $(FILE_OBJ) + +build-syscall: $(SYSCALL_OBJ) + +build-string-builder: $(SB_OBJ) + +# Stage 3: Build parser modules +build-parser: build-tokens build-expressions + +build-tokens: $(TOK_OBJ) + +build-expressions: $(EXPR_OBJ) + +# Stage 4: Build lexer modules +build-lexer: build-lex-core build-lex-vars + +build-lex-core: $(LEX_OBJ) + +build-lex-vars: $(VAR_OBJ) + +# Stage 5: Build global modules +build-global: $(GLOBAL_OBJ) + +# Stage 6: Build main entry point +build-main: $(MAIN_OBJ) + +# Stage 7: Link executable +link-executable: $(TARGET) + +$(TARGET): $(ALL_OBJ) + ld -g -o $@ $(ALL_OBJ) -nostdlib -static + +# Stage 8: Create library +create-library: $(LIBNAME) + +$(LIBNAME): $(LIB_OBJ) | $(LIBDIR) + ar rcs $@ $(LIB_OBJ) + +# Individual file compilation rule +$(OBJDIR)/%.o: $(SRCDIR)/%.s | $(OBJDIRS) nasm $(AFLAGS) $< -o $@ -$(OBJDIR): - mkdir -p $@ - +# Utility targets clean: rm -rf $(OBJDIR) -fclean: clean - rm -rf $(TARGET) +clean-library: + rm -f $(LIBNAME) -re: clean all +clean-executable: + rm -f $(TARGET) + +fclean: clean clean-library clean-executable + +re: fclean all + +# Debug target to show what would be built +show-config: + @echo "Target: $(TARGET)" + @echo "Flags: $(AFLAGS)" + @echo "Source files: $(words $(ALL_SRC)) files" + @echo "Object files: $(words $(ALL_OBJ)) files" + @echo "Object directories: $(OBJDIRS)" -.PHONY: all clean re diff --git a/langc b/langc new file mode 100755 index 0000000000000000000000000000000000000000..38f77c99699e309ae0059c89628dba3b2f997399 GIT binary patch literal 38720 zcmeHwdwkT@weN2-K?9!G1edj5LPTxvL`HrKc3X|?sL`^{6cNUna zzBQjvkG@7VFsgx34UB4FR0E?L7}db221Ye7s)11rjA~$11OH!Y!0p!+w6{6vIM=wD zm)+i1ONL-~dwSYI??Ei9i_e+sIE&rN$F|HWcG6?q!94@-xS5|M_O2-}K4&XyZ_N%Q zyS=lXko32azIQ2MmCtjov!YjATHG@Mc{zF#MbmG%gL{eFZ`{nY4esFXy-TZ?RbS(a zlG%L7+ch{i_`M>O;buU(+kN+?y5(+WzxQiktCDW-At&AJ?k{|nq;NAe2i?pbxA%P~ zz08XtXKm)kwV4m%nO7M5SUmH87khKYI!|LWR7Txmais+WXvE9e* zqOFy^yYL{A$7(Z&s&AWBgfu5z;ync|vX);Yx&CNqi_eKV?zX{n*xmM*^aaQhFMeoz zF&>jnn!oL_^vUzL{W3jm{)}I2I_>7ODBA%7rVNaAXS|!9u&H36$lbpidm>*zS7lZe&dr?UX09%x zT8)R2JKIT5u8a2_AJ6Px?8V78V3PZ}34cdDfF&y)vzK~S^wwF^ z+{_;zCT;iA!}~4k_R*5P-p&tDpUjWk%->DQqof?~Wjy=G5#0oLywH4c?=GDxn5oAW)ALE`!s!VIrH1U$lDAN-ORqE7iZ+)Uh)+2zO^Os z?Hz@Xc5U^Q^PP04wr|$7#ol#j=>%KtSQtnx`su)n+!V09%H3nJm?r0;mrao@Zm)+$NYxAM@8=Zd%9f}FmPeJc-+An21zSki@V-%9Abp#;unQQczG z0-Z(Gi@oo{msBUnZVv@kq|aNli$toWik}%=5$}r@#WO) zs{}uzDEjNK@ow0=yw2MRx}^6adQ}$H*O8j^9>Q~P-EwaelYADjERtR(xe57*B*7#d zxg^&y$touCE@z4xbIYmX44Vh=sZA2tXjM<#Qujti?g6qXhIzN|mQZDHkhLq4GD&HT~_I>p|D(3>G zzFNW80OnBbW2(Yjs&5k&`Nv(ePlqLx#&CeeF0qaE_612f5E#-11jqxZm50w;4y46VhK;86{C1Zw;bJ@2dn>?#`Zz@O+TxBd5E)?_mgpW90eV zM4sE72(K{kXCAjRhxWoR6{A6Dp0kuZ=Lxr+dD5+C78A|EY^LN~k&NO0Qcir+)_3Mm zwzvE>SuK0ZTM$x*i}~2*L)FWcdhPGfRO?Z$A1e++5}YUe9x3Yy625rreW<1T$O^6R z1@9V`>ACJB*D835f>*eY)GO#Hc#(HKO&Q=i(-+iv{eOYNIP#H!ixYL+q8uP!KQIjl z+1kJv2+%iR0}~J+8ygsl09=7H;KVVnWDks?r#3Uo!F*+tLxazsqNqlKrkxGd*YX&X zZH};KZjZC^45p{yS%`UA?_fc?0?$DDGCaqmXSw|msloulQ#D-S_E%_ln%h4~!;{_q z(=|Na?f;mD9j_4z@O4fjarN@0wVA(=_F=iubbQ7e>9*R;&)oiI$>p7fJeY}lb4Ypp zZ3>evWz4|{yz)?d`$fUpzRk`e?*eML{?_`SDMe`9t$Yj(@V9th z%6p^~?GvBzQu-`6^LTCFrk^|BLgw@wiG-f^IEnF`KO%$W<-)Rf>mSHR(X5Cj5EzGN zJeR(lv-Qn-d~uz(=S|qnBJT zG`44|WPwsD3W+-C73lq2RGT}|L6UCYjYT|%LbH^k8^N^v`IqVsu4wb2{wQkit)Xgg zpPPu#BB;&yNlu)F+O9w)J$HK#P5%ygAEz!#Q@zZ*BG_%_c<*I27$M#dX|97n-_3>I zM`-fcNBP{zj9osXGJVEk?|K?#x9#pZfpbLBb$Xn{U|`^RZxV83&9f>=DSdT?Zr{y3 zH=9!D_RaRLMe9&!bkZk7FPN2=3}8zBt~UuaG4m1twC+qLqP~?3D0W*1>g^K+XCW23UzeJ}=@(4C?9&!dbe_{I6 zp-%0^DI5EnF}ukB(CW|aTUg}w)s?utGXp*2-QJIvI6Y&`>Pf_};4TcafQlx&>vosA z+b=!N%}|SOK*>FxyT9fDI8!qotn==r5Y}NgBMQgLWF;*1YHIvU&9g+u4byjXQPx!E zY<88Lc4Gy-qM- z$yv9&c;%44zSZ_HJ_(ZbuhSXYSJ2;Bu19t#^gOzQ+rLqx>kP#qZzBczKdE>tMYAUO zJl?Q+hPc-Z=YDrC_Y;-->ABobQ0{L3+iGg>zM)2TA=-TD_i4N!eZhrXxR__;WZlL0 z?{WJcSPC({=7SJ%+wO$fr+LO$PLM}%?b0K+F|4caYM93rV|v!o@KL<&25#$(MRnd5 z)7Hu2t-oORNNYH1TeRQy4afugJ%Md`k~hm32nb-m-DtsqDb$!8t>w)75cj-?*htVf zXnxQ?NwxeMs(|&tRE@tyarD2L3j7Q}(tCkmZDwBnnq|@24|QTHQI0BI`RgQ23(Ku5JT#_pGMyMWv3POfjYJ z?C9h$r*@^%;~dl6#rN-D$AXGil- zRa{+vDY3bYOq8}huAqQ=c1~K&eHFvueh@m&{%BzoFB*{64Myv{MVj;Pj`Pq_@FI_^^Ia*wf*R`stct-O&4-4A=K*!itFY1o=vvSA)qHSe&7t)9a4+Od z4uGoo{+bWisRZ`-UGuj0Ws(3XgU53b>vk7puw$?b;&6@DPyo)jujkdiYd-M0LA`?g zOXlMxnX3v1zMef_z=9ilYUf~&@kui6;`_1k4(#izD@uAZk#VRyncDappgXj4E$urV z4)GGMRCaah`c}SOeE-T1E?kKkZhqAbyvTzm$sYjY34XH)~D8W`2Us0Kzg zFsgx34UB4FR0GFa1J`snu1(D>Ee|)RR`;weowcU5Emc+C*4VywoWCC7Kx1>WS)tH+ zg^`UNU8PO~)+rY|D;+FfoN)~`OO`BLva+)k7g^fXxUm!xcBQ(z zXF@1VtX**R!qWECjag}>TxKJQ;*_qwDV^$ex|*{yJ5Ezadw1H|(Ad@5xVkOnbabY= z8q=ukc^96S6}dP&5;@OV)6?FRZtZ9tga zky3DO>)`o{r$6KQV6mgcyIc+HBW z=v|eJOgVT@dvj_{YkR7hxM9=m>T4Fvkvy$KP1UnL1!3{&MoUpe%G0ThSZ}Uv>sZ~` zR+{WiH+H4Rnb*v54$@LxsFmY%_N3c;)~`-=0c%Y=v^PPYxw1}QAn#Iq%u=|yl?{j# zWlV_|xj-GXMXQ6xbS^^JFru$r@F|J%>q34Ge;E26BpCV%p{ISmd>=y}#O9)*UnKOW z0Lk|;^gDd|&Xc1|_CN9w12gnzqY8%q142LVu=L;Z>75Btrlha0@_h{dnb_Gg{G&p@ zFds26L;n+>euvQ49F~3swhRsb144h@Vd?+w(?=&pnX>D!^cn2582-D3e)VDLC*x}t zLtin;@NYRR{nvc@yM?~=u=F!Pwz}I^wSSZekOV2j+FApbW#L(aC)0beck3Qzf z!JLPozpzC4FB1A&4lDotKK+4G!}-3$(q95|H}>SF$*_56K507JTGPi!7%k5i#;B%_h0(G8Ya-0m zuyImwcJ-i|rp}v=ku+MMB@Io^iUK;5cvqykC!aJut0B-al12-(r1@u-#-FFi{NQ+u zf3|K~yOWq79wTYAKuel`XK8d6^cj(+DUUSNQtLa9ku+MMFU{=;1)axP8l7W3CDJ^W zM;hp+v8}VE@fgXYMf&pG!}546&jFD`=Vs+_I96LFSNF8GHK)3y$7}TeNjl9u+!3iD zzLdAHlw)AYMFExWKPE;w{hQfR@`5VN&!d#dLy1ABx z(Fyf#5$4rl!mLfDS(YT$(`hU%kBLlLtS^&s)O2>UD4?<|mC5)#EH9|N+EN=~(pb=A zsDw}yIC5dKG7r;`7U)Z3y8jng8eI~+AXELbu^6$WX>IRLb+JIlMjkEFm&a)5J1mbb zIo=R?94uaZYwo_Oo0j8YTEQQ=EM^3hti!aU1^Uu_8lj-`BunEjXk;M~&nFGpWwN95 zC|c|A5^15nL^Oy6o!3|*T{3MFiN2XnBGFSa)pgXv>qu(Sa($spqm9F8Q54uB!rUtF zF__*CYqT{TUF(ijqiKP@G+S9k=dm=p>Z_F1)1qu?)~D8o*Yob$QOZIYhZ&C+Wyvv@ z<%ml8>*f99VREF_H?j-#Fy=9NQ>vgG(D z(=Jl}J@RhLBS&}YXghXZIdq}z%V7qEFR~oEs@@~3_$c~y zHiu!hqQ&|$eFmW*pY1LR=*s3uKIJRh%&1NN5IZejd3jCeyHH)G~Yl zZe{^4VgYndMfXa+YYT96qr?azXequ3TUdlz7D0=CrZmdwMc9C%R`PX_Z0l%j{)g3| z#c&z)*n*#+vxa5Rt)J~>QJ{|VqhT`8S0n$h3|b7AL62MU6Lfl6h8<;5#PC~>Q_Z^@ z8*4*)=24>L`_n`P0hsy9WJ!5mpg7s=HfnAmhB zJKNB^|6#>wdA=}an)O2##?gH+d8e===#Nkv@I_AtCdR3zr13OIE(_1IB>%8pqlNks znQ8H_St8wOJK@|Yr$04h~N>fq9Oo=D?-s&ERl#rBB4+u5emhoZ;e&ODiV>Z2uMSTP^2<~ za8)RjKx!lsL%afTRXi36g~Oq#32=)<3JM_M3KV=4^*8HE5m&!4n1X^JOe6uJW06Qj zEMzp%cr?8A%LC!9`~Oo=ql$Xeyds3E#897Uk#Gz(icO8Mx{sy;{&xaWh%+I|q0?f} zURh!)lpPBvpqt7B^InbAqfrj;@C$F<9DMvToQBJsm7=!K9$ZV<+6{&^X#8sJnB!&1}==jnCU%+V;1HTlhJL$m_ z0-;b@0(MC@*HhUOnGSo5tSw`kgN20}j3Kmg;TIpi@Z4Q?DN1+BgJT2e2;hs7LNQbf zHarz(kVqtAQ|lv<`ueE|vN}y+AEM6T`{+`j?uAbQyQ!hs=y)g;){P#8XM%edu*#5W zyC$w##o=oC`%-~mhw=h`H?XAQV{KrP8!B5 z6h&s*lv~#7}5i zC{!OpFjPM+RF)^i&`uDuibO?&iCZxx1HB3QfvKTH+0+oRAa3T(HFUX# zA2!b9?yyVkbdP*;0*;PG!3O3vvbJ(IxU=@hg`Xq)#OS5ymhwN52%nb-v#86NJ)K&} z-xxXUb2q!C1l_IYL9}S+42>Bx^a7I6*_&Sf`z+> znT>1>*;||(9@@7RuDbOa{78Vka%?SmkvO@7szkgB4kFgF6XUr4Ajod15)+lYKQZzn ziAV$a6mcM*WhpPkGru`xOPRZqD?;jKZ1A)IHIMwO+?n+cBTQ9191fSkK|(V&T2vmCF+K7!)w1k`Iow#L4L< zAQa0Jxx~2Ucr-@SFX#~ie+WL99dIl%eKz5V$RbFKn!*)xQ=8$j>d3{-v#%?{>aHvX z%WxSw5|jfsZ2ZgDKofLmK`^|n%K2DQYkO0;v3q^8qbH4n!)7Wov{lE0!O;9h_g@PO zf@eT8v9kG?Wwc^ylc*2HWAS>FTu~pZk73N3AH%Gx3~GwOuqrAr4Z_HPw&d{&b8{XF zBMnd{>thiMdO==6bHtHNToBT_KzC!Qq2N3ciEGV^UEo6?3F6>)zRKtFlwDckNsA5H z!A2)S>tj(6D#JVq1F~8wy>~WXHi9Otsz=W;0EV!sRk1jH90IVB`LI^#Vg6R?L6`)< zX5)D5te=W890?U6G*x{l7RR!LRxL0b(Z+p{peqR&(g<35?7% zpBM(APpu3kX2UjNu01Heq6+hq*-XpgBL^zi5+l(t0pnOj0~T48_=&`>6@ks>?*<>#*G`p^k#j9jI?BVi0Wb&T1gDm^CQkrhL8iz*X7Z$&< zcpN?yeKr=Wf@iCQ8Znn7LE!5!RG4*eJr_LkG}x}F*_f4bb#HYFY_9^#b2KJa-{?5A zbNt|ub2s~}!dV?2cd&V?2}1!zA0(>Y_nxzwVk0fG3;w(ySu&Bupqo#>ZZ z^yZvxz)4#8?LyyV;r}Z5^%hQ}D)HZ7;d=$Y)xw_=e7l7&#@;^h8L;qIgg$t3ltcPB zBzV}u={H1(&!rZ=TKHF4_ynQ9%EC(pUu5Bz0MDoAxX|}m^eY6v%fg#S;ImoiU$E#i zg1>IzcL@HLg@1Vj{(O%m^iwh+${N(ikA%;e7XC}YFSGF9jllnXp`UNj(>YUWm-QBY zhTv%nFBg2Xh0hdxn}yd3-e=*5N6Z$z8{k4KOTKIawQx@Jm0{>47 z{eM~XcM1N6h5x(YXUTCytuTEHnos^`M!*k^fKR}ebJSkC&7%BI7yJpU+=~Q1XyH|Y zziZ)31Ru2Uq~NEY64fI4ofdqig=YkJE&PjuFShV+3ckz29})cb7XAyttK^8K3iYz! zF$;eScs~6X<4Z*v@ANiM?&e@NS#Z4-RPm7DdON7%7YMGmj4FPK;Ch*);#Uc-_emg5Ro#I7Ol- z1m9udF9Oe}|93~gC*nKaeDu?SQ+w%cm#Uwcg6oZ!ieDwT-g>Ec?FjrEN5F3sK6K9| zeTw+$IG+@p?!lyw;!g>#_giYY+Xa70=oP<1@HZ^{D}w*c!tWPcug6qAyMU919+mw! ziqYpMg1=+ozX6_4&um8)tXiT`p7|5w3pwD2Da{+|~9lHd|byE)b`T${i4;r zu@U&J6h2?I=+^+J67G;=q7Ize-Qi)3;&DY*OleUgHtp31e^{FpC#zcT{=Vw|oe{*iN|hOsL-r7%iMDWj9>#xTJ z|JBrJ4yWe?*MnG^ctCJH@}c+}j2Ae1r?BGq13fH{ej%v%X@Wb}{?FNh|JWJ_FJQdD z(VO0t&t*biV%2Mo;I~_P_?X~NTKF=-JFWG8QgLhk+==-l>G_V5sEWexHB4XN=neCl zxJmf@o3(Cg7y3yu4^jG!Lch$S?-hEzwO;9eezKA00*n53q1RjSmHuCZ|A7fnh4_7! z;161U{+oj9ccq%?2ZHPOBZ~i6@G8r$o)-M)R(ri9__roRl?A_F7hJzM)xj5ssmkC~CwQoZCSbnTg@K>z*Ue9=eqgRA0|1QDlvhD28O~U6pRy*Dz z_)2R(ZHM4`1V(w?A-J9?RQxW+3!Kke<$hiHSo-|7^0D-=TW~$iqx>Heyv3sb72^fY zomROoDu1iL|50%LK2G_+uJo3ie-+%Z#&({mCrz%y>4TAq4OP`wrzsg#lW*8sd zE)mQJsGr*HwL|#aGcl?~^7~G~^*ov;{+r;hS@rss;1wmge7+;NW9f4j;{}f1zOVcr z7kWLSqxcJg7h3)06~T)v{;vst{R<|_=aA6rA!fw~1uwSN9YyTlFb}lqJ5lhrEI*%f zzMYS3D`YX6WB4WX`ff8x&B@P&mJ4^ng09qC_6aV8SMY z2^;CG()@$x?Hy^lmc}svt~C@!S@Ha(>-{k#E{>V|;v(GCl4@F)#QljK?akDHi{+hL-w6ce15%Ln;SBZ?!Nu1=DAlGpU4s6MPtm-=)|7&XnkiBtTYP zuB|WQ5T{&-`S=iZb665CXmxzd*IHK9bIxqnE?BxOIe+1DhXd7f=bFIMYpybZ6$_U* z3m4TaNG@GgJtvl2UcJPb6JNNrCM&+QW>J!Il_XmbMNkHY7*CCT8^%{CC`$ii*B26yDP3& zP0~HNj$G8i?F%Z6n=VI=v!^Sor*YYO>=_ZdTZ6l(gxS+d7}nR_`f+eHWWLF;%Lf>y z1U~32fu@emo0xi-zZYtAj2RIMXt5Obd1s#hw$3RpT$HR{y0muQ0@z)0(UMwdp6{Lz z(`IVJ)C9>R;_`*H?T#NO+w&u2M}CCP^bN(>j)tPt2Mr};H3z39o>%VNlgp+djHGlA za5;kfyZq)(VZ$!zr?6CTv{KGc0?VE+L4?hh#DeEbFx9nF#I+8=-J;KI#H#X#9gEI) zR+{HPJUqbL<+&Jx($n-?Qe0LZ3g7RU+colX84|2}L_S1=wt%lORnJq@$kokrtQtKS zSFW)KFn*PvI0OyTJc$1{~+20j^8-uro9SXwz;d8>PX1 z4d#f=Ip}c2uZb_39Eh%|S+S^Q4*b|P3+C2bUAv%WZf*_q<_VRXZ5h^UYQeE`XcAWt zz-8k?Y%56#jWK3t(iFAe>@;DhS9XuU)AW|?e9F^wm+Ta-Kb!)c*rq8JpWHS&PHi+X zZUL?kRIDJ8n5kJVw5Ac4n_HTaGu60LD#@pWac_Eeay=TG77{Wfal(zQ=@v664u?rm zIUM|kHSAN3T}>^_KQ|#uP%#>&XV?gyp1f{lg}hg89uv#thV43)&P!pz08faa8e@K?bw`Noy?{#+sJShjIa za3=W@<;*r67v~^796!b_<;UQ0X);KYg?y|qM?@h+O`#$0qKMz@_VI0Vz?zG}l@>mk zxph8F)uqemlWDq(A0_xxeABFSU!4h&P?D)DwU#bQ^2Nl$v?Z)Qfl|PvsRfpqJ;me; z{F5nmr0_UYaWtk2woza!ftl%;6ZM8~wEensu8cm|s3=Q991h0OvO} zdC8nUNP1!Ea1np@3Xys;_vV!U7X=*nQkrfPy#w#*=Nqabn9xkG1&)BKjVd!SX_iNG zv#;U6zRcZ~95TXTi-a2(wRM)%%u6nrTkEW0OEB#K!TCZTe}&@Etl5{@H4U#QX#m>7o`P{*+MZ@1 z!J7d?=EPHE(wFMa=tdNYKdr&0L7p>Z#x!+>G|Ms5NI_)aNv4_`(~V?ITps@=2Ik4b zBy)q6(efM}p*_oteI43U&a4Hb)6~|1QAJJlEYjPI>oD>(OL* zr@PF%MMLb*%USMnGcRiF!tK@ABa$d?x$e+#<7%vTHfXF3f6hYp^8S(c8OTiEK^~_} zN}?uIVqSNiq6s;$4~7t;{6R%3q9#;fUUwE~f_d{X*(~ThgekxMxpTTf4*G(bxJ`Q* zU>hUKTW1*h+b5Z~K5g2okYHm(J86N*QE3Tm(=Hkzf6Wq;e@WaQt@Sbd7hmJ}4x)+RI(NCC22>Z6#AG>@KFJJz~&zoG=W@kp&&i~(( CnP$fT literal 0 HcmV?d00001 diff --git a/core.lang b/lib/core.a similarity index 71% rename from core.lang rename to lib/core.a index 1d30553a43cf9ff9330fef3a0fd5caeaab126c18..e3ad6796a3714edbc94fe77c30f60f2e50563691 100644 GIT binary patch delta 6635 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 hwuG delta 5649 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 diff --git a/src/core/string_builder/sappend.s b/src/core/string_builder/sappend.s new file mode 100644 index 0000000..cb91dd8 --- /dev/null +++ b/src/core/string_builder/sappend.s @@ -0,0 +1,77 @@ +%include "./src/core/string_builder/sb.s" + +section .text + extern strlen + extern strcpy + extern malloc + extern err_malloc + +%define SB [rbp - 16] +%define SB_LEN [rbp - 4] +%define SB_CAP [rbp - 8] +%define APPENDIX [rbp - 24] + +sb_append: ; (rdi: *sb, rsi: char*) + push rbp + mov rbp, rsp + sub rsp, 32 + + test rsi, rsi + jz .done + ; store sb on stack + mov SB, rdi + + ; store new str on stack + mov APPENDIX, rsi + + ; get sb len + mov eax, dword [rdi + STR_LEN] + mov dword SB_LEN, eax + + mov eax, dword [rdi + STR_CAP] + mov dword SB_CAP, eax + + push rdi + mov rdi, rsi + call strlen + + add rax, SB_LEN + cmp rax, SB_CAP + jl .copy_string + + mov r9, SB_CAP + ; new string will be to large for current cap, need to realloc +.get_new_len: + imul r9, 2 + cmp r9, rax + jl .get_new_len + mov SB_CAP, r9 + push r9 + push rax + mov rdi, r9 + call malloc + test rax, rax + jz err_malloc + mov rdi, rax + mov rsi, SB + mov rsi, [rsi + STR_DATA] + call strcpy + pop rax + mov rsi, SB + pop r9 + mov [SB + STR_CAP], r9 + +.copy_string: + pop rdi + mov r9, SB + mov dword [r9 + STR_LEN], eax + mov rdi, [r9 + STR_DATA] + mov eax, dword [rbp - 4] + lea rdi, [rdi + eax] + mov rsi, [rbp - 24] + call strcpy + +.done: + mov rsp, rbp + pop rbp + ret diff --git a/src/core/string_builder/sb.s b/src/core/string_builder/sb.s new file mode 100644 index 0000000..d8522c3 --- /dev/null +++ b/src/core/string_builder/sb.s @@ -0,0 +1,12 @@ +%define STRING_INIT_CAP 1024 + + +%define STR_SIZE 16 +%define STR_LEN 0 +%define STR_CAP 4 +%define STR_DATA 8 + +; struct string: +; .len 0 uint +; .cap 4 uint +; .data 8 char* diff --git a/src/core/string_builder/string_builder.s b/src/core/string_builder/string_builder.s new file mode 100644 index 0000000..b731e3d --- /dev/null +++ b/src/core/string_builder/string_builder.s @@ -0,0 +1,56 @@ +%include "./src/core/string_builder/sb.s" + +section .text + extern malloc + extern err_malloc + + extern memcpy + extern strlen + +global sb_new +sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr) + push rbx + push rdi + push rsi + + mov rbx, STRING_INIT_CAP + xor r9, r9 + + test rdi, rdi + jz .alloc_string + + push rdi + call strlen + pop rdi + mov r9, rax + cmp r9, STRING_INIT_CAP + jl .alloc_string + +.calc_init_len: + add rbx, STRING_INIT_CAP + cmp r9, rbx + jg .calc_init_len + + +.alloc_string: + push rdi + mov rdi, rbx + call malloc + test rax, rax + jz err_malloc + pop rdi + + pop rsi + mov dword [rsi + STR_CAP], ebx + mov dword [rsi + STR_LEN], r9d + mov [rsi + STR_DATA], rax + test r9, r9 + jz .done + mov rdi, rax + mov rdx, r9 + pop rsi + call memcpy + +.done: + pop rbx + ret diff --git a/src/core/syscall/fork.s b/src/core/syscall/fork.s new file mode 100644 index 0000000..c638e60 --- /dev/null +++ b/src/core/syscall/fork.s @@ -0,0 +1,9 @@ +%define SYS_FORK 57 + +section .text + +global fork +fork: ; rax: pid() + mov rdi, SYS_FORK + syscall + ret diff --git a/src/core/syscall/syscall_err.s b/src/core/syscall/syscall_err.s index f1a5d65..2eccd8d 100644 --- a/src/core/syscall/syscall_err.s +++ b/src/core/syscall/syscall_err.s @@ -1,7 +1,7 @@ section .data - EARGCNT: db "[ERROR] Invalid arg count: expected 1", 0xa, 0 - EMALLOC: db "[ERROR] Malloc fialed!", 0xa, 0 - ELSEEK: db "[ERROR] lseek failed!", 0xa, 0 + EARGCNT: db 0xa, "[ERROR] Invalid arg count: expected 1", 0xa, 0 + EMALLOC: db 0xa, "[ERROR] Malloc failed!", 0xa, 0 + ELSEEK: db 0xa, "[ERROR] lseek failed!", 0xa, 0 section .text global err_args diff --git a/src/lexer/lexer.s b/src/lexer/lexer.s index 465c1d2..b534236 100644 --- a/src/lexer/lexer.s +++ b/src/lexer/lexer.s @@ -19,6 +19,7 @@ section .text extern func_prologue extern func_epilogue + extern memset extern program_prologue @@ -37,6 +38,14 @@ lex: ; rax: lex* (rdi: char *file_content) cmp rax, 0 je err_malloc + ; zero out lexer + push rax + mov rdi, rax + mov rsi, 0 + mov rdx, LEX_SIZE + call memset + + pop rax mov [rbp - 24], rax ; store lex on stack lea rsi, [rbp - 16] ; int* expr_cnt diff --git a/src/start.s b/src/start.s index 6e20e0f..3cc3294 100644 --- a/src/start.s +++ b/src/start.s @@ -13,31 +13,40 @@ section .text extern vec_get extern putchar extern vec_pop + extern sb_new print_usage: mov rdi, usage call putstr + _start: - pop rdi - cmp rdi, 2 - jne err_args - mov rdi, [rsp + 8] ; argv[1] push rbp mov rbp, rsp - sub rsp, 16 + mov rdi, usage + lea rsi, [rsp - 16] + call sb_new - call get_file_content - mov rdi, rax - mov [rbp - 8], rax - - mov rdi, rax - call lex - - mov rsp, rbp - pop rbp - +; pop rdi +; cmp rdi, 2 +; jne err_args +; mov rdi, [rsp + 8] ; argv[1] +; push rbp +; mov rbp, rsp +; +; sub rsp, 16 +; +; call get_file_content +; mov rdi, rax +; mov [rbp - 8], rax +; +; mov rdi, rax +; call lex +; +; mov rsp, rbp +; pop rbp +; done: - xor rdi, rdi - call exit +; xor rdi, rdi +; call exit