Kniga-Online.club
» » » » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

Читать бесплатно Linux программирование в примерах - Роббинс Арнольд. Жанр: Интернет год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

$ <b>LC_ALL=en_US ch13-quoteflag</b> /* Локаль с разделителем (англ.) */

1,234,567

На время написания лишь GNU/Linux и Solaris поддерживают флаг '. Дважды проверьте справочную страницу printf(3) на своей системе.

13.2.6. Пример: форматирование числовых значений в gawk

gawk реализует свои собственные версии функций printf() и sprintf(). Для полного использования локали gawk должен поддерживать флаг ', как в С. Следующий фрагмент из файла builtin.c в gawk 3.1.4 показывает, как gawk использует struct lconv для числового форматирования:

1  case 'd':

2  case 'i':

3   ...

4   tmpval = force_number(arg);

5

6   ...

7   uval = (uintmax_t)tmpval;

8   ...

9   ii = jj = 0;

10  do {

11   *--cp = (char)('0' + uval % 10);

12 #ifdef HAVE_LOCALE_H

13   if (quote_flag &amp;&amp; loc.grouping[ii] &amp;&amp; ++jj == loc.grouping[ii]) {

14    *--cp = loc.thousands_sep[0]; /* XXX - предположение, что это один символ */

15    if (loc.grouping[ii+1] == 0)

16     jj = 0; /* продолжить использовать текущий val в loc.grouping [ii] */

17    else if (loc.grouping[ii+1] == CHAR_MAX)

18     quote_flag = FALSE;

19    else {

20     ii++;

21     jj = 0;

22    }

23   }

24 #endif

25   uval /= 10;

26  } while (uval &gt; 0);

(Номера строк даны относительно начала фрагмента.) Некоторые части кода, не имеющие отношения к обсуждению, были опущены, чтобы облегчить фокусировку на важных частях.

Переменная loc, используемая в строках 13–17, представляет struct lconv. Она инициализируется в main(). Здесь для нас интерес представляет loc.thousands_sep, который является символом разделителя тысяч, и loc.grouping, который является массивом, описывающим число цифр между разделителями. Нулевой элемент означает «использовать для всех последующих цифр значение предыдущего элемента», а значение CHAR_MAX означает «прекратить вставку разделителей тысяч».

С таким введением, давайте посмотрим на код. Строка 7 устанавливает uval, которая является беззнаковой версией форматируемого значения. ii и jj отслеживают положение в loc.grouping и число цифр в текущей группе, которые были преобразованы, соответственно[142]. quote_flag равен true, когда в спецификации преобразования был отмечен символ '.

Цикл do-while генерирует символы цифр в обратном порядке, заполняя буфер с конца к началу. Каждая цифра создается в строке 11. Затем строка 25 делится на 10 путем смещения значения вправо на одну десятичную цифру.

Нас интересуют строки 12–24. Эта работа осуществляется только на системе, поддерживающей локали, на что указывает наличие заголовочного файла &lt;locale.h&gt;. Именованная константа HAVE_LOCALE в такой системе будет равна true[143].

Когда условие в строке 13 истинно, настало время добавить символ разделителя тысяч. Это условие можно прочесть как «если требуется группировка и текущее положение в loc.grouping указывает нужное для группировки количество и текущее число цифр равно группируемому количеству». Если это условие истинно, строка 14 добавляет символ разделителя тысяч. Комментарий обращает внимание на предположение, которое, вероятно, истинно, но которое может вновь появиться позже. ('XXX' является традиционным способом выделения опасного или сомнительного кода. Его легко отыскать, и он весьма заметен для читателя кода.)

После использования текущего положения в loc.grouping строки 15–22 заглядывают в значение в следующем положении. Если это 0, продолжает использоваться значение текущего положения. Мы указываем на это, восстанавливая 0 в jj (строка 16). С другой стороны, если в следующем положении CHAR_MAX, группировка должна быть прекращена, и строка 18 убирает ее, устанавливая quote_flag в false. В противном случае, следующее значение является значением группировки, поэтому строка 20 восстанавливает 0 в jj, а строка 21 увеличивает значение ii.

Это низкоуровневый, подробный код. Однако, поняв один раз, как представляется информация в struct lconv, код читать просто (и его было просто писать).

13.2.7. Форматирование значений даты и времени: ctime() и strftime()

В разделе 6.1 «Времена и даты» описаны функции для получения и форматирования значений времени и даты. Функция strftime() также может использовать локаль, если setlocale() была вызвана должным образом. Это демонстрирует следующая простая программа, ch13-times.с:

/* ch13-times.c --- демонстрация времени на основе локали */

#include &lt;stdio.h&gt;

#include &lt;locale.h&gt;

#include &lt;time.h&gt;

int main(void) {

 char buf[100];

Перейти на страницу:

Роббинс Арнольд читать все книги автора по порядку

Роббинс Арнольд - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Linux программирование в примерах отзывы

Отзывы читателей о книге Linux программирование в примерах, автор: Роббинс Арнольд. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*