@@ -89,8 +89,8 @@ int Utf8BytesIndicated(char ch) {
89
89
bool IsTrailingByte (char ch) { return (ch & 0xC0 ) == 0x80 ; }
90
90
91
91
bool GetNextCodePointAndAdvance (int & codePoint,
92
- std::string::const_iterator & first,
93
- std::string::const_iterator last) {
92
+ const char * & first,
93
+ const char * last) {
94
94
if (first == last)
95
95
return false ;
96
96
@@ -153,23 +153,23 @@ void WriteCodePoint(ostream_wrapper& out, int codePoint) {
153
153
}
154
154
}
155
155
156
- bool IsValidPlainScalar (const std::string& str , FlowType::value flowType,
156
+ bool IsValidPlainScalar (const char * str, std::size_t size , FlowType::value flowType,
157
157
bool allowOnlyAscii) {
158
158
// check against null
159
- if (IsNullString (str)) {
159
+ if (IsNullString (str, size )) {
160
160
return false ;
161
161
}
162
162
163
163
// check the start
164
164
const RegEx& start = (flowType == FlowType::Flow ? Exp::PlainScalarInFlow ()
165
165
: Exp::PlainScalar ());
166
- if (!start.Matches (str)) {
166
+ if (!start.Matches (StringCharSource ( str, size) )) {
167
167
return false ;
168
168
}
169
169
170
170
// and check the end for plain whitespace (which can't be faithfully kept in a
171
171
// plain scalar)
172
- if (!str. empty () && * str. rbegin () == ' ' ) {
172
+ if (size != 0 && str[size - 1 ] == ' ' ) {
173
173
return false ;
174
174
}
175
175
@@ -185,7 +185,7 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType,
185
185
const RegEx& disallowed =
186
186
flowType == FlowType::Flow ? disallowed_flow : disallowed_block;
187
187
188
- StringCharSource buffer (str. c_str (), str. size () );
188
+ StringCharSource buffer (str, size);
189
189
while (buffer) {
190
190
if (disallowed.Matches (buffer)) {
191
191
return false ;
@@ -199,22 +199,22 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType,
199
199
return true ;
200
200
}
201
201
202
- bool IsValidSingleQuotedScalar (const std::string& str , bool escapeNonAscii) {
202
+ bool IsValidSingleQuotedScalar (const char * str, std::size_t size , bool escapeNonAscii) {
203
203
// TODO: check for non-printable characters?
204
- return std::none_of (str. begin () , str. end () , [=](char ch) {
204
+ return std::none_of (str, str + size , [=](char ch) {
205
205
return (escapeNonAscii && (0x80 <= static_cast <unsigned char >(ch))) ||
206
206
(ch == ' \n ' );
207
207
});
208
208
}
209
209
210
- bool IsValidLiteralScalar (const std::string& str , FlowType::value flowType,
210
+ bool IsValidLiteralScalar (const char * str, std::size_t size , FlowType::value flowType,
211
211
bool escapeNonAscii) {
212
212
if (flowType == FlowType::Flow) {
213
213
return false ;
214
214
}
215
215
216
216
// TODO: check for non-printable characters?
217
- return std::none_of (str. begin () , str. end () , [=](char ch) {
217
+ return std::none_of (str, str + size , [=](char ch) {
218
218
return (escapeNonAscii && (0x80 <= static_cast <unsigned char >(ch)));
219
219
});
220
220
}
@@ -254,10 +254,10 @@ void WriteDoubleQuoteEscapeSequence(ostream_wrapper& out, int codePoint, StringE
254
254
out << hexDigits[(codePoint >> (4 * (digits - 1 ))) & 0xF ];
255
255
}
256
256
257
- bool WriteAliasName (ostream_wrapper& out, const std::string& str ) {
257
+ bool WriteAliasName (ostream_wrapper& out, const char * str, std::size_t size ) {
258
258
int codePoint;
259
- for (std::string::const_iterator i = str. begin () ;
260
- GetNextCodePointAndAdvance (codePoint, i, str. end () );) {
259
+ for (const char * i = str;
260
+ GetNextCodePointAndAdvance (codePoint, i, str + size );) {
261
261
if (!IsAnchorChar (codePoint)) {
262
262
return false ;
263
263
}
@@ -268,25 +268,25 @@ bool WriteAliasName(ostream_wrapper& out, const std::string& str) {
268
268
}
269
269
} // namespace
270
270
271
- StringFormat::value ComputeStringFormat (const std::string& str ,
271
+ StringFormat::value ComputeStringFormat (const char * str, std::size_t size ,
272
272
EMITTER_MANIP strFormat,
273
273
FlowType::value flowType,
274
274
bool escapeNonAscii) {
275
275
switch (strFormat) {
276
276
case Auto:
277
- if (IsValidPlainScalar (str, flowType, escapeNonAscii)) {
277
+ if (IsValidPlainScalar (str, size, flowType, escapeNonAscii)) {
278
278
return StringFormat::Plain;
279
279
}
280
280
return StringFormat::DoubleQuoted;
281
281
case SingleQuoted:
282
- if (IsValidSingleQuotedScalar (str, escapeNonAscii)) {
282
+ if (IsValidSingleQuotedScalar (str, size, escapeNonAscii)) {
283
283
return StringFormat::SingleQuoted;
284
284
}
285
285
return StringFormat::DoubleQuoted;
286
286
case DoubleQuoted:
287
287
return StringFormat::DoubleQuoted;
288
288
case Literal:
289
- if (IsValidLiteralScalar (str, flowType, escapeNonAscii)) {
289
+ if (IsValidLiteralScalar (str, size, flowType, escapeNonAscii)) {
290
290
return StringFormat::Literal;
291
291
}
292
292
return StringFormat::DoubleQuoted;
@@ -297,11 +297,11 @@ StringFormat::value ComputeStringFormat(const std::string& str,
297
297
return StringFormat::DoubleQuoted;
298
298
}
299
299
300
- bool WriteSingleQuotedString (ostream_wrapper& out, const std::string& str ) {
300
+ bool WriteSingleQuotedString (ostream_wrapper& out, const char * str, std::size_t size ) {
301
301
out << " '" ;
302
302
int codePoint;
303
- for (std::string::const_iterator i = str. begin () ;
304
- GetNextCodePointAndAdvance (codePoint, i, str. end () );) {
303
+ for (const char * i = str;
304
+ GetNextCodePointAndAdvance (codePoint, i, str + size );) {
305
305
if (codePoint == ' \n ' ) {
306
306
return false ; // We can't handle a new line and the attendant indentation
307
307
// yet
@@ -317,12 +317,12 @@ bool WriteSingleQuotedString(ostream_wrapper& out, const std::string& str) {
317
317
return true ;
318
318
}
319
319
320
- bool WriteDoubleQuotedString (ostream_wrapper& out, const std::string& str ,
320
+ bool WriteDoubleQuotedString (ostream_wrapper& out, const char * str, std::size_t size ,
321
321
StringEscaping::value stringEscaping) {
322
322
out << " \" " ;
323
323
int codePoint;
324
- for (std::string::const_iterator i = str. begin () ;
325
- GetNextCodePointAndAdvance (codePoint, i, str. end () );) {
324
+ for (const char * i = str;
325
+ GetNextCodePointAndAdvance (codePoint, i, str + size );) {
326
326
switch (codePoint) {
327
327
case ' \" ' :
328
328
out << " \\\" " ;
@@ -364,12 +364,12 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
364
364
return true ;
365
365
}
366
366
367
- bool WriteLiteralString (ostream_wrapper& out, const std::string& str ,
367
+ bool WriteLiteralString (ostream_wrapper& out, const char * str, std::size_t size ,
368
368
std::size_t indent) {
369
369
out << " |\n " ;
370
370
int codePoint;
371
- for (std::string::const_iterator i = str. begin () ;
372
- GetNextCodePointAndAdvance (codePoint, i, str. end () );) {
371
+ for (const char * i = str;
372
+ GetNextCodePointAndAdvance (codePoint, i, str + size );) {
373
373
if (codePoint == ' \n ' ) {
374
374
out << " \n " ;
375
375
} else {
@@ -407,14 +407,14 @@ bool WriteChar(ostream_wrapper& out, char ch, StringEscaping::value stringEscapi
407
407
return true ;
408
408
}
409
409
410
- bool WriteComment (ostream_wrapper& out, const std::string& str ,
410
+ bool WriteComment (ostream_wrapper& out, const char * str, std::size_t size ,
411
411
std::size_t postCommentIndent) {
412
412
const std::size_t curIndent = out.col ();
413
413
out << " #" << Indentation (postCommentIndent);
414
414
out.set_comment ();
415
415
int codePoint;
416
- for (std::string::const_iterator i = str. begin () ;
417
- GetNextCodePointAndAdvance (codePoint, i, str. end () );) {
416
+ for (const char * i = str;
417
+ GetNextCodePointAndAdvance (codePoint, i, str + size );) {
418
418
if (codePoint == ' \n ' ) {
419
419
out << " \n "
420
420
<< IndentTo (curIndent) << " #" << Indentation (postCommentIndent);
@@ -426,14 +426,14 @@ bool WriteComment(ostream_wrapper& out, const std::string& str,
426
426
return true ;
427
427
}
428
428
429
- bool WriteAlias (ostream_wrapper& out, const std::string& str ) {
429
+ bool WriteAlias (ostream_wrapper& out, const char * str, std::size_t size ) {
430
430
out << " *" ;
431
- return WriteAliasName (out, str);
431
+ return WriteAliasName (out, str, size );
432
432
}
433
433
434
- bool WriteAnchor (ostream_wrapper& out, const std::string& str ) {
434
+ bool WriteAnchor (ostream_wrapper& out, const char * str, std::size_t size ) {
435
435
out << " &" ;
436
- return WriteAliasName (out, str);
436
+ return WriteAliasName (out, str, size );
437
437
}
438
438
439
439
bool WriteTag (ostream_wrapper& out, const std::string& str, bool verbatim) {
@@ -490,7 +490,8 @@ bool WriteTagWithPrefix(ostream_wrapper& out, const std::string& prefix,
490
490
}
491
491
492
492
bool WriteBinary (ostream_wrapper& out, const Binary& binary) {
493
- WriteDoubleQuotedString (out, EncodeBase64 (binary.data (), binary.size ()),
493
+ std::string encoded = EncodeBase64 (binary.data (), binary.size ());
494
+ WriteDoubleQuotedString (out, encoded.data (), encoded.size (),
494
495
StringEscaping::None);
495
496
return true ;
496
497
}
0 commit comments