1 : // Copyright 2006-2008 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 353510 : void StringBuilder::AddString(const char* s) {
40 353510 : AddSubstring(s, StrLength(s));
41 353510 : }
42 :
43 :
44 393324 : void StringBuilder::AddSubstring(const char* s, int n) {
45 393324 : ASSERT(!is_finalized() && position_ + n < buffer_.length());
46 393324 : ASSERT(static_cast<size_t>(n) <= strlen(s));
47 393324 : memcpy(&buffer_[position_], s, n * kCharSize);
48 393324 : position_ += n;
49 393324 : }
50 :
51 :
52 : // MOZ: This is not from V8. See DoubleToCString() for details.
53 57600 : void StringBuilder::AddInteger(int n) {
54 57600 : ASSERT(!is_finalized() && position_ < buffer_.length());
55 : // Get the number of digits.
56 57600 : int ndigits = 0;
57 57600 : int n2 = n;
58 115173 : do {
59 115173 : ndigits++;
60 115173 : n2 /= 10;
61 : } while (n2);
62 :
63 : // Add the integer string backwards.
64 57600 : position_ += ndigits;
65 57600 : int i = position_;
66 115173 : do {
67 115173 : buffer_[--i] = '0' + (n % 10);
68 115173 : n /= 10;
69 : } while (n);
70 57600 : }
71 :
72 :
73 146467 : void StringBuilder::AddPadding(char c, int count) {
74 213988 : for (int i = 0; i < count; i++) {
75 67521 : AddCharacter(c);
76 : }
77 146467 : }
78 :
79 :
80 279511 : char* StringBuilder::Finalize() {
81 279511 : ASSERT(!is_finalized() && position_ < buffer_.length());
82 279511 : buffer_[position_] = '\0';
83 : // Make sure nobody managed to add a 0-character to the
84 : // buffer while building the string.
85 279511 : ASSERT(strlen(buffer_.start()) == static_cast<size_t>(position_));
86 279511 : position_ = -1;
87 279511 : ASSERT(is_finalized());
88 279511 : return buffer_.start();
89 : }
90 :
91 : } } // namespace v8::internal
|