- AsconStdProtocol: arguments may be given as name=value

This commit is contained in:
zolliker
2011-03-25 14:21:39 +00:00
parent 045029dfd3
commit 2efb59c7f0

85
ascon.c
View File

@ -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;
}