05d527ba960180a7a3965e6d0f127f09d53db2f9
1 /* env.c, envread.c, env.h: environ library
2 Daniel J. Bernstein, djb@silverton.berkeley.edu.
3 Depends on str.h, alloc.h.
5 19960113: rewrite. warning: interface is different.
6 No known patent problems.
13 int env_isinit
= 0; /* if env_isinit: */
14 static int ea
; /* environ is a pointer to ea+1 char*'s. */
15 static int en
; /* the first en of those are ALLOCATED. environ[en] is 0. */
17 static void env_goodbye(i
) int i
;
19 alloc_free(environ
[i
]);
20 environ
[i
] = environ
[--en
];
24 static char *null
= 0;
28 if (env_isinit
) while (en
) env_goodbye(0);
32 static void env_unsetlen(s
,len
) char *s
; int len
;
35 for (i
= en
- 1;i
>= 0;--i
)
36 if (!str_diffn(s
,environ
[i
],len
))
37 if (environ
[i
][len
] == '=')
41 int env_unset(s
) char *s
;
43 if (!env_isinit
) if (!env_init()) return 0;
44 env_unsetlen(s
,str_len(s
));
48 static int env_add(s
) char *s
;
52 if (t
) env_unsetlen(s
,t
- s
);
56 if (!alloc_re(&environ
,(en
+ 1) * sizeof(char *),(ea
+ 1) * sizeof(char *)))
57 { ea
= en
; return 0; }
64 int env_put(s
) char *s
;
67 if (!env_isinit
) if (!env_init()) return 0;
68 u
= alloc(str_len(s
) + 1);
71 if (!env_add(u
)) { alloc_free(u
); return 0; }
75 int env_put2(s
,t
) char *s
; char *t
;
79 if (!env_isinit
) if (!env_init()) return 0;
81 u
= alloc(slen
+ str_len(t
) + 2);
85 str_copy(u
+ slen
+ 1,t
);
86 if (!env_add(u
)) { alloc_free(u
); return 0; }
94 for (en
= 0;environ
[en
];++en
) ;
96 newenviron
= (char **) alloc((ea
+ 1) * sizeof(char *));
97 if (!newenviron
) return 0;
98 for (en
= 0;environ
[en
];++en
)
100 newenviron
[en
] = alloc(str_len(environ
[en
]) + 1);
103 for (i
= 0;i
< en
;++i
) alloc_free(newenviron
[i
]);
104 alloc_free(newenviron
);
107 str_copy(newenviron
[en
],environ
[en
]);
110 environ
= newenviron
;