From 2efb59c7f0c18e241fc861cc17d927eec109478c Mon Sep 17 00:00:00 2001 From: zolliker Date: Fri, 25 Mar 2011 14:21:39 +0000 Subject: [PATCH] - AsconStdProtocol: arguments may be given as name=value --- ascon.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 12 deletions(-) diff --git a/ascon.c b/ascon.c index 9086fc6c..999a9455 100644 --- a/ascon.c +++ b/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; }