⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setenv_r.c

📁 俄罗斯高人Mamaich的Pocket gcc编译器(运行在PocketPC上)的全部源代码。
💻 C
字号:
/* This file may have been modified by DJ Delorie (Jan 1991).  If so,** these modifications are Copyright (C) 1991 DJ Delorie.*//* * Copyright (c) 1987 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement:  ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */#include <reent.h>#include <stddef.h>#include <stdlib.h>#include <string.h>#include <time.h>#include "envlock.h"extern char **environ;/* Only deal with a pointer to environ, to work around subtle bugs with shared   libraries and/or small data systems where the user declares his own   'environ'.  */static char ***p_environ = &environ;/* _findenv_r is defined in getenv_r.c.  */extern char *_findenv_r _PARAMS((struct _reent *, const char *, int *));/* * _setenv_r -- *      Set the value of the environmental variable "name" to be *      "value".  If rewrite is set, replace any current value. */int_DEFUN(_setenv_r, (reent_ptr, name, value, rewrite),       struct _reent *reent_ptr _AND       _CONST char *name _AND _CONST char *value _AND int rewrite){  static int alloced;           /* if allocated space before */  register char *C;  int l_value, offset;  ENV_LOCK;  if (*value == '=')            /* no `=' in value */    ++value;  l_value = strlen(value);  if ((C = _findenv_r(reent_ptr, name, &offset))) {     /* find if already exists */    if (!rewrite) {      ENV_UNLOCK;      return 0;    }    if (strlen(C) >= l_value) { /* old larger; copy over */      while ((*C++ = *value++) != 0);      ENV_UNLOCK;      /* if we are changing the TZ environment variable, update timezone info */      if (strcmp(name, "TZ") == 0)        tzset();      return 0;    }  } else {                      /* create new slot */    register int cnt;    register char **P;    for (P = *p_environ, cnt = 0; *P; ++P, ++cnt);    if (alloced) {              /* just increase size */      *p_environ = (char **) _realloc_r(reent_ptr, (char *) environ,                                        (size_t) (sizeof(char *) *                                                  (cnt + 2)));      if (!*p_environ) {        ENV_UNLOCK;        return -1;      }    } else {                    /* get new space */      alloced = 1;              /* copy old entries into it */      P =        (char **) _malloc_r(reent_ptr, (size_t) (sizeof(char *) * (cnt + 2)));      if (!P) {        ENV_UNLOCK;        return (-1);      }      bcopy((char *) *p_environ, (char *) P, cnt * sizeof(char *));      *p_environ = P;    }    (*p_environ)[cnt + 1] = NULL;    offset = cnt;  }  for (C = (char *) name; *C && *C != '='; ++C);        /* no `=' in name */  if (!((*p_environ)[offset] = /* name + `=' + value */        _malloc_r(reent_ptr, (size_t) ((int) (C - name) + l_value + 2)))) {    ENV_UNLOCK;    return -1;  }  for (C = (*p_environ)[offset]; (*C = *name++) && *C != '='; ++C);  for (*C++ = '='; (*C++ = *value++) != 0;);  ENV_UNLOCK;  /* if we are setting the TZ environment variable, update timezone info */  if (strcmp(name, "TZ") == 0)    tzset();  return 0;}/* * _unsetenv_r(name) -- *      Delete environmental variable "name". */void_DEFUN(_unsetenv_r, (reent_ptr, name),       struct _reent *reent_ptr _AND _CONST char *name){  register char **P;  int offset;  ENV_LOCK;  while (_findenv_r(reent_ptr, name, &offset))  /* if set multiple times */    for (P = &(*p_environ)[offset];; ++P)      if (!(*P = *(P + 1)))        break;  ENV_UNLOCK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -