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;
}
use gcc and do case '0' ... '9':, you worthless faggot
Name:
Anonymous2007-09-14 18:43 ID:exfP63F/
>>3
I don't use GCC. I would have used if if I felt like doing that. The compiler has some chance of optimizing the switches which is why they were used.
>>13
are you trolling you fucking piece of shit?
First of all, using a single `char' instead of `int' causes most compilers to produce more assembly.
He has no idea about base2, (all that case '0': ... case '9': shit is by far WORSE than a ch >= '0' && ch <= '9')
He uses another pointer (ip_ptr) where he could just use ip_addr.
And all that inline assembly makes it so unportable unmaintanable and shitty .. seriously i'm going to puke.
int valid_ipv4(const char *);
/* dont pass NULL faggot. */
int valid_ipv4(const char *ip) {
>>14
So I suppose 6, 7, 8, 9 can't appear in IP addresses. You exponentially phail.
Name:
Anonymous2007-09-15 16:50 ID:fQFnkf8W
In addition to the senseless use of x86 assembly and goto's, and the shitty indentation I would like to point you to the following:
1. Not using constant initializers for rem and dots
2. Using size_t intstead of an (unsigned) int for dots
3. Assignment inside of an if statement
4. Using "!" instead of the far more readable "!= NULL"
5. Casting a const char* to a char*
6. The use of the sometimes slow "jecxz" instead of the more natural "jz", making it worse than what most compilers would generate
7. The use of goto's that could have been omitted if the jumps just went straight their targets
8. Repeated code for the '.' and default cases and the use of gotos because the switches should be the other way around
>(all that case '0': ... case '9': shit is by far WORSE than a ch >= '0' && ch <= '9')
Any compiler worth using will output the same code for both.
Name:
Anonymous2007-09-15 17:03 ID:qPpm2sL3
Why didn't you write it entirely in assembler?
Name:
Anonymous2007-09-15 17:16 ID:PlK+8pzu
ENTERPRISE TURNKEY INTERNET PROTOCOL ADDRESS VERIFICATION SYSTEM
int valid_ipv4( const char * ip )
{
uint8_t dc = 3;
uint16_t f = 0xFFFF;
nloop:
if ( *ip == '.' )
{
if ( !dc )
{
return 0;
}
dc--;
if ( f != 0xFFFF )
{
if ( f > 0xFF )
{
return 0;
}
f = 0xFFFF;
}
goto nloop_cont;
}
if ( *ip >= '0'
&& *ip <= '9' )
{
if ( f == 0xFFFF )
{
f = 0;
}
3. Assignment inside of an if statement
This being bad is arguable.
4. Using "!" instead of the far more readable "!= NULL"
This is bullshite. Why not then clarify: a != NULL != NULL? Or a != NULL != NULL != NULL, which is even more readable.
Name:
Anonymous2007-09-15 20:15 ID:d2asGXBU
>>19
The proper, agreed-upon way to write this is !(a != NULL) == 0.
Name:
Anonymous2007-09-15 20:19 ID:ZrRYnvOP
This being bad is arguable.
No it's not. It's begging for a bug.
Why not then clarify: a != NULL != NULL? Or a != NULL != NULL != NULL, which is even more readable.
That has to be the stupidest thing I've read today on 4chan. I regret to inform you that he has a point, your ridiculous example to the contrary.
I think it's pretty obvious which of you two has written more C.
Name:
Anonymous2007-09-15 20:40 ID:fQFnkf8W
>>19
Funny how you nitpick on that while you didn't notice on the quite big mistake I made in that statement.
I meant:
4. Using "!" instead of the far more readable "== NULL"
Of course this only applies to checks on pointers.
Good answers and all, but what about flexibility? Extensibility? Portability? Well-defined APIs?
package org.fourchan.dis.prog.faggotry;
/**
* IPv4Checker.java
*
* @author Anonymous
*/
public class IPv4Checker implements IIPChecker {
private static final String DELIMITER_REGEXP = "\\.";
private static final int NUM_BLOCKS = 4;
/**
* The string to be checked
*/
private String s;
/**
* Helper class to check a number block for validity.
*/
private class BlockChecker {
private String block;
public BlockChecker(String b) {
this.block = b;
}
private boolean isValidBlock() {
try {
int n = Integer.parseInt(this.block);
return (0 <= n && n <= 255);
} catch (NumberFormatException e) {
return false;
}
}
}
/**
* Constructor
* @param s String to be checked for IPv4 validity.
*/
public IPv4Checker(String s) {
this.s = s;
}
/**
* @return <code>true</code> if and only if the String with which this
* IPv4Checker was instantiated is a valid IPv4 IP address.
*/
public boolean isValidIP() {
String[] blocks = this.s.split(DELIMITER_REGEXP);
if (blocks.length != NUM_BLOCKS)
return false;
for (int i = 0; i < NUM_BLOCKS; i++) {
if (!new BlockChecker(blocks[i]).isValidBlock())
return false;
}
return true;
}
public static void main(String[] args) {
/*
* Perform unit tests
*/
System.out.println(new IPv4Checker("192.168.0.1").isValidIP());
System.out.println(new IPv4Checker("255.255.255.255").isValidIP());
}
}
You'll notice I haven't written IIPChecker. I'll leave that as an exercise to the reader.
>>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;
}