[number] Remove parsing code duplication of the calls using lambda

This commit is contained in:
Ebrahim Byagowi 2019-09-03 15:14:21 +04:30
parent a77bb7eb41
commit e2cecf1f34
1 changed files with 19 additions and 38 deletions

View File

@ -31,8 +31,9 @@
#include <xlocale.h> #include <xlocale.h>
#endif #endif
bool template<typename T, typename Func>
hb_parse_int (const char **pp, const char *end, int *pv) static inline bool
_parse_number (const char **pp, const char *end, T *pv, Func f)
{ {
char buf[32]; char buf[32];
unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp));
@ -41,10 +42,10 @@ hb_parse_int (const char **pp, const char *end, int *pv)
char *p = buf; char *p = buf;
char *pend = p; char *pend = p;
int v; T v;
errno = 0; errno = 0;
v = strtol (p, &pend, 10); v = f (p, &pend);
if (unlikely (errno || p == pend)) return false; if (unlikely (errno || p == pend)) return false;
*pv = v; *pv = v;
@ -52,25 +53,18 @@ hb_parse_int (const char **pp, const char *end, int *pv)
return true; return true;
} }
bool
hb_parse_int (const char **pp, const char *end, int *pv)
{
return _parse_number<int> (pp, end, pv, [] (const char *p, char **end)
{ return strtol (p, end, 10); });
}
bool bool
hb_parse_uint (const char **pp, const char *end, unsigned int *pv, int base) hb_parse_uint (const char **pp, const char *end, unsigned int *pv, int base)
{ {
char buf[32]; return _parse_number<unsigned int> (pp, end, pv, [base] (const char *p, char **end)
unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); { return strtoul (p, end, base); });
strncpy (buf, *pp, len);
buf[len] = '\0';
char *p = buf;
char *pend = p;
int v;
errno = 0;
v = strtol (p, &pend, 10);
if (unlikely (errno || p == pend)) return false;
*pv = v;
*pp += pend - p;
return true;
} }
@ -134,25 +128,12 @@ get_C_locale ()
bool bool
hb_parse_float (const char **pp, const char *end, float *pv) hb_parse_float (const char **pp, const char *end, float *pv)
{ {
char buf[32]; return _parse_number<float> (pp, end, pv, [] (const char *p, char **end)
unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); {
strncpy (buf, *pp, len);
buf[len] = '\0';
char *p = buf;
char *pend = p;
float v;
errno = 0;
#ifdef USE_XLOCALE #ifdef USE_XLOCALE
v = strtod_l (p, &pend, get_C_locale ()); return strtod_l (p, end, get_C_locale ());
#else #else
v = strtod (p, &pend); return strtod (p, end);
#endif #endif
if (errno || p == pend) });
return false;
*pv = v;
*pp += pend - p;
return true;
} }