This is an automated email from the git hooks/post-receive script. hmmr-guest pushed a commit to branch WIP in repository cnrun.
commit d960e21a8a46312b4817c03a61db35f4e45609e8 Author: Andrei Zavada <[email protected]> Date: Sun Mar 30 00:49:46 2014 +0200 update libstilton; begin using cnrun namespace; drop logging facility --- .../src/cnrun/runner-interpreter-completions.cc | 28 +- upstream/src/cnrun/runner-interpreter.cc | 192 +++++++------ upstream/src/cnrun/runner-main.cc | 59 ++-- upstream/src/cnrun/runner.hh | 23 +- upstream/src/libcn/hosted-neurons.cc | 2 +- upstream/src/libcn/model-cycle.cc | 2 +- upstream/src/libcn/model-struct.cc | 10 +- upstream/src/libcn/types.cc | 10 +- upstream/src/libstilton/Makefile.am | 17 +- upstream/src/libstilton/alg.hh | 103 +++++++ upstream/src/libstilton/containers.hh | 67 +++++ upstream/src/libstilton/exprparser.cc | 6 +- upstream/src/libstilton/exprparser.hh | 3 +- upstream/src/libstilton/gcc-builtins.hh | 43 --- upstream/src/libstilton/lang.hh | 87 ++++++ upstream/src/libstilton/libcommon.cc | 303 +++++++++++++++++++++ upstream/src/libstilton/log-facility.cc | 147 ---------- upstream/src/libstilton/log-facility.hh | 76 ------ upstream/src/libstilton/pointaligned-s.cc | 79 ------ upstream/src/libstilton/pointaligned-s.hh | 26 -- upstream/src/libstilton/string.hh | 118 ++++++++ 21 files changed, 850 insertions(+), 551 deletions(-) diff --git a/upstream/src/cnrun/runner-interpreter-completions.cc b/upstream/src/cnrun/runner-interpreter-completions.cc index 72a4e9b..3609ee1 100644 --- a/upstream/src/cnrun/runner-interpreter-completions.cc +++ b/upstream/src/cnrun/runner-interpreter-completions.cc @@ -11,14 +11,17 @@ #include <stdio.h> -#include "config.h" +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + #ifdef HAVE_LIBREADLINE # if defined(HAVE_READLINE_READLINE_H) # include <readline/readline.h> # elif defined(HAVE_READLINE_H) # include <readline.h> -# endif /* !defined(HAVE_READLINE_H) */ -#endif /* HAVE_LIBREADLINE */ +# endif +#endif #ifdef HAVE_READLINE_HISTORY # if defined(HAVE_READLINE_HISTORY_H) @@ -26,25 +29,19 @@ # elif defined(HAVE_HISTORY_H) # include <history.h> # endif -#endif /* HAVE_READLINE_HISTORY */ +#endif #include "runner.hh" #include "libcn/model.hh" -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - using namespace std; -using namespace Stilton; - +using namespace cnrun; static char* cnrun_null_generator( const char* text, int state) { -// printf( "No completion in this context\n"); return nullptr; } @@ -154,7 +151,7 @@ cnrun_syn_type_generator( const char *text, int state) -bool regenerate_unit_labels = true; +bool cnrun::regenerate_unit_labels = true; #define GENERATE_NEURONS 1 #define GENERATE_SYNAPSES 2 @@ -204,7 +201,7 @@ cnrun_unit_label_generator( const char *text, int state) -bool regenerate_var_names = true; +bool cnrun::regenerate_var_names = true; static char* cnrun_var_names_generator( const char *text, int state) @@ -247,7 +244,7 @@ cnrun_var_names_generator( const char *text, int state) -bool regenerate_source_ids = true; +bool cnrun::regenerate_source_ids = true; static char* cnrun_source_id_generator( const char *text, int state) @@ -363,6 +360,7 @@ rl_point_at_word() char** +cnrun:: cnrun_completion( const char *text, int start, int end) { if ( start == 0 ) @@ -451,6 +449,4 @@ cnrun_completion( const char *text, int start, int end) } - - // EOF diff --git a/upstream/src/cnrun/runner-interpreter.cc b/upstream/src/cnrun/runner-interpreter.cc index 3521279..9aaa464 100644 --- a/upstream/src/cnrun/runner-interpreter.cc +++ b/upstream/src/cnrun/runner-interpreter.cc @@ -17,33 +17,32 @@ #include <list> #include <initializer_list> -#include "config.h" +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif #if defined(HAVE_READLINE_READLINE_H) # include <readline/readline.h> #elif defined(HAVE_READLINE_H) # include <readline.h> -#endif /* !defined(HAVE_READLINE_H) */ +#endif #if defined(HAVE_READLINE_HISTORY_H) # include <readline/history.h> #elif defined(HAVE_HISTORY_H) # include <history.h> -# endif +#endif +#include "libstilton/string.hh" #include "runner.hh" #include "libstilton/exprparser.hh" #include "libcn/integrate-rk65.hh" #include "libcn/base-unit.hh" -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - using namespace std; +using namespace cnrun; - -const char* const cnrun_cmd[] = { +const char* const cnrun::cnrun_cmd[] = { "new_model", "load_nml", "merge_nml", @@ -86,29 +85,23 @@ const char* const cnrun_cmd[] = { -list<SVariable> *current_shell_variables; +list<SVariable> *cnrun::current_shell_variables; namespace { void -LOG( const char *fname, int lineno, int vrb, const char* fmt, ...) +report_script_issue( const char *fname, int lineno, int vrb, const char* fmt, ...) { va_list ap; va_start (ap, fmt); - - char *buf1 = const_cast<char*>(""), *buf2; - if ( lineno > 0 ) - assert (asprintf( &buf1, "%s:%d: ", fname, lineno) > 0); - assert (vasprintf( &buf2, fmt, ap) > 0); + string body = str::svasprintf( fmt, ap); va_end (ap); - Log->msg( vrb, "CNrun", "%s%s", buf1, buf2); - - if ( lineno > 0 ) - free( buf1); - free( buf2); + string pre = ( lineno > 0 ) + ? str::sasprintf( "%s:%d: %s", fname, lineno, body.c_str()) + : str::sasprintf( "%s: %s", fname, body.c_str()); } int do_single_cmd( const char*, @@ -142,18 +135,18 @@ new_model( const char *model_name, const char *fname, unsigned lineno) (Options.display_progress_percent ? CN_MDL_DISPLAY_PROGRESS_PERCENT : 0) | (Options.display_progress_time ? CN_MDL_DISPLAY_PROGRESS_TIME : 0) | (Options.dont_coalesce ? CN_MDL_DONT_COALESCE : 0))) ) { - LOG( fname, lineno, -1, "Failed to create a model"); + report_script_issue( fname, lineno, -1, "Failed to create model"); return CN_INTERP_SYSFAIL; } Model->verbosely = Options.verbosely; Model->listen_dt = Options.listen_dt; Model->spike_threshold = Options.spike_threshold /*, Model->spike_lapse = Options.spike_lapse */; - Log->msg( 3, nullptr, - "generator type: %s\n" - " seed = %lu\n" - " first value = %lu\n", - gsl_rng_name (Model->_rng), gsl_rng_default_seed, gsl_rng_get (Model->_rng)); + lprintf( 3, + "generator type: %s\n" + " seed = %lu\n" + " first value = %lu\n", + gsl_rng_name (Model->_rng), gsl_rng_default_seed, gsl_rng_get (Model->_rng)); return 0; } @@ -177,14 +170,14 @@ do_single_cmd( const char* raw, #define CHECK_MODEL \ if ( !Model ) { \ - LOG( fname, lineno, -1, "No model loaded"); \ + report_script_issue( fname, lineno, -1, "No model loaded"); \ return CN_INTERP_WARN; \ } if ( strcmp( cmd, cnrun_cmd[CNCMD_new_model]) == 0 ) { if ( !operand ) { - LOG( fname, lineno, -1, "Missing a name for the new model"); + report_script_issue( fname, lineno, -1, "Missing a name for the new model"); return CN_INTERP_PARSEERROR; } delete Model; @@ -195,7 +188,7 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_load_nml]) == 0 ) { struct stat s; if ( stat( operand, &s) ) { - LOG( fname, lineno, -1, "No such file: \"%s\"", operand); + report_script_issue( fname, lineno, -1, "No such file: \"%s\"", operand); return CN_INTERP_SYSFAIL; } @@ -204,7 +197,7 @@ do_single_cmd( const char* raw, return retval; if ( Model->import_NetworkML( operand, false) < 0 ) { - LOG( fname, lineno, -1, "Failed to create model topology from \"%s\"", operand); + report_script_issue( fname, lineno, -1, "Failed to create model topology from \"%s\"", operand); delete Model; Model = nullptr; return CN_INTERP_SYSFAIL; @@ -218,11 +211,11 @@ do_single_cmd( const char* raw, CHECK_MODEL; struct stat s; if ( stat( operand, &s) ) { - LOG( fname, lineno, -1, "No such file: \"%s\"", operand); + report_script_issue( fname, lineno, -1, "No such file: \"%s\"", operand); return CN_INTERP_SYSFAIL; } if ( Model->import_NetworkML( operand, true) < 0 ) { - LOG( fname, lineno, -1, "Failed to import topology from \"%s\"", operand); + report_script_issue( fname, lineno, -1, "Failed to import topology from \"%s\"", operand); return CN_INTERP_SYSFAIL; } @@ -235,11 +228,11 @@ do_single_cmd( const char* raw, if ( !operand || !(type_s = (strtok( operand, " \t"))) || !(label_s = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Missing neuron type and/or label in `add_neuron'"); + report_script_issue( fname, lineno, -1, "Missing neuron type and/or label in `add_neuron'"); return CN_INTERP_PARSEERROR; } if ( !Model->add_neuron_species( type_s, label_s, true) ) { - LOG( fname, lineno, -1, "`add_neuron' failed"); + report_script_issue( fname, lineno, -1, "`add_neuron' failed"); return CN_INTERP_PARSEERROR; } regenerate_unit_labels = true; @@ -253,17 +246,17 @@ do_single_cmd( const char* raw, !(src_s = strtok( nullptr, " \t")) || !(tgt_s = strtok( nullptr, " \t")) || !(g_s = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Missing synapse type, source or target label, and/or gsyn in `add_synapse'"); + report_script_issue( fname, lineno, -1, "Missing synapse type, source or target label, and/or gsyn in `add_synapse'"); return CN_INTERP_PARSEERROR; } double g; if ( expr( g_s, g, &varlist) ) { - LOG( fname, lineno, -1, "Bad value for gsyn in `add_synapse'"); + report_script_issue( fname, lineno, -1, "Bad value for gsyn in `add_synapse'"); return CN_INTERP_PARSEERROR; } if ( !Model->add_synapse_species( type_s, src_s, tgt_s, g, true, true) ) { - LOG( fname, lineno, -1, "`add_synapse' failed (reason given above)", operand); + report_script_issue( fname, lineno, -1, "`add_synapse' failed (reason given above)", operand); return CN_INTERP_SYSFAIL; } regenerate_unit_labels = true; @@ -273,12 +266,12 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_reset]) == 0 ) { CHECK_MODEL; Model->reset(); - Log->msg( 0, nullptr, "Reset model and state all units"); + lprintf( 0, "Reset model and state of all units"); } else if ( strcmp( cmd, cnrun_cmd[CNCMD_reset_revert_params]) == 0 ) { CHECK_MODEL; Model->reset( true); - Log->msg( 0, nullptr, "Reset model and reverted all units' state and parameters"); + lprintf( 0, "Reset model and reverted all units' state and parameters"); } else if ( strcmp( cmd, cnrun_cmd[CNCMD_reset_state_units]) == 0 ) { CHECK_MODEL; @@ -286,7 +279,7 @@ do_single_cmd( const char* raw, operand = const_cast<char*>(".*"); regex_t RE; if ( 0 != regcomp( &RE, operand, REG_EXTENDED | REG_NOSUB) ) { - LOG( fname, lineno, -1, "Invalid regexp for `reset_state_units' arg"); + report_script_issue( fname, lineno, -1, "Invalid regexp for `reset_state_units' arg"); return CN_INTERP_PARSEERROR; } size_t cnt = 0; @@ -296,18 +289,18 @@ do_single_cmd( const char* raw, ++cnt; } if ( cnt ) - Log->msg( 0, nullptr, "Reset %zd unit(s)", cnt); + lprintf( 0, "Reset %zd unit(s)", cnt); } else if ( strcmp( cmd, cnrun_cmd[CNCMD_advance_until]) == 0 ) { CHECK_MODEL; expr.silent = true; if ( !operand || expr( operand, result, &varlist) ) { - LOG( fname, lineno, -1, "No or bad time value for `advance_until'"); + report_script_issue( fname, lineno, -1, "No or bad time value for `advance_until'"); return CN_INTERP_PARSEERROR; } if ( Model->model_time() > result ) { - LOG( fname, lineno, 0, "Cannot go back in time (now is %g)", Model->model_time()); + report_script_issue( fname, lineno, 0, "Cannot go back in time (now is %g)", Model->model_time()); return CN_INTERP_WARN; } @@ -319,7 +312,7 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_advance]) == 0 ) { CHECK_MODEL; if ( !operand || expr( operand, result, &varlist) ) { - LOG( fname, lineno, -1, "No or bad time value for `advance'"); + report_script_issue( fname, lineno, -1, "No or bad time value for `advance'"); return CN_INTERP_PARSEERROR; } @@ -333,7 +326,7 @@ do_single_cmd( const char* raw, char *label_s; if ( !operand || !(label_s = (strtok( operand, " \t"))) ) { - LOG( fname, lineno, -1, "Missing label in `putout'"); + report_script_issue( fname, lineno, -1, "Missing label in `putout'"); return CN_INTERP_PARSEERROR; } @@ -350,15 +343,15 @@ do_single_cmd( const char* raw, if ( !operand || !(label_s = (strtok( operand, " \t"))) || !(frac_s = (strtok( nullptr, "\n"))) ) { - LOG( fname, lineno, -1, "Missing fraction or label in `decimate'"); + report_script_issue( fname, lineno, -1, "Missing fraction or label in `decimate'"); return CN_INTERP_PARSEERROR; } if ( expr( frac_s, result, &varlist) ) { - LOG( fname, lineno, -1, "Unparsable expression for decimation fraction: \"%s\"", operand); + report_script_issue( fname, lineno, -1, "Unparsable expression for decimation fraction: \"%s\"", operand); return CN_INTERP_PARSEERROR; } if ( result < 0. || result > 1. ) { - LOG( fname, lineno, -1, "Decimation fraction outside [0..1]"); + report_script_issue( fname, lineno, -1, "Decimation fraction outside [0..1]"); return CN_INTERP_PARSEERROR; } @@ -373,7 +366,7 @@ do_single_cmd( const char* raw, CHECK_MODEL; if ( !operand || !(operand = (strtok( operand, " \t")) ) ) { - LOG( fname, lineno, -1, "Missing label in `start_listen'"); + report_script_issue( fname, lineno, -1, "Missing label in `start_listen'"); return CN_INTERP_PARSEERROR; } list<CModel::STagGroupListener> tags; @@ -387,7 +380,7 @@ do_single_cmd( const char* raw, CHECK_MODEL; if ( !operand || !(operand = (strtok( operand, " \t"))) ) { - LOG( fname, lineno, -1, "Missing label in `stop_listen'"); + report_script_issue( fname, lineno, -1, "Missing label in `stop_listen'"); return CN_INTERP_PARSEERROR; } list<CModel::STagGroupListener> tags; @@ -397,11 +390,11 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_listen_dt]) == 0 ) { if ( !operand ) { - Log->msg( 0, nullptr, "listen_dt is %g", Options.listen_dt); + lprintf( 0, "listen_dt is %g", Options.listen_dt); return 0; } if ( expr( operand, result, &varlist) ) { - LOG( fname, lineno, -1, "Unparsable expression for value in `listen_dt'"); + report_script_issue( fname, lineno, -1, "Unparsable expression for value in `listen_dt'"); return CN_INTERP_PARSEERROR; } if ( Model ) @@ -410,7 +403,7 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_listen_mode]) == 0 ) { if ( !operand ) - Log->msg( 0, nullptr, "listen mode is 1%sd%sb%s (%s%s%s)", + lprintf( 0, "listen mode is 1%sd%sb%s (%s%s%s)", Options.listen_1varonly ? "+" : "", Options.listen_deferwrite ? "+" : "", Options.listen_binary ? "+" : "", @@ -426,11 +419,11 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_integration_dt_min]) == 0 ) { if ( !operand ) { - Log->msg( 0, nullptr, "integration_dt_min is %g", Options.integration_dt_min); + lprintf( 0, "integration_dt_min is %g", Options.integration_dt_min); return 0; } if ( expr( operand, result, &varlist) ) { - LOG( fname, lineno, -1, "Unparsable expression for value in `integration_dt_min'"); + report_script_issue( fname, lineno, -1, "Unparsable expression for value in `integration_dt_min'"); return CN_INTERP_PARSEERROR; } Options.integration_dt_min = result; @@ -439,11 +432,11 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_integration_dt_max]) == 0 ) { if ( !operand ) { - Log->msg( 0, nullptr, "integration_dt_max is %g", Options.integration_dt_max); + lprintf( 0, "integration_dt_max is %g", Options.integration_dt_max); return 0; } if ( expr( operand, result, &varlist) ) { - LOG( fname, lineno, -1, "Unparsable expression for value in `integration_dt_max'"); + report_script_issue( fname, lineno, -1, "Unparsable expression for value in `integration_dt_max'"); return CN_INTERP_PARSEERROR; } Options.integration_dt_max = result; @@ -452,11 +445,11 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_integration_dt_cap]) == 0 ) { if ( !operand ) { - Log->msg( 0, nullptr, "integration_dt_cap is %g", Options.integration_dt_max_cap); + lprintf( 0, "integration_dt_cap is %g", Options.integration_dt_max_cap); return 0; } if ( expr( operand, result, &varlist) ) { - LOG( fname, lineno, -1, "Unparsable expression for value in `integration_dt_cap'"); + report_script_issue( fname, lineno, -1, "Unparsable expression for value in `integration_dt_cap'"); return CN_INTERP_PARSEERROR; } Options.integration_dt_max_cap = result; @@ -466,13 +459,13 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_set_sxf_params]) == 0 ) { if ( !operand ) { - Log->msg( 0, nullptr, "sxf_start_delay:sxf_period:sdf_sigma is %g:%g:%g", + lprintf( 0, "sxf_start_delay:sxf_period:sdf_sigma is %g:%g:%g", Options.sxf_start_delay, Options.sxf_sample, Options.sdf_sigma); return 0; } if ( sscanf( operand, "%g:%g:%g", &Options.sxf_start_delay, &Options.sxf_sample, &Options.sdf_sigma) < 3 ) { - LOG( fname, lineno, -1, "Expecting <double>:<double>:<double> with set_sxf_params"); + report_script_issue( fname, lineno, -1, "Expecting <double>:<double>:<double> with set_sxf_params"); return CN_INTERP_PARSEERROR; } @@ -482,11 +475,11 @@ do_single_cmd( const char* raw, char *label_s; if ( !operand || !(label_s = (strtok( operand, " \t"))) ) { - LOG( fname, lineno, -1, "Missing label in `start_log_spikes'"); + report_script_issue( fname, lineno, -1, "Missing label in `start_log_spikes'"); return CN_INTERP_PARSEERROR; } if ( Options.sxf_sample <= 0. || Options.sdf_sigma <= 0. ) { - LOG( fname, lineno, 1, "SDF parameters not set up, will only log spike times"); + report_script_issue( fname, lineno, 1, "SDF parameters not set up, will only log spike times"); } list<CModel::STagGroupSpikelogger> specs; specs.push_back( CModel::STagGroupSpikelogger (label_s, true, @@ -498,7 +491,7 @@ do_single_cmd( const char* raw, char *label_s; if ( !operand || !(label_s = (strtok( operand, " \t"))) ) { - LOG( fname, lineno, -1, "Missing label in `stop_log_spikes'"); + report_script_issue( fname, lineno, -1, "Missing label in `stop_log_spikes'"); return CN_INTERP_PARSEERROR; } list<CModel::STagGroupSpikelogger> specs; @@ -513,11 +506,11 @@ do_single_cmd( const char* raw, !(label_s = (strtok( operand, " \t"))) || !(parm_s = strtok( nullptr, " \t")) || !(value_s = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Missing label, parameter or value in `set_parm_neuron'"); + report_script_issue( fname, lineno, -1, "Missing label, parameter or value in `set_parm_neuron'"); return CN_INTERP_PARSEERROR; } if ( expr( value_s, result, &varlist) ) { - LOG( fname, lineno, -1, "Unparsable expression for value in `set_parm_neuron'"); + report_script_issue( fname, lineno, -1, "Unparsable expression for value in `set_parm_neuron'"); return CN_INTERP_PARSEERROR; } list<CModel::STagGroupNeuronParmSet> specs = { CModel::STagGroupNeuronParmSet (label_s, true, parm_s, result) }; @@ -532,11 +525,11 @@ do_single_cmd( const char* raw, !(tgt_s = (strtok( nullptr, " \t"))) || !(parm_s = strtok( nullptr, " \t")) || !(value_s = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Missing source or target label, parameter and/or value in `set_parm_synapse'"); + report_script_issue( fname, lineno, -1, "Missing source or target label, parameter and/or value in `set_parm_synapse'"); return CN_INTERP_PARSEERROR; } if ( expr( value_s, result, &varlist) ) { - LOG( fname, lineno, -1, "Unparsable value in `set_parm_synapse'"); + report_script_issue( fname, lineno, -1, "Unparsable value in `set_parm_synapse'"); return CN_INTERP_PARSEERROR; } list<CModel::STagGroupSynapseParmSet> specs = { CModel::STagGroupSynapseParmSet (src_s, tgt_s, true, parm_s, result) }; @@ -549,19 +542,19 @@ do_single_cmd( const char* raw, if ( !operand || !(type_s = (strtok( operand, " \t"))) || !(name_s = (strtok( nullptr, " \t"))) ) { - LOG( fname, lineno, -1, "Missing source type or name in `new_source'"); + report_script_issue( fname, lineno, -1, "Missing source type or name in `new_source'"); return CN_INTERP_PARSEERROR; } if ( Model->source_by_id( name_s) ) { - LOG( fname, lineno, -1, "A source named \"%s\" already exists", name_s); + report_script_issue( fname, lineno, -1, "A source named \"%s\" already exists", name_s); return CN_INTERP_PARSEERROR; } char *arg1, *arg2; if ( strcmp( type_s, __SourceTypes[SRC_TAPE]) == 0 ) { if ( !(arg1 = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Missing filename for a Tape source in `new_source'"); + report_script_issue( fname, lineno, -1, "Missing filename for a Tape source in `new_source'"); return CN_INTERP_PARSEERROR; } else { CSourceTape *source = new CSourceTape( name_s, arg1); @@ -569,18 +562,18 @@ do_single_cmd( const char* raw, if ( count( Model->Sources.begin(), Model->Sources.end(), source) == 0 ) Model->Sources.push_back( source); else { - LOG( fname, lineno, -1, "Duplicate name (\"%s\") for a source", arg1); + report_script_issue( fname, lineno, -1, "Duplicate name (\"%s\") for a source", arg1); return CN_INTERP_SYSFAIL; } else { delete source; - LOG( fname, lineno, -1, "Failed to set up a Tape source from \"%s\"", arg1); + report_script_issue( fname, lineno, -1, "Failed to set up a Tape source from \"%s\"", arg1); return CN_INTERP_SYSFAIL; } } } else if ( strcmp( type_s, __SourceTypes[SRC_PERIODIC]) == 0 ) { if ( !(arg1 = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Missing filename for a Periodic source in `new_source'"); + report_script_issue( fname, lineno, -1, "Missing filename for a Periodic source in `new_source'"); return CN_INTERP_PARSEERROR; } else { CSourcePeriodic *source = new CSourcePeriodic( name_s, arg1); @@ -588,25 +581,25 @@ do_single_cmd( const char* raw, if ( count( Model->Sources.begin(), Model->Sources.end(), source) == 0 ) Model->Sources.push_back( source); else { - LOG( fname, lineno, -1, "Duplicate name (\"%s\") for a source", arg1); + report_script_issue( fname, lineno, -1, "Duplicate name (\"%s\") for a source", arg1); return CN_INTERP_SYSFAIL; } else { delete source; - LOG( fname, lineno, -1, "Failed to set up a Periodic source from \"%s\"", arg1); + report_script_issue( fname, lineno, -1, "Failed to set up a Periodic source from \"%s\"", arg1); return CN_INTERP_SYSFAIL; } } } else if ( strcmp( type_s, __SourceTypes[SRC_NOISE]) == 0 ) { if ( !(arg1 = strtok( nullptr, ":")) || !(arg2 = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Incomplete min:max set for a Noise source in `new_source'"); + report_script_issue( fname, lineno, -1, "Incomplete min:max set for a Noise source in `new_source'"); return CN_INTERP_PARSEERROR; } else { double _min, _max; if ( expr( arg1, _min, &varlist) || expr( arg2, _max, &varlist) ) { - LOG( fname, lineno, -1, "Bad min:max values for a Noise source"); + report_script_issue( fname, lineno, -1, "Bad min:max values for a Noise source"); return CN_INTERP_PARSEERROR; } CSourceNoise *source = new CSourceNoise( name_s, _min, _max); @@ -614,15 +607,15 @@ do_single_cmd( const char* raw, Model->Sources.push_back( source); } else { delete source; - LOG( fname, lineno, -1, "Failed to set up a Noise source"); + report_script_issue( fname, lineno, -1, "Failed to set up a Noise source"); return CN_INTERP_SYSFAIL; } } } else if ( strcmp( type_s, __SourceTypes[SRC_FUNCTION]) == 0 ) { - LOG( fname, lineno, -1, "Go code, Chris!"); + report_script_issue( fname, lineno, -1, "Go code, Chris!"); return CN_INTERP_SYSFAIL; } else { - LOG( fname, lineno, -1, "Unrecognised source type in `new_source'"); + report_script_issue( fname, lineno, -1, "Unrecognised source type in `new_source'"); return CN_INTERP_PARSEERROR; } @@ -642,12 +635,12 @@ do_single_cmd( const char* raw, !(source_s = strtok( operand, " \t")) || !(label_s = strtok( nullptr, " \t")) || !(parm_s = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Missing source id, unit label and/or parameter in `connect_source'"); + report_script_issue( fname, lineno, -1, "Missing source id, unit label and/or parameter in `connect_source'"); return CN_INTERP_PARSEERROR; } C_BaseSource *source = Model->source_by_id( source_s); if ( !source ) { - LOG( fname, lineno, -1, "Unknown source \"%s\"", source_s); + report_script_issue( fname, lineno, -1, "Unknown source \"%s\"", source_s); return CN_INTERP_PARSEERROR; } @@ -663,12 +656,12 @@ do_single_cmd( const char* raw, !(label_s = (strtok( operand, " \t"))) || !(parm_s = strtok( nullptr, " \t")) || !(source_s = strtok( nullptr, "\n")) ) { - LOG( fname, lineno, -1, "Missing label, parameter or source in `disconnect_source'"); + report_script_issue( fname, lineno, -1, "Missing label, parameter or source in `disconnect_source'"); return CN_INTERP_PARSEERROR; } C_BaseSource *source = Model->source_by_id( source_s); if ( !source ) { - LOG( fname, lineno, -1, "Unknown source \"%s\"", source_s); + report_script_issue( fname, lineno, -1, "Unknown source \"%s\"", source_s); return CN_INTERP_PARSEERROR; } @@ -695,7 +688,7 @@ do_single_cmd( const char* raw, regex_t RE; if ( 0 != regcomp( &RE, operand, REG_EXTENDED | REG_NOSUB) ) { - LOG( fname, lineno, -1, "Invalid regexp for `show_units' arg"); + report_script_issue( fname, lineno, -1, "Invalid regexp for `show_units' arg"); return CN_INTERP_PARSEERROR; } size_t cnt = 0; @@ -705,7 +698,7 @@ do_single_cmd( const char* raw, cnt++; } if ( cnt ) - Log->msg_( 0, nullptr, "------------\n%zd units total\n", cnt); + lprintf( 0, "------------\n%zd units total\n", cnt); } else if ( strcmp( cmd, cnrun_cmd[CNCMD_exec]) == 0 ) { return interpreter_run( operand, level+1, Options.interp_howstrict, @@ -714,9 +707,9 @@ do_single_cmd( const char* raw, } else if ( strcmp( cmd, cnrun_cmd[CNCMD_verbosity]) == 0 ) { if ( !operand ) - Log->msg( 0, nullptr, "verbosity level is %d", Options.verbosely); + lprintf( 0, "verbosity level is %d", Options.verbosely); else if ( sscanf( operand, "%d", &Options.verbosely) < 1 ) { - LOG( fname, lineno, -1, "Bad value for `verbosity'"); + report_script_issue( fname, lineno, -1, "Bad value for `verbosity'"); return CN_INTERP_PARSEERROR; } if ( Model ) @@ -736,7 +729,7 @@ do_single_cmd( const char* raw, operand = const_cast<char*>(".*"); regex_t RE; if ( 0 != regcomp( &RE, operand, REG_EXTENDED | REG_NOSUB) ) { - LOG( fname, lineno, -1, "Invalid regexp for `show_vars' arg"); + report_script_issue( fname, lineno, -1, "Invalid regexp for `show_vars' arg"); return CN_INTERP_PARSEERROR; } size_t cnt = 0; @@ -747,11 +740,11 @@ do_single_cmd( const char* raw, longest_id = strlen( V.name); for ( auto& V : varlist ) if ( regexec( &RE, V.name, 0, 0, 0) == 0 ) { - Log->msg( 0, nullptr, " %*s = %g", longest_id, V.name, V.value); + lprintf( 0, " %*s = %g", (int)longest_id, V.name, V.value); ++cnt; } if ( cnt > 1 ) - Log->msg_( 0, nullptr, "---------- %u variables\n", cnt); + lprintf( 0, "---------- %zu variables\n", cnt); } else if ( strcmp( cmd, cnrun_cmd[CNCMD_clear_vars]) == 0 ) { @@ -760,7 +753,7 @@ do_single_cmd( const char* raw, else { regex_t RE; if ( 0 != regcomp( &RE, operand, REG_EXTENDED | REG_NOSUB) ) { - LOG( fname, lineno, -1, "Invalid regexp for `clear_vars' arg"); + report_script_issue( fname, lineno, -1, "Invalid regexp for `clear_vars' arg"); return CN_INTERP_PARSEERROR; } for ( list<SVariable>::iterator V = varlist.begin(); V != varlist.end(); V++ ) @@ -779,7 +772,7 @@ do_single_cmd( const char* raw, if ( expr( operand, s, &varlist) ) return CN_INTERP_PARSEERROR; if ( s < 0 ) { - Log->msg( 0, nullptr, "Can't sleep backwards in time"); + lprintf( 0, "Can't sleep backwards in time"); return CN_INTERP_WARN; } printf( "(Paused for %u sec)", (unsigned int)s); fflush(stdin); @@ -792,11 +785,11 @@ do_single_cmd( const char* raw, } else { // feed it to exprparser if ( expr( raw, result, &varlist) ) { - LOG( fname, lineno, -1, "%s", expr.status_s()); + report_script_issue( fname, lineno, -1, "%s", expr.status_s()); return CN_INTERP_PARSEERROR; } if ( expr.toplevel_op != '=' ) - Log->msg( 0, nullptr, "%g", result); + lprintf( 0, "%g", result); regenerate_var_names = true; } @@ -811,6 +804,7 @@ do_single_cmd( const char* raw, int +cnrun:: interpreter_run( const char *script_fname, int level, int howstrict, bool env_import, bool env_export, list<SVariable> &varlist) { @@ -827,10 +821,10 @@ interpreter_run( const char *script_fname, int level, int howstrict, if ( script_fname && strlen(script_fname) > 0 ) { ifstream script_stream( script_fname); if ( !script_stream.good() ) { - Log->msg( -1, "CNrun", "Failed to open script file \"%s\"", script_fname); + lprintf( -1, "Failed to open script file \"%s\"", script_fname); return -1; } - Log->msg( 1, nullptr, "execing %s\n", script_fname); + lprintf( 1, "execing %s\n", script_fname); unsigned lineno = 0; string buf; diff --git a/upstream/src/cnrun/runner-main.cc b/upstream/src/cnrun/runner-main.cc index 20fb705..1d2dd2c 100644 --- a/upstream/src/cnrun/runner-main.cc +++ b/upstream/src/cnrun/runner-main.cc @@ -9,6 +9,7 @@ */ +#include <cstdarg> #include <unistd.h> #include <list> @@ -21,14 +22,26 @@ using namespace std; -using namespace Stilton; +using namespace cnrun; -CLogFacility *Log; -CModel *Model; +void +cnrun:: +lprintf( int level, const char* fmt, ...) +{ + if ( level > Options.verbosely ) { + va_list ap; + va_start (ap, fmt); + vprintf( fmt, ap); + va_end (ap); + } +} -SCNRunnerOptions Options; +CModel *cnrun::Model; + + +SCNRunnerOptions cnrun::Options; const char *ScriptFileName = ""; // CNRUN_DEFAULT_SCRIPT; @@ -47,18 +60,6 @@ static void usage( const char *argv0); #define CNRUN_ETRIALFAIL -3 -namespace { -void LOG( int vrb, const char* fmt, ...) __attribute__ ((format (printf, 2, 3))); -void LOG( int vrb, const char* fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - - Log->msgv( vrb, "CNrun", fmt, ap); - va_end (ap); -} -} - void print_version( const char* appname); @@ -69,20 +70,16 @@ main( int argc, char *argv[]) int retval = 0; - Log = new CLogFacility( nullptr, 0, Options.verbosely, 0, 0|STILTON_LOG_NOLOCK); - list<SVariable> Variables; switch ( parse_options( argc, argv, Variables) ) { case CNRUN_CLPARSE_ERROR: - LOG( -1, "Problem parsing command line or sanitising values; try -h for help"); + fprintf( stderr, "Problem parsing command line or sanitising values; try -h for help\n"); return CNRUN_EARGS; case CNRUN_CLPARSE_HELP_REQUEST: usage( argv[0]); return 0; } - Log->log_threshold = Options.verbosely; - // purely informational, requires no model if ( Options.list_units ) { cnmodel_dump_available_units(); @@ -94,7 +91,7 @@ main( int argc, char *argv[]) if ( Options.working_dir ) { pwd = getcwd( nullptr, 0); if ( chdir( Options.working_dir) ) { - LOG( -1, "Failed to cd to \"%s\"", Options.working_dir); + fprintf( stderr, "Failed to cd to \"%s\"", Options.working_dir); return CNRUN_EARGS; } } @@ -130,18 +127,18 @@ parse_options( int argc, char **argv, list<SVariable>& Variables) case 't': switch ( optarg[0] ) { case 'T': if ( sscanf( optarg+1, "%lg", &Options.integration_dt_max) != 1 ) { - LOG( -1, "-tT takes a double"); + fprintf( stderr, "-tT takes a double"); return CNRUN_CLPARSE_ERROR; } break; case 't': if ( sscanf( optarg+1, "%lg", &Options.integration_dt_min) != 1 ) { - LOG( -1, "-tt takes a double"); + fprintf( stderr, "-tt takes a double"); return CNRUN_CLPARSE_ERROR; } break; case 'x': if ( sscanf( optarg+1, "%lg", &Options.integration_dt_max_cap) != 1 ) { - LOG( -1, "-tx takes a double"); + fprintf( stderr, "-tx takes a double"); return CNRUN_CLPARSE_ERROR; } break; - default: LOG( -1, "Unrecognised option modifier for -i"); + default: fprintf( stderr, "Unrecognised option modifier for -i"); return CNRUN_CLPARSE_ERROR; } break; @@ -155,11 +152,11 @@ parse_options( int argc, char **argv, list<SVariable>& Variables) Options.log_dt = true; break; case 'E': if ( sscanf( optarg, "%g", &Options.listen_dt) != 1 ) { - LOG( -1, "-E takes a double"); + fprintf( stderr, "-E takes a double"); return CNRUN_CLPARSE_ERROR; } break; case 'g': if ( sscanf( optarg, "%u", &Options.precision) != 1 ) { - LOG( -1, "-g takes a short unsigned int"); + fprintf( stderr, "-g takes a short unsigned int"); return CNRUN_CLPARSE_ERROR; } break; @@ -171,10 +168,10 @@ parse_options( int argc, char **argv, list<SVariable>& Variables) case '0': Options.log_spikers_use_serial_id = true; break; case 'l': Options.log_spikers_use_serial_id = false; break; case 'S': if ( sscanf( optarg+1, "%g", &Options.spike_threshold) != 1 ) { - LOG( -1, "-kS takes a double"); + fprintf( stderr, "-kS takes a double"); return CNRUN_CLPARSE_ERROR; } - default: LOG( -1, "Expecting 0, l, or S<double> after -k"); + default: fprintf( stderr, "Expecting 0, l, or S<double> after -k"); return CNRUN_CLPARSE_ERROR; } break; @@ -190,7 +187,7 @@ parse_options( int argc, char **argv, list<SVariable>& Variables) double unused; CExpression expr; if ( expr( optarg, unused, &Variables) ) { - LOG( -1, "Malformed variable assignment with -D"); + fprintf( stderr, "Malformed variable assignment with -D"); return CNRUN_CLPARSE_ERROR; } } diff --git a/upstream/src/cnrun/runner.hh b/upstream/src/cnrun/runner.hh index 6fcaef6..a98488b 100644 --- a/upstream/src/cnrun/runner.hh +++ b/upstream/src/cnrun/runner.hh @@ -15,7 +15,6 @@ #include <list> #include <iostream> -#include "libstilton/log-facility.hh" #include "libstilton/exprparser.hh" #include "libcn/model.hh" @@ -25,8 +24,7 @@ # include "config.h" #endif -using namespace CNRun; -using namespace Stilton; +namespace cnrun { enum { CN_INTRP_STRICT, @@ -88,14 +86,12 @@ struct SCNRunnerOptions { extern SCNRunnerOptions Options; -extern Stilton::CLogFacility *Log; - extern CModel *Model; int interpreter_run( const char *script_fname, int level, int howstrict, - bool env_import, bool env_export, list<SVariable> &varlist); + bool env_import, bool env_export, list<cnrun::SVariable> &varlist); enum { @@ -148,8 +144,19 @@ extern bool regenerate_source_ids; char** cnrun_completion( const char *text, int start, int end); -extern list<SVariable> *current_shell_variables; +extern list<cnrun::SVariable> *current_shell_variables; + + +void lprintf( int level, const char* fmt, ...) __attribute__ ((format (printf, 2, 3))); + + +} // namespace cnrun #endif -// EOF +// Local Variables: +// Mode: c++ +// indent-tabs-mode: nil +// tab-width: 8 +// c-basic-offset: 8 +// End: diff --git a/upstream/src/libcn/hosted-neurons.cc b/upstream/src/libcn/hosted-neurons.cc index 74d0eaa..ac5445b 100644 --- a/upstream/src/libcn/hosted-neurons.cc +++ b/upstream/src/libcn/hosted-neurons.cc @@ -12,7 +12,7 @@ #include <cmath> #include <iostream> -#include "../libstilton/gcc-builtins.hh" +#include "libstilton/lang.hh" #include "param-unit-literals.hh" #include "types.hh" diff --git a/upstream/src/libcn/model-cycle.cc b/upstream/src/libcn/model-cycle.cc index 32b2098..083b27d 100644 --- a/upstream/src/libcn/model-cycle.cc +++ b/upstream/src/libcn/model-cycle.cc @@ -14,7 +14,7 @@ #include <ctime> #include <cstdlib> -#include "../libstilton/gcc-builtins.hh" +#include "libstilton/lang.hh" #include "integrate-rk65.hh" #include "model.hh" diff --git a/upstream/src/libcn/model-struct.cc b/upstream/src/libcn/model-struct.cc index 83f3703..cecf467 100644 --- a/upstream/src/libcn/model-struct.cc +++ b/upstream/src/libcn/model-struct.cc @@ -16,7 +16,7 @@ #include <regex.h> -#include "libstilton/pointaligned-s.hh" +#include "libstilton/string.hh" #include "model.hh" @@ -1386,14 +1386,14 @@ dump_units( FILE *strm) if ( *(*U)->param_sym(p) != '.' || verbosely > 5 ) fprintf( strm, "%2d: %-5s\t= %s %s\n", p, (*U)->param_sym(p), - Stilton::double_dot_aligned_s( (*U)->param_value(p), 4, 6), + cnrun::str::double_dot_aligned_s( (*U)->param_value(p), 4, 6).c_str(), (*U)->param_name(p)); fprintf( strm, "Variables: ---\n"); for ( p = 0; p < (*U)->v_no(); p++ ) if ( *(*U)->var_sym(p) != '.' || verbosely > 5 ) fprintf( strm, "%2d: %-5s\t= %s %s\n", p, (*U)->var_sym(p), - Stilton::double_dot_aligned_s( (*U)->var_value(p), 4, 6), + cnrun::str::double_dot_aligned_s( (*U)->var_value(p), 4, 6).c_str(), (*U)->var_name(p)); } fprintf( strm, "\n===== Synapses:\n"); @@ -1408,14 +1408,14 @@ dump_units( FILE *strm) if ( *(*U)->param_sym(p) != '.' || verbosely > 5 ) fprintf( strm, "%2d: %-5s\t= %s %s\n", p, (*U)->param_sym(p), - Stilton::double_dot_aligned_s( (*U)->param_value(p), 4, 6), + cnrun::str::double_dot_aligned_s( (*U)->param_value(p), 4, 6).c_str(), (*U)->param_name(p)); fprintf( strm, "Variables: ---\n"); for ( p = 0; p < (*U)->v_no(); p++ ) if ( *(*U)->var_sym(p) != '.' || verbosely > 5 ) fprintf( strm, "%2d: %-5s\t= %s %s\n", p, (*U)->var_sym(p), - Stilton::double_dot_aligned_s( (*U)->var_value(p), 4, 6), + cnrun::str::double_dot_aligned_s( (*U)->var_value(p), 4, 6).c_str(), (*U)->var_name(p)); } diff --git a/upstream/src/libcn/types.cc b/upstream/src/libcn/types.cc index 610f0fa..76c2694 100644 --- a/upstream/src/libcn/types.cc +++ b/upstream/src/libcn/types.cc @@ -15,7 +15,7 @@ #include <cstring> #include <iostream> -#include "libstilton/pointaligned-s.hh" +#include "libstilton/string.hh" #include "types.hh" @@ -480,14 +480,14 @@ cnmodel_dump_available_units() for ( p = 0; p < U.pno; p++ ) { printf( "%4zu: %-5s\t= %s %s\n", p, U.stock_param_syms[p], - Stilton::double_dot_aligned_s( U.stock_param_values[p], 4, 8), + cnrun::str::double_dot_aligned_s( U.stock_param_values[p], 4, 8).c_str(), U.stock_param_names[p]); } printf( "Variables:\n"); for ( p = 0; p < U.vno; p++ ) { printf( "%4zu: %-5s\t= %s %s\n", p, U.stock_var_syms[p], - Stilton::double_dot_aligned_s( U.stock_var_values[p], 4, 8), + cnrun::str::double_dot_aligned_s( U.stock_var_values[p], 4, 8).c_str(), U.stock_var_names[p]); } cout << endl; @@ -502,14 +502,14 @@ cnmodel_dump_available_units() for ( p = 0; p < U.pno; p++ ) { printf( "%4zu: %-5s\t= %s %s\n", p, U.stock_param_syms[p], - Stilton::double_dot_aligned_s( U.stock_param_values[p], 4, 8), + cnrun::str::double_dot_aligned_s( U.stock_param_values[p], 4, 8).c_str(), U.stock_param_names[p]); } cout << "Variables:\n"; for ( p = 0; p < U.vno; p++ ) { printf( "%4zu: %-5s\t= %s %s\n", p, U.stock_var_syms[p], - Stilton::double_dot_aligned_s( U.stock_var_values[p], 4, 8), + cnrun::str::double_dot_aligned_s( U.stock_var_values[p], 4, 8).c_str(), U.stock_var_names[p]); } cout << endl; diff --git a/upstream/src/libstilton/Makefile.am b/upstream/src/libstilton/Makefile.am index 9bff333..75f6417 100644 --- a/upstream/src/libstilton/Makefile.am +++ b/upstream/src/libstilton/Makefile.am @@ -4,13 +4,12 @@ pkglib_LTLIBRARIES = \ libstilton.la libstilton_la_SOURCES = \ + alg.hh \ + containers.hh \ + lang.hh \ exprparser.hh \ - pointaligned-s.hh \ - gcc-builtins.hh \ - log-facility.hh \ exprparser.cc \ - pointaligned-s.cc \ - log-facility.cc + libcommon.cc libstilton_la_LDFLAGS = \ -avoid-version \ @@ -19,10 +18,10 @@ libstilton_la_LDFLAGS = \ if DO_PCH BUILT_SOURCES = \ - exprparser.hh.gch \ - pointaligned-s.hh.gch \ - gcc-builtins.hh.gch \ - log-facility.hh.gch + alg.hh.gch \ + containers.hh.gch \ + lang.hh.gch \ + exprparser.hh.gch CLEANFILES = $(BUILT_SOURCES) endif diff --git a/upstream/src/libstilton/alg.hh b/upstream/src/libstilton/alg.hh new file mode 100644 index 0000000..f24cba2 --- /dev/null +++ b/upstream/src/libstilton/alg.hh @@ -0,0 +1,103 @@ +/* + * File name: libstilton/alg.hh + * Project: cnrun + * Author: Andrei Zavada <[email protected]> + * Initial version: 2014-03-23 + * + * Purpose: misc supporting algorithms + * + * License: GPL + */ + +#ifndef _CNRUN_LIBSTILTON_ALG_H +#define _CNRUN_LIBSTILTON_ALG_H + + +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + +using namespace std; + +namespace cnrun { +namespace alg { + +/// uncomment on demand + +// template <typename T> +// inline void +// __attribute__ ((pure)) +// pod_swap( T&& a, T&& b) +// { +// T&& tmp = move(a); +// a = move(b); +// b = move(tmp); +// } + + + +template <typename T> +inline bool +__attribute__ ((pure)) +overlap( const T& a, const T& b, + const T& c, const T& d) +{ + return not ((a < c && b < c) || (a > d && b > d)); +} + +template <typename T> +inline bool +__attribute__ ((pure)) +between( const T& a, const T& b, const T&c) +{ + return a <= b && b <= c; +} + + + +template <typename T> +int +__attribute__ ((pure)) +sign( T x) +{ + return (x > 0) ? 1 : (x == 0) ? 0 : -1; +} + + +template <typename T> +void +__attribute__ ((pure)) +ensure_within( T& v, const T& l, const T& h) +{ + if ( v < l ) + v = l; + else if ( v > h ) + v = h; +} + +template <typename T> +T +__attribute__ ((pure)) +value_within( const T& v, const T& l, const T& h) +{ + T o {v}; + if ( v < l ) + o = l; + else if ( v > h ) + o = h; + return o; +} + +// for more, check this file in Aghermann + +} // namespace alg +} // namespace cnrun + +#endif + +// Local Variables: +// Mode: c++ +// indent-tabs-mode: nil +// tab-width: 8 +// c-basic-offset: 8 +// End: diff --git a/upstream/src/libstilton/containers.hh b/upstream/src/libstilton/containers.hh new file mode 100644 index 0000000..eb3bfb6 --- /dev/null +++ b/upstream/src/libstilton/containers.hh @@ -0,0 +1,67 @@ +/* + * File name: libstilton/containers.hh + * Project: cnrun + * Author: Andrei Zavada <[email protected]> + * Initial version: 2014-03-23 + * + * Purpose: misc supporting algorithms (containers, Erlangish aliases) + * + * License: GPL + */ + +#ifndef _CNRUN_LIBSTILTON_CONTAINERS_H +#define _CNRUN_LIBSTILTON_CONTAINERS_H + +#include <list> +#include <forward_list> +#include <vector> +#include <map> + +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + +using namespace std; + +namespace cnrun { +namespace alg { + +template <typename T> +bool +member( const T& x, const list<T>& v) +{ + return any( v.begin(), v.end(), x); +} + +template <typename T> +bool +member( const T& x, const forward_list<T>& v) +{ + return any( v.begin(), v.end(), x); +} + +template <typename T> +bool +member( const T& x, const vector<T>& v) +{ + return any( v.begin(), v.end(), x); +} + +template <typename K, typename V> +bool +member( const K& x, const map<K, V>& m) +{ + return m.find(x) != m.end(); +} + +} // namespace alg +} // namespace cnrun + +#endif + +// Local Variables: +// Mode: c++ +// indent-tabs-mode: nil +// tab-width: 8 +// c-basic-offset: 8 +// End: diff --git a/upstream/src/libstilton/exprparser.cc b/upstream/src/libstilton/exprparser.cc index 1d8f051..fc7d9f6 100644 --- a/upstream/src/libstilton/exprparser.cc +++ b/upstream/src/libstilton/exprparser.cc @@ -24,7 +24,7 @@ using namespace std; -const char* const Stilton::__exparse_error_strings[] = { +const char* const cnrun::__exparse_error_strings[] = { "", "Missing operand", "Unbalanced parentheses", @@ -84,8 +84,8 @@ array<SOp, n_ops> Ops = { -Stilton::TExprParserError -Stilton::CExpression:: +cnrun::TExprParserError +cnrun::CExpression:: _do_parse( const char *str, double& parsed, list<SVariable> *varlist) { if ( !str ) { diff --git a/upstream/src/libstilton/exprparser.hh b/upstream/src/libstilton/exprparser.hh index e89d4c2..9620d88 100644 --- a/upstream/src/libstilton/exprparser.hh +++ b/upstream/src/libstilton/exprparser.hh @@ -20,10 +20,9 @@ # include "config.h" #endif -namespace Stilton { +namespace cnrun { using namespace std; -using namespace Stilton; enum TExprParserError { diff --git a/upstream/src/libstilton/gcc-builtins.hh b/upstream/src/libstilton/gcc-builtins.hh deleted file mode 100644 index c5e1143..0000000 --- a/upstream/src/libstilton/gcc-builtins.hh +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Author: Andrei Zavada <[email protected]> - * - * License: GPL-2+ - * - * Initial version: 2008-11-18 - * - */ - -#ifndef CNAUX_GCC_BUILTINS_H -#define CNAUX_GCC_BUILTINS_H - -#if __GNUC__ >= 3 -//# define inline inline __attribute__ ((always_inline)) -// # define __pure __attribute__ ((pure)) -// # define __const __attribute__ ((const)) -// # define __noreturn __attribute__ ((noreturn)) -// # define __malloc __attribute__ ((malloc)) -// # define __must_check __attribute__ ((warn_unused_result)) -// # define __deprecated __attribute__ ((deprecated)) -// # define __used __attribute__ ((used)) -// # define __unused __attribute__ ((unused)) -// # define __packed __attribute__ ((packed)) -# define likely(x) __builtin_expect (!!(x), 1) -# define unlikely(x) __builtin_expect (!!(x), 0) -#else -// # define inline /* no inline */ -// # define __pure /* no pure */ -// # define __const /* no const */ -// # define __noreturn /* no noreturn */ -// # define __malloc /* no malloc */ -// # define __must_check /* no warn_unused_result */ -// # define __deprecated /* no deprecated */ -// # define __used /* no used */ -// # define __unused /* no unused */ -// # define __packed /* no packed */ -# define likely(x) (x) -# define unlikely(x) (x) -#endif - -#endif - -// EOF diff --git a/upstream/src/libstilton/lang.hh b/upstream/src/libstilton/lang.hh new file mode 100644 index 0000000..eb941ec --- /dev/null +++ b/upstream/src/libstilton/lang.hh @@ -0,0 +1,87 @@ +/* + * File name: libstilton/lang.hh + * Project: cnrun + * Author: Andrei Zavada <[email protected]> + * Initial version: 2014-03-23 + * + * Purpose: language and gcc macros + * + * License: GPL + */ + +#ifndef _CNRUN_LIBSTILTON_LANG_H +#define _CNRUN_LIBSTILTON_LANG_H + +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + +#include <cfloat> +#include <cmath> +#include <unistd.h> +#include <stdio.h> + +using namespace std; + +namespace agh { + +// for functions to suppress some possibly benign exceptions: +enum class TThrowOption { + do_throw, + no_throw, +}; + +typedef unsigned long hash_t; + +inline int dbl_cmp( double x, double y) __attribute__ ((pure)); +inline int dbl_cmp( double x, double y) // optional precision maybe? +{ + if ( fabs(x - y) > DBL_EPSILON ) + return (x > y) ? 1 : -1; + else + return 0; +} + + +// g++ bits + +#define MAKE_UNIQUE_CHARP(p) \ + unique_ptr<void,void(*)(void*)> p##_pp(p,free); + + +#define DELETE_DEFAULT_METHODS(T) \ + T () = delete; \ + T (const T&) = delete; \ + void operator=( const T&) = delete; + + + + +// gcc bits + +// # define __pure __attribute__ ((pure)) +// # define __const __attribute__ ((const)) +// # define __noreturn __attribute__ ((noreturn)) +// # define __malloc __attribute__ ((malloc)) +// # define __must_check __attribute__ ((warn_unused_result)) +// # define __deprecated __attribute__ ((deprecated)) +// # define __used __attribute__ ((used)) +// # define __unused __attribute__ ((unused)) +// # define __packed __attribute__ ((packed)) +#define likely(x) __builtin_expect (!!(x), 1) +#define unlikely(x) __builtin_expect (!!(x), 0) + + +#define FABUF printf( __FILE__ ":%d (%s): %s\n", __LINE__, __FUNCTION__, __buf__); +#define FAFA printf( __FILE__ ":%d (%s): fafa\n", __LINE__, __FUNCTION__); + +} // namespace agh + +#endif + +// Local Variables: +// Mode: c++ +// indent-tabs-mode: nil +// tab-width: 8 +// c-basic-offset: 8 +// End: diff --git a/upstream/src/libstilton/libcommon.cc b/upstream/src/libstilton/libcommon.cc new file mode 100644 index 0000000..d1344b5 --- /dev/null +++ b/upstream/src/libstilton/libcommon.cc @@ -0,0 +1,303 @@ +/* + * File name: libstilton/libcommon.cc + * Project: cnrun + * Author: Andrei Zavada <[email protected]> + * Initial version: 2014-03-23 + * + * Purpose: sundry bits too big for inlining + * + * License: GPL + */ + + +#include <cmath> +#include <cstring> +#include <string> +#include <list> + +#include <stdarg.h> +#include <unistd.h> +#include <errno.h> + +#include "string.hh" +#include "alg.hh" + + +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + +using namespace std; + + +string +cnrun::str:: +svasprintf( const char* fmt, va_list ap) +{ + char *_; + if (vasprintf( &_, fmt, ap) <= 0) + abort(); + string ret {_}; + free( (void*)_); + return move(ret); +} + + + +string +cnrun::str:: +sasprintf( const char* fmt, ...) +{ + char *_; + va_list ap; + va_start (ap, fmt); + if (vasprintf( &_, fmt, ap) <= 0) + abort(); + va_end (ap); + + string ret {_}; + free( (void*)_); + return move(ret); +} + + + +string +cnrun::str:: +trim( const string& r0) +{ + string r (r0); + auto rsize = r.size(); + if ( rsize == 0 ) + return r; + while ( rsize > 0 && r[rsize-1] == ' ' ) + --rsize; + r.resize( rsize); + r.erase( 0, r.find_first_not_of(" \t")); + return move(r); +} + +string +cnrun::str:: +pad( const string& r0, size_t to) +{ + string r (to, ' '); + memcpy( (void*)r.data(), (const void*)r0.data(), min( to, r0.size())); + return move(r); +} + + + +list<string> +cnrun::str:: +tokens_trimmed( const string& s_, const char* sep) +{ + string s {s_}; + list<string> acc; + char *pp, + *p = strtok_r( &s[0], sep, &pp); + while ( p ) { + acc.emplace_back( trim(p)); + p = strtok_r( NULL, sep, &pp); + } + return move(acc); +} + +list<string> +cnrun::str:: +tokens( const string& s_, const char* sep) +{ + string s {s_}; + list<string> acc; + char *pp, + *p = strtok_r( &s[0], sep, &pp); + while ( p ) { + acc.emplace_back( p); + p = strtok_r( NULL, sep, &pp); + } + return move(acc); +} + + + + +void +cnrun::str:: +decompose_double( double value, double *mantissa, int *exponent) +{ + char buf[32]; + snprintf( buf, 31, "%e", value); + *strchr( buf, 'e') = '|'; + sscanf( buf, "%lf|%d", mantissa, exponent); +} + + + + +string& +cnrun::str:: +homedir2tilda( string& inplace) +{ + const char *home = getenv("HOME"); + if ( home ) + if ( inplace.compare( 0, strlen(home), home) == 0 ) + inplace.replace( 0, strlen(home), "~"); + return inplace; +} + +string +cnrun::str:: +homedir2tilda( const string& v) +{ + string inplace (v); + const char *home = getenv("HOME"); + if ( home ) + if ( inplace.compare( 0, strlen(home), home) == 0 ) + inplace.replace( 0, strlen(home), "~"); + return inplace; +} + +string& +cnrun::str:: +tilda2homedir( string& inplace) +{ + const char *home = getenv("HOME"); + if ( home ) { + size_t at; + while ( (at = inplace.find( '~')) < inplace.size() ) + inplace.replace( at, 1, home); + } + return inplace; +} + +string +cnrun::str:: +tilda2homedir( const string& v) +{ + string inplace (v); + const char *home = getenv("HOME"); + if ( home ) { + size_t at; + while ( (at = inplace.find( '~')) < inplace.size() ) + inplace.replace( at, 1, home); + } + return inplace; +} + + + +string +cnrun::str:: +dhms( double seconds, int dd) +{ + bool positive = seconds >= 0.; + if ( not positive ) + seconds = -seconds; + + int s = (int)seconds % 60, + m = (int)seconds/60 % 60, + h = (int)seconds/60/60 % (60*60), + d = (int)seconds/60/60/24 % (60*60*24); + double f = seconds - floor(seconds); + + using cnrun::str::sasprintf; + string f_ = ( dd == 0 ) + ? "" + : sasprintf( ".%0*d", dd, (int)(f*pow(10, dd))); + return ( d > 0 ) + ? sasprintf( "%dd %dh %dm %d%ss", d, h, m, s, f_.c_str()) + : ( h > 0 ) + ? sasprintf( "%dh %dm %d%ss", h, m, s, f_.c_str()) + : ( m > 0 ) + ? sasprintf( "%dm %d%ss", m, s, f_.c_str()) + : sasprintf( "%d%ss", s, f_.c_str()); +} + +string +cnrun::str:: +dhms_colon( double seconds, int dd) +{ + bool positive = seconds >= 0.; + if ( not positive ) + seconds = -seconds; + + int s = (int)seconds % 60, + m = (int)seconds/60 % 60, + h = (int)seconds/60/60 % (60*60), + d = (int)seconds/60/60/24 % (60*60*24); + double f = seconds - floor(seconds); + + using cnrun::str::sasprintf; + string f_ = ( dd == 0 ) + ? "" + : sasprintf( ".%0*d", dd, (int)(f*pow(10, dd))); + + return sasprintf( "%dd %02d:%02d:%02d%ss", d, h, m, s, f_.c_str()); +} + + + + + +inline namespace { +int +n_frac_digits( double v) +{ + int d = 0; + double dummy; + while ( fabs( modf( v, &dummy)) > 1e-6 ) { + v *= 10.; + ++d; + } + return d; +} +} + +string +cnrun::str:: +double_dot_aligned_s( double val, int int_width, int frac_width) +{ + char buf[40]; + + if ( int_width + frac_width > 39 ) + int_width = 8, frac_width = 8; + + val = round(val * pow(10.,frac_width)) / pow(10.,frac_width); + + double intval; + double fracval = modf( val, &intval); + int frac_digits = n_frac_digits( val); + int frac_pad = frac_width - frac_digits; + if ( frac_pad < 1 ) + frac_pad = 1; + + if ( frac_digits ) + if ( (int)intval ) + snprintf( buf, 40, "% *d.%0*ld%*s", + int_width, int(intval), + frac_digits, (long)round(pow(10., frac_digits) * fabs( fracval)), + frac_pad, " "); + else + snprintf( buf, 40, "%*s.%0*ld%*s", + int_width, " ", + frac_digits, (long)round(pow(10., frac_digits) * fabs( fracval)), + frac_pad, " "); + + else + if ( (int)intval ) + snprintf( buf, 40, "%*d.%-*s", + int_width, int(intval), frac_width, " "); + else + snprintf( buf, 40, "%-*s0%-*s", + int_width, " ", frac_width, " "); + + return {buf}; +} + + +// Local Variables: +// Mode: c++ +// indent-tabs-mode: nil +// tab-width: 8 +// c-basic-offset: 8 +// End: diff --git a/upstream/src/libstilton/log-facility.cc b/upstream/src/libstilton/log-facility.cc deleted file mode 100644 index 7b9cce2..0000000 --- a/upstream/src/libstilton/log-facility.cc +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Author: Andrei Zavada <[email protected]> - * - * License: GPL-2+ - * - * Initial version: 2009-06-28 - * - */ - -#include <sys/time.h> -#include <cstdarg> -#include <cstring> -#include <cmath> -#include <fstream> - -#include "log-facility.hh" - -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - -using namespace std; - - -Stilton::CLogFacility:: -CLogFacility( const char *log_fname, - int inlog_threshold, - int instdout_tee_threshold, - unsigned short insec_dec_place, - int bits, - size_t buf_size) - : status (bits), - log_threshold (inlog_threshold), - stdout_tee_threshold (instdout_tee_threshold), - sec_dec_places (insec_dec_place) -{ - _line_buf = new char[_buf_size = buf_size]; - if ( log_fname && strlen(log_fname) ) { - _log_fname = string(log_fname); - _log_strm.open( log_fname); - unitbuf( _log_strm); - } -} - -Stilton::CLogFacility:: -~CLogFacility() -{ - if ( _log_fname.size() ) - _log_strm.close(); - delete[] _line_buf; -} - - -void -Stilton::CLogFacility:: -msg( int vrb, const char *client_name, const char* fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - msgv( vrb, client_name, fmt, ap); - va_end (ap); -} - - -void -Stilton::CLogFacility:: -msgv( int vrb, const char *client_name, const char* fmt, va_list ap) -{ -// if ( status & STILTON_LOG_NOLOCK ) -// boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> L( _log_lock); - - if ( log_threshold < vrb && stdout_tee_threshold < vrb ) - return; - - char timestampbuf[32]; - time_t timestamp; time( ×tamp); - struct timeval tp; gettimeofday( &tp, nullptr); - strftime( timestampbuf, 31, "%F %T", localtime( ×tamp)); - char secfracbuf[sec_dec_places+3]; - snprintf( secfracbuf, sec_dec_places+2, ".%0*u", sec_dec_places, - (unsigned)round( tp.tv_usec / pow( 10., 6-sec_dec_places-1))); - - vsnprintf( _line_buf, _buf_size, fmt, ap); - - char *line = strtok( _line_buf, "\n"); - do { - if ( vrb < 0 ) - printf( "%s%sError: %s\n", client_name ? client_name : "", (client_name && strlen(client_name)) ? ": " : "", line); - else if ( stdout_tee_threshold >= vrb ) - printf( "%s%s%s\n", client_name ? client_name : "", (client_name && strlen(client_name)) ? ": " : "", line); - - if ( log_threshold >= vrb && _log_fname.size() ) - _log_strm << timestampbuf << (sec_dec_places > 0 ? secfracbuf : "") << ' ' - << client_name << ": " - << (vrb < 0 ? "Error: " : "") << line << endl; - } while ( (line = strtok( nullptr, "\n")) ); - - if ( _log_fname.size() ) - _log_strm.flush(); -} - - - -// a one-liner, possibly unterminated by \n -void -Stilton::CLogFacility:: -msg_( int vrb, const char *client_name, const char* fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - msgv_( vrb, client_name, fmt, ap); - va_end (ap); -} - -void -Stilton::CLogFacility:: -msgv_( int vrb, const char *client_name, const char* fmt, va_list ap) -{ -// if ( status & STILTON_LOG_NOLOCK ) -// boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> L( _log_lock); - - if ( log_threshold < vrb && stdout_tee_threshold < vrb ) - return; - - char timestampbuf[32]; - time_t timestamp; time( ×tamp); - struct timeval tp; gettimeofday( &tp, nullptr); - strftime( timestampbuf, 31, "%F %T", localtime( ×tamp)); - char secfracbuf[sec_dec_places+3]; - snprintf( secfracbuf, sec_dec_places+2, ".%0*u", sec_dec_places, - (unsigned)round( tp.tv_usec / pow( 10., 6-sec_dec_places-1))); - - vsnprintf( _line_buf, _buf_size, fmt, ap); - - if ( vrb < 0 ) - printf( "%s%sError: %s", client_name ? client_name : "", (client_name && strlen(client_name)) ? ": " : "", _line_buf); - else if ( stdout_tee_threshold >= vrb ) - printf( "%s%s%s", client_name ? client_name : "", (client_name && strlen(client_name)) ? ": " : "", _line_buf); - - if ( log_threshold >= vrb && _log_fname.size() ) - _log_strm << timestampbuf << (sec_dec_places > 0 ? secfracbuf : "") << ' ' - << client_name << ": " - << (vrb < 0 ? "Error: " : "") << _line_buf << endl; -} - - -// eof diff --git a/upstream/src/libstilton/log-facility.hh b/upstream/src/libstilton/log-facility.hh deleted file mode 100644 index 6bd4b5b..0000000 --- a/upstream/src/libstilton/log-facility.hh +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Author: Andrei Zavada <[email protected]> - * - * License: GPL-2+ - * - * Initial version: 2009-06-28 - * - */ - -#ifndef STILTON_LOG_FACILITY_H -#define STILTON_LOG_FACILITY_H - -#include <cstdarg> -#include <fstream> - -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - - -namespace Stilton { - -using namespace std; -using namespace Stilton; - - -// bitwise OR this with CLogFacility::status to prevent locking even if supported -#define STILTON_LOG_NOLOCK 1 - -class CLogFacility { - - public: - CLogFacility( const char *log_fname, - int log_threshold = 4, - int stdout_tee_threshold = 2, - unsigned short sec_dec_places = 2, - int bits = 0, - size_t buf_size = 2048); - - int status; - - int log_threshold, - stdout_tee_threshold; - unsigned short - sec_dec_places; - // full-featured; always terminating lines with a \n - void msg( int vrb, const char *client_name, const char* fmt, ...); - void msgv( int vrb, const char *client_name, const char* fmt, va_list); - // raw output: no parsing, not timestamping each line - void msg_( int vrb, const char *client_name, const char* fmt, ...); - void msgv_( int vrb, const char *client_name, const char* fmt, va_list); - - const char *log_fname() const - { return _log_fname.c_str(); } - size_t buf_size() const - { return _buf_size; } - - ~CLogFacility(); - - private: - string _log_fname; - size_t _buf_size; - ofstream - _log_strm; - char - *_line_buf; -// boost::interprocess::interprocess_mutex -// _log_lock; -}; - - -} - -#endif - -// EOF diff --git a/upstream/src/libstilton/pointaligned-s.cc b/upstream/src/libstilton/pointaligned-s.cc deleted file mode 100644 index 482f633..0000000 --- a/upstream/src/libstilton/pointaligned-s.cc +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Author: Andrei Zavada <[email protected]> - * - * License: GPL-2+ - * - * Initial version: 2008-11-18 - * - */ - -#include <cmath> -#include <cfloat> -#include <cstdio> - -#include "pointaligned-s.hh" - -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - -using namespace std; - -inline namespace { -int -n_frac_digits( double v) -{ - int d = 0; - double dummy; - while ( fabs( modf( v, &dummy)) > 1e-6 ) { - v *= 10.; ++d; - } - return d; -} -} // inline namespace - -const char* -Stilton:: -double_dot_aligned_s( double val, int int_width, int frac_width) -{ - static char buf[40]; - - if ( int_width + frac_width > 39 ) - int_width = 8, frac_width = 8; - - val = round(val * pow(10.,frac_width)) / pow(10.,frac_width); - - double intval; - double fracval = modf( val, &intval); - int frac_digits = n_frac_digits( val); - int frac_pad = frac_width - frac_digits; - if ( frac_pad < 1 ) - frac_pad = 1; - - if ( frac_digits ) - if ( (int)intval ) - snprintf( buf, 40, "% *d.%0*ld%*s", - int_width, int(intval), - frac_digits, (long)round(pow(10., frac_digits) * fabs( fracval)), - frac_pad, " "); - else - snprintf( buf, 40, "%*s.%0*ld%*s", - int_width, " ", - frac_digits, (long)round(pow(10., frac_digits) * fabs( fracval)), - frac_pad, " "); - - else - if ( (int)intval ) - snprintf( buf, 40, "%*d.%-*s", - int_width, int(intval), frac_width, " "); - else -// snprintf( buf, 40, "% *d.%-*d", - snprintf( buf, 40, "%-*s0%-*s", - int_width, " ", frac_width, " "); - - return buf; - -} - - -// eof diff --git a/upstream/src/libstilton/pointaligned-s.hh b/upstream/src/libstilton/pointaligned-s.hh deleted file mode 100644 index a9e9d72..0000000 --- a/upstream/src/libstilton/pointaligned-s.hh +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Author: Andrei Zavada <[email protected]> - * - * License: GPL-2+ - * - * Initial version: 2009-05-01 - * - */ - -#ifndef CNAUX_POINTALIGN_H -#define CNAUX_POINTALIGN_H - -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - -namespace Stilton { - -const char* -double_dot_aligned_s( double val, int int_width = 8, int frac_width = 8); - -} - -#endif - -// EOF diff --git a/upstream/src/libstilton/string.hh b/upstream/src/libstilton/string.hh new file mode 100644 index 0000000..38e6bca --- /dev/null +++ b/upstream/src/libstilton/string.hh @@ -0,0 +1,118 @@ +/* + * File name: libstilton/string.hh + * Project: cnrun + * Author: Andrei Zavada <[email protected]> + * Initial version: 2014-03-23 + * + * Purpose: strings ops + * + * License: GPL + */ + +#ifndef _CNRUN_LIBSTILTON_STRING_H +#define _CNRUN_LIBSTILTON_STRING_H + +#include <cstdarg> +#include <cstring> +#include <string> +#include <list> +#include <sstream> + +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + +using namespace std; + +namespace cnrun { +namespace str { + +enum class TStrCmpCaseOption { + sensitive, insensitive +}; + +string sasprintf( const char* fmt, ...) __attribute__ ((format (printf, 1, 2))); +string svasprintf( const char* fmt, va_list aaa); + +string trim( const string& r0); +string pad( const string& r0, size_t to); + +template <typename C> +string +join( const C& l, const char* sep) +{ + if ( l.empty() ) + return ""; + ostringstream recv; + auto I = l.begin(); + for ( ; next(I) != l.end(); ++I ) + recv << *I << sep; + recv << *I; + return recv.str(); +} + +list<string> tokens( const string&, const char* sep); + +inline +list<string> +tokens( const string& s_, char c) +{ + char sep[2] = {c, '\0'}; + return move(tokens( s_, sep)); +} + +list<string> tokens_trimmed( const string& s_, const char* sep); + +inline +list<string> +tokens_trimmed( const string& s_, char c) +{ + char sep[2] = {c, '\0'}; + return move(tokens_trimmed( s_, sep)); +} + + + +inline +bool +has_suffix( const string& s, const string& suffix, + TStrCmpCaseOption case_option = TStrCmpCaseOption::sensitive) +{ + return suffix.size() <= s.size() and + 0 == (case_option == TStrCmpCaseOption::sensitive ? strcmp : strcasecmp)( + &s[s.size()-suffix.size()], &suffix[0]); +} + +void decompose_double( double value, double *mantissa, int *exponent); + + + +string& homedir2tilda( string& inplace); +string homedir2tilda( const string&); +string& tilda2homedir( string& inplace); +string tilda2homedir( const string&); + +string dhms( double seconds, int decimal_digits = 0) __attribute__ ((pure)); +string dhms_colon( double seconds, int decimal_digits = 0) __attribute__ ((pure)); + + +// unicode/wcs; uncomment on demand +// wstring to_wstring( const string&, const char* charset = "UTF-8"); +// string from_wstring( const wstring&, const char* charset = "UTF-8"); + + +string +double_dot_aligned_s( double val, int int_width = 8, int frac_width = 8); + + +} +} + +#endif + +// Local Variables: +// Mode: c++ +// indent-tabs-mode: nil +// tab-width: 8 +// c-basic-offset: 8 +// End: -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/cnrun.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
