Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion es.h
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,6 @@ extern Tree *parse(char *esprompt1, char *esprompt2);
extern Tree *parsestring(const char *str);
extern Boolean isinteractive(void);
extern Boolean isfromfd(void);
extern void initgetenv(void);
extern void initinput(void);
extern void resetparser(void);

Expand Down
67 changes: 0 additions & 67 deletions input.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
/* input.c -- read input from files or strings ($Revision: 1.2 $) */
/* stdgetenv is based on the FreeBSD getenv */

#include "es.h"
#include "input.h"
Expand Down Expand Up @@ -32,13 +31,6 @@ Boolean resetterminal = FALSE;
#include <readline/readline.h>
#endif

#if LOCAL_GETENV
static char *stdgetenv(const char *);
static char *esgetenv(const char *);
static char *(*realgetenv)(const char *) = stdgetenv;
#endif



/*
* errors and warnings
Expand Down Expand Up @@ -174,65 +166,6 @@ static char *callreadline(char *prompt0) {
}
#endif

#if LOCAL_GETENV
/* esgetenv -- fake version of getenv for readline (or other libraries) */
static char *esgetenv(const char *name) {
List *value = varlookup(name, NULL);
if (value == NULL)
return NULL;
else {
char *export;
static Dict *envdict;
static Boolean initialized = FALSE;
Ref(char *, string, NULL);

gcdisable();
if (!initialized) {
initialized = TRUE;
envdict = mkdict();
globalroot(&envdict);
}

string = dictget(envdict, name);
if (string != NULL)
efree(string);

export = str("%W", value);
string = ealloc(strlen(export) + 1);
strcpy(string, export);
envdict = dictput(envdict, (char *) name, string);

gcenable();
RefReturn(string);
}
}

static char *stdgetenv(const char *name) {
extern char **environ;
register int len;
register const char *np;
register char **p, *c;

if (name == NULL || environ == NULL)
return (NULL);
for (np = name; *np && *np != '='; ++np)
continue;
len = np - name;
for (p = environ; (c = *p) != NULL; ++p)
if (strncmp(c, name, len) == 0 && c[len] == '=') {
return (c + len + 1);
}
return (NULL);
}

char *getenv(const char *name) {
return realgetenv(name);
}

extern void initgetenv(void) {
realgetenv = esgetenv;
}
#endif

/* fdfill -- fill input buffer by reading from a file descriptor */
static int fdfill(Input *in) {
Expand Down
66 changes: 63 additions & 3 deletions var.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* var.c -- es variables ($Revision: 1.1.1.1 $) */
/* stdgetenv is based on the FreeBSD getenv */

#include "es.h"
#include "gc.h"
Expand Down Expand Up @@ -392,9 +393,6 @@ extern void initvars(void) {
vars = mkdict();
noexport = NULL;
env = mkvector(ENVSIZE);
#if LOCAL_GETENV
initgetenv();
#endif
}

/* importvar -- import a single environment variable */
Expand Down Expand Up @@ -451,6 +449,64 @@ static void importvar(char *name0, char *value) {
}

#if LOCAL_GETENV
static char *stdgetenv(const char *);
static char *esgetenv(const char *);
static char *(*realgetenv)(const char *) = stdgetenv;

/* esgetenv -- fake version of getenv for readline (or other libraries) */
static char *esgetenv(const char *name) {
List *value = varlookup(name, NULL);
if (value == NULL)
return NULL;
else {
char *export;
static Dict *envdict;
static Boolean initialized = FALSE;
Ref(char *, string, NULL);

gcdisable();
if (!initialized) {
initialized = TRUE;
envdict = mkdict();
globalroot(&envdict);
}

string = dictget(envdict, name);
if (string != NULL)
efree(string);

export = str("%W", value);
string = ealloc(strlen(export) + 1);
strcpy(string, export);
envdict = dictput(envdict, (char *) name, string);

gcenable();
RefReturn(string);
}
}

static char *stdgetenv(const char *name) {
extern char **environ;
register int len;
register const char *np;
register char **p, *c;

if (name == NULL || environ == NULL)
return (NULL);
for (np = name; *np && *np != '='; ++np)
continue;
len = np - name;
for (p = environ; (c = *p) != NULL; ++p)
if (strncmp(c, name, len) == 0 && c[len] == '=') {
return (c + len + 1);
}
return (NULL);
}

char *getenv(const char *name) {
return realgetenv(name);
}

extern int setenv(const char *name, const char *value, int overwrite) {
assert(vars != NULL);
if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL) {
Expand Down Expand Up @@ -536,4 +592,8 @@ extern void initenv(char **envp, Boolean protected) {
RefEnd2(var, imported);
envmin = env->count;
efree(buf);

#if LOCAL_GETENV
realgetenv = esgetenv;
#endif
}