Программирование в стандарте POSIX

       

xc0 CYRILLIC SMALL LETTER YU


< code_set_name> KOI8-R <comment_char> % <escape_char> / % version: 1.0 % source: RFC1489 via Gabor Kiss <kissg@sztaki.hu> % and Andrey A. Chernov <ache@astral.msk.su> CHARMAP <U0000> /x00 NULL (NUL) <U0001> /x01 START OF HEADING (SOH) <U0002> /x02 START OF TEXT (STX) . . . <U0020> /x20 SPACE <U0021> /x21 EXCLAMATION MARK . . . <U0030> /x30 DIGIT ZERO <U0031> /x31 DIGIT ONE . . . <U0041> /x41 LATIN CAPITAL LETTER A <U0042> /x42 LATIN CAPITAL LETTER B . . . <U0061> /x61 LATIN SMALL LETTER A <U0062> /x62 LATIN SMALL LETTER B . . . <U044E> / xc0 CYRILLIC SMALL LETTER YU <U0430> /xc1 CYRILLIC SMALL LETTER A <U0431> /xc2 CYRILLIC SMALL LETTER BE . . . <U0429> /xfd CYRILLIC CAPITAL LETTER SHCHA <U0427> /xfe CYRILLIC CAPITAL LETTER CHE <U042A> /xff CYRILLIC CAPITAL LETTER HARD SIGN END CHARMAP
Пример 13.1. Фрагмент файла отображения символов для кодировки KOI8-R.
Закрыть окно




LC_CTYPE # POSIX-среда, категория LC_CTYPE # "alpha" по определению есть объединение элементов "upper" и "lower" # "alnum" по определению есть объединение элементов "alpha" и "digit" # "print" по определению есть объединение элементов "alnum", "punct" и <space> # "graph" по определению есть объединение элементов "alnum" и "punct" # upper <A>;<B>;<C>;<D>;<E>;<F>;<G>;<H>;<I>;<J>;<K>;\ <L>;<M>;<N>;<O>;<P>;<Q>;<R>;<S>;<T>;<U>;<V>;<W>;\ <X>;<Y>;<Z> # lower <a>;<b>;<c>;<d>;<e>;<f>;<g>;<h>;<i>;<j>;<k>;\ <l>;<m>;<n>;<o>;<p>;<q>;<r>;<s>;<t>;<u>;<v>;<w>;\ <x>;<y>;<z> # digit <zero>;<one>;<two>;<three>;<four>;<five>;\ <six>;<seven>;<eight>;<nine> # space <tab>;<newline>;<vertical-tab>;<form-feed>;\ <carriage-return>;<space> # cntrl <alert>;<backspace>;<tab>;<newline>;\ <vertical-tab>;<form-feed>;<carriage-return>;\ <NUL>;<SOH>;<STX>;<ETX>;<EOT>;<ENQ>;<ACK>;<SO>;\ <SI>;<DLE>;<DC1>;<DC2>;<DC3>;<DC4>;<NAK>;<SYN>;\ <ETB>;<CAN>;<EM>;<SUB>;<ESC>;<IS4>;<IS3>;<IS2>;\ <IS1>;<DEL> # punct <exclamation-mark>;<quotation-mark>;\ <number-sign>;<dollar-sign>;<percent-sign>;\ <ampersand>;<apostrophe>;<left-parenthesis>;\ <right-parenthesis>;<asterisk>;<plus-sign>;\ <comma>;<hyphen>;<period>;<slash>;<colon>;\ <semicolon>;<less-than-sign>;<equals-sign>;\ <greater-than-sign>;<question-mark>;\ <commercial-at>;<left-square-bracket>;\ <backslash>;<right-square-bracket>;\ <circumflex>;<underscore>;<grave-accent>;\ <left-curly-bracket>;<vertical-line>;\ <right-curly-bracket>;<tilde> # xdigit <zero>;<one>;<two>;<three>;<four>;<five>;\ <six>;<seven>;<eight>;<nine>;<A>;<B>;<C>;<D>;\ <E>;<F>;<a>;<b>;<c>;<d>;<e>;<f> # blank <space>;<tab> # toupper (<a>,<A>);(<b>,<B>);(<c>,<C>);(<d>,<D>);\ (<e>,<E>);(<f>,<F>);(<g>,<G>);(<h>,<H>);\ (<i>,<I>);(<j>,<J>);(<k>,<K>);(<l>,<L>);(<m>,<M>);\ (<n>,<N>);(<o>,<O>);(<p>,<P>);(<q>,<Q>);(<r>,<R>);\ (<s>,<S>);(<t>,<T>);(<u>,<U>);(<v>,<V>);(<w>,<W>);\ (<x>,<X>);(<y>,<Y>);(<z>,<Z>) # tolower (<A>,<a>);(<B>,<b>);(<C>,<c>);(<D>,<d>);\ (<E>,<e>);(<F>,<f>);(<G>,<g>);(<H>,<h>);\ (<I>,<i>);(<J>,<j>);(<K>,<k>);(<L>,<l>);\ (<M>,<m>);(<N>,<n>);(<O>,<o>);(<P>,<p>);\( <Q>,<q>);(<R>,<r>);(<S>,<s>);(<T>,<t>);\ <U>,<u>);(<V>,<v>);(<W>,<w>);(<X>,<x>);(\ <Y>,<y>);(<Z>,<z>) END LC_CTYPE
Пример 13.2. Определение категории LC_CTYPE для POSIX-среды.
Закрыть окно




LC_NUMERIC # POSIX-среда, категория LC_NUMERIC # decimal_point "<period>" thousands_sep "" grouping -1 # END LC_NUMERIC
Пример 13.3. Определение категории LC_NUMERIC для POSIX-среды.
Закрыть окно




LC_TIME # POSIX-среда, категория LC_TIME # # Сокращенные названия дней недели (%a) abday "<S><u><n>";"<M><o><n>";"<T><u><e>";\ "<W><e><d>";"<T><h><u>";"<F><r><i>";"<S><a><t>" # # Полные названия дней недели (%A) day "<S><u><n><d><a><y>";\ "<M><o><n><d><a><y>";\ "<T><u><e><s><d><a><y>";\ "<W><e><d><n><e><s><d><a><y>";\ "<T><h><u><r><s><d><a><y>";\ "<F><r><i><d><a>\<y>";\ "<S><a><t><u><r><d><a><y>" # # Сокращенные названия месяцев (%b) abmon "<J><a><n>";"<F><e><b>";"<M><a><r>";\ "<A><p><r>";"<M><a><y>";"<J><u><n>";\ "<J><u><l>";"<A><u><g>";"<S><e><p>";\ "<O><c><t>";"<N><o><v>";"<D><e><c>" # # Полные названия месяцев (%B) mon "<J><a><n><u><a><r><y>"\ "<F><e><b><r><u><a><r><y>";\ "<M><a><r><c><h>";"<A><p><r><i><l>";\ "<M><a><y>";"<J><u><n><e>";\ "<J><u><l><y>";"<A><u><g><u><s><t>";\ "<S><e><p><t><e><m><b><e><r>";\ "<O><c><t><o><b><e><r>";\ "<N><o><v><e><m><b><e><r>";\ "<D><e><c><e><m><b><e><r>" # # Эквивалент AM/PM (%p) "AM";"PM" am_pm "<A><M>";"<P><M>" # # Принятое в POSIX-среде представление даты и времени (%c) # "%a %b %e %H:%M:%S %Y" d_t_fmt "<percent-sign><a><space><percent-sign>\ <b><space><percent-sign><e><space>\ <percent-sign><H><colon><percent-sign>\ <M><colon><percent-sign><S><space>\ <percent-sign><Y>" # # Принятое в POSIX-среде представление даты (%x) "%m/%d/%y" d_fmt "<percent-sign><m><slash><percent-sign><d>\ <slash><percent-sign><y>" # # Принятое в POSIX-среде представление времени (%X) "%H:%M:%S" t_fmt "<percent-sign><H><colon><percent-sign><M>\ <colon><percent-sign><S>" # # Принятое в POSIX-среде 12-часовое представление времени (%r) "%I:%M:%S %p" t_fmt_ampm "<percent-sign><I><colon><percent-sign\ <M><colon><percent-sign><S><space>\ <percent_sign><p>" # END LC_TIME


Пример 13.4. Определение категории LC_TIME для POSIX-среды.
Закрыть окно




LC_MESSAGES # POSIX-среда, категория LC_MESSAGES # yesexpr "<circumflex><left-square-bracket>\ <y><Y><right-square-bracket>" # noexpr "<circumflex><left-square-bracket>\ <n><N><right-square-bracket>" # END LC_MESSAGES
Пример 13.5. Определение категории LC_MESSAGES для POSIX-среды.
Закрыть окно




LANG=ru_RU.koi8r LC_CTYPE="ru_RU.koi8r" LC_NUMERIC="ru_RU.koi8r" LC_TIME="ru_RU.koi8r" LC_COLLATE="ru_RU.koi8r" LC_MONETARY="ru_RU.koi8r" LC_MESSAGES="ru_RU.koi8r" LC_PAPER="ru_RU.koi8r" LC_NAME="ru_RU.koi8r" LC_ADDRESS="ru_RU.koi8r" LC_TELEPHONE="ru_RU.koi8r" LC_MEASUREMENT="ru_RU.koi8r" LC_IDENTIFICATION="ru_RU.koi8r" LC_ALL=
Пример 13.6. Возможный результат работы служебной программы locale.
Закрыть окно




LC_TIME abday="Вск;Пнд;Втр;Срд;Чтв;Птн;Сбт" day="Воскресенье;Понедельник;Вторник;Среда; Четверг;Пятница;Суббота" abmon="Янв;Фев;Мар;Апр;Май;Июн;Июл;Авг;Сен; Окт;Ноя;Дек" mon="Января;Февраля;Марта;Апреля;Мая;Июня; Июля;Августа;Сентября;Октября;Ноября;Декабря" d_t_fmt="%a %d %b %Y %T" d_fmt="%d.%m.%Y" t_fmt="%T" . . . first_weekday=1 first_workday=1 cal_direction=1 date_fmt="%a %b %e %H:%M:%S %Z %Y" time-codeset="KOI8-R"
Пример 13.7. Фрагмент возможного результата выполнения команды locale -ck LC_TIME.
Закрыть окно




if echo "$response" | grep -Eq "$(locale yesexpr)" then echo " Ответ положительный" else echo "Ответ отрицательный" fi
Пример 13.8. Фрагмент интернационализированного варианта shell-процедуры.
Закрыть окно




#include <locale.h> char *setlocale ( int category, const char *locale);
Пример 13.9. Описание функции setlocale().
Закрыть окно




#include <locale.h> struct lconv *localeconv (void);
Пример 13.10. Описание функции localeconv().
Закрыть окно




#include <stdio.h> #include <locale.h>
/* Функция опрашивает и выводит цепочки символов, */ /* ассоциированные с текущей средой и ее */ /* категориями */
void print_curr_locale_data (void) { /* Массив категорий для setlocale() */ int ctgrs [] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME}; /* Массив имен категорий */ char *ctgrnms [] = {"LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MESSAGES", "LC_MONETARY", "LC_NUMERIC", "LC_TIME"}; unsigned int i; printf ("Цепочки символов, ассоциированные в текущей среде с\n"); for (i = 0; i < sizeof (ctgrs) / sizeof (int); i++) { printf (" %s: %s\n", ctgrnms [i], setlocale (ctgrs [i], NULL)); } }
int main (void) { struct lconv *plc; /* Убедимся, что подразумеваемой является */ /* POSIX-среда */ printf ("Текущая языково-культурная среда: подразумеваемая\n"); print_curr_locale_data(); /* Установим местную среду */ (void) setlocale (LC_ALL, ""); /* Опросим и выдадим ее характеристики */ printf ("Текущая языково-культурная среда: местная\n"); print_curr_locale_data(); plc = localeconv (); printf ("Некоторые элементы категорий LC_MONETARY и LC_NUMERIC\n"); printf ("int_curr_symbol: %s\n", plc->int_curr_symbol); printf ("currency_symbol: %s\n", plc->currency_symbol); printf ("mon_decimal_point: %s\n", plc->mon_decimal_point); printf ("decimal_point: %s\n", plc->decimal_point); printf ("thousands_sep: %s\n", plc->thousands_sep); /* Сделаем "денежную" категорию украинской */ if (setlocale (LC_MONETARY, "ru_UA") == NULL) { perror ("SETLOCALE"); return (1); } printf ("Категория LC_MONETARY переустановлена для Украины\n"); print_curr_locale_data(); plc = localeconv (); printf ("Некоторые элементы категории LC_MONETARY\n"); printf ("int_curr_symbol: %s\n", plc->int_curr_symbol); printf ("currency_symbol: %s\n", plc->currency_symbol); return 0; }
Пример 13.11. Пример использования функций setlocale() и localeconv().
Закрыть окно




Текущая языково- культурная среда: подразумеваемая Цепочки символов, ассоциированные в текущей среде с LC_ALL: C LC_COLLATE: C LC_CTYPE: C LC_MESSAGES: C LC_MONETARY: C LC_NUMERIC: C LC_TIME: C Текущая языково-культурная среда: местная Цепочки символов, ассоциированные в текущей среде с LC_ALL: ru_RU.koi8r LC_COLLATE: ru_RU.koi8r LC_CTYPE: ru_RU.koi8r LC_MESSAGES: ru_RU.koi8r LC_MONETARY: ru_RU.koi8r LC_NUMERIC: ru_RU.koi8r LC_TIME: ru_RU.koi8r Некоторые элементы категорий LC_MONETARY и LC_NUMERIC int_curr_symbol: RUR currency_symbol: РУБ mon_decimal_point: . decimal_point: , thousands_sep: . Категория LC_MONETARY переустановлена для Украины Цепочки символов, ассоциированные в текущей среде с LC_ALL: LC_CTYPE=ru_RU.koi8r;LC_NUMERIC=ru_RU.koi8r; LC_TIME=ru_RU.koi8r;LC_COLLATE=ru_RU.koi8r; LC_MONETARY=ru_UA;LC_MESSAGES=ru_RU.koi8r; LC_PAPER=ru_RU.koi8r;LC_NAME=ru_RU.koi8r; LC_ADDRESS=ru_RU.koi8r;LC_TELEPHONE=ru_RU.koi8r; LC_MEASUREMENT=ru_RU.koi8r; LC_IDENTIFICATION=ru_RU.koi8r LC_COLLATE: ru_RU.koi8r LC_CTYPE: ru_RU.koi8r LC_MESSAGES: ru_RU.koi8r LC_MONETARY: ru_UA LC_NUMERIC: ru_RU.koi8r LC_TIME: ru_RU.koi8r Некоторые элементы категории LC_MONETARY int_curr_symbol: UAH currency_symbol: ГР
Пример 13.12. Возможный результат работы программы, использующей функции setlocale() и localeconv().
Закрыть окно




#include <monetary.h> ssize_t strfmon (char * restrict s, size_t maxsize, const char *restrict format, ...);
Пример 13.13. Описание функции strfmon().
Закрыть окно




#include <stdio.h> #include <ctype.h> #include <locale.h> #include <limits.h> #include <monetary.h>
#define MY_VALUE 1234.567
int main (void) { char sbuf [LINE_MAX]; printf ("Текущая языково-культурная среда: подразумеваемая\n"); printf ("isalpha ('Б'): %d\n", isalpha ('Б')); printf ("tolower ('Б'): '%c'\n", tolower ('Б')); printf ("Результат преобразования в денежную величину числа 1234.567\n"); if (strfmon (sbuf, sizeof (sbuf), "Международное обозначение: %i\n", MY_VALUE) == -1) { perror ("STRFMON"); return (1); } fputs (sbuf, stdout); (void) strfmon (sbuf, sizeof (sbuf), "Местное обозначение: %n\n", MY_VALUE); fputs (sbuf, stdout); (void) setlocale (LC_ALL, ""); printf ("Текущая языково-культурная среда: местная\n"); printf ("isalpha ('Б'): %d\n", isalpha ('Б')); printf ("tolower ('Б'): '%c'\n", tolower ('Б')); printf ("Результат преобразования в денежную величину числа 1234.567\n"); (void) strfmon (sbuf, sizeof (sbuf), "Международное обозначение: %i\n", MY_VALUE); fputs (sbuf, stdout); (void) strfmon (sbuf, sizeof (sbuf), "Местное обозначение: %n\n", MY_VALUE); fputs (sbuf, stdout); (void) setlocale (LC_MONETARY, "ru_UA"); printf ("Категория LC_MONETARY переустановлена для Украины\n"); printf ("Результат преобразования в денежную величину числа 1234.567\n"); (void) strfmon (sbuf, sizeof (sbuf), "Международное обозначение: %i\n", MY_VALUE); fputs (sbuf, stdout); (void) strfmon (sbuf, sizeof (sbuf), "Местное обозначение: %n\n", MY_VALUE); fputs (sbuf, stdout); return 0; }
Пример 13.14. Пример программы, работающей в нескольких языково-культурных средах.
Закрыть окно




isalpha ('Б'): 0 tolower ('Б'): 'Б' Результат преобразования в денежную величину числа 1234.567 Международное обозначение: 1234.57 Местное обозначение: 1234.57 Текущая языково-культурная среда: местная isalpha ('Б'): 1024 tolower ('Б'): 'б' Результат преобразования в денежную величину числа 1234.567 Международное обозначение: 1 234.57 RUR Местное обозначение: 1 234. 57 руб Категория LC_MONETARY переустановлена для Украины Результат преобразования в денежную величину числа 1234.567 Международное обозначение: 1 234.57 UAH Местное обозначение: 1 234.57 ГР
Пример 13.15. Текущая языково-культурная среда: подразумеваемая
Закрыть окно




#include <langinfo.h> char *nl_langinfo (nl_item item);
Пример 13.16. Описание функции nl_langinfo().
Закрыть окно




#include <stdio.h> #include <locale.h> #include <langinfo.h> #include <regex.h> #include <limits.h>
int main (void) { regex_t cere; /* Скомпилированные расширенные */ /* регулярные выражения */ regex_t ceren; int reerrcode; /* Код ошибки от regcomp или */ /* regexec */ char reerrbuf [LINE_MAX]; /* Буфер для строк с */ /* сообщениями об ошибках */ char response [LINE_MAX]; /* Буфер для ответа */
/* пользователя */ printf ("Текущая языково-культурная среда: подразумеваемая\n"); printf ("Элемент YESEXPR категории LC_MESSAGES: %s\n", nl_langinfo (YESEXPR)); printf ("Элемент MON_1 категории LC_TIME: %s\n", nl_langinfo (MON_1)); (void) setlocale (LC_ALL, ""); printf ("Текущая языково-культурная среда: местная\n"); printf ("Элемент YESEXPR категории LC_MESSAGES: %s\n", nl_langinfo (YESEXPR)); printf ("Элемент MON_1 категории LC_TIME: %s\n", nl_langinfo (MON_1)); /* Скомпилируем расширенное регулярное */ /* выражение для утвердительного ответа */ if ((reerrcode = regcomp (&cere, nl_langinfo (YESEXPR), REG_EXTENDED | REG_ICASE | REG_NOSUB )) != 0) { (void) regerror (reerrcode, &cere, reerrbuf, sizeof (reerrbuf)); fputs (reerrbuf, stderr); fputc ('\n', stderr); regfree (&cere); return (reerrcode); } /* То же для отрицательного ответа */ if ((reerrcode = regcomp (&ceren, nl_langinfo (NOEXPR), REG_EXTENDED | REG_ICASE | REG_NOSUB )) != 0) { (void) regerror (reerrcode, &ceren, reerrbuf, sizeof (reerrbuf)); fputs (reerrbuf, stderr); fputc ('\n', stderr); regfree (&ceren); return (reerrcode); } fputs ("Вы поддерживаете идею стандартизации программных интерфейсов? ", stdout); fgets (response, sizeof (response), stdin); if (regexec (&cere, response, 0, NULL, 0) == 0) { fputs ("Ответ положительный\n", stdout); } else if (regexec (&ceren, response, 0, NULL, 0) == 0) { fputs ("Ответ отрицательный\n", stdout); } else { fputs ("Ответ уклончивый\n", stdout); } regfree (&cere); regfree (&ceren); return 0; }
Пример 13.17. Пример программы, использующей функцию nl_langinfo().
Закрыть окно




Текущая языково- культурная среда: подразумеваемая Элемент YESEXPR категории LC_MESSAGES: ^[yY] Элемент MON_1 категории LC_TIME: January Текущая языково-культурная среда: местная Элемент YESEXPR категории LC_MESSAGES: ^[ДдYy].* Элемент MON_1 категории LC_TIME: Января Вы поддерживаете идею стандартизации программных интерфейсов? Да Ответ положительный
Пример 13.18. Возможные результаты работы программы, использующей функцию nl_langinfo().
Закрыть окно




#include <string.h> char *strerror (int errnum);
Пример 13.19. Описание функции strerror().
Закрыть окно




#include <stdio.h> #include <locale.h> #include <string.h> #include <errno.h>
int main (void) { fprintf (stderr, "Текущая языково-культурная среда: подразумеваемая\n"); errno = 1; perror ("PERROR, сообщение номер 1"); fprintf (stderr, "STRERROR, сообщение номер 1: %s\n", strerror (1)); (void) setlocale (LC_ALL, ""); fprintf (stderr, "Текущая языково-культурная среда: местная\n"); errno = 1; perror ("PERROR, сообщение номер 1"); fprintf (stderr, "STRERROR, сообщение номер 1: %s\n", strerror (1)); (void) setlocale (LC_MESSAGES, "ru_UA"); fprintf (stderr, " Категория LC_MESSAGES переустановлена для Украины\n"); errno = 1; perror ("PERROR, сообщение номер 1"); fprintf (stderr, "STRERROR, сообщение номер 1: %s\n", strerror (1)); return 0; }
Пример 13.20. Пример программы, выдающей диагностические сообщения в разных языково-культурных средах и разными средствами.
Закрыть окно




#include <nl_types.h> nl_catd catopen (const char *name, int oflag); char *catgets ( nl_catd catd, int set_id, int msg_id, const char *s); int catclose (nl_catd catd);
Пример 13.21. Описание функций catopen(), catgets() и catclose().
Закрыть окно



Содержание раздела