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




Примеры. Хрестоматия по программированию на Си в Unix - стр. 8


/* Подсчет свободных и плохих кластеров. */ void countFree(){ int isFree = 0; /* свободные кластеры */ int isBad = 0; /* сбойные кластеры */ int isReserved = 0; /* спрятанные кластеры */

register ushort n = 0; register ushort clu; /* текущий анализируемый кластер */ int nline = 300;

if( trace ) fprintf(mapfp, "\t\tFAT chart\n"); for(clu=0; clu < MAXCLU; clu++){ if( clu >= 2 ){ n = numCluster(clu); if( n == 0 ) isFree++; if( n == (bit16 ? 0xFFF7 : 0xFF7)) isBad++; if( n >= (bit16 ? 0xFFF0 : 0xFF0 ) && n < (bit16 ? 0xFFF7 : 0xFF7 )) isReserved++; } if( trace ){ if( nline >= 8){ nline = 0; fprintf( mapfp, "\n%03X:\t", clu ); } else nline++; fprintf( mapfp, "%03X ", n ); } } line('='); printf( "Свободно %ld, испорчено %ld, резерв %d кластеров\n", (long)isFree * CLU, /* в байтах */ (long)isBad * CLU, isReserved ); }

void traceclu(nclu, clu) ushort nclu, clu; { if( nclu % 16 == 0 ) fprintf( mapfp, "\n\t" ); fprintf( mapfp, "%03X ", clu ); }

#ifdef LOCAL_MALLOC /* Обратите внимание, что в этой программе память отводится malloc() и освобождается free() по принципу стека (LIFO). Мы могли бы переопределить стандартные функции malloc() и free(), заставив их работать со статической памятью! (Если мы напишем свою функцию с именем, как у стандартной, то будет использоваться НАША функция). */ static char allocArena[32 * 1024]; static char *top = allocArena; char *malloc(n){ char *ptr; /* округлить до целого числа слов */ /* деление с остатком */ /* число int-ов: */ n = (n + (sizeof(int)-1)) / sizeof(int); /* число char-ов:*/ n *= sizeof(int); ptr = top; top += n; return ptr; } free(ptr) char *ptr; { top = ptr; } #endif /*LOCAL_MALLOC*/

/* Пример 31 */ /* Интроспективная программа: печатает сама себя */

#include <stdio.h>

char *text[] = { "#include <stdio.h>", "char *text[] = {", " NULL};", "/* Программа, печатающая свой собственный текст */", "main(){ int i;", " puts(text[0]); puts(text[1]);", " for(i=0; text[i]; i++) putq(text[i]);", " for(i=2; text[i]; i++) puts(text[i]);", "}", "putq(s) char *s; {", " printf(\"\\t\\\"\");", " while(*s){", " if(*s == '\"') printf(\"\\\\\\\"\");", " else if(*s == '\\\\') printf(\"\\\\\\\\\");", " else putchar(*s);", " s++;", " }", " printf(\"\\\",\\n\");", "}", NULL}; /* Программа, печатающая свой собственный текст */ main(){ int i; puts(text[0]); puts(text[1]); for(i=0; text[i]; i++) putq(text[i]); for(i=2; text[i]; i++) puts(text[i]); } putq(s) char *s; { printf("\t\""); while(*s){ if(*s == '"') printf("\\\""); else if(*s == '\\') printf("\\\\"); else putchar(*s); s++; } printf("\",\n"); }




Содержание  Назад  Вперед