Subversion Repositories Kolibri OS

Rev

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

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