| 6 |  | */ | 
| 7 |  |  | 
| 8 |  | #include <stdlib.h> | 
| 9 | – | #include <unistd.h> | 
| 9 |  | #include <string.h> | 
| 10 |  | #include <ctype.h> | 
| 11 |  | #include "platform.h" | 
| 12 |  | #include "rtio.h" | 
| 13 |  | #include "resolu.h" | 
| 14 | < | #ifndef _WIN32 | 
| 14 | > | #ifdef _WIN32 | 
| 15 | > | #undef ftello | 
| 16 | > | #define ftello  ftell | 
| 17 | > | #undef ssize_t | 
| 18 | > | #define ssize_t size_t | 
| 19 | > | #else | 
| 20 |  | #include <sys/mman.h> | 
| 21 |  | #endif | 
| 22 |  |  | 
| 103 |  | static int | 
| 104 |  | load_stream(MEMLOAD *mp, FILE *fp) | 
| 105 |  | { | 
| 106 | + | size_t  alloced = 0; | 
| 107 |  | char    buf[8192]; | 
| 108 |  | size_t  nr; | 
| 109 |  |  | 
| 115 |  | if (fp == NULL) | 
| 116 |  | return(-1); | 
| 117 |  | while ((nr = fread(buf, 1, sizeof(buf), fp)) > 0) { | 
| 118 | < | if (!mp->len) | 
| 118 | > | if (!alloced) | 
| 119 |  | mp->base = malloc(nr); | 
| 120 | < | else | 
| 121 | < | mp->base = realloc(mp->base, mp->len+nr); | 
| 120 | > | else if (mp->len+nr > alloced) | 
| 121 | > | mp->base = realloc(mp->base, | 
| 122 | > | alloced = alloced*(2+(nr==sizeof(buf)))/2+nr); | 
| 123 |  | if (mp->base == NULL) | 
| 124 |  | return(-1); | 
| 125 |  | memcpy((char *)mp->base + mp->len, buf, nr); | 
| 129 |  | free_load(mp); | 
| 130 |  | return(-1); | 
| 131 |  | } | 
| 132 | + | if (alloced > mp->len*5/4)      /* don't waste too much space */ | 
| 133 | + | mp->base = realloc(mp->base, mp->len); | 
| 134 |  | return(mp->len > 0); | 
| 135 |  | } | 
| 136 |  |  |