Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 8717 → Rev 8718

/programs/develop/libraries/kolibri-libc/source/stdio/vfscanf.c
File deleted
\ No newline at end of file
/programs/develop/libraries/kolibri-libc/source/stdio/vsscanf.c
File deleted
\ No newline at end of file
/programs/develop/libraries/kolibri-libc/source/stdio/vscanf.c
File deleted
/programs/develop/libraries/kolibri-libc/source/stdio/format_scan.c
13,13 → 13,28
-radix point always '.', no LOCALEs
*/
 
 
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stdarg.h>
#include "format_scan.h"
 
static int __try_parse_real(long double *real, int ch, const void *src, void *save, virtual_getc vgetc, virtual_ungetc vungetc)
typedef int (*virtual_getc)(void *sp, const void *obj);
typedef void (*virtual_ungetc)(void *sp, int c, const void *obj);
 
enum flags_t
{
flag_unsigned = 0x02,
flag_register = 0x04,
flag_plus = 0x08,
flag_left_just = 0x10,
flag_lead_zeros = 0x20,
flag_space_plus = 0x40,
flag_hash_sign = 0x80,
flag_point = 0x100
};
 
int try_parse_real(long double *real, int ch, const void *src, void *save, virtual_getc vgetc, virtual_ungetc vungetc)
// returns 1 if OK, -1 == EOF, -2 parse broken
{
int sign = 1, have_digits = 0;
138,7 → 153,7
return 1;
}
 
static int __try_parse_int(long long *digit, int ch, const void *src, void *save, virtual_getc vgetc, virtual_ungetc vungetc)
int try_parse_int(long long *digit, int ch, const void *src, void *save, virtual_getc vgetc, virtual_ungetc vungetc)
{
int sign = 1, base = 10, have_digits = 0;
 
208,7 → 223,7
 
 
 
int _format_scan(const void *src, const char *fmt, va_list argp, virtual_getc vgetc, virtual_ungetc vungetc)
int format_scan(const void *src, const char *fmt, va_list argp, virtual_getc vgetc, virtual_ungetc vungetc)
{
int i;
int length;
363,7 → 378,7
break;
case 's':
arg_str = va_arg(argp, char*);
if (fmt1 == 0) length = STDIO_MAX_MEM; // max string scan 4096
if (fmt1 == 0) length = 4095; // max string scan 4096
else length = fmt1;
for (i = 0; i < length; i++)
{
375,7 → 390,7
break;
case 'd': case 'i': case 'u':
case 'o': case 'p': case 'x':
i = __try_parse_int(&digit, ch, src, &save, vgetc, vungetc);
i = try_parse_int(&digit, ch, src, &save, vgetc, vungetc);
if (i < 0) goto exit_me;
 
if (flag_long == 0) { arg_int = va_arg(argp, int*); *arg_int = (int)digit; } else
385,7 → 400,7
case 'a': case 'A': case 'f': case 'F':
case 'e': case 'E':
case 'g': case 'G':
i = __try_parse_real(&real, ch, src, &save, vgetc, vungetc);
i = try_parse_real(&real, ch, src, &save, vgetc, vungetc);
if (i < 0) goto exit_me;
 
if (flag_long == 0) { arg_float = va_arg(argp, float*); *arg_float = (float)real; } else
/programs/develop/libraries/kolibri-libc/source/stdio/fscanf.c
1,11 → 1,40
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
 
int virtual_getc_file(void *sp, const void *obj)
// get next chat from file obj, save point is ptr to string char ptr
{
FILE *f = (FILE *)obj;
int ch = fgetc(f);
 
//printf("getc '%c'[%d];", ch, ch);
 
return ch;
}
 
void virtual_ungetc_file(void *sp, int c, const void *obj)
// if can, one step back savepoint in s
{
FILE *f = (FILE *)obj;
 
if (f) ungetc(c, f);
}
 
 
int vfscanf ( FILE * stream, const char * format, va_list arg )
{
return format_scan(stream, format, arg, &virtual_getc_file, &virtual_ungetc_file);
};
 
int fscanf(FILE* stream, const char* format, ...)
{
va_list arg;
int n;
va_start(arg, format);
 
n = vfscanf(stream, format, arg);
 
va_end(arg);
return n;
}
/programs/develop/libraries/kolibri-libc/source/stdio/scanf.c
1,7 → 1,51
//#include "format_scan.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
char *__scanf_buffer = 0;
 
int virtual_getc_con(void *sp, const void *obj)
// get next chat from string obj, save point is ptr to string char ptr
{
int ch;
const char**spc= (const char**)sp;
if (!spc) return EOF; // error
 
if (!*spc) *spc = __scanf_buffer; // first call, init savepoint
 
while (!**spc) // need to read more
{
if(!gets(__scanf_buffer)) return EOF;
*spc = __scanf_buffer;
strcat(__scanf_buffer,"\n"); // imitate delimiter
}
if (**spc == 26 || **spc == 3) // ^C ^Z end of scan, clear buffer
{
*spc = __scanf_buffer;
*__scanf_buffer = 0;
return EOF; // ^C ^Z
}
 
ch = **spc; (*spc)++ ;
 
//printf("getc '%c'[%d];", ch, ch);
return ch;
}
 
void virtual_ungetc_con(void *sp, int c, const void *obj)
// if can, one step back savepoint in s
{
const char**spc= (const char**)sp;
 
if (spc && *spc > __scanf_buffer) (*spc)--;
//printf("Ungetc '%c'[%d];", c, c);
}
 
int vscanf ( const char * format, va_list arg )
{
return format_scan(NULL, format, arg, &virtual_getc_con, &virtual_ungetc_con);
};
 
int scanf ( const char * format, ...)
{
va_list arg;
8,8 → 52,8
int n;
va_start(arg, format);
 
if(__scanf_buffer == NULL) __scanf_buffer = malloc(STDIO_MAX_MEM);
if(__scanf_buffer == NULL) errno = ENOMEM; return ENOMEM;
if(__scanf_buffer == NULL) __scanf_buffer = malloc(4096);
if(__scanf_buffer == NULL) return -3;
 
*__scanf_buffer = 0;
n = vscanf(format, arg);
/programs/develop/libraries/kolibri-libc/source/stdio/sscanf.c
1,11 → 1,45
#include <stdio.h>
#include <stdarg.h>
 
int virtual_getc_str(void *sp, const void *obj)
// get next chat from string obj, save point is ptr to string char ptr
{
int ch;
const char *s = (const char *)obj;
const char**spc= (const char**)sp;
if (!s || !spc) return EOF; // error
 
if (!*spc) *spc = s; // first call, init savepoint
 
if (!**spc) return EOF; // EOS
 
ch = **spc; (*spc)++ ;
 
return ch;
}
 
void virtual_ungetc_str(void *sp, int c, const void *obj)
// if can, one step back savepoint in s
{
const char *s = (const char *)obj;
const char**spc= (const char**)sp;
 
if (s && spc && *spc > s) (*spc)--;
}
 
int vsscanf ( const char * s, const char * format, va_list arg )
{
return format_scan(s, format, arg, &virtual_getc_str, &virtual_ungetc_str);
};
 
int sscanf(const char * s, const char * format, ...)
{
va_list arg;
int n;
va_start(arg, format);
 
n = vsscanf(s, format, arg);
 
va_end(arg);
return n;
}
/programs/develop/libraries/kolibri-libc/source/stdio/ungetc.c
0,0 → 1,28
#include <stdio.h>
#include <errno.h>
// non standard realization - support for virtually change ONLY ONE char
 
int ungetc(int c, FILE* file)
{
int res;
 
if(!file){
errno = EBADF;
return EOF;
}
 
if (file->mode != _STDIO_F_R){
errno = EACCES;
return EOF;
}
 
if (file->position > file->start_size || file->position == 0 || c == EOF || file->__ungetc_emu_buff != EOF)
{
errno = EOF;
return EOF;
}
file->__ungetc_emu_buff = c;
file->position--;
return c;
}