|
Процедуры и функции модуля Level4 – команды ОС
INTERFACE
USES common, level1, level2, level3;
PROCEDURE doCommand(c:STRING); {расшифровывает и выполняет команду}
Процедура DOCOMMAND
Содержание задачи |
выделить во введенной строке первое слово (название команды) и вызвать по нему нужную процедуру |
Уровень сложности |
средний |
Модуль |
Level4 |
Входные параметры |
c: STRING – строка с командой |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
cmd_dir … cmd_ver ( для каждой команды ОС); getWord |
Глобальные переменные и константы |
массив comm, переменная restLine |
Действия |
преобразовать все буквы к верхнему регистру; выделить первое слово в строке и сравнить со списком команд; если слово отсутствует – выдать сообщение |
Проверки |
наличие команды в списке |
Комментарии |
используя процедуру getWord выделяем первое слово строки, а остаток ее помещаем в restLine; просматриваем массив comm и запоминаем индекс в случае совпадения команды; по индексу реализуем вызов нужной подпрограммы или выдаем сообщение об ошибочной команде |
Функция FI LENOTFOUND
Содержание задачи |
проверка результата вызова функции |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
fn: STRING – имя файла; print: BOOLEAN – выводить ли сообщение File not found |
Выходные параметры |
нет (только результат функции) |
Тип результата |
BOOLEAN |
Вызываемые процедуры (функции) |
fileID (Level3) |
Глобальные переменные и константы |
нет |
Действия |
сравнивает результат функции fileID с –1 (удалось ли найти такой файл) |
Проверки |
нет |
Комментарии |
нет |
Функция FI LEEXIST
Содержание задачи |
проверка результата вызова функции и, если необходимо, печать сообщения об ошибке |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
fn: STRING – имя файла |
Выходные параметры |
нет (только результат функции) |
Тип результата |
BOOLEAN |
Вызываемые процедуры (функции) |
fileNotFound |
Глобальные переменные и константы |
нет |
Действия |
если результат функции fileNotFound отличен от –1 (файл удалось найти), выводит сообщение, что такой файл уже существует |
Проверки |
нет |
Комментарии |
печать сообщения из fileNotFound блокируется параметром print |
Процедура GETWORD
Содержание задачи |
выделить в заданной строке первое слово (название команды), а остаток поместить в другую переменную |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
is: STRING – полная входная строка с командой |
Выходные параметры |
is: STRING – выходная строка с именем команды; os: STRING – остальная часть строки |
Вызываемые процедуры (функции) |
нет |
Глобальные переменные и константы |
нет |
Действия |
найти позицию пробела и по ней разделить строку на две части |
Проверки |
на отсутствие пробела в строке |
Комментарии |
если пробела нет, то is сохраняется, а os очищается |
Процедура GETWORD8
Содержание задачи |
сформировать строку заданной длины: дополнить пробелами короткую и обрезать длинную |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
is: STRING – полная входная строка с командой |
Выходные параметры |
is: STRING – выходная строка с именем команды; os: STRING – остальная часть строки |
Вызываемые процедуры (функции) |
getWord |
Глобальные переменные и константы |
константа cat_nam |
Действия |
те же, что и в getWord, но обе части строки (имена файлов) приводятся к стандартной длине |
Проверки |
нет |
Комментарии |
обе части строки дополняются пробелами до длины cat_nam или укорачиваются до нее, что облегчает последующий анализ |
Процедура CMD_DIR
Содержание задачи |
в строковом массиве найти элементы, удовлетворяющие заданному условию, и вывести на экран |
Уровень сложности |
средний |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getCatName |
Глобальные переменные и константы |
константы fs_mnf, pusto |
Действия |
просмотреть все записи в каталоге и вывести имена существующих файлов |
Проверки |
нет |
Комментарии |
файл признается несуществующим, если его имя начинается с символа pusto |
Процедура CMD_XDIR
Содержание задачи |
вывести строковый массив на экран в виде таблицы, разделяя при этом строку на составные части |
Уровень сложности |
средний |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getCatName, getCatLen, getCatCluster |
Глобальные переменные и константы |
константы fs_mnf, fs_ml, pusto |
Действия |
вывести заголовок таблицы; просмотреть все записи в каталоге и вывести имена существующих файлов, их длину и кластеры |
Проверки |
нет |
Комментарии |
файл признается несуществующим, если его имя начинается с символа pusto; внешний цикл организуется по записям каталога, а внутренний – по номерам кластеров файла; при выводе особое внимание обратить на оформление столбцов таблицы |
Процедура CMD_TYPE
Содержание задачи |
используя имеющиеся процедуры и функции, организовать вывод содержимого файла на экран |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord8, fileNotFound, readMyFile (Level3) |
Глобальные переменные и константы |
переменная restLine |
Действия |
getWord8 извлекает имя файла, readMyFile его читает; вывод осуществляется стандартным оператором Паскаля |
Проверки |
существование файла в каталоге |
Комментарии |
имя файла берется из restLine, куда процедура doCommand помещает остаток строки |
Процедура DOERA
Содержание задачи |
в соответствующей записи каталога заменить первый символ на pusto |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
n: INTEGER – номер файла (fileID) |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getCatRec, putCatRec, formClusterMap ( все – Level3) |
Глобальные переменные и константы |
константа pusto |
Действия |
прочитать запись каталога, заменить в ней первый символ и сохранить; вызвать процедуру формирования карты кластеров |
Проверки |
нет |
Комментарии |
данная вспомогательная процедура вызывается из cmd_era и cmd_change |
Процедура CMD_ERA
Содержание задачи |
используя имеющиеся процедуры, организовать удаление файла из каталога |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord8, fileID (Level3), doEra |
Глобальные переменные и константы |
переменная restLine |
Действия |
getWord8 извлекает имя файла, fileID определяет его номер, который служит аргументом для doEra |
Проверки |
существование файла в каталоге |
Комментарии |
имя файла берется из restLine, куда процедура doCommand помещает остаток строки; стирание состоит в замене первого символа имени файла на pusto;
противоположна процедуре cmd_unerase |
Процедура CMD_REN
Содержание задачи |
в записи каталога заменить имя файла |
Уровень сложности |
средний |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord8, fileID (Level3), fileExist, getCatRec (Level3), putCatRec (Level3) |
Глобальные переменные и константы |
переменная restLine |
Действия |
getWord8 извлекает имена файлов; по fileID извлекается соответствующая запись каталога и в ней имя заменяется новым |
Проверки |
существование исходного файла в каталоге и отсутствие нового имени в каталоге |
Комментарии |
оба имени файлов берутся из restLine, куда процедура doCommand помещает остаток строки; учитывая стандартную длину имен после getWord8, замену имени в каталоге легко произвести в цикле FOR |
Процедура CMD_COPY
Содержание задачи |
используя имеющиеся процедуры и функции, организовать копирование файла |
Уровень сложности |
средний |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord8, fileNotFound, fileExist, readMyFIle (Level3), writeMyFile (Level3) |
Глобальные переменные и константы |
переменная restLine |
Действия |
getWord8 извлекает имена файлов; проверяется их корректность и затем с помощью readMyFIle и writeMyFile файл легко копируется |
Проверки |
существование исходного файла в каталоге и отсутствие нового имени в каталоге; новое имя не должно быть пустым |
Комментарии |
оба имени файлов берутся из restLine, куда процедура doCommand помещает остаток строки |
Процедура INPUTFILE
Содержание задачи |
принять с клавиатуры строку и сохранить ее в виде файла; предусмотреть проверку длины |
Уровень сложности |
средний |
Модуль |
Level4 |
Входные параметры |
fn: STRING – имя файла |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
writeMyFile (Level3) |
Глобальные переменные и константы |
константы dsk_bps, fs_spc, fs_ml |
Действия |
вывести приглашение ввести текст и принять его; рассчитать максимальную длину текста через известные константы и, если требуется, укоротить строку и выдать сообщение; сохранить строку в файл |
Проверки |
длина текста не превышает максимально разрешенной |
Комментарии |
данная вспомогательная процедура вызывается из cmd_change и cmd_create |
Процедура CMD_CHANGE
Содержание задачи |
используя имеющиеся процедуры, организовать замену текста в файле |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord8, fileID (Level3), readMyFIle (Level3), doEra, inputFile |
Глобальные переменные и константы |
переменная restLine |
Действия |
getWord8 извлекает имя файла, fileID определяет его номер; файл выводится на экран; используя имеющиеся вспомогательные процедуры, старый файл удаляется, вводится текст и сохраняется новый |
Проверки |
существование файла в каталоге |
Комментарии |
имя файла берется из restLine, куда процедура doCommand помещает остаток строки |
Процедура CMD_CREATE
Содержание задачи |
используя имеющиеся процедуры, организовать создание нового файла |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord8, fileExist, inputFile |
Глобальные переменные и константы |
переменная restLine |
Действия |
getWord8 извлекает имя файла; используя вспомогательную процедуру inputFile, вводится текст и сохраняется в файл |
Проверки |
существование файла в каталоге; имя не пустое |
Комментарии |
имя файла берется из restLine, куда процедура doCommand помещает остаток строки |
Процедура CMD_UNERASE
Содержание задачи |
найти в массиве заданный элемент и заменить в нем первый символ |
Уровень сложности |
средний |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord8, fileID (Level3), getCatRec, putCatRec, formClusterMap |
Глобальные переменные и константы |
переменная restLine; константа pusto |
Действия |
getWord8 извлекает имя файла; имитируя удаление, первый символ в нем заменяется на pusto и ищется в каталоге; если удается найти, читается соответствующая запись и в ней восстанавливается первый символ; заново формируется карта кластеров |
Проверки |
существование удаленного файла в каталоге |
Комментарии |
имя файла берется из restLine, куда процедура doCommand помещает остаток строки;
противоположна процедуре cmd_era |
Процедура CMD_SAVE
Содержание задачи |
используя имеющуюся процедуру, организовать сохранение содержимого виртуального диска |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord, writeVirtualDisk (Level3) |
Глобальные переменные и константы |
переменная restLine |
Действия |
getWord извлекает имя файла, в который будет сохранен образ виртуального диска, а затем вызывается стандартная процедура записи с Level3 |
Проверки |
имя файла не пустое (!); неплохо бы дополнительно организовать проверку имени на допустимость в MS-DOS |
Комментарии |
имя файла берется из restLine, куда процедура doCommand помещает остаток строки;
противоположна процедуре cmd_load |
Процедура CMD_LOAD
Содержание задачи |
используя имеющуюся процедуру, организовать чтение содержимого виртуального диска |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getWord, readVirtualDisk (Level3) |
Глобальные переменные и константы |
переменная restLine |
Действия |
getWord извлекает имя файла, из которого будет прочитан образ виртуального диска, а затем вызывается стандартная процедура чтения с Level3 |
Проверки |
имя файла не пустое (!); неплохо бы дополнительно организовать проверку имени на допустимость в MS-DOS |
Комментарии |
имя файла берется из restLine, куда процедура doCommand помещает остаток строки;
противоположна процедуре cmd_save |
Процедура CMD_VER
Содержание задачи |
вывести текстовую информацию о версии |
Уровень сложности |
низкий |
Модуль |
Level4 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
нет |
Глобальные переменные и константы |
нет |
Действия |
вывод на экран информации о версии |
Проверки |
нет |
Комментарии |
нет |
Текст программы
UNIT level4; {Автор Е.А.Еремин. Пермь, 2004}
{команды ОС}
INTERFACE
USES common, level1, level2, level3;
PROCEDURE doCommand(c:STRING);{расшифровывает и выполняет команду}
IMPLEMENTATION
VAR restLine:STRING; {остаток строки}
FUNCTION fileNotFound(fn:STRING;print:BOOLEAN):BOOLEAN;
{TRUE - файла нет, FALSE - есть; print - выводить ли сообщение}
BEGIN fileNotFound:=fileID(fn,print)=-1
END;
FUNCTION fileExist(fn:STRING):BOOLEAN;
{FALSE - файла нет, TRUE - есть; сообщение выдается всегда}
BEGIN fileExist:=FALSE;
IF NOT fileNotFound(fn,FALSE) THEN
BEGIN WRITELN('Файл "'+fn+'" уже существует');
fileExist:=TRUE
END
END;
PROCEDURE getWord(VAR is,os:STRING);
{выделяет в is первое слово, а в os - остаток}
VAR p:INTEGER;
BEGIN os:=''; p:=pos(' ',is);
IF p=0 then EXIT;
os:=is; DELETE(os,1,p); is:=COPY(is,1,p-1);
END;
PROCEDURE getWord8(VAR is,os:STRING);
{то же, но приводит обе части к стандартной длине}
BEGIN getWord(is,os);
WHILE LENGTH(is) < cat_nam DO is:=is+' ';
IF LENGTH(is)>cat_nam THEN is:=COPY(is,1,cat_nam);
WHILE LENGTH(os) < cat_nam DO os:=os+' ';
IF LENGTH(os)>cat_nam THEN os:=COPY(os,1,cat_nam);
END;
PROCEDURE cmd_dir;
VAR i:integer; s:STRING;
BEGIN FOR i:=1 TO fs_mnf DO
BEGIN s:=getCatName(i-1);
IF (LENGTH(s)<>0) AND (s[1]<>pusto)
THEN WRITELN(s);
END;
END;
PROCEDURE cmd_xdir;
VAR i,j,c:integer; s:STRING;
BEGIN WRITELN(' Имя Байт Кластеры');
FOR i:=0 TO fs_mnf-1 DO {по всем записям каталога}
BEGIN s:=getCatName(i); {имя файла}
IF (LENGTH(s)<>0) AND (s[1]<>pusto) THEN{print}
BEGIN WRITE(s); WRITE(getCatLen(i):4,' ');{длина}
FOR j:=1 TO fs_ml DO {кластеры файла}
BEGIN c:=getCatCluster(i,j);
IF c=-1 THEN WRITE(' -')
ELSE WRITE(c:3)
END;
WRITELN
END
END;
END;
PROCEDURE cmd_type;
VAR fn:STRING;
BEGIN fn:=restLine; getWord8(fn,restLine);
IF fileNotFound(fn,TRUE) THEN EXIT;
WRITELN(readMyFile(fn));
END;
PROCEDURE doEra(n:INTEGER);
VAR s:mySector;
BEGIN s:=getCatRec(n); s[1]:=pusto; putCatRec(n,s);
formClusterMap;
END;
PROCEDURE cmd_era;
VAR fn:STRING; n:INTEGER;
BEGIN fn:=restLine; getWord8(fn,restLine);
n:=fileID(fn,TRUE); IF n=-1 THEN EXIT;
doEra(n)
END;
PROCEDURE cmd_ren;
VAR i,j:INTEGER; s:mySector; p1,p2:STRING;
BEGIN p1:=restLine; getWord8(p1,p2);
i:=fileID(p1,TRUE); IF i=-1 THEN EXIT;
IF fileExist(p2) OR (p2=' ') THEN EXIT;
s:=getCatRec(i);
FOR j:=1 to cat_nam do s[j]:=p2[j];
putCatRec(i,s);
END;
PROCEDURE cmd_copy;
VAR p1,p2:STRING; mf:myFile;
BEGIN p1:=restLine; getWord8(p1,p2);
IF fileNotFound(p1,TRUE) THEN EXIT;
IF fileExist(p2) OR (p2=' ') THEN EXIT;
mf:=readMyFile(p1); writeMyFile(p2,mf);
END;
PROCEDURE inputFile(VAR fn:STRING);
VAR t:STRING; i:INTEGER; mf:myFile;
BEGIN WRITELN('Введите текст файла:'); READLN(t);
i:=dsk_bps*fs_spc*fs_ml; {max file length (bytes)}
IF LENGTH(t)>i THEN
BEGIN t:=COPY(t,1,i);
WRITELN('Оставлены первые ',i,' символов');
END;
mf:=t; writeMyFile(fn,mf);
END;
PROCEDURE cmd_change;
VAR fn:STRING; n:INTEGER;
BEGIN fn:=restLine; getWord8(fn,restLine);
n:=fileID(fn,TRUE); IF n=-1 THEN EXIT;
WRITELN(readMyFile(fn)); doEra(n);{старый файл удалить}
inputFile(fn);
END;
PROCEDURE cmd_create;
VAR fn:STRING;
BEGIN fn:=restLine; getWord8(fn,restLine);
IF fileExist(fn) OR (fn=' ') THEN EXIT;
inputFile(fn);
END;
PROCEDURE cmd_unerase;
VAR fn:STRING; n:INTEGER; s:mySector; s1:char;
BEGIN fn:=restLine; getWord8(fn,restLine);
s1:=fn[1];{1-й символ} fn[1]:=pusto;{имя удаленного файла}
n:=fileID(fn,TRUE); IF n=-1 THEN EXIT;
s:=getCatRec(n); s[1]:=s1; putCatRec(n,s);{восст. 1-й символ}
formClusterMap;
END;
PROCEDURE cmd_save;
VAR fn:STRING;
BEGIN fn:=restLine; getWord(fn,restLine);
IF fn='' THEN EXIT;
writeVirtualDisk(fn);
END;
PROCEDURE cmd_load;
VAR fn:STRING;
BEGIN fn:=restLine; getWord(fn,restLine);
IF fn='' THEN EXIT;
readVirtualDisk(fn);
END;
PROCEDURE cmd_ver;
BEGIN WRITELN('(C) E.A.Eremin. Aug. 2004');
WRITELN('Version - 25.08.04');
END;
PROCEDURE doCommand(c:STRING);{расшифровывает и выполняет команду}
VAR i,v:INTEGER;
BEGIN FOR i:=1 to LENGTH(c) DO c[i]:=UPCASE(c[i]);
getWord(c,restLine);
v:=0; FOR i:=1 TO N_com DO IF c=comm[i] THEN v:=i;
CASE v OF
1:cmd_dir;
2:cmd_xdir;
3:cmd_type;
4,5:cmd_era;
6:cmd_ren;
7:cmd_copy;
8:cmd_change;
9:cmd_create;
10:cmd_unerase;
11:cmd_save;
12:cmd_load;
13:cmd_ver;
ELSE WRITELN('invalid command '+c);
END;
END;
END.
На главную страницу
|