VSF Documented
stdio.h
Go to the documentation of this file.
1#ifndef __SIMPLE_LIBC_STDIO_H__
2#define __SIMPLE_LIBC_STDIO_H__
3
5
6#if VSF_LINUX_CFG_RELATIVE_PATH == ENABLED && VSF_LINUX_USE_SIMPLE_LIBC == ENABLED
7# include "./stddef.h"
8// for off64_t
9# include "../sys/types.h"
10#else
11# include <stddef.h>
12// for off64_t
13# include <sys/types.h>
14#endif
15
16#include <stdarg.h>
17#include <stdint.h>
18
24#define __USE_LOCAL_STDBOOL__
26
27#if __IS_COMPILER_LLVM__
28# pragma clang diagnostic push
29# pragma clang diagnostic ignored "-Wbuiltin-requires-header"
30# pragma clang diagnostic ignored "-Wincompatible-library-redeclaration"
31# pragma clang diagnostic ignored "-Winconsistent-dllimport"
32#endif
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38// in cstdio, common macro overrides will be undefined
39#if VSF_LINUX_LIBC_CFG_WRAPPER == ENABLED
40#define ferror VSF_LINUX_LIBC_WRAPPER(ferror)
41#define clearerr VSF_LINUX_LIBC_WRAPPER(clearerr)
42#define getc VSF_LINUX_LIBC_WRAPPER(getc)
43#define getchar VSF_LINUX_LIBC_WRAPPER(getchar)
44#define putc VSF_LINUX_LIBC_WRAPPER(putc)
45#define putchar VSF_LINUX_LIBC_WRAPPER(putchar)
46#define ungetc VSF_LINUX_LIBC_WRAPPER(ungetc)
47#define feof VSF_LINUX_LIBC_WRAPPER(feof)
48
49
50#define fopen VSF_LINUX_LIBC_WRAPPER(fopen)
51#define fdopen VSF_LINUX_LIBC_WRAPPER(fdopen)
52#define freopen VSF_LINUX_LIBC_WRAPPER(freopen)
53#define fclose VSF_LINUX_LIBC_WRAPPER(fclose)
54#define fileno VSF_LINUX_LIBC_WRAPPER(fileno)
55#define fseek VSF_LINUX_LIBC_WRAPPER(fseek)
56#define fseeko VSF_LINUX_LIBC_WRAPPER(fseeko)
57#define fseeko64 VSF_LINUX_LIBC_WRAPPER(fseeko64)
58#define ftell VSF_LINUX_LIBC_WRAPPER(ftell)
59#define ftello VSF_LINUX_LIBC_WRAPPER(ftello)
60#define ftello64 VSF_LINUX_LIBC_WRAPPER(ftello64)
61#define rewind VSF_LINUX_LIBC_WRAPPER(rewind)
62#define fgetpos VSF_LINUX_LIBC_WRAPPER(fgetpos)
63#define fsetpos VSF_LINUX_LIBC_WRAPPER(fsetpos)
64#define fgetpos64 VSF_LINUX_LIBC_WRAPPER(fgetpos64)
65#define fsetpos64 VSF_LINUX_LIBC_WRAPPER(fsetpos64)
66#define fwrite VSF_LINUX_LIBC_WRAPPER(fwrite)
67#define fread VSF_LINUX_LIBC_WRAPPER(fread)
68#define fflush VSF_LINUX_LIBC_WRAPPER(fflush)
69#define fgetc VSF_LINUX_LIBC_WRAPPER(fgetc)
70#define fgets VSF_LINUX_LIBC_WRAPPER(fgets)
71#define gets VSF_LINUX_LIBC_WRAPPER(gets)
72#define fputc VSF_LINUX_LIBC_WRAPPER(fputc)
73#define fputs VSF_LINUX_LIBC_WRAPPER(fputs)
74#define puts VSF_LINUX_LIBC_WRAPPER(puts)
75#define printf VSF_LINUX_LIBC_WRAPPER(printf)
76#define vprintf VSF_LINUX_LIBC_WRAPPER(vprintf)
77#define vfprintf VSF_LINUX_LIBC_WRAPPER(vfprintf)
78#define vdprintf VSF_LINUX_LIBC_WRAPPER(vdprintf)
79#define fprintf VSF_LINUX_LIBC_WRAPPER(fprintf)
80#define dprintf VSF_LINUX_LIBC_WRAPPER(dprintf)
81#define fiprintf VSF_LINUX_LIBC_WRAPPER(fiprintf)
82#define fscanf VSF_LINUX_LIBC_WRAPPER(fscanf)
83#define vfscanf VSF_LINUX_LIBC_WRAPPER(vfscanf)
84#define perror VSF_LINUX_LIBC_WRAPPER(perror)
85#define setvbuf VSF_LINUX_LIBC_WRAPPER(setvbuf)
86#define rename VSF_LINUX_LIBC_WRAPPER(rename)
87#define renameat VSF_LINUX_LIBC_WRAPPER(renameat)
88
89#define tmpfile VSF_LINUX_LIBC_WRAPPER(tmpfile)
90#define tmpnam VSF_LINUX_LIBC_WRAPPER(tmpnam)
91
92// usually there is no need to wrap snprintf/vsnprintf.
93// __VSF_LINUX_LIBC_STDIO_WRAPPER_SNPRINTF will be enabled on some platform like windows.
94#if __VSF_LINUX_LIBC_STDIO_WRAPPER_SNPRINTF == ENABLED
95# define vsnprintf VSF_LINUX_LIBC_WRAPPER(vsnprintf)
96# define snprintf VSF_LINUX_LIBC_WRAPPER(snprintf)
97#endif
98
99#if defined(_GNU_SOURCE)
100#define getline VSF_LINUX_LIBC_WRAPPER(getline)
101#endif
102#elif defined(__WIN__) && !defined(__VSF_APPLET__)
103// avoid conflicts with APIs in ucrt
104#define fopen VSF_LINUX_LIBC_WRAPPER(fopen)
105#define freopen VSF_LINUX_LIBC_WRAPPER(freopen)
106#define fclose VSF_LINUX_LIBC_WRAPPER(fclose)
107#define fseek VSF_LINUX_LIBC_WRAPPER(fseek)
108#define ftell VSF_LINUX_LIBC_WRAPPER(ftell)
109#define fflush VSF_LINUX_LIBC_WRAPPER(fflush)
110#define putc VSF_LINUX_LIBC_WRAPPER(putc)
111#define putchar VSF_LINUX_LIBC_WRAPPER(putchar)
112#define fputc VSF_LINUX_LIBC_WRAPPER(fputc)
113#define fprintf VSF_LINUX_LIBC_WRAPPER(fprintf)
114#define vsnprintf VSF_LINUX_LIBC_WRAPPER(vsnprintf)
115#define snprintf VSF_LINUX_LIBC_WRAPPER(snprintf)
116#endif
117
120
121// fpos_t here is not compatible with fpos_t in DLib, so _FPOSOFF MUST be redefined
122#if __IS_COMPILER_IAR__
123# undef _FPOSOFF
124# define _FPOSOFF(__FPOS) (__FPOS)
125#endif
126
127#ifdef __WIN__
128# define sprintf_s snprintf
129# define _scprintf printf
130
131static inline unsigned char swprintf_s(const wchar_t *c, ...)
132{
133 return 0;
134}
135static inline unsigned char _scwprintf(const wchar_t *c, ...)
136{
137 return 0;
138}
139#endif
140
141typedef int FILE;
142// use extern functions with no dependent on shell.linux
143#define stdin __vsf_linux_stdin()
144#define stdout __vsf_linux_stdout()
145#define stderr __vsf_linux_stderr()
146
147#define BUFSIZ 512
148#define L_tmpnam 260
149
150#define SEEK_SET 0 // same value as VSF_FILE_SEEK_SET
151#define SEEK_CUR 1 // same value as VSF_FILE_SEEK_CUR
152#define SEEK_END 2 // same value as VSF_FILE_SEEK_END
153
154#define EOF -1
155
156#define _IOFBF 0x0000
157#define _IOLBF 0x0040
158#define _IONBF 0x0004
159
160#ifndef FILENAME_MAX
161# define FILENAME_MAX 128
162#endif
163
164#if VSF_LINUX_APPLET_USE_LIBC_STDIO == ENABLED
167
171
173
184
189
196
216
219
222
226
233
236
238
243
246
249# ifndef __VSF_APPLET__
251# endif
252#endif
253
254#if defined(__VSF_APPLET__) && (defined(__VSF_APPLET_LIB__) || defined(__VSF_APPLET_LINUX_LIBC_STDIO_LIB__))\
255 && VSF_APPLET_CFG_ABI_PATCH != ENABLED && VSF_LINUX_APPLET_USE_LIBC_STDIO == ENABLED
256
257#ifndef VSF_LINUX_APPLET_LIBC_STDIO_VPLT
258# if VSF_LINUX_USE_APPLET == ENABLED
259# define VSF_LINUX_APPLET_LIBC_STDIO_VPLT \
260 ((vsf_linux_libc_stdio_vplt_t *)(VSF_LINUX_APPLET_VPLT->libc_stdio_vplt))
261# else
262# define VSF_LINUX_APPLET_LIBC_STDIO_VPLT \
263 ((vsf_linux_libc_stdio_vplt_t *)vsf_vplt((void *)0))
264# endif
265#endif
266
267#define VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(__NAME) \
268 VSF_APPLET_VPLT_ENTRY_FUNC_ENTRY(VSF_LINUX_APPLET_LIBC_STDIO_VPLT, __NAME)
269#define VSF_LINUX_APPLET_LIBC_STDIO_IMP(...) \
270 VSF_APPLET_VPLT_ENTRY_FUNC_IMP(VSF_LINUX_APPLET_LIBC_STDIO_VPLT, __VA_ARGS__)
271
272VSF_LINUX_APPLET_LIBC_STDIO_IMP(__vsf_linux_stdin, FILE *, void) {
274 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(__vsf_linux_stdin)();
275}
276VSF_LINUX_APPLET_LIBC_STDIO_IMP(__vsf_linux_stdout, FILE *, void) {
278 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(__vsf_linux_stdout)();
279}
280VSF_LINUX_APPLET_LIBC_STDIO_IMP(__vsf_linux_stderr, FILE *, void) {
282 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(__vsf_linux_stderr)();
283}
284VSF_LINUX_APPLET_LIBC_STDIO_IMP(perror, void, const char *str) {
286 VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(perror)(str);
287}
288VSF_LINUX_APPLET_LIBC_STDIO_IMP(setbuf, void, FILE *f, char *buf) {
290 VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(setbuf)(f, buf);
291}
292VSF_LINUX_APPLET_LIBC_STDIO_IMP(setbuffer, void, FILE *f, char *buf, size_t size) {
294 VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(setbuffer)(f, buf, size);
295}
296VSF_LINUX_APPLET_LIBC_STDIO_IMP(setlinebuf, void, FILE *f) {
298 VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(setlinebuf)(f);
299}
300VSF_LINUX_APPLET_LIBC_STDIO_IMP(setvbuf, int, FILE *f, char *buf, int mode, size_t size) {
302 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(setvbuf)(f, buf, mode, size);
303}
304VSF_LINUX_APPLET_LIBC_STDIO_IMP(putchar, int, int ch) {
306 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(putchar)(ch);
307}
308VSF_LINUX_APPLET_LIBC_STDIO_IMP(getchar, int, void) {
310 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(getchar)();
311}
312VSF_LINUX_APPLET_LIBC_STDIO_IMP(fgetc, int, FILE *f) {
314 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fgetc)(f);
315}
316VSF_LINUX_APPLET_LIBC_STDIO_IMP(fputc, int, int ch, FILE *f) {
318 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fputc)(ch, f);
319}
320VSF_LINUX_APPLET_LIBC_STDIO_IMP(getc, int, FILE *f) {
322 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(getc)(f);
323}
324VSF_LINUX_APPLET_LIBC_STDIO_IMP(putc, int, int ch, FILE *f) {
326 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(putc)(ch, f);
327}
328VSF_LINUX_APPLET_LIBC_STDIO_IMP(ungetc, int, int c, FILE *f) {
330 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(ungetc)(c, f);
331}
332VSF_LINUX_APPLET_LIBC_STDIO_IMP(puts, int, const char *str) {
334 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(puts)(str);
335}
336VSF_LINUX_APPLET_LIBC_STDIO_IMP(fputs, int, const char *str, FILE *f) {
338 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fputs)(str, f);
339}
340VSF_LINUX_APPLET_LIBC_STDIO_IMP(fgets, char *, char *str, int n, FILE *f) {
342 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fgets)(str, n, f);
343}
344VSF_LINUX_APPLET_LIBC_STDIO_IMP(vscanf, int, const char *format, va_list ap) {
346 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vscanf)(format, ap);
347}
348VSF_LINUX_APPLET_LIBC_STDIO_IMP(vfscanf, int, FILE *f, const char *format, va_list ap) {
350 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vfscanf)(f, format, ap);
351}
352VSF_LINUX_APPLET_LIBC_STDIO_IMP(vfprintf, int, FILE *f, const char *format, va_list ap) {
354 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vfprintf)(f, format, ap);
355}
356VSF_LINUX_APPLET_LIBC_STDIO_IMP(vdprintf, int, int fd, const char *format, va_list ap) {
358 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vdprintf)(fd, format, ap);
359}
360VSF_LINUX_APPLET_LIBC_STDIO_IMP(vprintf, int, const char *format, va_list ap) {
362 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vprintf)(format, ap);
363}
364VSF_LINUX_APPLET_LIBC_STDIO_IMP(fopen, FILE *, const char *filename, const char *mode) {
366 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fopen)(filename, mode);
367}
368VSF_LINUX_APPLET_LIBC_STDIO_IMP(fdopen, FILE *, int fildes, const char *mode) {
370 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fdopen)(fildes, mode);
371}
372VSF_LINUX_APPLET_LIBC_STDIO_IMP(freopen, FILE *, const char *filename, const char *mode, FILE *f) {
374 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(freopen)(filename, mode, f);
375}
376VSF_LINUX_APPLET_LIBC_STDIO_IMP(fclose, int, FILE *f) {
378 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fclose)(f);
379}
380VSF_LINUX_APPLET_LIBC_STDIO_IMP(fileno, int, FILE *f) {
382 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fileno)(f);
383}
384VSF_LINUX_APPLET_LIBC_STDIO_IMP(fseek, int, FILE *f, long offset, int fromwhere) {
386 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fseek)(f, offset, fromwhere);
387}
388VSF_LINUX_APPLET_LIBC_STDIO_IMP(fseeko, int, FILE *f, off_t offset, int fromwhere) {
390 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fseeko)(f, offset, fromwhere);
391}
392VSF_LINUX_APPLET_LIBC_STDIO_IMP(fseeko64, int, FILE *f, off64_t offset, int fromwhere) {
394 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fseeko64)(f, offset, fromwhere);
395}
396VSF_LINUX_APPLET_LIBC_STDIO_IMP(ftell, long, FILE *f) {
398 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(ftell)(f);
399}
400VSF_LINUX_APPLET_LIBC_STDIO_IMP(ftello, off_t, FILE *f) {
402 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(ftello)(f);
403}
404VSF_LINUX_APPLET_LIBC_STDIO_IMP(ftello64, off64_t, FILE *f) {
406 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(ftello64)(f);
407}
408VSF_LINUX_APPLET_LIBC_STDIO_IMP(rewind, void, FILE *f) {
410 VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(rewind)(f);
411}
412VSF_LINUX_APPLET_LIBC_STDIO_IMP(fgetpos, int, FILE *f, fpos_t *pos) {
414 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fgetpos)(f, pos);
415}
416VSF_LINUX_APPLET_LIBC_STDIO_IMP(fsetpos, int, FILE *f, const fpos_t *pos) {
418 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fsetpos)(f, pos);
419}
420VSF_LINUX_APPLET_LIBC_STDIO_IMP(fgetpos64, int, FILE *f, fpos64_t *pos) {
422 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fgetpos64)(f, pos);
423}
424VSF_LINUX_APPLET_LIBC_STDIO_IMP(fsetpos64, int, FILE *f, const fpos64_t *pos) {
426 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fsetpos64)(f, pos);
427}
428VSF_LINUX_APPLET_LIBC_STDIO_IMP(fread, size_t, void *ptr, size_t size, size_t nmemb, FILE *f) {
430 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fread)(ptr, size, nmemb, f);
431}
432VSF_LINUX_APPLET_LIBC_STDIO_IMP(fwrite, size_t, const void *ptr, size_t size, size_t nmemb, FILE *f) {
434 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fwrite)(ptr, size, nmemb, f);
435}
436VSF_LINUX_APPLET_LIBC_STDIO_IMP(fflush, int, FILE *f) {
438 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(fflush)(f);
439}
440VSF_LINUX_APPLET_LIBC_STDIO_IMP(popen, FILE *, const char *command, const char *type) {
442 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(popen)(command, type);
443}
444VSF_LINUX_APPLET_LIBC_STDIO_IMP(pclose, int, FILE *stream) {
446 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(pclose)(stream);
447}
448VSF_LINUX_APPLET_LIBC_STDIO_IMP(rename, int, const char *old_filename, const char *new_filename) {
450 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(rename)(old_filename, new_filename);
451}
452VSF_LINUX_APPLET_LIBC_STDIO_IMP(renameat, int, int olddirfd, const char *oldpath, int newdirfd, const char *newpath) {
454 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(renameat)(olddirfd, oldpath, newdirfd, newpath);
455}
456VSF_LINUX_APPLET_LIBC_STDIO_IMP(ferror, int, FILE *f) {
458 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(ferror)(f);
459}
460VSF_LINUX_APPLET_LIBC_STDIO_IMP(clearerr, void, FILE *f) {
462 VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(clearerr)(f);
463}
464VSF_LINUX_APPLET_LIBC_STDIO_IMP(feof, int, FILE *f) {
466 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(feof)(f);
467}
468VSF_LINUX_APPLET_LIBC_STDIO_IMP(vsprintf, int, char *str, const char *format, va_list ap) {
470 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vsprintf)(str, format, ap);
471}
472VSF_LINUX_APPLET_LIBC_STDIO_IMP(vsnprintf, int, char *str, size_t size, const char* format, va_list ap) {
474 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vsnprintf)(str, size, format, ap);
475}
476VSF_LINUX_APPLET_LIBC_STDIO_IMP(vasprintf, int, char **strp, const char *format, va_list ap) {
478 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vasprintf)(strp, format, ap);
479}
480VSF_LINUX_APPLET_LIBC_STDIO_IMP(vsscanf, int, const char *str, const char *format, va_list ap) {
482 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(vsscanf)(str, format, ap);
483}
484VSF_LINUX_APPLET_LIBC_STDIO_IMP(remove, int, const char *filename) {
486 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(remove)(filename);
487}
488VSF_LINUX_APPLET_LIBC_STDIO_IMP(tmpfile, FILE *, void) {
490 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(tmpfile)();
491}
492VSF_LINUX_APPLET_LIBC_STDIO_IMP(tmpnam, char *, char *str) {
494 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(tmpnam)(str);
495}
496VSF_LINUX_APPLET_LIBC_STDIO_IMP(getline, ssize_t, char **lineptr, size_t *n, FILE *f) {
498 return VSF_LINUX_APPLET_LIBC_STDIO_ENTRY(getline)(lineptr, n, f);
499}
500
501VSF_APPLET_VPLT_FUNC_DECORATOR(scanf) int scanf(const char *format, ...) {
502 int result;
503 va_list ap;
504 va_start(ap, format);
505 result = vscanf(format, ap);
506 va_end(ap);
507 return result;
508}
509VSF_APPLET_VPLT_FUNC_DECORATOR(fscanf) int fscanf(FILE *f, const char *format, ...) {
510 int result;
511 va_list ap;
512 va_start(ap, format);
513 result = vfscanf(f, format, ap);
514 va_end(ap);
515 return result;
516}
517VSF_APPLET_VPLT_FUNC_DECORATOR(printf) int printf(const char *format, ...) {
518 int result;
519 va_list ap;
520 va_start(ap, format);
521 result = vprintf(format, ap);
522 va_end(ap);
523 return result;
524}
525VSF_APPLET_VPLT_FUNC_DECORATOR(fprintf) int fprintf(FILE *f, const char *format, ...) {
526 int result;
527 va_list ap;
528 va_start(ap, format);
529 result = vfprintf(f, format, ap);
530 va_end(ap);
531 return result;
532}
533VSF_APPLET_VPLT_FUNC_DECORATOR(dprintf) int dprintf(int fd, const char *format, ...) {
534 int result;
535 va_list ap;
536 va_start(ap, format);
537 result = vdprintf(fd, format, ap);
538 va_end(ap);
539 return result;
540}
541VSF_APPLET_VPLT_FUNC_DECORATOR(sprintf) int sprintf(char *str, const char *format, ...) {
542 int result;
543 va_list ap;
544 va_start(ap, format);
545 result = vsprintf(str, format, ap);
546 va_end(ap);
547 return result;
548}
549VSF_APPLET_VPLT_FUNC_DECORATOR(snprintf) int snprintf(char *str, size_t size, const char *format, ...) {
550 int result;
551 va_list ap;
552 va_start(ap, format);
553 result = vsnprintf(str, size, format, ap);
554 va_end(ap);
555 return result;
556}
557VSF_APPLET_VPLT_FUNC_DECORATOR(asprintf) int asprintf(char **strp, const char *format, ...) {
558 int result;
559 va_list ap;
560 va_start(ap, format);
561 result = vasprintf(strp, format, ap);
562 va_end(ap);
563 return result;
564}
565VSF_APPLET_VPLT_FUNC_DECORATOR(sscanf) int sscanf(const char *str, const char *format, ...) {
566 int result;
567 va_list ap;
568 va_start(ap, format);
569 result = vsscanf(str, format, ap);
570 va_end(ap);
571 return result;
572}
573
574#else // __VSF_APPLET__ && VSF_LINUX_APPLET_USE_LIBC_STDIO
575
576FILE * __vsf_linux_stdin(void);
579
580void perror(const char *str);
581
582void setbuf(FILE *f, char *buf);
583void setbuffer(FILE *f, char *buf, size_t size);
584void setlinebuf(FILE *f);
585int setvbuf(FILE *f, char *buf, int mode, size_t size);
586
587int putchar(int ch);
588int getchar(void);
589int fgetc(FILE *f);
590int fputc(int ch, FILE *f);
591int getc(FILE *f);
592int putc(int ch, FILE *f);
593int ungetc(int c, FILE *f);
594int puts(const char *str);
595int fputs(const char *str, FILE *f);
596char * fgets(char *str, int n, FILE *f);
597
598int scanf(const char *format, ...);
599int vscanf(const char *format, va_list ap);
600int fscanf(FILE *f, const char *format, ...);
601int vfscanf(FILE *f, const char *format, va_list ap);
602
603int printf(const char *format, ...);
604int fprintf(FILE *f, const char *format, ...);
605int vfprintf(FILE *f, const char *format, va_list ap);
606int dprintf(int fd, const char *format, ...);
607int vdprintf(int fd, const char *format, va_list ap);
608int fiprintf(FILE *f, const char *format, ...);
609int vprintf(const char *format, va_list ap);
610
611FILE * fopen(const char *filename, const char *mode);
612FILE * fdopen(int fildes, const char *mode);
613FILE * freopen(const char *filename, const char *mode, FILE *f);
614int fclose(FILE *f);
615int fileno(FILE *f);
616int fseek(FILE *f, long offset, int fromwhere);
617int fseeko(FILE *f, off_t offset, int fromwhere);
618int fseeko64(FILE *f, off64_t offset, int fromwhere);
619long ftell(FILE *f);
620off_t ftello(FILE *f);
622void rewind(FILE *f);
623size_t fread(void *ptr, size_t size, size_t nmemb, FILE *f);
624size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *f);
625int fflush(FILE *f);
626int fgetpos(FILE *f, fpos_t *pos);
627int fsetpos(FILE *f, const fpos_t *pos);
628int fgetpos64(FILE *f, fpos_t *pos);
629int fsetpos64(FILE *f, const fpos_t *pos);
630
631FILE * popen(const char *command, const char *type);
632int pclose(FILE *stream);
633
634int rename(const char *old_filename, const char *new_filename);
635int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
636
637int ferror(FILE *f);
638void clearerr(FILE *f);
639int feof(FILE *f);
640
641int sprintf(char *str, const char *format, ...);
642int vsprintf(char *str, const char *format, va_list ap);
643int snprintf(char *str, size_t size, const char *format, ...);
644int vsnprintf(char *str, size_t size, const char* format, va_list ap);
645int asprintf(char **strp, const char *format, ...);
646int vasprintf(char **strp, const char *format, va_list ap);
647
648int vsscanf(const char *str, const char *format, va_list ap);
649int sscanf(const char *str, const char *format, ...);
650
651int remove(const char *filename);
652
653FILE * tmpfile(void);
654char * tmpnam(char *str);
655#endif // __VSF_APPLET__ && VSF_LINUX_APPLET_USE_LIBC_STDIO
656
657// use static inline for unlocked APIs for better compatibility
658// MACROs will have side effects
659static inline int getc_unlocked(FILE *f) {
660 return getc(f);
661}
662static inline int getchar_unlocked(void) {
663 return getchar();
664}
665static inline int putc_unlocked(int c, FILE *f){
666 return putc(c, f);
667}
668static inline int putchar_unlocked(int c) {
669 return putchar(c);
670}
671static inline void clearerr_unlocked(FILE *f) {
672 clearerr(f);
673}
674static inline int feof_unlocked(FILE *f) {
675 return feof(f);
676}
677static inline int ferror_unlocked(FILE *f) {
678 return ferror(f);
679}
680static inline int fileno_unlocked(FILE *f) {
681 return fileno(f);
682}
683static inline int fflush_unlocked(FILE *f) {
684 return fflush(f);
685}
686static inline int fgetc_unlocked(FILE *f) {
687 return fgetc(f);
688}
689static inline int fputc_unlocked(int ch, FILE *f) {
690 return fputc(ch, f);
691}
692static inline size_t fread_unlocked(void *ptr, size_t size, size_t nmemb, FILE *f) {
693 return fread(ptr, size, nmemb, f);
694}
695static inline size_t fwrite_unlocked(const void *ptr, size_t size, size_t nmemb, FILE *f) {
696 return fwrite(ptr, size, nmemb, f);
697}
698static inline int fputs_unlocked(const char *str, FILE *f) {
699 return fputs(str, f);
700}
701static inline char * fgets_unlocked(char *str, int n, FILE *f) {
702 return fgets(str, n, f);
703}
704static inline FILE *fopen64(const char *filename, const char *mode) {
705 return fopen(filename, mode);
706}
707
708ssize_t getline(char **lineptr, size_t *n, FILE *f);
709
710#if defined(__WIN__) && !defined(__VSF_APPLET__)
711// wrapper for original _lock_file/_unlock_file called in win c++ libs
712#define _lock_file VSF_LINUX_LIBC_WRAPPER(_lock_file)
713#define _unlock_file VSF_LINUX_LIBC_WRAPPER(_unlock_file)
714#define _get_stream_buffer_pointers VSF_LINUX_LIBC_WRAPPER(_get_stream_buffer_pointers)
715void _lock_file(FILE *f);
716void _unlock_file(FILE *f);
717errno_t _get_stream_buffer_pointers(FILE *f, char ***base, char ***ptr, int **cnt);
718int _fseeki64(FILE *f, uint64_t offset, int origin);
719#endif
720
721#ifdef __cplusplus
722}
723#endif
724
725#if __IS_COMPILER_LLVM__
726# pragma clang diagnostic pop
727#endif
728
729#endif
long long off64_t
Definition types.h:97
int ssize_t
Definition types.h:68
long off_t
Definition types.h:95
unsigned long long uint64_t
Definition stdint.h:11
#define vsnprintf
Definition stdio.h:95
#define fopen
Definition stdio.h:50
int vasprintf(char **strp, const char *format, va_list ap)
Definition vsf_linux_glibc_stdio.c:455
#define ftello64
Definition stdio.h:60
#define dprintf
Definition stdio.h:80
#define fread
Definition stdio.h:67
#define tmpnam
Definition stdio.h:90
#define fclose
Definition stdio.h:53
#define fseeko
Definition stdio.h:56
#define vprintf
Definition stdio.h:76
#define ungetc
Definition stdio.h:46
#define fileno
Definition stdio.h:54
void setlinebuf(FILE *f)
Definition vsf_linux_glibc_stdio.c:99
int remove(const char *filename)
Definition vsf_linux_glibc_stdio.c:924
int sprintf(char *str, const char *format,...)
Definition simple_sprintf.c:682
FILE * popen(const char *command, const char *type)
Definition vsf_linux_glibc_stdio.c:808
#define printf
Definition stdio.h:75
#define fscanf
Definition stdio.h:82
#define fiprintf
Definition stdio.h:81
void setbuf(FILE *f, char *buf)
Definition vsf_linux_glibc_stdio.c:84
int vscanf(const char *format, va_list ap)
Definition vsf_linux_glibc_stdio.c:746
#define fputs
Definition stdio.h:73
void setbuffer(FILE *f, char *buf, size_t size)
Definition vsf_linux_glibc_stdio.c:95
#define fflush
Definition stdio.h:68
int scanf(const char *format,...)
Definition vsf_linux_glibc_stdio.c:761
#define vdprintf
Definition stdio.h:78
FILE * __vsf_linux_stderr(void)
Definition vsf_linux_glibc_stdio.c:79
#define freopen
Definition stdio.h:52
#define putchar
Definition stdio.h:45
#define fsetpos64
Definition stdio.h:65
__VSF_VPLT_DECORATOR__ vsf_linux_libc_stdio_vplt_t vsf_linux_libc_stdio_vplt
Definition vsf_linux_glibc_stdio.c:1015
int asprintf(char **strp, const char *format,...)
Definition vsf_linux_glibc_stdio.c:469
#define puts
Definition stdio.h:74
#define fsetpos
Definition stdio.h:63
#define rewind
Definition stdio.h:61
#define tmpfile
Definition stdio.h:89
FILE * __vsf_linux_stdin(void)
Definition vsf_linux_glibc_stdio.c:69
ssize_t getline(char **lineptr, size_t *n, FILE *f)
Definition vsf_linux_glibc_stdio.c:978
#define fseek
Definition stdio.h:55
#define vfscanf
Definition stdio.h:83
#define vfprintf
Definition stdio.h:77
#define perror
Definition stdio.h:84
#define rename
Definition stdio.h:86
#define renameat
Definition stdio.h:87
#define fgetpos
Definition stdio.h:62
#define snprintf
Definition stdio.h:96
#define fgets
Definition stdio.h:70
#define fdopen
Definition stdio.h:51
off64_t fpos64_t
Definition stdio.h:119
int vsprintf(char *str, const char *format, va_list ap)
Definition simple_sprintf.c:673
#define fprintf
Definition stdio.h:79
off64_t fpos_t
Definition stdio.h:118
#define fseeko64
Definition stdio.h:57
int vsscanf(const char *str, const char *format, va_list ap)
Definition simple_sscanf.c:210
FILE * __vsf_linux_stdout(void)
Definition vsf_linux_glibc_stdio.c:74
#define fgetpos64
Definition stdio.h:64
#define feof
Definition stdio.h:47
#define putc
Definition stdio.h:44
int FILE
Definition stdio.h:141
#define fgetc
Definition stdio.h:69
#define ferror
Definition stdio.h:40
#define fwrite
Definition stdio.h:66
#define clearerr
Definition stdio.h:41
#define getchar
Definition stdio.h:43
#define getc
Definition stdio.h:42
int sscanf(const char *str, const char *format,...)
Definition simple_sscanf.c:225
#define ftello
Definition stdio.h:59
int pclose(FILE *stream)
Definition vsf_linux_glibc_stdio.c:869
#define fputc
Definition stdio.h:72
#define setvbuf
Definition stdio.h:85
#define ftell
Definition stdio.h:58
Definition stdio.h:165
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vsnprintf)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(setlinebuf)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(asprintf)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vasprintf)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(__vsf_linux_stderr)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(ftello64)
vsf_vplt_info_t info
Definition stdio.h:166
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(fgetpos64)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(setbuffer)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vdprintf)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(fseeko64)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(snprintf)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vfprintf)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(renameat)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vsprintf)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(clearerr)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(__vsf_linux_stdout)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(fsetpos64)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(__vsf_linux_stdin)
Definition vsf_cfg.h:95
vk_av_control_type_t type
Definition vsf_audio.h:170
#define __VSF_VPLT_DECORATOR__
Definition vsf_cfg.h:93
#define VSF_APPLET_VPLT_ENTRY_FUNC_TRACE()
Definition vsf_cfg.h:165
#define VSF_APPLET_VPLT_FUNC_DECORATOR(__NAME)
Definition vsf_linux_applet_lib.c:1
uint64_t offset
Definition vsf_memfs.h:49
uint32_t size
Definition vsf_memfs.h:50
SDL_PixelFormat format
Definition vsf_sdl2_pixelformat.c:32