/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; |
} |