Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

goto prevails...

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;
}

Name: Anonymous 2007-09-17 17:39 ID:lD0ddHF+

>>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.

"address <= 4294967295uL" is always true.

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List