static char *opts_ini_next(const char *s, char c) { bool last = false; while (*s && *s != c && !(last && *s == ';')) last = !!util_isspace(*s), s++; return (char*)s; }
int util_atoi(char *str, int base) { unsigned long acc = 0; int c; unsigned long cutoff; int neg = 0, any, cutlim; do { c = *str++; } while (util_isspace(c)); if (c == '-') { neg = 1; c = *str++; } else if (c == '+') c = *str++; cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; cutlim = cutoff % (unsigned long)base; cutoff /= (unsigned long)base; for (acc = 0, any = 0;; c = *str++) { if (util_isdigit(c)) c -= '0'; else if (util_isalpha(c)) c -= util_isupper(c) ? 'A' - 10 : 'a' - 10; else break; if (c >= base) break; if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) any = -1; else { any = 1; acc *= base; acc += c; } } if (any < 0) { acc = neg ? LONG_MIN : LONG_MAX; } else if (neg) acc = -acc; return (acc); }
static char *opts_ini_lskip(const char *s) { while (*s && util_isspace(*s)) s++; return (char*)s; }
/* * Standard configuration parser and subsystem. Yes, optionally you may * create ini files or cfg (the driver accepts both) for a project opposed * to supplying just a progs.src (since you also may need to supply command * line arguments or set the options of the compiler) [which cannot be done * from a progs.src. */ static char *opts_ini_rstrip(char *s) { char *p = s + strlen(s) - 1; while (p > s && util_isspace(*p)) *p = '\0', p--; return s; }