@@ -10,22 +10,33 @@ let :Blob .rm_eo(t: C<"regmatch_t">): U64 = (
1010 $":expression"( l"("; $":expression"(t); l".rm_eo)"; );
1111);
1212
13+ declare-binop( $"set.rm_so", raw-type(C<"regmatch_t">), raw-type(U64), raw-type(Nil), ( l"("; x; l".rm_so="; y; l")"; ) );
14+ declare-binop( $"set.rm_eo", raw-type(C<"regmatch_t">), raw-type(U64), raw-type(Nil), ( l"("; x; l".rm_eo="; y; l")"; ) );
15+
16+ declare-ternop( $"set.rm_so", raw-type(C<"regmatch_t">[]), raw-type(USize), raw-type(U64), raw-type(Nil), ( l"("; x; l"["; y; l"].rm_so="; z; l")"; ) );
17+ declare-ternop( $"set.rm_eo", raw-type(C<"regmatch_t">[]), raw-type(USize), raw-type(U64), raw-type(Nil), ( l"("; x; l"["; y; l"].rm_eo="; z; l")"; ) );
18+
19+ declare-zop( $"reg_startend", raw-type(C<"int">), l"REG_STARTEND" );
20+ declare-zop( $"reg_nomatch", raw-type(C<"int">), l"REG_NOMATCH" );
21+
1322let .has-prefix(text: String, rgx: Regex): Bool = (
1423 # TODO: fix this mess. The preprocessor is unpacking these erroneously
1524 # macros 2.0 doesn't have this problem, but this code still needs to be updated after swapping
1625 let a1 = &rgx as C<"regex_t">[];
1726 let a2 = (text.data.data + text.start-offset) as C<"char">[];
1827 let a3 = 0 as C<"size_t">;
19- let a4 = 0 as C<"regmatch_t">[];
20- let a5 = 0 as C<"int">;
28+ let a4 = () : C<"regmatch_t">[1];
29+ a4[0].rm_so = 0;
30+ a4[0].rm_eo = text.length;
31+ let a5 = reg_startend();
2132 let status = regexec(
2233 a1,
2334 a2,
2435 a3,
25- a4,
36+ a4 as C<"regmatch_t">[] ,
2637 a5
2738 );
28- ( status as U64) == 0
39+ status != reg_nomatch() and a4[0].rm_so== 0
2940);
3041
3142let $"=="(text: CString, rgx: Regex): Bool = (
@@ -42,43 +53,49 @@ let $"=="(text: CString, rgx: Regex): Bool = (
4253 a4,
4354 a5
4455 );
45- ( status as U64)==0 and matches[0].rm_so==0 and matches[0].rm_eo==text.length
56+ status != reg_nomatch() and matches[0].rm_so==0 and matches[0].rm_eo==text.length
4657);
4758
4859let .remove-prefix(text: String, rgx: Regex): String? = (
4960 let matches = () : C<"regmatch_t">[1];
61+ matches[0].rm_so = 0;
62+ matches[0].rm_eo = text.length;
5063 let a1 = &rgx as C<"regex_t">[];
5164 let a2 = (text.data.data + text.start-offset) as C<"char">[];
5265 let a3 = 1 as C<"size_t">;
5366 let a4 = matches as C<"regmatch_t">[];
54- let a5 = 0 as C<"int"> ;
67+ let a5 = reg_startend() ;
5568 let status = regexec(
5669 a1,
5770 a2,
5871 a3,
5972 a4,
6073 a5
6174 );
62- if matches[0].rm_so != 0 then (None : String?)
75+ if status == reg_nomatch() then (None : String?)
76+ else if matches[0].rm_so != 0 then (None : String?)
6377 else if matches[0].rm_eo == 0 then (None : String?)
64- else Some(text[matches[0].rm_eo as I64 : ])
78+ else Some(text[matches[0].rm_eo as I64 : ]);
6579);
6680
6781let .get-prefix(text: String, rgx: Regex): String? = (
6882 let matches = () : C<"regmatch_t">[1];
83+ matches[0].rm_so = 0;
84+ matches[0].rm_eo = text.length;
6985 let a1 = &rgx as C<"regex_t">[];
7086 let a2 = (text.data.data + text.start-offset) as C<"char">[];
7187 let a3 = 1 as C<"size_t">;
7288 let a4 = matches as C<"regmatch_t">[];
73- let a5 = 0 as C<"int"> ;
89+ let a5 = reg_startend() ;
7490 let status = regexec(
7591 a1,
7692 a2,
7793 a3,
7894 a4,
7995 a5
8096 );
81- if matches[0].rm_so != 0 then (None : String?)
97+ if status == reg_nomatch() then (None : String?)
98+ else if matches[0].rm_so != 0 then (None : String?)
8299 else if matches[0].rm_eo == 0 then (None : String?)
83100 else Some(text[0_i64 : matches[0].rm_eo as I64])
84101);
0 commit comments