[9] | 1 | #include "sysutil.h"
|
---|
| 2 | #include <stdlib.h>
|
---|
| 3 | #include <string.h>
|
---|
| 4 |
|
---|
| 5 |
|
---|
| 6 | /*=========================================================================*
|
---|
| 7 | * env_parse *
|
---|
| 8 | *=========================================================================*/
|
---|
| 9 | PUBLIC int env_parse(env, fmt, field, param, min, max)
|
---|
| 10 | char *env; /* environment variable to inspect */
|
---|
| 11 | char *fmt; /* template to parse it with */
|
---|
| 12 | int field; /* field number of value to return */
|
---|
| 13 | long *param; /* address of parameter to get */
|
---|
| 14 | long min, max; /* minimum and maximum values for the parameter */
|
---|
| 15 | {
|
---|
| 16 | /* Parse an environment variable setting, something like "DPETH0=300:3".
|
---|
| 17 | * Panic if the parsing fails. Return EP_UNSET if the environment variable
|
---|
| 18 | * is not set, EP_OFF if it is set to "off", EP_ON if set to "on" or a
|
---|
| 19 | * field is left blank, or EP_SET if a field is given (return value through
|
---|
| 20 | * *param). Punctuation may be used in the environment and format string,
|
---|
| 21 | * fields in the environment string may be empty, and punctuation may be
|
---|
| 22 | * missing to skip fields. The format string contains characters 'd', 'o',
|
---|
| 23 | * 'x' and 'c' to indicate that 10, 8, 16, or 0 is used as the last argument
|
---|
| 24 | * to strtol(). A '*' means that a field should be skipped. If the format
|
---|
| 25 | * string contains something like "\4" then the string is repeated 4 characters
|
---|
| 26 | * to the left.
|
---|
| 27 | */
|
---|
| 28 | char *val, *end;
|
---|
| 29 | char value[EP_BUF_SIZE];
|
---|
| 30 | char PUNCT[] = ":,;.";
|
---|
| 31 | long newpar;
|
---|
| 32 | int s, i, radix, r, keylen;
|
---|
| 33 |
|
---|
| 34 | if ((s=env_get_param(env, value, sizeof(value))) != 0) {
|
---|
| 35 | if (s == ESRCH) return(EP_UNSET); /* only error allowed */
|
---|
| 36 | printf("WARNING: get_mon_param() failed in env_parse(): %d\n",s);
|
---|
| 37 | return(EP_EGETKENV);
|
---|
| 38 | }
|
---|
| 39 | val = value;
|
---|
| 40 | if (strcmp(val, "off") == 0) return(EP_OFF);
|
---|
| 41 | if (strcmp(val, "on") == 0) return(EP_ON);
|
---|
| 42 |
|
---|
| 43 | i = 0;
|
---|
| 44 | r = EP_ON;
|
---|
| 45 | for (;;) {
|
---|
| 46 | while (*val == ' ') val++; /* skip spaces */
|
---|
| 47 | if (*val == 0) return(r); /* the proper exit point */
|
---|
| 48 | if (*fmt == 0) break; /* too many values */
|
---|
| 49 |
|
---|
| 50 | if (strchr(PUNCT, *val) != NULL) {
|
---|
| 51 | /* Time to go to the next field. */
|
---|
| 52 | if (strchr(PUNCT, *fmt) != NULL) i++;
|
---|
| 53 | if (*fmt++ == *val) val++;
|
---|
| 54 | if (*fmt < 32) fmt -= *fmt; /* step back? */
|
---|
| 55 | } else {
|
---|
| 56 | /* Environment contains a value, get it. */
|
---|
| 57 | switch (*fmt) {
|
---|
| 58 | case '*': radix = -1; break;
|
---|
| 59 | case 'd': radix = 10; break;
|
---|
| 60 | case 'o': radix = 010; break;
|
---|
| 61 | case 'x': radix = 0x10; break;
|
---|
| 62 | case 'c': radix = 0; break;
|
---|
| 63 | default: goto badenv;
|
---|
| 64 | }
|
---|
| 65 |
|
---|
| 66 | if (radix < 0) {
|
---|
| 67 | /* Skip. */
|
---|
| 68 | while (strchr(PUNCT, *val) == NULL) val++;
|
---|
| 69 | continue;
|
---|
| 70 | } else {
|
---|
| 71 | /* A number. */
|
---|
| 72 | newpar = strtol(val, &end, radix);
|
---|
| 73 |
|
---|
| 74 | if (end == val) break; /* not a number */
|
---|
| 75 | val = end;
|
---|
| 76 | }
|
---|
| 77 |
|
---|
| 78 | if (i == field) {
|
---|
| 79 | /* The field requested. */
|
---|
| 80 | if (newpar < min || newpar > max) break;
|
---|
| 81 | *param = newpar;
|
---|
| 82 | r = EP_SET;
|
---|
| 83 | }
|
---|
| 84 | }
|
---|
| 85 | }
|
---|
| 86 | badenv:
|
---|
| 87 | env_panic(env);
|
---|
| 88 | }
|
---|
| 89 |
|
---|
| 90 |
|
---|