char Get_Hex_Value( unsigned long v) { v &= 0xF; if (v < 10) return (v + 0x30); else return (v + 0x37); } int Get_Num_Value( char c) { c = toupper(c); if (isdigit(c)) return (c - 0x30); else return (c - 0x37); } int DecodeStarcraftKey( char *key) { unsigned long /*r*/n, n2, v, v2/*, keyvalue*/; char /*c1, */c2, c; int bValid; int i; v = 3; for (i = 0; i < 12; i++) { c = key[i]; n = Get_Num_Value(c); n2 = v * 2; n ^= n2; v += n; } v %= 10; if (Get_Hex_Value(v) == key[12]) bValid = 0; else bValid = -1; v = 194; for (i = 11; /*v >= 7,*/ i >= 0; i--) { c = key[i]; n = v / 12; n2 = v % 12; v -= 17; c2 = key[n2]; key[i] = c2; key[n2] = c; } v2 = 0x13AC9741; for (i = 11; i >= 0; i--) { c = toupper(key[i]); key[i] = c; if (c <= '7') { v = v2; c2 = v & 0xFF; c2 &= 7; c2 ^= c; v >>= 3; key[i] = c2; v2 = v; } else if (c < 'A') { c2 = (unsigned char) i; c2 &= 1; c2 ^= c; key[i] = c2; } } return bValid; }