From bca98081ec5ad5152a9f2c0450f178b765a9f034 Mon Sep 17 00:00:00 2001 From: sam Date: Sun, 20 Apr 2025 08:56:58 +1200 Subject: [PATCH] first commit --- .clang-format | 25 +++++++++++++ Makefile | 12 ++++++ main.c | 19 ++++++++++ transform | Bin 0 -> 12496 bytes transform.h | 6 +++ transform.s | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 161 insertions(+) create mode 100644 .clang-format create mode 100644 Makefile create mode 100644 main.c create mode 100755 transform create mode 100644 transform.h create mode 100644 transform.s diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..c17e64a --- /dev/null +++ b/.clang-format @@ -0,0 +1,25 @@ +BasedOnStyle: WebKit +IndentWidth: 4 +TabWidth: 4 +UseTab: Never +AlignConsecutiveDeclarations: false +AlignConsecutiveAssignments: false +AlignTrailingComments: true +ColumnLimit: 105 +BreakBeforeBraces: Attach +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AllowShortFunctionsOnASingleLine: false +AllowShortLambdasOnASingleLine: false +PointerAlignment: Left +SpaceBeforeParens: Never +SpacesInParentheses: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: false +SpaceAfterCStyleCast: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeSquareBrackets: false +SpacesBeforeTrailingComments: 2 +PenaltyBreakAssignment: 1000 +NamespaceIndentation: All + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f929eb3 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +CC=riscv64-linux-gnu-gcc +FILES=main.c transform.s +BINARY=transform + +$(BINARY): $(FILES) + $(CC) -o $(BINARY) $(FILES) + +run: $(BINARY) + ./$(BINARY) 127.0.0.1 + +clean: + rm $(BINARY) diff --git a/main.c b/main.c new file mode 100644 index 0000000..93b2c01 --- /dev/null +++ b/main.c @@ -0,0 +1,19 @@ +#include "transform.h" +#include +#include + +int main(int argc, char** argv) { + if(argc < 2) { + fprintf(stderr, "usage: %s \n", argv[0]); + return 1; + } + + char* result = transform(argv[1]); + if(result == NULL) { + fprintf(stderr, "Failed to allocate buffer\n"); + return 1; + } + + printf("%s\n", result); + free(result); +} diff --git a/transform b/transform new file mode 100755 index 0000000000000000000000000000000000000000..42d807cd1a5968a3b91b16e3cdd3321bb111521c GIT binary patch literal 12496 zcmeHNdvH|Oc|UirRu3dr5(0!mVpa$YiL2F%hs?{8&;z-=46R)^f7ixtkERJuy7(_axgA9|(xwV3mfDIJ zqD{1l893I7g`yDo0*Tq>ZMHzEof47l=a zN0NM>E?qCNOIQk3KiN?q-VQP#HFw_!2$pPj5A4X#TTMLd+f;kgjZ3TYpQY-iXo!US z8zQ0lNH~_+U7rl6g2OA8)khL5mW2YTc%X^=Am3)=PjjSa^SvU_x31^k9>4qHM^}Hm z{EuUQ_x5|={MO6FAz!Fo;!q;2Txvp4^EC8Sp6y?O@T=1ycJBY?K1H2Y=%Orp9WbdG z$}G+}WX&{q0=VD7W3?AbzIq7DhnG%+Q~&bu?*LwjzdNl0u+R-6{{;U2JUESAzWQ&M zc$t{1ChjwAo5-Y7VjyW*B9%@?teA+Jkw`o!30@4(d%02N}X1Lu1q;f)Tw zi~v_URVPG?{%X7alKym+zW&C^QONC8;^1G8ib3HM)d8Hvb-ojWx=&QW*3KV)DmU+Q z<&Xc7tK5}8e%w`_&0iCK&xIq^i_z-xKRY~XHHxZT+Qflwt!Kv3Yvaa8o~KUL3UTs) zSvoobZ@{baE`I#f5@1KpJr+EAPLO`^#lg`NuZ|uW9kChSW2eA8IW~6m*pnxJvb^oa ziI=`UHumgmHuu~Cn=5la=sEnYU$$2kUOiPU>)C(e2evm|hel6b8(;9-Gdsq5s?kQ> z%-@W*YojBhBfDPSv#aofh2vu0g(G#XFI=w+d~p5Xl8ZOyA1M-JJ;95=^w@PR+51fJ z;L3sc3pM@A`uuJ^Vrc_`ti5yc4_nr9&9cw=W!evZLi#pXcr|uNV2N7mfuV zD=9dMsau6<8vN&{3%;xO3H`V(s>-i;f;I1H-#s1{C(EDr){WfMygKFTMt-D?dA#~t zHSgW9OE0O?@4qfdMOti&2}eubu}Ry3YRf#>7M; zqqpVnX z9{YaB8)crx4j-{UOP`IvXCv_cd<1wsLu(mIetDc+ui)V$6F*~V9ZQMVE%WWH;PTI@ zJg;9kp5XHTzBv&m%4M}!z|CEzt!i8kbKi*}iA}`c?j=h`_$+Z(0^;3N(sbq!~!N1-1TqP}o*qREIhCmIctw1MVCvk{_0kg&bsU@B=V16C|(fekPk%|x0=G0kY) zRwBt%5Sns`o_+Szv(GHApXIYqah$^D&%?B``QK3!;=GgO&}W0`6`Ewt*nxsCU_mKU zzLq@2MTammJX-Oa;CMVm*GUu<9g|?;TN3no;c#hz7g3P#6no!BnfD)v@Jx*Xf|o84 z&$IJMFDur^D5n+w8e%5tzFHhE>rKTU!$ezvs#=Qf2PCxZIIJic!LeAQ%VMR}E3_VP zTBSZuYXyF%)cx8Wz*k9qsrDOGwp!|q+6Cxqq~5CafWKDiZQ75aw@H12Ru0>Csc+Rj z2Y!dt@7J24cg~%S(jD4Ag5N#62Ktb82KWZ)XF}Tyy;tgK?LO#tmkxlrTT4OTG;0m? z5$#3jo6GNpKC0b|8nzVQhT}o4ANW1x0q94y2cbVOGYQU9+OyEVTuqw~&uD9Ke5j@a z$LF-wz`r7WIImp;^Wl;|#PNBp9Jn!uM&^6k>p*r$e_qjk47|U1Bk+sDyBGxpMKvcN z%9o%(zr$BJM3Q>16I?`RguE%XXN6t_z3>~vX(8=SBCe$a4TEGq1Vyr|g#HAqbvlm~ zUxHS6%4ebwQ{qiPm`eL0Du0GU(O-II(vr4-oVUYsZ-H+F`kxa@im18W`rcB7ywt4$xeRG}dQkR5QDJrT# zDc61TedwJR7)@9&?q7XWu4y0pW|F{(z%B-93*@tCIr3k@|8e|1xKWhbb5u^$?-2KI zsNnDEa1jS_34i@E9lW)o#KY5MuD3|nN@ij9ltB6*Dgvc31bNvb@+JDzR&9hzQ9t)NzH=HLjA zbdS;r@koSACpk94rMA`N(XPjNbTXZ|?r4{ByIp7NR5O=OddRlKlw)c4qU1IjjdaqC zr3T{3D0a%?0|P6T8ENcrZ84IT88WO`NM^cwH+J#HTGC2oA~r|vr5XKZiZ;cz7>GEt z7ScSCPSP%_e|^(RdW_?t?XQoT{o%E8V-|WiW!9$>R&Z@|W7C~Y%}p)9(vehsC~QWo zV0tZ_3z11OIJ8zi+oR?{C}=;#akQV{{`x^-MB^bi5gei&K=LJJ4qLWonOG`37(;N3 z!lW>04-s7;XGLl#o=p3*1bR{$iKI2`s)k1a`;9wkbl}fUE186C2{J4F@bHxLBBlYx`8eP(WT%p><19r$Ku%`w#R!o zO`DP2hM63sy->7B4rXGRloe{W_e&>Rp#EjIMbUtL`lxsIK*;{nc{GDNGYNHGWrqan zAC?Z-HgsZXlphU;EF)y5O_`JD-1bgZNJE^RUV)To7>Y-&hLjm?=!^$5Q7e{CHEd1B zAHkVUHALc%)<>*iD^iaQ-f(PCPMr4b{^r247VO`DI$JsyfuLx}q>>HUmjUwCz+fyR z(Qqsn$%L$i{xJ5HZ;{uK-jlFyg)Jm8FhqORnPA$W%Llp1v7nMrI4&6>>_z7krsxjz z35oWX`Ms8trelT5?{#u-L9T%6C#ugLDd z=khDFacnL=OK|*}i&u$!@sy4g(<>_8%;nD!9EaxOb49D)iP*X>szqB~oSy7clP)+K z&n?phN8xUqqjfjVQMwyfFClVaj58iMd6F)s4gx)p3&i^qZh9F24K?w6_AA0%$b5Xe z=Be`}E$zy(?^9GYV&63N9GnI}4%~zHdB=GJKvl%;y78wJ|9KbxPZiGZYg9GjZ=q<8 z^GoAG={5W{EYaQb?OovH55Es0E~Ss~*YM_!_g^H4Lp3V=q;ccr8S`)ZU--OWV*VGU z!(|8<8L?%9!rzk-?_?PTQdmQaMi;+J;T0}?y7O`m_!_S3k6e7JJzswf$$x*seV^H* zaQF2)D*c&yKl!@iyRYlN0G{uC=S$PzKLze5XI+T`9>17+AE3ZGU;S7$Vn4qu8#Zxu zRT8fj8~lvek^=pF^)yNT+$r}N3WY1+Pn)Zr4GMSPul`_~`oq)khk;jmruO$B;g0*f z+7=US7>5d6FYbQDWxJF2frYBuPXn*OeWrD3?l^o~@^dlDy&(Bh@3*f={?zx@uK}-| zT8;P#@P&Es_lb}Gy2tYdaDN_tHJ;P?&X>R{yFM0ATUZ4d1~Nw49K@mnZ^;AklvuR; z|6r#q5=X=^m=NJuIE`k5$#g1>cTi9#U!)u9s1c-B=~z7*p|~*^iT9fkBb1IOQ-+z@ zErRiAB4VYj5H|SoGU!!)*f5hxa}R=zbaD??xn>lr&`dPC2PTf3L7wDL)w(bkZ0YDV zw`~o?MZnq}PK!V!9#7aG5h$Hj#eo#uvM8v)YS-xA*1oCB=-S+A7{b`PZOi(u&U?3Y z85?^y|9*Q&?(Kb~;%49i}|8{0eE``V3; zuAbh_)KMcRYkzx@V<(sYYUpsnQgLI*jD_T95{SaE%8eNmjG!iUt`l*@8CG(Upieq- ztLjgsR85XAIdUn^k2!Kn@Qnta9r}19?*|$b{5h>~iuXhjNYSZI+H#0B>19F$Q zA<&-*;|rrO=7ogXJ9_Ksq6$#ikeM11fzX~9>a!&xBv~?yNHH9bB$@AvKwYLf~^w1Q4N4PHYiy>XX-obi#~=gJ?L8N^uCtHtf1F(jtIs zje;<=NZ(5Z%rpY8{!ALzW*}tsX9jWUn6bghY&bT63q}?7_aji|96r0USjYIWN-$1n zGS7|cQ$n-?#jPD{8#{6Q!?IT4EQsq&b;!_?i|sj1V!6mkhR)9uhF3sw+VlF8rJspP zy6roGe~5QB-2P>yu;lh>-;I)MStK?C!>(f1e=LFRq~uoBVS4RCRkJ-u0QUhSD!0#Z z9LuvPb0+urJ&Z!U;K};W@g7T#1lWIWhviP#(>pHCb6m)h-?Nba)HeGMRi?c-(wMS6 z$B!&&Ly;1<&-UE^LntHr4k96OoXPUM4NH4^H|VxM28{e7|0wY~ktMC`ovA`)SW=we zwBMoD|13Xr4LJGgOkYEWDBORJZ&|iD$k+ilJnu;)1D(oBFz%(HWodB*<<1?Bj2`y4l2zD4_= z!j{fG+jBf{McH3b4)grrcKQ5Yg)LFop5ud8$SI^oTV#)H&+=C&aoY3#z__yCkhQcG zwqyC9E_+^=w<-sj$JMy=6h9Ki{!Rl@cx@1Ms09<^okAI`?1vz=4AnvfQ4 zYHO)YO}JX1>+t9K$M^3NV6GvS_9Jyth$XHE!?b literal 0 HcmV?d00001 diff --git a/transform.h b/transform.h new file mode 100644 index 0000000..5e9f425 --- /dev/null +++ b/transform.h @@ -0,0 +1,6 @@ +#ifndef TRANSFORM_H +#define TRANSFORM_H + +extern char* transform(char* str); + +#endif diff --git a/transform.s b/transform.s new file mode 100644 index 0000000..fda04d1 --- /dev/null +++ b/transform.s @@ -0,0 +1,99 @@ +.globl transform +.extern strlen +.extern malloc + +# this stuff didnt really need to be a macro but whatever +.macro begin_func + # regs reg size return address 16 byte align padding + addi sp, sp, -112 # 12 * 8 + 8 + 8 + sd ra, 104(sp) + sd s0, 96(sp) + sd s1, 88(sp) + sd s2, 80(sp) + sd s3, 72(sp) + sd s4, 64(sp) + sd s5, 56(sp) + sd s6, 48(sp) + sd s7, 40(sp) + sd s8, 32(sp) + sd s9, 24(sp) + sd s10, 16(sp) + sd s11, 8(sp) +.endm + +.macro end_func + ld ra, 104(sp) + ld s0, 96(sp) + ld s1, 88(sp) + ld s2, 80(sp) + ld s3, 72(sp) + ld s4, 64(sp) + ld s5, 56(sp) + ld s6, 48(sp) + ld s7, 40(sp) + ld s8, 32(sp) + ld s9, 24(sp) + ld s10, 16(sp) + ld s11, 8(sp) + addi sp, sp, 112 + ret +.endm + +.section .text +transform: + begin_func + + # s0 = input ip pointer + # s1 = input length + # s2 = buffer length + # s3 = buffer pointer + mv s0, a0 + call strlen + mv s1, a0 + + li t0, 3 + mul s2, s1, t0 # multiply input length by 3 to get maximum possible output length + + mv a0, s2 + addi a0, a0, 1 # add space for null terminator + call malloc + mv s3, a0 + beq s3, x0, .exit # if allocation failed exit the function + + mv t0, x0 # i + mv t1, x0 # out_i +.loop_start: + bge t0, s1, .loop_end # if i == len finish looping + + add t2, s0, t0 # t2 = ip + i + lb t3, 0(t2) # t3 has the char + li t5, '.' + bne t3, t5, .store_char # if the period isnt present skip adding the [ + + add t4, s3, t1 # t4 = buf + out_i + li t6, '[' + sb t6, 0(t4) # *t4 = '[' + addi t1, t1, 1 + +.store_char: + add t4, s3, t1 # t4 = buf + out_i + sb t3, 0(t4) # *t4 = t3 (the current char) + addi t0, t0, 1 + addi t1, t1, 1 + + bne t3, t5, .loop_start # if the period isnt present go back to start of loop + + add t4, s3, t1 # t4 = buf + out_i + li t6, ']' + sb t6, 0(t4) # *t4 = ']' + addi t1, t1, 1 + + j .loop_start + +.loop_end: + addi t4, t4, 1 + sb x0, 0(t4) # add null terminator + +.exit: + mv a0, s3 # put buffer into return register + end_func