Subversion Repositories Kolibri OS

Rev

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

  1. #include <string.h>
  2.  
  3. char *__scanf_buffer=NULL;
  4. typedef int (*virtual_getc)(void *sp, const void *obj);
  5. typedef void (*virtual_ungetc)(void *sp, int c, const void *obj);
  6.  
  7. char *__scanf_buffer;
  8.  
  9. extern int _format_scan(const void *src, const char *fmt, va_list argp, virtual_getc vgetc, virtual_ungetc vungetc);
  10.  
  11. static int __virtual_getc_con(void *sp, const void *obj)
  12. // get next chat from string obj, save point is ptr to string char ptr
  13. {
  14.     int ch;
  15.     const char**spc= (const char**)sp;
  16.     if (!spc) return EOF;  // error
  17.     if (!*spc) *spc = __scanf_buffer;    // first call, init savepoint
  18.  
  19.     while (!**spc)  // need to read more
  20.     {
  21.         if(!gets(__scanf_buffer)) return EOF;
  22.         *spc = __scanf_buffer;
  23.         strcat(__scanf_buffer,"\n");    // imitate delimiter
  24.     }
  25.     if (**spc == 26 || **spc == 3)  // ^C ^Z end of scan, clear buffer
  26.     {
  27.         *spc = __scanf_buffer;
  28.         *__scanf_buffer = 0;
  29.         return EOF;  // ^C ^Z
  30.     }
  31.  
  32.     ch = **spc; (*spc)++ ;
  33.     return ch;
  34. }
  35.  
  36. static void __virtual_ungetc_con(void *sp, int c, const void *obj)
  37. // if can, one step back savepoint in s
  38. {
  39.     const char**spc= (const char**)sp;
  40.  
  41.     if (spc && *spc > __scanf_buffer) (*spc)--;
  42. //printf("Ungetc '%c'[%d];", c, c);
  43. }
  44.  
  45.  
  46. int vscanf(const char * format, va_list arg)
  47. {
  48.     return _format_scan(NULL, format, arg, &__virtual_getc_con, &__virtual_ungetc_con);
  49. }
  50.