11const std = @import ("std" );
22const allocator = std .heap .page_allocator ;
33
4+ // ===
5+ // Functions for the protocol
6+
47extern "typst_env" fn wasm_minimal_protocol_send_result_to_host (ptr : [* ]const u8 , len : usize ) void ;
58extern "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+
719export 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
1327export 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
6475export 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
7083export 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