diff options
Diffstat (limited to 'xs_io.h')
| -rw-r--r-- | xs_io.h | 19 |
1 files changed, 11 insertions, 8 deletions
| @@ -59,26 +59,29 @@ d_char *xs_readline(FILE *f) | |||
| 59 | d_char *xs_read(FILE *f, int *sz) | 59 | d_char *xs_read(FILE *f, int *sz) |
| 60 | /* reads up to size bytes from f */ | 60 | /* reads up to size bytes from f */ |
| 61 | { | 61 | { |
| 62 | d_char *s; | 62 | d_char *s = NULL; |
| 63 | int size = *sz; | 63 | int size = *sz; |
| 64 | int rdsz = 0; | 64 | int rdsz = 0; |
| 65 | 65 | ||
| 66 | errno = 0; | 66 | errno = 0; |
| 67 | 67 | ||
| 68 | s = xs_str_new(NULL); | ||
| 69 | |||
| 70 | while (size > 0 && !feof(f)) { | 68 | while (size > 0 && !feof(f)) { |
| 71 | char tmp[2048]; | 69 | char tmp[4096]; |
| 72 | int n, r; | 70 | int n, r; |
| 73 | 71 | ||
| 74 | if ((n = sizeof(tmp)) > size) | 72 | if ((n = sizeof(tmp)) > size) |
| 75 | n = size; | 73 | n = size; |
| 76 | 74 | ||
| 77 | r = fread(tmp, 1, n, f); | 75 | r = fread(tmp, 1, n, f); |
| 78 | s = xs_append_m(s, tmp, r); | ||
| 79 | 76 | ||
| 80 | size -= r; | 77 | /* open room */ |
| 78 | s = xs_realloc(s, rdsz + r); | ||
| 79 | |||
| 80 | /* copy read data */ | ||
| 81 | memcpy(s + rdsz, tmp, r); | ||
| 82 | |||
| 81 | rdsz += r; | 83 | rdsz += r; |
| 84 | size -= r; | ||
| 82 | } | 85 | } |
| 83 | 86 | ||
| 84 | *sz = rdsz; | 87 | *sz = rdsz; |