@@ -895,15 +895,39 @@ my_bool getopt_compare_strings(register const char *s, register const char *t,
895
895
/*
896
896
function: eval_num_suffix
897
897
898
+ Transforms suffix like k/m/g to their real value.
899
+ */
900
+
901
+ static inline long eval_num_suffix (char * suffix , int * error )
902
+ {
903
+ long num = 1 ;
904
+ if (* suffix == 'k' || * suffix == 'K' )
905
+ num *= 1024L ;
906
+ else if (* suffix == 'm' || * suffix == 'M' )
907
+ num *= 1024L * 1024L ;
908
+ else if (* suffix == 'g' || * suffix == 'G' )
909
+ num *= 1024L * 1024L * 1024L ;
910
+ else if (* suffix )
911
+ {
912
+ * error = 1 ;
913
+ return 0 ;
914
+ }
915
+ return num ;
916
+ }
917
+
918
+ /*
919
+ function: eval_num_suffix_ll
920
+
898
921
Transforms a number with a suffix to real number. Suffix can
899
922
be k|K for kilo, m|M for mega or g|G for giga.
900
923
*/
901
924
902
- static longlong eval_num_suffix (char * argument , int * error , char * option_name )
925
+ static longlong eval_num_suffix_ll (char * argument ,
926
+ int * error , char * option_name )
903
927
{
904
928
char * endchar ;
905
929
longlong num ;
906
- DBUG_ENTER ("eval_num_suffix " );
930
+ DBUG_ENTER ("eval_num_suffix_ll " );
907
931
908
932
909
933
* error = 0 ;
@@ -916,23 +940,47 @@ static longlong eval_num_suffix(char *argument, int *error, char *option_name)
916
940
* error = 1 ;
917
941
DBUG_RETURN (0 );
918
942
}
919
- if (* endchar == 'k' || * endchar == 'K' )
920
- num *= 1024L ;
921
- else if (* endchar == 'm' || * endchar == 'M' )
922
- num *= 1024L * 1024L ;
923
- else if (* endchar == 'g' || * endchar == 'G' )
924
- num *= 1024L * 1024L * 1024L ;
925
- else if (* endchar )
926
- {
943
+ num *= eval_num_suffix (endchar , error );
944
+ if (* error )
927
945
fprintf (stderr ,
928
946
"Unknown suffix '%c' used for variable '%s' (value '%s')\n" ,
929
947
* endchar , option_name , argument );
948
+ DBUG_RETURN (num );
949
+ }
950
+
951
+ /*
952
+ function: eval_num_suffix_ull
953
+
954
+ Transforms a number with a suffix to positive Integer. Suffix can
955
+ be k|K for kilo, m|M for mega or g|G for giga.
956
+ */
957
+
958
+ static ulonglong eval_num_suffix_ull (char * argument ,
959
+ int * error , char * option_name )
960
+ {
961
+ char * endchar ;
962
+ ulonglong num ;
963
+ DBUG_ENTER ("eval_num_suffix_ull" );
964
+
965
+ * error = 0 ;
966
+ errno = 0 ;
967
+ num = strtoull (argument , & endchar , 10 );
968
+ if (errno == ERANGE )
969
+ {
970
+ my_getopt_error_reporter (ERROR_LEVEL ,
971
+ "Incorrect integer value: '%s'" , argument );
930
972
* error = 1 ;
931
973
DBUG_RETURN (0 );
932
974
}
975
+ num *= eval_num_suffix (endchar , error );
976
+ if (* error )
977
+ fprintf (stderr ,
978
+ "Unknown suffix '%c' used for variable '%s' (value '%s')\n" ,
979
+ * endchar , option_name , argument );
933
980
DBUG_RETURN (num );
934
981
}
935
982
983
+
936
984
/*
937
985
function: getopt_ll
938
986
@@ -946,7 +994,7 @@ static longlong eval_num_suffix(char *argument, int *error, char *option_name)
946
994
947
995
static longlong getopt_ll (char * arg , const struct my_option * optp , int * err )
948
996
{
949
- longlong num = eval_num_suffix (arg , err , (char * ) optp -> name );
997
+ longlong num = eval_num_suffix_ll (arg , err , (char * ) optp -> name );
950
998
return getopt_ll_limit_value (num , optp , NULL );
951
999
}
952
1000
@@ -1023,7 +1071,7 @@ longlong getopt_ll_limit_value(longlong num, const struct my_option *optp,
1023
1071
1024
1072
static ulonglong getopt_ull (char * arg , const struct my_option * optp , int * err )
1025
1073
{
1026
- ulonglong num = eval_num_suffix (arg , err , (char * ) optp -> name );
1074
+ ulonglong num = eval_num_suffix_ull (arg , err , (char * ) optp -> name );
1027
1075
return getopt_ull_limit_value (num , optp , NULL );
1028
1076
}
1029
1077
0 commit comments