--- parser3/src/classes/math.C 2012/03/16 09:24:07 1.59 +++ parser3/src/classes/math.C 2012/05/28 10:33:18 1.61 @@ -30,7 +30,7 @@ extern char *crypt(const char* , const char* ); #endif -volatile const char * IDENT_MATH_C="$Id: math.C,v 1.59 2012/03/16 09:24:07 moko Exp $"; +volatile const char * IDENT_MATH_C="$Id: math.C,v 1.61 2012/05/28 10:33:18 moko Exp $"; // defines @@ -357,7 +357,7 @@ static void _crc32(Request& r, MethodPar r.write_no_lang(*new VInt(pa_crc32(string, strlen(string)))); } -static void toBase(long value, int base, char*& ptr){ +static void toBase(unsigned int value, unsigned int base, char*& ptr){ static const char* hex="0123456789ABCDEF"; int rest = value % base; if(value >= base) @@ -366,29 +366,37 @@ static void toBase(long value, int base, } static void _convert(Request& r, MethodParams& params) { - const char *string=params.as_string(0, PARAMETER_MUST_BE_STRING).cstr(); + const char *str=params.as_string(0, PARAMETER_MUST_BE_STRING).cstr(); + int base_from=params.as_int(1, "base from must be integer", r); if(base_from < 2 || base_from > 16) throw Exception(PARSER_RUNTIME, 0, "base from must be an integer from 2 to 16"); - char *error_pos; - long value=strtol(string, &error_pos, base_from); - while(char c=*error_pos++) - if(!isspace((unsigned char)c)) - throw Exception("number.format", - 0, - "'%s' is invalid number (int)", string); - int base_to=params.as_int(2, "base to must be integer", r); if(base_to < 2 || base_to > 16) throw Exception(PARSER_RUNTIME, 0, "base to must be an integer from 2 to 16"); - char result_cstr[sizeof(long)*8+1/*minus for negative number*/+1/*terminator*/]; - char* ptr=(char *)&result_cstr; - if(value < 0){ - *ptr++='-'; - value=-value; + while(isspace(*str)) + str++; + + if(!*str) + return; + + bool negative=false; + if(str[0]=='-') { + negative=true; + str++; + } else if(str[0]=='+') { + str++; } + + unsigned int value=pa_atoui(str, base_from); + + char result_cstr[sizeof(unsigned int)*8+1/*minus for negative number*/+1/*terminator*/]; + char* ptr=result_cstr; + if(negative) + *ptr++='-'; + toBase(value, base_to, ptr); *ptr=0; r.write_pass_lang(*new String(pa_strdup(result_cstr)));