#include unsigned char buffer[256]; char *signed_buffer = (char*)buffer; int buffer_size, index, width, height, c, x, y, i; FILE *input; #define IF(t, cond, f) if( cond ) { t; } else { f; } void GetChar() { c = EOF; IF(c = buffer[index++], index < buffer_size || ((buffer_size = fread(buffer, 1, 256, input)) && !(index = 0)), ;) } int CompareHeader(int index, char *expected) { return index < buffer_size && *expected ? signed_buffer[index] == *expected && CompareHeader(index + 1, expected + 1) : 1; } void GetImageSize() { #define INPUT_BYTE do{GetChar(); if( c == EOF ) return;} while(0); buffer_size = index = 0; width = height = 0; INPUT_BYTE IF(width = (buffer[7] << 8) | buffer[6]; height = (buffer[9] << 8) | buffer[8], CompareHeader(0, "GIF87a") || CompareHeader(0, "GIF89a"), IF(for(index = 2;;) { for(c = 0; c - 0xff;) INPUT_BYTE INPUT_BYTE IF(for(x = 0; x < 3; x++) INPUT_BYTE INPUT_BYTE x = c << 8; INPUT_BYTE x |= c; INPUT_BYTE y = c << 8; INPUT_BYTE height = x; width = y | c; return, c >= 0xc0 && c <= 0xcf && c != 0xc4, ;) INPUT_BYTE x = c << 8; INPUT_BYTE x |= c; for(x -= 2; x > 0; x--) INPUT_BYTE }, CompareHeader(0, "\xff\xd8"), IF(width = (buffer[16] << 24) | (buffer[17] << 16) | (buffer[18] << 8) | buffer[19]; height = (buffer[20] << 24) | (buffer[21] << 16) | (buffer[22] << 8) | buffer[23], CompareHeader(0, "\x89PNG\r\n\x1a\n"), IF(for(index = 2; index < buffer_size; index++) IF(;, buffer[index] - 35, for(; index < buffer_size && buffer[index] - 10; index++) buffer[index] = 32; buffer[index] = 32) buffer[sizeof(buffer) - 1] = 0; IF(IF(width = height = 0, sscanf(signed_buffer, "P%d %d %d", &index, &width, &height) - 3, ;), buffer[1] - 55, IF(width = height = 0, sscanf(signed_buffer, "P7 WIDTH %d HEIGHT %d", &width, &height) - 2, ;)), buffer[0] == 80 && buffer[1] > 48 && buffer[1] < 56, ;)))) } int main(int argc, char **argv) { IF(for(i = 1; i < argc; i++) { IF(GetImageSize(); fclose(input), (input = fopen(argv[i], "rb")), ;) printf("%d %d %s\n", width, height, argv[i]); }, argc > 1, input = stdin; GetImageSize(); printf("%d %d\n", width, height)) return 0; }