/* filter4.c - Don Yang (uguu.org) 05/11/02 */ #include #include #include #define Err(_) fprintf(stderr, "error:%s\n", e[_]) int main(int g, char **a) { char t[16], *d, *m, *e[6] = {"malloc", "open", "create", "write", "remove", "rename"}; FILE *p, *q; int i = 0, c, s, x; p = stdin; q = stdout; if( g > 1 ) { if( strcmp(a[1], "-") ) if( !(p = fopen(a[1], "rb")) ) return Err(1); if( g > 2 ) { if( p - stdin && !strcmp(a[1], a[2]) ) { for(i = 1; i < 999; i++) { sprintf(t, "tmp.%d", i); if( !(q = fopen(t, "rb")) ) if( (q = fopen(t, "wb+")) ) i = 1000; } if( i == 999 ) { fclose(p); return Err(2); } } else { if( !(q = fopen(a[2], "wb+")) ) return Err(2); } } } if( !(d = (char*)malloc(s = 256)) ) { g = Err(0); } else { for(x = g = 0; (c = fgetc(p)) > -1 && !g;) { if( c == 13 || c == 10 ) { if( fputc(c, q) < 0 ) { free(d); g = Err(3); } x = 0; } else if( c == 32 || c == 9 ) { d[x++] = (char)c; if( x >= s ) { if( !(m = (char*)realloc(d, s *= 2)) ) { if( (m = (char*)malloc(s)) ) { memcpy(m, d, s / 2); free(d); d = m; } else { free(d); g = Err(0); } } } } else { if( x ) { if( fwrite(d, x, 1, q) - 1 ) { free(d); g = Err(3); } x = 0; } if( fputc(c, q) < 0 ) { free(d); g = Err(3); } } } free(d); } if( p - stdin ) fclose(p); if( q - stdout ) fclose(q); if( i && !g ) { if( remove(a[1]) ) g = Err(4); if( rename(t, a[2]) ) g = Err(5); } return g; }