On 09/15/2010 02:23 PM, address@hidden wrote:
switch (*endptr++) {
case 'K':
case 'k':
value<<= 10;
break;
case 0:
+ if (divider) {
+ value = 0;
+ break;
+ }
case 'M':
case 'm':
value<<= 20;
@@ -284,9 +306,12 @@ uint64_t strtobytes(const char *nptr, char **end)
default:
value = 0;
}
+ if (divider)
+ value /= divider;
This risks overflow if you do 1.00000000000000G or something similarly
braindead. Do we loathe floating point so much that you cannot use
strtod, like
endptr1 = nptr + strspn(s, "0123456789.");
switch (*endptr1)
{
case 0: divider = 1; break;
case 'm': divider = 1 << 20; break;
...
default: /* error, including for 1.0e+5 and negative */
}
value = (uint64_t) (strtod(nptr, &endptr2) / divider);
if (endptr1 != endptr2) /* error, e.g. 1.2.3 */
return value;
Paolo