NEWLOCALE(3) | Руководство программиста Linux | NEWLOCALE(3) |
newlocale, freelocale - создаёт, изменяет и освобождает объект локали
#include <locale.h>
locale_t newlocale(int category_mask, const char *locale, locale_t base);
void freelocale(locale_t locobj);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
newlocale(), freelocale():
Функция newlocale() создаёт новый объект локали или изменяет существующий, возвращая ссылку на новый или изменённый объект. Значение base определяет что именно делает вызов — создаёт или изменяет существующий объект:
Если значение base равно специальному объекту локали LC_GLOBAL_LOCALE (смотрите duplocale(3)) или не равно (locale_t) 0 и это некорректный указатель объекта локали, то поведение не определено.
Аргумент category_mask представляет собой битовую маску, которая определяет категории локали, устанавливаемые в создаваемом объекте локали или в изменяемом существующем объекте. Маска создаёт побитовым OR из констант LC_ADDRESS_MASK, LC_CTYPE_MASK, LC_COLLATE_MASK, LC_IDENTIFICATION_MASK, LC_MEASUREMENT_MASK, LC_MESSAGES_MASK, LC_MONETARY_MASK, LC_NUMERIC_MASK, LC_NAME_MASK, LC_PAPER_MASK, LC_TELEPHONE_MASK и LC_TIME_MASK. Также значением маски может быть LC_ALL_MASK, которая эквивалентна сложению всех указанных ранее констант.
Для каждой категории, указанной в category_mask, данные локали из locale будут использованы в объекте, возвращаемом newlocale(). Если создаётся новый объект локали, то данные для всех категорий, не указанных в category_mask, берутся из локали по умолчанию («POSIX»).
Для всех категорий, которые можно указать в category_mask, уже определены следующие значения locale:
Функция freelocale() освобождает ресурсы, связанные с locobj, объектом локали, ранее полученным из вызова newlocale() или duplocale(3). Если значение locobj равно LC_GLOBAL_LOCALE или не является корректным объектом локали, то результат не определён.
После того, как объект локали освобождён, программа не должна больше его использовать.
При успешном выполнении newlocale() возвращает описатель, который можно использовать в вызовах duplocale(3), freelocale() и других функциях, принимающих аргумент locale_t. При ошибке newlocale() возвращает (locale_t) 0 и присваивает errno код ошибки.
Функции newlocale() и freelocale() впервые появились в версии 2.3 библиотеки GNU C.
POSIX.1-2008.
Каждый объект локали, созданный newlocale(), должен освобождаться с помощью freelocale().
Следующая программа принимает два аргумента командной строки, каждый из которых описывает локаль. Первый аргумент обязателен и используется для назначения категории LC_NUMERIC в объекте локали, создаваемой newlocale(). Второй аргумент необязателен; если он задан, то используется для назначения категории LC_TIME объекта локали.
После создания и инициализации объекта, программа применяет его с помощью uselocale(3), а затем тестирует изменения локали:
В следующих сеансах работы показан пример запуска программы.
Категории LC_NUMERIC присвоено fr_FR (французская):
$ ./a.out fr_FR 123456,789 Fri Mar 7 00:25:08 2014
Категории LC_NUMERIC присвоено fr_FR (французская), а категории LC_TIME — it_IT (итальянская):
$ ./a.out fr_FR it_IT 123456,789 ven 07 mar 2014 00:26:01 CET
Значению LC_TIME присвоена пустая строка, что приводит к получению настройки из переменных окружения (которые, в данном случае, равны mi_NZ, новозеландская маори):
$ LC_ALL=mi_NZ ./a.out fr_FR "" 123456,789 Te Paraire, te 07 o Poutū-te-rangi, 2014 00:38:44 CET
#define _XOPEN_SOURCE 700 #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <time.h> #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ } while (0) int main(int argc, char *argv[]) { char buf[100]; time_t t; size_t s; struct tm *tm; locale_t loc, nloc; if (argc < 2) { fprintf(stderr, "Использование: %s лок1 [лок2]\n", argv[0]); exit(EXIT_FAILURE); } /* создание нового объекта локали, получение LC_NUMERIC из локали, указанной в argv[1] */ loc = newlocale(LC_NUMERIC_MASK, argv[1], (locale_t) 0); if (loc == (locale_t) 0) errExit("newlocale"); /* Если в командной строке указан второй аргумент, то в объекте локали изменяется настройка LC_TIME, которая берётся из локали, указанной в argv[2]. Мы назначаем результат вызова newlocale() «nloc», а не «loc», так как в некоторых случаях может потребоваться сохранить «loc», если этот вызов завершится с ошибкой. */ if (argc > 2) { nloc = newlocale(LC_TIME_MASK, argv[2], loc); if (nloc == (locale_t) 0) errExit("newlocale"); loc = nloc; } /* Применение созданной локали к этой нити */ uselocale(loc); /* Тест влияния LC_NUMERIC */ printf("%8.3f\n", 123456.789); /* Тест влияния LC_TIME */ t = time(NULL); tm = localtime(&t); if (tm == NULL) errExit("time"); s = strftime(buf, sizeof(buf), "%c", tm); if (s == 0) errExit("strftime"); printf("%s\n", buf); /* Освобождение объекта локали */ freelocale(loc); exit(EXIT_SUCCESS); }
locale(1), duplocale(3), setlocale(3), uselocale(3), locale(5), locale(7)
2019-03-06 | Linux |