| Index: src/string-stream.cc
|
| ===================================================================
|
| --- src/string-stream.cc (revision 830)
|
| +++ src/string-stream.cc (working copy)
|
| @@ -93,13 +93,13 @@
|
| }
|
|
|
|
|
| -void StringStream::Add(const char* format, Vector<FmtElm> elms) {
|
| +void StringStream::Add(Vector<const char> format, Vector<FmtElm> elms) {
|
| // If we already ran out of space then return immediately.
|
| if (space() == 0)
|
| return;
|
| int offset = 0;
|
| int elm = 0;
|
| - while (format[offset] != '\0') {
|
| + while (offset < format.length()) {
|
| if (format[offset] != '%' || elm == elms.length()) {
|
| Put(format[offset]);
|
| offset++;
|
| @@ -111,12 +111,11 @@
|
| // Skip over the whole control character sequence until the
|
| // format element type
|
| temp[format_length++] = format[offset++];
|
| - // '\0' is not a control character so we don't have to
|
| - // explicitly check for the end of the string
|
| - while (IsControlChar(format[offset]))
|
| + while (offset < format.length() && IsControlChar(format[offset]))
|
| temp[format_length++] = format[offset++];
|
| + if (offset >= format.length())
|
| + return;
|
| char type = format[offset];
|
| - if (type == '\0') return;
|
| temp[format_length++] = type;
|
| temp[format_length] = '\0';
|
| offset++;
|
| @@ -128,17 +127,36 @@
|
| Add(value);
|
| break;
|
| }
|
| + case 'w': {
|
| + ASSERT_EQ(FmtElm::LC_STR, current.type_);
|
| + Vector<const uc16> value = *current.data_.u_lc_str_;
|
| + for (int i = 0; i < value.length(); i++)
|
| + Put(static_cast<char>(value[i]));
|
| + break;
|
| + }
|
| case 'o': {
|
| ASSERT_EQ(FmtElm::OBJ, current.type_);
|
| Object* obj = current.data_.u_obj_;
|
| PrintObject(obj);
|
| break;
|
| }
|
| - case 'i': case 'd': case 'u': case 'x': case 'c': case 'p': {
|
| + case 'k': {
|
| + ASSERT_EQ(FmtElm::INT, current.type_);
|
| int value = current.data_.u_int_;
|
| + if (0x20 <= value && value <= 0x7F) {
|
| + Put(value);
|
| + } else if (value <= 0xff) {
|
| + Add("\\x%02x", value);
|
| + } else {
|
| + Add("\\u%04x", value);
|
| + }
|
| + break;
|
| + }
|
| + case 'i': case 'd': case 'u': case 'x': case 'c': case 'p': case 'X': {
|
| + int value = current.data_.u_int_;
|
| EmbeddedVector<char, 24> formatted;
|
| - OS::SNPrintF(formatted, temp.start(), value);
|
| - Add(formatted.start());
|
| + int length = OS::SNPrintF(formatted, temp.start(), value);
|
| + Add(Vector<const char>(formatted.start(), length));
|
| break;
|
| }
|
| case 'f': case 'g': case 'G': case 'e': case 'E': {
|
| @@ -154,10 +172,8 @@
|
| }
|
| }
|
|
|
| - // Verify that the buffer is 0-terminated and doesn't contain any
|
| - // other 0-characters.
|
| + // Verify that the buffer is 0-terminated
|
| ASSERT(buffer_[length_] == '\0');
|
| - ASSERT(strlen(buffer_) == length_);
|
| }
|
|
|
|
|
| @@ -188,6 +204,11 @@
|
|
|
|
|
| void StringStream::Add(const char* format) {
|
| + Add(CStrVector(format));
|
| +}
|
| +
|
| +
|
| +void StringStream::Add(Vector<const char> format) {
|
| Add(format, Vector<FmtElm>::empty());
|
| }
|
|
|
| @@ -195,14 +216,14 @@
|
| void StringStream::Add(const char* format, FmtElm arg0) {
|
| const char argc = 1;
|
| FmtElm argv[argc] = { arg0 };
|
| - Add(format, Vector<FmtElm>(argv, argc));
|
| + Add(CStrVector(format), Vector<FmtElm>(argv, argc));
|
| }
|
|
|
|
|
| void StringStream::Add(const char* format, FmtElm arg0, FmtElm arg1) {
|
| const char argc = 2;
|
| FmtElm argv[argc] = { arg0, arg1 };
|
| - Add(format, Vector<FmtElm>(argv, argc));
|
| + Add(CStrVector(format), Vector<FmtElm>(argv, argc));
|
| }
|
|
|
|
|
| @@ -210,10 +231,18 @@
|
| FmtElm arg2) {
|
| const char argc = 3;
|
| FmtElm argv[argc] = { arg0, arg1, arg2 };
|
| - Add(format, Vector<FmtElm>(argv, argc));
|
| + Add(CStrVector(format), Vector<FmtElm>(argv, argc));
|
| }
|
|
|
|
|
| +void StringStream::Add(const char* format, FmtElm arg0, FmtElm arg1,
|
| + FmtElm arg2, FmtElm arg3) {
|
| + const char argc = 4;
|
| + FmtElm argv[argc] = { arg0, arg1, arg2, arg3 };
|
| + Add(CStrVector(format), Vector<FmtElm>(argv, argc));
|
| +}
|
| +
|
| +
|
| SmartPointer<const char> StringStream::ToCString() {
|
| char* str = NewArray<char>(length_ + 1);
|
| memcpy(str, buffer_, length_);
|
|
|