/* Test hash function to convert escape sequences to code. */ #include static int Convert(int d) { return d >= '0' && d <= '9' ? d - '0' : (d >= 'a' && d <= 'f') || (d >= 'A' && d <= 'F') ? (d & 15) + 9 : -1; } static int Gold(const char *d) { int c = *d; if( c == '\\' ) { switch( *++d ) { case 'a': c = '\a'; break; case 'b': c = '\b'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case 'x': c = Convert(d[1]) >= 0 ? Convert(d[2]) >= 0 ? Convert(d[1]) * 16 + Convert(d[2]) : Convert(d[1]) : 'x'; break; default: c = *d; break; } } return c; } #if 0 static int Test(const char *d) { int a; return *d - 92 ? *d : (a = *++d) - 'r' ? a - 'v' ? a - 'n' ? a - 't' ? a - 'b' ? a - 'a' ? a - 'x' ? a : Convert(d[1]) >= 0 ? Convert(d[2]) >= 0 ? (d += 2), Convert(d[-1]) * 16 + Convert(*d) : Convert(*++d) : 'x' : 7 : 8 : 9 : 10 : 11 : 13; } #else static int Test(const char *d) { int a; return *d - 92 ? *d : (a = *++d - 114) ? a - 4 ? a + 4 ? a - 2 ? a + 16 ? a + 17 ? a - 6 ? *d : Convert(d[1]) >= 0 ? Convert(d[2]) >= 0 ? (d += 2), Convert(d[-1]) * 16 + Convert(*d) : Convert(*++d) : 'x' : 7 : 8 : 9 : 10 : 11 : 13; } #endif int main(void) { char text[5] = "\\xff"; int c, correct; correct = 0; for(c = 1; c < 256; c++) { text[1] = c; if( Gold(text) == Test(text) ) correct++; } if( correct == 255 ) puts("ok"); return 0; }