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