aboutsummaryrefslogtreecommitdiffhomepage
path: root/env.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-03-19 11:52:18 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-03-19 11:52:18 -0700
commit1a87f44325327aff426118da1d9fdf8ac01f67a9 (patch)
tree309b3e63d6baef111ebab8493b793ac54e7b2720 /env.cpp
parentc8bc535f22d04f12b34e9722839764dcc9198871 (diff)
Re-implement $history variable
Added -L option to set to mean "don't abbreviate"
Diffstat (limited to 'env.cpp')
-rw-r--r--env.cpp156
1 files changed, 12 insertions, 144 deletions
diff --git a/env.cpp b/env.cpp
index 47dd777c..205562a1 100644
--- a/env.cpp
+++ b/env.cpp
@@ -1072,39 +1072,18 @@ const wchar_t *env_var_t::c_str(void) const {
}
env_var_t env_get_string( const wcstring &key )
-{
- scoped_lock lock(env_lock);
-
- if( key == L"history" )
+{
+ /* Big hack...we only allow getting the history on the main thread. Note that history_t may ask for an environment variable, so don't take the lock here (we don't need it) */
+ if( key == L"history" && is_main_thread())
{
- wcstring result;
- const wchar_t *current;
- int i;
- int add_current=0;
-
- current = reader_get_buffer();
- if( current && wcslen( current ) )
- {
- add_current=1;
- result += current;
- }
-
- for( i=add_current;; i++ )
- {
- // PCA This looks bad! We can't do this off of the main thread.
- wchar_t *next = NULL;//history_get( i-add_current );
- if( !next )
- {
- break;
- }
-
- if( i!=0)
- {
- result += ARRAY_SEP_STR;
- }
- result += next;
- }
+ env_var_t result;
+ history_t *history = reader_get_history();
+ if (! history) {
+ history = &history_t::history_with_name(L"fish");
+ }
+ if (history)
+ history->get_string_representation(result, ARRAY_SEP_STR);
return result;
}
else if( key == L"COLUMNS" )
@@ -1125,6 +1104,8 @@ env_var_t env_get_string( const wcstring &key )
}
else {
+ scoped_lock lock(env_lock);
+
var_entry_t *res;
env_node_t *env = top;
wchar_t *item;
@@ -1183,119 +1164,6 @@ env_var_t env_get_string( const wcstring &key )
}
}
-const wchar_t *env_get( const wchar_t *key )
-{
- ASSERT_IS_MAIN_THREAD();
-
- var_entry_t *res;
- env_node_t *env = top;
- wchar_t *item;
-
- CHECK( key, 0 );
-
- if( wcscmp( key, L"history" ) == 0 )
- {
- const wchar_t *current;
- dyn_var.clear();
-
- current = reader_get_buffer();
- if( current && wcslen( current ) )
- {
- dyn_var.append(current);
- dyn_var.append(ARRAY_SEP_STR);
- }
-
- history_t *history = reader_get_history();
- if (history) {
- for (size_t idx = 1; idx < (size_t)(-1); idx++) {
- history_item_t item = history->item_at_index(idx);
- if (item.empty()) break;
-
- dyn_var.append(item.str());
- dyn_var.append(ARRAY_SEP_STR);
- }
- }
-
- /* We always have a trailing ARRAY_SEP_STR; get rid of it */
- if (dyn_var.size() >= wcslen(ARRAY_SEP_STR)) {
- dyn_var.resize(dyn_var.size() - wcslen(ARRAY_SEP_STR));
- }
-
- return dyn_var.c_str();
- }
- else if( wcscmp( key, L"COLUMNS" )==0 )
- {
- dyn_var = to_string<int>(common_get_width());
- return dyn_var.c_str();
- }
- else if( wcscmp( key, L"LINES" )==0 )
- {
- dyn_var = to_string<int>(common_get_height());
- return dyn_var.c_str();
- }
- else if( wcscmp( key, L"status" )==0 )
- {
- dyn_var = to_string<int>(proc_get_last_status());
- return dyn_var.c_str();
- }
- else if( wcscmp( key, L"umask" )==0 )
- {
- dyn_var = format_string(L"0%0.3o", get_umask());
- return dyn_var.c_str();
- }
-
- while( env != 0 )
- {
- var_table_t::iterator result = env->env.find(key);
- if ( result != env->env.end() )
- {
- res = result->second;
- }
- else
- {
- res = 0;
- }
-
-
- if( res != 0 )
- {
- if( res->val == ENV_NULL )
- {
- return 0;
- }
- else
- {
- return res->val.c_str();
- }
- }
-
- if( env->new_scope )
- {
- env = global_env;
- }
- else
- {
- env = env->next;
- }
- }
- if( !proc_had_barrier)
- {
- proc_had_barrier=1;
- env_universal_barrier();
- }
-
- item = env_universal_get( key );
-
- if( !item || (wcscmp( item, ENV_NULL )==0))
- {
- return 0;
- }
- else
- {
- return item;
- }
-}
-
int env_exist( const wchar_t *key, int mode )
{
var_entry_t *res;