00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 #include <ctype.h>
00005 #include "getargs.h"
00006
00007
00008
00009
00010
00011 void print_usage (
00012 #ifdef PROTOTYPE
00013 char **usgmsg, char *errmsg)
00014 #else
00015 usgmsg, errmsg)
00016 char **usgmsg, *errmsg;
00017 #endif
00018 {
00019 int n;
00020
00021 if (NULL != errmsg)
00022 fprintf (stderr, "ERROR: %s\n", errmsg);
00023 for (n = 0; NULL != usgmsg[n]; n++)
00024 fprintf (stderr, "%s\n", usgmsg[n]);
00025 exit (NULL != errmsg);
00026 }
00027
00028
00029
00030
00031
00032
00033 int argind = 0;
00034 int argerr = 1;
00035 char *argarg;
00036
00037 int getargs (
00038 #ifdef PROTOTYPE
00039 int argc, char **argv, char *ostr)
00040 #else
00041 argc, argv, ostr)
00042 int argc;
00043 char **argv, *ostr;
00044 #endif
00045 {
00046 int argopt;
00047 char *oli;
00048 static char *place;
00049 static int nextarg;
00050
00051
00052
00053 if (!argind)
00054 nextarg = 1;
00055
00056 if (nextarg) {
00057 if (argind >= argc || ++argind == argc) {
00058 argarg = NULL;
00059 return (-1);
00060 }
00061 if ('-' != argv[argind][0]) {
00062 argarg = argv[argind];
00063 return (0);
00064 }
00065 place = argarg = &argv[argind][1];
00066 if (!*place) {
00067 if (++argind == argc) {
00068 argarg = NULL;
00069 return (-1);
00070 }
00071 argarg = argv[argind];
00072 return (0);
00073 }
00074 nextarg = 0;
00075 }
00076
00077
00078
00079 if ((argopt = *place++) == ':' || argopt == ';' ||
00080 (oli = strchr (ostr, argopt)) == NULL) {
00081 if (argerr) {
00082 fprintf (stderr, "invalid option - `%c'\n", argopt);
00083 exit (-1);
00084 }
00085 return (argopt);
00086 }
00087
00088
00089
00090 if (*++oli != ':') {
00091 if (*place && *oli == ';') {
00092 argarg = place;
00093 nextarg = 1;
00094 }
00095 else {
00096 argarg = NULL;
00097 if (!*place)
00098 nextarg = 1;
00099 }
00100 return (argopt);
00101 }
00102
00103
00104
00105 if (!*place) {
00106 if (++argind >= argc) {
00107 if (!argerr) return (':');
00108 fprintf (stderr, "missing argument for option `%c'\n", argopt);
00109 exit (1);
00110 }
00111 place = argv[argind];
00112 }
00113 argarg = place;
00114 nextarg = 1;
00115 return (argopt);
00116 }