From 7ea6b0dc1cc9680b7bb117c30f7066b435e2add7 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sat, 19 Oct 2024 12:11:00 +0200 Subject: [PATCH] Initial commit --- ctoh | Bin 0 -> 139099 bytes generator.cmi | Bin 0 -> 1047 bytes generator.cmo | Bin 0 -> 3434 bytes generator.ml | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100755 ctoh create mode 100644 generator.cmi create mode 100644 generator.cmo create mode 100644 generator.ml diff --git a/ctoh b/ctoh new file mode 100755 index 0000000000000000000000000000000000000000..b9e85b4d59abaef8636cc34e87afd0663c279f7e GIT binary patch literal 139099 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 D32~c< literal 0 HcmV?d00001 diff --git a/generator.cmo b/generator.cmo new file mode 100644 index 0000000000000000000000000000000000000000..0b88095bd5f2d7ab0ba89ef8eea52d803b82c4e0 GIT binary patch literal 3434 zcmc&#dyG`o9lpQaa|alN`XJf|>UFp5F31i;x56&c%`8hPt`9cCBJyy!&fIyx>>a%` ztI%3(0&Pue?A-@V6aMHWqzbmRbW>8L21i2_iPpB-hFYqIwke4;u_kR}YNg*dcMe{+ z_;*k8&H0^kzTflw&YgaHxU{&Zr)N#FD`^<9_tzPQ@f|UY4CXBW#~NTa&;(ot+yHQN zhm+ABk-60ZXwDLDV5I85hOr5A7AOGP{#}i;&tRSh(2v%i30eE$Ic?7ct^>5~OCV3> z==F_LxU;aP9qMb2wmSoR*8=p}49o_!59Y1;5Dg1Z0Atl0+KzHsvDSG+W5jkn50v== z|7OU{-2^!H0AB&P&I8P&1E3B^RMtLk!#?xU@vz3s=}w>v;N8v#HUlw0>)j5SdY=HO zvlCbk=vZ{UH#GLi(|KL&exkL~wVeYU`sCmq{ap&U0MF>_3V`{sKZbzcoj-qG``L&! zb7swT-1JT8cxjLKrq7ut{qT-hhwA~3gRrYP)M*2z@c?5CV2u_4jD_Q2fHvrxgK==p zaR)%31n>AtfO;i>JRKYP%uDN%vj?Cr+I0YZb}`-;8oXSD7uDe%uL3dv??=BW#?c3S z6<|%50T<(Z8T;%vau$CKXA|}x0N5MTKZdgv`?~q-Bt)6`rwNB0ZstnZpV#(wDsv>nD5tv8nc(*ydhSRdWP4?^a?zBA2X zoueG2dR}vIbb(KKYF++3r7rxgGCmHz8GWbUglq$RFC5XcZ(z+jvKKj`XN>u+h!396 z19UG(xr~`Paq!(xegnF!pZ;#^y7H_IXa@8fdl%g3ogbgFUWauYe8x!~#_;k7;U2%c zdT&=_k8Aqbh&Agr6SxlGpbhHqEwi7dH)h)J1@wKeUX*(Pjy-!HJ%$~$ifl)ve+=9N z-40{^mmJse>}uH?l-Ri-81KyBZ!%rkSxMVo{=UH=@b{;J{Wk~xZ3Z;{MslfMB z`1!v@sAi^8g&-ImYg=2*mWp@ZLpc%3>GYsibgQ`s!beGj7YOW`-mnHV=nz}la z{>TJ;4_KKpZh`)RL|>)ic-3^yE|x|-XS1;mx1+iZ7$5JdUy|*4_Re(Psiy60)-!g% zgFo4l$iV*6yr`3+-m9tZQ2KW&CC0k% zhppFOsW{ExrbgBGMYeK&Or*;Bagirs)}LfGj@=>6Nonp=LjDP!9}!{gaD#EQyn1nq zG`}RxXKU(YD4hedX(5@e@1wy9?0dQ zN?czm3O>fw6{3*psQSC8Q=G36a}W3DiWzXeR!lV3xM~rT=VJ@?Q|T|*o|tEOwm@PE z^9}V#_(ckX!Ph2VEl8|`cJUoZ2Eo{vDV-8Kn+k$XZD=S1OMbH4^UlbT%EYp#KKIIr z_c#4#OAuVI8Ebb|{N(*-_U7OH?VQCM4m|%v%dTH64T1}=HY|sqOzd89BD?n|1A~cG zpa0XHU4M(3aPIY!1KDo*+H2|IuU~Rz;HT5Je==eseE5EH_C5Os{x$T-;SKxVeroqa zzkDPJK9aDXwExon*P}b0nHYR-VtxPpEw4vxtQg7V9AxrDdF<%+$$w7&;hc$6v(}&9 z7Rj}bp8-F);hLeh_YeH&=dT``b#TV>&vXYt<7?z6JEynhjy?F?(NWjy>Zy*t83d+m z_LIvGU47^`y;m*&!>o;Oe0z2Fy&&lB$HyOEE5~!~(yFpIY*$y if Char.code str.[i] >= 97 && Char.code str.[i] < 122 then Char.chr (Char.code str.[i] - 32) else str.[i]) ;; + +let count_brackets str = + String.fold_left (fun acc ch -> if ch = '{' then acc+1 else if ch = '}' then acc-1 else acc) 0 str ;; + +let ban_line str = + try + (Char.code str.[0] < 65) || (Char.code str.[0] > 122) || (Char.code str.[0] >= 91 && Char.code str.[0] <= 96) || + ((String.fold_left ( + fun acc ch -> match acc with + | 0 -> if ch = '(' then 1 else 0 + | 1 -> if ch = ')' then 2 else 1 + | 2 -> if ch = '=' then 3 else 2 + | k -> k + ) 0 str) <> 2) || + (str.[0] = '/' && str.[1] = '/') + with + | Invalid_argument _ -> true ;; + +let parse_the_whole_thing filename = + let ptr = open_in filename in + let res = ref "" in + let bracket = ref 0 in + try + while true do + let line = input_line ptr in + if !bracket = 0 && not (ban_line line) then + res := (!res)^line^"\n\n" ; + bracket := !bracket + count_brackets line ; + done; + "0 factorielle" + with + | End_of_file -> + close_in ptr; + String.map (fun ch -> if ch = '{' then ';' else ch) !res ;; + +let convert filename = + let whole = parse_the_whole_thing (filename^".c") + and ptr_out = open_out (filename^".h") in + let capped = ((capify filename)^"_H") in + Printf.fprintf ptr_out "#ifndef %s\n#define %s\n\n" capped capped ; + Printf.fprintf ptr_out "%s" whole ; + Printf.fprintf ptr_out "#endif" ; + close_out ptr_out ;; + +let main () = + if Array.length Sys.argv <> 2 then begin + Printf.fprintf stderr "Usage : ./a.out \nNote : filename should not include the .c extension (e.g. enter 'main' and not 'main.c')\n" ; + assert false ; + end else + convert ((Sys.argv).(1)) ;; + +main () ;; \ No newline at end of file