- AsconStdProtocol: arguments may be given as name=value
This commit is contained in:
85
ascon.c
85
ascon.c
@ -391,8 +391,11 @@ AsconHandler AsconSetHandler(Ascon *a, SConnection *con,
|
||||
if (strcasecmp(argv[0], "std") == 0) {
|
||||
if (argc < 2)
|
||||
return NULL;
|
||||
AsconStdInit(a, con, argc, argv);
|
||||
return AsconStdHandler;
|
||||
if (AsconStdInit(a, con, argc, argv)) {
|
||||
return AsconStdHandler;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
for (p = protocols; p!= NULL; p=p->next) {
|
||||
if (strcasecmp(p->name, argv[0]) == 0) {
|
||||
@ -492,26 +495,84 @@ int AsconStdHandler(Ascon * a)
|
||||
return AsconBaseHandler(a);
|
||||
}
|
||||
|
||||
int AsconInterpreteArgs(int argc, char *argv[],
|
||||
int parc, char *parn[], char *pars[])
|
||||
{
|
||||
/* interprete arguments in the form "name=value" or
|
||||
with a fixed order. The result is 1 in case
|
||||
of success or 0 in case of an error. */
|
||||
|
||||
int ia, ip, l;
|
||||
|
||||
for (ip = 0; ip < parc; ip++) {
|
||||
pars[ip] = NULL;
|
||||
}
|
||||
if (argc == 0) return 1;
|
||||
if (strchr(argv[0], '=') == NULL) {
|
||||
for (ia = 0; ia < argc; ia++) {
|
||||
if (ia >= ip) {
|
||||
return 0;
|
||||
}
|
||||
if (strchr(argv[ia], '=') != NULL) {
|
||||
return 0;
|
||||
}
|
||||
pars[ia] = argv[ia];
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
for (ia = 0; ia < argc; ia++) {
|
||||
for (ip = 0; ip < parc; ip++) {
|
||||
l = strlen(parn[ip]);
|
||||
if (strncasecmp(argv[ia], parn[ip], l) == 0 && argv[ia][l] == '=') {
|
||||
pars[ip] = argv[ia] + l + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ip >= parc) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int AsconStdInit(Ascon *a, SConnection *con, int argc, char *argv[])
|
||||
{
|
||||
enum nPars {NA=4};
|
||||
char *pars[NA];
|
||||
static char *parn[NA]={
|
||||
"sendterminator",
|
||||
"timeout",
|
||||
"replyterminator",
|
||||
"lineseparator"
|
||||
};
|
||||
char *msg;
|
||||
|
||||
assert(argc>1);
|
||||
a->hostport = strdup(argv[1]);
|
||||
if (argc > 2) {
|
||||
a->sendTerminator = strdup(argv[2]);
|
||||
|
||||
if (!AsconInterpreteArgs(argc-2, argv+2, NA, parn, pars)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (pars[0]) {
|
||||
a->sendTerminator = strdup(pars[0]);
|
||||
} else {
|
||||
a->sendTerminator = strdup("\n");
|
||||
}
|
||||
if (argc > 3) {
|
||||
a->timeout = atof(argv[3]);
|
||||
if (pars[1] && pars[2] != '\0') {
|
||||
a->timeout = atof(pars[1]);
|
||||
} else {
|
||||
a->timeout = 2.0; /* sec */
|
||||
}
|
||||
a->replyTerminator = NULL;
|
||||
if (argc > 4 && argv[4][0] != '\0') {
|
||||
a->replyTerminator = strdup(argv[4]);
|
||||
if (pars[2] && pars[2][0] != '\0') {
|
||||
a->replyTerminator = strdup(pars[2]);
|
||||
} else {
|
||||
a->replyTerminator = NULL;
|
||||
}
|
||||
a->separator = NULL;
|
||||
if (argc > 5 && argv[5][0] != '\0') {
|
||||
a->separator = strdup(argv[5]);
|
||||
if (pars[3] && pars[3][0] != '\0') {
|
||||
a->separator = strdup(pars[3]);
|
||||
} else {
|
||||
a->separator = NULL;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user