Subversion Repositories Kolibri OS

Rev

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
}