00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifdef HAVE_CONFIG_H
00022 #include "config.h"
00023 #endif
00024
00025 #include <stdlib.h>
00026 #include <limits.h>
00027 #include <errno.h>
00028
00029 #include "libdefs.h"
00030 #include "error.h"
00031 #include "utilities.h"
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 int fid_utils_parse_uint_32(const char *string, fid_Uint32 *ui,
00045 fid_Error *error)
00046 {
00047 int retval;
00048 fid_Uint64 ui64;
00049
00050 if((retval=fid_utils_parse_uint_64(string,&ui64,error)) == 0)
00051 {
00052 if(ui64 <= (fid_Uint64)(~(fid_Uint32)0))
00053 {
00054 *ui=(fid_Uint32)ui64;
00055 return 0;
00056 }
00057 else
00058 {
00059 fid_error_throw(error,"Parsed value too large.");
00060 }
00061 }
00062 return retval;
00063 }
00064
00065 #ifdef HAVE_STRTOULL
00066 #define MAXVAL ULLONG_MAX
00067
00068
00069 extern unsigned long long strtoull(const char *, char **, int);
00070 #elif defined HAVE_STRTOUL
00071 #define MAXVAL ULONG_MAX
00072 #endif
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 int fid_utils_parse_uint_64(const char *string, fid_Uint64 *ui,
00086 fid_Error *error)
00087 {
00088 char *endptr=NULL;
00089 #ifdef HAVE_STRTOULL
00090 unsigned long long parsed_value;
00091 #else
00092 unsigned long parsed_value;
00093 #endif
00094
00095 if(*string != '-')
00096 {
00097 errno=0;
00098 #ifdef HAVE_STRTOULL
00099 parsed_value=strtoull(string,&endptr,10);
00100 #else
00101 parsed_value=strtoul(string,&endptr,10);
00102 #endif
00103 if(endptr == NULL || *endptr != '\0')
00104 {
00105 fid_error_throw(error,"Non-negative integer value expected.");
00106 }
00107 else if((parsed_value == MAXVAL && errno == ERANGE)
00108 #if defined HAVE_STRTOULL && SIZEOF_UNSIGNED_LONG_LONG > 8
00109 || parsed_value > (unsigned long long)(~(fid_Uint64)0)
00110 #endif
00111 )
00112 {
00113 fid_error_throw(error,"Parsed value too large.");
00114 }
00115 else
00116 {
00117 *ui=parsed_value;
00118 return 0;
00119 }
00120 }
00121 else
00122 {
00123 fid_error_throw(error,"Non-negative integer value expected.");
00124 }
00125 return -1;
00126 }
00127
00128