1 /* Copyright (c) 2017, Google Inc.
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15 #include <stdio.h>
16
17 #include <algorithm>
18 #include <vector>
19
20 #include "internal.h"
21
22
ReadAll(std::vector<uint8_t> * out,FILE * file)23 bool ReadAll(std::vector<uint8_t> *out, FILE *file) {
24 out->clear();
25
26 constexpr size_t kMaxSize = 1024 * 1024;
27 size_t len = 0;
28 out->resize(128);
29
30 for (;;) {
31 len += fread(out->data() + len, 1, out->size() - len, file);
32
33 if (feof(file)) {
34 out->resize(len);
35 return true;
36 }
37 if (ferror(file)) {
38 return false;
39 }
40
41 if (len == out->size()) {
42 if (out->size() == kMaxSize) {
43 fprintf(stderr, "Input too large.\n");
44 return false;
45 }
46 size_t cap = std::min(out->size() * 2, kMaxSize);
47 out->resize(cap);
48 }
49 }
50 }
51