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



         

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


/* число секторов для данных */ MAXCLU = (SECT - DATACLU * SPC); /* число кластеров для данных */ MAXCLU = MAXCLU / SPC; /* логические номера кластеров идут с #2 */ MAXCLU += 2; }

/* Прочесть File Allocation Table (таблицу размещения файлов) */ void readFAT(){ register int i;

FAT1 = Malloc(FATSIZE);

Lseek(fd, (long) FATSTART, 0); Read(fd, FAT1, FATSIZE); if(NFAT > 1){ FAT2 = Malloc(FATSIZE); Read(fd, FAT2, FATSIZE);

/* Сравнить копии FAT */ for(i=0; i < FATSIZE; i++ ) if(FAT1[i] != FAT2[i]){ printf( "копии FAT различаются в %d/%d\n", i, FATSIZE ); break; } free( FAT2 ); } if( DESC != FAT1[0] ) printf( "У FAT другой описатель: %02X\n", FAT1[0] & 0xFF ); }

/* Прочесть корневой каталог дискеты. * Он расположен сразу же после копий FAT */ void readRootDir(){ if( DIRSIZE % SECTOR ) printf( "Размер каталога не кратен сектору\n" ); Lseek(fd, (long)FATSTART + (long)FATSIZE * NFAT, 0); droot = (struct dir *) Malloc(DIRSIZE); Read(fd, droot, DIRSIZE ); /* NDIR должно быть 112 для 360K и 720K * 224 для 1.2 Mb */ if( !dironly ) mkdir( root, 0755 ); line('-'); doDirectory(0, NDIR, droot); }

/* Обработать каталог (напечатать, спасти файлы, обойти подкаталоги) */ #define PRINT \ for(j=0; j < level; j++ ) printf( " " ); /* отступ */ \ printf( "%02d\t%s/%-14s %12ld %s\n", \ strt + i, \ cwd, \ basename, \ size, \ isdir(dd[i].attrib) ? "<DIR>" : \ islabel(dd[i].attrib) ? "<LAB>" : "" )

void doDirectory(strt, entries, dd) struct dir dd[]; { register i, j; char basename[40]; static int level = 0; int need_to_get; /* надо ли сбрасывать */

/* line('-'); */ for(i=0; i < entries; i++ ){ uchar c; long size;

if((c = *dd[i].name) == 0xE5 !c) continue; /* файл стерт (дыра) */ mkname(basename, dd[i].name, dd[i].ext); size = LONG(dd[i].size); /* размер файла */

/* проверить шаблон имени, если нужно */ if( !pattern /* pattern задан и */ ( (!dirpattern eq(cwd, dirpattern)) && match(basename, pattern) ) ){ PRINT; need_to_get = !dironly; } else need_to_get = 0;




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