Blame | Last modification | View Log | RSS feed
/* -*- mode: c; tabs: 4; -*- ************************************************* Module name : longopt.c* Module type : CMDFILE source file* Environment(s): n/a** Version Who Date DescriptionAPY 12/99 Created05/10/04 -e/E exclusive check/error** $Source: /cvsroot/device/DEVL/UTILS/CMDFILE/longopt.c,v $* $Revision: 1.7 $ $Date: 2004/11/05 07:51:39 $ $State: Exp $* $Author: ayoung $ $Locker: $*.........................................................................*/#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include "getopt.h"#include "longopt.h"#include "cmdfile.h"#define VALID_OPTIONS "nNokreEvtwWmd"#define HAS_ARGUMENT "krmdW"#define OPTIONAL_ARGUMENT "k"static struct option const long_options[] ={{ "help", no_argument, 0, 'h' },{ "version", no_argument, 0, 'v' },{ 0, 0, 0, 0 }};/* Process long options --help and --version, but only if argc == 2.Be careful not to gobble up `--'. */voidparse_long_options( argc, argv, command_name, version_string, usage )int argc;char **argv;const char *command_name;const char *version_string;void (*usage)();{int c;int saved_opterr;int saved_optind;saved_opterr = opterr;saved_optind = optind;/* Don't print an error message for unrecognized options. */opterr = 0;if (argc == 2 &&(c = getoptl(argc, argv, "+", long_options, 0)) != EOF){switch (c){case 'h':(*usage)(0);case 'v':printf("%s - %s\n", command_name, version_string);exit(0);default:/* Don't process any other long-named options. */break;}}/* Restore previous value */opterr = saved_opterr;/* Restore optind in case it has advanced past a leading `--'. */optind = saved_optind;}intparse_short_argument( const register char *arg ){int argument = FALSE;register int i;/* If it appears that we are handling options, then make sure thatall of the options specified are actually valid. Otherwise, thestring should just be echoed. */for (i = 0; arg[i]; i++){if (arg[i] == 'o')break; /* must be last */if (argument)argument = FALSE; /* argument to previous */else{if (strrchr (VALID_OPTIONS, arg[i]) == 0){ /* not within valid list */if (vflg > 1)printf( "invalid character '%c' in option list -- ignored\n", arg[i] );return (-1);}if (strrchr (HAS_ARGUMENT, arg[i])){ /* argument expected */if (arg[i+1] == '\0'){if (!strrchr (OPTIONAL_ARGUMENT, arg[i])){if (vflg > 1)printf( "option '%c' missing argument -- ignored\n", arg[i] );return (-1);}}argument = TRUE;}}}/* All of the options are valid options ... handle them. */while (*arg){if (*arg == 'o'){arg++; /* skip 'o */if (strlen(arg) == 0)fatalerr("Missing -o");if (output != stdout) /* shouldn't happen */fatalerr("Second -o encountered \"%s\"", arg);oflg = arg;if (*oflg == '\0')fatalerr("Missing output file name");break;}else if (*arg == 'n') /* no newline */nflg = 0;else if (*arg == 'N')nlflg = 1; /* newline was seperator */else if (*arg == 'k'){if (arg[1] == '1')arg++, kflg++; /* lf/cr kludge */else if (arg[1] == '2')arg++, k2flg++; /* MRI kludge */else{kflg = 1;}}else if (*arg == 'r') /* inline realpath */{if (rflg == -1) /* remove default (if any) */rtags[ rflg = 0 ] = '\0';if (arg[1])rtags[ rflg++ ] = arg[1], arg++;}else if (*arg == 'e') {if (eflg != 1)fatalerr("-E and -e are exclusive");eflg = 2;}else if (*arg == 'E') {if (eflg != 1)fatalerr("-E and -e are exclusive");eflg = 0;}else if (*arg == 'v')vflg++;else if (*arg == 'c')cflg++;else if (*arg == 'M')Mflg++;else if (*arg == 't')tflg++;else if (*arg == 'w')wflg++;else if (*arg == 'W') /* whitespace handling */{switch(arg[1]) {case '0': /* method 0: nothing */case '-':whitespace = WS_IGNORE;break;case '1': /* method 1: escape */case 'e':whitespace = WS_ESCAPE;break;case '2': /* method 2: quote path */case 'q':whitespace = WS_QUOTE;break;/* case '3': */ /* method 3: junk *//* case 'j': *//* whitespace = WS_JUNK; *//* break; *//* case '4': */ /* method 4: URL *//* case 'u': *//* whitespace = WS_URL; *//* break; */default:fatalerr( "Unknown -W specification '%c'", arg[1] );break;}arg++;}else if (*arg == 'm' && arg[1])mflg = arg[1], arg++;else if (*arg == 'd' && arg[1]){dflg[0] = arg[1]; /* known pairs */if (dflg[0] == '(') dflg[1] = ')';else if (dflg[0] == '{') dflg[1] = '}';else if (dflg[0] == '[') dflg[1] = ']';else if (dflg[0] == '<') dflg[1] = '>';else dflg[1] = arg[1]; /* single */arg++;}else{return (-1); /* unknown, exit arg loop */}arg++;}return (1);}