blob: c665fc1658c6b04552e94e9a8f78df3b350a5f8c [file] [log] [blame]
//------------------------------------------------------------------
//
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tutilp.h"
#include "tverslib.h"
static void arg_proc_args_usage2(TAD2 *args, char **argv);
VERS_LIB(libsbztutilp)
static bool arg_is_mon_number(char *arg) {
int inx;
int len;
len = (int) strlen(arg);
if ((len != 5) && (len != 6))
return false;
for (inx = 0; inx < len; inx++)
if (!isdigit(arg[inx]))
return false;
return true;
}
void arg_proc_args(TAD args[], bool inv_arg_ok, int argc, char **argv) {
int argi;
int count;
TAD2 *largs;
// convert TAD to TAD2 and then process
for (argi = 0; args[argi].iv_arg_type != TA_End; argi++) {
}
count = argi;
largs = new TAD2[count+1];
for (argi = 0; argi <= count; argi++) {
largs[argi].ip_arg_str = args[argi].ip_arg_str;
largs[argi].iv_arg_type = args[argi].iv_arg_type;
largs[argi].iv_arg_max = args[argi].iv_arg_max;
largs[argi].ip_arg_ref = args[argi].ip_arg_ref;
largs[argi].ipp_arg_strs = NULL;
}
arg_proc_args2(largs, inv_arg_ok, argc, argv);
delete [] largs;
}
void arg_proc_args2(TAD2 *args, bool inv_arg_ok, int argc, char **argv) {
int arg;
bool arg_ok;
bool arg_match;
int arg_max;
void *arg_ref;
bool *arg_ref_bool;
int *arg_ref_int;
short *arg_ref_shrt;
char **arg_ref_str;
int arg_start;
const char *arg_str;
TSD *arg_strs;
int arg_type;
char *argv_str;
int argi;
int argis;
// validate arg-table [in sorted order]
for (argi = 1; args[argi].iv_arg_type != TA_End; argi++)
assert(strcmp(args[argi].ip_arg_str, args[argi-1].ip_arg_str) > 0);
arg_start = 1;
#ifdef SQ_PHANDLE_VERIFIER
if (argc >= 11) {
// "SQMON1.1" <pnid> <nid> <pid> <pname> <port> <ptype> <zid> <verif> "SPARE"
// [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
if ((!strcmp(argv[1], "SQMON1.1")) &&
arg_is_mon_number(argv[2]) && // pnid
arg_is_mon_number(argv[3]) && // nid
arg_is_mon_number(argv[4]) && // pid
arg_is_mon_number(argv[7]) && // ptype
arg_is_mon_number(argv[8]) && // zid
(strlen(argv[5]) >= 2) && // pname
(argv[5][0] == '$'))
arg_start = 11;
}
#else
if (argc >= 10) {
// "SQMON1.0" <pnid> <nid> <pid> <pname> <port> <ptype> <zid> "SPARE"
// [1] [2] [3] [4] [5] [6] [7] [8] [9]
if ((!strcmp(argv[1], "SQMON1.0")) &&
arg_is_mon_number(argv[2]) && // pnid
arg_is_mon_number(argv[3]) && // nid
arg_is_mon_number(argv[4]) && // pid
arg_is_mon_number(argv[7]) && // ptype
arg_is_mon_number(argv[8]) && // zid
(strlen(argv[5]) >= 2) && // pname
(argv[5][0] == '$'))
arg_start = 10;
}
#endif
for (arg = arg_start; arg < argc; arg++) {
argv_str = argv[arg];
arg_ok = false;
for (argi = 0; args[argi].iv_arg_type != TA_End; argi++) {
if (argv_str == NULL)
break;
arg_str = args[argi].ip_arg_str;
if (strcmp(argv_str, arg_str) == 0) {
arg_ok = true;
arg_type = args[argi].iv_arg_type;
arg_max = args[argi].iv_arg_max;
arg_ref = args[argi].ip_arg_ref;
arg_strs = args[argi].ipp_arg_strs;
switch (arg_type) {
case TA_Bool:
assert(arg_ref != NULL);
arg_ref_bool = (bool *) arg_ref;
*arg_ref_bool = true;
break;
case TA_Ign:
assert(arg_ref == NULL);
break;
case TA_Int:
assert(arg_ref != NULL);
arg_ref_int = (int *) arg_ref;
arg++;
argv_str = argv[arg];
if (arg >= argc) {
printf("expecting <%s>\n", &arg_str[1]);
abort();
}
*arg_ref_int = atoi(argv_str);
if ((arg_max != TA_NOMAX) && (*arg_ref_int > arg_max))
*arg_ref_int = arg_max;
break;
case TA_Next:
assert(arg_ref == NULL);
arg++;
argv_str = argv[arg];
if (arg >= argc) {
printf("expecting <%s>\n", &arg_str[1]);
abort();
}
break;
case TA_Shrt:
assert(arg_ref != NULL);
arg_ref_shrt = (short *) arg_ref;
arg++;
argv_str = argv[arg];
if (arg >= argc) {
printf("expecting <%s>\n", &arg_str[1]);
abort();
}
*arg_ref_shrt = (short) atoi(argv_str);
if ((arg_max != TA_NOMAX) && (*arg_ref_shrt > arg_max))
*arg_ref_shrt = (short) arg_max;
break;
case TA_Str:
assert(arg_ref != NULL);
arg_ref_str = (char **) arg_ref;
arg++;
argv_str = argv[arg];
if (arg >= argc) {
printf("expecting <%s>\n", &arg_str[1]);
abort();
}
*arg_ref_str = argv_str;
if (arg_strs != NULL) {
arg_match = false;
for (argis = 0;
arg_strs[argis].ip_str != NULL;
argis++) {
if (strcmp(argv_str, arg_strs[argis].ip_str) == 0) {
arg_match = true;
break;
}
}
if (!arg_match) {
printf("expecting %s to be one of: ", arg_str);
for (argis = 0;
arg_strs[argis].ip_str != NULL;
argis++)
printf("%s ", arg_strs[argis].ip_str);
printf("\n");
abort();
}
}
break;
default:
printf("bad arg-type=%d\n", arg_type);
abort();
break;
}
break;
} else if (strcmp(argv_str, "-help") == 0) {
arg_proc_args_usage2(args, argv);
exit(1);
}
}
if (!inv_arg_ok && !arg_ok) {
printf("unexpected arg '%s'\n", argv_str);
arg_proc_args_usage2(args, argv);
abort();
}
}
}
void arg_proc_args_usage2(TAD2 *args, char **argv) {
int argi;
char *argv0;
argv0 = rindex(argv[0], '/');
if (argv0 != NULL)
argv0++;
else
argv0 = argv[0];
printf("usage: %s", argv0);
for (argi = 0; args[argi].iv_arg_type != TA_End; argi++) {
switch (args[argi].iv_arg_type) {
case TA_Ign:
break;
default:
printf(" %s", args[argi].ip_arg_str);
}
switch (args[argi].iv_arg_type) {
case TA_Int:
case TA_Next:
case TA_Str:
printf(" <%s>", &args[argi].ip_arg_str[1]);
break;
default:
break;
}
}
printf("\n");
}
bool arg_proc_str(TSD strs[],
const char *str,
int *str_val) {
bool match;
int stri;
match = false;
for (stri = 0; strs[stri].ip_str != NULL; stri++) {
if (strcmp(str, strs[stri].ip_str) == 0) {
match = true;
break;
}
}
if (match)
*str_val = strs[stri].iv_str_val;
return match;
}