36 static long sym_to_val(
char sym,
int base)
39 if (sym <= '7' && sym >=
'0') {
44 if (sym <= 'f' && sym >=
'a') {
45 return (sym -
'a' + 0xa);
67 static inline double ch_mpow(
double x,
unsigned long y)
118 bool is_long, is_signed, is_positive;
120 #if CHSCANF_USE_FLOAT
125 bool exp_is_positive, initial_digit;
143 while (c != STM_RESET && f != 0) {
186 buf = va_arg(ap,
void*);
192 width = (width * 10) + (f -
'0');
201 if (f ==
'l' || f ==
'L') {
205 is_long = isupper(f);
219 for (i = 0; i < width; ++i) {
224 if (c == STM_RESET) {
236 if (c == STM_RESET) {
244 for (i = 0; i < width; ++i) {
258 if (c == STM_RESET) {
265 ((
char*)buf)[width] = 0;
272 #if CHSCANF_USE_FLOAT
278 initial_digit =
false;
289 }
else if (c ==
'-') {
313 if (tolower(c) ==
'n') {
317 while (*match != 0) {
318 if (*match != tolower(c)) {
334 if (tolower(c) ==
'i') {
338 while (*match != 0) {
339 if (*match != tolower(c)) {
354 while (*match != 0) {
355 if (*match != tolower(c)) {
375 if (c ==
'x' || c ==
'X') {
389 if (sym_to_val(c, base) != -1) {
394 digit = sym_to_val(c, base);
398 valf = (valf * base) + (
double)digit;
406 digit = sym_to_val(c, base);
413 valf = (valf * base) + (
double)digit;
424 valf = valf / ch_mpow(base, fixed_point);
426 if (tolower(c) == exp_char) {
431 exp_is_positive =
true;
440 }
else if (c ==
'-') {
444 exp_is_positive =
false;
454 digit = sym_to_val(c, 10);
461 digit = sym_to_val(c, 10);
465 exp = (exp * 10) + digit;
468 if (exp_is_positive) {
469 valf = valf * (double)ch_mpow(exp_base, exp);
471 valf = valf / (double)ch_mpow(exp_base, exp);
482 *(
double*)buf = valf;
505 }
else if (c ==
'-') {
518 if (c ==
'x' || c ==
'X') {
542 }
else if (c ==
'-') {
564 }
else if (c ==
'-') {
576 if (c ==
'x' || c ==
'X') {
595 }
else if (c ==
'-') {
616 }
else if (c ==
'-') {
633 if (sym_to_val(c, base) == -1) {
638 digit = sym_to_val(c, base);
642 vall = (vall * base) + digit;
651 if (is_long && is_signed) {
652 *((
signed long*)buf) = vall;
653 }
else if (is_long && !is_signed) {
654 *((
unsigned long*)buf) = vall;
655 }
else if (!is_long && is_signed) {
656 *((
signed int*)buf) = vall;
657 }
else if (!is_long && !is_signed) {
658 *((
unsigned int*)buf) = vall;
734 int chsnscanf(
char *str,
size_t size,
const char *fmt, ...)
776 int chvsnscanf(
char *str,
size_t size,
const char *fmt, va_list ap)
782 size_wo_nul = size - 1;