Annotation of 43BSDReno/contrib/emacs-18.55/src/environ.c, revision 1.1

1.1     ! root        1: /* Environment-hacking for GNU Emacs subprocess
        !             2:    Copyright (C) 1986 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU Emacs.
        !             5: 
        !             6: GNU Emacs is distributed in the hope that it will be useful,
        !             7: but WITHOUT ANY WARRANTY.  No author or distributor
        !             8: accepts responsibility to anyone for the consequences of using it
        !             9: or for whether it serves any particular purpose or works at all,
        !            10: unless he says so in writing.  Refer to the GNU Emacs General Public
        !            11: License for full details.
        !            12: 
        !            13: Everyone is granted permission to copy, modify and redistribute
        !            14: GNU Emacs, but only under the conditions described in the
        !            15: GNU Emacs General Public License.   A copy of this license is
        !            16: supposed to have been given to you along with GNU Emacs so you
        !            17: can know your rights and responsibilities.  It should be in a
        !            18: file named COPYING.  Among other things, the copyright notice
        !            19: and this notice must be preserved on all copies.  */
        !            20: 
        !            21: 
        !            22: #include "config.h"
        !            23: #include "lisp.h"
        !            24: 
        !            25: #ifdef MAINTAIN_ENVIRONMENT
        !            26: 
        !            27: #ifdef VMS
        !            28: you lose -- this is un*x-only
        !            29: #endif
        !            30: 
        !            31: /* alist of (name-string . value-string) */
        !            32: Lisp_Object Venvironment_alist;
        !            33: extern char **environ;
        !            34: 
        !            35: void
        !            36: set_environment_alist (str, val)
        !            37:      register Lisp_Object str, val;
        !            38: {
        !            39:   register Lisp_Object tem;
        !            40: 
        !            41:   tem = Fassoc (str, Venvironment_alist);
        !            42:   if (NULL (tem))
        !            43:     if (NULL (val))
        !            44:       ;
        !            45:     else
        !            46:       Venvironment_alist = Fcons (Fcons (str, val), Venvironment_alist);
        !            47:   else
        !            48:     if (NULL (val))
        !            49:       Venvironment_alist = Fdelq (tem, Venvironment_alist);
        !            50:     else
        !            51:       XCONS (tem)->cdr = val;
        !            52: }
        !            53: 
        !            54: 
        !            55: 
        !            56: static void
        !            57: initialize_environment_alist ()
        !            58: {
        !            59:   register unsigned char **e, *s;
        !            60:   extern char *index ();
        !            61: 
        !            62:   for (e = (unsigned char **) environ; *e; e++)
        !            63:     {
        !            64:       s = (unsigned char *) index (*e, '=');
        !            65:       if (s)
        !            66:        set_environment_alist (make_string (*e, s - *e),
        !            67:                               build_string (s + 1));
        !            68:     }
        !            69: }
        !            70: 
        !            71: 
        !            72: unsigned char *
        !            73: getenv_1 (str, ephemeral)
        !            74:      register unsigned char *str;
        !            75:      int ephemeral;            /* if ephmeral, don't need to gc-proof */
        !            76: {
        !            77:   register Lisp_Object env;
        !            78:   int len = strlen (str);
        !            79: 
        !            80:   for (env = Venvironment_alist; CONSP (env); env = XCONS (env)->cdr)
        !            81:     {
        !            82:       register Lisp_Object car = XCONS (env)->car;
        !            83:       register Lisp_Object tem = XCONS (car)->car;
        !            84: 
        !            85:       if ((len == XSTRING (tem)->size) &&
        !            86:          (!bcmp (str, XSTRING (tem)->data, len)))
        !            87:        {
        !            88:          /* Found it in the lisp environment */
        !            89:          tem = XCONS (car)->cdr;
        !            90:          if (ephemeral)
        !            91:            /* Caller promises that gc won't make him lose */
        !            92:            return XSTRING (tem)->data;
        !            93:          else
        !            94:            {
        !            95:              register unsigned char **e;
        !            96:              unsigned char *s;
        !            97:              int ll = XSTRING (tem)->size;
        !            98: 
        !            99:              /* Look for element in the original unix environment */
        !           100:              for (e = (unsigned char **) environ; *e; e++)
        !           101:                if (!bcmp (str, *e, len) && *(*e + len) == '=')
        !           102:                  {
        !           103:                    s = *e + len + 1;
        !           104:                    if (strlen (s) >= ll)
        !           105:                      /* User hasn't either hasn't munged it or has set it
        !           106:                         to something shorter -- we don't have to cons */
        !           107:                      goto copy;
        !           108:                    else
        !           109:                      goto cons;
        !           110:                  };
        !           111:            cons:
        !           112:              /* User has setenv'ed it to a diferent value, and our caller
        !           113:                 isn't guaranteeing that he won't stash it away somewhere.
        !           114:                 We can't just return a pointer to the lisp string, as that
        !           115:                 will be corrupted when gc happens.  So, we cons (in such
        !           116:                 a way that it can't be freed -- though this isn't such a
        !           117:                 problem since the only callers of getenv (as opposed to
        !           118:                 those of egetenv) are very early, before the user -could-
        !           119:                 have frobbed the environment. */
        !           120:              s = (unsigned char *) xmalloc (ll + 1);
        !           121:            copy:
        !           122:              bcopy (XSTRING (tem)->data, s, ll + 1);
        !           123:              return (s);
        !           124:            }
        !           125:        }
        !           126:     }
        !           127:   return ((unsigned char *) 0);
        !           128: }
        !           129: 
        !           130: /* unsigned  -- stupid delcaration in lisp.h */ char *
        !           131: getenv (str)
        !           132:      register unsigned char *str;
        !           133: {
        !           134:   return ((char *) getenv_1 (str, 0));
        !           135: }
        !           136: 
        !           137: unsigned char *
        !           138: egetenv (str)
        !           139:      register unsigned char *str;
        !           140: {
        !           141:   return (getenv_1 (str, 1));
        !           142: }
        !           143: 
        !           144: 
        !           145: #if (1 == 1) /* use caller-alloca versions, rather than callee-malloc */
        !           146: int
        !           147: size_of_current_environ ()
        !           148: {
        !           149:   register int size;
        !           150:   Lisp_Object tem;
        !           151: 
        !           152:   tem = Flength (Venvironment_alist);
        !           153:   
        !           154:   size = (XINT (tem) + 1) * sizeof (unsigned char *);
        !           155:   /* + 1 for environment-terminating 0 */
        !           156: 
        !           157:   for (tem = Venvironment_alist; !NULL (tem); tem = XCONS (tem)->cdr)
        !           158:     {
        !           159:       register Lisp_Object str, val;
        !           160: 
        !           161:       str = XCONS (XCONS (tem)->car)->car;
        !           162:       val = XCONS (XCONS (tem)->car)->cdr;
        !           163: 
        !           164:       size += (XSTRING (str)->size +
        !           165:               XSTRING (val)->size +
        !           166:               2);      /* 1 for '=', 1 for '\000' */
        !           167:     }
        !           168:   return size;
        !           169: }
        !           170: 
        !           171: void
        !           172: get_current_environ (memory_block)
        !           173:      unsigned char **memory_block;
        !           174: {
        !           175:   register unsigned char **e, *s;
        !           176:   register int len;
        !           177:   register Lisp_Object tem;
        !           178: 
        !           179:   e = memory_block;
        !           180: 
        !           181:   tem = Flength (Venvironment_alist);
        !           182:   
        !           183:   s = (unsigned char *) memory_block
        !           184:                + (XINT (tem) + 1) * sizeof (unsigned char *);
        !           185: 
        !           186:   for (tem = Venvironment_alist; !NULL (tem); tem = XCONS (tem)->cdr)
        !           187:     {
        !           188:       register Lisp_Object str, val;
        !           189: 
        !           190:       str = XCONS (XCONS (tem)->car)->car;
        !           191:       val = XCONS (XCONS (tem)->car)->cdr;
        !           192: 
        !           193:       *e++ = s;
        !           194:       len = XSTRING (str)->size;
        !           195:       bcopy (XSTRING (str)->data, s, len);
        !           196:       s += len;
        !           197:       *s++ = '=';
        !           198:       len = XSTRING (val)->size;
        !           199:       bcopy (XSTRING (val)->data, s, len);
        !           200:       s += len;
        !           201:       *s++ = '\000';
        !           202:     }
        !           203:   *e = 0;
        !           204: }
        !           205: 
        !           206: #else
        !           207: /* dead code (this function mallocs, caller frees) superseded by above (which allows caller to use alloca) */
        !           208: unsigned char **
        !           209: current_environ ()
        !           210: {
        !           211:   unsigned char **env;
        !           212:   register unsigned char **e, *s;
        !           213:   register int len, env_len;
        !           214:   Lisp_Object tem;
        !           215:   Lisp_Object str, val;
        !           216: 
        !           217:   tem = Flength (Venvironment_alist);
        !           218: 
        !           219:   env_len = (XINT (tem) + 1) * sizeof (char *);
        !           220:   /* + 1 for terminating 0 */
        !           221: 
        !           222:   len = 0;
        !           223:   for (tem = Venvironment_alist; !NULL (tem); tem = XCONS (tem)->cdr)
        !           224:     {
        !           225:       str = XCONS (XCONS (tem)->car)->car;
        !           226:       val = XCONS (XCONS (tem)->car)->cdr;
        !           227: 
        !           228:       len += (XSTRING (str)->size +
        !           229:              XSTRING (val)->size +
        !           230:              2);
        !           231:     }
        !           232: 
        !           233:   e = env = (unsigned char **) xmalloc (env_len + len);
        !           234:   s = (unsigned char *) env + env_len;
        !           235: 
        !           236:   for (tem = Venvironment_alist; !NULL (tem); tem = XCONS (tem)->cdr)
        !           237:     {
        !           238:       str = XCONS (XCONS (tem)->car)->car;
        !           239:       val = XCONS (XCONS (tem)->car)->cdr;
        !           240: 
        !           241:       *e++ = s;
        !           242:       len = XSTRING (str)->size;
        !           243:       bcopy (XSTRING (str)->data, s, len);
        !           244:       s += len;
        !           245:       *s++ = '=';
        !           246:       len = XSTRING (val)->size;
        !           247:       bcopy (XSTRING (val)->data, s, len);
        !           248:       s += len;
        !           249:       *s++ = '\000';
        !           250:     }
        !           251:   *e = 0;
        !           252: 
        !           253:   return env;
        !           254: }
        !           255: 
        !           256: #endif /* dead code */
        !           257: 
        !           258: 
        !           259: DEFUN ("getenv", Fgetenv, Sgetenv, 1, 2, "sEnvironment variable: \np",
        !           260:   "Return the value of environment variable VAR, as a string.\n\
        !           261: When invoked interactively, print the value in the echo area.\n\
        !           262: VAR is a string, the name of the variable,\n\
        !           263:  or the symbol t, meaning to return an alist representing the\n\
        !           264:  current environment.")
        !           265:   (str, interactivep)
        !           266:      Lisp_Object str, interactivep;
        !           267: {
        !           268:   Lisp_Object val;
        !           269:   
        !           270:   if (str == Qt)               /* If arg is t, return whole environment */
        !           271:     return (Fcopy_alist (Venvironment_alist));
        !           272: 
        !           273:   CHECK_STRING (str, 0);
        !           274:   val = Fcdr (Fassoc (str, Venvironment_alist));
        !           275:   if (!NULL (interactivep))
        !           276:     {
        !           277:       if (NULL (val))
        !           278:        message ("%s not defined in environment", XSTRING (str)->data);
        !           279:       else
        !           280:        message ("\"%s\"", XSTRING (val)->data);
        !           281:     }
        !           282:   return val;
        !           283: }
        !           284: 
        !           285: DEFUN ("setenv", Fsetenv, Ssetenv, 1, 2,
        !           286:   "sEnvironment variable: \nsSet %s to value: ",
        !           287:   "Return the value of environment variable VAR, as a string.\n\
        !           288: When invoked interactively, print the value in the echo area.\n\
        !           289: VAR is a string, the name of the variable.")
        !           290:   (str, val)
        !           291:      Lisp_Object str;
        !           292:      Lisp_Object val;
        !           293: {
        !           294:   Lisp_Object tem;
        !           295: 
        !           296:   CHECK_STRING (str, 0);
        !           297:   if (!NULL (val))
        !           298:     CHECK_STRING (val, 0);
        !           299: 
        !           300:   set_environment_alist (str, val);
        !           301:   return val;
        !           302: }
        !           303: 
        !           304: 
        !           305: syms_of_environ ()
        !           306: {
        !           307:   staticpro (&Venvironment_alist);
        !           308:   defsubr (&Ssetenv);
        !           309:   defsubr (&Sgetenv);
        !           310: }
        !           311: 
        !           312: init_environ ()
        !           313: {
        !           314:   Venvironment_alist = Qnil;
        !           315:   initialize_environment_alist ();
        !           316: }
        !           317: 
        !           318: #endif /* MAINTAIN_ENVIRONMENT */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.