1use std::os::raw::{c_char, c_int, c_void};
2
3pub enum Features {}
4pub enum Errors {}
5pub enum WastLexer {}
6pub enum WabtParseWatResult {}
7pub enum WabtParseWastResult {}
8pub enum WasmModule {}
9pub enum WabtWriteModuleResult {}
10pub enum WabtReadBinaryResult {}
11pub enum OutputBuffer {}
12pub enum Script {}
13pub enum WabtWriteScriptResult {}
14
15#[derive(Debug, PartialEq, Eq)]
16#[repr(C)]
17pub enum Result {
18 Ok,
19 Error,
20}
21
22extern "C" {
23 pub fn wabt_new_features() -> *mut Features;
24
25 pub fn wabt_exceptions_enabled(features: *const Features) -> bool;
26 pub fn wabt_set_exceptions_enabled(features: *mut Features, enabled: c_int);
27 pub fn wabt_mutable_globals_enabled(features: *const Features) -> bool;
28 pub fn wabt_set_mutable_globals_enabled(features: *mut Features, enabled: c_int);
29 pub fn wabt_sat_float_to_int_enabled(features: *const Features) -> bool;
30 pub fn wabt_set_sat_float_to_int_enabled(features: *mut Features, enabled: c_int);
31 pub fn wabt_sign_extension_enabled(features: *const Features) -> bool;
32 pub fn wabt_set_sign_extension_enabled(features: *mut Features, enabled: c_int);
33 pub fn wabt_simd_enabled(features: *const Features) -> bool;
34 pub fn wabt_set_simd_enabled(features: *mut Features, enabled: c_int);
35 pub fn wabt_threads_enabled(features: *const Features) -> bool;
36 pub fn wabt_set_threads_enabled(features: *mut Features, enabled: c_int);
37 pub fn wabt_multi_value_enabled(features: *const Features) -> bool;
38 pub fn wabt_set_multi_value_enabled(features: *mut Features, enabled: c_int);
39 pub fn wabt_tail_call_enabled(features: *const Features) -> bool;
40 pub fn wabt_set_tail_call_enabled(features: *mut Features, enabled: c_int);
41 pub fn wabt_bulk_memory_enabled(features: *const Features) -> bool;
42 pub fn wabt_set_bulk_memory_enabled(features: *mut Features, enabled: c_int);
43 pub fn wabt_reference_types_enabled(features: *const Features) -> bool;
44 pub fn wabt_set_reference_types_enabled(features: *mut Features, enabled: c_int);
45 pub fn wabt_annotations_enabled(features: *const Features) -> bool;
46 pub fn wabt_set_annotations_enabled(features: *mut Features, enabled: c_int);
47
48 pub fn wabt_destroy_features(features: *mut Features);
49
50 pub fn wabt_new_wast_buffer_lexer(
51 filename: *const c_char,
52 data: *const c_void,
53 size: usize,
54 ) -> *mut WastLexer;
55
56 pub fn wabt_destroy_wast_lexer(lexer: *mut WastLexer);
57
58 pub fn wabt_new_errors() -> *mut Errors;
59
60 pub fn wabt_format_text_errors(errors: *mut Errors, lexer: *mut WastLexer)
61 -> *mut OutputBuffer;
62
63 pub fn wabt_format_binary_errors(errors: *mut Errors) -> *mut OutputBuffer;
64
65 pub fn wabt_destroy_errors(errors: *mut Errors);
66
67 pub fn wabt_parse_wat(
68 lexer: *mut WastLexer,
69 features: *mut Features,
70 errors: *mut Errors,
71 ) -> *mut WabtParseWatResult;
72
73 pub fn wabt_parse_wast(
74 lexer: *mut WastLexer,
75 features: *mut Features,
76 errors: *mut Errors,
77 ) -> *mut WabtParseWastResult;
78
79 pub fn wabt_parse_wat_result_get_result(result: *mut WabtParseWatResult) -> Result;
80
81 pub fn wabt_parse_wat_result_release_module(result: *mut WabtParseWatResult)
82 -> *mut WasmModule;
83
84 pub fn wabt_destroy_parse_wat_result(result: *mut WabtParseWatResult);
85
86 pub fn wabt_resolve_names_module(module: *mut WasmModule, errors: *mut Errors) -> Result;
87
88 pub fn wabt_apply_names_module(module: *mut WasmModule) -> Result;
89
90 pub fn wabt_generate_names_module(module: *mut WasmModule) -> Result;
91
92 pub fn wabt_validate_module(
93 module: *mut WasmModule,
94 features: *mut Features,
95 erros: *mut Errors,
96 ) -> Result;
97
98 pub fn wabt_destroy_module(module: *mut WasmModule);
99
100 pub fn wabt_write_binary_module(
101 module: *mut WasmModule,
102 log: c_int,
103 canonicalize_lebs: c_int,
104 relocatable: c_int,
105 write_debug_name: c_int,
106 ) -> *mut WabtWriteModuleResult;
107
108 pub fn wabt_write_module_result_get_result(result: *mut WabtWriteModuleResult) -> Result;
109
110 pub fn wabt_write_module_result_release_output_buffer(
111 result: *mut WabtWriteModuleResult,
112 ) -> *mut OutputBuffer;
113
114 pub fn wabt_destroy_write_module_result(result: *mut WabtWriteModuleResult);
115
116 pub fn wabt_output_buffer_get_data(buffer: *mut OutputBuffer) -> *const c_void;
117
118 pub fn wabt_output_buffer_get_size(buffer: *mut OutputBuffer) -> usize;
119
120 pub fn wabt_destroy_output_buffer(buffer: *mut OutputBuffer);
121
122 pub fn wabt_resolve_names_script(script: *mut Script, errors: *mut Errors) -> Result;
123
124 pub fn wabt_validate_script(
125 script: *mut Script,
126 features: *mut Features,
127 errors: *mut Errors,
128 ) -> Result;
129
130 pub fn wabt_write_binary_spec_script(
131 script: *mut Script,
132 source_filename: *const c_char,
133 out_filename: *const c_char,
134 log: c_int,
135 canonicalize_lebs: c_int,
136 relocatable: c_int,
137 write_debug_name: c_int,
138 ) -> *mut WabtWriteScriptResult;
139
140 pub fn wabt_read_binary(
141 data: *const u8,
142 size: usize,
143 read_debug_names: c_int,
144 features: *mut Features,
145 errors: *mut Errors,
146 ) -> *mut WabtReadBinaryResult;
147
148 pub fn wabt_parse_wast_result_get_result(result: *mut WabtParseWastResult) -> Result;
149
150 pub fn wabt_parse_wast_result_release_module(result: *mut WabtParseWastResult) -> *mut Script;
151
152 pub fn wabt_destroy_parse_wast_result(result: *mut WabtParseWastResult);
153
154 pub fn wabt_read_binary_result_get_result(result: *mut WabtReadBinaryResult) -> Result;
155
156 pub fn wabt_read_binary_result_release_module(
157 result: *mut WabtReadBinaryResult,
158 ) -> *mut WasmModule;
159
160 pub fn wabt_destroy_read_binary_result(result: *mut WabtReadBinaryResult);
161
162 pub fn wabt_write_text_module(
163 module: *mut WasmModule,
164 fold_exprs: c_int,
165 inline_export: c_int,
166 ) -> *mut WabtWriteModuleResult;
167
168 pub fn wabt_write_script_result_get_result(result: *mut WabtWriteScriptResult) -> Result;
171
172 pub fn wabt_write_script_result_release_json_output_buffer(
173 result: *mut WabtWriteScriptResult,
174 ) -> *mut OutputBuffer;
175
176 pub fn wabt_write_script_result_release_log_output_buffer(
177 result: *mut WabtWriteScriptResult,
178 ) -> *mut OutputBuffer;
179
180 pub fn wabt_write_script_result_get_module_count(result: *mut WabtWriteScriptResult) -> usize;
181
182 pub fn wabt_write_script_result_get_module_filename(
183 result: *mut WabtWriteScriptResult,
184 index: usize,
185 ) -> *const c_char;
186
187 pub fn wabt_write_script_result_release_module_output_buffer(
188 result: *mut WabtWriteScriptResult,
189 index: usize,
190 ) -> *mut OutputBuffer;
191
192 pub fn wabt_destroy_write_script_result(result: *mut WabtWriteScriptResult);
193}
194
195#[test]
196fn parse_wasm() {
197 use std::ptr;
198
199 let data: &[u8] = &[
200 0, 97, 115, 109, 1, 0, 0, 0, ];
203
204 unsafe {
205 let errors = wabt_new_errors();
206 let features = wabt_new_features();
207 let result = wabt_read_binary(data.as_ptr(), data.len(), true as c_int, features, errors);
208 assert_eq!(wabt_read_binary_result_get_result(result), Result::Ok);
209 let module = wabt_read_binary_result_release_module(result);
210
211 wabt_destroy_read_binary_result(result);
212
213 let result = wabt_write_text_module(module, 0, 0);
214 assert_eq!(wabt_write_module_result_get_result(result), Result::Ok);
215 let output_buffer = wabt_write_module_result_release_output_buffer(result);
216
217 let data = wabt_output_buffer_get_data(output_buffer);
218 let size = wabt_output_buffer_get_size(output_buffer);
219
220 let mut buf: Vec<u8> = Vec::with_capacity(size);
221 ptr::copy_nonoverlapping(data as *const u8, buf.as_mut_ptr(), size);
222 buf.set_len(size);
223
224 let text = String::from_utf8(buf).unwrap();
225 assert_eq!(&text, "(module)\n");
226
227 wabt_destroy_features(features);
228 wabt_destroy_errors(errors);
229 }
230}