From ddfa538a5c5adad8d70950d1c4d2ca0aa18f7385 Mon Sep 17 00:00:00 2001 From: Toni Date: Mon, 28 Jul 2025 14:40:41 +0200 Subject: [PATCH] curl --- examples/curl.zr | 47 +++++++++++++++++++++++++++++++++++++++++++ src/codegen_x86_64.rs | 7 +++---- 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 examples/curl.zr diff --git a/examples/curl.zr b/examples/curl.zr new file mode 100644 index 0000000..10ac275 --- /dev/null +++ b/examples/curl.zr @@ -0,0 +1,47 @@ +func main[] : I64 + // TODO: parse url + let host: String = "devernay.free.fr" + let path: String = "/hacks/chip8/C8TECH10.HTM" + + let s: I64 = net.connect(host, 80) + if s < 0 + dbg.panic("failed to connect") + + let req: String = c.malloc(2048) + c.snprintf(req, 2048, "GET %s HTTP/1.0\r\nHost: %s\r\nConnection: close\r\n\r\n", path, host) + c.send(s, req, c.strlen(req), 0) + c.free(req) + + let header_buf: Ptr = c.malloc(8192) + let header_size: I64 = 0 + let found: Bool = false + let end_index: I64 = -1 + + while !found & header_size < 8192 + let n: I64 = c.read(s, header_buf + header_size, 8192 - header_size) + if n <= 0 + break + let current_size: I64 = header_size + n + let i: I64 = 0 + while i <= current_size - 4 + let p: Ptr = header_buf + i + if str.nth(p, 0) == 13 & str.nth(p, 1) == 10 & str.nth(p, 2) == 13 & str.nth(p, 3) == 10 + found = true + end_index = i + 4 + break + i = i + 1 + header_size = current_size + + if end_index < header_size + c.write(1, header_buf + end_index, header_size - end_index) + c.free(header_buf) + + let buffer: Ptr = c.malloc(4096) + while true + let n: I64 = c.read(s, buffer, 4096) + if n <= 0 + break + c.write(1, buffer, n) + c.free(buffer) + + c.close(s) \ No newline at end of file diff --git a/src/codegen_x86_64.rs b/src/codegen_x86_64.rs index 71053bf..76ffced 100644 --- a/src/codegen_x86_64.rs +++ b/src/codegen_x86_64.rs @@ -6,7 +6,7 @@ use crate::{ }; pub struct Var { - pub var_type: String, + // pub var_type: String, pub stack_offset: usize, } @@ -35,11 +35,10 @@ impl Env { self.scopes.pop(); } - pub fn define_var(&mut self, name: String, var_type: String) -> usize { + pub fn define_var(&mut self, name: String, _var_type: String) -> usize { let offset = self.next_offset; self.next_offset += 8; self.scopes.last_mut().unwrap().insert(name, Var { - var_type, stack_offset: offset, }); offset @@ -104,7 +103,7 @@ section .text ); // take that rustfmt - for name in "malloc,calloc,realloc,free,puts,printf,sprintf,strtol,strlen,strcmp,strcat,strcpy,strdup,strncpy,syscall,fopen,fseek,ftell,fread,fwrite,fclose,rewind,system,opendir,readdir,closedir,exit,gettimeofday,connect,socket,send,read,close,bind,listen,accept,getchar,gethostbyname".split(",") + for name in "malloc,calloc,realloc,free,puts,printf,sprintf,snprintf,strtol,strlen,strcmp,strcat,strcpy,strdup,strncpy,syscall,fopen,fseek,ftell,fread,fwrite,fclose,rewind,system,opendir,readdir,closedir,exit,gettimeofday,connect,socket,send,write,read,close,bind,listen,accept,getchar,gethostbyname".split(",") { emit!(&mut self.output, "extern {}", name); emit!(&mut self.output, "c.{} equ {}", name, name);