diff options
Diffstat (limited to 'REORG.TODO/stdio-common/xbug.c')
-rw-r--r-- | REORG.TODO/stdio-common/xbug.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/REORG.TODO/stdio-common/xbug.c b/REORG.TODO/stdio-common/xbug.c new file mode 100644 index 0000000000..06f74aff00 --- /dev/null +++ b/REORG.TODO/stdio-common/xbug.c @@ -0,0 +1,70 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +typedef struct _Buffer { + char *buff; + int room, used; +} Buffer; + +void InitBuffer (Buffer *b); +void AppendToBuffer (Buffer *b, const char *str, int len); +void ReadFile (Buffer *buffer, FILE *input); + +#define INIT_BUFFER_SIZE 10000 + +void +InitBuffer (Buffer *b) +{ + b->room = INIT_BUFFER_SIZE; + b->used = 0; + b->buff = (char *)malloc(INIT_BUFFER_SIZE*sizeof(char)); +} + +void +AppendToBuffer (Buffer *b, const char *str, int len) +{ + while (b->used + len > b->room) { + b->buff = (char *)realloc(b->buff, 2*b->room*(sizeof(char))); + b->room *= 2; + } + strncpy(b->buff + b->used, str, len); + b->used += len; +} + +void +ReadFile (Buffer *buffer, FILE *input) +{ + char buf[BUFSIZ + 1]; + int bytes; + + buffer->used = 0; + while (!feof(input) && (bytes = fread(buf, 1, BUFSIZ, input)) > 0) { + AppendToBuffer(buffer, buf, bytes); + } + AppendToBuffer(buffer, "", 1); +} + +int +main(int argc, char *argv[]) +{ + char filename[] = "xbug.c"; + FILE *input; + Buffer buffer; + + InitBuffer(&buffer); + + if (!freopen (filename, "r", stdin)) + fprintf(stderr, "cannot open file\n"); + + unsetenv ("LD_LIBRARY_PATH"); + + if (!(input = popen("/bin/cat", "r"))) + fprintf(stderr, "cannot run \n"); + + ReadFile(&buffer, input); + pclose(input); + + return 0; +} |