- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
void str2ip_s_Before( unsigned char* ptrIP, unsigned short* ptrPort, const wchar_t* src, size_t count )
{
int i;
if( !ptrIP )
return;
while( src && count && !iswdigit( *src ) )//skip separators and spaces
++src, --count;
for( i = 0; i < 4 && count; ++i )//IP address
{
ptrIP[ i ] = ( unsigned char )_wtoi( src );
while( src && count && iswdigit( *src ) )//skip current number
++src, --count;
while( src && count && !iswdigit( *src ) )//skip separators and spaces
++src, --count;
}
if( ptrPort && src && count )
*ptrPort = ( unsigned short )_wtoi( src );
}
int str2ip_sAfter( unsigned char* ptrIP, unsigned short* ptrPort, const wchar_t* src, size_t count )
{
int i, iRadix;
wchar_t* endptr;
if( !ptrIP || !src || 0 == count )
return 0;
for( i = 0; i < 4; ++i )
ptrIP[ i ] = 0;
if( ptrPort )
*ptrPort = 0;
while( 0 != count && !iswdigit( *src ) ) //skip separators and spaces
++src, --count;
for( i = 0; i < 4 && 0 != count; ++i ) //IP address
{
if( count > 1 && src[ 0 ] == L'0' )
{
if( src[ 1 ] != L'x' && src[ 1 ] != L'X' )
iRadix = 8;
else
iRadix = 16;
}
else
iRadix = 10;
ptrIP[ i ] = ( unsigned char )wcstol( src, &endptr, iRadix );
if( src == endptr )
return 0;
count -= endptr - src;
src = endptr;
while( 0 != count && iswspace( *src ) ) //skip spaces
++src, --count;
if( i < 3 )
{
if( L'.' == *src ) //skip point
++src, --count;
else
return 0;
}
while( 0 != count && iswspace( *src ) ) //skip spaces
++src, --count;
}
if( i < 4 )
return 0;
if( ptrPort )
{
if( 0 == count || L':' != *src ) //skip point
return 0;
++src, --count;
while( 0 != count && iswspace( *src ) ) //skip spaces
++src, --count;
*ptrPort = ( unsigned short )wcstol( src, &endptr, 10 );
if( src == endptr )
return 0;
else
return 1;
}
else
return 1;
}
guest 31.08.2012 15:40 # +4
Это какое-то говно, а не код, извините
tirinox 31.08.2012 15:42 # −12
bormand 31.08.2012 15:58 # +2
Вы так говорите, как будто пуресишник это что-то плохое ;)
guest 31.08.2012 16:12 # +6
Почему умеренно:
а) лучше было использовать wcstoul();
б) wcstoul() отбрасывает leading whitespaces, так что часть while'ов можно выкинуть;
в) если у wcstoul() последний параметр (т.е. база) равен 0, то он сам определит, по какому основанию (8, 10, или 16) записано число. Пляски с iRadix'ом не нужны;
г) отсутствуют проверки на то, что wcstol() вернул допустимое число.
bormand 31.08.2012 17:51 # +2
е) видимо из-за этих пробелов не удалось поюзать inet_pton (вменяемый способ парсить как ipv4 так и ipv6)
3.14159265 31.08.2012 16:16 # +3
> return 0;
> else
> return 1;
> if( 0 == count
Какой-то он не труЪ.
PS. Но зря я эту портянку плюсанул. В целом ничего особенного.
defecate-plusplus 31.08.2012 16:18 # +2
откуда вообще пробелы внутри айпишников?
sayidandrtfm 31.08.2012 16:30 # +2
bormand 31.08.2012 17:50 # +2
Dummy00001 01.09.2012 16:44 # −4
не пуресишник, а просто -извиняюсь за выражение- долбоёб какой-то. (коих пачками, к сожалению.)
я вот только вчера это же самое sscanf()ом и inet_addr()ом в 4 строки (это с обработкой ошибок) написал.
> зарефакторил
K&R как K&R.
bormand 02.09.2012 12:36 # +1