Научно-технический кооператив "Спрайт" г. Новосибирск 1993 ОПЕРАЦИОННАЯ СИСТЕМА "С П Р А Й Т" (версия 1.5) ПРАКТИЧЕСКОЕ РУКОВОДСТВО ПО ИСПОЛЬЗОВАНИЮ ИНСТРУМЕНТАЛЬНЫХ СИСТЕМНЫХ СРЕДСТВ ОС "СПРАЙТ" 1. ГРУППОВАЯ ОБРАБОТКА ФАЙЛОВ СРЕДСТВАМИ КОМАНДЕРА Серия групповых вызовов Командера (см. РСП.II.2.21-23) предназначена для поддержки групповой обработки каталогов, под которой понимается последовательный перебор всех файлов данного ФК и применение некоторой процедуры обработки к его файлам, удовлетворяющим заданным условиям поиска (фильтрам); при этом возможно рекурсивное погружение в подкаталоги. Под групповым именем ниже понимается шаблон с символами умолчания * и ?, используемый как один из фильтров поиска; иначе имя называется явным, и ему может соответствовать не более одного файла. Другими фильтрами при поиске могут быть: атрибуты файла (все/каталоги/обычные, все/нескрытые), дата файла (любая/ больше/меньше заданной) пользовательское указание в виде ответа на запрос подтверждения обработки. 1.1. Стек FCB Командера и его использование При рекурсивной обработке каталогов необходим стек для хранения цепочки FCB открытых ФК. Такой стек имеется в ра- бочей области Командера. Управление им скрыто, а пользова- телю доступна лишь ссылка (через CURFILE) на текущую FCB, обычно лежащую на вершине стека. Младший бит кода вызова указывает Командеру, с какой FCB работать данному вызову (если нужно): - 0: FCB хранится у пользователя, ссылка на него передает- ся в CURFILE, - 1: FCB хранится на вершине стека; Командер заносит в CURFILE ссылку на нее, обеспечивая доступ себе и поль- зователю. Стандартный код вызовов уже включает в себя то или дру- гое значение этого бита. Стек необходим только для рекурсивного погружения в под- каталоги, выполняемого вызовом GROUPFK (кроме того, он еще используется при загрузке и копировании файлов). Если по- гружения нет, можно обойтись и пользовательской FCB. Лучше всего настройку на FCB в стеке и ее заполнение вы- полнять вызовами SCANPAT/SCANPATH, которые сразу же разби- рают путь доступа, открывают нужный каталог, заносят необ- ходимые связи и шаблон поиска или имя. При создании FCB на вершине стека его указатель не сдви- гается, поэтому повторное создание выдаст тот же адрес. Со- хранение и восстановление FCB в стеке происходит при рекур- сивном спуске в ФК. Использование собственной FCB грозит рядом неприятностей и требует дополнительной работы. Некоторые вызовы Командера допускают переход на вектор обработки ошибки ERRVECT. При этом стандартный обработчик закрывает все FCB из стека, а затем завершает исполнение программы и переходит в командный диалог. Открытые файлы программы при этом остаются открытыми. Во избежание этого программа должна перехватывать ERR- VECT, задавая свою реакцию на ошибку, либо возвращающую управление на основную ветвь исполнения, где файлы будут закрыты (что не всегда возможно), либо закрывающую их явно с последующим вызовом стандартного обработчика ошибок (его адрес выдается при установке вектора вызовом SETVECTOR). Емкость стека Командера - около 10 FCB, причем контроль переполнения не ведется: такая глубина вложенности считает- ся нереальной. 1.2. GROUP - инициализация групповой обработки Входные данные: - CURFILE указывает на FCB просматриваемого каталога, ко- торый должен быть предварительно открыт и содержать шаблон поиска. - В AY передается адрес программы-обработчика отдельных файлов. - В KEYS и PARVALS передаются значения ключей и числовых параметров, используемых для управления поиском (см.вы- зов GROUPX). FCB и программа-обработчик должны находиться в видимой Командеру памяти, каковая определяется той конфигурация, из которой он был вызван с заменой верхнего банка на ROM1, где находится сам Командер. Действия вызова: - В ячейку GRPADR заносится адрес обработчика для GROUPX и GROUPFK. - Сбрасываются в 0 счетчик найденных файлов TOTCNT и от- ступ для вывода имен файлов OTSTUP. - Вызывается GROUPX. - Если целевой файл задан групповым именем, выдается число обработанных файлов TOTCNT; если, кроме того, установ- лен 6 бит значения ключа N в KEYS, выдается размер сво- бодной памяти (этим пользуется, например, директива DIR). - Закрывается обработанный каталог. 1.3. GROUPX - цикл групповой обработки Этот вызов выполняет поиск файлов по текущему каталогу и вызывает для каждого найденного по шаблону файла программу- обработчик с информацией о режиме работы. Входные данные: - GRPADR, TOTCNT, OTSTUP, CURFILE, установленные вызовом GROUP; - При поиске по групповому имени учитываются ключи: N[7] - обработка без подтверждения, N[6] - обработка без запроса, Q[7] - обработка без подтверждения и выдачи файлов, D[7] - поиск только каталогов, F[7] - поиск только файлов H[7] - поиск по всем файлам, с учетом скрытых, X[7] - поиск вглубь по подкаталогам, и параметры, соответствующих ключам >,< - поиск со срав- нением дат (в соотв.параметрах). - При выдаче протокола обработки учитываются ключи: L[7] - выдача длины в байтах вместо дат, W[7] - выдача только имен Работают стандартные варианты ответов на запросы. Действия вызова: - Запросы: - для явного имени искомого файла обработка ведется без запроса и заканчивается после первого нахождения; - для группового имени обработка ведется с запросом, ес- ли он не отменен ключами N,Q или ответом "все" на оче- редной запрос. - Протокол: имена файлов, прошедших все фильтры, выдаются на экран в соответствии с ключами L,W, если протокол не отменен ключом Q. - Поиск: начинается с начала каталога. - для группового имени без ключа X выполняется 1 про- смотр каталога, при котором обрабатываются все файлы и подкаталоги, профильтрованные групповым именем, датой и ключами H,D,F; - для группового имени с ключом X выполняются 2 просмот- ра каталога: при 1-м обрабатываются только обычные файлы, профильтрованные групповым именем, датой и клю- чами H,D,F, на 2-м - ВСЕ подкаталоги (для организации рекурсивного погружения). - Для обработки вызывается программа с адресом в GRPADR; ее интерфейс описан в 1.4. Выходные данные: - C=0/1 - шаблон задает явное/групповое имя; - возможен выход на вектор обработки ошибки Командера по ошибке ДОС. 1.4. Программа-обработчик Обработчик вызывается для каждого файла и ФК, профильт- рованного в GROUPX. Входные данные: - N=0/1 - идет 1/2 просмотр каталога; - C=0/1 - обрабатывается файл/ФК; - CURFILE указывает на FCB с шаблоном поиска, настроенный на позицию обратываемого файла в каталоге; - DMA здесь настроен на буфер CATBUF Командера (9F00), ку- да копируется запись каталога для данного файла (FPB), содержащая, в частности, его полное имя и атрибуты; Зная порядок обработки (1.3), на основании этих данных можно выяснить: - X[7]=0: на обработку передан файл (C=0) или ФК (C=1),имя которого соответствует групповому; - X[7]=N=0: файл с подходящим именем; - X[7]=0,N=1: ФК для рекурсивного погружения. Для целевой обработки переданного файла, в ходе которого FCB изменяется (открытие, переименование, удаление), необ- ходимо: - скопировать FCB в другой буфер и работать с ним; - вызовы ДОС указывать с субкодом BACK!CONT (поиск с теку- щей позиции: при этом будет найден и обработан тот же самый файл). Переданный обработчику FCB файла изменять нельзя! (см., впрочем, 1.6). Для рекурсивной обработки подкаталогов следует при полу- чении C=1 в обработчике вызывать GROUPFK. 1.5. GROUPFK - погружение в подкаталог Вызов поддерживает два режима рекурсивной обработки под- каталогов: 1) Объектом обработки является ВЕСЬ найденный подкаталог: требуется обработка всех входящих в него файлов (как в директивах COPY или RD). Обычно эта обработка выполняет- ся без ключа X на 1-м (общем) просмотре каталога. 2) Поиск целевого файла ведется по всей совокупности подка- талогов: требуется погружаться во ВСЕ подкаталоги данно- го каталога и выполнять в них рекурсивно процедуру поис- ка. Для такой обработки и был предусмотрен 2-й просмотр, позволяющий отделить обработку файлов, профильтрованных шаблону, от погружения в подкаталоги. Входные данные: - CURFILE указывает на FCB, настроенный на позицию катало- га для погружения с шаблоном группового поиска (это мо- жет быть FCB, данный на вход программе-обработчике); FCB должен лежать в стеке Командера. - C - peжим пoгpужeния в ФK: 0 - (режим 1) шaблoн поиска заменяется на '*', 1 - (режим 2) шaблoн поиска сохраняется. Действия вызова: - Заменяет шаблон поиска при C=0. - Увеличивает OTSTUP выдачи файлов. - Заводит новый FCB в стеке Командера, сохраняя, тем самым, в текущем позицию продолжения поиска по текущему ката- логу, открывает ФК. - Рекурсивно вызывает GROUP для обработки подкаталога. - Закрывает подкаталог, восстанавливает позицию отчего ФК. - Уменьшает OTSTUP. 1.6. Допустимые отклонения от стандартной обработки Поскольку организация схемы просмотра задается, по сути, программой обработчиком через набор управляющих параметров, допустимы и часто имеют смысл отклонения от стандартной схемы обработки. Ниже приводятся сведения об эффекте неко- торых изменений, не/допустимых для программы-обработчика. Допускается изменять параметры, управляющие порядком об- работки и фильтрования: - Режим запросов и режим групповой обработки определяются по ключу N и наличию символов умолчания в имени шаблона один раз при погружении в каталог, после чего хранятся в 7 и 6 битах (1-"да") ячейки ASKFLG без изменений. По- этому изменение имени и ключа N сказывается только при переходе к подкаталогу и только на время его обработки. В других случаях следует менять непосредственно ASKFLG. - Изменение шаблона поиска работат также до возврата из подкаталога. - Номер прохода (0/1) хранится в 7 бите ячейки NPASS, со- храняемой при рекурсивном спуске в подкаталог. Изменяя ее, можно установить нужный номер прохода. - Изменение ключей Q,H,D,F,X и параметров-дат имеет немед- ленный и глобальный эффект. - Фильтр по атрибутам действует только на атрибуты D и H (файл/каталог, не/скрытый); фильтрование других ключей следует выполнять в обработчике. - Допустимо изменение адреса обработчика GRPADR. - В FCB НЕ рекомендуется менять непостоянную часть, описы- вающую текущую позицию поиска в каталоге; допускается изменение поля FCB.POSITN на величину, кратную 32($20), для пропуска или возврата нескольких файлов,но при этом сбивается стандартный счетчик файлов, а контроль выхода за границу каталога возлагается на обработчика. Допустимы отступления от принятой схемы обработки: - можно не делать спуск во все или некоторые подкаталоги на любом проходе; - можно отменять, повторять, чередовать различные проходы (меняя NPASS); - можно менять правило спуска (замены имен). При всем этом, если проводимые изменения имеют внешний выход на пользовательский интерфейс, рекомендуется следо- вать общесистемным соглашениям - для единообразия интерфей- са. 1.7. Адреса параметров Для доступа к параметрам групповой обработки рекоменду- ется использовать следующие определения: KEYS EQU $100 ; KEYS+'X-'@ - для доступа к ключам PARVALS EQU $40 ; 'X-'$*2+PARVALS - для доступа к параметрам OTSTUP EQU $ TOTCNT EQU $ NPASS EQU $ ASKFLG EQU $ GRPADR EQU $ < TO BE CONTINUED >