OLD | NEW |
| (Empty) |
1 // Copyright 2011 the V8 project authors. All rights reserved. | |
2 // Redistribution and use in source and binary forms, with or without | |
3 // modification, are permitted provided that the following conditions are | |
4 // met: | |
5 // | |
6 // * Redistributions of source code must retain the above copyright | |
7 // notice, this list of conditions and the following disclaimer. | |
8 // * Redistributions in binary form must reproduce the above | |
9 // copyright notice, this list of conditions and the following | |
10 // disclaimer in the documentation and/or other materials provided | |
11 // with the distribution. | |
12 // * Neither the name of Google Inc. nor the names of its | |
13 // contributors may be used to endorse or promote products derived | |
14 // from this software without specific prior written permission. | |
15 // | |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
27 | |
28 #include <stdarg.h> | |
29 | |
30 #include "v8.h" | |
31 | |
32 #include "platform.h" | |
33 | |
34 #include "sys/stat.h" | |
35 | |
36 namespace v8 { | |
37 namespace internal { | |
38 | |
39 | |
40 void PrintF(const char* format, ...) { | |
41 va_list arguments; | |
42 va_start(arguments, format); | |
43 OS::VPrint(format, arguments); | |
44 va_end(arguments); | |
45 } | |
46 | |
47 | |
48 void PrintF(FILE* out, const char* format, ...) { | |
49 va_list arguments; | |
50 va_start(arguments, format); | |
51 OS::VFPrint(out, format, arguments); | |
52 va_end(arguments); | |
53 } | |
54 | |
55 | |
56 void PrintPID(const char* format, ...) { | |
57 OS::Print("[%d] ", OS::GetCurrentProcessId()); | |
58 va_list arguments; | |
59 va_start(arguments, format); | |
60 OS::VPrint(format, arguments); | |
61 va_end(arguments); | |
62 } | |
63 | |
64 | |
65 void Flush(FILE* out) { | |
66 fflush(out); | |
67 } | |
68 | |
69 | |
70 char* ReadLine(const char* prompt) { | |
71 char* result = NULL; | |
72 char line_buf[256]; | |
73 int offset = 0; | |
74 bool keep_going = true; | |
75 fprintf(stdout, "%s", prompt); | |
76 fflush(stdout); | |
77 while (keep_going) { | |
78 if (fgets(line_buf, sizeof(line_buf), stdin) == NULL) { | |
79 // fgets got an error. Just give up. | |
80 if (result != NULL) { | |
81 DeleteArray(result); | |
82 } | |
83 return NULL; | |
84 } | |
85 int len = StrLength(line_buf); | |
86 if (len > 1 && | |
87 line_buf[len - 2] == '\\' && | |
88 line_buf[len - 1] == '\n') { | |
89 // When we read a line that ends with a "\" we remove the escape and | |
90 // append the remainder. | |
91 line_buf[len - 2] = '\n'; | |
92 line_buf[len - 1] = 0; | |
93 len -= 1; | |
94 } else if ((len > 0) && (line_buf[len - 1] == '\n')) { | |
95 // Since we read a new line we are done reading the line. This | |
96 // will exit the loop after copying this buffer into the result. | |
97 keep_going = false; | |
98 } | |
99 if (result == NULL) { | |
100 // Allocate the initial result and make room for the terminating '\0' | |
101 result = NewArray<char>(len + 1); | |
102 } else { | |
103 // Allocate a new result with enough room for the new addition. | |
104 int new_len = offset + len + 1; | |
105 char* new_result = NewArray<char>(new_len); | |
106 // Copy the existing input into the new array and set the new | |
107 // array as the result. | |
108 OS::MemCopy(new_result, result, offset * kCharSize); | |
109 DeleteArray(result); | |
110 result = new_result; | |
111 } | |
112 // Copy the newly read line into the result. | |
113 OS::MemCopy(result + offset, line_buf, len * kCharSize); | |
114 offset += len; | |
115 } | |
116 ASSERT(result != NULL); | |
117 result[offset] = '\0'; | |
118 return result; | |
119 } | |
120 | |
121 | |
122 char* ReadCharsFromFile(FILE* file, | |
123 int* size, | |
124 int extra_space, | |
125 bool verbose, | |
126 const char* filename) { | |
127 if (file == NULL || fseek(file, 0, SEEK_END) != 0) { | |
128 if (verbose) { | |
129 OS::PrintError("Cannot read from file %s.\n", filename); | |
130 } | |
131 return NULL; | |
132 } | |
133 | |
134 // Get the size of the file and rewind it. | |
135 *size = ftell(file); | |
136 rewind(file); | |
137 | |
138 char* result = NewArray<char>(*size + extra_space); | |
139 for (int i = 0; i < *size && feof(file) == 0;) { | |
140 int read = static_cast<int>(fread(&result[i], 1, *size - i, file)); | |
141 if (read != (*size - i) && ferror(file) != 0) { | |
142 fclose(file); | |
143 DeleteArray(result); | |
144 return NULL; | |
145 } | |
146 i += read; | |
147 } | |
148 return result; | |
149 } | |
150 | |
151 | |
152 char* ReadCharsFromFile(const char* filename, | |
153 int* size, | |
154 int extra_space, | |
155 bool verbose) { | |
156 FILE* file = OS::FOpen(filename, "rb"); | |
157 char* result = ReadCharsFromFile(file, size, extra_space, verbose, filename); | |
158 if (file != NULL) fclose(file); | |
159 return result; | |
160 } | |
161 | |
162 | |
163 byte* ReadBytes(const char* filename, int* size, bool verbose) { | |
164 char* chars = ReadCharsFromFile(filename, size, 0, verbose); | |
165 return reinterpret_cast<byte*>(chars); | |
166 } | |
167 | |
168 | |
169 static Vector<const char> SetVectorContents(char* chars, | |
170 int size, | |
171 bool* exists) { | |
172 if (!chars) { | |
173 *exists = false; | |
174 return Vector<const char>::empty(); | |
175 } | |
176 chars[size] = '\0'; | |
177 *exists = true; | |
178 return Vector<const char>(chars, size); | |
179 } | |
180 | |
181 | |
182 Vector<const char> ReadFile(const char* filename, | |
183 bool* exists, | |
184 bool verbose) { | |
185 int size; | |
186 char* result = ReadCharsFromFile(filename, &size, 1, verbose); | |
187 return SetVectorContents(result, size, exists); | |
188 } | |
189 | |
190 | |
191 Vector<const char> ReadFile(FILE* file, | |
192 bool* exists, | |
193 bool verbose) { | |
194 int size; | |
195 char* result = ReadCharsFromFile(file, &size, 1, verbose, ""); | |
196 return SetVectorContents(result, size, exists); | |
197 } | |
198 | |
199 | |
200 int WriteCharsToFile(const char* str, int size, FILE* f) { | |
201 int total = 0; | |
202 while (total < size) { | |
203 int write = static_cast<int>(fwrite(str, 1, size - total, f)); | |
204 if (write == 0) { | |
205 return total; | |
206 } | |
207 total += write; | |
208 str += write; | |
209 } | |
210 return total; | |
211 } | |
212 | |
213 | |
214 int AppendChars(const char* filename, | |
215 const char* str, | |
216 int size, | |
217 bool verbose) { | |
218 FILE* f = OS::FOpen(filename, "ab"); | |
219 if (f == NULL) { | |
220 if (verbose) { | |
221 OS::PrintError("Cannot open file %s for writing.\n", filename); | |
222 } | |
223 return 0; | |
224 } | |
225 int written = WriteCharsToFile(str, size, f); | |
226 fclose(f); | |
227 return written; | |
228 } | |
229 | |
230 | |
231 int WriteChars(const char* filename, | |
232 const char* str, | |
233 int size, | |
234 bool verbose) { | |
235 FILE* f = OS::FOpen(filename, "wb"); | |
236 if (f == NULL) { | |
237 if (verbose) { | |
238 OS::PrintError("Cannot open file %s for writing.\n", filename); | |
239 } | |
240 return 0; | |
241 } | |
242 int written = WriteCharsToFile(str, size, f); | |
243 fclose(f); | |
244 return written; | |
245 } | |
246 | |
247 | |
248 int WriteBytes(const char* filename, | |
249 const byte* bytes, | |
250 int size, | |
251 bool verbose) { | |
252 const char* str = reinterpret_cast<const char*>(bytes); | |
253 return WriteChars(filename, str, size, verbose); | |
254 } | |
255 | |
256 | |
257 | |
258 void StringBuilder::AddFormatted(const char* format, ...) { | |
259 va_list arguments; | |
260 va_start(arguments, format); | |
261 AddFormattedList(format, arguments); | |
262 va_end(arguments); | |
263 } | |
264 | |
265 | |
266 void StringBuilder::AddFormattedList(const char* format, va_list list) { | |
267 ASSERT(!is_finalized() && position_ <= buffer_.length()); | |
268 int n = OS::VSNPrintF(buffer_ + position_, format, list); | |
269 if (n < 0 || n >= (buffer_.length() - position_)) { | |
270 position_ = buffer_.length(); | |
271 } else { | |
272 position_ += n; | |
273 } | |
274 } | |
275 | |
276 } } // namespace v8::internal | |
OLD | NEW |