Limiting size of generated value

This function is giving varying results on 64bit values, can someone take a look for me since I'm having trouble spotting the problem
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
u64 ME::getHEXFromSignedDecimal( xStr text, u64 uSize )
{
	u32 i = 0u;
	s64 value = 0;
	u64 stat_value;
	u64 stat_tmp;
	s64 tmp = 0;
	s64 limit = 0;
	wxChar c;
	const wxChar n0 = wxT('0');
	const wxChar n9 = wxT('9');
	if ( text[0] == wxT('-') )
	{
		switch ( uSize )
		{
			case 0xFF:
				limit = -128;
				break;
			case 0xFFFF:
				limit = -32767;
				break;
			case 0xFFFFFFFF:
				limit = -2147483647;
				break;
			default:
				limit = -3028092406290448383LL;
		}
		while ( ( c = text[ i ] ) )
		{
			if ( c >= n0 && c <= n9 )
			{
				tmp = value * 10;
				tmp -= ( c - n0 );
				stat_tmp = static_cast < u64 > ( tmp );
				stat_value = static_cast < u64 > ( value );
				if ( tmp < limit || stat_tmp > stat_value )
				{
					value = limit;
					break;
				}
				value = tmp;
			}
			i++;
		}
	}
	else
	{
		switch ( uSize )
		{
			case 0xFF:
				limit = 127;
				break;
			case 0xFFFF:
				limit = 32767;
				break;
			case 0xFFFFFFFF:
				limit = 2147483647;
				break;
			default:
				limit = 3028092406290448383LL;
		}
		while ( ( c = text[ i ] ) )
		{
			if ( c >= n0 && c <= n9 )
			{
				tmp = value * 10;
				tmp += ( c - n0 );
				stat_tmp = static_cast < u64 > ( tmp );
				stat_value = static_cast < u64 > ( value );
				if ( tmp > limit || stat_tmp < stat_value )
				{
					value = limit;
					break;
				}
				value = tmp;
			}
			i++;
		}
	}
	return static_cast < u64 > ( value );
}
Never mind, found a way
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
u64 ME::getHEXFromSignedDecimal( xStr text, u64 uSize )
{
	u32 i = 0u;
	u32 j = 0u;
	xStr tmpText;
	s64 value = 0;
	s64 tmp = 0;
	s64 limit = 0;
	wxChar c;
	const wxChar n0 = wxT('0');
	const wxChar n9 = wxT('9');
	if ( text[0] == wxT('-') )
	{
		switch ( uSize )
		{
			case 0xFF:
				limit = -128;
				break;
			case 0xFFFF:
				limit = -32767;
				break;
			case 0xFFFFFFFF:
				limit = -2147483647;
				break;
			default:
				limit = -3028092406290448383LL;
		}
		tmpText.Printf( wxT("%lli"), limit );
		while ( ( c = text[ i ] ) )
		{
			if ( c >= n0 && c <= n9 )
			{
				if ( value < limit || j >= ( tmpText.length() - 1 ) )
				{
					value = limit;
					break;
				}
				value *= 10;
				value -= ( c - n0 );
				j++;
			}
			i++;
		}
	}
	else
	{
		switch ( uSize )
		{
			case 0xFF:
				limit = 127;
				break;
			case 0xFFFF:
				limit = 32767;
				break;
			case 0xFFFFFFFF:
				limit = 2147483647;
				break;
			default:
				limit = 3028092406290448383LL;
		}
		tmpText.Printf( wxT("%lli"), limit );
		while ( ( c = text[ i ] ) )
		{
			if ( c >= n0 && c <= n9 )
			{
				if ( value > limit || j >= tmpText.length() )
				{
					value = limit;
					break;
				}
				value *= 10;
				value += ( c - n0 );
				j++;
			}
			i++;
		}
	}
	return static_cast < u64 > ( value );
}
Topic archived. No new replies allowed.