STRONG:
__asm pop ecx
switch (ch) {
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': --rem; goto DIGIT_CHECK;
case '.': ++dots; goto DOT_CHECK;
default: return 0;
}
WEAK0:
__asm pop ecx
switch (ch) {
case '0': case '1': --rem; __asm {mov ebx, 3}; goto DIGIT_CHECK;
case '2': --rem; __asm {inc ebx}; goto DIGIT_CHECK;
case '3': case '4': case '5': case '6': case '7': case '8': case '9': rem -= 2; __asm {mov ebx, 3}; goto DIGIT_CHECK;
case '.': ++dots; goto DOT_CHECK;
default: return 0;
}
WEAK1:
__asm pop ecx
switch (ch) {
case '0': case '1': case '2': case '3': case '4': --rem; __asm {mov ebx, 3}; goto DIGIT_CHECK;
case '5': --rem; __asm {inc ebx}; goto DIGIT_CHECK;
case '6': case '7': case '8': case '9': rem = 0; __asm {mov ebx, 3}; goto DIGIT_CHECK;
case '.': ++dots; goto DOT_CHECK;
default: return 0;
}
WEAK2:
__asm pop ecx
switch (ch) {
case '0': case '1': case '2': case '3': case '4': case '5': --rem; __asm {mov ebx, 3}; goto DIGIT_CHECK;
case '.': ++dots; goto DOT_CHECK;
default: return 0;
}
>>38
Then you phail. The function decent programmers would use to check ips uses multiplication, and this method runs 5.5 secs or faster for 10 million function calls. The state method which only checks, but uses no multiplication and runs in 3.4 secs or faster for 10 million function calls. The array method is a combination of the state method and its co-occurring conversion of the string to an array. This method never takes more than 4.0 secs per 10 million calls. Additionally, the multiplication method is fairly steady with how much time it takes whereas both the state and array versions can see significant improvements on different inputs, and this is quite common in fact.
32.437 seconds to see if it is valid and you don't even have the array converted. Truly sad.
>>45
Overuse of explicitly sized types, not using isdigit() where appropriate, not using bitwise and where appropriate, not protecting against overflow and IP's with four dots considered harmful.
According to your function "....", "1239128930128.0129831209380.09480227193.9128103.9120382", and "(260 dots here)" are valid IPv4 adresses.
The only working good code is >>14's
the rest fail.
Name:
Anonymous2007-09-17 19:41 ID:TTUu4Vdm
'---FUNCTION: IP string -> uinteger and vice versa
function ip2u(what as string) as uinteger
if what="" then return 0
return (16777216*val(extractField(".",what,1)))+(65536*val(extractField(".",what,2)))+(256*val(extractField(".",what,3)))+val(extractField(".",what,4))
end function
function u2ip(numericIP as uinteger) as string
dim t00 as uinteger,t01 as uinteger,t02 as uinteger,t03 as uinteger
t00=(numericIP and 4278190080)/(256*256*256)
t01=(numericIP and 16711680)/(256*256)
t02=(numericIP and 65280)/256
t03=(numericIP and 255)
return mid$(str$(t00),1)+"."+mid$(str$(t01),1)+"."+mid$(str$(t02),1)+"."+mid$(str$(t03),1)
end function
Name:
Anonymous2007-09-17 19:43 ID:TTUu4Vdm
'---FUNCTION: extracts a field from a string, delimited with separator characters
'--- returns chr(4) if field index is more than number of fields in string
function extractField(sepChars as string, fromWhat as string, whichField as integer) as string
dim l1 as integer,t1 as integer=1
if whichField<1 then return "[invalid field index]"
if sepChars="" then
if whichField=1 then return fromWhat else return chr(4)
end if
if fromWhat="" then return ""
if whichField=1 then
t1=0:l1=1
else
for l1=1 to len(fromWhat)
if instr(mid$(fromWhat,l1,1),any sepChars)<>0 then t1=t1+1
if t1=whichField then l1=l1+1:exit for
next
end if
if t1=1 then return chr(4)
if l1>len(fromWhat) then return ""
t1=instr(l1,fromWhat,any sepChars)
if t1=0 then t1=len(fromWhat)+1
if t1=l1 then return ""
return mid$(fromWhat,l1,t1-l1)
end function
Name:
Anonymous2007-09-17 20:47 ID:6JABiyR0
>>49
Sure it will. Once they remove sixes, sevens, eights and nines from IP addresses.
int valid_ip(char *ip_addr){
int n0,n1,n2,n3,c,l;
c=sscanf(ip_addr,"%d.%d.%d.%d\0",&n0,&n1,&n2,&n3,&l);
return c<4||l<strlen(ip_addr)||n0<0||n0>255||n1<0||n1>255||n2<0||n2>255||n3<0||n3>255?0:1;
}