Initial revision
[sw-tools] / src / sw_env.h
1 /* -*-c-*-
2 *
3 * $Id: sw_env.h,v 1.1 1999/06/02 16:53:35 mdw Exp $
4 *
5 * Mangling of environment variables
6 *
7 * (c) 1999 EBI
8 */
9
10 /*----- Licensing notice --------------------------------------------------*
11 *
12 * This file is part of sw-tools.
13 *
14 * sw-tools is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * sw-tools is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with sw-tools; if not, write to the Free Software Foundation,
26 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 */
28
29 /*----- Revision history --------------------------------------------------*
30 *
31 * $Log: sw_env.h,v $
32 * Revision 1.1 1999/06/02 16:53:35 mdw
33 * Initial revision
34 *
35 */
36
37 #ifndef SW_ENV_H
38 #define SW_ENV_H
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 /*----- Header files ------------------------------------------------------*/
45
46 #include <stdio.h>
47
48 #include <mLib/dstr.h>
49 #include <mLib/sym.h>
50
51 /*----- Important constants -----------------------------------------------*/
52
53 enum {
54 ENV_OK = 0, /* Parsed OK */
55 ENV_EOF, /* End-of-file encountered */
56 ENV_VCHAR, /* Bad character in variable name */
57 ENV_SUBST, /* Bad parameter substitution */
58 ENV_QUOTE, /* Mismatched quote */
59 ENV_BRACE, /* Missing brace character */
60 ENV_SYSTEM, /* System error (see @errno@) */
61 ENV_INTERNAL /* Internal error */
62 };
63
64 enum {
65 EVF_INCSPC = 1, /* Allow spaces in values */
66 EVF_BACKTICK = 2, /* Make backtick self-delimiting */
67 EVF_SKIP = 4, /* Skipping this section of text */
68 EVF_INITSPC = 8 /* Allow and ignore leading space */
69 };
70
71 /*----- Functions provided ------------------------------------------------*/
72
73 /* --- @env_get@ --- *
74 *
75 * Arguments: @sym_table *t@ = pointer to a symbol table
76 * @const char *name@ = pointer to variable name to look up
77 *
78 * Returns: Pointer to corresponding value string, or null.
79 *
80 * Use: Looks up an environment variable in the table and returns its
81 * value. If the variable can't be found, a null pointer is
82 * returned.
83 */
84
85 extern char *env_get(sym_table */*t*/, const char */*name*/);
86
87 /* --- @env_put@ --- *
88 *
89 * Arguments: @sym_table *t@ = pointer to a symbol table
90 * @const char *name@ = pointer to variable name to set
91 * @const char *value@ = pointer to value string to assign
92 *
93 * Returns: ---
94 *
95 * Use: Assigns a value to a variable. If the @name@ contains an
96 * equals character, then it's assumed to be of the form
97 * `VAR=VALUE' and @value@ argument is ignored. Otherwise, if
98 * @value@ is null, the variable is deleted. Finally, the
99 * normal case: @name@ is a plain name, and @value@ is a normal
100 * string causes the variable to be assigned the value in the
101 * way you'd expect.
102 */
103
104 extern void env_put(sym_table */*t*/,
105 const char */*name*/, const char */*value*/);
106
107 /* --- @env_import@ --- *
108 *
109 * Arguments: @sym_table *t@ = pointer to a symbol table
110 * @char **env@ = pointer to an environment list
111 *
112 * Returns: ---
113 *
114 * Use: Inserts all of the environment variables listed into a symbol
115 * table for rapid access. Equivalent to a lot of calls to
116 * @env_put@.
117 */
118
119 extern void env_import(sym_table */*t*/, char **/*env*/);
120
121 /* --- @env_export@ --- *
122 *
123 * Arguments: @sym_table *t@ = pointer to a symbol table
124 *
125 * Returns: A big environment list.
126 *
127 * Use: Extracts an environment table from a symbol table
128 * representation of an environment. The table and all of the
129 * strings are in one big block allocated from the heap.
130 */
131
132 extern char **env_export(sym_table */*t*/);
133
134 /* --- @env_destroy@ --- *
135 *
136 * Arguments: @sym_table *t@ = pointer to symbol table
137 *
138 * Returns: ---
139 *
140 * Use: Destroys all the variables in the symbol table.
141 */
142
143 extern void env_destroy(sym_table */*t*/);
144
145 /* --- @env_error@ --- *
146 *
147 * Arguments: @int e@ = error code
148 *
149 * Returns: String representation of error.
150 *
151 * Use: Transforms an error into something a user can understand.
152 */
153
154 extern const char *env_error(int /*e*/);
155
156 /* --- @env_var@ --- *
157 *
158 * Arguments: @sym_table *t@ = pointer to symbol table
159 * @FILE *fp@ = pointer to stream to read from
160 * @dstr *d@ = pointer to output variable
161 *
162 * Returns: One of the @ENV_@ constants.
163 *
164 * Use: Scans a variable name from the input stream.
165 */
166
167 extern int env_var(sym_table */*t*/, FILE */*fp*/, dstr */*d*/);
168
169 /* --- @env_value@ --- *
170 *
171 * Arguments: @sym_table *t@ = pointer to symbol table
172 * @FILE *fp@ = pointer to stream to read from
173 * @dstr *d@ = pointer to output variable
174 * @unsigned f@ = various interesting flags
175 *
176 * Returns: 0 if OK, @EOF@ if end-of-file encountered, or >0 on error.
177 *
178 * Use: Scans a value from the input stream. The value read may be
179 * quoted in a Bourne-shell sort of a way, and contain Bourne-
180 * shell-like parameter substitutions. Some substitutions
181 * aren't available because they're too awkward to implement.
182 */
183
184 extern int env_value(sym_table */*t*/, FILE */*fp*/,
185 dstr */*d*/, unsigned /*f*/);
186
187 /* --- @env_read@ --- *
188 *
189 * Arguments: @sym_table *t@ = pointer to symbol table
190 * @FILE *fp@ = file handle to read
191 * @unsigned f@ = various flags
192 *
193 * Returns: Zero if OK, @EOF@ for end-of-file, or error code.
194 *
195 * Use: Reads the environment assignment statements in the file.
196 */
197
198 extern int env_read(sym_table */*t*/, FILE */*fp*/, unsigned /*f*/);
199
200 /* --- @env_file@ --- *
201 *
202 * Arguments: @sym_table *t@ = pointer to symbol table
203 * @const char *name@ = pointer to filename
204 *
205 * Returns: Zero if OK, or an error code.
206 *
207 * Use: Reads a named file of environment assignments.
208 */
209
210 extern int env_file(sym_table */*t*/, const char */*name*/);
211
212 /*----- That's all, folks -------------------------------------------------*/
213
214 #ifdef __cplusplus
215 }
216 #endif
217
218 #endif