#include static unsigned char buffer[256]; static char *signed_buffer = (char*)buffer; static int buffer_size; static int index; static FILE *input; static int width, height; static int c, x, y; static void GetChar(void) { c = EOF; if( index < buffer_size || ((buffer_size = fread(buffer, 1, sizeof(buffer), input)) && !(index = 0)) ) c = buffer[index++]; } static int CompareHeader(int index, char *expected) { return index < buffer_size && *expected ? signed_buffer[index] == *expected && CompareHeader(index + 1, expected + 1) : 1; } static void GetImageSize(void) { #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 GetChar(); 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] == 'P' && buffer[1] >= '1' && buffer[1] <= '7' ) { for(index = 2; index < buffer_size; index++) if( buffer[index] == '#' ) { for(; index < buffer_size && buffer[index] != '\n'; index++) buffer[index] = ' '; buffer[index] = ' '; } buffer[sizeof(buffer) - 1] = '\0'; if( buffer[1] == '7' ) { if( sscanf(signed_buffer, "P7 WIDTH %d HEIGHT %d", &width, &height) != 2 ) width = height = 0; } else { if( sscanf(signed_buffer, "P%d %d %d", &index, &width, &height) != 3 ) width = height = 0; } } } int main(int argc, char **argv) { int i; 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; }