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