#include #define STR_SIZE 4096 /* may need to be increased /* dog: like cat, but the other way ;) */ main(int argc, char **argv) { int i, j; int success, offset; int *fstatus; FILE *fp; FILE **gp; char **buffer; char sep[STR_SIZE]; int multflag = 0; fp=stdout; offset = 1; sprintf(sep, " "); /* simple space separator */ gp = (FILE **) malloc((argc-offset)*sizeof(FILE *)); buffer = (char **) malloc((argc-offset)*sizeof(char *)); fstatus = (int *) malloc((argc-offset)*sizeof(int)); for(i=offset; i < argc; i++) { if((gp[i-offset] = fopen(argv[i], "r")) == NULL) { fprintf(stderr, "\n%s: Can't open file %s\n", argv[0], argv[i]); } buffer[i-offset] = (char *) malloc(STR_SIZE*sizeof(char)); fstatus[i-offset] = 1; } success = 1; while(success) { success=0; for(i=offset; i < argc; i++) { j = i - offset; if(fstatus[j]) { if(!fgets(buffer[j], STR_SIZE-1, gp[j])) { fstatus[j] = 0; continue; } if(buffer[j][strlen(buffer[j])-1] == '\n') { buffer[j][strlen(buffer[j])-1] = '\0'; } fprintf(fp, "%s", buffer[j]); if(i < (argc-1)) { fprintf(fp, "%s", sep); } } if(fstatus[j] > success) { success = fstatus[j]; } } if(success) { fprintf(fp, "\n"); } } for(i=offset; i < argc; i++) { free(buffer[i-offset]); fclose(gp[i-offset]); } free(buffer); free(gp); free(fstatus); fclose(fp); }