Skip to content

Commit bdaf88c

Browse files
authored
cgen: complete Windows CRT stream declarations (#27948)
1 parent 2373b3a commit bdaf88c

4 files changed

Lines changed: 57 additions & 1 deletion

File tree

vlib/v/gen/c/cheaders.v

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,8 +667,14 @@ V_CRT_LINKAGE char * V_CRT_CALL strstr(const char *haystack, const char *needle)
667667
V_CRT_LINKAGE int V_CRT_CALL fseek(FILE *stream, long offset, int whence);
668668
V_CRT_LINKAGE isize V_CRT_CALL getline(char **lineptr, size_t *n, FILE *stream);
669669
#if defined(_WIN32) || defined(_WIN64)
670+
V_CRT_LINKAGE int V_CRT_CALL _fseeki64(FILE *stream, i64 offset, int whence);
671+
V_CRT_LINKAGE int V_CRT_CALL fgetpos(FILE *stream, i64 *pos);
670672
V_CRT_LINKAGE int V_CRT_CALL _fileno(FILE *stream);
671673
V_CRT_LINKAGE FILE * V_CRT_CALL _wfopen(const unsigned short *filename, const unsigned short *mode);
674+
V_CRT_LINKAGE int V_CRT_CALL freopen_s(FILE **new_stream, const char *filename, const char *mode, FILE *stream);
675+
V_CRT_LINKAGE FILE * V_CRT_CALL _wfreopen(const unsigned short *filename, const unsigned short *mode, FILE *stream);
676+
V_CRT_LINKAGE FILE * V_CRT_CALL _wpopen(const unsigned short *command, const unsigned short *mode);
677+
V_CRT_LINKAGE int V_CRT_CALL _pclose(FILE *stream);
672678
V_CRT_LINKAGE int V_CRT_CALL _wremove(const unsigned short *path);
673679
V_CRT_LINKAGE void * V_CRT_CALL _aligned_malloc(size_t size, size_t alignment);
674680
V_CRT_LINKAGE void * V_CRT_CALL _aligned_realloc(void *memory, size_t size, size_t alignment);

vlib/v/gen/c/cheaders_manual_stdlib_decls_test.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fn test_default_c_prelude_uses_manual_stdio_stdlib_string_and_stdarg_decls() {
2222
assert generated_c.contains('V_CRT_LINKAGE int V_CRT_CALL vfprintf(FILE *stream, const char *format, va_list ap);'), generated_c
2323

2424
assert generated_c.contains('V_CRT_LINKAGE int V_CRT_CALL vsnprintf(char *str, size_t size, const char *format, va_list ap);'), generated_c
25-
assert generated_c.contains('#if defined(_WIN32) || defined(_WIN64)\nV_CRT_LINKAGE int V_CRT_CALL _fileno(FILE *stream);\nV_CRT_LINKAGE FILE * V_CRT_CALL _wfopen(const unsigned short *filename, const unsigned short *mode);\nV_CRT_LINKAGE int V_CRT_CALL _wremove(const unsigned short *path);\nV_CRT_LINKAGE void * V_CRT_CALL _aligned_malloc(size_t size, size_t alignment);\nV_CRT_LINKAGE void * V_CRT_CALL _aligned_realloc(void *memory, size_t size, size_t alignment);\nV_CRT_LINKAGE void V_CRT_CALL _aligned_free(void *memory);\nV_CRT_LINKAGE unsigned short * V_CRT_CALL _wgetenv(const unsigned short *varname);\nV_CRT_LINKAGE int V_CRT_CALL _wputenv(const unsigned short *envstring);\n#endif'), generated_c
25+
assert generated_c.contains('#if defined(_WIN32) || defined(_WIN64)\nV_CRT_LINKAGE int V_CRT_CALL _fseeki64(FILE *stream, i64 offset, int whence);\nV_CRT_LINKAGE int V_CRT_CALL fgetpos(FILE *stream, i64 *pos);\nV_CRT_LINKAGE int V_CRT_CALL _fileno(FILE *stream);\nV_CRT_LINKAGE FILE * V_CRT_CALL _wfopen(const unsigned short *filename, const unsigned short *mode);\nV_CRT_LINKAGE int V_CRT_CALL freopen_s(FILE **new_stream, const char *filename, const char *mode, FILE *stream);\nV_CRT_LINKAGE FILE * V_CRT_CALL _wfreopen(const unsigned short *filename, const unsigned short *mode, FILE *stream);\nV_CRT_LINKAGE FILE * V_CRT_CALL _wpopen(const unsigned short *command, const unsigned short *mode);\nV_CRT_LINKAGE int V_CRT_CALL _pclose(FILE *stream);\nV_CRT_LINKAGE int V_CRT_CALL _wremove(const unsigned short *path);\nV_CRT_LINKAGE void * V_CRT_CALL _aligned_malloc(size_t size, size_t alignment);\nV_CRT_LINKAGE void * V_CRT_CALL _aligned_realloc(void *memory, size_t size, size_t alignment);\nV_CRT_LINKAGE void V_CRT_CALL _aligned_free(void *memory);\nV_CRT_LINKAGE unsigned short * V_CRT_CALL _wgetenv(const unsigned short *varname);\nV_CRT_LINKAGE int V_CRT_CALL _wputenv(const unsigned short *envstring);\n#endif'), generated_c
2626

2727
assert generated_c.contains('V_CRT_LINKAGE void V_CRT_CALL perror(const char *str);'), generated_c
2828
assert generated_c.contains('V_CRT_LINKAGE int V_CRT_CALL mkstemp(char *stemplate);'), generated_c
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// vtest build: windows && tinyc
2+
// vtest vflags: -cc tcc -no-retry-compilation
3+
import os
4+
5+
fn test_windows_tcc_file_reopen() {
6+
$if windows {
7+
$if !tinyc {
8+
$compile_error('this regression must be compiled with TinyCC')
9+
}
10+
assert @CCOMPILER == 'tinyc'
11+
tmp_dir := os.join_path(os.vtmp_dir(), 'windows_tcc_file_reopen_${os.getpid()}')
12+
os.mkdir_all(tmp_dir)!
13+
defer {
14+
os.rmdir_all(tmp_dir) or {}
15+
}
16+
original_path := os.join_path(tmp_dir, 'original.txt')
17+
reopened_path := os.join_path(tmp_dir, 'reopened.txt')
18+
os.write_file(original_path, 'before')!
19+
os.write_file(reopened_path, 'after')!
20+
21+
mut file := os.open(original_path)!
22+
assert file.read_bytes(6).bytestr() == 'before'
23+
file.reopen(reopened_path, 'rb')!
24+
assert file.read_bytes(5).bytestr() == 'after'
25+
file.close()
26+
}
27+
}
28+
29+
fn test_windows_tcc_command_pipe_lifecycle() {
30+
$if windows {
31+
$if !tinyc {
32+
$compile_error('this regression must be compiled with TinyCC')
33+
}
34+
assert @CCOMPILER == 'tinyc'
35+
mut command := os.start_new_command('echo windows-tcc-command-pipe')!
36+
mut output := ''
37+
for !command.eof {
38+
output += command.read_line()
39+
}
40+
command.close()!
41+
assert output.trim_space() == 'windows-tcc-command-pipe', output
42+
assert command.exit_code == 0
43+
}
44+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// vtest build: windows && tinyc
2+
// vtest vflags: -cc tcc -no-retry-compilation -subsystem windows
3+
4+
fn test_windows_tcc_gui_stdio_setup_compiles() {
5+
assert true
6+
}

0 commit comments

Comments
 (0)