split: dont use table lookup for size

Signed-off-by: Hiltjo Posthuma <hiltjo@codemadness.org>
This commit is contained in:
Hiltjo Posthuma 2014-04-01 15:30:17 +02:00 committed by sin
parent f7403ce6c6
commit bd9a81951f

19
split.c
View File

@ -22,15 +22,10 @@ main(int argc, char **argv)
char *prefix = "x"; char *prefix = "x";
char *file = NULL; char *file = NULL;
char *tmp, *end; char *tmp, *end;
uint64_t sizes['M'+1];
uint64_t size = 1000, scale, n; uint64_t size = 1000, scale, n;
int always = 0; int always = 0;
FILE *in=stdin, *out=NULL; FILE *in=stdin, *out=NULL;
sizes['K'] = 1024;
sizes['M'] = 1024L*1024L;
sizes['G'] = 1024L*1024L*1024L;
ARGBEGIN { ARGBEGIN {
case 'b': case 'b':
always = 1; always = 1;
@ -41,9 +36,19 @@ main(int argc, char **argv)
size = strtoull(tmp, &end, 10); size = strtoull(tmp, &end, 10);
if(*end == '\0') if(*end == '\0')
break; break;
if(strchr("KMG", toupper(*end)) == NULL || end[1] != '\0') switch(toupper(*end)) {
case 'K':
scale = 1024;
break;
case 'M':
scale = 1024L * 1024L;
break;
case 'G':
scale = 1024L * 1024L * 1024L;
break;
default:
usage(); usage();
scale = sizes[toupper(*end)]; }
if(size > (UINT64_MAX/scale)) if(size > (UINT64_MAX/scale))
eprintf("'%s': out of range\n", tmp); eprintf("'%s': out of range\n", tmp);
size *= scale; size *= scale;