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




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


if( n[0] == 0x05 ) n[0] = 0xE5; /* подставной символ */ for(i=0; i < 8 && n[i] && n[i] != ' ' ; i++) *res++ = n[i]; if( e[0] != ' ') *res++ = '.'; for(i=0; i < 3 && e[i] && e[i] != ' ' ; i++) *res++ = e[i]; *res = '\0';

while( *start ){ if( isalpha(*start) && isupper(*start)) *start = tolower(*start); start++; } } /* ------------------------------------------------------- */ /* Получить запись из FAT для кластера clu */ ushort numCluster(clu) ushort clu; { ushort n;

if( clu >= MAXCLU ) printf( "Слишком большой номер кластера %03X >= %03X\n", clu, MAXCLU ); if( bit16 ){ /* 16 бит на номер кластера */ n = INT( &FAT1[ 2*clu ]); n &= 0xFFFF; return n; } /* иначе 12 бит на номер кластера */ n = clu + clu/2 ; n = INT( &FAT1[n] ); if( clu % 2 ){ /* нечетный */ n >>= 4; } n &= 0xFFF; return n; }

/* Узнать следующий кластер файла. 0 если последний */ ushort nextCluster(clu) ushort clu; { clu = numCluster(clu); if( clu >= (bit16 ? 0xFFF8 : 0xFF8 )) return 0; /* EOF */ return clu; }

/* Прочесть кластер и сохранить его в файле и буфере */ getCluster(clu, fp, size, buffer) ushort clu; /* логический кластер (2..) */ FILE *fp; /* файл для спасения */ long size; /* осталось дописать */ char *buffer; /* буфер для кластера */ { long offset; int rd, howmuchtoread;

if( size <= 0L ){ printf( "CLUSTER %03X лишний\n", clu ); exit(3); } /* Вычислить смещение. Кластеры нумеруются начиная с #2 */ offset = (clu - 2 + DATACLU) * (long) CLU; Lseek(fd, offset, 0);

/* Сколько байт прочесть ? */ howmuchtoread = (size > CLU) ? CLU : size; rd = Read(fd, buffer, howmuchtoread); if( fp != NULL ) fwrite(buffer, 1, rd, fp); return ( rd < 0 ) ? 0 : rd; } /* ----------------------------------------------------------------- * dosfs -rPATH файлы скидываются в каталог PATH, а не в /tmp * dosfs ... "шаблон" сбрасываются только файлы с подходящими * именами, например: * dosfs 1.2 "/*.c" *.c из корня дискеты * dosfs 1.2 "/dir1/*.c" *.c из каталога /dir1 * dosfs 1.2 "*.c" *.c из всех каталогов * dosfs -d только просмотр каталогов, без сброса файлов * Пример: dosfs -qr. 360 */ void main(argc, argv) char *argv[]; { if( argc < 2 ) goto usage; if( *argv[1] == '-' ){ /* разбор ключей */ char *keys = &argv[1][1]; while(*keys){ switch(*keys){ case 't': /* включить трассировку */ trace++; if((mapfp = fopen( ".Map", "w" )) == NULL ) trace = 0; break; case 'q': /* без запросов (quiet) */ ask = 0; break; case 'r': /* переназначить root */ root = keys+1; goto breakwhile; case 'd': /* dosfs -d == команда dir */ dironly++; break; } keys++; } breakwhile: argc--; argv++; } if( argc < 2 ) goto usage; if( pattern = argv[2] ){ /* может быть NULL */ char *s = strrchr(pattern, '/'); if(s){ /* PATH/PATTERN */ dirpattern = pattern; /* PATH */ *s = '\0'; pattern = s+1; /* PATTERN */ }else{ /* просто PATTERN */ dirpattern = NULL; } } setbuf(stdout, NULL); /* отменить буферизацию */ readBoot(drive(argv[1])); readFAT(); countFree(); readRootDir(); exit(0); usage: printf( "Вызов: dosfs [-dqtrDIR] устройство [\"шаблон\"]\n" ); exit(4); }




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