24 lines
1.6 KiB
Plaintext
24 lines
1.6 KiB
Plaintext
|
|
// pattern_util_box.hako — Shared utilities for MirBuilder lowers
|
||
|
|
|
||
|
|
using selfhost.shared.json.utils.json_frag as JsonFragBox
|
||
|
|
|
||
|
|
static box PatternUtilBox {
|
||
|
|
map_cmp(sym) { if sym=="<" {return "Lt"} if sym==">" {return "Gt"} if sym=="<=" {return "Le"} if sym==">=" {return "Ge"} if sym=="==" {return "Eq"} if sym=="!=" {return "Ne"} return null }
|
||
|
|
find_local_int_before(s, name, before_pos) {
|
||
|
|
local pos=0; local last=-1
|
||
|
|
loop(true){ local k=JsonFragBox.index_of_from(s, "\"type\":\"Local\"",pos); if k<0||k>=before_pos{break}; local kn=JsonFragBox.index_of_from(s, "\"name\":\"",k); if kn>=0{ local ii=kn+8; local nn=s.length(); local jj=ii; loop(jj<nn){ if s.substring(jj,jj+1)=="\"" {break} jj=jj+1 } if s.substring(ii,jj)==name { last=k } } pos=k+1 }
|
||
|
|
if last<0 { return null }
|
||
|
|
local ki=s.indexOf("\"type\":\"Int\"",last); if ki<0||ki>=before_pos { return null }
|
||
|
|
local kv=s.indexOf("\"value\":",ki); if kv<0 { return null }
|
||
|
|
return JsonFragBox.read_int_after(s, kv+8)
|
||
|
|
}
|
||
|
|
find_local_bool_before(s, name, before_pos) {
|
||
|
|
local pos=0; local last=-1
|
||
|
|
loop(true){ local k=JsonFragBox.index_of_from(s, "\"type\":\"Local\"",pos); if k<0||k>=before_pos{break}; local kn=JsonFragBox.index_of_from(s, "\"name\":\"",k); if kn>=0{ local ii=kn+8; local nn=s.length(); local jj=ii; loop(jj<nn){ if s.substring(jj,jj+1)=="\"" {break} jj=jj+1 } if s.substring(ii,jj)==name { last=k } } pos=k+1 }
|
||
|
|
if last<0 { return null }
|
||
|
|
local kb=s.indexOf("\"type\":\"Bool\"",last); if kb<0||kb>=before_pos { return null }
|
||
|
|
local kv=s.indexOf("\"value\":",kb); if kv<0 { return null }
|
||
|
|
return JsonFragBox.read_bool_after(s, kv+8)
|
||
|
|
}
|
||
|
|
}
|