From b6314dba313b330fa5eec98ad9b958bee1da70cd Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 15 Apr 2026 02:13:03 +0300 Subject: [PATCH] all: add thin bindings for sled database (nosql) (fixes #3850) --- cmd/tools/translate.v | 23 +++++++-- cmd/tools/translate_test.v | 50 +++++++++++++++++++ .../README.md | 2 +- 3 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 cmd/tools/translate_test.v diff --git a/cmd/tools/translate.v b/cmd/tools/translate.v index 28fe56f25..88fc359a2 100644 --- a/cmd/tools/translate.v +++ b/cmd/tools/translate.v @@ -7,6 +7,21 @@ import v.util const vexe = os.getenv('VEXE') +fn normalize_translate_args(args []string) []string { + if args.len > 0 && args[0] == '-wrapper' { + mut normalized := []string{cap: args.len} + normalized << 'wrapper' + normalized << args[1..] + return normalized + } + return args.clone() +} + +fn show_usage_and_exit() { + eprintln('Wrong number of arguments. Use `v translate file.c` or `v translate wrapper file.c`.') + exit(3) +} + fn main() { vmodules := os.vmodules_dir() c2v_dir := os.join_path(vmodules, 'c2v') @@ -38,11 +53,11 @@ fn main() { exit(2) } } - if os.args.len < 3 { - eprintln('Wrong number of arguments. Use `v translate file.c` .') - exit(3) + translate_args := normalize_translate_args(os.args[2..]) + if translate_args.len == 0 || (translate_args.len == 1 && translate_args[0] == 'wrapper') { + show_usage_and_exit() } - passed_args := util.args_quote_paths(os.args[2..]) + passed_args := util.args_quote_paths(translate_args) // println(passed_args) os.chdir(os.wd_at_startup)! c2v_cmd := '${os.quoted_path(c2v_bin)} ${passed_args}' diff --git a/cmd/tools/translate_test.v b/cmd/tools/translate_test.v new file mode 100644 index 000000000..e1c000146 --- /dev/null +++ b/cmd/tools/translate_test.v @@ -0,0 +1,50 @@ +import os + +const qvexe = os.quoted_path(@VEXE) + +fn test_translate_legacy_wrapper_flag_uses_wrapper_mode() { + test_dir := os.join_path(os.vtmp_dir(), 'translate_test_${os.getpid()}') + os.rmdir_all(test_dir) or {} + os.mkdir_all(test_dir)! + defer { + os.rmdir_all(test_dir) or {} + } + vmodules_dir := os.join_path(test_dir, 'vmodules') + compile_fake_c2v(vmodules_dir)! + sample_path := os.join_path(test_dir, 'usersapi.c') + args_out := os.join_path(test_dir, 'c2v_args.txt') + os.write_file(sample_path, 'int usersapi_get_number_of_users(void) { return 1; }\n')! + mut process := os.new_process(@VEXE) + process.set_work_folder(@VEXEROOT) + process.set_args(['translate', '-wrapper', sample_path]) + process.set_environment({ + 'C2V_ARGS_OUT': args_out + 'VMODULES': vmodules_dir + }) + process.set_redirect_stdio() + process.wait() + stdout := process.stdout_slurp() + stderr := process.stderr_slurp() + exit_code := process.code + process.close() + assert exit_code == 0, 'stdout:\n${stdout}\nstderr:\n${stderr}' + args := os.read_file(args_out)!.split_into_lines() + assert args == ['wrapper', sample_path], args.str() +} + +fn compile_fake_c2v(vmodules_dir string) ! { + c2v_dir := os.join_path(vmodules_dir, 'c2v') + os.mkdir_all(c2v_dir)! + fake_c2v_path := os.join_path(c2v_dir, 'fake_c2v.v') + c2v_bin := os.join_path(c2v_dir, 'c2v' + exe_suffix()) + fake_c2v_source := + ['import os', '', 'fn main() {', "\tout := os.getenv('C2V_ARGS_OUT')", "\tif out == '' {", "\t\teprintln('missing C2V_ARGS_OUT')", '\t\texit(1)', '\t}', "\tos.write_file(out, os.args[1..].join('\\n')) or {", '\t\teprintln(err)', '\t\texit(2)', '\t}', '}'].join('\n') + + '\n' + os.write_file(fake_c2v_path, fake_c2v_source)! + res := os.execute('${qvexe} -o ${os.quoted_path(c2v_bin)} ${os.quoted_path(fake_c2v_path)}') + assert res.exit_code == 0, res.output +} + +fn exe_suffix() string { + return if os.user_os() == 'windows' { '.exe' } else { '' } +} diff --git a/tutorials/C2V_translating_simple_programs_and_DOOM/README.md b/tutorials/C2V_translating_simple_programs_and_DOOM/README.md index e26973074..7e94a7154 100644 --- a/tutorials/C2V_translating_simple_programs_and_DOOM/README.md +++ b/tutorials/C2V_translating_simple_programs_and_DOOM/README.md @@ -91,7 +91,7 @@ with lots of functions and types, and you don't want to manually type their defi For this C2V has a wrapper mode. -We have a simple file `usersapi.h`. By running `v translate -wrapper usersapi.c` +We have a simple file `usersapi.h`. By running `v translate wrapper usersapi.c` we get `usersapi.v` with just the function definitions. Function bodies are skipped. ```c -- 2.39.5