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: |