Ticket #223: Added pj_strtoul2()

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1194 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
Benny Prijono 2007-04-15 09:58:48 +00:00
parent 9c2933c03b
commit c7434f6699
3 changed files with 81 additions and 0 deletions

View File

@ -517,6 +517,23 @@ PJ_DECL(char*) pj_create_random_string(char *str, pj_size_t length);
*/
PJ_DECL(unsigned long) pj_strtoul(const pj_str_t *str);
/**
* Convert strings to an unsigned long-integer value.
* This function stops reading the string input either when the number
* of characters has exceeded the length of the input or it has read
* the first character it cannot recognize as part of a number, that is
* a character greater than or equal to base.
*
* @param str The input string.
* @param endptr Optional pointer to receive the remainder/unparsed
* portion of the input.
* @param base Number base to use.
*
* @return the unsigned integer number.
*/
PJ_DECL(unsigned long) pj_strtoul2(const pj_str_t *str, pj_str_t *endptr,
unsigned base);
/**
* Utility to convert unsigned integer to string. Note that the
* string will be NULL terminated.

View File

@ -17,6 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <pj/string.h>
#include <pj/assert.h>
#include <pj/pool.h>
#include <pj/ctype.h>
#include <pj/rand.h>
@ -83,6 +84,42 @@ PJ_DEF(unsigned long) pj_strtoul(const pj_str_t *str)
return value;
}
PJ_DEF(unsigned long) pj_strtoul2(const pj_str_t *str, pj_str_t *endptr,
unsigned base)
{
unsigned long value;
unsigned i;
PJ_CHECK_STACK();
value = 0;
if (base <= 10) {
for (i=0; i<(unsigned)str->slen; ++i) {
unsigned c = (str->ptr[i] - '0');
if (c >= base)
break;
value = value * base + c;
}
} else if (base == 16) {
for (i=0; i<(unsigned)str->slen; ++i) {
if (!pj_isxdigit(str->ptr[i]))
break;
value = value * 16 + pj_hex_digit_to_val(str->ptr[i]);
}
} else {
pj_assert(!"Unsupported base");
i = 0;
value = 0xFFFFFFFFUL;
}
if (endptr) {
endptr->ptr = str->ptr + i;
endptr->slen = str->slen - i;
}
return value;
}
PJ_DEF(int) pj_utoa(unsigned long val, char *buf)
{
return pj_utoa_pad(val, buf, 0, 0);

View File

@ -48,6 +48,7 @@
* - pj_strtrim()
* - pj_utoa()
* - pj_strtoul()
* - pj_strtoul2()
* - pj_create_random_string()
* - ... and mode..
*
@ -358,6 +359,32 @@ int string_test(void)
if (pj_strtoul(&s5) != UL_VALUE)
return -280;
/*
* pj_strtoul2()
*/
s5 = pj_str("123456");
pj_strtoul2(&s5, NULL, 10); /* Crash test */
if (pj_strtoul2(&s5, &s4, 10) != 123456UL)
return -290;
if (s4.slen != 0)
return -291;
if (pj_strtoul2(&s5, &s4, 16) != 0x123456UL)
return -292;
s5 = pj_str("0123ABCD");
if (pj_strtoul2(&s5, &s4, 10) != 123)
return -293;
if (s4.slen != 4)
return -294;
if (s4.ptr == NULL || *s4.ptr != 'A')
return -295;
if (pj_strtoul2(&s5, &s4, 16) != 0x123ABCDUL)
return -296;
if (s4.slen != 0)
return -297;
/*
* pj_create_random_string()
* Check that no duplicate strings are returned.