Name: Anonymous 2007-09-14 18:15 ID:exfP63F/
...teh haterz phail.
int valid_ip(const char *ip_addr) {
int rem;
size_t dots;
char ch, *ip_ptr;
if (!(ip_ptr = (char *) ip_addr)) {
return 0;
}
dots = 0, rem = 3; __asm {xor ebx, ebx};
for (; ch = *ip_ptr; ++ip_ptr) {
__asm push ecx __asm mov ecx, ebx __asm jecxz ECX_WEAK0 __asm dec ecx
__asm jecxz ECX_WEAK1 __asm dec ecx __asm jecxz ECX_WEAK2 __asm jmp STRONG
ECX_WEAK0: goto WEAK0; ECX_WEAK1: goto WEAK1; ECX_WEAK2: goto WEAK2;
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;
}
DIGIT_CHECK: if (rem < 0) {return 0;} else {continue;}
DOT_CHECK: if (rem == 3 || dots > 3) {return 0;} else {rem = 3; __asm {xor ebx, ebx}; continue;}
}
return (rem != 3 && dots == 3) ? 1 : 0;
}
int valid_ip(const char *ip_addr) {
int rem;
size_t dots;
char ch, *ip_ptr;
if (!(ip_ptr = (char *) ip_addr)) {
return 0;
}
dots = 0, rem = 3; __asm {xor ebx, ebx};
for (; ch = *ip_ptr; ++ip_ptr) {
__asm push ecx __asm mov ecx, ebx __asm jecxz ECX_WEAK0 __asm dec ecx
__asm jecxz ECX_WEAK1 __asm dec ecx __asm jecxz ECX_WEAK2 __asm jmp STRONG
ECX_WEAK0: goto WEAK0; ECX_WEAK1: goto WEAK1; ECX_WEAK2: goto WEAK2;
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;
}
DIGIT_CHECK: if (rem < 0) {return 0;} else {continue;}
DOT_CHECK: if (rem == 3 || dots > 3) {return 0;} else {rem = 3; __asm {xor ebx, ebx}; continue;}
}
return (rem != 3 && dots == 3) ? 1 : 0;
}