@@ -479,75 +479,89 @@ typedef __builtin_va_list va_list;
479479 #define va_copy(dest, src) __builtin_va_copy(dest, src)
480480#endif
481481#endif
482- int vfprintf(FILE *stream, const char *format, va_list ap);
483- int vsnprintf(char *str, size_t size, const char *format, va_list ap);
484- int fprintf(FILE *stream, const char *format, ...);
485- int printf(const char *format, ...);
486- int snprintf(char *str, size_t size, const char *format, ...);
487- int sprintf(char *str, const char *format, ...);
488- int sscanf(const char *str, const char *format, ...);
489- int scanf(const char *format, ...);
490- int puts(const char *str);
491- void perror(const char *str);
492- int fputs(const char *str, FILE *stream);
493- int getchar(void);
494- int putchar(int ch);
495- int getc(FILE *stream);
496- int fgetc(FILE *stream);
497- int ungetc(int ch, FILE *stream);
498- int fflush(FILE *stream);
499- int feof(FILE *stream);
500- int ferror(FILE *stream);
501- void clearerr(FILE *stream);
502- int setvbuf(FILE *stream, char *buf, int mode, size_t size);
503- long ftell(FILE *stream);
504- void rewind(FILE *stream);
505- FILE *fopen(const char *filename, const char *mode);
506- FILE *fdopen(int fd, const char *mode);
507- FILE *freopen(const char *filename, const char *mode, FILE *stream);
508- int fileno(FILE *stream);
509- size_t fread(void *ptr, size_t size, size_t items, FILE *stream);
510- size_t fwrite(const void *ptr, size_t size, size_t items, FILE *stream);
511- char *fgets(char *str, int size, FILE *stream);
512- int fclose(FILE *stream);
513- FILE *popen(const char *command, const char *mode);
514- int pclose(FILE *stream);
515- void *malloc(size_t size);
516- void *calloc(size_t nitems, size_t size);
517- void *realloc(void *ptr, size_t size);
518- void *aligned_alloc(size_t alignment, size_t size);
519- void free(void *ptr);
520- int rand(void);
521- void srand(unsigned int seed);
522- int atexit(void (*cb)(void));
523- void exit(int status);
524- int atoi(const char *str);
525- double atof(const char *str);
526- char *getenv(const char *name);
527- int setenv(const char *name, const char *value, int overwrite);
528- int unsetenv(const char *name);
529- int system(const char *command);
530- int remove(const char *path);
531- int rename(const char *old_path, const char *new_path);
532- char *realpath(const char *path, char *resolved_path);
533- int mkstemp(char *stemplate);
534- void qsort(void *base, size_t items, size_t item_size, qsort_callback_func cb);
535- int strcmp(const char *left, const char *right);
536- size_t strlen(const char *str);
537- char *strerror(int errnum);
538- void *memcpy(void *dest, const void *src, size_t n);
539- void *memmove(void *dest, const void *src, size_t n);
540- void *memset(void *dest, int ch, size_t n);
541- int memcmp(const void *left, const void *right, size_t n);
542- void *memchr(const void *str, int c, size_t n);
543- char *strchr(const char *str, int c);
544- char *strrchr(const char *str, int c);
545- int fseek(FILE *stream, long offset, int whence);
546- isize getline(char **lineptr, size_t *n, FILE *stream);
482+ #if defined(_MSC_VER) && !defined(__clang__)
483+ #define V_CRT_CALL VCALLCONV(cdecl)
484+ #else
485+ #define V_CRT_CALL
486+ #endif
487+ int V_CRT_CALL vfprintf(FILE *stream, const char *format, va_list ap);
488+ int V_CRT_CALL vsnprintf(char *str, size_t size, const char *format, va_list ap);
489+ int V_CRT_CALL fprintf(FILE *stream, const char *format, ...);
490+ int V_CRT_CALL printf(const char *format, ...);
491+ int V_CRT_CALL snprintf(char *str, size_t size, const char *format, ...);
492+ int V_CRT_CALL sprintf(char *str, const char *format, ...);
493+ int V_CRT_CALL sscanf(const char *str, const char *format, ...);
494+ int V_CRT_CALL scanf(const char *format, ...);
495+ int V_CRT_CALL puts(const char *str);
496+ void V_CRT_CALL perror(const char *str);
497+ int V_CRT_CALL fputs(const char *str, FILE *stream);
498+ int V_CRT_CALL getchar(void);
499+ int V_CRT_CALL putchar(int ch);
500+ int V_CRT_CALL getc(FILE *stream);
501+ int V_CRT_CALL fgetc(FILE *stream);
502+ int V_CRT_CALL ungetc(int ch, FILE *stream);
503+ int V_CRT_CALL fflush(FILE *stream);
504+ int V_CRT_CALL feof(FILE *stream);
505+ int V_CRT_CALL ferror(FILE *stream);
506+ void V_CRT_CALL clearerr(FILE *stream);
507+ int V_CRT_CALL setvbuf(FILE *stream, char *buf, int mode, size_t size);
508+ long V_CRT_CALL ftell(FILE *stream);
509+ void V_CRT_CALL rewind(FILE *stream);
510+ FILE * V_CRT_CALL fopen(const char *filename, const char *mode);
511+ FILE * V_CRT_CALL fdopen(int fd, const char *mode);
512+ FILE * V_CRT_CALL freopen(const char *filename, const char *mode, FILE *stream);
513+ int V_CRT_CALL fileno(FILE *stream);
514+ size_t V_CRT_CALL fread(void *ptr, size_t size, size_t items, FILE *stream);
515+ size_t V_CRT_CALL fwrite(const void *ptr, size_t size, size_t items, FILE *stream);
516+ char * V_CRT_CALL fgets(char *str, int size, FILE *stream);
517+ int V_CRT_CALL fclose(FILE *stream);
518+ FILE * V_CRT_CALL popen(const char *command, const char *mode);
519+ int V_CRT_CALL pclose(FILE *stream);
520+ void * V_CRT_CALL malloc(size_t size);
521+ void * V_CRT_CALL calloc(size_t nitems, size_t size);
522+ void * V_CRT_CALL realloc(void *ptr, size_t size);
523+ void * V_CRT_CALL aligned_alloc(size_t alignment, size_t size);
524+ void V_CRT_CALL free(void *ptr);
525+ int V_CRT_CALL rand(void);
526+ void V_CRT_CALL srand(unsigned int seed);
527+ int V_CRT_CALL atexit(void (*cb)(void));
528+ void V_CRT_CALL exit(int status);
529+ int V_CRT_CALL atoi(const char *str);
530+ double V_CRT_CALL atof(const char *str);
531+ char * V_CRT_CALL getenv(const char *name);
532+ int V_CRT_CALL setenv(const char *name, const char *value, int overwrite);
533+ int V_CRT_CALL unsetenv(const char *name);
534+ int V_CRT_CALL system(const char *command);
535+ int V_CRT_CALL remove(const char *path);
536+ int V_CRT_CALL rename(const char *old_path, const char *new_path);
537+ char * V_CRT_CALL realpath(const char *path, char *resolved_path);
538+ int V_CRT_CALL mkstemp(char *stemplate);
539+ void V_CRT_CALL qsort(void *base, size_t items, size_t item_size, qsort_callback_func cb);
540+ int V_CRT_CALL strcmp(const char *left, const char *right);
541+ size_t V_CRT_CALL strlen(const char *str);
542+ char * V_CRT_CALL strerror(int errnum);
543+ void * V_CRT_CALL memcpy(void *dest, const void *src, size_t n);
544+ void * V_CRT_CALL memmove(void *dest, const void *src, size_t n);
545+ void * V_CRT_CALL memset(void *dest, int ch, size_t n);
546+ int V_CRT_CALL memcmp(const void *left, const void *right, size_t n);
547+ void * V_CRT_CALL memchr(const void *str, int c, size_t n);
548+ char * V_CRT_CALL strchr(const char *str, int c);
549+ char * V_CRT_CALL strrchr(const char *str, int c);
550+ int V_CRT_CALL fseek(FILE *stream, long offset, int whence);
551+ isize V_CRT_CALL getline(char **lineptr, size_t *n, FILE *stream);
547552#if defined(_WIN32) || defined(_WIN64)
548- int _fileno(FILE *stream);
549- FILE *_wfopen(const unsigned short *filename, const unsigned short *mode);
550- int _wremove(const unsigned short *path);
553+ int V_CRT_CALL _fileno(FILE *stream);
554+ FILE * V_CRT_CALL _wfopen(const unsigned short *filename, const unsigned short *mode);
555+ int V_CRT_CALL _wremove(const unsigned short *path);
556+ #endif
557+ #if defined(_MSC_VER) && !defined(__clang__)
558+ #ifndef _TRUNCATE
559+ #define _TRUNCATE ((size_t)-1)
560+ #endif
561+ int V_CRT_CALL _vscprintf(const char *format, va_list ap);
562+ int V_CRT_CALL _vsnprintf_s(char *buffer, size_t size, size_t count, const char *format, va_list ap);
563+ unsigned short * V_CRT_CALL _wgetenv(const unsigned short *varname);
564+ int V_CRT_CALL _wputenv(const unsigned short *envstring);
551565#endif
552566#ifndef _IOFBF
553567 #define _IOFBF 0
@@ -579,6 +593,7 @@ enum {
579593 #endif
580594};
581595#endif
596+ #undef V_CRT_CALL
582597#if defined(__TINYC__)
583598// https://lists.nongnu.org/archive/html/tinycc-devel/2025-10/msg00007.html
584599// gnu headers use to #define __attribute__ to empty for non-gcc compilers
0 commit comments