/* cat.c -- program to concatenate named files and/or stdin onto stdout */ /* version 2 */ #include #include #include #include #include "support.h" /* parameters */ enum { U }; int main(int argc, char **argv) { int i, c, bufsize, newbufsize; char *buf, *newbuf; char pars[1] = {0}; FILE *fd; i = c = bufsize = newbufsize = 0; buf = newbuf = 0; fd = 0; /* i < argc is obvious; steps through all provided args. */ /* !argc-optind && !c is a little less so - it allows this loop to run once if the user provides no paths */ do { if( !(fd = file_open(argv[i], "r"))) { throw(FOPEN_FAIL, mastrcat(argv[0], mastrcat(": could not open file ", argv[i]))); } if(pars[U]) { for(; (c = fgetc(fd)) != EOF; c = 0) { fputc(c, stdout); } } else { newbuf = file_read(fd, &newbufsize); buf = concat(buf, newbuf, bufsize, newbufsize); bufsize += newbufsize; free(newbuf); } i++, newbufsize = 0; } while((i < argc) || (((argc - optind) == 0) && !c)); if(!pars[U]) { fwrite(buf, sizeof(char), bufsize, stdout); } exit(EXIT_SUCCESS); }