Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
8687 | turbocat | 1 | #include |
2 | #include |
||
3 | #include |
||
4 | //#include "format_scan.h" |
||
5 | #include |
||
6 | |||
7 | // non standard realization - support for virtually change ONLY ONE char |
||
8 | |||
9 | static int __ungetc_emu(int c, FILE* stream) |
||
10 | { |
||
11 | unsigned res; |
||
12 | if(stream){ |
||
13 | errno = EINVAL; |
||
14 | return EOF; |
||
15 | } |
||
16 | if ((stream->mode & 3) != _STDIO_F_R && (stream->mode & _STDIO_F_A) == 0){ |
||
17 | errno = EACCES; |
||
18 | return EOF; |
||
19 | } |
||
20 | ksys_bdfe_t *file_info = malloc(sizeof(ksys_bdfe_t)); |
||
21 | if(file_info==NULL){ |
||
22 | errno = ENOMEM; |
||
23 | return EOF; |
||
24 | } |
||
25 | if(!_ksys_file_get_info(stream->name, file_info)){ |
||
26 | errno = ENFILE; |
||
27 | return EOF; |
||
28 | } |
||
29 | if (stream->position > file_info->size || stream->position == 0 || c == EOF || stream->__ungetc_emu_buff != EOF){ |
||
30 | errno = EOF; |
||
31 | return EOF; |
||
32 | } |
||
33 | |||
34 | stream->__ungetc_emu_buff = c; |
||
35 | stream->position --; |
||
36 | return c; |
||
37 | } |
||
38 | |||
39 | static int __virtual_getc_file(void *sp, const void *obj) |
||
40 | { |
||
41 | FILE *f = (FILE *)obj; |
||
42 | int ch = fgetc(f); |
||
43 | return ch; |
||
44 | } |
||
45 | |||
46 | static void __virtual_ungetc_file(void *sp, int c, const void *obj) |
||
47 | { |
||
48 | FILE *f = (FILE *)obj; |
||
49 | if (f) __ungetc_emu(c, f); |
||
50 | } |
||
51 | |||
52 | int vfscanf(FILE * stream, const char * format, va_list arg) |
||
53 | { |
||
54 | return _format_scan(stream, format, arg, &__virtual_getc_file, &__virtual_ungetc_file); |
||
55 | } |