code wiki / _hdl_build / _percent_decode_authored.nx
_percent_decode_authored.nx source
↩ module page · 19 lines · 1098 B
1// AUTHORED BY THE NISHI BUILDER (percent-decode template) -- URL %XX/'+' decode, bits-up
2import "nx_syscalls.nx"
3func pd_hexval(c: i64) -> i64 { if c>=0x30 { if c<=0x39 { return c-0x30 } } if c>=0x61 { if c<=0x66 { return c-0x61+10 } } if c>=0x41 { if c<=0x46 { return c-0x41+10 } } return 0-1 }
4func percent_decode(s: *u8, n: i64, out: *u8) -> i64 {
5 var op: i64=0; var i: i64=0
6 while i<n {
7 if s[i]==0x25 as u8 { var done2: i64=0; if i+2<n { let h: i64=pd_hexval(s[i+1] as i64); let l: i64=pd_hexval(s[i+2] as i64); if h>=0 { if l>=0 { out[op]=((h<<4)|l) as u8; op=op+1; i=i+3; done2=1 } } } if done2==0 { out[op]=s[i]; op=op+1; i=i+1 } }
8 else { if s[i]==0x2b as u8 { out[op]=0x20 as u8; op=op+1; i=i+1 } else { out[op]=s[i]; op=op+1; i=i+1 } }
9 }
10 return op
11}
12func main() -> i64 {
13 let s: *u8="a%20b+c" as *u8; let out: *u8=sys_mmap(32)
14 let n: i64=percent_decode(s, 7, out)
15 let exp: *u8="a b c" as *u8
16 var ok: i64=1; if n!=5 { ok=0 } var i: i64=0; while i<5 { if out[i]!=exp[i] { ok=0 } i=i+1 }
17 if ok==1 { sys_exit(0) } sys_exit(1)
18 return 1
19}