Skip to content

Commit 8ef2c3a

Browse files
Adjust the C and Zig examples
1 parent c55101e commit 8ef2c3a

File tree

2 files changed

+59
-29
lines changed

2 files changed

+59
-29
lines changed

examples/hello_c/hello.c

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,37 @@
44
#include <cstddef>
55
#include <cstdint>
66
#include <cstdlib>
7+
#include <cstring>
78
#define PROTOCOL_FUNCTION __attribute__((import_module("typst_env"))) extern "C"
89
#else
910
#include <stddef.h>
1011
#include <stdint.h>
1112
#include <stdlib.h>
13+
#include <string.h>
1214
#define PROTOCOL_FUNCTION __attribute__((import_module("typst_env"))) extern
1315
#endif
1416

17+
// ===
18+
// Functions for the protocol
19+
1520
PROTOCOL_FUNCTION void
1621
wasm_minimal_protocol_send_result_to_host(const uint8_t *ptr, size_t len);
1722
PROTOCOL_FUNCTION void wasm_minimal_protocol_write_args_to_buffer(uint8_t *ptr);
1823

24+
EMSCRIPTEN_KEEPALIVE void wasm_minimal_protocol_free_byte_buffer(uint8_t *ptr,
25+
size_t len) {
26+
free(ptr);
27+
}
28+
29+
// ===
30+
1931
EMSCRIPTEN_KEEPALIVE
2032
int32_t hello(void) {
21-
const char message[] = "Hello world !";
22-
wasm_minimal_protocol_send_result_to_host((uint8_t *)message,
23-
sizeof(message) - 1);
33+
const char static_message[] = "Hello world !";
34+
const size_t length = sizeof(static_message);
35+
char *message = malloc(length);
36+
memcpy((void *)message, (void *)static_message, length);
37+
wasm_minimal_protocol_send_result_to_host((uint8_t *)message, length - 1);
2438
return 0;
2539
}
2640

@@ -36,7 +50,6 @@ int32_t double_it(size_t arg_len) {
3650
alloc_result[arg_len + i] = alloc_result[i];
3751
}
3852
wasm_minimal_protocol_send_result_to_host(alloc_result, result_len);
39-
free(alloc_result);
4053
return 0;
4154
}
4255

@@ -66,7 +79,6 @@ int32_t concatenate(size_t arg1_len, size_t arg2_len) {
6679

6780
wasm_minimal_protocol_send_result_to_host(result, total_len + 1);
6881

69-
free(result);
7082
free(args);
7183
return 0;
7284
}
@@ -102,24 +114,27 @@ int32_t shuffle(size_t arg1_len, size_t arg2_len, size_t arg3_len) {
102114

103115
wasm_minimal_protocol_send_result_to_host(result, result_len);
104116

105-
free(result);
106117
free(args);
107118
return 0;
108119
}
109120

110121
EMSCRIPTEN_KEEPALIVE
111122
int32_t returns_ok() {
112-
const char message[] = "This is an `Ok`";
113-
wasm_minimal_protocol_send_result_to_host((uint8_t *)message,
114-
sizeof(message) - 1);
123+
const char static_message[] = "This is an `Ok`";
124+
const size_t length = sizeof(static_message);
125+
char *message = malloc(length);
126+
memcpy((void *)message, (void *)static_message, length);
127+
wasm_minimal_protocol_send_result_to_host((uint8_t *)message, length - 1);
115128
return 0;
116129
}
117130

118131
EMSCRIPTEN_KEEPALIVE
119132
int32_t returns_err() {
120-
const char message[] = "This is an `Err`";
121-
wasm_minimal_protocol_send_result_to_host((uint8_t *)message,
122-
sizeof(message) - 1);
133+
const char static_message[] = "This is an `Err`";
134+
const size_t length = sizeof(static_message);
135+
char *message = malloc(length);
136+
memcpy((void *)message, (void *)static_message, length);
137+
wasm_minimal_protocol_send_result_to_host((uint8_t *)message, length - 1);
123138
return 1;
124139
}
125140

examples/hello_zig/hello.zig

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,36 @@
11
const std = @import("std");
22
const allocator = std.heap.page_allocator;
33

4+
// ===
5+
// Functions for the protocol
6+
47
extern "typst_env" fn wasm_minimal_protocol_send_result_to_host(ptr: [*]const u8, len: usize) void;
58
extern "typst_env" fn wasm_minimal_protocol_write_args_to_buffer(ptr: [*]u8) void;
69

10+
export fn wasm_minimal_protocol_free_byte_buffer(ptr: [*]u8, len: usize) void {
11+
var slice: []u8 = undefined;
12+
slice.ptr = ptr;
13+
slice.len = len;
14+
allocator.free(slice);
15+
}
16+
17+
// ===
18+
719
export fn hello() i32 {
820
const message = "Hello world !";
9-
wasm_minimal_protocol_send_result_to_host(message.ptr, message.len);
21+
var result = allocator.alloc(u8, message.len) catch return 1;
22+
@memcpy(result, message);
23+
wasm_minimal_protocol_send_result_to_host(result.ptr, result.len);
1024
return 0;
1125
}
1226

1327
export fn double_it(arg1_len: usize) i32 {
14-
var alloc_result = allocator.alloc(u8, arg1_len * 2) catch return 1;
15-
defer allocator.free(alloc_result);
16-
wasm_minimal_protocol_write_args_to_buffer(alloc_result.ptr);
28+
var result = allocator.alloc(u8, arg1_len * 2) catch return 1;
29+
wasm_minimal_protocol_write_args_to_buffer(result.ptr);
1730
for (0..arg1_len) |i| {
18-
alloc_result[i + arg1_len] = alloc_result[i];
31+
result[i + arg1_len] = result[i];
1932
}
20-
wasm_minimal_protocol_send_result_to_host(alloc_result.ptr, alloc_result.len);
33+
wasm_minimal_protocol_send_result_to_host(result.ptr, result.len);
2134
return 0;
2235
}
2336

@@ -27,7 +40,6 @@ export fn concatenate(arg1_len: usize, arg2_len: usize) i32 {
2740
wasm_minimal_protocol_write_args_to_buffer(args.ptr);
2841

2942
var result = allocator.alloc(u8, arg1_len + arg2_len + 1) catch return 1;
30-
defer allocator.free(result);
3143
for (0..arg1_len) |i| {
3244
result[i] = args[i];
3345
}
@@ -49,27 +61,30 @@ export fn shuffle(arg1_len: usize, arg2_len: usize, arg3_len: usize) i32 {
4961
var arg2 = args[arg1_len .. arg1_len + arg2_len];
5062
var arg3 = args[arg1_len + arg2_len .. args.len];
5163

52-
var result: std.ArrayList(u8) = std.ArrayList(u8).initCapacity(allocator, args_len + 2) catch return 1;
53-
defer result.deinit();
54-
result.appendSlice(arg3) catch return 1;
55-
result.append('-') catch return 1;
56-
result.appendSlice(arg1) catch return 1;
57-
result.append('-') catch return 1;
58-
result.appendSlice(arg2) catch return 1;
64+
var result = allocator.alloc(u8, arg1_len + arg2_len + arg3_len + 2) catch return 1;
65+
@memcpy(result[0..arg3.len], arg3);
66+
result[arg3.len] = '-';
67+
@memcpy(result[arg3.len + 1 ..][0..arg1.len], arg1);
68+
result[arg3.len + arg1.len + 1] = '-';
69+
@memcpy(result[arg3.len + arg1.len + 2 ..][0..arg2.len], arg2);
5970

60-
wasm_minimal_protocol_send_result_to_host(result.items.ptr, result.items.len);
71+
wasm_minimal_protocol_send_result_to_host(result.ptr, result.len);
6172
return 0;
6273
}
6374

6475
export fn returns_ok() i32 {
6576
const message = "This is an `Ok`";
66-
wasm_minimal_protocol_send_result_to_host(message.ptr, message.len);
77+
var result = allocator.alloc(u8, message.len) catch return 1;
78+
@memcpy(result, message);
79+
wasm_minimal_protocol_send_result_to_host(result.ptr, result.len);
6780
return 0;
6881
}
6982

7083
export fn returns_err() i32 {
7184
const message = "This is an `Err`";
72-
wasm_minimal_protocol_send_result_to_host(message.ptr, message.len);
85+
var result = allocator.alloc(u8, message.len) catch return 1;
86+
@memcpy(result, message);
87+
wasm_minimal_protocol_send_result_to_host(result.ptr, result.len);
7388
return 1;
7489
}
7590

0 commit comments

Comments
 (0)