vlang / c2v Goto Github PK
View Code? Open in Web Editor NEWC/C++ to V translator
License: GNU General Public License v3.0
C/C++ to V translator
License: GNU General Public License v3.0
Seems like c2v has a hard time with multiple, comma separated variable assignments on the same line
fn aes256_set_encryption_key(key &u8, expandedkey &u32) {
nb := 4, nr := 14, nk := 8, i := u32(0)
tmp := u32(0)
// ...
}
C to V translator 0.3.1
translating ./tgcrypto/aes256.c ... tgcrypto/aes256.v:119:9: error: this number has unsuitable digit `n`
117 |
118 | fn aes256_set_encryption_key(key &u8, expandedkey &u32) {
119 | nb := 4nr := 14nk := 8i := u32(0)
| ^
120 | tmp := u32(0)
121 |
Test code -> TheMachinery log.h - https://pastebin.com/rQMAfnFb
Error message
log.v:101:12: error: parameter name must not begin with upper case letter (`Enum`)
99 | add_logger fn (&Tm_logger_i)
100 | remove_logger fn (&Tm_logger_i)
101 | print fn (Enum tm_log_type, &i8)
| ~~~~
102 | C.printf fn (Enum tm_log_type, &i8, ...) int
103 | default_logger &Tm_logger_i
C2V - c08add0
V - 0.2.4 (ccc3271493019feb13ed1c96b035199e159fe863)
.h file - https://github.com/SanderMertens/flecs/blob/master/flecs.h
translation wrapper
execution time on original file - 509ms
translation wrapper
execution time on file without comments - 220ms (comments were removed with gcc -fpreprocessed -dD -E test.h -o test_no_comments.h
When generating a wrapper for .h file with v translate wrapper
- module name is '.'
But when generating a wrapper directly call c2v
(./c2v wrapper
), the module name is correct
C to V translator 0.3.1
translating tool/srcck1.c ... tool/srcck1.v:103:17: error: unexpected token `=`, expecting `)`
101 | c := i8(0)
102 | prevc := 0
103 | for i = 0 ; (c = z [i] ) != 0 ; prevc = c , i ++ {
| ^
104 | if c == `
105 | ` {
Internal vfmt error while formatting file: tool/srcck1.v.
Encountered a total of: 1 errors.
took 92 ms ; output .v file: tool/srcck1.v
Translated 1 files in 92 ms.
macos m1
Repo
https://github.com/odunboye/pong_game
c2v.toml
[project]
additional_flags = "-I/opt/homebrew/include -L/opt/homebrew/lib -lSDL2"
% ./c2v ../../../lab/pong_game
C to V translator 0.3.1
"../../../lab/pong_game" is a directory, processing all C files in it recursively...
translating ./racket.c ...
Unhandled expr() node {CompoundLiteralExpr} (ast line nr node.ast_line_nr "./racket.c"):
{CompoundLiteralExpr} name:"" value:"" loc:Loc{
offset: 0
file: ''
line: 0
col: 0
tokLen: 0
included_from: IncludedFrom{
file: ''
}
spelling_loc: IncludedFrom{
file: ''
}
range: Range{
begin: Begin{
spelling_loc: IncludedFrom{
file: ''
}
}
}
} #c: 1 typ:"SDL_Rect"
0 c2v 0x00000001047f7830 main__C2V_expr + 2920
1 c2v 0x00000001047f724c main__C2V_expr + 1412
2 c2v 0x00000001047fd764 main__C2V_statement + 1048
3 c2v 0x00000001047fb944 main__C2V_statements + 124
4 c2v 0x00000001047f906c main__C2V_fn_decl + 2836
5 c2v 0x0000000104804104 main__C2V_top_level + 156
6 c2v 0x00000001048038c0 main__C2V_translate_file + 2640
7 c2v 0x0000000104802d48 main__main + 1088
8 c2v 0x000000010480757c main + 84
9 dyld 0x0000000104a5108c start + 520
Was trying to run v translate
(which compiled c2v
automatically) on raudio.c
from: https://github.com/raysan5/raylib/blob/master/src/raudio.c
and it failed like this:
neko-san@ARCH /m/e/D/raylib (master)> v translate *
C to V translator 0.3.1
"src" is a directory, processing all C files in it recursively...
translating ./raudio.c ... GC Warning: Repeated allocation of very large block (appr. size 576020480):
May lead to memory leak and poor performance
C++ top level
C2V failed to translate the C files. Please report it via GitHub.
neko-san@ARCH /m/e/D/raylib (master) [4]> cd src
neko-san@ARCH /m/e/D/r/src (master)> v translate raudio.c
C to V translator 0.3.1
translating raudio.c ... GC Warning: Repeated allocation of very large block (appr. size 574701568):
May lead to memory leak and poor performance
C++ top level
C2V failed to translate the C files. Please report it via GitHub.
neko-san@ARCH /m/e/D/r/src (master) [4]> cd ../../
neko-san@ARCH /m/e/Development> git clone --recurse --recurse-submodules https://github.com/vlang/c2v
Cloning into 'c2v'...
remote: Enumerating objects: 233, done.
remote: Counting objects: 100% (108/108), done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 233 (delta 46), reused 67 (delta 23), pack-reused 125
Receiving objects: 100% (233/233), 151.90 KiB | 1.58 MiB/s, done.
Resolving deltas: 100% (87/87), done.
neko-san@ARCH /m/e/Development> cd /mnt/extraStorage/Development/c2v
neko-san@ARCH /m/e/D/c2v (master)> v -gc none .
neko-san@ARCH /m/e/D/c2v (master)> cd /mnt/extraStorage/Development
neko-san@ARCH /m/e/Development> cd /mnt/extraStorage/Development/raylib-vlang
neko-san@ARCH /m/e/D/raylib-vlang (master)> cd /mnt/extraStorage/Development/raylib-vlang/src
neko-san@ARCH /m/e/D/r/src (master)> mv ../../c2v/c2v .
neko-san@ARCH /m/e/D/r/src (master)> ./c2v raudio.c
C to V translator 0.3.1
translating raudio.c ... C++ top level
neko-san@ARCH /m/e/D/r/src (master) [1]>
(I just moved the aforementioned glfw
folder somewhere else temporarily, so this shouldn't be related?
I mention that because leaving the "glfw" folder in the project throws other errors)
@ medvednikov said this about it on Discord:
"it sounds like a bug, it shouldn't allocate this much memory"
https://github.com/vlang/c2v/blob/master/c2v.v#L228
This results in a "file not found" error every time something gets translated.
I think the path /dev/null
is only valid on Linux, so this will fail on other operating systems than Windows too.
On attempting to parse wayland-server.h
(http://0x0.st/o1v6.h)
wl_interface is stripped to interface and it breaks function declarations
fails to translate
enum OSC_VARIABLES
{
OSC_NUMVARS
};
error
C to V translator 0.3.1
translating c:/library/variable.h ... ================ V panic ================
module: builtin
function: get()
message: array.get: index out of range (i == 8, a.len == 8)
file: F:/(PROGRAMMING)/Hydrus/v/vlib/builtin/array.v:384
v hash: 16a6972
=========================================
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..F:\(PROGRAMMING)\Hydrus\v\vlib\builtin\builtin.c.v:53: at panic_debug: Backtrace
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..F:\(PROGRAMMING)\Hydrus\v\vlib\builtin\array.v:384: by array_get
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..C:\Users\argit\.vmodules\c2v\c2v.v:1031: by main__C2V_enum_decl
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..C:\Users\argit\.vmodules\c2v\c2v.v:2323: by main__C2V_top_level
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..C:\Users\argit\.vmodules\c2v\c2v.v:2274: by main__C2V_translate_file
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..C:\Users\argit\.vmodules\c2v\c2v.v:2205: by main__main
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..C:\Users\argit\AppData\Local\Temp\v_0\c2v.exe.tmp.c:17591: by wmain
0056ded8 : by ???
0056e03b : by ???
7ff802197034 : by ???
C2V failed to translate the C files. Please report it via GitHub.
OS: linux, "Arch Linux"
V full version: V 0.2.4 e5bbb23.ccc3271
C and V have difference operator precedence for bitwise operations, programs converted using C2V are inherently broken.
Take this C code as an example:
#include <stdio.h>
int main(){
if ( 0b00001000 & 1 << 3 ) {
printf("*** is ***\n");
} else {
printf("*** is not ***\n");
}
}
Creates the following output:
> $ gcc bug.c && ./a.out
*** is ***
> $ v translate bug.c && v run bug.v
C to V translator 0.3.1
translating bug.c ... Reformatted file: /home/liaml/bug.v
took 57 ms ; output .v file: bug.v
Translated 1 files in 57 ms.
*** is not ***
This is because of the line inside the if statement being translated as it is.
0b00001000 & 1 << 3
should be 0b00001000 & (1 << 3)
inside the V programming language. There is no need for the brackets in C.
Having differing operator precedence is not a bug, however translated code has to account for this.
Thank you for reviewing this issue.
Hi, I am wrapping the odbc sql.h in linux using c2v but seems like the out file does not compile.
Repro steps: (I copied the sql.h from /usr/include to v repo)
bash:~/code/vlang/v/vlib/mssql$ ~/code/vlang/c2v/c2v wrap ./sql.h
C to V translator 0.3.1
translating ./sql.h ... sql.v:101:15: error: unexpected token `(`, expecting name
99 | interval_type SQLINTERVAL
100 | interval_sign SQLSMALLINT
101 | intval Union (anonymous union at /usr/include/sqltypes.h
| ^
102 | }
103 | type SQLBIGINT = int
Internal vfmt error while formatting file: ./sql.v.
Encountered a total of: 1 errors.
took 1254 ms ; output .v file: ./sql.v
Translated 1 files in 1254 ms.
Problematic c code is this typedef enum in sqltypes.h
#if (ODBCVER >= 0x0300)
typedef enum
{
SQL_IS_YEAR = 1,
SQL_IS_MONTH = 2,
SQL_IS_DAY = 3,
SQL_IS_HOUR = 4,
SQL_IS_MINUTE = 5,
SQL_IS_SECOND = 6,
SQL_IS_YEAR_TO_MONTH = 7,
SQL_IS_DAY_TO_HOUR = 8,
SQL_IS_DAY_TO_MINUTE = 9,
SQL_IS_DAY_TO_SECOND = 10,
SQL_IS_HOUR_TO_MINUTE = 11,
SQL_IS_HOUR_TO_SECOND = 12,
SQL_IS_MINUTE_TO_SECOND = 13
} SQLINTERVAL;
#endif
Corresponding v code is :
struct SQL_INTERVAL_STRUCT {
interval_type SQLINTERVAL
interval_sign SQLSMALLINT
intval Union (anonymous union at /usr/include/sqltypes.h
}
c2v commit:
commit d7ac0c7b6830943c5441c94e17e62667a62e4934 (HEAD -> master, origin/master, origin/HEAD)
Author: Alexander Medvednikov <[email protected]>
Date: Sun Jun 26 17:06:18 2022 +0300
tests: remove unused files
v version:
V 0.2.4 28068e8
OS: windows, Microsoft Windows 10 Home v19044 64-bit
Processor: 24 cpus, 64bit, little endian, AMD Ryzen 9 3900X 12-Core Processor
CC version: Error: exec failed (CreateProcess) with code 2: The system cannot find the file specified.
cmd: cc --version
getwd: C:\Users\argit
vmodules: C:\Users\argit\.vmodules
vroot: F:\(PROGRAMMING)\Hydrus\v
vexe: F:\(PROGRAMMING)\Hydrus\v\v.exe
vexe mtime: 2022-07-13 18:32:29
is vroot writable: true
is vmodules writable: true
V full version: V 0.3.0 28fd176
Git version: git version 2.30.1.windows.1
Git vroot status: 0006e8d1-dirty (13553 commit(s) behind V master)
.git/config present: false
thirdparty/tcc: N/A
bool a_bool; // this cannot be translated to V apparently
What did you expect to see?
translated to V
What did you see instead?
C to V translator 0.3.1
translating c:/SoEm_Chaos.c ... c:/SoEm_Chaos.c:944:1: error: unknown type name 'bool'
bool a_bool;
^
1 error generated.
The file c:/SoEm_Chaos.c could not be parsed as a C source file.
C2V failed to translate the C files. Please report it via GitHub.
Steps to reproduce:
$ git clone --depth=1 https://github.com/Genymobile/scrcpy
$ cd scrcpy/app/src
$ v translate clock.c
C2V is not installed. Cloning C2V to /Users/tedstoychev/.vmodules/c2v ...
Compiling c2v ...
C to V translator 0.3.1
translating clock.c ... In file included from clock.c:1:
In file included from ./clock.h:4:
./common.h:4:10: fatal error: 'config.h' file not found
#include "config.h"
^~~~~~~~~~
1 error generated.
The file clock.c could not be parsed as a C source file.
C2V failed to translate the C files. Please report it via GitHub.
V: v0.3.0 00dfce6
OS: macOS Monterey 12.4
Hello,
Here's a minimal example showing incorrect output when translating fputs on MacOS:
#include <stdio.h>
int main()
{
FILE *f;
f = fopen("file.txt", "w+");
fputs("test", f);
fclose(f);
return 0;
}
The output from c2v:
C to V translator 0.3.1
translating test.c ... test.v:4:11: error: parameter name must not begin with upper case letter (`Char`)
2 | module main
3 |
4 | fn fputs( Char *restrict, FILE *restrict) int
| ~~~~
5 |
6 | fn main() {
Steps to reproduce:
v translate test.c
When calling c2v wrapper test.h
on this file :
void testFunc() {
}
It generates this file :
[translated]
module .
fn C.testFunc()
pub [c:'testFunc']
fn testfunc() {
C.testfunc()
}
There is two errors here :
pub
keyword should be right before the fn
keywordC.testfunc()
should be C.testFunc()
enum myEnum {
A,
B,
C
};
typedef enum {
D,
E,
F
} myAnotherEnum;
typedef enum myStrangeEnum {
G,
H,
I
} myStrangeEnum;
enum { J = 1 };
int main() {
enum myEnum myEnumVar = A;
myAnotherEnum myEnumVar2 = D;
myStrangeEnum myEnumVar3 = G;
int myIntVar = J;
return 0;
}
[translated]
module main
enum MyEnum {
a
b
c
}
enum MyAnotherEnum {
d
e
f
}
enum MyStrangeEnum {
g
h
i
}
const ( // empty enum
j = 0
)
fn main() {
myenumvar := MyEnum.a
myenumvar2 := MyAnotherEnum.d
myenumvar3 := MyStrangeEnum.g
myintvar := j
return
}
[translated]
module main
enum MyEnum {
a
b
c
}
enum MyAnotherEnum {
d
e
f
}
enum MyStrangeEnum {
g
h
i
}
const ( // empty enum
j = 1
)
fn main() {
myenumvar := MyEnum.a
myenumvar2 := MyAnotherEnum.d
myenumvar3 := MyStrangeEnum.g
myintvar := j
return
}
j value must be 1, but in V version it's 0
Randomly throws the following error
2s
Run ./imgur.sh /tmp/fail.png
Delete page: https://imgur.com/delete/r54LbMGifWieLxc
https://i.imgur.com/6wA7qov.png
Haven't copied to the clipboard: no xsel or xclip
https://i.imgur.com/PmdV4LZ.png
Delete page: https://imgur.com/delete/Ypna8rul9At2rno
Haven't copied to the clipboard: no xsel or xclip
Error: Process completed with exit code 1.
Even if generated wrapper is correct, 'v fmt' command is not executed on it
Flecs repo - https://github.com/SanderMertens/flecs
V 0.2.4 (fe673e7 commit)
[๐ด] ร v translate ~/Projects/KolciaEngine/flecs-v/
C to V translator 0.3.1
"/home/yuart/Projects/KolciaEngine/flecs-v/" is a directory, processing all C files in it recursively...
translating ./flecs.c ...
Unhandled expr() node {FullComment} (ast line nr node.ast_line_nr "./flecs.c"):
{FullComment} name:"" value:"" loc:Loc{
offset: 120754
file: ''
line: 3883
col: 4
tokLen: 0
included_from: IncludedFrom{
file: './flecs.c'
}
spelling_loc: IncludedFrom{
file: ''
}
range: Range{
begin: Begin{
spelling_loc: IncludedFrom{
file: ''
}
}
}
} #c: 1 typ:""
/tmp/v_1000/../../../../../../home/yuart/Projects/v/vlib/builtin/builtin.c.v:639: at print_backtrace: Backtrace
/tmp/v_1000/../../../../../../home/yuart/.vmodules/c2v/c2v.v:2013: by main__C2V_expr
/tmp/v_1000/../../../../../../home/yuart/.vmodules/c2v/c2v.v:1711: by main__C2V_global_var_decl
/tmp/v_1000/../../../../../../home/yuart/.vmodules/c2v/c2v.v:2318: by main__C2V_top_level
/tmp/v_1000/../../../../../../home/yuart/.vmodules/c2v/c2v.v:2271: by main__C2V_translate_file
/tmp/v_1000/../../../../../../home/yuart/.vmodules/c2v/c2v.v:2196: by main__main
/tmp/v_1000/../../../../../../tmp/v_1000/c2v.tmp.c:17588: by main
C2V failed to translate the C files. Please report it via GitHub.
C to V translator 0.3.1
"." is a directory, processing all C files in it recursively...
translating ./sqlite3.c ...
Unhandled expr() node {AtomicExpr} (ast line nr node.ast_line_nr "./sqlite3.c"):
{AtomicExpr} name:"" value:"" loc:Loc{
offset: 0
file: ''
line: 0
col: 0
tokLen: 0
included_from: IncludedFrom{
file: ''
}
spelling_loc: IncludedFrom{
file: ''
}
range: Range{
begin: Begin{
spelling_loc: IncludedFrom{
file: ''
}
}
}
} #c: 3 typ:"void"
/tmp/v_1000/../../../../../../home/jamie/git/v/vlib/builtin/builtin.c.v:639: at print_backtrace: Backtrace
/tmp/v_1000/../../../../../../home/jamie/.vmodules/c2v/c2v.v:2013: by main__C2V_expr
/tmp/v_1000/../../../../../../home/jamie/.vmodules/c2v/c2v.v:1141: by main__C2V_statement
/tmp/v_1000/../../../../../../home/jamie/.vmodules/c2v/c2v.v:1091: by main__C2V_statements
/tmp/v_1000/../../../../../../home/jamie/.vmodules/c2v/c2v.v:537: by main__C2V_fn_decl
/tmp/v_1000/../../../../../../home/jamie/.vmodules/c2v/c2v.v:2314: by main__C2V_top_level
/tmp/v_1000/../../../../../../home/jamie/.vmodules/c2v/c2v.v:2271: by main__C2V_translate_file
/tmp/v_1000/../../../../../../home/jamie/.vmodules/c2v/c2v.v:2196: by main__main
/tmp/v_1000/../../../../../../tmp/v_1000/c2v.tmp.c:17589: by main
C2V command: '/home/jamie/.vmodules/c2v/c2v' '.'
C2V failed to translate the C files. Please report it via GitHub.
X:\v>v doctor
OS: windows, Microsoft Windows 10 Home v19044 64-bit
Processor: 24 cpus, 64bit, little endian, AMD Ryzen 9 3900X 12-Core Processor
CC version: Error: exec failed (CreateProcess) with code 2: The system cannot find the file specified.
cmd: cc --version
getwd: X:\v
vmodules: C:\Users\argit.vmodules
vroot: F:(PROGRAMMING)\Hydrus\v
vexe: F:(PROGRAMMING)\Hydrus\v\v.exe
vexe mtime: 2022-07-13 05:38:33
is vroot writable: true
is vmodules writable: true
V full version: V 0.3.0 d12a8ae.28fd176
Git version: git version 2.30.1.windows.1
Git vroot status: 0.3-121-g28fd1765
.git/config present: true
thirdparty/tcc status: thirdparty-windows-amd64 125e21e2
try to translate c
What did you expect to see?
a translated primes.c
What did you see instead?
X:\v>v translate primes.c
================ V panic ================
module: main
function: find_clang_in_path()
message: cannot find clang in PATH
file: ./c2v.v:97
v hash: 16a6972
=========================================
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..F:\(PROGRAMMING)\Hydrus\v\vlib\builtin\builtin.c.v:53: at panic_debug: Backtrace
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..C:\Users\argit\.vmodules\c2v\c2v.v:97: by main__find_clang_in_path
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..C:\Users\argit\AppData\Local\Temp\v_0\c2v.exe.tmp.c:17578: by _vinit
C:/Users/argit/AppData/Local/Temp/v_0/../../../../../..C:\Users\argit\AppData\Local\Temp\v_0\c2v.exe.tmp.c:17590: by wmain
0056ded8 : by ???
0056e03b : by ???
7fffa64b7034 : by ???
C2V failed to translate the C files. Please report it via GitHub.
this translates:
const int a = 0;
void f()
{
switch(a)
{
default:
break;
case 0:
break;
}
}
this fails:
const int a = 0;
void f()
{
switch(a)
{
default:
//break; // this line is the only change
case 0:
break;
}
}
When trying to use wrapper
command on header files, I realize that wrapper
doesn't wrap function declaration but needs a function definition.
It would be very convenient if it were able to create wrapper only based on function declaration.
Example test.h
:
void test();
c2v wrapper test.h
Sould lead to :
[translated]
module .
fn C.test()
pub fn test() {
C.test()
}
But it lead to nothing for now.
[translated]
module .
Test file (for which wrapper was generated; The Machinery header api_registry,h) -> https://pastebin.com/NF6RjVaN
Error message
api_registry.v:94:2: error: struct embedding must be declared at the beginning of the struct body
92 | api_registry_version fn () Tm_version_t
93 | set fn (&i8, Tm_version_t, voidptr, u32)
94 | C.remove fn (voidptr)
| ~~~~~~~~
95 | get fn (&i8, Tm_version_t) voidptr
96 | get_optional fn (&voidptr, &i8, Tm_version_t)
Internal vfmt error while formatting file: ./api_registry.v.
Encountered a total of: 1 errors.
Full error log: http://0x0.st/o1yY.txt
Source code: https://git.sr.ht/~shinyzenith/NextWM/tree/master/item/nextctl/nextctl.c
this what i get
[translated]
module main
type Uintptr_t = i64
type Va_list = &i8
type Size_t = i64
type Ptrdiff_t = i64
type Intptr_t = i64
type Wchar_t = U16
type Errno_t = int
type Wint_t = U16
type Wctype_t = U16
struct Crt_locale_data_public {
_locale_pctype &u16
_locale_mb_cur_max int
_locale_lc_codepage u32
}
struct Crt_locale_pointers {
locinfo &crt_locale_data
mbcinfo &crt_multibyte_data
}
type _locale_t = &crt_locale_pointers
struct Mbstatet {
_Wchar u32
_Byte u16
_State u16
}
type Mbstate_t = Mbstatet
type Time_t = Time64_t
type Rsize_t = Usize
struct FILE {
_Placeholder voidptr
}
type Fpos_t = i64
fn is_prime(x int) bool {
for i := 2 ; i <= x / 2 ; i ++ {
if x % i == 0 {
return false
}
}
return true
}
fn main() {
for i := 2 ; i < 100 ; i ++ {
if is_prime(i) {
C.printf(c'%i\n', i)
}
}
return
}
and error
v main.v
main.v:9:16: error: unknown type `U16`.
Did you mean `FILE`?
7 | type Ptrdiff_t = i64
8 | type Intptr_t = i64
9 | type Wchar_t = U16
| ~~~
10 | type Errno_t = int
11 | type Wint_t = U16
main.v:11:15: error: unknown type `U16`.
Did you mean `FILE`?
9 | type Wchar_t = U16
10 | type Errno_t = int
11 | type Wint_t = U16
| ~~~
12 | type Wctype_t = U16
13 | struct Crt_locale_data_public {
main.v:12:17: error: unknown type `U16`.
Did you mean `FILE`?
10 | type Errno_t = int
11 | type Wint_t = U16
12 | type Wctype_t = U16
| ~~~
13 | struct Crt_locale_data_public {
14 | _locale_pctype &u16
main.v:19:11: error: unknown type `crt_locale_data`.
Did you mean `Crt_locale_data_public`?
17 | }
18 | struct Crt_locale_pointers {
19 | locinfo &crt_locale_data
| ~~~~~~~~~~~~~~~
20 | mbcinfo &crt_multibyte_data
21 | }
main.v:20:11: error: unknown type `crt_multibyte_data`
18 | struct Crt_locale_pointers {
19 | locinfo &crt_locale_data
20 | mbcinfo &crt_multibyte_data
| ~~~~~~~~~~~~~~~~~~
21 | }
22 | type _locale_t = &crt_locale_pointers
main.v:22:18: error: unknown type `crt_locale_pointers`.
Did you mean `Crt_locale_pointers`?
20 | mbcinfo &crt_multibyte_data
21 | }
22 | type _locale_t = &crt_locale_pointers
| ~~~~~~~~~~~~~~~~~~~~
23 | struct Mbstatet {
24 | _Wchar u32
main.v:29:15: error: unknown type `Time64_t`.
Did you mean `Time_t`?
27 | }
28 | type Mbstate_t = Mbstatet
29 | type Time_t = Time64_t
| ~~~~~~~~
30 | type Rsize_t = Usize
31 | struct FILE {
main.v:30:16: error: unknown type `Usize`.
Did you mean `Rsize_t`?
28 | type Mbstate_t = Mbstatet
29 | type Time_t = Time64_t
30 | type Rsize_t = Usize
| ~~~~~
31 | struct FILE {
32 | _Placeholder voidptr
Translating timestamp.c
from the Arch Linux opendoas repo throws an "unexpected token" error.
v version: 0.3.0 3ad22eb
C to V translator 0.3.1
translating timestamp.c ... timestamp.v:34:24: error: unexpected token `*`, expecting `,`
32 | fn strtoul( &i8, &&u8, int) u32
33 |
34 | fn strtoul(__nptr Char *restrict, __endptr Char **restrict, __base int) u32
| ^
35 |
36 | fn strtoull( &i8, &&u8, int) i64
Internal vfmt error while formatting file: timestamp.v.
Encountered a total of: 1 errors.
took 206 ms ; output .v file: timestamp.v
Translated 1 files in 206 ms.
Steps to reproduce:
git clone https://github.com/Duncaen/OpenDoas/
c2v.toml
in the root project directory and the libopendoas
directory:[project]
uses_sdl = false
output_dirname = "c2v_out.dir"
additional_flags = "-I. -I.. -I../.. -I./libopenbsd"
./configure --with-timestamp
v translate *
System Info:
OS: Arch Linux x86_64
You can run this test in C2V folder -> tests -> v run run_tests.vsh
tests/5.if_paren_call.v:6:8: error: unexpected token `=`, expecting `)`
4 | fn main() {
5 | a := 0
6 | if (a = C.puts(c'Hello World')) {
| ^
7 | C.puts(c'noes')
8 | }
Internal vfmt error while formatting file: /home/yuart/Projects/c2v/tests/5.if_paren_call.v.
Encountered a total of: 1 errors.
tests/5.if_paren_call.v:6:8: error: unexpected token `=`, expecting `)`
4 | fn main() {
5 | a := 0
6 | if (a = C.puts(c'Hello World')) {
| ^
7 | C.puts(c'noes')
8 | }
Internal vfmt error while formatting file: /home/yuart/Projects/c2v/tests/5.if_paren_call.v.
Encountered a total of: 1 errors.
/home/yuart/Projects/c2v/tests/5.if_paren_call.c...
FAIL
expected:
[translated]
module main
fn main() {
a := 0
a = C.puts(c'Hello World')
if a {
C.puts(c'noes')
}
a = C.puts(c'Hello World')
if a != 0 {
C.puts(c'noes')
}
cacatua := 0
cacatua = C.puts(c'Hello World')
if cacatua {
C.puts(c'noes')
}
}
===got:
[translated]
module main
fn main() {
a := 0
if (a = C.puts(c'Hello World')) {
C.puts(c'noes')
}
if (a = C.puts(c'Hello World')) != 0 {
C.puts(c'noes')
}
cacatua := 0
if (cacatua = C.puts(c'Hello World')) {
C.puts(c'noes')
}
}
====diff=====
--- /tmp/expected.txt 2022-06-30 20:06:52.722390175 +0200
+++ /tmp/got.txt 2022-06-30 20:06:52.722390175 +0200
@@ -1,19 +1,16 @@
[translated]
module main
-fn main() {
+fn main() {
a := 0
- a = C.puts(c'Hello World')
- if a {
+ if (a = C.puts(c'Hello World')) {
C.puts(c'noes')
}
- a = C.puts(c'Hello World')
- if a != 0 {
+ if (a = C.puts(c'Hello World')) != 0 {
C.puts(c'noes')
}
cacatua := 0
- cacatua = C.puts(c'Hello World')
- if cacatua {
+ if (cacatua = C.puts(c'Hello World')) {
C.puts(c'noes')
}
}
\ No newline at end of file
C2V - c08add0
V - 0.2.4 (ccc3271493019feb13ed1c96b035199e159fe863)
.h file - https://github.com/SanderMertens/flecs/blob/master/flecs.h
fmt error
flecs.v:78:2: error: duplicate attribute `c2v_variadic`
76 | }
77 | [c2v_variadic]
78 | [c2v_variadic]
| ~~~~~~~~~~~~
79 | struct Ecs_time_t {
80 | sec u32
Internal vfmt error while formatting file: flecs.v.
Encountered a total of: 1 errors.
V - v0.3.0
C2V - 55f73a5
File to generate a wrapper for - https://github.com/SanderMertens/flecs/blob/master/flecs.h
Error
flecs.v:418:13: error: unexpected token `(`, expecting name
416 | }
417 | struct Ecs_iter_private_t {
418 | iter Union (unnamed union at ../flecs-master/flecs.h
| ^
419 | cache Ecs_iter_cache_t
420 | }
this translates:
void variable_init()
{
}
this does not:
void variable_init()
{
};
Error:
C to V translator 0.3.1
translating ./wayland-egl-backend.h ... ================ V panic ================
module: builtin
function: get()
message: array.get: index out of range (i == 99, a.len == 99)
file: /home/aakash/.local/bin/v_lang/vlib/builtin/array.v:384
v hash: ac7e809
=========================================
/tmp/v_1000/../../../../../../home/aakash/.local/bin/v_lang/vlib/builtin/builtin.c.v:53: at panic_debug: Backtrace
/tmp/v_1000/../../../../../../home/aakash/.local/bin/v_lang/vlib/builtin/array.v:384: by array_get
/tmp/v_1000/../../../../../../home/aakash/.vmodules/c2v/c2v.v:788: by main__C2V_record_decl
/tmp/v_1000/../../../../../../home/aakash/.vmodules/c2v/c2v.v:2049: by main__C2V_top_level
/tmp/v_1000/../../../../../../home/aakash/.vmodules/c2v/c2v.v:2004: by main__C2V_translate_file
/tmp/v_1000/../../../../../../home/aakash/.vmodules/c2v/c2v.v:1938: by main__main
/tmp/v_1000/../../../../../../tmp/v_1000/c2v.tmp.c:17582: by main
C2V failed to translate the C files. Please report it via GitHub.
Source file: http://0x0.st/o1yR.h
$ v translate .
C to V translator 0.3.1
"." is a directory, processing all C files in it recursively...
translating ./stivale2.c ... ================ V panic ================
module: builtin
function: get()
message: array.get: index out of range (i == 134, a.len == 134)
file: /home/vox/Documents/v/vlib/builtin/array.v:384
v hash: 298dc77
=========================================
/tmp/v_1000/../../../../../../home/vox/Documents/v/vlib/builtin/builtin.c.v:53: at panic_debug: Backtrace
/tmp/v_1000/../../../../../../home/vox/Documents/v/vlib/builtin/array.v:384: by array_get
/tmp/v_1000/../../../../../../home/vox/.vmodules/c2v/c2v.v:875: by main__C2V_record_decl
/tmp/v_1000/../../../../../../home/vox/.vmodules/c2v/c2v.v:2316: by main__C2V_top_level
/tmp/v_1000/../../../../../../home/vox/.vmodules/c2v/c2v.v:2271: by main__C2V_translate_file
/tmp/v_1000/../../../../../../home/vox/.vmodules/c2v/c2v.v:2196: by main__main
/tmp/v_1000/../../../../../../tmp/v_1000/c2v.tmp.c:17589: by main
C2V failed to translate the C files. Please report it via GitHub.
Link to stivale2
V version: 0.3.1 1c63ce4
OS: Ubuntu 22.04.1 LTS
What did you do?
Execute command v translate Kml.c
What did you expect to see?
Generated code in v
What did you see instead?
Compiling c2v ...
================ V panic ================
module: main
function: find_clang_in_path()
message: cannot find clang in PATH
file: ./c2v.v:96
v hash: 4bd49a0
=========================================
/tmp/v_1000/../../../../../../opt/v/vlib/builtin/builtin.c.v:53: at panic_debug: Backtrace
/tmp/v_1000/../../../../../../home/cristovao/.vmodules/c2v/c2v.v:96: by main__find_clang_in_path
/tmp/v_1000/../../../../../../tmp/v_1000/c2v.tmp.c:17579: by _vinit
/tmp/v_1000/../../../../../../tmp/v_1000/c2v.tmp.c:17591: by main
C2V command: '/home/cristovao/.vmodules/c2v/c2v' 'Kml.c'
C2V failed to translate the C files. Please report it via GitHub.
I downloaded v.c
from vc
repo and then: v translate v.c
getting the following output:
C to V translator 0.3.1
translating v.c ... V panic: 2352798600 cast to int results in -1942168696)
v hash: a75a12e
/tmp/v_1000/../../../../../../path/to/vlang/vlib/builtin/builtin.c.v:104: at _v_panic: Backtrace
/tmp/v_1000/../../../../../../path/to/.vmodules/c2v/c2v.v:1983: by main__C2V_translate_file
/tmp/v_1000/../../../../../../path/to/.vmodules/c2v/c2v.v:1940: by main__main
/tmp/v_1000/../../../../../../tmp/v_1000/c2v.tmp.c:17592: by main
C2V command: '/path/to/.vmodules/c2v/c2v' 'v.c'
C2V failed to translate the C files. Please report it via GitHub.
For now, when using translate wrapper
command on .h file, it creates methods without comments. I think copying original comments will be a good idea in some cases.
I think a flag preserve-comments
need to be used, and this feature will be turned off by default.
What do you think?
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
translates to:
[translated]
module main
type Size_t = i64
type Ssize_t = i64
type Rsize_t = Usize
type Intptr_t = i64
type Uintptr_t = i64
type Ptrdiff_t = i64
type Wchar_t = U16
type Wint_t = U16
type Wctype_t = U16
type Errno_t = int
type Time_t = Time64_t
type Pthreadlocinfo = &Threadlocaleinfo*
type Pthreadmbcinfo = &Threadmbcinfo*
struct Locale_tstruct {
locinfo Pthreadlocinfo
mbcinfo Pthreadmbcinfo
}
type _locale_t = &Localeinfo_*
struct LC_ID {
wLanguage u16
wCountry u16
wCodePage u16
}
type LPLC_ID = &TagLC_ID
struct Threadlocinfo {
_locale_pctype &u16
_locale_mb_cur_max int
_locale_lc_codepage u32
}
struct FILE {
_Placeholder voidptr
}
type _off_t = int
type Off32_t = int
type _off64_t = i64
type Off64_t = i64
type Off_t = Off32_t
type Fpos_t = i64
fn main() {
C.printf(c'Hello World!\n')
return
}
which cannot compile due to:
main.v:15:40: notice: script mode started here
13 | type Errno_t = int
14 | type Time_t = Time64_t
15 | type Pthreadlocinfo = &Threadlocaleinfo*
| ^
16 | type Pthreadmbcinfo = &Threadmbcinfo*
17 | struct Locale_tstruct {
main.v:16:1: error: all definitions must occur before code in script mode
14 | type Time_t = Time64_t
15 | type Pthreadlocinfo = &Threadlocaleinfo*
16 | type Pthreadmbcinfo = &Threadmbcinfo*
| ~~~~
17 | struct Locale_tstruct {
18 | locinfo Pthreadlocinfo
C to V translator 0.3.1
translating tool/varint.c ... tool/varint.v:70:2: error: unexpected name `j`, expecting `;`
68 | buf [0] &= 127
69 | for i = 0 , n - 1
70 | j = i = 0 ; j >= 0 ; j -- , i ++ {
| ^
71 | p [i] = buf [j]
72 | }
Internal vfmt error while formatting file: tool/varint.v.
Encountered a total of: 1 errors.
took 79 ms ; output .v file: tool/varint.v
Translated 1 files in 79 ms.
C2V - c08add0
V - 0.2.4 (ccc3271493019feb13ed1c96b035199e159fe863)
.h file - https://github.com/SanderMertens/flecs/blob/master/flecs.h
fmt error
flecs.v:412:11: error: use `?` instead of `?void`
410 | subjects [4]Ecs_entity_t
411 | sizes [4]Ecs_size_t
412 | ptrs [4]&void
| ~~~~
413 | match_indices [4]int
414 | variables [4]Ecs_var_t
Internal vfmt error while formatting file: flecs.v.
Encountered a total of: 1 errors.
C to V translator 0.3.1
translating tool/sqldiff.c ... tool/sqldiff.v:1145:17: error: this binary number has unsuitable digit `e`
1143 | iblock := 0
1144 |
1145 | bestcnt := 0
| ^
1146 | bestofst := 0bestlitsz := 0
1147 | hash_init(&h, &zout [base] )
Internal vfmt error while formatting file: tool/sqldiff.v.
Encountered a total of: 1 errors.
took 347 ms ; output .v file: tool/sqldiff.v
Translated 1 files in 347 ms.
C2V - c08add0
V - 0.2.4 (ccc3271493019feb13ed1c96b035199e159fe863)
.h file - https://github.com/SanderMertens/flecs/blob/master/flecs.h
cat flecs.v
File: flecs.v
[translated]
module <- no module name!
type Ecs_flags8_t = u8
type Ecs_flags16_t = Uint16_t
type Ecs_flags32_t = u32
type Ecs_flags64_t = i64
type Ecs_size_t = int
type Ecs_comparator_t = fn (voidptr, voidptr) int
type Ecs_map_key_t = i64
struct Ecs_bucket_entry_t {
next &Ecs_bucket_entry_t
key Ecs_map_key_t
}
struct Ecs_block_allocator_block_t {
memory voidptr
next &Ecs_block_allocator_block_t
}
struct Ecs_block_allocator_chunk_header_t {
next &Ecs_block_allocator_chunk_header_t
}
...
[translated]
attribute and module main
)doom_v/m_menu.v:1137:18: error: invalid expression: unexpected token `=`
1135 | key = 13
1136 | }
1137 | else {
| ^
translating ./m_menu.c ... took 930 ms ; output .v file: ./doom_v/m_menu.v
1138 | if currentMenu == &SaveDef {
1139 | joypadSave = true
Internal vfmt error while formatting file: /home/runner/code/doom/chocolate-doom/src/doom/./doom_v/m_menu.v.
Encountered a total of: 1 errors.
This is on actual c2v repo, doom-regressions GitHub Action, step "Translate the whole game in project/folder mode"
I suppose this is not that should happen
By Jalon
Not sure if I am doing something wrong, but when compiling c2v I get this error:
$ v translate test.c
Compiling c2v ...
================ V panic ================
module: main
function: find_clang_in_path()
message: cannot find clang in PATH
file: ./c2v.v:98
v hash: 5cd5d55
=========================================
C:/Users/User/AppData/Local/Temp/v_0/../../../../../..C:\Users\User\V_FOLDER\v\vlib\builtin\builtin.c.v:53: at panic_debug: Backtrace
C:/Users/User/AppData/Local/Temp/v_0/../../../../../..C:\Users\User\.vmodules\c2v\c2v.v:98: by main__find_clang_in_path
C:/Users/User/AppData/Local/Temp/v_0/../../../../../..C:\Users\User\AppData\Local\Temp\v_0\c2v.tmp.c:17576: by _vinit
C:/Users/User/AppData/Local/Temp/v_0/../../../../../..C:\Users\User\AppData\Local\Temp\v_0\c2v.tmp.c:17596: by wmain
0056d868 : by ???
0056d9cb : by ???
7ffd793c7034 : by ???
C2V failed to translate the C files. Please report it via GitHub.
As you can see the error is because of this. I guess it's because my clang command is clang.exe
(screenshot) and not just clang
, but I don't know.
I tried adding 'clang.exe'
to the array but it gives another error (don't know if it's related or not).
$ cat test.c
#include <stdio.h>
int main() {
puts("Test...\n");
}
$ v translate test.c
Compiling c2v ...
C to V translator 0.3.1
translating test.c ... The system cannot find the path specified.
took 422 ms ; output .v file: test.v
Translated 1 files in 422 ms.
$ cat test.v
[translated]
module main
type Uintptr_t = i64
type Va_list = &i8
type Size_t = i64
type Ptrdiff_t = i64
type Intptr_t = i64
type Wchar_t = U16
type Errno_t = int
type Wint_t = U16
type Wctype_t = U16
struct Crt_locale_data_public {
_locale_pctype &u16
_locale_mb_cur_max int
_locale_lc_codepage u32
}
struct Crt_locale_pointers {
locinfo &crt_locale_data
mbcinfo &crt_multibyte_data
}
type _locale_t = &crt_locale_pointers
struct Mbstatet {
_Wchar u32
_Byte u16
_State u16
}
type Mbstate_t = Mbstatet
type Time_t = Time64_t
type Rsize_t = Usize
struct FILE {
_Placeholder voidptr
}
type Fpos_t = i64
fn main() {
C.puts(c'Test...\n')
}
Group source code in the src folder, looking for code in this folder was implement in V
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.