diff options
author | Siteshwar Vashisht <siteshwar@gmail.com> | 2012-01-16 22:26:47 +0530 |
---|---|---|
committer | Siteshwar Vashisht <siteshwar@gmail.com> | 2012-01-16 22:26:47 +0530 |
commit | 140ead65b6a7051a8737623b7201f5b5a07d55d9 (patch) | |
tree | b93cb8f9936db93ae37030272f6d2c5205097987 /wildcard.cpp | |
parent | f3e2d2f68f14120e298fb1d50be89fa5e83c9222 (diff) |
Converted all auto completion calls (on pressing tab) to use std::vector<completion_t>, bugs are yet to be fixed
Diffstat (limited to 'wildcard.cpp')
-rw-r--r-- | wildcard.cpp | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/wildcard.cpp b/wildcard.cpp index 416af60f..a53e4798 100644 --- a/wildcard.cpp +++ b/wildcard.cpp @@ -7,7 +7,7 @@ wildcards using **. */ #include "config.h" - +#include <algorithm> #include <stdlib.h> #include <stdio.h> #include <limits.h> @@ -236,7 +236,7 @@ static int wildcard_complete_internal( const wchar_t *orig, int is_first, const wchar_t *desc, const wchar_t *(*desc_func)(const wchar_t *), - array_list_t *out, + std::vector<completion_t> &out, int flags ) { if( !wc || !str || !orig) @@ -251,7 +251,7 @@ static int wildcard_complete_internal( const wchar_t *orig, wchar_t *out_completion = 0; const wchar_t *out_desc = desc; - if( !out ) + if( out.empty() ) { return 1; } @@ -319,7 +319,7 @@ static int wildcard_complete_internal( const wchar_t *orig, do { res |= wildcard_complete_internal( orig, str, wc+1, 0, desc, desc_func, out, flags ); - if( res && !out ) + if( res && out.empty() ) break; } while( *str++ != 0 ); @@ -345,7 +345,7 @@ int wildcard_complete( const wchar_t *str, const wchar_t *wc, const wchar_t *desc, const wchar_t *(*desc_func)(const wchar_t *), - array_list_t *out, + std::vector<completion_t> &out, int flags ) { int res; @@ -645,7 +645,7 @@ static const wchar_t *file_get_desc( const wchar_t *filename, \param wc the wildcard to match against \param is_cmd whether we are performing command completion */ -static void wildcard_completion_allocate( array_list_t *list, +static void wildcard_completion_allocate( std::vector<completion_t> &list, const wchar_t *fullname, const wchar_t *completion, const wchar_t *wc, @@ -778,7 +778,7 @@ static int test_flags( const wchar_t *filename, static int wildcard_expand_internal( const wchar_t *wc, const wchar_t *base_dir, int flags, - array_list_t *out ) + std::vector<completion_t> &out ) { /* Points to the end of the current wildcard segment */ @@ -810,7 +810,7 @@ static int wildcard_expand_internal( const wchar_t *wc, return -1; } - if( !wc || !base_dir || !out) + if( !wc || !base_dir || out.empty()) { debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ ); return 0; @@ -897,7 +897,10 @@ static int wildcard_expand_internal( const wchar_t *wc, else { res = 1; - al_push_check( out, wcsdup( base_dir ) ); + 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); + } } } else @@ -918,11 +921,12 @@ static int wildcard_expand_internal( const wchar_t *wc, /* Test for matches before stating file, so as to minimize the number of calls to the much slower stat function */ + std::vector<completion_t> test; if( wildcard_complete( name, wc, L"", 0, - 0, + test, 0 ) ) { if( test_flags( long_name, flags ) ) @@ -966,7 +970,8 @@ static int wildcard_expand_internal( const wchar_t *wc, } else { - al_push_check( out, long_name ); + completion_t data_to_push = { long_name }; + out.push_back( data_to_push ); } res = 1; } @@ -1156,9 +1161,9 @@ static int wildcard_expand_internal( const wchar_t *wc, int wildcard_expand( const wchar_t *wc, const wchar_t *base_dir, int flags, - array_list_t *out ) + std::vector<completion_t> &out ) { - int c = al_get_count( out ); + int c = out.size(); int res = wildcard_expand_internal( wc, base_dir, flags, out ); int i; @@ -1176,16 +1181,16 @@ int wildcard_expand( const wchar_t *wc, sb_init( &sb ); - for( i=c; i<al_get_count( out ); i++ ) + for( i=c; i<out.size(); i++ ) { - completion_t *c = (completion_t *)al_get( out, i ); + completion_t &c = out.at( i ); - if( c->flags & COMPLETE_NO_CASE ) + if( c.flags & COMPLETE_NO_CASE ) { sb_clear( &sb ); - sb_printf( &sb, L"%ls%ls%ls", base_dir, wc_base, c->completion ); + sb_printf( &sb, L"%ls%ls%ls", base_dir, wc_base, c.completion ); - c->completion = halloc_wcsdup( out, (wchar_t *)sb.buff ); + c.completion = (wchar_t *)sb.buff; } } @@ -1200,19 +1205,17 @@ int wildcard_expand( const wchar_t *wc, return res; } -int wildcard_expand_string(const wcstring &wc, const wcstring &base_dir, int flags, wcstring_list_t &outputs ) +int wildcard_expand_string(const wcstring &wc, const wcstring &base_dir, int flags, std::vector<completion_t> &outputs ) { - array_list_t lst; - al_init(&lst); + std::vector<completion_t> lst; +// al_init(&lst); - int res = wildcard_expand(wc.c_str(), base_dir.c_str(), flags, &lst); + int res = wildcard_expand(wc.c_str(), base_dir.c_str(), flags, lst); - int i, max = al_get_count(&lst); + int i, max = lst.size(); for (i=0; i < max; i++) { - wchar_t *tmp = (wchar_t *)al_get(&lst, i); - outputs.push_back(tmp); - free(tmp); + outputs.push_back( lst.at(i)); } - al_destroy(&lst); +// al_destroy(&lst); return res; } |