diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-16 10:22:05 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-16 10:28:25 +0000 |
| commit | 489c393d47ac42dee939e741b732958b082539a7 (patch) | |
| tree | 9f5619374f605bd276d78ccc5e793a6433ffa6fc /examples | |
| parent | 46b0cfd792a2187d8984f55b9cf59493ec078239 (diff) | |
Fixed bug related to 'defer' and added some examples.
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/algorithms/sieve.zc | 28 | ||||
| -rw-r--r-- | examples/collections/word_freq.zc | 35 | ||||
| -rw-r--r-- | examples/data/config.json | 13 | ||||
| -rw-r--r-- | examples/data/json_config.zc | 99 | ||||
| -rw-r--r-- | examples/networking/echo_server.zc | 35 |
5 files changed, 210 insertions, 0 deletions
diff --git a/examples/algorithms/sieve.zc b/examples/algorithms/sieve.zc new file mode 100644 index 0000000..25e2c5a --- /dev/null +++ b/examples/algorithms/sieve.zc @@ -0,0 +1,28 @@ + +import "std.zc" + +fn main() { + const LIMIT = 50; + + var is_prime: bool[LIMIT]; + for i in 0..LIMIT { is_prime[i] = true; } + + is_prime[0] = false; + is_prime[1] = false; + + for p in 2..LIMIT { + if is_prime[p] { + for (var i = p * p; i < LIMIT; i += p) { + is_prime[i] = false; + } + } + } + + print "Primes up to {LIMIT}: "; + for i in 0..LIMIT { + if is_prime[i] { + print "{i} "; + } + } + println ""; +} diff --git a/examples/collections/word_freq.zc b/examples/collections/word_freq.zc new file mode 100644 index 0000000..781842c --- /dev/null +++ b/examples/collections/word_freq.zc @@ -0,0 +1,35 @@ + +import "std/map.zc" + +fn main() { + var text = "apple banana apple cherry banana apple"; + var delim = " "; + + var counts = Map<int>::new(); + defer counts.free(); + + var temp = strdup(text); + defer free(temp); + + var token = strtok(temp, delim); + while token != NULL { + if counts.contains(token) { + var val = counts.get(token).unwrap(); + counts.put(token, val + 1); + } else { + counts.put(token, 1); + } + token = strtok(NULL, delim); + } + + "Word Frequencies:"; + "-----------------"; + + for i in 0..counts.capacity() { + if counts.is_slot_occupied(i) { + var k = counts.key_at(i); + var v = counts.val_at(i); + println "{k}: {v}"; + } + } +} diff --git a/examples/data/config.json b/examples/data/config.json new file mode 100644 index 0000000..e3dfe29 --- /dev/null +++ b/examples/data/config.json @@ -0,0 +1,13 @@ +{ + "server_name": "ZenServer", + "port": 8080, + "max_connections": 100, + "features": { + "logging": true, + "metrics": false + }, + "allowed_hosts": [ + "localhost", + "127.0.0.1" + ] +} diff --git a/examples/data/json_config.zc b/examples/data/json_config.zc new file mode 100644 index 0000000..ccfb1a2 --- /dev/null +++ b/examples/data/json_config.zc @@ -0,0 +1,99 @@ + +import "std/fs.zc" +import "std/json.zc" +import "std/map.zc" +import "std/option.zc" +import "std/string.zc" +import "std/core.zc" + +raw { + typedef struct JsonValue* JsonValuePtr; +} + +struct Config { + server_name: String; + port: int; + logging: bool; +} + +fn main() { + var path = "examples/data/config.json"; + + var content_res = File::read_all(path); + if content_res.is_err() { + !"Failed to read config file: {content_res.err}"; + return 1; + } + + var json_str = content_res.unwrap(); + + var json_res = JsonValue::parse(json_str.c_str()); + if json_res.is_err() { + !"JSON Parse Error: {json_res.err}"; + json_str.free(); + return 1; + } + + var root = json_res.unwrap(); + + defer { + json_str.free(); + JsonValue::free(root); + free(root); + } + + if (*root).kind.tag != JsonType::JSON_OBJECT().tag { + !"Expected JSON Object at root"; + return 1; + } + + var config = Config { + server_name: String::new("Unknown"), + port: 0, + logging: false + }; + + var obj_map = (*root).object_val; + + if Map<JsonValue*>::contains(obj_map, "server_name") { + var opt = Map<JsonValue*>::get(obj_map, "server_name"); + var val = opt.unwrap(); + if (*val).kind.tag == JsonType::JSON_STRING().tag { + config.server_name.free(); + config.server_name = String::new((*val).string_val); + } + } + + if Map<JsonValue*>::contains(obj_map, "port") { + var opt = Map<JsonValue*>::get(obj_map, "port"); + var val = opt.unwrap(); + if (*val).kind.tag == JsonType::JSON_NUMBER().tag { + config.port = (int)(*val).number_val; + } + } + + if Map<JsonValue*>::contains(obj_map, "features") { + var opt = Map<JsonValue*>::get(obj_map, "features"); + var features = opt.unwrap(); + if (*features).kind.tag == JsonType::JSON_OBJECT().tag { + var f_obj = (*features).object_val; + if Map<JsonValue*>::contains(f_obj, "logging") { + var l_opt = Map<JsonValue*>::get(f_obj, "logging"); + var l = l_opt.unwrap(); + if (*l).kind.tag == JsonType::JSON_BOOL().tag { + config.logging = (*l).bool_val; + } + } + } + } + + "Configuration Loaded:"; + var s_name = config.server_name.c_str(); + "Server: {s_name}"; + "Port: {config.port}"; + "Logging: {config.logging}"; + + config.server_name.free(); + + return 0; +} diff --git a/examples/networking/echo_server.zc b/examples/networking/echo_server.zc new file mode 100644 index 0000000..1cecb74 --- /dev/null +++ b/examples/networking/echo_server.zc @@ -0,0 +1,35 @@ + +import "std/net.zc" + +fn main() { + "Starting Echo Server on 127.0.0.1:8080..."; + + var listener_res = TcpListener::bind("127.0.0.1", 8080); + if listener_res.is_err() { + !"Failed to bind: {listener_res.err}"; + return 1; + } + + var listener = listener_res.unwrap(); + defer listener.close(); + + loop { + var client_res = listener.accept(); + if client_res.is_ok() { + var stream = client_res.unwrap(); + defer stream.close(); + + var buf: char[1024]; + + var read_res = stream.read(buf, 1024); + + if read_res.is_ok() { + var bytes = read_res.unwrap(); + if bytes > 0 { + stream.write(buf, bytes); + "Echoed {bytes} bytes."; + } + } + } + } +} |
