21#include <grass/glocale.h>
43static struct state *st = &state;
45static int read_env(
int);
46static int set_env(
const char *,
const char *,
int);
47static int unset_env(
const char *,
int);
48static const char *get_env(
const char *,
int);
49static void write_env(
int);
50static void parse_env(FILE *,
int);
51static void force_read_env(
int);
52static FILE *open_env(
const char *,
int);
85 read_env(G_VAR_GISRC);
86 read_env(G_VAR_MAPSET);
100 force_read_env(G_VAR_MAPSET);
114 force_read_env(G_VAR_GISRC);
127 st->gisrc = getenv(
"GISRC");
130 "GISRC environment variable not set"));
134static void parse_env(FILE *fd,
int loc)
138 char buf[GPATH_MAX + 16];
142 while (
G_getl2(buf,
sizeof buf, fd)) {
143 for (
name = value = buf; *value; value++)
153 set_env(
name, value, loc);
157static int read_env(
int loc)
162 if (loc == G_VAR_GISRC && st->varmode == G_GISRC_MODE_MEMORY)
168 if ((fd = open_env(
"r", loc))) {
182static void force_read_env(
int loc)
186 if ((fd = open_env(
"r", loc))) {
192static int set_env(
const char *
name,
const char *value,
int loc)
199 if (!value || !strlen(value)) {
200 unset_env(
name, loc);
208 unset_env(
name, loc);
218 for (n = 0; n < st->env.count; n++) {
219 struct bind *
b = &st->env.binds[n];
223 else if (strcmp(
b->name,
name) == 0 &&
b->loc == loc) {
231 struct bind *
b = &st->env.binds[empty];
240 if (st->env.count >= st->env.size) {
243 G_realloc(st->env.binds, st->env.size *
sizeof(
struct bind));
247 struct bind *
b = &st->env.binds[st->env.count++];
257static int unset_env(
const char *
name,
int loc)
261 for (n = 0; n < st->env.count; n++) {
262 struct bind *
b = &st->env.binds[n];
264 if (
b->name && strcmp(
b->name,
name) == 0 &&
b->loc == loc) {
274static const char *get_env(
const char *
name,
int loc)
278 for (n = 0; n < st->env.count; n++) {
279 struct bind *
b = &st->env.binds[n];
281 if (
b->name && (strcmp(
b->name,
name) == 0) &&
b->loc == loc)
288static void write_env(
int loc)
296 void (*sigquit)(int);
299 if (loc == G_VAR_GISRC && st->varmode == G_GISRC_MODE_MEMORY)
306 sigint = signal(SIGINT, SIG_IGN);
308 sigquit = signal(SIGQUIT, SIG_IGN);
310 if ((fd = open_env(
"w", loc))) {
311 for (n = 0; n < st->env.count; n++) {
312 struct bind *
b = &st->env.binds[n];
314 if (
b->name &&
b->value &&
b->loc == loc &&
315 (sscanf(
b->value,
"%1s", dummy) == 1))
316 fprintf(fd,
"%s: %s\n",
b->name,
b->value);
321 signal(SIGINT, sigint);
323 signal(SIGQUIT, sigquit);
327static FILE *open_env(
const char *mode,
int loc)
331 if (loc == G_VAR_GISRC) {
338 strcpy(buf, st->gisrc);
340 else if (loc == G_VAR_MAPSET) {
343 read_env(G_VAR_GISRC);
348 return fopen(buf, mode);
407 if (strcmp(
name,
"GISBASE") == 0)
410 read_env(G_VAR_GISRC);
412 return get_env(
name, G_VAR_GISRC);
426 if (strcmp(
name,
"GISBASE") == 0)
431 return get_env(
name, loc);
444 read_env(G_VAR_GISRC);
445 set_env(
name, value, G_VAR_GISRC);
446 write_env(G_VAR_GISRC);
462 set_env(
name, value, loc);
474 read_env(G_VAR_GISRC);
475 set_env(
name, value, G_VAR_GISRC);
489 set_env(
name, value, loc);
501 read_env(G_VAR_GISRC);
502 unset_env(
name, G_VAR_GISRC);
503 write_env(G_VAR_GISRC);
517 unset_env(
name, loc);
526 if (st->init[G_VAR_GISRC])
527 write_env(G_VAR_GISRC);
550 read_env(G_VAR_GISRC);
552 for (i = 0; i < st->env.count; i++)
553 if (st->env.binds[i].name && *st->env.binds[i].name && (n-- == 0))
554 return st->env.binds[i].name;
563 st->init[G_VAR_GISRC] = 0;
578 st->env.binds =
NULL;
580 for (i = 0; i < st->env2.count; i++) {
581 struct bind *
b = &st->env2.binds[i];
584 set_env(
b->name,
b->value, G_VAR_GISRC);
void G_free(void *buf)
Free allocated memory.
void G_initialize_done(int *p)
int G_is_initialized(int *p)
void G_setenv(const char *name, const char *value)
Set environment variable (updates .gisrc)
const char * G_getenv_nofatal2(const char *name, int loc)
Get environment variable from specific place.
void G_switch_env(void)
Switch environments.
const char * G_getenv2(const char *name, int loc)
Get variable from specific place.
void G__read_env(void)
Initialize init array for G_VAR_GISRC.
void G_setenv_nogisrc2(const char *name, const char *value, int loc)
Set environment name to value from specific place (doesn't update .gisrc)
void G_unsetenv(const char *name)
Remove name from environment.
void G_setenv2(const char *name, const char *value, int loc)
Set environment variable from specific place (updates .gisrc)
void G_unsetenv2(const char *name, int loc)
Remove name from environment from specific place.
void G__write_env(void)
Writes current environment to .gisrc.
void G__read_gisrc_env(void)
Force to read the GISRC environment file.
void G_set_gisrc_mode(int mode)
Set where to find/store variables.
const char * G_getenv_nofatal(const char *name)
Get environment variable.
void G__read_mapset_env(void)
Force to read the mapset environment file VAR.
void G_setenv_nogisrc(const char *name, const char *value)
Set environment name to value (doesn't update .gisrc)
const char * G_get_env_name(int n)
Get variable name for index n.
int G_get_gisrc_mode(void)
Get info where variables are stored.
void G_create_alt_env(void)
Set up alternative environment variables.
const char * G_getenv(const char *name)
Get environment variable.
void G__read_gisrc_path(void)
Read or read again the GISRC (session) environment variable.
void G_init_env(void)
Initialize variables.
int G_getl2(char *buf, int n, FILE *fd)
Gets a line of text from a file of any pedigree.
void G_fatal_error(const char *msg,...)
Print a fatal error message to stderr.
char * G_location_path(void)
Get current location UNIX-like path.
const char * G_mapset(void)
Get current mapset name.
char * G_store(const char *s)
Copy string to allocated memory.
void G_strip(char *buf)
Removes all leading and trailing white space from string.