/*! readU32FromCharChecked() :
* @return 0 if success, and store the result in *value.
- * allows and interprets K, KB, KiB, M, MB and MiB suffix.
+ * allows and interprets K, KB, KiB, M, MB, MiB, G, GB and GiB suffix.
* Will also modify `*stringPtr`, advancing it to position where it stopped reading.
* @return 1 if an overflow error occurs */
static int readU32FromCharChecked(const char** stringPtr, unsigned* value)
if (result < last) return 1; /* overflow error */
(*stringPtr)++ ;
}
- if ((**stringPtr=='K') || (**stringPtr=='M')) {
- unsigned const maxK = ((unsigned)(-1)) >> 10;
- if (result > maxK) return 1; /* overflow error */
- result <<= 10;
- if (**stringPtr=='M') {
- if (result > maxK) return 1; /* overflow error */
- result <<= 10;
+ if ((**stringPtr=='K') || (**stringPtr=='M') || (**stringPtr=='G')) {
+ switch (**stringPtr) {
+ case 'K':
+ if (result > (((unsigned)-1) >> 10)) return 1; /* overflow error */
+ result <<= 10;
+ break;
+ case 'M':
+ if (result > (((unsigned)-1) >> 20)) return 1; /* overflow error */
+ result <<= 20;
+ break;
+ case 'G':
+ if (result > (((unsigned)-1) >> 30)) return 1; /* overflow error */
+ result <<= 30;
+ break;
}
- (*stringPtr)++; /* skip `K` or `M` */
+ (*stringPtr)++; /* skip `K`, `M` or `G` */
if (**stringPtr=='i') (*stringPtr)++;
if (**stringPtr=='B') (*stringPtr)++;
}
/*! readU32FromChar() :
* @return : unsigned integer value read from input in `char` format.
- * allows and interprets K, KB, KiB, M, MB and MiB suffix.
+ * allows and interprets K, KB, KiB, M, MB, MiB, G, GB and GiB suffix.
* Will also modify `*stringPtr`, advancing it to position where it stopped reading.
* Note : function will exit() program if digit sequence overflows */
static unsigned readU32FromChar(const char** stringPtr) {
/*! readIntFromChar() :
* @return : signed integer value read from input in `char` format.
- * allows and interprets K, KB, KiB, M, MB and MiB suffix.
+ * allows and interprets K, KB, KiB, M, MB, MiB, G, GB and GiB suffix.
* Will also modify `*stringPtr`, advancing it to position where it stopped reading.
* Note : function will exit() program if digit sequence overflows */
static int readIntFromChar(const char** stringPtr) {
/*! readSizeTFromCharChecked() :
* @return 0 if success, and store the result in *value.
- * allows and interprets K, KB, KiB, M, MB and MiB suffix.
+ * allows and interprets K, KB, KiB, M, MB, MiB, G, GB and GiB suffix.
* Will also modify `*stringPtr`, advancing it to position where it stopped reading.
* @return 1 if an overflow error occurs */
static int readSizeTFromCharChecked(const char** stringPtr, size_t* value)
if (result < last) return 1; /* overflow error */
(*stringPtr)++ ;
}
- if ((**stringPtr=='K') || (**stringPtr=='M')) {
- size_t const maxK = ((size_t)(-1)) >> 10;
- if (result > maxK) return 1; /* overflow error */
- result <<= 10;
- if (**stringPtr=='M') {
- if (result > maxK) return 1; /* overflow error */
- result <<= 10;
+ if ((**stringPtr=='K') || (**stringPtr=='M') || (**stringPtr=='G')) {
+ switch (**stringPtr) {
+ case 'K':
+ if (result > (((size_t)-1) >> 10)) return 1; /* overflow error */
+ result <<= 10;
+ break;
+ case 'M':
+ if (result > (((size_t)-1) >> 20)) return 1; /* overflow error */
+ result <<= 20;
+ break;
+ case 'G':
+ if (result > (((size_t)-1) >> 30)) return 1; /* overflow error */
+ result <<= 30;
+ break;
}
- (*stringPtr)++; /* skip `K` or `M` */
+ (*stringPtr)++; /* skip `K`, `M` or `G` */
if (**stringPtr=='i') (*stringPtr)++;
if (**stringPtr=='B') (*stringPtr)++;
}
/*! readSizeTFromChar() :
* @return : size_t value read from input in `char` format.
- * allows and interprets K, KB, KiB, M, MB and MiB suffix.
+ * allows and interprets K, KB, KiB, M, MB, MiB, G, GB and GiB suffix.
* Will also modify `*stringPtr`, advancing it to position where it stopped reading.
* Note : function will exit() program if digit sequence overflows */
static size_t readSizeTFromChar(const char** stringPtr) {
NEXT_FIELD(__nb); \
_varu32 = readU32FromChar(&__nb); \
if(*__nb != 0) { \
- errorOut("error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed"); \
+ errorOut("error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB, G, GB, GiB are allowed"); \
} \
}
NEXT_FIELD(__nb); \
_varTsize = readSizeTFromChar(&__nb); \
if(*__nb != 0) { \
- errorOut("error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed"); \
+ errorOut("error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB, G, GB, GiB are allowed"); \
} \
}