1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <string.h> |
4 | |
5 | |
6 | typedef struct _Buffer { |
7 | char *buff; |
8 | int room, used; |
9 | } Buffer; |
10 | |
11 | void InitBuffer (Buffer *b); |
12 | void AppendToBuffer (Buffer *b, const char *str, int len); |
13 | void ReadFile (Buffer *buffer, FILE *input); |
14 | |
15 | #define INIT_BUFFER_SIZE 10000 |
16 | |
17 | void |
18 | InitBuffer (Buffer *b) |
19 | { |
20 | b->room = INIT_BUFFER_SIZE; |
21 | b->used = 0; |
22 | b->buff = (char *)malloc(INIT_BUFFER_SIZE*sizeof(char)); |
23 | } |
24 | |
25 | void |
26 | AppendToBuffer (Buffer *b, const char *str, int len) |
27 | { |
28 | while (b->used + len > b->room) { |
29 | b->buff = (char *)realloc(ptr: b->buff, size: 2*b->room*(sizeof(char))); |
30 | b->room *= 2; |
31 | } |
32 | strncpy(b->buff + b->used, str, len); |
33 | b->used += len; |
34 | } |
35 | |
36 | void |
37 | ReadFile (Buffer *buffer, FILE *input) |
38 | { |
39 | char buf[BUFSIZ + 1]; |
40 | int bytes; |
41 | |
42 | buffer->used = 0; |
43 | while (!feof(stream: input) && (bytes = fread(ptr: buf, size: 1, BUFSIZ, stream: input)) > 0) { |
44 | AppendToBuffer(b: buffer, str: buf, len: bytes); |
45 | } |
46 | AppendToBuffer(b: buffer, str: "" , len: 1); |
47 | } |
48 | |
49 | int |
50 | main(int argc, char *argv[]) |
51 | { |
52 | char filename[] = "xbug.c" ; |
53 | FILE *input; |
54 | Buffer buffer; |
55 | |
56 | InitBuffer(b: &buffer); |
57 | |
58 | if (!freopen (filename: filename, modes: "r" , stdin)) |
59 | fprintf(stderr, "cannot open file\n" ); |
60 | |
61 | unsetenv (name: "LD_LIBRARY_PATH" ); |
62 | |
63 | if (!(input = popen(command: "/bin/cat" , modes: "r" ))) |
64 | fprintf(stderr, "cannot run \n" ); |
65 | |
66 | ReadFile(buffer: &buffer, input); |
67 | pclose(stream: input); |
68 | |
69 | return 0; |
70 | } |
71 | |