@@ -254,13 +254,14 @@ namespace fs
254254 }
255255 int ret = next ();
256256 if (ret < 0 )
257- m_path = { 0 , 0 } ;
257+ m_path_len = 0 ;
258258 }
259259 int Walker::enter_dir ()
260260 {
261261 auto dir = m_filesystem->opendir (m_path_buffer);
262262 if (!dir)
263- LOG_ERRNO_RETURN (0 , -1 , " failed to opendir(`)" , m_path);
263+ LOG_ERRNO_RETURN (0 , -1 , " failed to opendir(`)" ,
264+ std::string_view (m_path_buffer, m_path_len));
264265 m_stack.emplace (dir);
265266 return 0 ;
266267 }
@@ -273,36 +274,36 @@ namespace fs
273274 struct stat st;
274275 auto ret = m_filesystem->lstat (m_path_buffer, &st);
275276 if (ret < 0 )
276- LOG_ERRNO_RETURN (0 , -1 , " failed to lstat '`'" , m_path);
277+ LOG_ERRNO_RETURN (0 , -1 , " failed to lstat '`'" ,
278+ std::string_view (m_path_buffer, m_path_len));
277279 return S_ISDIR (st.st_mode );
278280 }
279281 return 0 ;
280282 }
281- void Walker::path_push_back (string_view s)
282- {
283- auto len0 = m_path.length ();
283+ void Walker::path_push_back (string_view s) {
284+ auto len0 = m_path_len;
284285 auto len1 = s.length ();
285286 assert (len0 + len1 < sizeof (m_path_buffer) - 1 );
286287 memcpy (m_path_buffer + len0, s.data (), len1 + 1 );
287- m_path = string_view (m_path_buffer, len0 + len1) ;
288+ m_path_len = len0 + len1;
288289 }
289- void Walker::path_pop_back (size_t len1)
290- {
291- auto len0 = m_path.length ();
290+ void Walker::path_pop_back (size_t len1) {
291+ auto len0 = m_path_len;
292292 assert (len0 > len1);
293293 len0 -= len1;
294294 m_path_buffer[len0] = ' \0 ' ;
295- m_path = string_view (m_path_buffer, len0) ;
295+ m_path_len = len0;
296296 }
297297 int Walker::next ()
298298 {
299299 again:
300- if (m_path.empty ()) return -1 ;
301- if (m_path.back () != ' /' )
300+ if (m_path_len == 0 ) return -1 ;
301+ std::string_view path (m_path_buffer, m_path_len);
302+ if (path.back () != ' /' )
302303 {
303- auto m = m_path .rfind (' /' );
304- if (m != m_path .npos ) {
305- auto len0 = m_path .length ();
304+ auto m = path .rfind (' /' );
305+ if (m != path .npos ) {
306+ auto len0 = path .length ();
306307 path_pop_back (len0 - m - 1 );
307308 m_stack.top ()->next ();
308309 }
@@ -321,10 +322,10 @@ namespace fs
321322 m_stack.pop ();
322323 if (m_stack.empty ())
323324 {
324- m_path. remove_prefix (m_path. length ()) ;
325+ m_path_len = 0 ;
325326 return -1 ; // finished walking
326327 }
327- assert (m_path. back () == ' /' );
328+ assert (m_path_buffer[m_path_len - 1 ] == ' /' );
328329 path_pop_back (1 );
329330 goto again;
330331 }
0 commit comments