1ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <stdarg.h>
6865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#include <sys/stat.h>
7865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
9865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/logging.h"
115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h"
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
1571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.orgSimpleStringBuilder::SimpleStringBuilder(int size) {
19b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  buffer_ = Vector<char>::New(size);
207276f14ca716596e0a0d17539516370c1f453847kasper.lund  position_ = 0;
217276f14ca716596e0a0d17539516370c1f453847kasper.lund}
227276f14ca716596e0a0d17539516370c1f453847kasper.lund
237276f14ca716596e0a0d17539516370c1f453847kasper.lund
24ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.orgvoid SimpleStringBuilder::AddString(const char* s) {
25c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  AddSubstring(s, StrLength(s));
267276f14ca716596e0a0d17539516370c1f453847kasper.lund}
277276f14ca716596e0a0d17539516370c1f453847kasper.lund
287276f14ca716596e0a0d17539516370c1f453847kasper.lund
29ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.orgvoid SimpleStringBuilder::AddSubstring(const char* s, int n) {
30e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!is_finalized() && position_ + n <= buffer_.length());
31e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(static_cast<size_t>(n) <= strlen(s));
32d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MemCopy(&buffer_[position_], s, n * kCharSize);
337276f14ca716596e0a0d17539516370c1f453847kasper.lund  position_ += n;
347276f14ca716596e0a0d17539516370c1f453847kasper.lund}
357276f14ca716596e0a0d17539516370c1f453847kasper.lund
367276f14ca716596e0a0d17539516370c1f453847kasper.lund
37ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.orgvoid SimpleStringBuilder::AddPadding(char c, int count) {
38ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  for (int i = 0; i < count; i++) {
39ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    AddCharacter(c);
407276f14ca716596e0a0d17539516370c1f453847kasper.lund  }
417276f14ca716596e0a0d17539516370c1f453847kasper.lund}
427276f14ca716596e0a0d17539516370c1f453847kasper.lund
437276f14ca716596e0a0d17539516370c1f453847kasper.lund
44ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.orgvoid SimpleStringBuilder::AddDecimalInteger(int32_t value) {
45ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  uint32_t number = static_cast<uint32_t>(value);
46ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  if (value < 0) {
47ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    AddCharacter('-');
48ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    number = static_cast<uint32_t>(-value);
49ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  }
50ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  int digits = 1;
51ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  for (uint32_t factor = 10; digits < 10; digits++, factor *= 10) {
52ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    if (factor > number) break;
53ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  }
54ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  position_ += digits;
55ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  for (int i = 1; i <= digits; i++) {
56ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    buffer_[position_ - i] = '0' + static_cast<char>(number % 10);
57ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    number /= 10;
587276f14ca716596e0a0d17539516370c1f453847kasper.lund  }
597276f14ca716596e0a0d17539516370c1f453847kasper.lund}
607276f14ca716596e0a0d17539516370c1f453847kasper.lund
617276f14ca716596e0a0d17539516370c1f453847kasper.lund
62ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.orgchar* SimpleStringBuilder::Finalize() {
63e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!is_finalized() && position_ <= buffer_.length());
64e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // If there is no space for null termination, overwrite last character.
65e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (position_ == buffer_.length()) {
66e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    position_--;
67e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    // Print ellipsis.
68e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    for (int i = 3; i > 0 && position_ > i; --i) buffer_[position_ - i] = '.';
69e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
707276f14ca716596e0a0d17539516370c1f453847kasper.lund  buffer_[position_] = '\0';
717276f14ca716596e0a0d17539516370c1f453847kasper.lund  // Make sure nobody managed to add a 0-character to the
727276f14ca716596e0a0d17539516370c1f453847kasper.lund  // buffer while building the string.
73e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(strlen(buffer_.start()) == static_cast<size_t>(position_));
747276f14ca716596e0a0d17539516370c1f453847kasper.lund  position_ = -1;
75e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_finalized());
76b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  return buffer_.start();
777276f14ca716596e0a0d17539516370c1f453847kasper.lund}
787276f14ca716596e0a0d17539516370c1f453847kasper.lund
79efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
80865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid PrintF(const char* format, ...) {
81865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_list arguments;
82865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_start(arguments, format);
835de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::OS::VPrint(format, arguments);
84865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_end(arguments);
85865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
86865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
87865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
88865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid PrintF(FILE* out, const char* format, ...) {
89865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_list arguments;
90865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_start(arguments, format);
915de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::OS::VFPrint(out, format, arguments);
92865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_end(arguments);
93865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
94865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
95865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
96865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid PrintPID(const char* format, ...) {
975de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::OS::Print("[%d] ", base::OS::GetCurrentProcessId());
98865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_list arguments;
99865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_start(arguments, format);
1005de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::OS::VPrint(format, arguments);
101865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_end(arguments);
102865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
103865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
104865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
10570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgint SNPrintF(Vector<char> str, const char* format, ...) {
10670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  va_list args;
10770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  va_start(args, format);
10870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  int result = VSNPrintF(str, format, args);
10970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  va_end(args);
11070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  return result;
11170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org}
11270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org
11370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org
11470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgint VSNPrintF(Vector<char> str, const char* format, va_list args) {
1155de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  return base::OS::VSNPrintF(str.start(), str.length(), format, args);
11670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org}
11770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org
11870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org
11970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgvoid StrNCpy(Vector<char> dest, const char* src, size_t n) {
1205de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::OS::StrNCpy(dest.start(), dest.length(), src, n);
12170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org}
12270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org
12370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org
124865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid Flush(FILE* out) {
125865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  fflush(out);
126865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
127865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
128865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
129865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgchar* ReadLine(const char* prompt) {
130865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  char* result = NULL;
131865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  char line_buf[256];
132865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  int offset = 0;
133865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  bool keep_going = true;
134865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  fprintf(stdout, "%s", prompt);
135865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  fflush(stdout);
136865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  while (keep_going) {
137865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (fgets(line_buf, sizeof(line_buf), stdin) == NULL) {
138865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // fgets got an error. Just give up.
139865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      if (result != NULL) {
140865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org        DeleteArray(result);
141865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      }
142865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      return NULL;
143865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
144865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    int len = StrLength(line_buf);
145865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (len > 1 &&
146865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org        line_buf[len - 2] == '\\' &&
147865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org        line_buf[len - 1] == '\n') {
148865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // When we read a line that ends with a "\" we remove the escape and
149865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // append the remainder.
150865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      line_buf[len - 2] = '\n';
151865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      line_buf[len - 1] = 0;
152865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      len -= 1;
153865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    } else if ((len > 0) && (line_buf[len - 1] == '\n')) {
154865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // Since we read a new line we are done reading the line. This
155865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // will exit the loop after copying this buffer into the result.
156865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      keep_going = false;
157865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
158865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (result == NULL) {
159865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // Allocate the initial result and make room for the terminating '\0'
160865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      result = NewArray<char>(len + 1);
161865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    } else {
162865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // Allocate a new result with enough room for the new addition.
163865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      int new_len = offset + len + 1;
164865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      char* new_result = NewArray<char>(new_len);
165865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // Copy the existing input into the new array and set the new
166865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      // array as the result.
167d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      MemCopy(new_result, result, offset * kCharSize);
168865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      DeleteArray(result);
169865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      result = new_result;
170865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
171865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    // Copy the newly read line into the result.
172d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    MemCopy(result + offset, line_buf, len * kCharSize);
173865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    offset += len;
174865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
175e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(result != NULL);
176865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  result[offset] = '\0';
177865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return result;
178865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
179865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
180865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
181865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgchar* ReadCharsFromFile(FILE* file,
182865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                        int* size,
183865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                        int extra_space,
184865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                        bool verbose,
185865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                        const char* filename) {
186865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (file == NULL || fseek(file, 0, SEEK_END) != 0) {
187865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (verbose) {
1885de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      base::OS::PrintError("Cannot read from file %s.\n", filename);
189865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
190865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    return NULL;
191865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
192865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
193865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  // Get the size of the file and rewind it.
194865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  *size = ftell(file);
195865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  rewind(file);
196865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
197865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  char* result = NewArray<char>(*size + extra_space);
198865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  for (int i = 0; i < *size && feof(file) == 0;) {
199865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    int read = static_cast<int>(fread(&result[i], 1, *size - i, file));
200865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (read != (*size - i) && ferror(file) != 0) {
201865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      fclose(file);
202865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      DeleteArray(result);
203865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      return NULL;
204865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
205865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    i += read;
206865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
207865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return result;
208865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
209865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
210865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
211865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgchar* ReadCharsFromFile(const char* filename,
212865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                        int* size,
213865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                        int extra_space,
214865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                        bool verbose) {
2155de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  FILE* file = base::OS::FOpen(filename, "rb");
216865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  char* result = ReadCharsFromFile(file, size, extra_space, verbose, filename);
217865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (file != NULL) fclose(file);
218865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return result;
219865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
220865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
221865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
222865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgbyte* ReadBytes(const char* filename, int* size, bool verbose) {
223865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  char* chars = ReadCharsFromFile(filename, size, 0, verbose);
224865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return reinterpret_cast<byte*>(chars);
225865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
226865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
227865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
228865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgstatic Vector<const char> SetVectorContents(char* chars,
229865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                            int size,
230865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                            bool* exists) {
231865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (!chars) {
232865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    *exists = false;
233865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    return Vector<const char>::empty();
234865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
235865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  chars[size] = '\0';
236865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  *exists = true;
237865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return Vector<const char>(chars, size);
238865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
239865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
240865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
241865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgVector<const char> ReadFile(const char* filename,
242865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                            bool* exists,
243865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                            bool verbose) {
244865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  int size;
245865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  char* result = ReadCharsFromFile(filename, &size, 1, verbose);
246865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return SetVectorContents(result, size, exists);
247865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
248865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
249865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
250865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgVector<const char> ReadFile(FILE* file,
251865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                            bool* exists,
252865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                            bool verbose) {
253865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  int size;
254865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  char* result = ReadCharsFromFile(file, &size, 1, verbose, "");
255865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return SetVectorContents(result, size, exists);
256865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
257865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
258865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
259865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgint WriteCharsToFile(const char* str, int size, FILE* f) {
260865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  int total = 0;
261865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  while (total < size) {
262865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    int write = static_cast<int>(fwrite(str, 1, size - total, f));
263865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (write == 0) {
264865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      return total;
265865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
266865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    total += write;
267865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    str += write;
268865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
269865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return total;
270865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
271865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
272865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
273865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgint AppendChars(const char* filename,
274865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                const char* str,
275865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                int size,
276865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                bool verbose) {
2775de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  FILE* f = base::OS::FOpen(filename, "ab");
278865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (f == NULL) {
279865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (verbose) {
2805de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      base::OS::PrintError("Cannot open file %s for writing.\n", filename);
281865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
282865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    return 0;
283865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
284865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  int written = WriteCharsToFile(str, size, f);
285865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  fclose(f);
286865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return written;
287865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
288865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
289865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
290865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgint WriteChars(const char* filename,
291865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org               const char* str,
292865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org               int size,
293865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org               bool verbose) {
2945de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  FILE* f = base::OS::FOpen(filename, "wb");
295865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (f == NULL) {
296865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (verbose) {
2975de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      base::OS::PrintError("Cannot open file %s for writing.\n", filename);
298865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
299865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    return 0;
300865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
301865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  int written = WriteCharsToFile(str, size, f);
302865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  fclose(f);
303865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return written;
304865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
305865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
306865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
307865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgint WriteBytes(const char* filename,
308865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org               const byte* bytes,
309865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org               int size,
310865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org               bool verbose) {
311865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  const char* str = reinterpret_cast<const char*>(bytes);
312865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return WriteChars(filename, str, size, verbose);
313865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
314865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
315865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
316865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
317865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid StringBuilder::AddFormatted(const char* format, ...) {
318865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_list arguments;
319865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_start(arguments, format);
320865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  AddFormattedList(format, arguments);
321865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  va_end(arguments);
322865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
323865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
324865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
325865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid StringBuilder::AddFormattedList(const char* format, va_list list) {
326e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!is_finalized() && position_ <= buffer_.length());
32770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  int n = VSNPrintF(buffer_ + position_, format, list);
328865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (n < 0 || n >= (buffer_.length() - position_)) {
329865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    position_ = buffer_.length();
330865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  } else {
331865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    position_ += n;
332865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
333865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
334865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
335865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
336d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87
337d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgstatic void MemMoveWrapper(void* dest, const void* src, size_t size) {
338d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  memmove(dest, src, size);
339d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
340d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
341d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
342d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Initialize to library version so we can call this at any time during startup.
343d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgstatic MemMoveFunction memmove_function = &MemMoveWrapper;
344d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
345d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Defined in codegen-ia32.cc.
346d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgMemMoveFunction CreateMemMoveFunction();
347d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
348d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Copy memory area to disjoint memory area.
349d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgvoid MemMove(void* dest, const void* src, size_t size) {
350d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  if (size == 0) return;
351d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // Note: here we rely on dependent reads being ordered. This is true
352d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // on all architectures we currently support.
353d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  (*memmove_function)(dest, src, size);
354d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
355d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
356d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#elif V8_OS_POSIX && V8_HOST_ARCH_ARM
357d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgvoid MemCopyUint16Uint8Wrapper(uint16_t* dest, const uint8_t* src,
358d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                               size_t chars) {
359d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  uint16_t* limit = dest + chars;
360d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  while (dest < limit) {
361d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    *dest++ = static_cast<uint16_t>(*src++);
362d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
363d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
364d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
365d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
366d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgMemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper;
367d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgMemCopyUint16Uint8Function memcopy_uint16_uint8_function =
368d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    &MemCopyUint16Uint8Wrapper;
369d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Defined in codegen-arm.cc.
370d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgMemCopyUint8Function CreateMemCopyUint8Function(MemCopyUint8Function stub);
371d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgMemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function(
372d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    MemCopyUint16Uint8Function stub);
373d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
374d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#elif V8_OS_POSIX && V8_HOST_ARCH_MIPS
375d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgMemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper;
376d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Defined in codegen-mips.cc.
377d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgMemCopyUint8Function CreateMemCopyUint8Function(MemCopyUint8Function stub);
378d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#endif
379d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
380d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
381d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgvoid init_memcopy_functions() {
382d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87
383d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MemMoveFunction generated_memmove = CreateMemMoveFunction();
384d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  if (generated_memmove != NULL) {
385d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    memmove_function = generated_memmove;
386d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
387d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#elif V8_OS_POSIX && V8_HOST_ARCH_ARM
388d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  memcopy_uint8_function = CreateMemCopyUint8Function(&MemCopyUint8Wrapper);
389d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  memcopy_uint16_uint8_function =
390d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CreateMemCopyUint16Uint8Function(&MemCopyUint16Uint8Wrapper);
391d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#elif V8_OS_POSIX && V8_HOST_ARCH_MIPS
392d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  memcopy_uint8_function = CreateMemCopyUint8Function(&MemCopyUint8Wrapper);
393d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#endif
394d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
395d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
396d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
39708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgbool DoubleToBoolean(double d) {
39808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  // NaN, +0, and -0 should return the false object
39908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#if __BYTE_ORDER == __LITTLE_ENDIAN
40008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  union IeeeDoubleLittleEndianArchType u;
40108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#elif __BYTE_ORDER == __BIG_ENDIAN
40208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  union IeeeDoubleBigEndianArchType u;
40308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#endif
40408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  u.d = d;
40508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  if (u.bits.exp == 2047) {
40608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    // Detect NaN for IEEE double precision floating point.
40708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    if ((u.bits.man_low | u.bits.man_high) != 0) return false;
40808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
40908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  if (u.bits.exp == 0) {
41008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    // Detect +0, and -0 for IEEE double precision floating point.
41108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    if ((u.bits.man_low | u.bits.man_high) == 0) return false;
41208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
41308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  return true;
41408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org}
41508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
41608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
418