Хрестоматия по программированию на Си в Unix


Текстовая обработка. Хрестоматия по программированию на Си в Unix - стр. 7


/* Переход на следующую страницу вставкой пустых строк */ void nextpage () { while (current_line != 0) newline (); }

/* Выдать спасенный блок */ void throwout () { register i; for (i = 0; i < stored; i++) { if( numbered ) fprintf(fpout, "%02d %s", current_line, lines[i]); else fputs (lines[i], fpout); newline (); free (lines[i]); } stored = 0; }

/* Выдать блок, перенося на следующий лист если надо */ void flush () { int rest_of_page = page_length - current_line; /* осталось пустых строк на странице */

if ((stored > page_length && rest_of_page < page_length / 4) rest_of_page < stored) nextpage (); throwout (); if (current_line) /* не первая строка листа */ newline (); /* разделитель блоков */ }

/* Обработать входной файл */ void process () { char buffer[512]; int l;

while (fgets (buffer, sizeof buffer, fpin) != NULL) { if ((l = strlen (buffer)) && buffer[l - 1] == '\n') buffer[ --l] = '\0'; if (l) remember (buffer); /* а по пустой строке - выдать блок */ else if (stored) flush (); } if (stored) flush (); nextpage(); }

void main (int argc, char *argv[]) { argc--; argv++; while (*argv) { if (**argv == '-') { char *key = *argv + 1, *arg; switch (*key) { case 'l': if (! key[1]) { if( argv[1] ){ arg = argv[1]; argv++; argc--; } else arg = ""; } else arg = key+1; if( isdigit(*arg) ){ page_length = atoi(arg); fprintf (stderr, "Длина страницы: %d строк\n", page_length); } else fprintf(stderr, "-l ЧИСЛО\n"); break; case 'n': numbered++; break; default: fprintf (stderr, "Неизвестный ключ %s\n", key); break; } } argv++; argc--; } process (); exit(0); }

* - На самом деле все освобожденные куски включаются в список свободной памяти, и склеиваются вместе, если два освобожденных куска оказались рядом. При новых вызовах malloc сначала просматривается список свободной памяти - нет ли там области достаточного размера? Этот алгоритм описан у Кернигана и Ритчи.

© Copyright А. Богатырев, 1992-95
Си в UNIX

| |




Начало  Назад  Вперед



Книжный магазин