/* filter2.c - Don Yang (uguu.org) 05/11/02 */ #include #include #include #define Err(_) fprintf(stderr, "%s\n", text[_]) static char *text[6] = {"malloc", "open", "create", "write", "remove", "rename"}; int main(int argc, char **argv) { FILE *infile, *outfile; char tmpname[16], *buffer, *tmpbuffer; int status, i, c; size_t bufsize, bufindex; i = 0; infile = stdin; outfile = stdout; if( argc > 1 ) { if( strcmp(argv[1], "-") != 0 ) { if( (infile = fopen(argv[1], "rb")) == NULL ) return Err(1); } if( argc > 2 ) { if( infile != stdin && strcmp(argv[1], argv[2]) == 0 ) { for(i = 1; i < 999; i++) { sprintf(tmpname, "tmp.%d", i); if( (outfile = fopen(tmpname, "rb")) == NULL ) { if( (outfile = fopen(tmpname, "wb+")) != NULL ) i = 1000; } } if( i == 999 ) { Err(2); fclose(infile); return 1; } } else { if( (outfile = fopen(argv[2], "wb+")) == NULL ) return Err(2); } } } if( (buffer = (char*)malloc(bufsize = 256)) == NULL ) { Err(0); status = 1; } else { bufindex = 0; status = 0; while( (c = fgetc(infile)) != EOF && status == 0 ) { if( c == 13 || c == 10 ) { if( fputc(c, outfile) == EOF ) { Err(3); free(buffer); status = 1; } bufindex = 0; } else if( c == 32 || c == 9 ) { buffer[bufindex++] = (char)c; if( bufindex >= bufsize ) { tmpbuffer = (char*)realloc(buffer, bufsize *= 2); if( tmpbuffer == NULL ) { if( (tmpbuffer = (char*)malloc(bufsize)) == NULL ) { Err(0); free(buffer); status = 1; } else { memcpy(tmpbuffer, buffer, bufsize / 2); free(buffer); buffer = tmpbuffer; } } } } else { if( bufindex > 0 ) { if( fwrite(buffer, bufindex, 1, outfile) != 1 ) { Err(3); free(buffer); status = 1; } bufindex = 0; } if( fputc(c, outfile) == EOF ) { Err(3); free(buffer); status = 1; } } } free(buffer); } if( infile != stdin ) fclose(infile); if( outfile != stdout ) fclose(outfile); if( i != 0 && status == 0 ) { if( remove(argv[1]) != 0 ) { Err(4); status = 1; } if( rename(tmpname, argv[2]) != 0 ) { Err(5); status = 1; } } return status; }