Subversion Repositories Kolibri OS

Rev

Rev 9529 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 9529 Rev 9861
Line 252... Line 252...
252
    float       *arg_float;
252
    float       *arg_float;
253
    double      *arg_double;
253
    double      *arg_double;
254
    long double *arg_longdouble;
254
    long double *arg_longdouble;
255
    long long  digit;
255
    long long  digit;
256
    long double real;
256
    long double real;
257
 
-
 
-
 
257
    int skip_next; // skip arguments with * char format
Line 258... Line 258...
258
 
258
 
259
    pos = 0;
259
    pos = 0;
260
    while(*fmt)
260
    while(*fmt)
261
    {
261
    {
Line 262... Line 262...
262
        while (*fmt && isspace(*fmt)) fmt++; // skip paces in format str
262
        while (*fmt && isspace(*fmt)) fmt++; // skip spaces in format str
263
 
263
 
264
        if (*fmt != '%')  // usual char
264
        if (*fmt != '%')  // usual char
265
        {
265
        {
Line 287... Line 287...
287
        }
287
        }
288
        //checking to containg format in the string
288
        //checking to containg format in the string
289
        fmtc = fmt;
289
        fmtc = fmt;
290
        posc = pos;
290
        posc = pos;
Line -... Line 291...
-
 
291
 
291
 
292
        skip_next = 0;
292
        flags = 0;
293
        flags = 0;
293
        format_flag = 0;
294
        format_flag = 0;
Line 294... Line 295...
294
        flag_long = 0;  // 2 = long double or long long int or wchar
295
        flag_long = 0;  // 2 = long double or long long int or wchar
Line 313... Line 314...
313
                    break;
314
                    break;
314
                case 'o':   case 'u':   case 'x':   case 'p':
315
                case 'o':   case 'u':   case 'x':   case 'p':
315
                    format_flag = 1;
316
                    format_flag = 1;
316
                    flags |= flag_unsigned;
317
                    flags |= flag_unsigned;
317
                    break;
318
                    break;
-
 
319
                case '*':
-
 
320
                    skip_next = 1;
-
 
321
                    break;
318
                case '*':   case '.':  // just skip
322
                case '.':  // just skip
319
                    break;
323
                    break;
320
                default:
324
                default:
321
                    if(isdigit(*fmtc))  break;
325
                    if(isdigit(*fmtc))  break;
322
                    goto exit_me;  // non format char found - user error
326
                    goto exit_me;  // non format char found - user error
323
                }
327
                }
Line 372... Line 376...
372
        case 'n':
376
        case 'n':
373
            point_to_n = va_arg(argp, int*);
377
            point_to_n = va_arg(argp, int*);
374
            vungetc(&save, ch, src);
378
            vungetc(&save, ch, src);
375
            break;
379
            break;
376
        case 'c':  // read width chars, ever spaces
380
        case 'c':  // read width chars, ever spaces
377
            arg_str = va_arg(argp, char*);
381
            if (!skip_next) arg_str = va_arg(argp, char*);
378
            if (fmt1 == 0) length = 1;
382
            if (fmt1 == 0) length = 1;
379
            else length = fmt1;
383
            else length = fmt1;
380
            for (i = 0; i < length;)
384
            for (i = 0; i < length;)
381
            {
385
            {
382
                *arg_str++ = ch; i++;
386
                if (!skip_next) *arg_str++ = ch;
-
 
387
                i++;
383
                ch = vgetc(&save, src);
388
                ch = vgetc(&save, src);
384
                if (ch == EOF) break;
389
                if (ch == EOF) break;
385
            }
390
            }
386
            if (i < length) goto exit_me; // not enough chars
391
            if (i < length) goto exit_me; // not enough chars
387
            break;
392
            break;
388
        case 's':
393
        case 's':
389
            arg_str = va_arg(argp, char*);
394
            if (!skip_next) arg_str = va_arg(argp, char*);
390
            if (fmt1 == 0) length = 4095;   // max string scan 4096
395
            if (fmt1 == 0) length = 4095;   // max string scan 4096
391
            else length = fmt1;
396
            else length = fmt1;
392
            for (i = 0; i < length; i++)
397
            for (i = 0; i < length; i++)
393
            {
398
            {
394
                *arg_str++ = ch;
399
                if (!skip_next) *arg_str++ = ch;
-
 
400
 
395
                ch = vgetc(&save, src);
401
                ch = vgetc(&save, src);
396
                if (ch == EOF || isspace(ch)) break; // ok, just finish string
402
                if (ch == EOF || isspace(ch)) break; // ok, just finish string
397
            }
403
            }
398
            *arg_str++ = '\0';
404
            if (!skip_next) *arg_str++ = '\0';
399
            break;
405
            break;
400
        case 'd':   case 'i':   case 'u':
406
        case 'd':   case 'i':   case 'u':
401
        case 'o':   case 'p':   case 'x':
407
        case 'o':   case 'p':   case 'x':
402
            i = try_parse_int(&digit, ch, src, &save, vgetc, vungetc);
408
            i = try_parse_int(&digit, ch, src, &save, vgetc, vungetc);
403
            if (i < 0) goto exit_me;
409
            if (i < 0) goto exit_me;
Line -... Line 410...
-
 
410
 
404
 
411
            if (!skip_next)
405
            if (flag_long == 0) { arg_int = va_arg(argp, int*); *arg_int = (int)digit; } else
412
            if (flag_long == 0) { arg_int = va_arg(argp, int*); *arg_int = (int)digit; } else
406
            if (flag_long == 1) { arg_long = va_arg(argp, long*); *arg_long = (long)digit; } else
413
            if (flag_long == 1) { arg_long = va_arg(argp, long*); *arg_long = (long)digit; } else
407
            if (flag_long == 2) { arg_longlong = va_arg(argp, long long*); *arg_longlong = digit; }
414
            if (flag_long == 2) { arg_longlong = va_arg(argp, long long*); *arg_longlong = digit; }
408
            break;
415
            break;
409
        case 'a':   case 'A':   case 'f':   case 'F':
416
        case 'a':   case 'A':   case 'f':   case 'F':
410
        case 'e':   case 'E':
417
        case 'e':   case 'E':
411
        case 'g':   case 'G':
418
        case 'g':   case 'G':
412
            i = try_parse_real(&real, ch, src, &save, vgetc, vungetc);
419
            i = try_parse_real(&real, ch, src, &save, vgetc, vungetc);
Line -... Line 420...
-
 
420
            if (i < 0) goto exit_me;
413
            if (i < 0) goto exit_me;
421
 
414
 
422
            if (!skip_next)
415
            if (flag_long == 0) { arg_float = va_arg(argp, float*); *arg_float = (float)real; } else
423
            if (flag_long == 0) { arg_float = va_arg(argp, float*); *arg_float = (float)real; } else
416
            if (flag_long == 1) { arg_double = va_arg(argp, double*); *arg_double = (double)real; } else
424
            if (flag_long == 1) { arg_double = va_arg(argp, double*); *arg_double = (double)real; } else
417
            if (flag_long == 2) { arg_longdouble = va_arg(argp, long double*); *arg_longdouble = real; }
425
            if (flag_long == 2) { arg_longdouble = va_arg(argp, long double*); *arg_longdouble = real; }
Line 418... Line 426...
418
            break;
426
            break;
419
        }
427
        }
420
 
428
 
421
        fmt = fmtc + 1;
429
        fmt = fmtc + 1;
422
        nread++;
430
        if (!skip_next) nread++;
423
    }
431
    }
424
exit_me:
432
exit_me: