aboutsummaryrefslogtreecommitdiffhomepage
path: root/wildcard.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-02-13 22:44:29 -0800
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-02-13 22:44:29 -0800
commite2ff77b4ecd4a5555043c163df21906693a3b9cf (patch)
treec507c63e4b4caad6741f5bba4c8283896c380ee2 /wildcard.cpp
parentcaf7a93382ff833417625ce36dcc62844a5d78bf (diff)
Clean up make_path and some memory allocations
Diffstat (limited to 'wildcard.cpp')
-rw-r--r--wildcard.cpp68
1 files changed, 20 insertions, 48 deletions
diff --git a/wildcard.cpp b/wildcard.cpp
index e8cd03eb..01bfbc4b 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;
}