code wiki / _hdl_build / _eg_g_clean.nx

_eg_g_clean.nx source

↩ module page · 73 lines · 2331 B

1// GENERATED BY nx_eg (generalized emitter-of-emitters) -- control flow synthesized from a structural DATA spec, compiled by nx_cc. license_tier: ORIGINAL 2import "nx_syscalls.nx" 3func eh_find(buf: *u8, n: i64, pat: *u8, plen: i64) -> i64 { 4 var i: i64 = 0 5 while i + plen <= n { 6 var j: i64 = 0 7 var ok: i64 = 1 8 while j < plen { 9 if buf[i+j] != pat[j] { ok = 0 } 10 j = j + 1 11 } 12 if ok == 1 { return 1 } 13 i = i + 1 14 } 15 return 0 16} 17func main() -> i64 { 18 let port: i64 = 18080 19 let addr: *u8 = sys_mmap(16) 20 addr[0] = 2 as u8 21 addr[1] = 0 as u8 22 addr[2] = ((port >> 8) & 0xff) as u8 23 addr[3] = (port & 0xff) as u8 24 addr[4] = 127 as u8 25 addr[5] = 0 as u8 26 addr[6] = 0 as u8 27 addr[7] = 1 as u8 28 addr[8] = 0 as u8 29 addr[9] = 0 as u8 30 addr[10] = 0 as u8 31 addr[11] = 0 as u8 32 addr[12] = 0 as u8 33 addr[13] = 0 as u8 34 addr[14] = 0 as u8 35 addr[15] = 0 as u8 36 let lfd: i64 = sys_socket(2, 1, 0) 37 if lfd < 0 { return 10 } 38 let optval: *u8 = sys_mmap(4) 39 optval[0] = 1 as u8 40 optval[1] = 0 as u8 41 optval[2] = 0 as u8 42 optval[3] = 0 as u8 43 sys_setsockopt(lfd, 1, 2, optval, 4) 44 let brc: i64 = sys_bind(lfd, addr, 16) 45 if brc < 0 { return 20 } 46 let lrc: i64 = sys_listen(lfd, 16) 47 if lrc < 0 { return 30 } 48 let req: *u8 = sys_mmap(4096) 49 let ok200: *u8 = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 2\r\nConnection: close\r\n\r\nok" as *u8 50 let nf404: *u8 = "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 9\r\nConnection: close\r\n\r\nnot found" as *u8 51 var served: i64 = 0 52 while served < 64 { 53 let cfd: i64 = sys_accept(lfd) 54 if cfd < 0 { continue } 55 let pid: i64 = sys_fork() 56 if pid == 0 { 57 sys_close(lfd) 58 let rn: i64 = sys_read(cfd, req, 4096) 59 var resp: *u8 = nf404 60 var rlen: i64 = 99 61 let is_health: i64 = eh_find(req, rn, "GET /health" as *u8, 11) 62 if is_health == 1 { resp = ok200 } 63 if is_health == 1 { rlen = 85 } 64 sys_write(cfd, resp, rlen) 65 sys_close(cfd) 66 sys_exit(0) 67 } 68 sys_close(cfd) 69 served = served + 1 70 } 71 sys_close(lfd) 72 return 0 73}