если открыт из файл то

вниз защита связей;

имя лог (открыт из файл) := ложь;

запись из книга из файл := ложь;

пользователи из книга из файл — := 1;

вверх гномы все;

проц (имя файл) пуст scratch = стереть;

  1. . Запросы позиции.

{аа) „Текущей позицией” книги, открытой с данным файлом является значение, именуемое полем тпоз этого файла. Она продвигается каждой операцией обмена в соответствии с числом записанных или прочитанных ли­тер.

Если с — номер текущей литеры и 1b — длина текущей строчки, то всег- да1Сс<1Ь+1.Изс = 1 вытекает, что следующая операция обмена будет применена к первой литере этой строчки, а из с = 1b + 1 вытекает, что данная строчка переполнена и следующая операция обмена будет вызывать какую- то процедуру обработки события. Если 1b = 0, то данная строчка пуста и, значит, всегда переполнена. Соответствующие оговорки относятся и к но­мерам текущих строчки и страницы. Если данная страница переполнена, то текущая строчка пуста, а если переполнена данная книга, то пусты и теку­щая страница, и текущая строчка (е).

bb) Пользователь может определить текущую позицию при помощи процедур номер литеры, номер строчки и номер страницы (а, Ь, с).

сс) Если в текущей позиции переполнена строчка, страница или книга, то говорят, что она находится за пределами „физического файла” (f, g, h).

dd) Если при чтении текущая позиция находится на логическом конце (книги), то говорят, что она находится за пределами ,.логического файла” (i)J

{Каждая процедура в этом разделе вызывает не определено, если при входе в нее не открыт соответствующий файл.} а) проц номер литеры = (имя файл f) цел:

(открыт из f I с из тпоз из f I не определено);

проц (имя файл) цел char number = номер литеры;

  1. проц номер строчки = (имя файл f) цел:

(открыт из f I 1 из тпоз из f I не определено);

проц (имя файл) цел line number = номер строчки;

  1. проц номер страницы = (имя файл f) цел:

(открыт из f I р из тпоз из f I не определено);

проц (имя файл) цел page number = номер страницы;

  1. проц ^текущая позиция = (имя файл f) позиция:

(открыт из f I тпоз из f I не определено; пропуск);' е) проц ^границы книги = (имя файл f) позиция:

начало позиции тпоз = текущая позиция (f);

цел р = р из тпоз, 1 = 1 из тпоз;

выб текст из f в

(текст tl):

(цел pb = вегр tl;

цел lb = (р < 0Vр > pb 101 вегр tl [р]);

цел cb = (К 0 VI > lb 101 вегр tl [р] [1]);

(pb, lb, cb) ), .

(подвтекст t2):

(цел pb = вегр t2;

цел 1b = (р < ОVр > pb ІОІ вегр t2 [р]);

цел cb = (1<O/l> 1b ІОІ вегр t2 [р] [1]);

(pb, lb, cb)) быв

конец;

0 проц ^строчка окончена = (имя файл f) лог:

(цел с = с из текущая позиция (f);

с > с из границы книги (f) );

  1. проц *-страница окончена = (имя файл f) лог:

(цел 1 = 1 из текущая позиция (0;

  1. > 1 из границы книги (0 );

  1. проц *-физ файл окончен = (имя файл 0 лог:

(цел р = р из текущая позиция (0;

р > р из границы книги (0 );

  1. проц^лог файл окончен = (имя файл 0 лог:

і (заполн из книга из f вне текущая позиция (0 );

10.3.1.6. Процедуры расположения.

(аа) В книге, введенной с внешнего насителя некоторой системной-зада- чей, строчки и страницы могут быть разной длины. С другой стороны, все строчки и страницы заведенной (10.3.1.4.сс) книги первоначально имеют размер, указанный пользователем. Однако если в ходе вывода в сжимае­мую книгу (10.3.1.3.f0 вызывается нов строчка (нов страница) с текущей позицией в той же строчке (странице), что и логический конец этой книги, то данная строчка (страница, содержащая эту строчку,) сокращается до но­мера литеры (номера строчки) этого логического конца. Таким образом, печ ((’’абвг”, нов строчка) ) может вызвать уменьшение текущей строчки до длины в 5 литер. Отметим, что то же вполне осмысленно и для строчки, не содержащей литер, и для страницы, не содержащей строчек.

Хотя действия канала, на котором книги как сжимаемы, так и позволя­ют произвольный доступ (lO.3.1.3.f0 корректно определены, предполага­ют, что в фактических реализациях такая комбинация вряд ли встретится.

bb) Процедуры вперед (а), нов строчка (с) и нов страница (d) служат продвижению текущей позиции к следующей литере, строчке и странице со­ответственно. Однако они не изменяют (за исключением того, что преду­смотрено в сс ниже) содержания пропускаемых позиций. Поэтому печ (("а”, назад, вперед)) и печ ((”а”, назад, пробел)) дают разные результа­ты.

Текущую позицию можно также изменить вызовами назад (Ь), уст но­мер литеры (к) и на соответствующих каналах вызовами установить (і) и уст нач (j).

сс) Содержание вновь заведенной книги не определено, при этом ее текущая позиция и логический конец оба равны (1,1,1). В процессе вывода она заполняется литерами и в соответствии с этим ее логический конец продвигается вперед. Если в ходе литерного вывода вызывается вперед с текущей позицией на логическом конце, то записывается литера пробел(аналогичное происходит в случае вызова нов строчка и нов страница, если данная книга несжимаема).

Вызов установить, пытающийся оставить текущую позицию за преде­лами логического конца, приводит к вызову не определено (некоторое осмысленное действие системы может тогда продвинуть логический конец к данной текущей позиции или даже к физическому концу книги). Следо­вательно, нет законного способа, которым можно было бы вывести теку­щую позицию за пределы логического конца или который оставлял бы лю­бую литеру в пределах логического файла в ее начальном неопределенном состоянии.

dd) Операция чтения или записи или вызов вперед, нов строчка, нов страница, установить' или уст номер литеры могут вывести текущую пози­цию за пределы физического или логического файла (10.3.1.5.сс, dd), но это не вызывает немедленных последствий. Однако перед любой дальней­шей попыткой обмен# или следующим вызовом вперед, нов строчка или нов страница (но не установить или уст номер литеры) текущая позиция должна сделаться „хорошей”. Файл будет „хорошим”, если его текущая позиция не находится при записи (чтении) вне физического (логического) файла (10.5.1.1.СС, dd). Страница (строчка) будет „хорошей”, если не пе­реполнен номер строчки (номер литеры). Следовательно, в нужных слу­чаях вызывается процедура обработки события (ІО.З.І.З.сс), соответствую­щая при конце лог файла, при конце физ файла, при конце страницы или при конце строчки. Действие по умолчанию, за исключением форматного обмена (использующего проверить позицию, 10.3.3.2.с), состоит в том, что­бы вызвать, если процедура обработки ситуации вырабатывает ложь, соот­вет (гвенно не определено, не определено, нов страница или нов строчка. По­сле этого (или если вырабатывается истина), если позиция остается не хоро­шей, снова вызывается процедура обработки события (не обязательно та же самая).

ее) Состояние файла (ІО.З.І.З.ЬЬ) управляет некоторыми действиями процедур расположения. Если настройка на запись/чтение дает чтение, то действие вперед, нов строчка и нов страница при попытке пересечь логиче­ский конец состоит в вызове процедуры обработки события, соответствую-х щей при конце лог файла, вместе с вызовом по умолчанию не определено; если же она дает запись, то результатом будет вывод пробелов (при на­стройке на двоичное запись неопределенной литеры) либо сжатие текущей строчки или страницы (см. сс). Если при входе в процедуру расположения настройка на запись/чтение не определена, то вызывается не определено. По выходе восстанавливается та настройка на запись/чтение, которая была при входе.}

  1. проц вперед = (имя файл f) пуст:

если -1 открыт из f то не определено иначе

лог чтение =

(для чтения из f I истина I : для записи из f I ложьI не определено; пропуск);

( строчка хороша (f, чтение) I не определено); имя позиция тпоз .= тпоз из f;

если чтение то с из тпоз +:= 1

иначе

если лог файл окончен (f) то если для двоичн из f то

(текст из f I (подвтекст t2) :

t2 [р из тпоз] [1 из тпоз] [с из тпоз] := пропуск);

с из тпоз + := 1; заполн из книга из f := тпоз иначе вывести литеру (f, ”)

все

иначе с из тпоз+:= 1

все

все

все;

проц (имя файл) пуст space = вперед;

  1. проц назад = (имя файл f) пуст;

если открыт из f то не определено иначе имя цел с = с из тпоз из f;

(с > 1 I с - := 1 I не определено) все;

проц (имя файл) пуст back space = назад;

  1. проц нов ая ft строчка = (имя файл f) пуст: если открыт из f то не определено

иначе

лог чтение =

(для чтения из f I истина I : для записи из f I ложь Iне определено; пропуск);

(-1 страница хороша (f, чтение) I не определено);

имя позиция тпоз = тпоз из f, заполн = заполн из книга из f;

если р из тпоз = р из заполнд 1 из тпоз =1 из заполн то с из тпоз := с из заполн;

если чтение то нов строчка (f) иначе

если сжимаем (f)

то имя цел pl = р из заполн, 11 = 1 из заполн; подвтекст текст = (текст из f I (подвтекст t2) : t2);

текст [pl] [В] := текст [pl] [И] [: с из заполн—1]

иначе пока -п строчка окончена (f) цк вперед (f) кц все;

' тпоз := заполн := (р из тпоз, 1 из тпоз +1,1) все

иначе тпоз (р из тпоз, 1 из тпоз + 1,1) все

все; ‘ .

проц (имя файл) пуст new line = нов строчка;

  1. проц нов страница = (имя файл f) пуст:

если -Ч открыт из f то не определено »

иначе

лог чтение =

(для чтения из f I истина I :для записи из f I ложь

  1. не определено; пропуск);

(-, страница хороша (f, чтение) I не определено);

имя позиция тпоз = тпоз из f,

ппоз = заполн из книга из f;

если р из тпоз = р из ппоз то тпоз := ппоз;

если чтение то нов страница (f) иначе

если сжимаем (f) А

1 из ппоз < 1 из границы книги (f)

то имя цел pl = р из ппоз, 11 = 1 из ппоз;

подвтекст текст = (текст из f I

(подвтекст t2) : t2);

текст [pl] [И] := текст [pl] [11]

[: с из ппоз — 1];

текст [pl] := текст [pl]

[: (с из ппоз >1111111-1)]

иначе пока -fi страница окончена (f)

цк нов строчка (f) кц все;

тпоз :=ппоз := (риз тпоз + 1,1,1) все

иначе тпоз := из тпоз +1,1,1) все

все;

проц имя файл пуст newpage = нов страница;

  1. {Каждая из трех следующих процедур либо вырабатывает истина и тогда соответствующая строчка, страница или файл хороши (dd), либо вы­рабатывает ложь и тогда текущая позиция может оказаться за пределами логического файла или может переполниться номер страницы, либо же она циклится до тех пор, пока не устранится соответствующая причина, либо такая процедура прекращается в результате какого-то перехода. При выхо­де из такой процедуры настройка на запись/чтение определяется ее пара­метром чтение. Jпроц строчка хороша = (имя файл f, лог чтение) лог: начало лог не оконч;