Buffer::iterator rfind(char c) {
Buffer::iterator it = buffer.end();
+
+ // Skip trailing '\0'
+ assert(it != buffer.begin());
+ --it;
+ assert(*it == '\0');
+
while (it != buffer.begin()) {
--it;
if (*it == c) {
return it;
}
}
+
return buffer.end();
}
Buffer::iterator rfindSep(void) {
Buffer::iterator it = buffer.end();
+ // Skip trailing '\0'
+ assert(it != buffer.begin());
+ --it;
+ assert(*it == '\0');
+
// Skip trailing separators
- while (it != buffer.begin() && isSep(*it)) {
+ while (it != buffer.begin()) {
--it;
+ if (isSep(*it)) {
+ // Halt if find the root
+ if (it == buffer.begin()) {
+ return it;
+ }
+ } else {
+ break;
+ }
}
// Advance to the last separator
while (it != buffer.begin()) {
+ --it;
if (isSep(*it)) {
return it;
}
- --it;
}
return buffer.end();
va_list args_copy;
va_copy(args_copy, args);
#ifdef _WIN32
- /* We need to use _vcsprintf to calculate the length as vsnprintf returns -1
+ /* We need to use _vscprintf to calculate the length as vsnprintf returns -1
* if the number of characters to write is greater than count.
*/
length = _vscprintf(format, args_copy);