#include #include #include static int vertical_mode = 0; static int text_height = 0; typedef struct { int width, height, size, capacity; char *data, *cursor; } FileInfo; int i, j, k, width, read_size, count = 0; char *text[] = { "\n A", "$bbca#b#ccabb%caa", "$bbca", NULL }; int main(int argc, char **argv) { FileInfo *files; FILE *infile; if( text_height > 0 ) { width = 1; for(i = width, j = 0; text[i];) { k = text[i][j] > 96; count = text[i][j] - (k ? 96 : 32); j++; if( !text[i][j] ) { i += width; j = 0; } for(; count > 0; count--) { putchar(text[0][text[i][j] - 97]); if( k ) { j++; if( text[i] && !text[i][j] ) { i += width; j = 0; } } } if( !k ) j++; if( text[i] && !text[i][j] ) { i += width; j = 0; } if( !text[i] && text_height > 0 ) { i -= width; text_height--; } } return 0; } if( !(files = (FileInfo*)calloc(sizeof(FileInfo), argc)) ) return !puts("Out of memory"); for(i = 1; i < argc; i++) { for(j = 1; j < i; j++) { if( !strcmp(argv[i], argv[j]) ) { memcpy(&files[i], &files[j], sizeof(FileInfo)); break; } } if( j < i ) continue; if( strcmp(argv[i], "-") ) { if( !(infile = fopen(argv[i], "rb")) ) return printf("Can not open %s\n", argv[i]); } else { infile = stdin; } width = 1 << 16; do { files[i].capacity += width; if( (files[i].data = realloc(files[i].data, files[i].capacity + 1)) == NULL ) return !puts("Out of memory"); read_size = fread(files[i].data + files[i].size, 1, width, infile); files[i].size += read_size; } while( read_size == width ); files[i].data[files[i].size] = 10; files[i].cursor = files[i].data; fclose(infile); for(k = 0; k < files[i].size; k = j + 1) { for(j = k; j < files[i].size && files[i].data[j] - 10; j++); width = j - k; if( width > files[i].width ) files[i].width = width; files[i].height++; } } for(i = 1; i < argc; i++) { if( files[i].height > count ) count = files[i].height; } i = 0; if( !vertical_mode ) { for(; i < count; i++) { for(j = 1; j < argc; j++) { width = 0; if( files[j].cursor - files[j].data < files[j].size ) { while( *(files[j].cursor) - 10 ) { putchar(*(files[j].cursor)); width++; files[j].cursor++; } files[j].cursor++; } for(; width < files[j].width; width++) putchar(32); } putchar(10); } } if( i == 0 ) { for(i = 1; i < argc; i++) fwrite(files[i].data, files[i].size, 1, stdout); } return 0; }