char temp[] = "192.168.190.160"; unsigned result = (((((192u<<8)|168u)<<8)|190u)<<8)|160u; int strtoul1(const char *a, char **b, int c) __attribute__((noinline, noclone)); int strtoul1(const char *a, char **b, int c) { *b = a+3; if (a == temp) return 192; else if (a == temp+4) return 168; else if (a == temp+8) return 190; else if (a == temp+12) return 160; __builtin_abort(); } int string_to_ip(const char *s) __attribute__((noinline,noclone)); int string_to_ip(const char *s) { int addr; char *e; int i; if (s == 0) return(0); for (addr=0, i=0; i<4; ++i) { int val = s ? strtoul1(s, &e, 10) : 0; addr <<= 8; addr |= (val & 0xFF); if (s) { s = (*e) ? e+1 : e; } } return addr; } int main(void) { int t = string_to_ip (temp); printf ("%x\n", t); printf ("%x\n", result); if (t != result) __builtin_abort (); printf ("WORKS.\n"); return 0; }