00001 #include "sysutil.h"
00002 #include <stdlib.h>
00003 #include <string.h>
00004
00005
00006
00007
00008
00009 PUBLIC int env_parse(env, fmt, field, param, min, max)
00010 char *env;
00011 char *fmt;
00012 int field;
00013 long *param;
00014 long min, max;
00015 {
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 char *val, *end;
00029 char value[EP_BUF_SIZE];
00030 char PUNCT[] = ":,;.";
00031 long newpar;
00032 int s, i, radix, r, keylen;
00033
00034 if ((s=env_get_param(env, value, sizeof(value))) != 0) {
00035 if (s == ESRCH) return(EP_UNSET);
00036 printf("WARNING: get_mon_param() failed in env_parse(): %d\n",s);
00037 return(EP_EGETKENV);
00038 }
00039 val = value;
00040 if (strcmp(val, "off") == 0) return(EP_OFF);
00041 if (strcmp(val, "on") == 0) return(EP_ON);
00042
00043 i = 0;
00044 r = EP_ON;
00045 for (;;) {
00046 while (*val == ' ') val++;
00047 if (*val == 0) return(r);
00048 if (*fmt == 0) break;
00049
00050 if (strchr(PUNCT, *val) != NULL) {
00051
00052 if (strchr(PUNCT, *fmt) != NULL) i++;
00053 if (*fmt++ == *val) val++;
00054 if (*fmt < 32) fmt -= *fmt;
00055 } else {
00056
00057 switch (*fmt) {
00058 case '*': radix = -1; break;
00059 case 'd': radix = 10; break;
00060 case 'o': radix = 010; break;
00061 case 'x': radix = 0x10; break;
00062 case 'c': radix = 0; break;
00063 default: goto badenv;
00064 }
00065
00066 if (radix < 0) {
00067
00068 while (strchr(PUNCT, *val) == NULL) val++;
00069 continue;
00070 } else {
00071
00072 newpar = strtol(val, &end, radix);
00073
00074 if (end == val) break;
00075 val = end;
00076 }
00077
00078 if (i == field) {
00079
00080 if (newpar < min || newpar > max) break;
00081 *param = newpar;
00082 r = EP_SET;
00083 }
00084 }
00085 }
00086 badenv:
00087 env_panic(env);
00088 }
00089
00090