diff --git a/std/std.cn b/std/std.cn index 2684b2d..0681687 100644 --- a/std/std.cn +++ b/std/std.cn @@ -298,26 +298,7 @@ nproc str_to_nstr @str -> ptr: buf end -proc streq @str @str -> int: - let len data len2 data2; - len2 len == if - 0 1 - len 0 > - while - drop - let curlen; - data curlen ptr+ @8 - data2 curlen ptr+ @8 - == let res; - curlen 1 + res - curlen 1 + len < - res and - end - swap drop - else - 0 - end -end +include str.cn #if platform Platform.fasm_x86_64_linux ==; nproc exec_cmd ptr argv ptr exec: @@ -341,113 +322,3 @@ end end #endif -proc str_find @str @str -> int: - let len1 data1 len2 data2; - if len2 0 > len1 len2 >= and do - 0 - 1 while - if len2 over data1 +ptr len2 data2 streq do - 0 - else - 1 + - dup len1 len2 - <= - end - end - if dup len1 len2 - 1 + == do - drop -1 - end - else - -1 - end -end - -proc str_rfind @str @str -> int: - let len1 data1 len2 data2; - if len2 0 > len1 len2 >= and do - len1 len2 - - 1 while - if len2 over data1 +ptr len2 data2 streq do - 0 - else - 1 - - dup 0 >= - end - end - else - -1 - end -end - -proc str_count @str @str -> int: - var counter int - let len1 data1 len2 data2; - 0 - len1 0 != len1 len2 >= and while - if len2 over data1 +ptr len2 data2 streq do - *counter inc - len2 + - else - 1 + - end - dup len1 len2 - <= - end drop - counter -end - -nproc str_slice1 int start @str -> @str: - if start len >= start 0 < or do - "Index out of range for the start of the slice: " puts - start print - 1 exit - end - len start - data start ptr+ -end - -nproc str_slice2 int start int _end @str -> @str: - if start len >= start 0 < or do - "Index out of range for the start of the string slice: " puts - start print - 1 exit - end - if _end len > _end 0 < or do - "Index out of range for the end of the string slice: " puts - _end print - 1 exit - end - _end start - data start ptr+ -end - -proc str_split @str @str -> [DYNAMIC_ARRAY_SIZE] str: - let len data sep_len sep_data; - len data sep_len sep_data str_count - sizeoftype *str * malloc let res; - sizeoftype str malloc drop - res -end - -struct CursoredString - str data - int cursor - - sproc __init__ @str: - str !self.data - 0 !self.cursor - end - - nproc rest -> @str: - self.data.len self.cursor - self.data.data self.cursor ptr+ - end - - // Jumps to the CHARACTER AFTER the sub-string - // Returns a bool - // true - jumped - // false - no next line found - nproc jump_to @str -> int: - self.rest len data str_find - let offset; - offset -1 != offset len + self.data.len != and - dup if - *self.cursor offset len + incby - end - end -end \ No newline at end of file diff --git a/std/str.cn b/std/str.cn new file mode 100644 index 0000000..91c5b6c --- /dev/null +++ b/std/str.cn @@ -0,0 +1,211 @@ +include core.cn + +proc streq @str @str -> int: + let len data len2 data2; + len2 len == if + var i int = 0; + var res int = 1; + while len i - 8 >= + res and do + data i ptr+ @ data2 i ptr+ @ == res and !res + *i 8 incby + end + while i len < + res and do + data i ptr+ @8 data2 i ptr+ @8 == res and !res + *i inc + end + res + else + 0 + end +end + +nproc z_array @str -> [DYNAMIC_ARRAY_SIZE] int: + var l int = 0; + var r int = 0; + len sizeoftype int * malloc ([DYNAMIC_ARRAY_SIZE]) int let z; + len 0 z *[] ! + var i int = 1; + while i len < do + var done int = 0; + if i r <= do + if i l - z [] i + r <= do + i l - z [] i z *[] ! + 1 !done + end + else + i 1 - !r + end + if done not do + i !l + if r len 1 - < do + data r 1 + ptr+ @8 data r 1 + i - ptr+ @8 == + else 0 end + while + *r inc + if r len 1 - < do + data r 1 + ptr+ @8 data r 1 + i - ptr+ @8 == + else 0 end + end + r i - 1 + i z *[] ! + end + *i inc + end + z +end + +proc str_find @str @str -> int: + let len1 data1 len2 data2; + if len2 0 > len1 len2 >= and do + if len2 16 < len1 len2 - 16 < or do + 0 + 1 while + if len2 over data1 +ptr len2 data2 streq do + 0 + else + 1 + + dup len1 len2 - <= + end + end + if dup len1 len2 - 1 + == do + drop -1 + end + else + len1 len2 + malloc let data3; + len2 data2 data3 memcpy + len1 data1 data3 len2 ptr+ memcpy + len1 len2 + data3 z_array let z; + data3 free + var i int = 0; + var res int = 0 1 -; + while i len1 < res -1 == and do + if i len2 + z [] len2 >= do + i !res + end + *i inc + end + z free + res + end + else -1 end +end + +proc str_rfind @str @str -> int: + let len1 data1 len2 data2; + if len2 0 > len1 len2 >= and do + if len2 16 < len1 len2 - 16 < or do + len1 len2 - + 1 while + if len2 over data1 +ptr len2 data2 streq do + 0 + else + 1 - + dup 0 >= + end + end + else + len1 len2 + malloc let data3; + len2 data2 data3 memcpy + len1 data1 data3 len2 ptr+ memcpy + len1 len2 + data3 z_array let z; + data3 free + var i int + len1 len2 - !i + var res int = 0 1 -; + while i len1 < res -1 == and do + if i len2 + z [] len2 >= do + i !res + end + *i dec + end + z free + res + end + else + -1 + end +end + +proc str_count @str @str -> int: + var counter int = 0; + let len1 data1 len2 data2; + if len2 16 < len1 len2 - 16 < or do + 0 + len1 0 != len1 len2 >= and while + if len2 over data1 +ptr len2 data2 streq do + *counter inc + len2 + + else + 1 + + end + dup len1 len2 - <= + end drop + counter print + else + len1 len2 + malloc let data3; + len2 data2 data3 memcpy + len1 data1 data3 len2 ptr+ memcpy + len1 len2 + data3 z_array let z; + data3 free + var i int = 0; + while i len1 len2 - <= do + if i len2 + z [] len2 >= do + *counter inc + *i len2 incby + else *i inc end + end + z free + end + counter +end + +nproc str_slice1 int start @str -> @str: + if start len >= start 0 < or do + "Index out of range for the start of the slice: " puts + start print + 1 exit + end + len start - data start ptr+ +end + +nproc str_slice2 int start int _end @str -> @str: + if start len >= start 0 < or do + "Index out of range for the start of the string slice: " puts + start print + 1 exit + end + if _end len > _end 0 < or do + "Index out of range for the end of the string slice: " puts + _end print + 1 exit + end + _end start - data start ptr+ +end + +struct CursoredString + str data + int cursor + + sproc __init__ @str: + str !self.data + 0 !self.cursor + end + + nproc rest -> @str: + self.data.len self.cursor - self.data.data self.cursor ptr+ + end + + // Jumps to the CHARACTER AFTER the sub-string + // Returns a bool + // true - jumped + // false - no next line found + nproc jump_to @str -> int: + self.rest len data str_find + let offset; + offset -1 != offset len + self.data.len != and + dup if + *self.cursor offset len + incby + end + end +end \ No newline at end of file