Системное программное обеспечение персональных ЭВМ


Пример 13 - часть 2


/*==== добавление раздела ====*/ add_memb() { if (!checkname()) return; if (!open_lib()) return; /* поиск свободного места в оглавлении */ if (memb_num=find_free()) { getmemb(); /* ввод имени раздела */ /* поиск раздела с таким именем */ if (!find_memb(&a)) { seek_eof(); /* выход на конец файла */ /* формирование эл-та оглавления */ a.memb_addr=fptr; a.memb_size=0; memcpy(a.memb_name,fmemb,8); puts("вводите>"); /* построчный ввод и запись в файл текста раздела */ while(gets(strbuf)!=NULL) { write_memb(strbuf); a.memb_size++; } /* запись эл-та на место свободного */ seek_dir(memb_num); write_dir(&a); prt("Раздел создан"); } else prt("Раздел уже есть в библиотеке"); } else prt("Нет места в оглавлении"); close_lib(); } /*==== замена раздела ====*/ repl_memb() { if (!checkname()) return; if (!open_lib()) return; getmemb(); /* ввод имени раздела */ /* поиск раздела с таким именем */ if (memb_num=find_memb(&a)) { seek_eof(); /* выход на конец файла */ /* формирование эл-та оглавления */ a.memb_addr=fptr; a.memb_size=0; puts("вводите>"); /* построчный ввод и запись в файл текста раздела */ while(gets(strbuf)!=NULL) { write_memb(strbuf); a.memb_size++; } /* запись эл-та на прежнее место */ seek_dir(memb_num); write_dir(&a); prt("Раздел заменен"); } else prt("Раздела нет в библиотеке"); close_lib(); } /*==== переименование раздела ====*/ ren_memb() { if (!checkname()) return; if (!open_lib()) return; getmemb(); /* ввод имени раздела */ /* поиск раздела с таким именем */ if (memb_num=find_memb(&a)) { printf("Новое имя: "); getmemb(); /* поиск раздела с новым именем */ if (find_memb(&a)) prt("Раздел с таким именем уже есть"); else { /* замена имени и запись эл-та на прежнее место */ memcpy(a.memb_name,fmemb,8); seek_dir(memb_num); write_dir(&a); prt("Раздел переименован"); } } else prt("Раздела нет в библиотеке"); close_lib(); } /*==== поиск раздела ====*/ /* функция при успешном поиске возвращает номер элемента и элемент оглавления в c, при неуспешном - 0 */ int find_memb(struct lib_dir *c) { int i; seek_dir(1); /* выход на начало оглавления */ for(i=0; i<memb_max; i++) { /* чтение очередного раздела и сравнение имени */ read_dir(c); if (!memcmp(fmemb,c->memb_name,8)) return(i+1); } return(0); } /*==== поиск свободного элемента оглавления ====*/ int find_free() { int i; seek_dir(1); /* выход на начало оглавления */ for(i=0; i<memb_max; i++) { /* чтение очередн.раздела,проверка 1-го символа имени */ read_dir(&a); if (a.memb_name[0]==0) return(i+1); } return(0); } /*==== удаление раздела ====*/ del_memb() { if (!checkname()) return; if (!open_lib()) return; getmemb(); /* ввод имени раздела */ /* поиск раздела с таким именем */ if (memb_num=find_memb(&a)) { /* замена 1-го символа имени на 0 и запись эл-та на прежнее место */ a.memb_name[0]=0; seek_dir(memb_num); write_dir(&a); prt("Раздел удален"); } else prt("Раздел не найден в библиотеке"); close_lib(); } /*==== поиск и распечатка раздела ====*/ find_out_memb() { int i; if (!checkname()) return; if (!open_lib()) return; getmemb(); /* ввод имени раздела */ /* поиск раздела с таким именем */ if (find_memb(&a)) { print_head(&a); /* распечатка эл-та оглавления */ seek_memb(a.memb_addr); /* выход на начало раздела */ for (i=0; i<a.memb_size; i++) { /* построчное чтение и печать раздела */ read_memb(strbuf); printf("%s\n",strbuf); } prt("Конец раздела"); } else prt("Раздел не найден в библиотеке"); close_lib(); } /*==== просмотр оглавления библиотеки ====*/ look_membs() { int i, k; if (!checkname()) return; if (!open_lib()) return; for(k=1,i=0; i<memb_max; i++) { /* чтение очередного эл-та огдавления и распечатка его, если он не свободен */ read_dir(&a); if (a.memb_name[0]) { printf("%3d ",k++); print_head(&a); } } prt("Конец библиотеки"); close_lib(); } /*==== запись пустого оглавления ====*/ form_lib() { int i; /* формирование пустого эл-та оглавления */ for(i=0;i<8;a.memb_name[i++]=0); a.memb_size=memb_max; a.memb_addr=0; /* запись memb_max+1 пустых эл-тов */ for (i=0; i<=memb_max; i++) write_dir(&a); } /*==== список библиотек ===*/ list_lib() { int i; /* поиск первого LBR-файла */ i=first_f(strbuf); while (i) { /* распечатка имени найденного и поиск следующего */ printf("%s\n",strbuf); i=next_f(strbuf); } prt("Конец списка"); } /*==== справка по библиотеке ===*/ query_lib() { struct file_info a; if (!checkname()) return; if (!open_lib()) return; lib_info(&a); /* получение информации */ close_lib(); prt_info(&a); /* печать информации */ } /*==== переименование библиотеки ===*/ ren_lib() { if (!checkname()) return; strcpy(strbuf,libname); printf("Старое имя > %s\n",libname); printf("Новое имя : "); getlib(); if (ren_f(strbuf,libname)) prt("Библиотека переименована"); else { prt("Переименование не удалось"); strcpy(libname,strbuf); } } /*==== удаление библиотеки ===*/ del_lib() { if (!checkname()) return; if (del_f()) { prt("Библиотека удалена"); libname[0]=0; } else prt("Удаление не удалось"); } /*== ПРИМЕР 10.7 == файл 10_7_H.C ==*/ /*================= Работа с библиотекой =================*/ /* Функции handle-ориентированного ввода-вывода */ #include <dos.h> #include <10_7.h> extern int SIZE; /* размер эл-та оглавления */ extern int memb_max; /* число мест в оглавлении */ extern char libname[80]; /* имя файла-библиотеки */ extern unsigned long fptr; /* текущая позиция в файле */ static struct lib_dir a; /* буфер эл-та */ static int lib; /* дескриптор файла-библиотеки */ static struct FIND { /* структура DTA для функций */ char reserved[30]; /* поиска: 0x4E, 0x4F */ char fname[13]; } *dta; static union REGS rr; static struct SREGS sr; /*==== индикация ошибки ввода-вывода ====*/ iferror(char *s) { if (rr.x.cflag) { printf("Ошибка %s: %x\n",s,rr.x.ax); exit(); } } /*==== создание библиотеки ====*/ creat_lib() { int f; rr.h.ah=0x5b; /* функция CreatNewFile */ rr.x.cx=0; /* атрибут файла */ sr.ds=FP_SEG(libname); /* адрес строки имени */ rr.x.dx=FP_OFF(libname); intdosx(&rr,&rr,&sr); if (rr.x.cflag) { if (rr.x.ax==0x50) { printf("Файл %s уже существует\n",libname); do { printf("Создать файл заново (y/n)?"); if ((f=getche())=='n') { prt("\nБиблиотека не создана"); return; } } while (f!='y'); rr.h.ah=0x3c; /* функция CreatFile */ rr.x.cx=0; /* атрибут файла */ sr.ds=FP_SEG(libname); /* адрес строки имени */ rr.x.dx=FP_OFF(libname); intdosx(&rr,&rr,&sr); } iferror("создания"); } lib=rr.x.ax; printf("\nЧисло разделов MAX >"); scanf("%d",&memb_max); form_lib(); /* формирование пустого оглавления */ close_lib(); prt("Библиотека создана"); } /*==== открытие файла ====*/ int open_lib() { rr.h.ah=0x3d; /* функция Open */ rr.h.al=2; /* режим доступа Read/Write */ sr.ds=FP_SEG(libname); /* адрес строки имени */ rr.x.dx=FP_OFF(libname); intdosx(&rr,&rr,&sr); if (rr.x.cflag) { prt("Файл не открыт"); return (0); } lib=rr.x.ax;__ _.fptr=0; read_dir(&a); memb_max=a.memb_size; return (1); } /*==== закрытие файла ====*/ close_lib() { rr.h.ah=0x3e; /* функция Close */ rr.x.bx=lib; /* дескриптор */ intdosx(&rr,&rr,&sr); iferror("закрытия"); } /*==== вывод в файл/ввод из файла ====*/ f_rdwr(unsigned char op, /* код функции DOS */ char *ms, /* сообщение на случай ошибки */ int s, /* число байт */ void *a) /* адрес памяти */ { rr.h.ah=op; /* ф-ция Write (0x40) или Read (0x3F) */ rr.x.bx=lib; /* дескриптор */ rr.x.cx=s; /* размер блока */ sr.ds=FP_SEG(a); /* адрес данных */ rr.x.dx=FP_OFF(a); intdosx(&rr,&rr,&sr); iferror(ms); fptr+=rr.x.ax; } /*==== запись элемента в оглавление ====*/ write_dir(struct lib_dir *a) { f_rdwr(0x40,"записи",SIZE,a); } /*==== чтение элемента из оглавления ====*/ read_dir(struct lib_dir *a) { f_rdwr(0x3f,"чтения",SIZE,a); } /*=== позиционирование указателя на элемент оглавления ===*/ seek_dir(int n) { unsigned long ptr; ptr=n*SIZE;__ _.seek_f(ptr); } /*==== позиционирование указателя файла ====*/ seek_f(unsigned long pos) { rr.h.ah=0x42; /* функция Seek */ rr.x.bx=lib; /* дескриптор */ rr.x.cx=pos>>16; /* смещение */ rr.x.dx=pos&0x0ffff; rr.h.al=0; /* 0 - от начала */ intdos(&rr,&rr); iferror("позиционирования"); fptr=rr.x.dx; fptr=(fptr<<16)|rr.x.ax; } /*==== установка указателя на конец файла ====*/ seek_eof() { rr.h.ah=0x42; /* функция Seek */ rr.x.bx=lib; /* дескриптор */ rr.x.cx=0; /* смещение */ rr.x.dx=0; rr.h.al=2; /* 2 -от конца */ intdos(&rr,&rr); iferror("позиционирования"); fptr=rr.x.dx; fptr=(fptr<<16)|rr.x.ax; } /*==== установка указателя на начало раздела ====*/ seek_memb(unsigned long ptr) { seek_f(ptr); } /*==== запись в раздел строки текста ====*/ write_memb(char *s) { int l; l=strlen(s)+1; f_rdwr(0x40,"записи",l,s); } /*==== чтение из раздела строки текста ====*/ read_memb(char *s) { unsigned long i; i=fptr; f_rdwr(0x3f,"чтения",200,s); fptr=i+strlen(s)+1; seek_f(fptr); } /*==== поиск первого файла .LBR ====*/ int first_f(char *c) { char findstr[]="*.LBR"; /* получение адреса DTA */ rr.h.ah=0x2f; /* функция GetDta */ intdosx(&rr,&rr,&sr); dta=(struct FIND *)MK_FP(sr.es,rr.x.bx); /* поиск */ rr.h.ah=0x4e; /* функция FindFirst */ rr.x.cx=0; /* атрибут файла */ sr.ds=FP_SEG(findstr); /* адрес строки - маски поиска */ rr.x.dx=FP_OFF(findstr); intdosx(&rr,&rr,&sr); if (rr.x.cflag) return(0); strcpy(c,dta->fname); return(1); } /*==== поиск следующего файла .LBR ====*/ int next_f(char *c) { rr.h.ah=0x4f; /* функция FindNext */ intdos(&rr,&rr); if (rr.x.cflag) return(0); strcpy(c,dta->fname); return(1); } /*==== переименование файла ====*/ int ren_f(char *old, char *new) { rr.h.ah=0x56; /* функция Rename */ sr.ds=FP_SEG(old); /* адрес строки старого имени */ rr.x.dx=FP_OFF(old); sr.es=FP_SEG(new); /* адрес строки нового имени */ rr.x.di=FP_OFF(new); intdosx(&rr,&rr,&sr); if (rr.x.cflag) return(0); return(1); } /*==== удаление файла ====*/ int del_f() { rr.h.ah=0x41; /* функция DeleteFile */ sr.ds=FP_SEG(libname); /* адрес строки имени */ rr.x.dx=FP_OFF(libname); intdosx(&rr,&rr,&sr); if (rr.x.cflag) return(0); return(1); } /*==== получение информации о файле ====*/ lib_info(struct file_info *a) { seek_eof(); /* выход на конец файла */ a->size=fptr; rr.h.ah=0x57; /* функция Set/QueryFileTime/Date */ rr.h.al=0; /* проверить дату и время */ rr.x.bx=lib; /* дескриптор */ intdos(&rr,&rr); iferror("функции 0x57"); a->date=rr.x.dx; a->time=rr.x.cx; rr.h.ah=0x43; /* функция Set/QueryFileAttribute */ rr.h.al=0; /* проверить атрибут */ sr.ds=FP_SEG(libname); rr.x.dx=FP_OFF(libname); intdosx(&rr,&rr,&sr); a->attr=rr.x.cx; }




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