aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-07-17 12:47:01 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-07-17 12:47:01 -0700
commitd06d6c69645c4d355772cb19043469328c05ccc5 (patch)
treeba9f91943b94b9b59b3e781580eca5d3230ac493
parent977a4477f646e344e66a7b0bc22e2e89b72d20db (diff)
Various changes to reduce fish's compiled code size
OS X release build executable size dropped from 672k to 511k
-rw-r--r--FishsFish.xcodeproj/project.pbxproj5
-rw-r--r--color.cpp4
-rw-r--r--common.cpp70
-rw-r--r--common.h9
-rw-r--r--complete.cpp49
-rw-r--r--complete.h25
-rw-r--r--env_universal_common.cpp15
-rw-r--r--exec.cpp1
-rw-r--r--expand.cpp41
-rw-r--r--highlight.cpp2
-rw-r--r--history.cpp4
-rw-r--r--history.h5
-rw-r--r--input.cpp312
-rw-r--r--intern.cpp5
-rw-r--r--proc.cpp3
-rw-r--r--reader.cpp27
-rw-r--r--wildcard.cpp17
17 files changed, 322 insertions, 272 deletions
diff --git a/FishsFish.xcodeproj/project.pbxproj b/FishsFish.xcodeproj/project.pbxproj
index ba522047..9d14f3bc 100644
--- a/FishsFish.xcodeproj/project.pbxproj
+++ b/FishsFish.xcodeproj/project.pbxproj
@@ -986,8 +986,10 @@
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ CLANG_CXX_LIBRARY = "compiler-default";
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"LOCALEDIR=\\\"/usr/local/share/locale\\\"",
@@ -1011,8 +1013,11 @@
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ CLANG_CXX_LIBRARY = "compiler-default";
+ DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
"LOCALEDIR=\\\"/usr/local/share/locale\\\"",
"PREFIX=L\\\"/usr/local\\\"",
diff --git a/color.cpp b/color.cpp
index 0d5623bc..99dcf1e9 100644
--- a/color.cpp
+++ b/color.cpp
@@ -214,12 +214,14 @@ unsigned char rgb_color_t::to_term256_index() const {
}
unsigned char rgb_color_t::to_name_index() const {
+ assert(type == type_named || type == type_rgb);
if (type == type_named) {
return data.name_idx;
} else if (type == type_rgb) {
return term8_color_for_rgb(data.rgb);
} else {
- throw "Bad type for to_name_index";
+ /* This is an error */
+ return -1;
}
}
diff --git a/common.cpp b/common.cpp
index b36b0a07..3d98b7e4 100644
--- a/common.cpp
+++ b/common.cpp
@@ -126,16 +126,6 @@ void show_stackframe()
}
}
-wcstring_list_t completions_to_wcstring_list( const std::vector<completion_t> &list )
-{
- wcstring_list_t strings;
- strings.reserve(list.size());
- for (std::vector<completion_t>::const_iterator iter = list.begin(); iter != list.end(); ++iter) {
- strings.push_back(iter->completion);
- }
- return strings;
-}
-
int fgetws2(wcstring *s, FILE *f)
{
int i=0;
@@ -240,10 +230,6 @@ void sort_strings( std::vector<wcstring> &strings)
std::sort(strings.begin(), strings.end(), string_sort_predicate);
}
-void sort_completions( std::vector<completion_t> &completions)
-{
- std::sort(completions.begin(), completions.end());
-}
wchar_t *str2wcs( const char *in )
{
wchar_t *out;
@@ -693,34 +679,54 @@ ssize_t read_loop(int fd, void *buff, size_t count)
return result;
}
-void debug( int level, const wchar_t *msg, ... )
+static bool should_debug(int level)
{
- /* Hack to not print error messages in the tests */
- if ( program_name && ! wcscmp(program_name, L"(ignore)") )
- return;
- va_list va;
-
- wcstring sb;
-
- int errno_old = errno;
-
if( level > debug_level )
- return;
+ return false;
- CHECK( msg, );
-
- sb = format_string(L"%ls: ", program_name);
- va_start(va, msg);
- sb.append(vformat_string(msg, va));
- va_end(va);
+ /* Hack to not print error messages in the tests */
+ if ( program_name && ! wcscmp(program_name, L"(ignore)") )
+ return false;
+
+ return true;
+}
+static void debug_shared( const wcstring &msg )
+{
+ const wcstring sb = wcstring(program_name) + L": " + msg;
wcstring sb2;
write_screen( sb, sb2 );
fwprintf( stderr, L"%ls", sb2.c_str() );
+}
+
+void debug( int level, const wchar_t *msg, ... )
+{
+ if (! should_debug(level))
+ return;
+ int errno_old = errno;
+ va_list va;
+ va_start(va, msg);
+ wcstring local_msg = vformat_string(msg, va);
+ va_end(va);
+ debug_shared(local_msg);
+ errno = errno_old;
+}
- errno = errno_old;
+void debug( int level, const char *msg, ... )
+{
+ if (! should_debug(level))
+ return;
+ int errno_old = errno;
+ char local_msg[512];
+ va_list va;
+ va_start(va, msg);
+ vsnprintf(local_msg, sizeof local_msg, msg, va);
+ va_end(va);
+ debug_shared(str2wcstring(local_msg));
+ errno = errno_old;
}
+
void debug_safe(int level, const char *msg, const char *param1, const char *param2, const char *param3, const char *param4, const char *param5, const char *param6, const char *param7, const char *param8, const char *param9, const char *param10, const char *param11, const char *param12)
{
const char * const params[] = {param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12};
diff --git a/common.h b/common.h
index 1a85fde2..7c5ab03f 100644
--- a/common.h
+++ b/common.h
@@ -122,7 +122,7 @@ extern const wchar_t *program_name;
if( !(arg) ) \
{ \
debug( 0, \
- _( L"function %s called with null value for argument %s. " ), \
+ "function %s called with null value for argument %s. ", \
__func__, \
#arg ); \
bugreport(); \
@@ -162,7 +162,7 @@ extern const wchar_t *program_name;
if( signal_is_blocked() ) \
{ \
debug( 0, \
- _( L"function %s called while blocking signals. " ), \
+ "function %s called while blocking signals. ", \
__func__); \
bugreport(); \
show_stackframe(); \
@@ -191,8 +191,6 @@ extern const wchar_t *program_name;
void show_stackframe();
-wcstring_list_t completions_to_wcstring_list( const std::vector<completion_t> &completions );
-
/**
Read a line from the stream f into the buffer buff of length len. If
buff is to small, it will be reallocated, and both buff and len will
@@ -211,8 +209,6 @@ int fgetws2(wcstring *s, FILE *f);
void sort_strings( std::vector<wcstring> &strings);
-void sort_completions( std::vector<completion_t> &strings);
-
/**
Returns a newly allocated wide character string equivalent of the
specified multibyte character string
@@ -635,6 +631,7 @@ ssize_t read_loop(int fd, void *buff, size_t count);
will print the string 'fish: Pi = 3.141', given that debug_level is 1 or higher, and that program_name is 'fish'.
*/
+void debug( int level, const char *msg, ... );
void debug( int level, const wchar_t *msg, ... );
/**
diff --git a/complete.cpp b/complete.cpp
index e0ec00b5..4e4d9fc4 100644
--- a/complete.cpp
+++ b/complete.cpp
@@ -251,6 +251,41 @@ const wcstring &completion_entry_t::get_short_opt_str() const {
return short_opt_str;
}
+/* completion_t functions */
+completion_t::completion_t(const wcstring &comp, const wcstring &desc, int flags_val) : completion(comp), description(desc), flags(flags_val)
+{
+}
+
+completion_t::completion_t(const completion_t &him) : completion(him.completion), description(him.description), flags(him.flags)
+{
+}
+
+completion_t &completion_t::operator=(const completion_t &him)
+{
+ if (this != &him)
+ {
+ this->completion = him.completion;
+ this->description = him.description;
+ this->flags = him.flags;
+ }
+ return *this;
+}
+
+wcstring_list_t completions_to_wcstring_list( const std::vector<completion_t> &list )
+{
+ wcstring_list_t strings;
+ strings.reserve(list.size());
+ for (std::vector<completion_t>::const_iterator iter = list.begin(); iter != list.end(); ++iter) {
+ strings.push_back(iter->completion);
+ }
+ return strings;
+}
+
+void sort_completions( std::vector<completion_t> &completions)
+{
+ std::sort(completions.begin(), completions.end());
+}
+
/** Class representing an attempt to compute completions */
class completer_t {
const complete_type_t type;
@@ -347,7 +382,7 @@ void completion_autoload_t::command_removed(const wcstring &cmd) {
Create a new completion entry
*/
-void completion_allocate(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc, complete_flags_t flags)
+void append_completion(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc, complete_flags_t flags)
{
completions.push_back(completion_t(comp, desc, flags));
}
@@ -1413,7 +1448,7 @@ bool completer_t::complete_param( const wcstring &scmd_orig, const wcstring &spo
completion[0] = o->short_opt;
completion[1] = 0;
- completion_allocate( this->completions, completion, desc, 0 );
+ append_completion( this->completions, completion, desc, 0 );
}
@@ -1465,14 +1500,14 @@ bool completer_t::complete_param( const wcstring &scmd_orig, const wcstring &spo
homebrew getopt-like functions.
*/
wcstring completion = format_string(L"%ls=", whole_opt.c_str()+offset);
- completion_allocate( this->completions,
+ append_completion( this->completions,
completion,
C_(o->desc.c_str()),
flags );
}
- completion_allocate( this->completions,
+ append_completion( this->completions,
whole_opt.c_str() + offset,
C_(o->desc.c_str()),
flags );
@@ -1582,7 +1617,7 @@ bool completer_t::complete_variable(const wcstring &str, int start_offset)
desc = format_string(COMPLETE_VAR_DESC_VAL, value.c_str());
}
- completion_allocate( this->completions, comp.c_str(), desc.c_str(), flags );
+ append_completion( this->completions, comp.c_str(), desc.c_str(), flags );
res =1;
}
@@ -1657,7 +1692,7 @@ bool completer_t::try_complete_user( const wcstring &str )
if( wcsncmp( user_name, pw_name, name_len )==0 )
{
wcstring desc = format_string(COMPLETE_USER_DESC, pw_name);
- completion_allocate( this->completions,
+ append_completion( this->completions,
&pw_name[name_len],
desc,
COMPLETE_NO_SPACE );
@@ -1669,7 +1704,7 @@ bool completer_t::try_complete_user( const wcstring &str )
wcstring name = format_string(L"~%ls", pw_name);
wcstring desc = format_string(COMPLETE_USER_DESC, pw_name);
- completion_allocate( this->completions,
+ append_completion( this->completions,
name,
desc,
COMPLETE_NO_CASE | COMPLETE_DONT_ESCAPE | COMPLETE_NO_SPACE );
diff --git a/complete.h b/complete.h
index 0e2fa2b5..a5a6f7a7 100644
--- a/complete.h
+++ b/complete.h
@@ -134,17 +134,12 @@ public:
*/
int flags;
- completion_t(const wcstring &comp, const wcstring &desc = L"", int flags_val = 0) : completion(comp), description(desc), flags(flags_val) {
- if( flags & COMPLETE_AUTO_SPACE )
- {
- flags = flags & ~COMPLETE_AUTO_SPACE;
- size_t len = completion.size();
- if (len > 0 && ( wcschr( L"/=@:", comp.at(len-1)) != 0 ))
- flags |= COMPLETE_NO_SPACE;
-
- }
- }
-
+ /* Construction. Note: defining these so that they are not inlined reduces the executable size. */
+ completion_t(const wcstring &comp, const wcstring &desc = L"", int flags_val = 0);
+ completion_t(const completion_t &);
+ completion_t &operator=(const completion_t &);
+
+ /* The following are needed for sorting and uniquing completions */
bool operator < (const completion_t& rhs) const { return this->completion < rhs.completion; }
bool operator == (const completion_t& rhs) const { return this->completion == rhs.completion; }
bool operator != (const completion_t& rhs) const { return ! (*this == rhs); }
@@ -155,6 +150,12 @@ enum complete_type_t {
COMPLETE_AUTOSUGGEST
};
+/** Given a list of completions, returns a list of their completion fields */
+wcstring_list_t completions_to_wcstring_list( const std::vector<completion_t> &completions );
+
+/** Sorts a list of completions */
+void sort_completions( std::vector<completion_t> &completions);
+
/**
Add a completion.
@@ -270,7 +271,7 @@ void complete_load( const wcstring &cmd, bool reload );
\param flags completion flags
*/
-void completion_allocate(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc, int flags);
+void append_completion(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc = L"", int flags = 0);
#endif
diff --git a/env_universal_common.cpp b/env_universal_common.cpp
index 80ab4a0f..e2c1d62d 100644
--- a/env_universal_common.cpp
+++ b/env_universal_common.cpp
@@ -106,7 +106,8 @@ static void parse_message( wchar_t *msg,
/**
The table of all universal variables
*/
-std::map<wcstring, var_uni_entry_t*> env_universal_var;
+typedef std::map<wcstring, var_uni_entry_t*> env_var_table_t;
+env_var_table_t env_universal_var;
/**
Callback function, should be called on all events
@@ -412,7 +413,7 @@ void env_universal_common_init( void (*cb)(int type, const wchar_t *key, const w
void env_universal_common_destroy()
{
- std::map<wcstring, var_uni_entry_t*>::iterator iter;
+ env_var_table_t::iterator iter;
for(iter = env_universal_var.begin(); iter != env_universal_var.end(); ++iter)
{
@@ -545,7 +546,7 @@ void read_message( connection_t *src )
*/
void env_universal_common_remove( const wcstring &name )
{
- std::map<wcstring, var_uni_entry_t*>::iterator result = env_universal_var.find(name);
+ env_var_table_t::iterator result = env_universal_var.find(name);
if (result != env_universal_var.end())
{
var_uni_entry_t* v = result->second;
@@ -900,7 +901,7 @@ void env_universal_common_get_names( wcstring_list_t &lst,
int show_exported,
int show_unexported )
{
- std::map<wcstring, var_uni_entry_t*>::const_iterator iter;
+ env_var_table_t::const_iterator iter;
for (iter = env_universal_var.begin(); iter != env_universal_var.end(); ++iter)
{
const wcstring& key = iter->first;
@@ -918,7 +919,7 @@ void env_universal_common_get_names( wcstring_list_t &lst,
wchar_t *env_universal_common_get( const wcstring &name )
{
- std::map<wcstring, var_uni_entry_t*>::const_iterator result = env_universal_var.find(name);
+ env_var_table_t::const_iterator result = env_universal_var.find(name);
if (result != env_universal_var.end() )
{
@@ -932,7 +933,7 @@ wchar_t *env_universal_common_get( const wcstring &name )
int env_universal_common_get_export( const wcstring &name )
{
- std::map<wcstring, var_uni_entry_t*>::const_iterator result = env_universal_var.find(name);
+ env_var_table_t::const_iterator result = env_universal_var.find(name);
if (result != env_universal_var.end() )
{
const var_uni_entry_t *e = result->second;
@@ -944,7 +945,7 @@ int env_universal_common_get_export( const wcstring &name )
void enqueue_all( connection_t *c )
{
- std::map<wcstring, var_uni_entry_t*>::const_iterator iter;
+ env_var_table_t::const_iterator iter;
for (iter = env_universal_var.begin(); iter != env_universal_var.end(); ++iter)
{
diff --git a/exec.cpp b/exec.cpp
index 92b2a476..a831ce85 100644
--- a/exec.cpp
+++ b/exec.cpp
@@ -24,7 +24,6 @@
#include <dirent.h>
#include <time.h>
#include <vector>
-#include <deque>
#include <algorithm>
#include <memory>
diff --git a/expand.cpp b/expand.cpp
index 1b22a20d..a637c1df 100644
--- a/expand.cpp
+++ b/expand.cpp
@@ -589,7 +589,7 @@ static int find_process( const wchar_t *proc,
if( wcsncmp( proc, jid, wcslen(proc ) )==0 )
{
wcstring desc_buff = format_string(COMPLETE_JOB_DESC_VAL, j->command_wcstr());
- completion_allocate( out,
+ append_completion( out,
jid+wcslen(proc),
desc_buff,
0 );
@@ -610,10 +610,8 @@ static int find_process( const wchar_t *proc,
j = job_get( jid );
if( (j != 0) && (j->command_wcstr() != 0 ) )
{
-
{
- wcstring result = to_string((long)j->pgid);
- out.push_back(completion_t(result));
+ append_completion(out, to_string<long>(j->pgid));
found = 1;
}
}
@@ -635,15 +633,14 @@ static int find_process( const wchar_t *proc,
{
if( flags & ACCEPT_INCOMPLETE )
{
- completion_allocate( out,
+ append_completion( out,
j->command_wcstr() + offset + wcslen(proc),
COMPLETE_JOB_DESC,
0 );
}
else
{
- wcstring result = to_string((long)j->pgid);
- out.push_back(completion_t(result));
+ append_completion(out, to_string<long>(j->pgid));
found = 1;
}
}
@@ -671,15 +668,17 @@ static int find_process( const wchar_t *proc,
{
if( flags & ACCEPT_INCOMPLETE )
{
- completion_allocate( out,
+ append_completion( out,
p->actual_cmd + offset + wcslen(proc),
COMPLETE_CHILD_PROCESS_DESC,
0 );
}
else
{
- wcstring result = to_string<int>(p->pid);
- out.push_back(completion_t(result));
+ append_completion (out,
+ to_string<long>(p->pid),
+ L"",
+ 0);
found = 1;
}
}
@@ -703,14 +702,14 @@ static int find_process( const wchar_t *proc,
{
if( flags & ACCEPT_INCOMPLETE )
{
- completion_allocate( out,
+ append_completion( out,
process_name.c_str() + offset + wcslen(proc),
COMPLETE_PROCESS_DESC,
0 );
}
else
{
- out.push_back(completion_t(to_string((long)process_pid)));
+ append_completion(out, to_string<long>(process_pid));
}
}
}
@@ -732,7 +731,7 @@ static int expand_pid( const wcstring &instr_with_sep,
if( instr.empty() || instr.at(0) != PROCESS_EXPAND )
{
- out.push_back(completion_t(instr));
+ append_completion(out, instr);
return 1;
}
@@ -742,14 +741,14 @@ static int expand_pid( const wcstring &instr_with_sep,
{
if( wcsncmp( in+1, SELF_STR, wcslen(in+1) )==0 )
{
- completion_allocate( out,
+ append_completion( out,
SELF_STR+wcslen(in+1),
COMPLETE_SELF_DESC,
0 );
}
else if( wcsncmp( in+1, LAST_STR, wcslen(in+1) )==0 )
{
- completion_allocate( out,
+ append_completion( out,
LAST_STR+wcslen(in+1),
COMPLETE_LAST_DESC,
0 );
@@ -760,8 +759,7 @@ static int expand_pid( const wcstring &instr_with_sep,
if( wcscmp( (in+1), SELF_STR )==0 )
{
- const wcstring pid_str = to_string<int>(getpid());
- out.push_back(completion_t(pid_str));
+ append_completion(out, to_string<long>(getpid()));
return 1;
}
@@ -769,8 +767,7 @@ static int expand_pid( const wcstring &instr_with_sep,
{
if( proc_last_bg_pid > 0 )
{
- const wcstring pid_str = to_string<int>(proc_last_bg_pid);
- out.push_back( completion_t(pid_str));
+ append_completion(out, to_string<long>(proc_last_bg_pid));
}
return 1;
@@ -1090,7 +1087,7 @@ static int expand_variables_internal( parser_t &parser, wchar_t * const in, std:
const wcstring &next = var_item_list.at(j);
if( is_ok && (i == 0) && (!in[stop_pos]) )
{
- out.push_back(completion_t(next));
+ append_completion(out, next);
}
else
{
@@ -1152,7 +1149,7 @@ static int expand_variables_internal( parser_t &parser, wchar_t * const in, std:
if( !empty )
{
- out.push_back(completion_t(in));
+ append_completion(out, in);
}
return is_ok;
@@ -1247,7 +1244,7 @@ static int expand_brackets(parser_t &parser, const wchar_t *in, int flags, std::
if( bracket_begin == 0 )
{
- out.push_back(completion_t(in));
+ append_completion(out, in);
return 1;
}
diff --git a/highlight.cpp b/highlight.cpp
index bc811e71..75d9f8db 100644
--- a/highlight.cpp
+++ b/highlight.cpp
@@ -1274,7 +1274,7 @@ void highlight_shell( const wcstring &buff, std::vector<int> &color, int pos, wc
const size_t length = buff.size();
assert(buff.size() == color.size());
-
+
if( length == 0 )
return;
diff --git a/history.cpp b/history.cpp
index 9156b855..902cb58d 100644
--- a/history.cpp
+++ b/history.cpp
@@ -495,7 +495,7 @@ void history_t::get_string_representation(wcstring &result, const wcstring &sepa
/* Append old items */
load_old_if_needed();
- for (std::deque<size_t>::const_reverse_iterator iter = old_item_offsets.rbegin(); iter != old_item_offsets.rend(); ++iter) {
+ for (std::vector<size_t>::const_reverse_iterator iter = old_item_offsets.rbegin(); iter != old_item_offsets.rend(); ++iter) {
size_t offset = *iter;
const history_item_t item = history_t::decode_item(mmap_start + offset, mmap_length - offset, mmap_type);
if (! first)
@@ -927,7 +927,7 @@ wcstring history_search_t::current_string() const {
}
bool history_search_t::match_already_made(const wcstring &match) const {
- for (std::deque<prev_match_t>::const_iterator iter = prev_matches.begin(); iter != prev_matches.end(); ++iter) {
+ for (std::vector<prev_match_t>::const_iterator iter = prev_matches.begin(); iter != prev_matches.end(); ++iter) {
if (iter->second.str() == match)
return true;
}
diff --git a/history.h b/history.h
index 856c008c..fe700f42 100644
--- a/history.h
+++ b/history.h
@@ -9,7 +9,6 @@
#include "common.h"
#include "pthread.h"
#include <vector>
-#include <deque>
#include <utility>
#include <list>
#include <tr1/memory>
@@ -123,7 +122,7 @@ private:
void populate_from_mmap(void);
/** List of old items, as offsets into out mmap data */
- std::deque<size_t> old_item_offsets;
+ std::vector<size_t> old_item_offsets;
/** Whether we've loaded old items */
bool loaded_old;
@@ -186,7 +185,7 @@ class history_search_t {
/** Our list of previous matches as index, value. The end is the current match. */
typedef std::pair<size_t, history_item_t> prev_match_t;
- std::deque<prev_match_t> prev_matches;
+ std::vector<prev_match_t> prev_matches;
/** Returns yes if a given term is in prev_matches. */
bool match_already_made(const wcstring &match) const;
diff --git a/input.cpp b/input.cpp
index 7855ee52..0ae04c54 100644
--- a/input.cpp
+++ b/input.cpp
@@ -224,14 +224,7 @@ static std::vector<input_mapping_t> mapping_list;
/* Terminfo map list */
static std::vector<terminfo_mapping_t> terminfo_mappings;
-/** Add a new terminfo mapping */
-static inline void terminfo_add(const wchar_t *name, const char *seq)
-{
- terminfo_mapping_t mapping = {name, seq};
- terminfo_mappings.push_back(mapping);
-}
-#define TERMINFO_ADD(key) do { terminfo_add((L ## #key)+4, key); } while (0)
-
+#define TERMINFO_ADD(key) { (L ## #key) + 4, key }
/**
@@ -614,52 +607,53 @@ bool input_mapping_get( const wcstring &sequence, wcstring &cmd )
*/
static void input_terminfo_init()
{
- TERMINFO_ADD(key_a1);
- TERMINFO_ADD(key_a3);
- TERMINFO_ADD(key_b2);
- TERMINFO_ADD(key_backspace);
- TERMINFO_ADD(key_beg);
- TERMINFO_ADD(key_btab);
- TERMINFO_ADD(key_c1);
- TERMINFO_ADD(key_c3);
- TERMINFO_ADD(key_cancel);
- TERMINFO_ADD(key_catab);
- TERMINFO_ADD(key_clear);
- TERMINFO_ADD(key_close);
- TERMINFO_ADD(key_command);
- TERMINFO_ADD(key_copy);
- TERMINFO_ADD(key_create);
- TERMINFO_ADD(key_ctab);
- TERMINFO_ADD(key_dc);
- TERMINFO_ADD(key_dl);
- TERMINFO_ADD(key_down);
- TERMINFO_ADD(key_eic);
- TERMINFO_ADD(key_end);
- TERMINFO_ADD(key_enter);
- TERMINFO_ADD(key_eol);
- TERMINFO_ADD(key_eos);
- TERMINFO_ADD(key_exit);
- TERMINFO_ADD(key_f0);
- TERMINFO_ADD(key_f1);
- TERMINFO_ADD(key_f2);
- TERMINFO_ADD(key_f3);
- TERMINFO_ADD(key_f4);
- TERMINFO_ADD(key_f5);
- TERMINFO_ADD(key_f6);
- TERMINFO_ADD(key_f7);
- TERMINFO_ADD(key_f8);
- TERMINFO_ADD(key_f9);
- TERMINFO_ADD(key_f10);
- TERMINFO_ADD(key_f11);
- TERMINFO_ADD(key_f12);
- TERMINFO_ADD(key_f13);
- TERMINFO_ADD(key_f14);
- TERMINFO_ADD(key_f15);
- TERMINFO_ADD(key_f16);
- TERMINFO_ADD(key_f17);
- TERMINFO_ADD(key_f18);
- TERMINFO_ADD(key_f19);
- TERMINFO_ADD(key_f20);
+ const terminfo_mapping_t tinfos[] = {
+ TERMINFO_ADD(key_a1),
+ TERMINFO_ADD(key_a3),
+ TERMINFO_ADD(key_b2),
+ TERMINFO_ADD(key_backspace),
+ TERMINFO_ADD(key_beg),
+ TERMINFO_ADD(key_btab),
+ TERMINFO_ADD(key_c1),
+ TERMINFO_ADD(key_c3),
+ TERMINFO_ADD(key_cancel),
+ TERMINFO_ADD(key_catab),
+ TERMINFO_ADD(key_clear),
+ TERMINFO_ADD(key_close),
+ TERMINFO_ADD(key_command),
+ TERMINFO_ADD(key_copy),
+ TERMINFO_ADD(key_create),
+ TERMINFO_ADD(key_ctab),
+ TERMINFO_ADD(key_dc),
+ TERMINFO_ADD(key_dl),
+ TERMINFO_ADD(key_down),
+ TERMINFO_ADD(key_eic),
+ TERMINFO_ADD(key_end),
+ TERMINFO_ADD(key_enter),
+ TERMINFO_ADD(key_eol),
+ TERMINFO_ADD(key_eos),
+ TERMINFO_ADD(key_exit),
+ TERMINFO_ADD(key_f0),
+ TERMINFO_ADD(key_f1),
+ TERMINFO_ADD(key_f2),
+ TERMINFO_ADD(key_f3),
+ TERMINFO_ADD(key_f4),
+ TERMINFO_ADD(key_f5),
+ TERMINFO_ADD(key_f6),
+ TERMINFO_ADD(key_f7),
+ TERMINFO_ADD(key_f8),
+ TERMINFO_ADD(key_f9),
+ TERMINFO_ADD(key_f10),
+ TERMINFO_ADD(key_f11),
+ TERMINFO_ADD(key_f12),
+ TERMINFO_ADD(key_f13),
+ TERMINFO_ADD(key_f14),
+ TERMINFO_ADD(key_f15),
+ TERMINFO_ADD(key_f16),
+ TERMINFO_ADD(key_f17),
+ TERMINFO_ADD(key_f18),
+ TERMINFO_ADD(key_f19),
+ TERMINFO_ADD(key_f20),
/*
I know of no keyboard with more than 20 function keys, so
adding the rest here makes very little sense, since it will
@@ -667,109 +661,113 @@ static void input_terminfo_init()
but with no benefit.
*/
/*
- TERMINFO_ADD(key_f21);
- TERMINFO_ADD(key_f22);
- TERMINFO_ADD(key_f23);
- TERMINFO_ADD(key_f24);
- TERMINFO_ADD(key_f25);
- TERMINFO_ADD(key_f26);
- TERMINFO_ADD(key_f27);
- TERMINFO_ADD(key_f28);
- TERMINFO_ADD(key_f29);
- TERMINFO_ADD(key_f30);
- TERMINFO_ADD(key_f31);
- TERMINFO_ADD(key_f32);
- TERMINFO_ADD(key_f33);
- TERMINFO_ADD(key_f34);
- TERMINFO_ADD(key_f35);
- TERMINFO_ADD(key_f36);
- TERMINFO_ADD(key_f37);
- TERMINFO_ADD(key_f38);
- TERMINFO_ADD(key_f39);
- TERMINFO_ADD(key_f40);
- TERMINFO_ADD(key_f41);
- TERMINFO_ADD(key_f42);
- TERMINFO_ADD(key_f43);
- TERMINFO_ADD(key_f44);
- TERMINFO_ADD(key_f45);
- TERMINFO_ADD(key_f46);
- TERMINFO_ADD(key_f47);
- TERMINFO_ADD(key_f48);
- TERMINFO_ADD(key_f49);
- TERMINFO_ADD(key_f50);
- TERMINFO_ADD(key_f51);
- TERMINFO_ADD(key_f52);
- TERMINFO_ADD(key_f53);
- TERMINFO_ADD(key_f54);
- TERMINFO_ADD(key_f55);
- TERMINFO_ADD(key_f56);
- TERMINFO_ADD(key_f57);
- TERMINFO_ADD(key_f58);
- TERMINFO_ADD(key_f59);
- TERMINFO_ADD(key_f60);
- TERMINFO_ADD(key_f61);
- TERMINFO_ADD(key_f62);
- TERMINFO_ADD(key_f63);*/
- TERMINFO_ADD(key_find);
- TERMINFO_ADD(key_help);
- TERMINFO_ADD(key_home);
- TERMINFO_ADD(key_ic);
- TERMINFO_ADD(key_il);
- TERMINFO_ADD(key_left);
- TERMINFO_ADD(key_ll);
- TERMINFO_ADD(key_mark);
- TERMINFO_ADD(key_message);
- TERMINFO_ADD(key_move);
- TERMINFO_ADD(key_next);
- TERMINFO_ADD(key_npage);
- TERMINFO_ADD(key_open);
- TERMINFO_ADD(key_options);
- TERMINFO_ADD(key_ppage);
- TERMINFO_ADD(key_previous);
- TERMINFO_ADD(key_print);
- TERMINFO_ADD(key_redo);
- TERMINFO_ADD(key_reference);
- TERMINFO_ADD(key_refresh);
- TERMINFO_ADD(key_replace);
- TERMINFO_ADD(key_restart);
- TERMINFO_ADD(key_resume);
- TERMINFO_ADD(key_right);
- TERMINFO_ADD(key_save);
- TERMINFO_ADD(key_sbeg);
- TERMINFO_ADD(key_scancel);
- TERMINFO_ADD(key_scommand);
- TERMINFO_ADD(key_scopy);
- TERMINFO_ADD(key_screate);
- TERMINFO_ADD(key_sdc);
- TERMINFO_ADD(key_sdl);
- TERMINFO_ADD(key_select);
- TERMINFO_ADD(key_send);
- TERMINFO_ADD(key_seol);
- TERMINFO_ADD(key_sexit);
- TERMINFO_ADD(key_sf);
- TERMINFO_ADD(key_sfind);
- TERMINFO_ADD(key_shelp);
- TERMINFO_ADD(key_shome);
- TERMINFO_ADD(key_sic);
- TERMINFO_ADD(key_sleft);
- TERMINFO_ADD(key_smessage);
- TERMINFO_ADD(key_smove);
- TERMINFO_ADD(key_snext);
- TERMINFO_ADD(key_soptions);
- TERMINFO_ADD(key_sprevious);
- TERMINFO_ADD(key_sprint);
- TERMINFO_ADD(key_sr);
- TERMINFO_ADD(key_sredo);
- TERMINFO_ADD(key_sreplace);
- TERMINFO_ADD(key_sright);
- TERMINFO_ADD(key_srsume);
- TERMINFO_ADD(key_ssave);
- TERMINFO_ADD(key_ssuspend);
- TERMINFO_ADD(key_stab);
- TERMINFO_ADD(key_sundo);
- TERMINFO_ADD(key_suspend);
- TERMINFO_ADD(key_undo);
- TERMINFO_ADD(key_up);
+ TERMINFO_ADD(key_f21),
+ TERMINFO_ADD(key_f22),
+ TERMINFO_ADD(key_f23),
+ TERMINFO_ADD(key_f24),
+ TERMINFO_ADD(key_f25),
+ TERMINFO_ADD(key_f26),
+ TERMINFO_ADD(key_f27),
+ TERMINFO_ADD(key_f28),
+ TERMINFO_ADD(key_f29),
+ TERMINFO_ADD(key_f30),
+ TERMINFO_ADD(key_f31),
+ TERMINFO_ADD(key_f32),
+ TERMINFO_ADD(key_f33),
+ TERMINFO_ADD(key_f34),
+ TERMINFO_ADD(key_f35),
+ TERMINFO_ADD(key_f36),
+ TERMINFO_ADD(key_f37),
+ TERMINFO_ADD(key_f38),
+ TERMINFO_ADD(key_f39),
+ TERMINFO_ADD(key_f40),
+ TERMINFO_ADD(key_f41),
+ TERMINFO_ADD(key_f42),
+ TERMINFO_ADD(key_f43),
+ TERMINFO_ADD(key_f44),
+ TERMINFO_ADD(key_f45),
+ TERMINFO_ADD(key_f46),
+ TERMINFO_ADD(key_f47),
+ TERMINFO_ADD(key_f48),
+ TERMINFO_ADD(key_f49),
+ TERMINFO_ADD(key_f50),
+ TERMINFO_ADD(key_f51),
+ TERMINFO_ADD(key_f52),
+ TERMINFO_ADD(key_f53),
+ TERMINFO_ADD(key_f54),
+ TERMINFO_ADD(key_f55),
+ TERMINFO_ADD(key_f56),
+ TERMINFO_ADD(key_f57),
+ TERMINFO_ADD(key_f58),
+ TERMINFO_ADD(key_f59),
+ TERMINFO_ADD(key_f60),
+ TERMINFO_ADD(key_f61),
+ TERMINFO_ADD(key_f62),
+ TERMINFO_ADD(key_f63),*/
+ TERMINFO_ADD(key_find),
+ TERMINFO_ADD(key_help),
+ TERMINFO_ADD(key_home),
+ TERMINFO_ADD(key_ic),
+ TERMINFO_ADD(key_il),
+ TERMINFO_ADD(key_left),
+ TERMINFO_ADD(key_ll),
+ TERMINFO_ADD(key_mark),
+ TERMINFO_ADD(key_message),
+ TERMINFO_ADD(key_move),
+ TERMINFO_ADD(key_next),
+ TERMINFO_ADD(key_npage),
+ TERMINFO_ADD(key_open),
+ TERMINFO_ADD(key_options),
+ TERMINFO_ADD(key_ppage),
+ TERMINFO_ADD(key_previous),
+ TERMINFO_ADD(key_print),
+ TERMINFO_ADD(key_redo),
+ TERMINFO_ADD(key_reference),
+ TERMINFO_ADD(key_refresh),
+ TERMINFO_ADD(key_replace),
+ TERMINFO_ADD(key_restart),
+ TERMINFO_ADD(key_resume),
+ TERMINFO_ADD(key_right),
+ TERMINFO_ADD(key_save),
+ TERMINFO_ADD(key_sbeg),
+ TERMINFO_ADD(key_scancel),
+ TERMINFO_ADD(key_scommand),
+ TERMINFO_ADD(key_scopy),
+ TERMINFO_ADD(key_screate),
+ TERMINFO_ADD(key_sdc),
+ TERMINFO_ADD(key_sdl),
+ TERMINFO_ADD(key_select),
+ TERMINFO_ADD(key_send),
+ TERMINFO_ADD(key_seol),
+ TERMINFO_ADD(key_sexit),
+ TERMINFO_ADD(key_sf),
+ TERMINFO_ADD(key_sfind),
+ TERMINFO_ADD(key_shelp),
+ TERMINFO_ADD(key_shome),
+ TERMINFO_ADD(key_sic),
+ TERMINFO_ADD(key_sleft),
+ TERMINFO_ADD(key_smessage),
+ TERMINFO_ADD(key_smove),
+ TERMINFO_ADD(key_snext),
+ TERMINFO_ADD(key_soptions),
+ TERMINFO_ADD(key_sprevious),
+ TERMINFO_ADD(key_sprint),
+ TERMINFO_ADD(key_sr),
+ TERMINFO_ADD(key_sredo),
+ TERMINFO_ADD(key_sreplace),
+ TERMINFO_ADD(key_sright),
+ TERMINFO_ADD(key_srsume),
+ TERMINFO_ADD(key_ssave),
+ TERMINFO_ADD(key_ssuspend),
+ TERMINFO_ADD(key_stab),
+ TERMINFO_ADD(key_sundo),
+ TERMINFO_ADD(key_suspend),
+ TERMINFO_ADD(key_undo),
+ TERMINFO_ADD(key_up)
+ };
+ const size_t count = sizeof tinfos / sizeof *tinfos;
+ terminfo_mappings.reserve(terminfo_mappings.size() + count);
+ terminfo_mappings.insert(terminfo_mappings.end(), tinfos, tinfos + count);
}
const wchar_t *input_terminfo_get_sequence( const wchar_t *name )
diff --git a/intern.cpp b/intern.cpp
index 224b9ca6..87480ea1 100644
--- a/intern.cpp
+++ b/intern.cpp
@@ -11,7 +11,6 @@
#include <wchar.h>
#include <unistd.h>
#include <set>
-#include <deque>
#include <algorithm>
#include "fallback.h"
@@ -29,14 +28,14 @@ class string_table_compare_t {
}
};
-/* A sorted deque ends up being a little more memory efficient than a std::set for the intern'd string table */
+/* A sorted vector ends up being a little more memory efficient than a std::set for the intern'd string table */
#define USE_SET 0
#if USE_SET
/** The table of intern'd strings */
typedef std::set<const wchar_t *, string_table_compare_t> string_table_t;
#else
/** The table of intern'd strings */
-typedef std::deque<const wchar_t *> string_table_t;
+typedef std::vector<const wchar_t *> string_table_t;
#endif
static string_table_t string_table;
diff --git a/proc.cpp b/proc.cpp
index 4908a1d7..fa9be893 100644
--- a/proc.cpp
+++ b/proc.cpp
@@ -72,7 +72,6 @@ Some of the code in this file is based on code from the Glibc manual.
#include "signal.h"
#include "event.h"
-#include <deque>
#include "output.h"
/**
@@ -153,7 +152,7 @@ static event_t event(0);
/**
A stack containing the values of is_interactive. Used by proc_push_interactive and proc_pop_interactive.
*/
-static std::deque<int> interactive_stack;
+static std::vector<int> interactive_stack;
void proc_init()
{
diff --git a/reader.cpp b/reader.cpp
index 32bf33b2..74c519e6 100644
--- a/reader.cpp
+++ b/reader.cpp
@@ -306,6 +306,25 @@ class reader_data_t
/** Whether the a screen reset is needed after a repaint. */
bool screen_reset_needed;
+
+ /** Constructor */
+ reader_data_t() :
+ suppress_autosuggestion(0),
+ history(0),
+ token_history_pos(0),
+ search_pos(0),
+ buff_pos(0),
+ complete_func(0),
+ highlight_function(0),
+ test_func(0),
+ end_loop(0),
+ prev_end_loop(0),
+ next(0),
+ search_mode(0),
+ repaint_needed(0),
+ screen_reset_needed(0)
+ {
+ }
};
/**
@@ -530,8 +549,8 @@ void reader_data_t::command_line_changed() {
/** Remove any duplicate completions in the list. This relies on the list first beeing sorted. */
-static void remove_duplicates(std::vector<completion_t> &l) {
-
+static void remove_duplicates(std::vector<completion_t> &l)
+{
l.erase(std::unique( l.begin(), l.end()), l.end());
}
@@ -2100,9 +2119,7 @@ static int default_test( const wchar_t *b )
void reader_push( const wchar_t *name )
{
- // use something nasty which guarantees value initialization (that is, all fields zero)
- const reader_data_t zerod = {};
- reader_data_t *n = new reader_data_t(zerod);
+ reader_data_t *n = new reader_data_t();
n->history = & history_t::history_with_name(name);
n->app_name = name;
diff --git a/wildcard.cpp b/wildcard.cpp
index e27efe59..ac6b628e 100644
--- a/wildcard.cpp
+++ b/wildcard.cpp
@@ -142,13 +142,10 @@ int wildcard_has( const wchar_t *str, int internal )
\param wc The wildcard.
\param is_first Whether files beginning with dots should not be matched against wildcards.
*/
-static int wildcard_match2( const wcstring &str_str,
- const wcstring &wc_str,
+static int wildcard_match2( const wchar_t *str,
+ const wchar_t *wc,
int is_first )
{
- const wchar_t *str = str_str.c_str();
- const wchar_t *wc = wc_str.c_str();
-
if( *str == 0 && *wc==0 )
return 1;
@@ -254,7 +251,7 @@ static bool wildcard_complete_internal(const wcstring &orig,
if (! out_completion.empty())
{
- completion_allocate( out,
+ append_completion( out,
out_completion,
out_desc,
flags );
@@ -312,7 +309,7 @@ bool wildcard_complete(const wcstring &str,
int wildcard_match( const wcstring &str, const wcstring &wc )
{
- return wildcard_match2( str, wc, 1 );
+ return wildcard_match2( str.c_str(), wc.c_str(), 1 );
}
/**
@@ -424,7 +421,7 @@ static wcstring complete_get_desc_suffix( const wchar_t *suff_orig )
\param err The errno value after a failed stat call on the file.
*/
-static wcstring file_get_desc( const wchar_t *filename,
+static wcstring file_get_desc( const wcstring &filename,
int lstat_res,
struct stat lbuf,
int stat_res,
@@ -433,8 +430,6 @@ static wcstring file_get_desc( const wchar_t *filename,
{
const wchar_t *suffix;
- CHECK( filename, 0 );
-
if( !lstat_res )
{
if( S_ISLNK(lbuf.st_mode))
@@ -535,7 +530,7 @@ static wcstring file_get_desc( const wchar_t *filename,
}
}
- suffix = wcsrchr( filename, L'.' );
+ suffix = wcsrchr( filename.c_str(), L'.' );
if( suffix != 0 && !wcsrchr( suffix, L'/' ) )
{
return complete_get_desc_suffix( suffix );