summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/__v_scanf.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/lib/__v_scanf.c')
-rw-r--r--mdk-stage1/dietlibc/lib/__v_scanf.c391
1 files changed, 0 insertions, 391 deletions
diff --git a/mdk-stage1/dietlibc/lib/__v_scanf.c b/mdk-stage1/dietlibc/lib/__v_scanf.c
deleted file mode 100644
index 6db51db59..000000000
--- a/mdk-stage1/dietlibc/lib/__v_scanf.c
+++ /dev/null
@@ -1,391 +0,0 @@
-#include "dietfeatures.h"
-#include <stdarg.h>
-#include <sys/types.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "dietstdio.h"
-#include "dietwarning.h"
-
-#define A_GETC(fn) (++consumed,(fn)->getch((fn)->data))
-#define A_PUTC(c,fn) (--consumed,(fn)->putch((c),(fn)->data))
-
-int __v_scanf(struct arg_scanf* fn, const unsigned char *format, va_list arg_ptr)
-{
- unsigned int ch; /* format act. char */
- int n=0;
-
- /* arg_ptr tmps */
-#ifdef WANT_FLOATING_POINT_IN_SCANF
- double *pd;
- float *pf;
-#endif
-#ifdef WANT_LONGLONG_SCANF
- long long *pll;
-#endif
- long *pl;
- short *ph;
- int *pi;
- char *s;
-
- unsigned int consumed=0;
-
- /* get one char */
- int tpch= A_GETC(fn);
-
- //while ((tpch!=-1)&&(*format))
- while (*format)
- {
-// const unsigned char *prev_fmt=format;
- ch=*format++;
- switch (ch) {
- /* end of format string ?!? */
- case 0: return 0;
-
- /* skip spaces ... */
- case ' ':
- case '\f':
- case '\t':
- case '\v':
- case '\n':
- case '\r':
- while((*format)&&(isspace(*format))) ++format;
- while(isspace(tpch)) tpch=A_GETC(fn);
- break;
-
- /* format string ... */
- case '%':
- {
- unsigned int _div=0;
- int width=-1;
- char flag_width=0;
- char flag_discard=0;
- char flag_half=0;
- char flag_long=0;
- char flag_longlong=0;
-
-in_scan:
- ch=*format++;
- if(ch!='n' && tpch==-1) goto err_out;
- switch (ch) {
- /* end of format string ?!? */
- case 0: return 0;
-
- /* check for % */
- case '%':
- if ((unsigned char)tpch != ch) goto err_out;
- tpch=A_GETC(fn);
- break;
-
- /* FLAGS */
- case '*':
- flag_discard=1;
- goto in_scan;
- case 'h':
- flag_half=1;
- goto in_scan;
- case 'l':
- if (flag_long) flag_longlong=1;
- flag_long=1;
- goto in_scan;
- case 'q':
- case 'L':
- flag_longlong=1;
- goto in_scan;
-
- /* WIDTH */
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- width=strtol(format-1,&s,10);
- format=s;
- flag_width=1;
- goto in_scan;
-
- /* scan for integer / strtol reimplementation ... */
- case 'p':
- case 'X':
- case 'x':
- _div+=6;
- case 'd':
- _div+=2;
- case 'o':
- _div+=8;
- case 'u':
- case 'i':
- {
-#ifdef WANT_LONGLONG_SCANF
- unsigned long long v=0;
-#else
- unsigned long v=0;
-#endif
- unsigned int consumedsofar=consumed;
- int neg=0;
- while(isspace(tpch)) tpch=A_GETC(fn);
- if (tpch=='-') {
- tpch=A_GETC(fn);
- neg=1;
- }
-
- if (tpch=='+') tpch=A_GETC(fn);
-
- if (!flag_width) {
- if ((_div==16) && (tpch=='0')) goto scan_hex;
- if (!_div) {
- _div=10;
- if (tpch=='0') {
- _div=8;
-scan_hex:
- tpch=A_GETC(fn);
- if ((tpch|32)=='x') {
- tpch=A_GETC(fn);
- _div=16;
- }
- }
- }
- }
- while ((width)&&(tpch!=-1)) {
- register unsigned long c=tpch&0xff;
-#ifdef WANT_LONGLONG_SCANF
- register unsigned long long d=c|0x20;
-#else
- register unsigned long d=c|0x20;
-#endif
- c=(d>='a'?d-'a'+10:c<='9'?c-'0':0xff);
- if (c>=_div) break;
- d=v*_div;
-#ifdef WANT_LONGLONG_SCANF
- v=(d<v)?ULLONG_MAX:d+c;
-#else
- v=(d<v)?ULONG_MAX:d+c;
-#endif
- --width;
- tpch=A_GETC(fn);
- }
- if ((ch|0x20)<'p') {
-#ifdef WANT_LONGLONG_SCANF
- register long long l=v;
- if (v>=-((unsigned long long)LLONG_MIN)) {
- l=(neg)?LLONG_MIN:LLONG_MAX;
- }
- else {
- if (neg) v*=-1;
- }
-#else
- register long l=v;
- if (v>=-((unsigned long)LONG_MIN)) {
- l=(neg)?LONG_MIN:LONG_MAX;
- }
- else {
- if (neg) v*=-1;
- }
-#endif
- }
- if (!flag_discard) {
-#ifdef WANT_LONGLONG_SCANF
- if (flag_longlong) {
- pll=(long long *)va_arg(arg_ptr,long long*);
- *pll=v;
- } else
-#endif
- if (flag_long) {
- pl=(long *)va_arg(arg_ptr,long*);
- *pl=v;
- } else if (flag_half) {
- ph=(short*)va_arg(arg_ptr,short*);
- *ph=v;
- } else {
- pi=(int *)va_arg(arg_ptr,int*);
- *pi=v;
- }
- if(consumedsofar<consumed)
- ++n;
- }
- }
- break;
-
-#ifdef WANT_FLOATING_POINT_IN_SCANF
- /* floating point numbers */
- case 'e':
- case 'E':
- case 'f':
- case 'g':
- {
- double d=0.0;
- int neg=0;
-
- while(isspace(tpch)) tpch=A_GETC(fn);
-
- if (tpch=='-') {
- tpch=A_GETC(fn);
- neg=1;
- }
- if (tpch=='+') tpch=A_GETC(fn);
-
- while (isdigit(tpch)) {
- d=d*10+(tpch-'0');
- tpch=A_GETC(fn);
- }
- if (tpch=='.') {
- double factor=.1;
- tpch=A_GETC(fn);
- while (isdigit(tpch)) {
- d=d+(factor*(tpch-'0'));
- factor/=10;
- tpch=A_GETC(fn);
- }
- }
- if ((tpch|0x20)=='e') {
- int exp=0, prec=tpch;
- double factor=10;
- tpch=A_GETC(fn);
- if (tpch=='-') {
- factor=0.1;
- tpch=A_GETC(fn);
- } else if (tpch=='+') {
- tpch=A_GETC(fn);
- } else {
- d=0;
- if (tpch!=-1) A_PUTC(tpch,fn);
- tpch=prec;
- goto exp_out;
- }
- while (isdigit(tpch)) {
- exp=exp*10+(tpch-'0');
- tpch=A_GETC(fn);
- }
- while (exp) { /* as in strtod: XXX: this introduces rounding errors */
- d*=factor; --exp;
- }
- }
-exp_out:
- if (!flag_discard) {
- if (flag_long) {
- pd=(double *)va_arg(arg_ptr,double*);
- *pd=d;
- } else {
- pf=(float *)va_arg(arg_ptr,float*);
- *pf=d;
- }
- }
- ++n;
- }
- break;
-#endif
-
- /* char-sequences */
- case 'c':
- if (!flag_discard) {
- s=(char *)va_arg(arg_ptr,char*);
- ++n;
- }
- if (!flag_width) width=1;
- while (width && (tpch!=-1)) {
- if (!flag_discard) *(s++)=tpch;
- --width;
- tpch=A_GETC(fn);
- }
- break;
-
- /* c-string */
- case 's':
- if (!flag_discard) s=(char *)va_arg(arg_ptr,char*);
- while(isspace(tpch)) tpch=A_GETC(fn);
- while (width && (tpch!=-1) && (!isspace(tpch))) {
- if (!flag_discard) *s=tpch;
- if (tpch) ++s; else break;
- --width;
- tpch=A_GETC(fn);
- }
- if (!flag_discard) { *s=0; n++; }
- break;
-
- /* consumed-count */
- case 'n':
- if (!flag_discard) {
- s=(char *)va_arg(arg_ptr,char*);
-// ++n; /* in accordance to ANSI C we don't count this conversion */
- }
- if (!flag_discard) *(s++)=consumed-1;
- break;
-
-#ifdef WANT_CHARACTER_CLASSES_IN_SCANF
- case '[':
- {
- char cset[256];
- int flag_not=0;
- int flag_dash=0;
- memset(cset,0,sizeof(cset));
- ch=*format++;
- /* first char specials */
- if (ch=='^') {
- flag_not=1;
- ch=*format++;
- }
- if ((ch=='-')||(ch==']')) {
- cset[ch]=1;
- ch=*format++;
- }
- /* almost all non special chars */
- for (;(*format) && (*format!=']');++format) {
- if (flag_dash) {
- register unsigned char tmp=*format;
- for (;ch<=tmp;++ch) cset[ch]=1;
- flag_dash=0;
- ch=*format;
- }
- else if (*format=='-') flag_dash=1;
- else {
- cset[ch]=1;
- ch=*format;
- }
- }
- /* last char specials */
- if (flag_dash) cset['-']=1;
- else cset[ch]=1;
-
- /* like %c or %s */
- if (!flag_discard) {
- s=(char *)va_arg(arg_ptr,char*);
- ++n;
- }
- while (width && (tpch>=0) && (cset[tpch]^flag_not)) {
- if (!flag_discard) *s=tpch;
- if (tpch) ++s; else break;
- --width;
- tpch=A_GETC(fn);
- }
- if (!flag_discard) *s=0;
- ++format;
- }
- break;
-#endif
- default:
- goto err_out;
- }
- }
- break;
-
- /* check if equal format string... */
- default:
- if ((unsigned char)tpch != ch) goto err_out;
- tpch=A_GETC(fn);
- break;
- }
- }
-err_out:
- if (tpch<0 && n==0) return EOF;
- A_PUTC(tpch,fn);
- return n;
-}
-
-link_warning("__v_scanf","warning: the scanf functions add several kilobytes of bloat.");