error checking when parsing

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2867 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.2.11
Stéphane Fillod, F8CFE 2010-04-05 10:15:36 +00:00
rodzic 49f0f17a86
commit d8d60cd2e7
2 zmienionych plików z 174 dodań i 143 usunięć

Wyświetl plik

@ -1,5 +1,5 @@
/*
* rigctl_parse.c - (C) Stephane Fillod 2000-2009
* rigctl_parse.c - (C) Stephane Fillod 2000-2010
* (C) Terry Embry 2008-2009
* (C) The Hamlib Group 2010
*
@ -74,7 +74,7 @@ static pthread_mutex_t rig_mutex = PTHREAD_MUTEX_INITIALIZER;
struct test_table {
unsigned char cmd;
const char *name;
int (*rig_routine)(RIG*, FILE*, int, const struct test_table*, vfo_t,
int (*rig_routine)(RIG*, FILE*, FILE*, int, const struct test_table*, vfo_t,
const char*, const char*, const char*);
int flags;
const char *arg1;
@ -84,7 +84,9 @@ struct test_table {
};
#define declare_proto_rig(f) static int (f)(RIG *rig, FILE *fout, int interactive, \
#define CHKSCN1ARG(a) if ((a) != 1) return -RIG_EINVAL; else do {} while(0)
#define declare_proto_rig(f) static int (f)(RIG *rig, FILE *fout, FILE *fin, int interactive, \
const struct test_table *cmd, vfo_t vfo, const char *arg1, \
const char *arg2, const char *arg3)
@ -302,7 +304,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
fprintf(fout, "\nRig command: ");
do {
if (scanfc(fin, "%c", &cmd) < 0)
if (scanfc(fin, "%c", &cmd) < 1)
return -1;
/* Extended response protocol requested with leading '+' on command
@ -310,7 +312,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
*/
if (cmd == '+' && !prompt) {
ext_resp = 1;
if (scanfc(fin, "%c", &cmd) < 0)
if (scanfc(fin, "%c", &cmd) < 1)
return -1;
} else if (cmd == '+' && prompt) {
return 0;
@ -319,7 +321,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
if (cmd != '\\' && cmd != '_' && cmd != '#' && ispunct(cmd) && !prompt) {
ext_resp = 1;
resp_sep = cmd;
if (scanfc(fin, "%c", &cmd) < 0)
if (scanfc(fin, "%c", &cmd) < 1)
return -1;
} else if (cmd != '\\' && cmd != '?' && cmd != '_' && cmd != '#' && ispunct(cmd) && prompt) {
return 0;
@ -330,11 +332,11 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
unsigned char cmd_name[MAXNAMSIZ], *pcmd = cmd_name;
int c_len = MAXNAMSIZ;
if (scanfc(fin, "%c", pcmd) < 0)
if (scanfc(fin, "%c", pcmd) < 1)
return -1;
while(c_len-- && (isalnum(*pcmd) || *pcmd == '_' ))
if (scanfc(fin, "%c", ++pcmd) < 0)
if (scanfc(fin, "%c", ++pcmd) < 1)
return -1;
*pcmd = '\0';
@ -359,7 +361,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
/* comment line */
if (cmd == '#') {
while( cmd != '\n' && cmd != '\r')
if (scanfc(fin, "%c", &cmd) < 0)
if (scanfc(fin, "%c", &cmd) < 1)
return -1;
return 0;
}
@ -392,7 +394,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
if (interactive) {
if (prompt)
fprintf(fout, "VFO: ");
if (scanfc(fin, "%s", arg1) < 0)
if (scanfc(fin, "%s", arg1) < 1)
return -1;
vfo = rig_parse_vfo(arg1);
} else {
@ -411,9 +413,11 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
char *nl;
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg1);
fgets(arg1, MAXARGSZ, fin);
if (fgets(arg1, MAXARGSZ, fin) == NULL)
return -1;
if (arg1[0] == 0xa)
fgets(arg1, MAXARGSZ, fin);
if (fgets(arg1, MAXARGSZ, fin) == NULL)
return -1;
nl = strchr(arg1, 0xa);
if (nl) *nl = '\0'; /* chomp */
p1 = arg1[0] == ' ' ? arg1 + 1 : arg1;
@ -430,7 +434,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
if (interactive) {
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg1);
if (scanfc(fin, "%s", arg1) < 0)
if (scanfc(fin, "%s", arg1) < 1)
return -1;
p1 = arg1;
} else {
@ -446,7 +450,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
if (interactive) {
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg2);
if (scanfc(fin, "%s", arg2) < 0)
if (scanfc(fin, "%s", arg2) < 1)
return -1;
p2 = arg2;
} else {
@ -462,7 +466,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
if (interactive) {
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg3);
if (scanfc(fin, "%s", arg3) < 0)
if (scanfc(fin, "%s", arg3) < 1)
return -1;
p3 = arg3;
} else {
@ -505,8 +509,8 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc)
fprintf(fout, "%s:%s%s%s%s%c", cmd_entry->name, vfo_str, a1, a2, a3, resp_sep);
}
retcode = (*cmd_entry->rig_routine)(my_rig, fout, interactive,
cmd_entry, vfo, p1, p2, p3);
retcode = (*cmd_entry->rig_routine)(my_rig, fout, fin, interactive,
cmd_entry, vfo, p1, p2 ? p2 : "", p3 ? p3 : "");
#ifdef HAVE_PTHREAD
pthread_mutex_unlock(&rig_mutex);
@ -675,7 +679,7 @@ declare_proto_rig(set_freq)
{
freq_t freq;
sscanf(arg1, "%"SCNfreq, &freq);
CHKSCN1ARG(sscanf(arg1, "%"SCNfreq, &freq));
return rig_set_freq(rig, vfo, freq);
}
@ -701,7 +705,7 @@ declare_proto_rig(set_rit)
{
shortfreq_t rit;
sscanf(arg1, "%ld", &rit);
CHKSCN1ARG(sscanf(arg1, "%ld", &rit));
return rig_set_rit(rig, vfo, rit);
}
@ -726,7 +730,7 @@ declare_proto_rig(set_xit)
{
shortfreq_t xit;
sscanf(arg1, "%ld", &xit);
CHKSCN1ARG(sscanf(arg1, "%ld", &xit));
return rig_set_xit(rig, vfo, xit);
}
@ -760,7 +764,7 @@ declare_proto_rig(set_mode)
}
mode = rig_parse_mode(arg1);
sscanf(arg2, "%ld", &width);
CHKSCN1ARG(sscanf(arg2, "%ld", &width));
return rig_set_mode(rig, vfo, mode, width);
}
@ -808,9 +812,9 @@ declare_proto_rig(get_vfo)
/* 'T' */
declare_proto_rig(set_ptt)
{
int ptt;
int ptt;
sscanf(arg1, "%d", &ptt);
CHKSCN1ARG(sscanf(arg1, "%d", &ptt));
return rig_set_ptt(rig, vfo, (ptt_t) ptt);
}
@ -876,7 +880,7 @@ declare_proto_rig(set_rptr_offs)
{
unsigned long rptr_offs;
sscanf(arg1, "%ld", &rptr_offs);
CHKSCN1ARG(sscanf(arg1, "%ld", &rptr_offs));
return rig_set_rptr_offs(rig, vfo, rptr_offs);
}
@ -901,7 +905,7 @@ declare_proto_rig(set_ctcss_tone)
{
tone_t tone;
sscanf(arg1, "%d", &tone);
CHKSCN1ARG(sscanf(arg1, "%d", &tone));
return rig_set_ctcss_tone(rig, vfo, tone);
}
@ -926,7 +930,7 @@ declare_proto_rig(set_dcs_code)
{
tone_t code;
sscanf(arg1, "%d", &code);
CHKSCN1ARG(sscanf(arg1, "%d", &code));
return rig_set_dcs_code(rig, vfo, code);
}
@ -951,7 +955,7 @@ declare_proto_rig(set_ctcss_sql)
{
tone_t tone;
sscanf(arg1, "%d", &tone);
CHKSCN1ARG(sscanf(arg1, "%d", &tone));
return rig_set_ctcss_sql(rig, vfo, tone);
}
@ -976,7 +980,7 @@ declare_proto_rig(set_dcs_sql)
{
tone_t code;
sscanf(arg1, "%d", &code);
CHKSCN1ARG(sscanf(arg1, "%d", &code));
return rig_set_dcs_sql(rig, vfo, code);
}
@ -1002,7 +1006,7 @@ declare_proto_rig(set_split_freq)
freq_t txfreq;
vfo_t txvfo = RIG_VFO_TX;
sscanf(arg1, "%"SCNfreq, &txfreq);
CHKSCN1ARG(sscanf(arg1, "%"SCNfreq, &txfreq));
return rig_set_split_freq(rig, txvfo, txfreq);
}
@ -1038,7 +1042,7 @@ declare_proto_rig(set_split_mode)
}
mode = rig_parse_mode(arg1);
sscanf(arg2, "%d", &width);
CHKSCN1ARG(sscanf(arg2, "%d", &width));
return rig_set_split_mode(rig, txvfo, mode, (pbwidth_t) width);
}
@ -1068,7 +1072,7 @@ declare_proto_rig(set_split_vfo)
{
int split;
sscanf(arg1, "%d", &split);
CHKSCN1ARG(sscanf(arg1, "%d", &split));
return rig_set_split_vfo(rig, vfo, (split_t) split, rig_parse_vfo(arg2));
}
@ -1097,7 +1101,7 @@ declare_proto_rig(set_ts)
{
unsigned long ts;
sscanf(arg1, "%ld", &ts);
CHKSCN1ARG(sscanf(arg1, "%ld", &ts));
return rig_set_ts(rig, vfo, ts);
}
@ -1126,8 +1130,8 @@ declare_proto_rig(power2mW)
rmode_t mode;
unsigned int mwp;
sscanf(arg1, "%f", &power);
sscanf(arg2, "%"SCNfreq, &freq);
CHKSCN1ARG(sscanf(arg1, "%f", &power));
CHKSCN1ARG(sscanf(arg2, "%"SCNfreq, &freq));
mode = rig_parse_mode(arg3);
status = rig_power2mW(rig, &mwp, power, freq, mode);
@ -1149,8 +1153,8 @@ declare_proto_rig(mW2power)
rmode_t mode;
unsigned int mwp;
sscanf(arg1, "%i", &mwp);
sscanf(arg2, "%"SCNfreq, &freq);
CHKSCN1ARG(sscanf(arg1, "%i", &mwp));
CHKSCN1ARG(sscanf(arg2, "%"SCNfreq, &freq));
mode = rig_parse_mode(arg3);
status = rig_mW2power(rig, &power, mwp, freq, mode);
@ -1198,10 +1202,10 @@ declare_proto_rig(set_level)
break;
case RIG_CONF_CHECKBUTTON:
case RIG_CONF_COMBO:
sscanf(arg2, "%d", &val.i);
CHKSCN1ARG(sscanf(arg2, "%d", &val.i));
break;
case RIG_CONF_NUMERIC:
sscanf(arg2, "%f", &val.f);
CHKSCN1ARG(sscanf(arg2, "%f", &val.f));
break;
case RIG_CONF_STRING:
val.cs = arg2;
@ -1213,9 +1217,9 @@ declare_proto_rig(set_level)
}
if (RIG_LEVEL_IS_FLOAT(level))
sscanf(arg2, "%f", &val.f);
CHKSCN1ARG(sscanf(arg2, "%f", &val.f));
else
sscanf(arg2, "%d", &val.i);
CHKSCN1ARG(sscanf(arg2, "%d", &val.i));
return rig_set_level(rig, vfo, level, val);
}
@ -1297,7 +1301,7 @@ declare_proto_rig(set_func)
}
func = rig_parse_func(arg1);
sscanf(arg2, "%d", &func_stat);
CHKSCN1ARG(sscanf(arg2, "%d", &func_stat));
return rig_set_func(rig, vfo, func, func_stat);
}
@ -1354,10 +1358,10 @@ declare_proto_rig(set_parm)
break;
case RIG_CONF_CHECKBUTTON:
case RIG_CONF_COMBO:
sscanf(arg2, "%d", &val.i);
CHKSCN1ARG(sscanf(arg2, "%d", &val.i));
break;
case RIG_CONF_NUMERIC:
sscanf(arg2, "%f", &val.f);
CHKSCN1ARG(sscanf(arg2, "%f", &val.f));
break;
case RIG_CONF_STRING:
val.cs = arg2;
@ -1369,9 +1373,9 @@ declare_proto_rig(set_parm)
}
if (RIG_PARM_IS_FLOAT(parm))
sscanf(arg2, "%f", &val.f);
CHKSCN1ARG(sscanf(arg2, "%f", &val.f));
else
sscanf(arg2, "%d", &val.i);
CHKSCN1ARG(sscanf(arg2, "%d", &val.i));
return rig_set_parm(rig, parm, val);
}
@ -1443,7 +1447,7 @@ declare_proto_rig(set_bank)
{
int bank;
sscanf(arg1, "%d", &bank);
CHKSCN1ARG(sscanf(arg1, "%d", &bank));
return rig_set_bank(rig, vfo, bank);
}
@ -1452,7 +1456,7 @@ declare_proto_rig(set_mem)
{
int ch;
sscanf(arg1, "%d", &ch);
CHKSCN1ARG(sscanf(arg1, "%d", &ch));
return rig_set_mem(rig, vfo, ch);
}
@ -1502,7 +1506,7 @@ declare_proto_rig(scan)
}
op = rig_parse_scan(arg1);
sscanf(arg2, "%d", &ch);
CHKSCN1ARG(sscanf(arg2, "%d", &ch));
return rig_scan(rig, vfo, op, ch);
}
@ -1521,8 +1525,7 @@ declare_proto_rig(set_channel)
if (isdigit(arg1[0])) {
chan.vfo = RIG_VFO_MEM;
if (sscanf(arg1, "%d", &chan.channel_num) != 1)
return -RIG_EINVAL;
CHKSCN1ARG(sscanf(arg1, "%d", &chan.channel_num));
/*
* find mem_caps in caps, we'll need it later
*/
@ -1543,78 +1546,95 @@ declare_proto_rig(set_channel)
rig_debug(RIG_DEBUG_TRACE, "set_channel: mem_caps->bank_num = %d, mem_caps->freq = %d\n", mem_caps->bank_num, mem_caps->freq);
if (mem_caps->bank_num) {
printf("Bank Num: ");
status = scanf("%d", &chan.bank_num);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "Bank Num: ");
CHKSCN1ARG(scanfc(fin, "%d", &chan.bank_num));
}
if (mem_caps->vfo) {
printf("vfo (VFOA,MEM,etc...): ");
status = scanf("%s", s);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "vfo (VFOA,MEM,etc...): ");
CHKSCN1ARG(scanfc(fin, "%s", s));
chan.vfo = rig_parse_vfo(s);
}
if (mem_caps->ant) {
printf("ant: ");
status = scanf("%d", &chan.ant);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "ant: ");
CHKSCN1ARG(scanfc(fin, "%d", &chan.ant));
}
if (mem_caps->freq) {
printf("Frequency: ");
status = scanf("%"SCNfreq, &chan.freq);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "Frequency: ");
CHKSCN1ARG(scanfc(fin, "%"SCNfreq, &chan.freq));
}
if (mem_caps->mode) {
printf("mode (FM,LSB,etc...): ");
status = scanf("%s", s);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "mode (FM,LSB,etc...): ");
CHKSCN1ARG(scanfc(fin, "%s", s));
chan.mode = rig_parse_mode(s);
}
if (mem_caps->width) {
printf("width: ");
status = scanf("%ld", &chan.width);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "width: ");
CHKSCN1ARG(scanfc(fin, "%ld", &chan.width));
}
if (mem_caps->tx_freq) {
printf("tx freq (VFOA,MEM,etc...): ");
status = scanf("%"SCNfreq, &chan.tx_freq);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "tx freq (VFOA,MEM,etc...): ");
CHKSCN1ARG(scanfc(fin, "%"SCNfreq, &chan.tx_freq));
}
if (mem_caps->tx_mode) {
printf("tx mode (FM,LSB,etc...): ");
status = scanf("%s", s);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "tx mode (FM,LSB,etc...): ");
CHKSCN1ARG(scanfc(fin, "%s", s));
chan.tx_mode = rig_parse_mode(s);
}
if (mem_caps->tx_width) {
printf("tx width: ");
status = scanf("%ld", &chan.tx_width);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "tx width: ");
CHKSCN1ARG(scanfc(fin, "%ld", &chan.tx_width));
}
if (mem_caps->split) {
printf("split (0,1): ");
status = scanf("%d", &status);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "split (0,1): ");
CHKSCN1ARG(scanfc(fin, "%d", &status));
chan.split = status;
}
if (mem_caps->tx_vfo) {
printf("tx vfo (VFOA,MEM,etc...): ");
status = scanf("%s", s);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "tx vfo (VFOA,MEM,etc...): ");
CHKSCN1ARG(scanfc(fin, "%s", s));
chan.tx_vfo = rig_parse_vfo(s);
}
if (mem_caps->rptr_shift) {
printf("rptr shift (+-0): ");
status = scanf("%s", s);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "rptr shift (+-0): ");
CHKSCN1ARG(scanfc(fin, "%s", s));
chan.rptr_shift = rig_parse_rptr_shift(s);
}
if (mem_caps->rptr_offs) {
printf("rptr offset: ");
status = scanf("%ld", &chan.rptr_offs);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "rptr offset: ");
CHKSCN1ARG(scanfc(fin, "%ld", &chan.rptr_offs));
}
if (mem_caps->tuning_step) {
printf("tuning step: ");
status = scanf("%ld", &chan.tuning_step);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "tuning step: ");
CHKSCN1ARG(scanfc(fin, "%ld", &chan.tuning_step));
}
if (mem_caps->rit) {
printf("rit (Hz,0=off): ");
status = scanf("%ld", &chan.rit);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "rit (Hz,0=off): ");
CHKSCN1ARG(scanfc(fin, "%ld", &chan.rit));
}
if (mem_caps->xit) {
printf("xit (Hz,0=off): ");
status = scanf("%ld", &chan.xit);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "xit (Hz,0=off): ");
CHKSCN1ARG(scanfc(fin, "%ld", &chan.xit));
}
if (mem_caps->funcs) {
printf("funcs: ");
status = scanf("%lx", &chan.funcs);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "funcs: ");
CHKSCN1ARG(scanfc(fin, "%lx", &chan.funcs));
}
#if 0
/* for all levels, ask */
@ -1622,32 +1642,39 @@ declare_proto_rig(set_channel)
sscanf(arg1, "%d", &chan.levels);
#endif
if (mem_caps->ctcss_tone) {
printf("ctcss tone freq in tenth of Hz (0=off): ");
status = scanf("%d", &chan.ctcss_tone);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "ctcss tone freq in tenth of Hz (0=off): ");
CHKSCN1ARG(scanfc(fin, "%d", &chan.ctcss_tone));
}
if (mem_caps->ctcss_sql) {
printf("ctcss sql freq in tenth of Hz (0=off): ");
status = scanf("%d", &chan.ctcss_sql);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "ctcss sql freq in tenth of Hz (0=off): ");
CHKSCN1ARG(scanfc(fin, "%d", &chan.ctcss_sql));
}
if (mem_caps->dcs_code) {
printf("dcs code: ");
status = scanf("%d", &chan.dcs_code);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "dcs code: ");
CHKSCN1ARG(scanfc(fin, "%d", &chan.dcs_code));
}
if (mem_caps->dcs_sql) {
printf("dcs sql: ");
status = scanf("%d", &chan.dcs_sql);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "dcs sql: ");
CHKSCN1ARG(scanfc(fin, "%d", &chan.dcs_sql));
}
if (mem_caps->scan_group) {
printf("scan group: ");
status = scanf("%d", &chan.scan_group);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "scan group: ");
CHKSCN1ARG(scanfc(fin, "%d", &chan.scan_group));
}
if (mem_caps->flags) {
printf("flags: ");
status = scanf("%d", &chan.flags);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "flags: ");
CHKSCN1ARG(scanfc(fin, "%d", &chan.flags));
}
if (mem_caps->channel_desc) {
printf("channel desc: ");
status = scanf("%s", s);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
fprintf(fout, "channel desc: ");
CHKSCN1ARG(scanfc(fin, "%s", s));
strcpy(chan.channel_desc, s);
}
#if 0
@ -1671,8 +1698,7 @@ declare_proto_rig(get_channel)
if (isdigit(arg1[0])) {
chan.vfo = RIG_VFO_MEM;
if (sscanf(arg1, "%d", &chan.channel_num) != 1)
return -RIG_EINVAL;
CHKSCN1ARG(sscanf(arg1, "%d", &chan.channel_num));
} else {
chan.vfo = rig_parse_vfo(arg1);
chan.channel_num = 0;
@ -1939,7 +1965,7 @@ declare_proto_rig(set_ant)
{
ant_t ant;
sscanf(arg1, "%d", &ant);
CHKSCN1ARG(sscanf(arg1, "%d", &ant));
return rig_set_ant(rig, vfo, rig_idx2setting(ant));
}
@ -1964,7 +1990,7 @@ declare_proto_rig(reset)
{
int reset;
sscanf(arg1, "%d", &reset);
CHKSCN1ARG(sscanf(arg1, "%d", &reset));
return rig_reset(rig, (reset_t) reset);
}
@ -2001,7 +2027,7 @@ declare_proto_rig(set_powerstat)
{
int stat;
sscanf(arg1, "%d", &stat);
CHKSCN1ARG(sscanf(arg1, "%d", &stat));
return rig_set_powerstat(rig, (powerstat_t) stat);
}

Wyświetl plik

@ -1,5 +1,5 @@
/*
* rotctl.c - (C) Stephane Fillod 2000-2009
* rotctl.c - (C) Stephane Fillod 2000-2010
*
* This program test/control a rotator using Hamlib.
* It takes commands in interactive mode as well as
@ -81,6 +81,8 @@ struct test_table {
const char *arg6;
};
#define CHKSCN1ARG(a) if ((a) != 1) return -RIG_EINVAL; else do {} while(0)
#define declare_proto_rot(f) static int (f)(ROT *rot, FILE *fout, int interactive, \
const struct test_table *cmd, const char *arg1, const char *arg2, \
const char *arg3, const char *arg4, const char *arg5, const char *arg6)
@ -206,7 +208,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
fprintf(fout, "\nRotator command: ");
do {
if (scanfc(fin, "%c", &cmd) < 0)
if (scanfc(fin, "%c", &cmd) < 1)
return -1;
/* Extended response protocol requested with leading '+' on command
@ -214,7 +216,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
*/
if (cmd == '+' && !prompt) {
ext_resp = 1;
if (scanfc(fin, "%c", &cmd) < 0)
if (scanfc(fin, "%c", &cmd) < 1)
return -1;
} else if (cmd == '+' && prompt) {
return 0;
@ -223,7 +225,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
if (cmd != '\\' && cmd != '_' && cmd != '#' && ispunct(cmd) && !prompt) {
ext_resp = 1;
resp_sep = cmd;
if (scanfc(fin, "%c", &cmd) < 0)
if (scanfc(fin, "%c", &cmd) < 1)
return -1;
} else if (cmd != '\\' && cmd != '?' && cmd != '_' && cmd != '#' && ispunct(cmd) && prompt) {
return 0;
@ -234,11 +236,11 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
unsigned char cmd_name[MAXNAMSIZ], *pcmd = cmd_name;
int c_len = MAXNAMSIZ;
if (scanfc(fin, "%c", pcmd) < 0)
if (scanfc(fin, "%c", pcmd) < 1)
return -1;
while(c_len-- && (isalnum(*pcmd) || *pcmd == '_' ))
if (scanfc(fin, "%c", ++pcmd) < 0)
if (scanfc(fin, "%c", ++pcmd) < 1)
return -1;
*pcmd = '\0';
@ -262,7 +264,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
/* comment line */
if (cmd == '#') {
while( cmd != '\n' && cmd != '\r')
if (scanfc(fin, "%c", &cmd) < 0)
if (scanfc(fin, "%c", &cmd) < 1)
return -1;
return 0;
}
@ -298,9 +300,11 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
char *nl;
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg1);
fgets(arg1, MAXARGSZ, fin);
if (fgets(arg1, MAXARGSZ, fin) == NULL)
return -1;
if (arg1[0] == 0xa)
fgets(arg1, MAXARGSZ, fin);
if (fgets(arg1, MAXARGSZ, fin) == NULL)
return -1;
nl = strchr(arg1, 0xa);
if (nl) *nl = '\0'; /* chomp */
p1 = arg1[0]==' '?arg1+1:arg1;
@ -316,7 +320,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
if (interactive) {
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg1);
if (scanfc(fin, "%s", arg1) < 0)
if (scanfc(fin, "%s", arg1) < 1)
return -1;
p1 = arg1;
} else {
@ -332,7 +336,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
if (interactive) {
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg2);
if (scanfc(fin, "%s", arg2) < 0)
if (scanfc(fin, "%s", arg2) < 1)
return -1;
p2 = arg2;
} else {
@ -348,7 +352,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
if (interactive) {
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg3);
if (scanfc(fin, "%s", arg3) < 0)
if (scanfc(fin, "%s", arg3) < 1)
return -1;
p3 = arg3;
} else {
@ -365,7 +369,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
if (interactive) {
if (prompt)
fprintf(fout, "%s: ", cmd_entry->arg4);
if (scanfc(fin, "%s", arg4) < 0)
if (scanfc(fin, "%s", arg4) < 1)
return -1;
p4 = arg4;
} else {
@ -409,7 +413,8 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc)
}
retcode = (*cmd_entry->rot_routine)(my_rot, fout, interactive,
cmd_entry, p1, p2, p3, p4, p5, p6);
cmd_entry, p1, p2 ? p2 : "", p3 ? p3 : "",
p4 ? p4 : "", p5 ? p5 : "", p6 ? p6 : "");
#ifdef HAVE_PTHREAD
pthread_mutex_unlock(&rot_mutex);
@ -567,8 +572,8 @@ declare_proto_rot(set_position)
azimuth_t az;
elevation_t el;
sscanf(arg1, "%f", &az);
sscanf(arg2, "%f", &el);
CHKSCN1ARG(sscanf(arg1, "%f", &az));
CHKSCN1ARG(sscanf(arg2, "%f", &el));
return rot_set_position(rot, az, el);
}
@ -609,7 +614,7 @@ declare_proto_rot(reset)
{
rot_reset_t reset;
sscanf(arg1, "%d", &reset);
CHKSCN1ARG(sscanf(arg1, "%d", &reset));
return rot_reset(rot, reset);
}
@ -632,8 +637,8 @@ declare_proto_rot(move)
int direction;
int speed;
sscanf(arg1, "%d", &direction);
sscanf(arg2, "%d", &speed);
CHKSCN1ARG(sscanf(arg1, "%d", &direction));
CHKSCN1ARG(sscanf(arg2, "%d", &speed));
return rot_move(rot, direction, speed);
}
@ -643,8 +648,8 @@ declare_proto_rot(inter_set_conf)
token_t token;
char val[21] = ""; /* 20 chars enough? */
sscanf(arg1, "%ld", &token);
sscanf(arg2, "%s", val);
CHKSCN1ARG(sscanf(arg1, "%ld", &token));
CHKSCN1ARG(sscanf(arg2, "%s", val));
return rot_set_conf(rot, token, val);
}
@ -787,9 +792,9 @@ declare_proto_rot(lonlat2loc)
double lat, lon;
int err, pair;
sscanf(arg1, "%lf", &lon);
sscanf(arg2, "%lf", &lat);
sscanf(arg3, "%d", &pair);
CHKSCN1ARG(sscanf(arg1, "%lf", &lon));
CHKSCN1ARG(sscanf(arg2, "%lf", &lat));
CHKSCN1ARG(sscanf(arg3, "%d", &pair));
pair /= 2;
@ -812,7 +817,7 @@ declare_proto_rot(loc2lonlat)
double lat, lon;
int status;
sscanf(arg1, "%s", (char *)&loc);
CHKSCN1ARG(sscanf(arg1, "%s", (char *)&loc));
status = locator2longlat(&lon, &lat, (const char *)loc);
@ -835,10 +840,10 @@ declare_proto_rot(d_m_s2dec)
int deg, min, sw;
double sec, dec_deg;
sscanf(arg1, "%d", &deg);
sscanf(arg2, "%d", &min);
sscanf(arg3, "%lf", &sec);
sscanf(arg4, "%d", &sw);
CHKSCN1ARG(sscanf(arg1, "%d", &deg));
CHKSCN1ARG(sscanf(arg2, "%d", &min));
CHKSCN1ARG(sscanf(arg3, "%lf", &sec));
CHKSCN1ARG(sscanf(arg4, "%d", &sw));
dec_deg = dms2dec(deg, min, sec, sw);
@ -855,7 +860,7 @@ declare_proto_rot(dec2d_m_s)
int deg, min, sw, err;
double sec, dec_deg;
sscanf(arg1, "%lf", &dec_deg);
CHKSCN1ARG(sscanf(arg1, "%lf", &dec_deg));
err = dec2dms(dec_deg, &deg, &min, &sec, &sw);
@ -884,9 +889,9 @@ declare_proto_rot(d_mm2dec)
int deg, sw;
double dec_deg, min;
sscanf(arg1, "%d", &deg);
sscanf(arg2, "%lf", &min);
sscanf(arg3, "%d", &sw);
CHKSCN1ARG(sscanf(arg1, "%d", &deg));
CHKSCN1ARG(sscanf(arg2, "%lf", &min));
CHKSCN1ARG(sscanf(arg3, "%d", &sw));
dec_deg = dmmm2dec(deg, min, sw);
@ -903,7 +908,7 @@ declare_proto_rot(dec2d_mm)
int deg, sw, err;
double min, dec_deg;
sscanf(arg1, "%lf", &dec_deg);
CHKSCN1ARG(sscanf(arg1, "%lf", &dec_deg));
err = dec2dmmm(dec_deg, &deg, &min, &sw);
@ -929,10 +934,10 @@ declare_proto_rot(coord2qrb)
double lon1, lat1, lon2, lat2, dist, az;
int err;
sscanf(arg1, "%lf", &lon1);
sscanf(arg2, "%lf", &lat1);
sscanf(arg3, "%lf", &lon2);
sscanf(arg4, "%lf", &lat2);
CHKSCN1ARG(sscanf(arg1, "%lf", &lon1));
CHKSCN1ARG(sscanf(arg2, "%lf", &lat1));
CHKSCN1ARG(sscanf(arg3, "%lf", &lon2));
CHKSCN1ARG(sscanf(arg4, "%lf", &lat2));
err = qrb(lon1, lat1, lon2, lat2, &dist, &az);
@ -954,7 +959,7 @@ declare_proto_rot(az_sp2az_lp)
{
double az_sp, az_lp;
sscanf(arg1, "%lf", &az_sp);
CHKSCN1ARG(sscanf(arg1, "%lf", &az_sp));
az_lp = azimuth_long_path(az_sp);
@ -973,7 +978,7 @@ declare_proto_rot(dist_sp2dist_lp)
{
double dist_sp, dist_lp;
sscanf(arg1, "%lf", &dist_sp);
CHKSCN1ARG(sscanf(arg1, "%lf", &dist_sp));
dist_lp = distance_long_path(dist_sp);