Fixed: regression in issue 1579 concerning readline() in d8.

BUG=v8:1579

Review URL: http://codereview.chromium.org/7537023

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8771 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
yangguo@chromium.org 2011-08-01 14:15:02 +00:00
parent ddf38624b5
commit 6bc1aa0db2

View File

@ -226,17 +226,24 @@ Handle<Value> Shell::ReadLine(const Arguments& args) {
static const int kBufferSize = 256;
char buffer[kBufferSize];
Handle<String> accumulator = String::New("");
bool linebreak;
int length;
do { // Repeat if the line ends with an escape '\'.
// fgets got an error. Just give up.
while (true) {
// Continue reading if the line ends with an escape '\\' or the line has
// not been fully read into the buffer yet (does not end with '\n').
// If fgets gets an error, just give up.
if (fgets(buffer, kBufferSize, stdin) == NULL) return Null();
length = static_cast<int>(strlen(buffer));
linebreak = (length > 1 && buffer[length-2] == '\\');
if (linebreak) buffer[length-2] = '\n';
accumulator = String::Concat(accumulator, String::New(buffer, length-1));
} while (linebreak);
if (length == 0) {
return accumulator;
} else if (buffer[length-1] != '\n') {
accumulator = String::Concat(accumulator, String::New(buffer, length));
} else if (length > 1 && buffer[length-2] == '\\') {
buffer[length-2] = '\n';
accumulator = String::Concat(accumulator, String::New(buffer, length-1));
} else {
return String::Concat(accumulator, String::New(buffer, length-1));
}
}
}