Rev 8793 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8793 | Rev 9868 | ||
---|---|---|---|
Line -... | Line 1... | ||
- | 1 | #include |
|
1 | #include |
2 | #include |
2 | #include |
3 | #include |
3 | #include |
4 | #include |
4 | #include |
5 | #include |
5 | char *__scanf_buffer = 0; |
- | |
6 | - | ||
7 | int virtual_getc_con(void *sp, const void *obj) |
- | |
8 | // get next chat from string obj, save point is ptr to string char ptr |
- | |
9 | { |
- | |
10 | int ch; |
- | |
11 | const char**spc= (const char**)sp; |
- | |
12 | if (!spc) return EOF; // error |
- | |
13 | - | ||
14 | if (!*spc) *spc = __scanf_buffer; // first call, init savepoint |
- | |
15 | - | ||
16 | while (!**spc) // need to read more |
- | |
17 | { |
- | |
18 | if(!gets(__scanf_buffer)) return EOF; |
- | |
19 | *spc = __scanf_buffer; |
- | |
20 | strcat(__scanf_buffer,"\n"); // imitate delimiter |
- | |
21 | } |
- | |
22 | if (**spc == 26 || **spc == 3) // ^C ^Z end of scan, clear buffer |
- | |
23 | { |
- | |
24 | *spc = __scanf_buffer; |
- | |
25 | *__scanf_buffer = 0; |
- | |
26 | return EOF; // ^C ^Z |
- | |
27 | } |
- | |
28 | - | ||
29 | ch = **spc; (*spc)++ ; |
- | |
30 | - | ||
31 | //printf("getc '%c'[%d];", ch, ch); |
- | |
32 | return ch; |
- | |
33 | } |
- | |
34 | - | ||
35 | void virtual_ungetc_con(void *sp, int c, const void *obj) |
- | |
36 | // if can, one step back savepoint in s |
- | |
37 | { |
- | |
38 | const char**spc= (const char**)sp; |
- | |
39 | - | ||
40 | if (spc && *spc > __scanf_buffer) (*spc)--; |
- | |
41 | //printf("Ungetc '%c'[%d];", c, c); |
- | |
42 | } |
- | |
Line 43... | Line 6... | ||
43 | 6 | ||
44 | int vscanf ( const char * format, va_list arg ) |
7 | int vscanf(const char* format, va_list arg) |
- | 8 | { |
|
- | 9 | static char scanf_buffer[STDIO_MAX_MEM]; |
|
45 | { |
10 | gets(scanf_buffer); |
46 | return format_scan(NULL, format, arg, &virtual_getc_con, &virtual_ungetc_con); |
11 | return vsscanf(scanf_buffer, format, arg); |
Line 47... | Line 12... | ||
47 | }; |
12 | }; |
48 | 13 | ||
49 | int scanf ( const char * format, ...) |
14 | int scanf(const char* format, ...) |
50 | { |
- | |
51 | va_list arg; |
15 | { |
52 | int n; |
- | |
53 | va_start(arg, format); |
- | |
54 | - | ||
55 | if(__scanf_buffer == NULL) __scanf_buffer = malloc(4096); |
- | |
56 | if(__scanf_buffer == NULL) return -3; |
- | |
57 | 16 | va_list arg; |
|
58 | *__scanf_buffer = 0; |
- | |
59 | n = vscanf(format, arg); |
17 | va_start(arg, format); |
60 | 18 | int n = vscanf(format, arg); |
|
61 | va_end(arg); |
19 | va_end(arg); |
62 | return n; |
- | |
63 | } |
- |