Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 1 addition & 130 deletions std/std.cn
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
211 changes: 211 additions & 0 deletions std/str.cn
Original file line number Diff line number Diff line change
@@ -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
Loading