kopia lustrzana https://github.com/Hamlib/Hamlib
Tidy up rigctl --list output
Implemented hash table to temporarily store and sort the rig models by ID
to print the --list by model numbers. Hash is implemented using
uthash.h, see http://uthash.sourceforge.net/
Suppressed rig backend register output by setting rig_debug_level to 0
for list output.
(cherry picked from commit 417cb98d2e
)
Hamlib-1.2.15
rodzic
9b1ce8fd50
commit
0527fdd455
|
@ -124,36 +124,36 @@ int main (int argc, char *argv[])
|
|||
exit(0);
|
||||
case 'm':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
my_model = atoi(optarg);
|
||||
break;
|
||||
case 'r':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
rig_file = optarg;
|
||||
break;
|
||||
case 'p':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
ptt_file = optarg;
|
||||
break;
|
||||
case 'd':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
dcd_file = optarg;
|
||||
break;
|
||||
case 'P':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
if (!strcmp(optarg, "RIG"))
|
||||
ptt_type = RIG_PTT_RIG;
|
||||
|
@ -172,8 +172,8 @@ int main (int argc, char *argv[])
|
|||
break;
|
||||
case 'D':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
if (!strcmp(optarg, "RIG"))
|
||||
dcd_type = RIG_DCD_RIG;
|
||||
|
@ -194,8 +194,8 @@ int main (int argc, char *argv[])
|
|||
break;
|
||||
case 'c':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
civaddr = optarg;
|
||||
break;
|
||||
|
@ -211,18 +211,18 @@ int main (int argc, char *argv[])
|
|||
break;
|
||||
case 's':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
serial_rate = atoi(optarg);
|
||||
break;
|
||||
case 'C':
|
||||
if (!optarg) {
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
usage(); /* wrong arg count */
|
||||
exit(1);
|
||||
}
|
||||
if (*conf_parms != '\0')
|
||||
strcat(conf_parms, ",");
|
||||
strcat(conf_parms, ",");
|
||||
strncat(conf_parms, optarg, MAXCONFLEN-strlen(conf_parms));
|
||||
break;
|
||||
case 'o':
|
||||
|
@ -235,6 +235,7 @@ int main (int argc, char *argv[])
|
|||
show_conf++;
|
||||
break;
|
||||
case 'l':
|
||||
rig_set_debug(verbose);
|
||||
list_models();
|
||||
exit(0);
|
||||
case 'u':
|
||||
|
|
|
@ -45,6 +45,9 @@
|
|||
|
||||
#include "rigctl_parse.h"
|
||||
|
||||
/* Hash table implementation See: http://uthash.sourceforge.net/ */
|
||||
#include "uthash.h"
|
||||
|
||||
#ifdef HAVE_PTHREAD
|
||||
#include <pthread.h>
|
||||
|
||||
|
@ -246,6 +249,64 @@ static struct test_table *find_cmd_entry(int cmd)
|
|||
|
||||
return &test_list[i];
|
||||
}
|
||||
|
||||
/* Structure for hash table provided by uthash.h
|
||||
*
|
||||
* Structure and hash funtions patterned after/copied from example.c
|
||||
* distributed with the uthash package. See: http://uthash.sourceforge.net/
|
||||
*/
|
||||
struct mod_lst
|
||||
{
|
||||
int id; /* caps->rig_model This is the hash key */
|
||||
char mfg_name[32]; /* caps->mfg_name */
|
||||
char model_name[32]; /* caps->model_name */
|
||||
char version[32]; /* caps->version */
|
||||
char status[32]; /* caps->status */
|
||||
UT_hash_handle hh; /* makes this structure hashable */
|
||||
};
|
||||
|
||||
/* Hash declaration. Must be initialized to NULL */
|
||||
struct mod_lst *models = NULL;
|
||||
|
||||
/* Add model information to the hash */
|
||||
void hash_add_model(int id, const char *mfg_name, const char *model_name,
|
||||
const char *version, const char *status)
|
||||
{
|
||||
struct mod_lst *s;
|
||||
|
||||
s = (struct mod_lst*)malloc(sizeof(struct mod_lst));
|
||||
|
||||
s->id = id;
|
||||
snprintf(s->mfg_name, sizeof(s->mfg_name), "%s", mfg_name);
|
||||
snprintf(s->model_name, sizeof(s->model_name), "%s", model_name);
|
||||
snprintf(s->version, sizeof(s->version), "%s", version);
|
||||
snprintf(s->status, sizeof(s->status), "%s", status);
|
||||
|
||||
HASH_ADD_INT(models, id, s); /* id: name of key field */
|
||||
}
|
||||
|
||||
/* Hash sorting functions */
|
||||
int hash_model_id_sort(struct mod_lst *a, struct mod_lst *b)
|
||||
{
|
||||
return (a->id - b->id);
|
||||
}
|
||||
|
||||
void hash_sort_by_model_id()
|
||||
{
|
||||
HASH_SORT(models, hash_model_id_sort);
|
||||
}
|
||||
|
||||
/* Delete hash */
|
||||
void hash_delete_all() {
|
||||
struct mod_lst *current_model, *tmp;
|
||||
|
||||
HASH_ITER(hh, models, current_model, tmp) {
|
||||
HASH_DEL(models, current_model); /* delete it (models advances to next) */
|
||||
free(current_model); /* free it */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* TODO: use Lex?
|
||||
*/
|
||||
|
@ -632,25 +693,40 @@ int print_conf_list(const struct confparams *cfp, rig_ptr_t data)
|
|||
return 1; /* !=0, we want them all ! */
|
||||
}
|
||||
|
||||
static int print_model_list(const struct rig_caps *caps, void *data)
|
||||
static int hash_model_list(const struct rig_caps *caps, void *data)
|
||||
{
|
||||
printf("%d\t%-23s%-24s%-12s%s\n", caps->rig_model, caps->mfg_name,
|
||||
caps->model_name, caps->version, rig_strstatus(caps->status));
|
||||
|
||||
hash_add_model(caps->rig_model, caps->mfg_name, caps->model_name,
|
||||
caps->version, rig_strstatus(caps->status));
|
||||
return 1; /* !=0, we want them all ! */
|
||||
}
|
||||
|
||||
void print_model_list()
|
||||
{
|
||||
struct mod_lst *s;
|
||||
|
||||
for (s = models; s != NULL; s = (struct mod_lst *)(s->hh.next)) {
|
||||
printf("%6d %-23s%-24s%-16s%s\n", s->id, s->mfg_name,
|
||||
s->model_name, s->version, s->status);
|
||||
}
|
||||
}
|
||||
|
||||
void list_models()
|
||||
{
|
||||
int status;
|
||||
|
||||
rig_load_all_backends();
|
||||
|
||||
printf("Rig#\tMfgr Model Vers. Status\n");
|
||||
status = rig_list_foreach(print_model_list, NULL);
|
||||
printf(" Rig # Mfg Model Version Status\n");
|
||||
status = rig_list_foreach(hash_model_list, NULL);
|
||||
if (status != RIG_OK ) {
|
||||
printf("rig_list_foreach: error = %s \n", rigerror(status));
|
||||
exit(2);
|
||||
}
|
||||
|
||||
hash_sort_by_model_id();
|
||||
print_model_list();
|
||||
hash_delete_all();
|
||||
}
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue