Subversion Repositories Kolibri OS

Rev

Rev 8687 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  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. }
  43.  
  44. int vscanf ( const char * format, va_list arg )
  45. {
  46.     return format_scan(NULL, format, arg, &virtual_getc_con, &virtual_ungetc_con);
  47. };
  48.  
  49. int scanf ( const char * format, ...)
  50. {
  51.    va_list      arg;
  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.  
  58.    *__scanf_buffer = 0;
  59.    n = vscanf(format, arg);
  60.  
  61.    va_end(arg);
  62.    return n;
  63. }
  64.  
  65.  
  66.