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}