diff --git a/wildcard.cpp b/wildcard.cpp index e8cd03eb1..01bfbc4b2 100644 --- a/wildcard.cpp +++ b/wildcard.cpp @@ -329,18 +329,8 @@ int wildcard_match( const wcstring &str, const wcstring &wc ) /** Creates a path from the specified directory and filename. */ -static wchar_t *make_path( const wchar_t *base_dir, const wchar_t *name ) -{ - - wchar_t *long_name; - int base_len = wcslen( base_dir ); - if( !(long_name= (wchar_t *)malloc( sizeof(wchar_t)*(base_len+wcslen(name)+1) ))) - { - DIE_MEM(); - } - wcscpy( long_name, base_dir ); - wcscpy(&long_name[base_len], name ); - return long_name; +static wcstring make_path(const wcstring &base_dir, const wcstring &name) { + return base_dir + name; } /** @@ -581,7 +571,7 @@ static wcstring file_get_desc( const wchar_t *filename, \param is_cmd whether we are performing command completion */ static void wildcard_completion_allocate( std::vector<completion_t> &list, - const wchar_t *fullname, + const wcstring &fullname, const wchar_t *completion, const wchar_t *wc, int is_cmd ) @@ -597,15 +587,13 @@ static void wildcard_completion_allocate( std::vector<completion_t> &list, long long sz; - CHECK( fullname, ); - /* If the file is a symlink, we need to stat both the file itself _and_ the destination file. But we try to avoid this with non-symlinks by first doing an lstat, and if the file is not a link we copy the results over to the regular stat buffer. */ - if( ( lstat_res = lwstat( fullname, &lbuf ) ) ) + if( ( lstat_res = lwstat( fullname.c_str(), &lbuf ) ) ) { sz=-1; stat_res = lstat_res; @@ -615,7 +603,7 @@ static void wildcard_completion_allocate( std::vector<completion_t> &list, if( S_ISLNK(lbuf.st_mode)) { - if( ( stat_res = wstat( fullname, &buf ) ) ) + if( ( stat_res = wstat( fullname.c_str(), &buf ) ) ) { sz=-1; } @@ -638,7 +626,7 @@ static void wildcard_completion_allocate( std::vector<completion_t> &list, } } - wcstring desc = file_get_desc( fullname, lstat_res, lbuf, stat_res, buf, stat_errno ); + wcstring desc = file_get_desc( fullname.c_str(), lstat_res, lbuf, stat_res, buf, stat_errno ); if( sz >= 0 && S_ISDIR(buf.st_mode) ) { @@ -802,19 +790,16 @@ static int wildcard_expand_internal( const wchar_t *wc, { if( next[0] != L'.' ) { - const wchar_t *name = next.c_str(); - const wchar_t *long_name = make_path( base_dir, name ); + wcstring long_name = make_path( base_dir, next ); - if( test_flags( long_name, flags ) ) + if( test_flags( long_name.c_str(), flags ) ) { wildcard_completion_allocate( out, long_name, - name, + next.c_str(), L"", flags & EXECUTABLES_ONLY ); } - - free( (void *)long_name ); } } } @@ -823,7 +808,7 @@ static int wildcard_expand_internal( const wchar_t *wc, res = 1; completion_t data_to_push(base_dir); if (std::find( out.begin(), out.end(), data_to_push ) == out.end()) { - out.push_back( data_to_push); + out.push_back(data_to_push); } } } @@ -835,12 +820,11 @@ static int wildcard_expand_internal( const wchar_t *wc, wcstring next; while(wreaddir(dir, next)) { - const wchar_t *name = next.c_str(); - + const wchar_t * const name = next.c_str(); if( flags & ACCEPT_INCOMPLETE ) { - wchar_t *long_name = make_path( base_dir, name ); + const wcstring long_name = make_path( base_dir, next ); /* Test for matches before stating file, so as to minimize the number of calls to the much slower stat function @@ -853,7 +837,7 @@ static int wildcard_expand_internal( const wchar_t *wc, test, 0 ) ) { - if( test_flags( long_name, flags ) ) + if( test_flags( long_name.c_str(), flags ) ) { wildcard_completion_allocate( out, long_name, @@ -862,16 +846,13 @@ static int wildcard_expand_internal( const wchar_t *wc, flags & EXECUTABLES_ONLY ); } - } - - free( long_name ); - + } } else { if( wildcard_match2( name, wc, 1 ) ) { - wchar_t *long_name = make_path( base_dir, name ); + const wcstring long_name = make_path(base_dir, next); int skip = 0; if( is_recursive ) @@ -882,19 +863,14 @@ static int wildcard_expand_internal( const wchar_t *wc, will be added in the next pass. */ struct stat buf; - if( !wstat( long_name, &buf ) ) + if( !wstat( long_name.c_str(), &buf ) ) { skip = S_ISDIR(buf.st_mode); } } - - if( skip ) + if (! skip) { - free( long_name ); - } - else - { - out.push_back( completion_t(long_name) ); + out.push_back(completion_t(long_name) ); } res = 1; } @@ -1131,11 +1107,7 @@ int wildcard_expand_string(const wcstring &wc, const wcstring &base_dir, int fla { std::vector<completion_t> lst; - int res = wildcard_expand(wc.c_str(), base_dir.c_str(), flags, lst); - - int i, max = lst.size(); - for (i=0; i < max; i++) { - outputs.push_back( lst.at(i)); - } + int res = wildcard_expand(wc.c_str(), base_dir.c_str(), flags, lst); + outputs.insert(outputs.end(), lst.begin(), lst.end()); return res; }