ОБЗОР
#include <envz.h>
error_t envz_add(char **envz, size_t *envz_len,
const char *name, const char *value);
char *envz_entry(const char *envz, size_t envz_len, const char *name);
char *envz_get(const char *envz, size_t envz_len, const char *name);
error_t envz_merge(char **envz, size_t *envz_len,
const char *envz2, size_t envz2_len, int override);
void envz_remove(char **envz, size_t *envz_len, const char *name);
void envz_strip(char **envz, size_t *envz_len);
ОПИСАНИЕ
Эти функции есть только в glibc.
Вектор argz представляет собой указатель на символьный буфер и его длину (смотрите argz_add(3)). Вектор envz является особым вектором argz, в нём содержатся строки вида «имя=значение». Всё, что расположено за первым '=', считается значением. Если '=' отсутствует, то значение считается равным NULL (если '=' указано в конце, то значение равно пустой строке "").
Эти функции предназначены для работы с векторами envz.
Функция envz_add() добавляет строку "name=value" (если name не равно NULL) или "name" (если value равно NULL) в вектор envz (*envz, *envz_len) и обновляет *envz и *envz_len. Если запись с таким значением name уже существует, то она удаляется.
Функция envz_entry() ищет значение name в векторе envz (envz, envz_len) и возвращает запись, если такое имя найдено, и NULL, если не найдено.
Функция envz_get() ищет значение name в векторе envz (envz, envz_len) и возвращает значение, если такое имя найдено, и NULL, если не найдено (заметим, что значение само по себе может быть равно NULL, особенно, если есть запись для name без знака '=').
Функция envz_merge() добавляет все записи из envz2 в *envz, как если бы это делалось с помощью envz_add(). Если значение override истинно, то значения в envz2 будут заменять значения с такими же именами в *envz, иначе — нет.
Функция envz_remove() удаляет запись для name из (*envz, *envz_len), если она есть.
Функция envz_strip() удаляет все записи со значением NULL.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Все функции envz, в которых происходит выделение памяти, возвращают
результат, имеющий тип error_t: 0 — при успешном выполнении и ENOMEM —
при ошибке выделения памяти.
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс Атрибут Значение
envz_add(),
envz_entry(),
envz_get(),
envz_merge(),
envz_remove(),
envz_strip()
безвредность в потоках: безвредно (MT-Safe)
СООТВЕТСТВИЕ СТАНДАРТАМ
Данные функции являются расширениями GNU. Используйте с осторожностью.
ПРИМЕР
#include <stdio.h> #include <stdlib.h> #include <envz.h> int main(int argc, char *argv[], char *envp[]) { int i, e_len = 0; char *str; for (i = 0; envp[i] != NULL; i++) e_len += strlen(envp[i]) + 1; str = envz_entry(*envp, e_len, "HOME"); printf("%s\n", str); str = envz_get(*envp, e_len, "HOME"); printf("%s\n", str); exit(EXIT_SUCCESS); }