From d931bd4e1874c905ac07816512e86f8cfff2acd8 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 25 Aug 2019 08:58:19 +0100 Subject: [PATCH] Move unnecessary global and file static variables to the stack --- dummy/dummy.h | 2 ++ include/hamlib/rig.h | 22 -------------------- tests/Makefile.am | 1 + tests/rigctl.c | 22 +++++++++++--------- tests/rigctl_parse.c | 48 ++++++++++++++++++++++++++------------------ tests/rigctl_parse.h | 4 +++- tests/rigctlcom.c | 18 ----------------- tests/rigctld.c | 15 +++++++------- tests/rotctl.c | 16 +++++++-------- tests/rotctl_parse.c | 45 +++++++++++++++++++++++------------------ tests/rotctl_parse.h | 4 +++- tests/rotctld.c | 14 ++++++------- 12 files changed, 98 insertions(+), 113 deletions(-) diff --git a/dummy/dummy.h b/dummy/dummy.h index 99cf0c276..1afed1130 100644 --- a/dummy/dummy.h +++ b/dummy/dummy.h @@ -43,4 +43,6 @@ extern const struct rig_caps netrigctl_caps; extern const struct rig_caps flrig_caps; extern const struct rig_caps trxmanager_caps; +int netrigctl_get_vfo_mode(RIG *); + #endif /* _DUMMY_H */ diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 6b5bbf992..fa651b603 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -57,28 +57,6 @@ # define __END_DECLS /* empty */ #endif -#ifndef thread_local -# if __STDC_VERSION__ >= 201112 && !defined __STDC_NO_THREADS__ -# define thread_local _Thread_local -# elif defined _WIN32 && ( \ - defined _MSC_VER || \ - defined __ICL || \ - defined __DMC__ || \ - defined __BORLANDC__ ) -# define thread_local __declspec(thread) -/* note that ICC (linux) and Clang are covered by __GNUC__ */ -# elif defined __GNUC__ || \ - defined __SUNPRO_C || \ - defined __xlC__ -# define thread_local __thread -# else -# pragma warning "Please see if you can find a thread_local definition for this compiler" -# pragma warning "You can comment out the error after this line but rigctld will not be thread safe for vfo_mode and ext_resp and will require up to 4 rigctld's for the 4 possible combinations of vfo_mode and ext_resp" -# pragma error "Cannot define thread_local" -# define thread_local -# endif -#endif - /* HAMLIB_PARAMS is a macro used to wrap function prototypes, so that compilers * that don't understand ANSI C prototypes still work, and ANSI C * compilers can issue warnings about type mismatches. */ diff --git a/tests/Makefile.am b/tests/Makefile.am index b4ab7301c..0028d8ee9 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -25,6 +25,7 @@ rigswr_SOURCES = rigswr.c rigsmtr_SOURCES = rigsmtr.c rigmem_SOURCES = rigmem.c memsave.c memload.c memcsv.c sprintflst.c sprintflst.h +rigctl_CPPFLAGS = -I$(top_srcdir) $(AM_CPPFLAGS) # all the programs need this LDADD = $(top_builddir)/src/libhamlib.la $(top_builddir)/lib/libmisc.la diff --git a/tests/rigctl.c b/tests/rigctl.c index a10106f25..ecce5d21a 100644 --- a/tests/rigctl.c +++ b/tests/rigctl.c @@ -71,15 +71,14 @@ extern int read_history(); #include "iofunc.h" #include "serial.h" #include "sprintflst.h" - +#include "dummy/dummy.h" #include "rigctl_parse.h" #define MAXNAMSIZ 32 #define MAXNBOPT 100 /* max number of different options */ -void usage(void); -extern int netrigctl_get_vfo_mode(RIG *rig); +static void usage(void); /* * Reminder: when adding long options, @@ -114,6 +113,7 @@ static struct option long_options[] = {"help", 0, 0, 'h'}, {"version", 0, 0, 'V'}, {0, 0, 0, 0} + }; #define MAXCONFLEN 128 @@ -124,12 +124,6 @@ static const int have_rl = 1; #endif -thread_local int interactive = 1; /* if no cmd on command line, switch to interactive */ -thread_local int prompt = 1; /* Print prompt in rigctl */ -thread_local int vfo_mode = 0; /* vfo_mode = 0 means target VFO is 'currVFO' */ - -thread_local char send_cmd_term = '\r'; /* send_cmd termination char */ - int main(int argc, char *argv[]) { RIG *my_rig; /* handle to rig (instance) */ @@ -157,6 +151,12 @@ int main(int argc, char *argv[]) int serial_rate = 0; char *civaddr = NULL; /* NULL means no need to set conf */ char conf_parms[MAXCONFLEN] = ""; + int interactive = 1; /* if no cmd on command line, switch to interactive */ + int prompt = 1; /* Print prompt in rigctl */ + int vfo_mode = 0; /* vfo_mode = 0 means target VFO is 'currVFO' */ + char send_cmd_term = '\r'; /* send_cmd termination char */ + int ext_resp = 0; + char resp_sep = '\n'; while (1) { @@ -597,7 +597,9 @@ int main(int argc, char *argv[]) do { - retcode = rigctl_parse(my_rig, stdin, stdout, argv, argc, NULL); + retcode = rigctl_parse(my_rig, stdin, stdout, argv, argc, NULL, + interactive, prompt, vfo_mode, send_cmd_term, + &ext_resp, &resp_sep); if (retcode == 2) { diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 9bc65f10e..61c19abf0 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -135,6 +135,11 @@ struct test_table FILE *, FILE *, int, + int, + int, + char, + int, + char, const struct test_table *, vfo_t, const char *, @@ -155,6 +160,11 @@ struct test_table FILE *fout, \ FILE *fin, \ int interactive, \ + int prompt, \ + int vfo_mode, \ + char send_cmd_term, \ + int ext_resp, \ + char resp_sep, \ const struct test_table *cmd, \ vfo_t vfo, \ const char *arg1, \ @@ -587,14 +597,9 @@ static int next_word(char *buffer, int argc, char *argv[], int newline) }) -extern thread_local int interactive; -extern thread_local int prompt; -extern thread_local int vfo_mode; -extern thread_local char send_cmd_term; -thread_local int ext_resp = 0; -thread_local unsigned char resp_sep = '\n'; /* Default response separator */ - -int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, sync_cb_t sync_cb) +int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, sync_cb_t sync_cb, + int interactive, int prompt, int vfo_mode, char send_cmd_term, + int * ext_resp_ptr, char * resp_sep_ptr) { int retcode; /* generic return code from functions */ unsigned char cmd; @@ -629,7 +634,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, syn */ if (cmd == '+' && !prompt) { - ext_resp = 1; + *ext_resp_ptr = 1; if (scanfc(fin, "%c", &cmd) < 1) { @@ -648,8 +653,8 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, syn && !prompt) { - ext_resp = 1; - resp_sep = cmd; + *ext_resp_ptr = 1; + *resp_sep_ptr = cmd; if (scanfc(fin, "%c", &cmd) < 1) { @@ -1525,7 +1530,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, syn * Extended Response protocol: output received command name and arguments * response. Don't send command header on '\chk_vfo' command. */ - if (interactive && ext_resp && !prompt && cmd != 0xf0) + if (interactive && *ext_resp_ptr && !prompt && cmd != 0xf0) { char a1[MAXARGSZ + 2]; char a2[MAXARGSZ + 2]; @@ -1548,13 +1553,18 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, syn a1, a2, a3, - resp_sep); + *resp_sep_ptr); } retcode = (*cmd_entry->rig_routine)(my_rig, fout, fin, interactive, + prompt, + vfo_mode, + send_cmd_term, + *ext_resp_ptr, + *resp_sep_ptr, cmd_entry, vfo, p1, @@ -1570,8 +1580,8 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, syn if (interactive && !prompt) { fprintf(fout, NETRIGCTL_RET "%d\n", retcode); - ext_resp = 0; - resp_sep = '\n'; + *ext_resp_ptr = 0; + *resp_sep_ptr = '\n'; } else { @@ -1588,17 +1598,17 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, syn { /* netrigctl RIG_OK */ if (!(cmd_entry->flags & ARG_OUT) - && !ext_resp && cmd != 0xf0) + && !*ext_resp_ptr && cmd != 0xf0) { fprintf(fout, NETRIGCTL_RET "0\n"); } /* Extended Response protocol */ - else if (ext_resp && cmd != 0xf0) + else if (*ext_resp_ptr && cmd != 0xf0) { fprintf(fout, NETRIGCTL_RET "0\n"); - ext_resp = 0; - resp_sep = '\n'; + *ext_resp_ptr = 0; + *resp_sep_ptr = '\n'; } } } diff --git a/tests/rigctl_parse.h b/tests/rigctl_parse.h index dfe2a0669..7a74f4959 100644 --- a/tests/rigctl_parse.h +++ b/tests/rigctl_parse.h @@ -46,6 +46,8 @@ int print_conf_list(const struct confparams *cfp, rig_ptr_t data); int set_conf(RIG *my_rig, char *conf_parms); typedef void (*sync_cb_t)(int); -int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, sync_cb_t sync_cb); +int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, sync_cb_t sync_cb, + int interactive, int prompt, int vfo_mode, char send_cmd_term, + int * ext_resp_ptr, char * resp_sep_ptr); #endif /* RIGCTL_PARSE_H */ diff --git a/tests/rigctlcom.c b/tests/rigctlcom.c index 781605e19..96e74a682 100644 --- a/tests/rigctlcom.c +++ b/tests/rigctlcom.c @@ -71,10 +71,8 @@ #include "iofunc.h" #include "serial.h" #include "sprintflst.h" - #include "rigctl_parse.h" - /* * Reminder: when adding long options, * keep up to date SHORT_OPTIONS, usage()'s output and man page. thanks. @@ -105,16 +103,6 @@ static struct option long_options[] = {0, 0, 0, 0} }; - -struct handle_data -{ - RIG *rig; - int sock; - struct sockaddr_storage cli_addr; - socklen_t clilen; -}; - - void usage(); static int handle_ts2000(void *arg); @@ -128,12 +116,6 @@ static sig_atomic_t volatile ctrl_c; static int volatile ctrl_c; #endif -thread_local int interactive = 1; /* no cmd because of daemon */ -thread_local int prompt = 0; /* Daemon mode for rigparse return string */ -thread_local int vfo_mode = 0; /* vfo_mode=0 means target VFO is current VFO */ - -thread_local char send_cmd_term = '\r'; /* send_cmd termination char */ - #define MAXCONFLEN 128 #if 0 diff --git a/tests/rigctld.c b/tests/rigctld.c index 8839d7bc8..3303a4973 100644 --- a/tests/rigctld.c +++ b/tests/rigctld.c @@ -117,6 +117,7 @@ struct handle_data int sock; struct sockaddr_storage cli_addr; socklen_t clilen; + int vfo_mode; }; @@ -137,12 +138,6 @@ static sig_atomic_t volatile ctrl_c; static int volatile ctrl_c; #endif -thread_local int interactive = 1; /* no cmd because of daemon */ -thread_local int prompt = 0; /* Daemon mode for rigparse return string */ -thread_local int vfo_mode = 0; /* vfo_mode=0 means target VFO is current VFO */ - -thread_local char send_cmd_term = '\r'; /* send_cmd termination char */ - const char *portno = "4532"; const char *src_addr = NULL; /* INADDR_ANY */ @@ -254,6 +249,7 @@ int main(int argc, char *argv[]) pthread_attr_t attr; #endif struct handle_data *arg; + int vfo_mode = 0; /* vfo_mode=0 means target VFO is current VFO */ while (1) { @@ -794,6 +790,7 @@ int main(int argc, char *argv[]) else { arg->rig = my_rig; arg->clilen = sizeof(arg->cli_addr); + arg->vfo_mode = vfo_mode; arg->sock = accept(sock_listen, (struct sockaddr *)&arg->cli_addr, &arg->clilen); @@ -874,6 +871,9 @@ void * handle_socket(void *arg) int retcode = RIG_OK; char host[NI_MAXHOST]; char serv[NI_MAXSERV]; + char send_cmd_term = '\r'; /* send_cmd termination char */ + int ext_resp = 0; + char resp_sep = '\n'; #ifdef __MINGW32__ int sock_osfhandle = _open_osfhandle(handle_data_arg->sock, _O_RDONLY); @@ -933,7 +933,8 @@ void * handle_socket(void *arg) do { - retcode = rigctl_parse(handle_data_arg->rig, fsockin, fsockout, NULL, 0, sync_callback); + retcode = rigctl_parse(handle_data_arg->rig, fsockin, fsockout, NULL, 0, sync_callback, + 1, 0, handle_data_arg->vfo_mode, send_cmd_term, &ext_resp, &resp_sep); if (ferror(fsockin) || ferror(fsockout)) { retcode = 1; diff --git a/tests/rotctl.c b/tests/rotctl.c index 1e00a04a4..944d5465a 100644 --- a/tests/rotctl.c +++ b/tests/rotctl.c @@ -111,13 +111,6 @@ static struct option long_options[] = static const int have_rl = 1; #endif - -thread_local int interactive = 1; /* if no cmd on command line, switch to interactive */ -thread_local int prompt = 1; /* Print prompt in rotctl */ - -thread_local char send_cmd_term = '\r'; /* send_cmd termination char */ - - int main(int argc, char *argv[]) { ROT *my_rot; /* handle to rot (instance) */ @@ -142,6 +135,11 @@ int main(int argc, char *argv[]) const char *rot_file = NULL; int serial_rate = 0; char conf_parms[MAXCONFLEN] = ""; + int interactive = 1; /* if no cmd on command line, switch to interactive */ + int prompt = 1; /* Print prompt in rotctl */ + char send_cmd_term = '\r'; /* send_cmd termination char */ + int ext_resp = 0; + char resp_sep = '\n'; while (1) { @@ -402,7 +400,9 @@ int main(int argc, char *argv[]) do { - retcode = rotctl_parse(my_rot, stdin, stdout, argv, argc); + retcode = rotctl_parse(my_rot, stdin, stdout, argv, argc, + interactive, prompt, send_cmd_term, + &ext_resp, &resp_sep); if (retcode == 2) { diff --git a/tests/rotctl_parse.c b/tests/rotctl_parse.c index 3406132fa..725f8b63f 100644 --- a/tests/rotctl_parse.c +++ b/tests/rotctl_parse.c @@ -136,6 +136,10 @@ struct test_table int (*rot_routine)(ROT *, FILE *, int, + int, + char, + int, + char, const struct test_table *, const char *, const char *, @@ -158,6 +162,10 @@ struct test_table #define declare_proto_rot(f) static int (ACTION(f))(ROT *rot, \ FILE *fout, \ int interactive, \ + int prompt, \ + char send_cmd_term, \ + int ext_resp, \ + char resp_sep, \ const struct test_table *cmd, \ const char *arg1, \ const char *arg2, \ @@ -495,14 +503,9 @@ static int next_word(char *buffer, int argc, char *argv[], int newline) }) -extern thread_local int interactive; -extern thread_local int prompt; -extern thread_local char send_cmd_term; -thread_local int ext_resp = 0; -thread_local unsigned char resp_sep = '\n'; /* Default response separator */ - - -int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) +int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc, + int interactive, int prompt, char send_cmd_term, + int * ext_resp_ptr, char * resp_sep_ptr) { int retcode; /* generic return code from functions */ unsigned char cmd; @@ -539,7 +542,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) */ if (cmd == '+' && !prompt) { - ext_resp = 1; + *ext_resp_ptr = 1; if (scanfc(fin, "%c", &cmd) < 1) { @@ -558,8 +561,8 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) && !prompt) { - ext_resp = 1; - resp_sep = cmd; + *ext_resp_ptr = 1; + *resp_sep_ptr = cmd; if (scanfc(fin, "%c", &cmd) < 1) { @@ -1397,7 +1400,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) * Extended Response protocol: output received command name and arguments * response. */ - if (interactive && ext_resp && !prompt) + if (interactive && *ext_resp_ptr && !prompt) { char a1[MAXARGSZ + 2]; char a2[MAXARGSZ + 2]; @@ -1409,12 +1412,16 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) p3 == NULL ? a3[0] = '\0' : snprintf(a3, sizeof(a3), " %s", p3); p4 == NULL ? a4[0] = '\0' : snprintf(a4, sizeof(a4), " %s", p4); - fprintf(fout, "%s:%s%s%s%s%c", cmd_entry->name, a1, a2, a3, a4, resp_sep); + fprintf(fout, "%s:%s%s%s%s%c", cmd_entry->name, a1, a2, a3, a4, *resp_sep_ptr); } retcode = (*cmd_entry->rot_routine)(my_rot, fout, interactive, + prompt, + send_cmd_term, + *ext_resp_ptr, + *resp_sep_ptr, cmd_entry, p1, p2 ? p2 : "", @@ -1434,8 +1441,8 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) if (interactive && !prompt) { fprintf(fout, NETROTCTL_RET "%d\n", retcode); - ext_resp = 0; - resp_sep = '\n'; + *ext_resp_ptr = 0; + *resp_sep_ptr = '\n'; } else { @@ -1448,17 +1455,17 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) if (interactive && !prompt) { /* netrotctl RIG_OK */ - if (!(cmd_entry->flags & ARG_OUT) && !ext_resp) + if (!(cmd_entry->flags & ARG_OUT) && !*ext_resp_ptr) { fprintf(fout, NETROTCTL_RET "0\n"); } /* Extended Response protocol */ - else if (ext_resp && cmd != 0xf0) + else if (*ext_resp_ptr && cmd != 0xf0) { fprintf(fout, NETROTCTL_RET "0\n"); - ext_resp = 0; - resp_sep = '\n'; + *ext_resp_ptr = 0; + *resp_sep_ptr = '\n'; } } } diff --git a/tests/rotctl_parse.h b/tests/rotctl_parse.h index f30a8f340..4c038b924 100644 --- a/tests/rotctl_parse.h +++ b/tests/rotctl_parse.h @@ -44,6 +44,8 @@ void list_models(); int print_conf_list(const struct confparams *cfp, rig_ptr_t data); int set_conf(ROT *my_rot, char *conf_parms); -int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc); +int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc, + int interactive, int prompt, char send_cmd_term, + int * ext_resp_ptr, char * resp_sep_ptr); #endif /* ROTCTL_PARSE_H */ diff --git a/tests/rotctld.c b/tests/rotctld.c index 3dcc10b3e..660f771c0 100644 --- a/tests/rotctld.c +++ b/tests/rotctld.c @@ -103,13 +103,8 @@ static struct option long_options[] = {0, 0, 0, 0} }; -thread_local int interactive = 1; /* no cmd because of daemon */ -thread_local int prompt = 0 ; /* Daemon mode for rigparse return string */ - -thread_local const char *portno = "4533"; -thread_local const char *src_addr = NULL; /* INADDR_ANY */ - -thread_local char send_cmd_term = '\r'; /* send_cmd termination char */ +const char *portno = "4533"; +const char *src_addr = NULL; /* INADDR_ANY */ #define MAXCONFLEN 128 @@ -596,6 +591,8 @@ void * handle_socket(void *arg) int retcode; char host[NI_MAXHOST]; char serv[NI_MAXSERV]; + int ext_resp = 0; + char resp_sep = '\n'; #ifdef __MINGW32__ int sock_osfhandle = _open_osfhandle(handle_data_arg->sock, _O_RDONLY); @@ -632,7 +629,8 @@ void * handle_socket(void *arg) do { - retcode = rotctl_parse(handle_data_arg->rot, fsockin, fsockout, NULL, 0); + retcode = rotctl_parse(handle_data_arg->rot, fsockin, fsockout, NULL, 0, 1, + 0, '\r', &ext_resp, &resp_sep); if (ferror(fsockin) || ferror(fsockout)) {