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 |
|
---|