diff options
Diffstat (limited to 'scm.c')
| -rwxr-xr-x[-rw-r--r--] | scm.c | 23 | 
1 files changed, 20 insertions, 3 deletions
| @@ -166,7 +166,7 @@ void process_signals()    /* printf("process_signals; output_deferred=%d\n", output_deferred); fflush(stdout); */    if (output_deferred) {      output_deferred = 0; -    /* if (NIMP(sys_errp) && OPOUTPORTP(sys_errp)) lfflush(sys_errp); */ +    if (NIMP(sys_errp) && OPOUTPORTP(sys_errp)) lfflush(sys_errp);    }    for (n = 0; SIG_deferred && n < NUM_SIGNALS; n++) {      if (SIG_deferred & mask) { @@ -544,6 +544,8 @@ static void init_sig1(scm_err, signo, handler)  void init_signals()  {  #ifdef WINSIGNALS +    /* Added to allow gcc -O2 to work. */ +  volatile unsigned long dont_optimize_me = (unsigned long)scmable_signal;    init_sig1(INT_SIGNAL, SIGINT, win32_sigint);  #else  # ifdef SIGINT @@ -861,6 +863,7 @@ SCM scm_execpath(newpath)    strncpy(execpath, CHARS(newpath), LENGTH(newpath) + 1);    return retval;  } +/* Return 0 if getcwd() returns 0. */  char *scm_find_execpath(argc, argv, script_arg)       int argc;       const char * const *argv; @@ -916,12 +919,26 @@ SCM lsystem(cmd)  }  #endif +extern char **environ;		/* The Linux man page says this +				   declaration is necessary. */  char s_getenv[] = "getenv";  char *getenv(); -SCM lgetenv(nam) +SCM scm_getenv(nam)       SCM nam;  {    char *val; +  if (UNBNDP(nam)) { +    char **nvrnmnt = environ; +    SCM lst = EOL; +    do { +      char *eql = strchr(*nvrnmnt, '='); +      ASRTER(eql, makfrom0str(*nvrnmnt), "Bad environ", s_getenv); +      lst = cons(cons(makfromstr(*nvrnmnt, eql - *nvrnmnt), +		      makfrom0str(eql + 1)), +		 lst); +    } while (*++nvrnmnt); +    return lst; +  }    ASRTER(NIMP(nam) && STRINGP(nam), nam, ARG1, s_getenv);    val = getenv(CHARS(nam));    if (!val) return BOOL_F; @@ -968,7 +985,6 @@ static iproc subr0s[] = {  #endif  	{0, 0}};  static iproc subr1s[] = { -	{s_getenv, lgetenv},  #ifndef _Windows  	{s_system, lsystem},  #endif @@ -1002,6 +1018,7 @@ void init_features()    init_iprocs(subr0s, tc7_subr_0);    init_iprocs(subr1s, tc7_subr_1);    make_subr(s_execpath, tc7_subr_1o, scm_execpath); +  make_subr(s_getenv, tc7_subr_1o, scm_getenv);  #ifdef SIGALRM  # ifdef SIGPROF    make_subr(s_setitimer, tc7_subr_3, scm_setitimer); | 
