| #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(b) |
| Buffer *b; |
| { |
| b->room = INIT_BUFFER_SIZE; |
| b->used = 0; |
| b->buff = (char *)malloc(INIT_BUFFER_SIZE*sizeof(char)); |
| } |
| |
| void AppendToBuffer(b, str, len) |
| 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, input) |
| 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; |
| } |