






  Утвержден


  2/б/.00152-01 33 09-2-ЛУ







                  Операционная система МОС ВП



             ПОДСИСТЕМА ИСПОЛНИТЕЛЬНОЙ БИБЛИОТЕКИ



                   Руководство программиста



                     2/б/.00152-01 33 09-2




                        Листов 539/4К





1K
13K
535K
536K










                             1987

 Перв. примен.

  2б.00152-01                                        Литера























                  Операционная система МОС ВП


	       ПОДСИСТЕМА ИСПОЛНИТЕЛЬНОЙ БИБЛИОТЕКИ


                   Руководство программиста         
















                        00152-01 33 09-2

                           Листов 535














                             1987








                            - 2 -

                       00152-01 33 09-2






                           АННОТАЦИЯ




       Данный документ предназначен для программистов, разра-

  батывающих программы на языках программирования,  поддержи-

  ваемых операционной системой МОС ВП (далее по тексту систе-

  ма МОС ВП).

       Документ состоит из одного раздела, в котором  описаны

  процедуры общего назначения исполнительной библиотеки.

       Для каждой процедуры приведены формат, описание выпол-

  няемых функций, описание аргументов и примеры использования

  процедур.































                            - 3 -

                       00152-01 33 09-2






                          СОДЕРЖАНИЕ





  1.  ПРОЦЕДУРЫ ОБЩЕГО НАЗНАЧЕНИЯ                          14


  1.1.    LIB$ADDX - сложение двух двоичных чисел

          произвольной длины                               15

  1.2.    LIB$ANALYZE_SDESC  -  анализ   строчных

          дескрипторов                                     20

  1.3.    LIB$ASN_WTH_MBX - назначение  канала  с

          почтовым ящиком                                  23

  1.4.    LIB$AST_IN_PROG_AST    -     выполнение

          асинхронного системного захвата                  28

  1.5.    LIB$ATTACH -  присоединить  терминал  к

          процессу                                         30

  1.6.    LIB$BBCCI - проверка и очистка  бита  с

          блокировкой                                      33

  1.7.    LIB$BBSSI - проверка и установка бита с

          блокировкой                                      36

  1.8.    LIB$CALLG - процедура  вызова  с  общим

          списком аргументов                               39

  1.9.    LIB$CHAR - преобразование байта в  один

          символ строки                                    41

  1.10.   LIB$CRC   -   вычисление   циклического

          контроля по избыточности                         43

  1.11.   LIB$CRC_TABLE   -   создание    таблицы



                            - 4 -

                       00152-01 33 09-2


          циклического контроля по избыточности            46

  1.12.   LIB$CREATE_DIR - создание каталога               51

  1.13.   LIB$CREATE_USER_VM_ZONE - создание зоны

          памяти, определенной пользователем               58

  1.14.   LIB$CRF_INS_KEY - ввод ключа в  таблицу

          перекрестных ссылок                              61

  1.15.   LIB$CRF_INS_REF - ввод ссылки для ключа

          в таблицу перекрестных ссылок                    64

  1.16.   LIB$CRF_OUTPUT -  вывод  информации  из

          таблицы перекрестных ссылок                      68

  1.17.   LIB$CURRENCY  -  получение   системного

          валютного символа                                76

  1.18.   LIB$CVT_DX_DX  -  общий   тип   данных,

          процедура преобразования                         79

  1.19.   LIB$CVT_XTB  преобразование   числового

          текста в двоичный код                            91

  1.20.   LIB$DATE_TIME - выдача даты и времени в

          виде строки элементов                            94

  1.21.   LIB$DAY -  выдача  номера  дня  в  виде

          целого длинного числа                            96

  1.22.   LIB$DAY_OF_WEEK  -  отображение  номера

          дня недели                                      100

  1.23.   LIB$DECODE_FAULT - декодирование потока

          инструкций при неисправности                    102

  1.24.   Формат вызова  для  процедуры  действия

          пользователя                                    115

  1.25.   LIB$DEC_OVER    -    разрешение     или




                            - 5 -

                       00152-01 33 09-2


          запрещение   обнаружения    десятичного

          переполнения                                    124

  1.26.   LIB$DELETE_FILE - удаление  одного  или

          более файлов                                    126

  1.27.   LIB$DELETE_LOGICAL      -      удаление

          логического имени                               141

  1.28.   LIB$DELETE_SYMBOL  -  удаление  символа

          интерпретатора командного языка CLI             144

  1.29.   LIB$DELETE_VM_ZONE  -   удаление   зоны

          виртуальной памяти                              148

  1.30.   LIB$DIGIT_SEP   -   получение   символа

          отделения цифр                                  149

  1.31.   LIB$DISABLE_CTRL - запрещение перехвата

          управляющих  символов   интерпретатором

          командного языка CLI                            153

  1.32.   LIB$DO_COMMAND - выполнение команды             156

  1.33.   LIB$EDIV   -   деление   с   повышенной

          точностью                                       159

  1.34.   LIB$EMODX  -  расширенное  умножение  с

          выделением целой части                          163

  1.35.   LIB$EMUL  -  умножение   с   повышенной

          точностью                                       168

  1.36.   LIB$ENABLE_CTRL - разрешение прерывания

          интерпретатора     командного     языка

          управляющими символами                          170

  1.37.   LIB$ESTABLISH - определение обработчика

          условия                                         174




                            - 6 -

                       00152-01 33 09-2


  1.38.   LIB$EXTV - выделение  знакорасширенного

          поля                                            178

  1.39.   LIB$EXTZV     -     выделение     поля,

          расширенного нулем                              182

  1.40.   LIB$FFX - поиск первого очищенного  или

          установленного бита                             186

  1.41.   LIB$FILE_SCAN - сканирование файла              189

  1.42.   LIB$FILE_SCAN_END - конец поиска файла          193

  1.43.   LIB$FIND_FILE - поиск файла                     195

  1.44.   LIB$FIND_FILE_END  -  окончание  поиска

          файла                                           200

  1.45.   LIB$FIND_IMAGE_SYMBOL      -      поиск

          глобального     символа     в     файле

          разделяемого образа                             202

  1.46.   LIB$FIXUP_FLT      -       фиксирование

          зарезервированного операнда в формате с

          плавающей запятой                               207

  1.47.   LIB$FLT_UNDER       -       обнаружение

          переполнения с плавающей запятой                211

  1.48.   LIB$FREE_EF   -   освобождение    флага

          события                                         213

  1.49.   LIB$FREE_LUN  -   освобождение   номера

          логического блока                               215

  1.50.   LIB$FREE_TIMER  -   освободить   память

          таймера                                         217

  1.51.   LIB$FREE_VM - освобождение  виртуальной

          памяти из программной области                   219




                            - 7 -

                       00152-01 33 09-2


  1.52.   LIB$FREE_VM_PAGE     -     освобождение

          страницы виртуальной памяти                     222

  1.53.   LIB$GET_COMMAND -  получение  текстовой

          строки из SYS$COMMAND                           225

  1.54.   LIB$GET_COMMON - вызов строки из  общей

          области                                         229

  1.55.   LIB$GETDVI  -   вызов   информации   об

          устройстве/значении                             232

  1.56.   LIB$GET_EF - получение флага события            241

  1.57.   LIB$GET_FOREIGN -  получение  командной

          строки пользователя                             243

  1.58.   LIB$GET_INPUT  -  получение  строки   с

          SYS$INPUT                                       250

  1.59.   LIB$GETJPI  -  получение  информации  о

          работе процесса                                 255

  1.60.   LIB$GET_LUN    -    получение    номера

          логического устройства                          263

  1.61.   LIB$GETSYI  -  получение  общесистемной

          информации                                      265

  1.62.   LIB$GET_SYMBOL  -  получение   значения

          символа интерпретатора командного языка         271

  1.63.   LIB$GET_VM  -  размещение   виртуальной

          памяти                                          275

  1.64.   LIB$GET_VM_PAGE  -  получение  страницы

          виртуальной памяти                              279

  1.65.   LIB$ICHAR - преобразовать первый символ

          строки в целое число                            282




                            - 8 -

                       00152-01 33 09-2


  1.66.   LIB$INDEX   -   индекс   относительного

          положения подстроки                             285

  1.67.   LIB$INIT_TIMER - инициализация  времени

          и счетчика                                      287

  1.68.   LIB$INSERT_TREE -  добавление  входа  в

          сбалансированное двоичное дерево                289

  1.69.   LIB$INSQHI  -  помещение   элемента   в

          начало очереди                                  300

  1.70.   LIB$INSQTI - помещение элемента в конец

          очереди                                         304

  1.71.   LIB$INSV  -   добавить   битовое   поле

          переменной длины                                307

  1.72.   LIB$INT_OVER       -        обнаружение

          целочисленного переполнения                     310

  1.73.   LIB$LEN -  длина  строки,  возвращаемая

          как значение длинного слова                     313

  1.74.   LIB$LOCC - обнаружение символа                  315

  1.75.   LIB$LOOKUP_KEY - поиск ключевого  слова

          в таблице                                       316

  1.76.   LIB_LOOKUP_TREE   -   поиск   входа   в

          сбалансированном двоичном дереве                324

  1.77.   LIB$LP_LINES   -   строки   на   каждой

          печатной странице                               327

  1.78.   LIB$MATCHC  -   выдача   относительного

          положения соответствующих символов              329

  1.79.   LIB$MATCH_COND    -     соответствующее

          значение состояния                              331




                            - 9 -

                       00152-01 33 09-2


  1.80.   LIB$MOVC3 - пересылка символов                  334

  1.81.   LIB$MOVC5  -   пересылка   символов   с

          заполнением                                     336

  1.82.   LIB$MOVTC -  пересылка  транслированных

          символов                                        338

  1.82.1.   Таблица перевода из кода  КОИ-8  в  код

            ДКОИ                                          341

  1.82.2.   Таблица  обратной  трансляции  из  кода

            КОИ-8 в код ДКОИ.                             343

  1.82.3.   Таблица трансляции из кода ДКОИ  в  код

            КОИ-8                                         344

  1.82.4.   Таблица  обратной  трансляции  из  кода

            ДКОИ в код КОИ-8                              346

  1.82.5.   Таблица  трансляции   из   упакованного

            дясятичного формата в  формат  числовой

            строки                                        347

  1.82.6.   Таблица  трансляции   из   упакованного

            десятичного    формата     в     формат

            беззнаковой числовой строки                   349

  1.82.7.   Таблица трансляции из формата  числовой

            строки в упакованный десятичный формат        350

  1.82.8.   Таблица    трансляции    из     формата

            беззнаковой    числовой    строки     в

            упакованный десятичный формат                 352

  1.82.9.   Таблица трансляции из  числовой  строки

            перфо-формата  в  беззнаковую  числовую

            строку                                        353




                           - 10 -

                       00152-01 33 09-2


  1.82.10.  Таблица   трансляции   из   беззнаковой

            числовой  строки  в   числовую   строку

            перфо-формата                                 355

  1.83.   LIB$MOVTUC -  передача  транслированной

          строки посимвольно                              356

  1.84.   LIB$POLYZ - вычисление многочленов              360

  1.85.   LIB$PUT_COMMON - ввести строку в  общую

          область                                         367

  1.86.   LIB$PUT_OUTPUT - копирование строки  на

          SYS$OUTPUT                                      370

  1.87.   LIB$RADIX_POINT  -  символ  запятой   в

          позиционном представлении числа                 374

  1.88.   LIB$REMQHI  -  удаление   элемента   из

          начала очереди                                  376

  1.89.   LIB$REMQTI - удаление элемента из конца

          очереди                                         380

  1.90.   LIB$RENAME_FILE - переименование одного

          или нескольких файлов                           384

  1.91.   LIB$RESERVE_EF -  резервирование  флага

          события                                         399

  1.92.   LIB$RESET_VM_ZONE - восстановление зоны

          виртуальной памяти                              402

  1.93.   LIB$REVERT - возвращение к обработчику,

          активизирующему процедуру                       403

  1.94.   LIB$RUN_PROGRAM    -    запуск    новой

          программы                                       405

  1.95.   LIB$SCANC - поиск символа в строке              409




                           - 11 -

                       00152-01 33 09-2


  1.96.   LIB$SCOPY_DXDX  -  копирование  строки,

          передаваемой посредством дескриптора, в

          результирующую строку                           411

  1.97.   LIB$SCOPY_R_DX -  копирование  исходной

          строки, передаваемой посредством ссылки

          в результирующую строку                         414

  1.98.   LIB$SET_LOGICAL - установка логического

          имени                                           418

  1.99.   LIB$SET_SYMBOL -  определение  значения

          символа интерпретатора командного языка         425

  1.100.  LIB$SFREE1_DD  -   освобождение   одной

          динамической строки                             430

  1.101.  LIB$SFREEN_DD - освобождение одной  или

          несколько динамических строк                    432

  1.102.  LIB$SGET1_DD    -    получение    одной

          динамической строки                             434

  1.103.  LIB$SHOW_TIMER    -     воспроизведение

          накопленных значений времени и счетчика         436

  1.104.  LIB$SHOW_VM      -      воспроизведение

          статистических    данных    виртуальной

          памяти                                          444

  1.105.  LIB$SIGNAL - сигнализируемое  состояние

          отказа                                          449

  1.106.  LIB$SIG_TO_RET - преобразование сигнала

          в состояние возврата                            454

  1.107.  LIB$SIG_TO_STOP    -     преобразование

          сигнализируемого      состояния       в




                           - 12 -

                       00152-01 33 09-2


          сигнализируемую остановку                       456

  1.108.  LIB$SIM_TRAP - моделировние  прерывания

          с плавающей запятой                             458

  1.109.  LIB$SKPC  -   сравнение   символов   на

          эквивалентность                                 460

  1.110.  LIB$SPANC - просмотр выбранных символов         463

  1.111.  LIB$SPAWN - создание подпроцесса                469

  1.112.  LIB$STAT_TIMER  -   выдача   статистик,

          накопленных    значений    времени    и

          счетчиков                                       480

  1.113.  LIB$STAT_VM    -    выдача    статистик

          виртуальной памяти                              487

  1.114.  LIB$STOP  -  прекращение  выполнения  и

          сигнализация состояния                          490

  1.115.  LIB$SUBX  -  вычитание  двух   двоичных

          чисел произвольной длины                        493

  1.116.  LIB$SYS_ASCTIM   -   вызов    программы

          системного  обслуживания  $ASCTIM   для

          преобразования    двоичного    значения

          времени в строку в коде КОИ-8                   497

  1.117.  LIB$SYS_FAO    -    вызов     программы

          системного   обслуживания   $FAO    для

          форматирования вывода                           501

  1.118.  LIB$SYS_FAOL    -    вызов    программы

          системного обслуживания $FAOL                   504

  1.119.  LIB$SYS_GETMSG   -   вызов    программы

          системного  обслуживания  $GETMSG   для




                           - 13 -

                       00152-01 33 09-2


          получения текста сообщения                      507

  1.120.  LIB$SYS_TRNLOG   -   вызов    программы

          системного  обслуживания  $TRNLOG   для

          трансляции логического имени                    512

  1.121.  LIB$TRA_ASC_EBC -  трансляция  из  кода

          КОИ-8 в код ДКОИ                                517

  1.122.  LIB$TRA_EBC_ASC -  трансляция  из  кода

          ДКОИ в код КОИ-8                                520

  1.123.  LIB$TRAVERSE_TREE      -       просмотр

          сбалансированной  двоичной  древовидной

          структуры                                       524

  1.124.  LIB$TRIM_FILESPEC     -      сокращение

          спецификации файла в фиксированном поле         526

  1.125.  LIB$WAIT - ожидание в течение заданного

          периода времени                                 532


      Перечень ссылочных документов                       535






    


















                           - 13К -

                    2/б/.00152-01 33 09-2


          получения текста сообщения                      507

  1.120.  LIB$SYS_TRNLOG   -   вызов    программы

          системного  обслуживания  $TRNLOG   для

          трансляции логического имени                    512

  1.121.  LIB$TRA_ASC_EBC -  трансляция  из  кода

          КОИ-8 в код ДКОИ                                517

  1.122.  LIB$TRA_EBC_ASC -  трансляция  из  кода

          ДКОИ в код КОИ-8                                520

  1.123.  LIB$TRAVERSE_TREE      -       просмотр

          сбалансированной  двоичной  древовидной

          структуры                                       524

  1.124.  LIB$TRIM_FILESPEC     -      сокращение

          спецификации файла в фиксированном поле         526

  1.125.  LIB$WAIT - ожидание в течение заданного

          периода времени                                 532


      Перечень ссылочных документов                       535К

























                           - 14 -

                       00152-01 33 09-2


                1. ПРОЦЕДУРЫ ОБЩЕГО НАЗНАЧЕНИЯ



       В данном разделе приводится описание  процедур  общего

  назначения, включающие:

       1) вспомогательные процедуры общего  назначения,  осу-

  ществляющие преобразование ввода-вывода, получение записи с

  устройства, получение характеристик системы;

       2) процедуры выделения ресурсов,  предназначенные  для

  выделения и освобождения виртуальной памяти, номеров флагов

  локальных событий системы МОС ВП, номеров  логических  уст-

  ройств систем программирования БЕЙСИК и  ФОРТРАН,  а  также

  для копирования  и  преобразования  строк  фиксированной  и

  переменной длины;

       3) процедуры сигнализации и обработки состояния,  поз-

  воляющие:

       - осуществлять  обмен  информацией  об  ошибках  между

         программами пользователя, исполнительной библиотекой

         и МОС ВП;

       - изменять способ  обработки  состояний,  принятый  по

         умолчанию;

       - создавать и вводить  программы  обработки  состояний

         для проверки, описания и управления ошибками;

       - создавать и отменять аппаратные прерывания.












                           - 15 -

                       00152-01 33 09-2


       1.1. LIB$ADDX - сложение двух двоичных чисел

            произвольной длины


       Процедура LIB$ADDX складывает два целых числа в двоич-

  ном дополнительном коде произвольной длины со знаком.


       Формат:

       LIB$ADDX A, B, результат [, длина]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       А

       Использование в МОС ВП: длиное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Первый  аргумент  может  иметь  произвольную  длину  и

  представляет собой целое число  в  двоичном  дополнительном

  коде, которое  процедура  LIB$ADDX  прибавляет  ко  второму

  целому числу в двоичном дополнительном коде. Аргумент  A  -

  адрес   массива,   содержащего   слагаемое    в    двоичном

  дополнительном коде.








                           - 16 -

                       00152-01 33 09-2


       В

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длиное слово со знаком

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Второй  аргумент  может  иметь  произвольную  длину  и

  представляет собой целое число  в  двоичном  дополнительном

  коде,  которое  процедура  LIB$ADDX  прибавляет  к  первому

  целому числу в двоичном дополнительном коде. Аргумент  B  -

  это  адрес  массива,  содержащего  слагаемое   в   двоичном

  дополнительном коде.


       Результат

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки, ссылки на массив.

       Результат сложения может иметь  произвольную  длину  и

  представляет собой целое число  в  двоичном  дополнительном

  коде.  Аргумент  результат  -  адрес  массива,  в   который

  записывается результат сложения.


       Длина

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длиное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Длина массивов, которые подлежат обработке, в  длинных




                           - 17 -

                       00152-01 33 09-2


  словах,  длина  каждого  массива  равна  аргументу   длина.

  Аргумент длина - адрес целого  длинного  слова  со  знаком,

  содержащего   длину.   Аргумент   длина   не   может   быть

  отрицательным.  Это  аргумент   необязательный.   Если   он

  пропущен, то по умолчанию принимается значение равное 2.


       Описание.

       Процедура LIB$ADDX складывает два целых  числа  произ-

  вольной длины в двоичном дополнительном коде со знаком. Эти

  целые числа располагаются в массиве длинных  слов.  Старшие

  адреса этих длинных слов содержат более точные части значе-

  ния. Самое старшее адресное длинное слово содержит  знак  и

  31 бит точности. Остальные длинные  слова  содержат  по  32

  бита точности в каждом. Количество  длинных  слов,  которое

  должно быть обработано, задается необязательным  аргументом

  длина.  По  умолчанию   аргумент   длина   равен   2,   что

  соответствует типу данных квадрослова системы МОС ВП. Любые

  два, или все три  из  первых  трех  аргументов  могут  быть

  одинаковыми.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно выполнена;

  SS$_INTOVF

       - целочисленное переполнение. Результат правильный, но

         потерян знаковый бит.








                           - 18 -

                       00152-01 33 09-2


       Пример.

  С+

  C Данный пример иллюстрирует использование

  C процедуры LIB$ADDX.

  С-

       INTEGER A(2),B(2),C(2),RETURN

       DATA A/'00000001'X,'7FFF407F'X/

       DATA B/'FFFFFFFF'X,'8000BF80'X/

  C+

  C Верхнее адресное длинное слово "A" - A(2). Поэтому

  C "A", т.е. А(2) = 576447592255193089

  C представляется целой величиной (7FFF407FX)*16**7+1.

  С "B" является двоичным дополнительным кодом "-A".

  С-

       RETURN = LIB$ADDX(A,B,C)

       ТYPE *.' A = 576447592255193089.'

       ТYPE *.'тогда A + B = 0.'

       ТYPE 1.C(2),C(1)

       1   FORMAT(' "A" - "A" IS '.1H'.I1.I1.3H'X.)

       ТYPE *.'отметим, что C = C(2) об'единяем с C(1).'

  C+

  C Пусть "A" имеет величину 72057594037927937 =

  C '1000000000000001' X. Пусть "B" имеет величину

  C 4294967295 = '00000000FFFFFFFF' X.

  С-

       А(1) = '00000001'X
                        
       А(2) = '10000000'X




                           - 19 -

                       00152-01 33 09-2


       В(1) = 'FFFFFFFF'X

       В(2) = '00000000'X

  C+

  C Тогда "A" + "B" будет 72057598332895232.

  С-

       RETURN = LIB$ADDX(A,B,C)

       ТYPE *.' '

       ТYPE *.' A = 72057594037927937 и B = 4294967295'

       ТYPE *.'тогда A + B = ' ,C

       ТYPE  2,C(2),C(1)

       2   FORMAT('72057598332895232 представили как

       '1H,Z8,Z8,3H'X.)

       ТYPE *,'выбираем, что 72057598332895232 = C(2)

       Об'единяем с C(1)'.

       ЕND

       Данная программа  на  языке  программирования  ФОРТРАН

  демонстрирует как вызывается процедура LIB$ADDX.


       Результат работы программы:

       А -576447592255193089.

       Тогда A + B = 0.

       "A" - "A" = '00'X.

       Отметим, что C = C(2) об'единяем с C (1).

       А = 72057594037927937 и B = 4294967295

       Тогда A + B = 0 268435457

       72057598332895232 представили как '10000001  0'X.

       Выбираем что 72057598332895232 = C (2) об'единяем

       с C(1).



                           - 20 -

                       00152-01 33 09-2


       1.2. LIB$ANALYZE_SDESC  -  анализ   строчных

            дескрипторов


       Процедура   LIB$ANALYZE_SDESC   выделяет   адреса    и

  устанавливает  длины,  с  которых  начинаются  данные   для

  множества классов строчечного дескриптора.


       Формат:

       LIB$ANALYZE_SDESC дескриптор, длина, данные


       Соответствующая точка входа JSB:

       LIB$ANALYZE_SDESC_R2


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длиное слово

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Дескриптор

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Дескриптор    ввода,    для     которого     процедура

  LIB$ANALYZE_SDESC  выделяет  длины  и   начальные   адреса.
        
  Аргумент дескриптор - адрес точечного  дескриптора  с  этим

  дескриптором.





                           - 21 -

                       00152-01 33 09-2


       Длина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Длина  данных;  процедура  LIB$ANALYZE_SDESC  выделяет

  значение этой длины для дескриптора ввода. Аргумент длина -

  адрес  целого  слова  без  знака,   в   которое   процедура

  LIB$ANALYZE_SDESC записывает длину.


       Данные

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово без знака

       Доступ: только запись

       Механизм: посредством ссылки

       Начальный адрес  данных;  процедура  LIB$ANALYZE_SDESC

  выделяет этот адрес для дескриптора ввода. Аргумент  данные

  - адрес длинного  слова  без  знака,  в  которое  процедура

  LIB$ANALYZE_SDESC записывает начальный адрес данных.


       Описание.

       Процедура LIB$ANALYZE_SDESC выделяет длины и адреса, с

  которых начинаются данные для  множества  классов  строчных

  дескрипторов.

       В табл. 1 описаны классы строчных дескрипторов.










                           - 22 -

                       00152-01 33 09-2


                                                    Таблица 1

  -----------------------------------------------------------

     Класс !  Описание   !   Ограничения/примечание

  -----------------------------------------------------------

      A    !  Массив     ! DSC$L_ARSIZE должна быть менее

           !             ! 65536 байтов

      D    ! Десятичная  !

           ! строка      ! Нет

     NCA   ! Несмежный   !

           ! массив      ! Тоже, что и для классов а

     S     ! Скаляр,     !

           ! строка      ! Нет

     SD    ! Десятичный  ! DSC$B_DIGITS и DSC$B_SCALE игно-

           ! скаляр      ! рируюся процедурой LIB$CVT_DX_DX,

           !             ! однако, пользователи должны за-

           !             ! полнять эти поля действительными

           !             ! значениями, ноль разрешается

     VS    ! Переменная  ! Строка возвращается из  CURLEN

           !  строка     !

     Z     ! Неопределен-! Обрабатывается как класс S

           !  ный        !


       Аналогичной     процедурой     является      процедура

  STR$ANALYZE_SDESC.  Она  сообщает  об  ошибке  прежде,  чем

  возвращает состояние.









                           - 23 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно выполнена;

  LIB$INVSTRDES

       - неправильный строчный дескриптор. Массив дескриптора

         имеет ARSIZE больше,  чем  65535  байтов,  или  этот

         класс строчных дескрипторов не обрабатывается.



       1.3. LIB$ASN_WTH_MBX - назначение  канала  с

            почтовым ящиком


       Процедура   LIB$ASN_WTH_MBX   назначает   канал    для

  заданного устройства  и  связывает  почтовый  ящик  с  этим

  устройством. Данная процедура назначает почтовому ящику как

  канал устройства, так и канал почтового ящика.


       Формат:

       LIB$ASN_WTH_MBX имя-устройства, сообщение, буфер,

                       канал 1, канал 2.


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством значения











                           - 24 -

                       00152-01 33 09-2


       Аргументы:

       Имя-устройства

       Использование в МОС ВП: имя устройства

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя  устройства,  которое  процедурой  LIB$ASN_WTH_MBX

  передается  программе  системного   обслуживания   $ASSIGN.

  Аргумент имя-устройства -  адрес  точечного  дескриптора  с

  именем устройства.


       Сообщение

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Максимальный  размер  сообщения,  которое  может  быть

  передано  в  почтовый   ящик;   процедура   LIB$ASN_WTH_MBX

  передает данный аргумент программе системного  обслуживания

  $CREMBX. Аргумент сообщение - адрес целого  длинного  слова

  со знаком, содержащего максимальный размер сообщения.


       Буфер

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ : только чтение

       Механизм: посредством ссылки

       Количество байтов динамической памяти системы, которое




                           - 25 -

                       00152-01 33 09-2


  может  быть  использовано  для  передачи  буфера  сообщения

  почтовому ящику. Процедура  LIB$ASN_WTH_MBX  передает  этот

  аргумент   программе   системного   обслуживания   $CREMBX.

  Аргумент буфер - адрес целого  длинного  слова  со  знаком,

  содержащего этот буфер.


       Канал 1

       Использование в МОС ВП: слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Канал устройства,  который  процедура  LIB$ASN_WTH_MBX

  получает  от  программы  системного  обслуживания  $ASSIGN.

  Аргумент канал 1 - адрес целого слова со знаком, в  которое

  программой служебного обслуживания  $ASSIGN  записан  канал

  устройства.


       Канал 2

       Использование в МОС ВП: канал
                        
       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Канал    почтового    ящика,     который     процедура

  LIB$ASN_WTH_MBX   получает    от    программы    системного

  обслуживанния $CREMBX. Аргумент  канал  2  -  адрес  целого

  слова со знаком, в которое программой системного обслужива-

  ния $CREMBX записан канал почтового ящика.






                           - 26 -

                       00152-01 33 09-2


       Описание.

       Почтовый   ящик   -   это    виртуальное    устройство

  используемое  для  связи  между  процессами.  Канал  -  это

  связывающий путь, который использует операции  ввода-вывода

  для данного устройства. Процедура LIB$ASN_WTH_MBX назначает

  канал для устройства  и  связывает  почтовый  ящик  с  этим

  устройством. Эта процедура назначает  почтовому  ящику  как

  канал устройства, так  и  канал  почтового  ящика.  Обычно,

  процессы   вызывают   программу   системного   обслуживания

  $CREMBX, очищающую почтовый ящик, и назначенные ему канал и

  логическое  имя.  Любые  процессы,  выполняющиеся  в  одной

  группе и использующие одно логическое имя, используют  один

  и тот же почтовый ящик.

       Иногда это  нежелательно.  Например,  когда  программа

  явно  связана  с  другими  процессами   через   сеть,   она

  использует   почтовый   ящик    для    получения    данных,

  подтверждающих подключение и хранение асинхронных сообщений

  от других задач. Если этот  почтовый  ящик  используется  в

  одной и той же группе совместно с  другими  процессами,  то

  невозможно определить, какие  сообщения  предназначены  для

  какого процесса.

       Процедура LIB$ASN_WTH_MBX исключает эту  ситуацию  при

  помощи связи физического имени почтового ящика  с  каналом,

  предназначенным для  устройства.  Чтобы  создать  временный

  почтовый   ящик   для   своего    и    других    процессов,

  взаимодействующих  с  программой  пользователя,  необходимо

  вызвать    процедуру    LIB$ASN_WTH_MBX.     Исполнительная




                           - 27 -

                       00152-01 33 09-2


  библиотека назначает канал  и  создает  временный  почтовый

  ящик, используя программы системного обслуживания  $GETCHN,

  $ASSIGN и $CREMBX. Вместо логического имени  почтовый  ящик

  распознает физическое имя устройства, представленное в виде

  MBCU. Физическое имя устройства MBCU состоит  из  следующих

  элементов:

  MB - указывает, что устройство является почтовым ящиком;

  C - контролер;

  U - единичное число.

       Процедура  LIB$ASN_WTH_MBX  передает  имя   устройства

  вызываемой  программе,   которая   затем   передает   канал

  почтового ящика другой программе  (программам),  с  которой

  она взаимодействует.

       Вызываемая   программа    передает    процедуре    имя

  устройства, которое указывает устройству, какой  канал  ему

  назначен. Для аргумента имя-устройства можно использовать и

  логическое имя. Если указано логическое имя,  то  процедура

  попытается перевести его на один уровень.

       При    использовании     процедуры     LIB$ASN_WTH_MBX

  ограничения привелегий и квоты вызываемых  процессов  также

  запрашиваются программами системного обслуживания  $GETCHN,

  $CREMBX и $ASSIGN.

       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена. Некоторые значения сос-

         тояния вызывают  программы  системного  обслуживания

         $ASSIGN, $CREMBX, $GETCHN, $FAO.




                           - 28 -

                       00152-01 33 09-2


       1.4. LIB$AST_IN_PROG_AST    -     выполнение

            асинхронного системного захвата


       Процедура LIB$AST_IN_PROG_AST определяет,  выполняется

  ли в данный момент асинхронный системный захват.


       Формат:

       LIB$AST_IN_PROG


       Код возврата:

       Использование в МОС ВП: булевая функция

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Значение истинно, если указано, что  в  данный  момент

  выполняется асинхронный системный захват  (значение  =  1),

  или не выполняется (значение = 0).


       Аргументы:

       отсутствуют


       Описание.

       Асинхронный системный захват (AST) представляет  собой

  механизм системы  МОС  ВП  для  осуществления  программного

  прерывания, в случае внешнего  прерывания,  например,  если

  пользователь нажмет клавишу УС/С. Когда происходит  внешнее

  прерывание, система МОС ВП  прерывает  выполнение  текущего

  процесса и вызывает необходимую процедуру. Поскольку данная

  процедура активная, то  выполняется  асинхронный  системный

  захват,  и  процесс  выполняется  на  уровне   асинхронного



                           - 29 -

                       00152-01 33 09-2


  системного захвата. Если процедура асинхронного  системного

  захвата  возвращает  управление  исходному   процессу,   то

  асинхронный  системный  захват   выполняется   недолго,   и

  выполнение процесса продолжается с того места, где  он  был

  прерван.

       Процедура   LIB$AST_IN_PROG    указывает    вызывающей

  программе,  выполняется  ли  в  данный  момент  асинхронный

  системный захват. Программа пользователя вызывает процедуру

  LIB$AST_IN_PROG,  чтобы  определить,  происходит  или   нет

  выполнение на уровне  асинхронного  системного  захвата,  и

  после  этого  требует  соответствующего  действия.   Данная

  процедура   используется,   если   записывается    повторно

  используемый код асинхронного системного  захвата,  который

  выполняет  разные   действия   в   зависимости   от   того,

  выполняется или нет асинхронный системный захват. Например,

  процедура может иметь две раздельные  постоянно  рамещенные

  области памяти, одну  для  уровня  выполнения  асинхронного

  системного  захвата  и  другую  для  уровня,  когда  он  не

  выполняется.


       Возвращаемые значения состояния:

       отсутствуют


       Пример.

       РROGRAM AST_IN_PROGRESS (INPUT,OUTPUT):

       FUNCTION LIB:AST_IN_PROG :INTEGER:EXTERN;

       VAR

          ASTVALUE : INTEGER;




                           - 30 -

                       00152-01 33 09-2


       ВEGIN

          ASTVALUE :=LIB$AST_IN_PROG:

          CASE ASTVALUE OF

            0 : WRITELN ('AN AST IS NOT TN PROGRESS'):

            1 : WRITELN ('AN AST IS IN PROGRESS'):

          END (OF THE CASE STATEMENT)

       ЕND

       Данная программа  на  языке  программирования  ПАСКАЛЬ

  определяет, выполняется или нет в данный момент асинхронный

  системный захват.



       1.5. LIB$ATTACH -  присоединить  терминал  к

            процессу


       Процедура    LIB$ATTACH    заставляет    интерпретатор

  командного языка  CLI  вызываемого  процессора  отсоединить

  терминал от  вызываемого  процесса  и  присоединить  его  к

  другому процессу.


       Формат:

       LIB$ATTACH  идентификатор


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения







                           - 31 -

                       00152-01 33 09-2


       Аргументы:

       Идентификтор

       Использование в МОС ВП: идентификатор процесса

       Тип: длинное целое слово без знака

       Доступ: только чтение

       Механизм: посредством ссылки

       Идентификатор   процесса,   к    которому    процедура

  LIB$ATTACH присоединяет  терминал.  Аргумент  идентификатор

  адрес  целого  длинного  слова   без   знака,   содержащего

  идентификатор процесса. Заданный процесс должен быть в  это

  время отсоединен (при помощи команд SPAWN или  ATTACH,  или

  при помощи вызова  процедур  LIB$SPAWN  или  LIB$ATTACH)  и

  должен составлять часть задания пользователя.


       Описание.

       Процедура    LIB$ATTACH    заставляет    интерпретатор

  командного  языка  CLI  вызываемого  процесса   отсоединить

  терминал от  вызываемого  процесса  и  присоединить  его  к

  другому  процессу.  В  этом   случае   вызываемый   процесс

  бездействует. Данная процедура выполняет такую же  функцию,

  что и команда ATTACH диалогового командного языка.

       Процедура LIB$ATTACH предназначена для использования с

  DCL CLI. Если она использует программу связи  с  оператором

  (MCR) CLI, то выдается сообщение об ошибке LIB$_NOCLI. Если

  образ выполняется непосредственно как  подпроцесс  или  как

  отсоединенный процесс, то интерпретатор командного языка не

  выполняет эту функцию. В таких случаях  выдается  сообщение

  об ошибке LIB$_NOCLI.



                           - 32 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно выполнена;

  SS$_NONEXPR

       - несуществующий процесс. Процесс, заданный аргументом

         идентификтор, не существует;

  LIB$ATTREQREF

       - запросу на присоединение отказано. Заданный  процесс

         не может быть присоединен. Либо он не  был  отсоеди-

         нен, либо не  принадлежит  к  заданию  пользователя,

         вызвавшего его;

  LIB$_NOCLI

       - отсутствует    интерпретатор    командного    языка.

         Вызываемый   процесс   не    имеет    интерпретатора

         командного языка для выполнения  этой  функции,  или

         интерпретатор  командного  языка   не   работает   с

         требуемым типом. Выполнение образа  как  подпроцесса

         или   как   отсоединенного   процесса,   не    имеет

         интерпретатора командного языка;

  LIB$UNECLIERR

       - неожиданная ошибка интерпретатора командного  языка.

         Эта  ошибка  может  быть  следствием   использования

         нестандартного интерпретатора командного языка.












                           - 33 -

                       00152-01 33 09-2


       1.6. LIB$BBCCI - проверка и очистка  бита  C

            блокировкой


       Процедура LIB$BBCCI проверяет и очищает выбранный  бит

  в процессе блокировки памяти. Процедура LIB$BBCCI аналогич-

  на инструкции BBCCI системы МОС ВП.


       Формат:

       LIB$BBCCI позиция, начало


       Код возврата:

       Использование в МОС ВП: длинное слово без языка

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       До очистки бита  с  помощью  процедуры  LIB$BBCCI  его

  состояние равно 1, если бит предварительно установлен, и 0,

  если бит предварительно очищен.


       Аргументы:

       Позиция

       Использование в МОС ВП: длинное слово со знаком

       Тип: длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Позиция,  относительно   исходного   положения   бита,

  который процедура LIB$BBCCI проверяет и обнуляет.  Аргумент

  позиция  -  адрес  целого   длинного   слова   со   знаком,

  содержащего  позицию  бита.  Нулевое  положение  обозначает




                           - 34 -

                       00152-01 33 09-2


  младший бит исходного байта.  Положение  бита  будет  равно

  смещению  выбранного  бита  от  исходного  положения.   Это

  смещение может быть  в  диапазоне  всего  предела  длинного

  слова со знаком; отрицательное смещение  доступно  битам  в

  младших адресах байта.


       Начало

       Использование в МОС ВП: адрес

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Адрес байта  содержащего  нулевой  бит  поля,  которое

  является сообщением процедуры LIB$BBCCI. Аргумент начало  -

  адрес исходного положения. Бит, проверяемый и обнуляемый  с

  помощью процедуры LIB$BBCCI -  это  смещение  бита  позиция

  относительно младшего бита аргумента начало.


       Описание.

       Единичный бит, определяющийся  аргументами  позиция  и

  начало, проверяется, предыдущее его состояние запоминается,

  и бит  очищается.  Чтение  состояния  бита  и  его  очистка

  блокируются против  подобных  операций  со  стороны  других

  процессов или устройств  в  системе.  Предыдущее  состояние

  бита, которое было сохранено, затем возвращается  процедуре

  LIB$BBCCI, как функциональная величина.










                           - 35 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

       не существуют


       Пример.

  С+

  С Данный пример демонстрирует

  С использование процедуры LIB$BBCCI.

  С-

          INTEGER* 4 STATES (4)  ! 128 разделенное

                                 ! состояние битов

          COMMON /STATES/ STATES ! Память может быть

                                 ! разделена

          LOGICAL * 4 LIB:BBCCI

          IF (LIB:BBCCI (42,STATES)) THEN

          TYPE *.'состояние бита 42 - установлен'

          ELSE

          TYPE *,'состояние бита 42 - обнулен'

          END IF

          END

       Данная программа  на  языке  программирования  ФОРТРАН

  проверяет  и  обнуляет  бит  42  таблицы  STATES,   которая

  находится в области COMMON (возможно разделение между двумя

  процессорами).


       Результат работы программы:

       $RUN STATE

       Состояние бита 42 - обнулен.






                           - 36 -

                       00152-01 33 09-2


       1.7. LIB$BBSSI - проверка и установка бита С

            блокировкой


       Процедура LIB$BBSSI - проверяет и устанавливает бит  в

  процессе блокировки памяти. Процедура LIB$BBSSI  аналогична

  инструкции BBSSI системы МОС ВП.


       Формат:

       LIB$BBSSI позиция, начало


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       До  установки  бита  с  помощью  процедуры   LIB$BBSSI

  состояние бита равно 1, если бит предварительно установлен,

  и 0, если бит предварительно очищен.


       Аргументы:

       Позиция

       Использование в МОС ВП: длинное слово со знаком

       Тип: длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Бит,  который  процедура  проверяет  и  устанавливает,

  являющийся положением бита, соответствующим аргументу нача-

  ло. Аргумент позиция  -  адрес  целого  длинного  слова  со

  знаком,  содержащего  положение  бита.  Нулевое   положение




                           - 37 -

                       00152-01 33 09-2


  означает младший бит исходного байта. Положение бита  равно

  смещению  выбранного  бита  от  исходного  положения.   Это

  смещение может находиться в диапазоне всего предела  целого

  длинного слова со знаком; отрицательное  смещение  доступно

  битам в младших адресах байта.


       Начало

       Использование в МОС ВП: адрес

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Адрес байта, содержащего  нулевой  бит  поля,  которое

  является сообщением процедуры LIB$BBSSI. Аргумент начало  -

  адрес  исходного  положения.  Бит,  который  проверяется  и

  устанавливается  с  помощью  процедуры  LIB$BBSSI   -   это

  смещение бита аргумента позиция относительно младшего  бита

  аргумента начало.


       Описание.

       Единичный бит, определяющийся  аргументами  позиция  и

  начало проверяется, предыдущее его состояние  запоминается,

  и  бит  устанавливается.  Чтение  состояния  бита   и   его

  установка блокируются против подобных операций  со  стороны

  других  процессов  или  устройств  в  системе.   Предыдущее

  состояние бита, которое было сохранено, затем  возвращается

  процедуре LIB$BBSSI как функциональная величина.








                           - 38 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

       отсутствуют


       Пример.

  С+

  С Данный пример демонстрирует

  С использование процедуры LIB$BBSSI.

  С-

          INTEGER*4 STATES (4)  ! 128 разделенное
   
                                ! состояние битов

          COMMON (STATES) STATES! Память может быть

                                ! разделена

          LOGICAL * 4 LIB$BBSSI

          IF (LIB$BBSSI (104,STATES)) THEN

          TYPE *,' бит 104 установлен '

          ELSE

          TYPE *, 'бит 104 очищен '

          END IF

          END

       Данная программа  на  языке  программирования  фортран

  проверяется и устанавливается бит  104  таблицы  STATE,  из

  области сохранения COMMON (возможно разделение между  двумя

  процессорами).













                           - 39 -

                       00152-01 33 09-2


       Результат работы программы:

       состояние бита 104 очищен.



       1.8. LIB$CALLG - процедура  вызова  с  общим

            списком аргументов


       Процедура LIB$CALLG - вызывает  процедуру  со  списком

  аргументов, заданным в виде массива длинных слов; первым из

  аргументов  является  счетчик  последующих  длинных   слов.

  Процедура LIB$CALLG аналогична инструкции CALLG системы МОС

  ВП.


       Формат:

       LIB$CALLG список, процедура


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Возвращает  значение,   если   оно   есть,   вызванной

  процедуре. Это значения не изменяется процедурой LIB$CALLG.


       Аргументы:

       Список

       Использование в МОС ВП: список аргументов

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.




                           - 40 -

                       00152-01 33 09-2


       Список   аргументов,   которые   процедура   LIB$CALLG

  использует для вызова заданной процедуры. Аргумент список -

  адрес массива длинных слов, содержащих  список  аргументов.

  Первое длинное слово должно содержать  счетчик  последующих

  длинных слов. Максимальное значение счетчика равно 255.


       Процедура

       Использование в МОС ВП: процедура

       Тип: процедура ввода маски

       Доступ: функциональный вызов (перед возвратом)

       Механизм: посредством ссылки, ссылки на массив.

       Процедура, вызываемая процедурой  LIB$CALLG  вместе  с

  заданным списком аргументов.  Аргумент  процедура  -  адрес

  маски входа процедуры для данной процедуры.


       Описание.

       Процедура LIB$CALLG используется для вызова  процедур,

  которые передают списки аргументов переменной длины, в слу-

  чае когда количество аргументов,  которое  нужно  передать,

  неизвестно  до  момента  выполнения  программы.   Процедура

  LIB$CALLG также может быть  использована  для  того,  чтобы

  вызывать  подобные  процедуры  из  строго   формализованных

  языков, требующих, чтобы процедуры были декларированы,  как

  имеющие фиксированное количество аргументов.












                           - 41 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

       отсутствуют



       1.9. LIB$CHAR - преобразование байта в  один

            символ строки


       Процедура    LIB$CHAR    -    преобразует    единичный

  восьмибитовый символ КОИ-8 в  строку  КОИ-8,  состоящую  из

  одного  символа,  за  которым  следуют  пробелы,  если  это

  необходимо для заполнения строки. Диапозон значений входно-

  го байта от 0 до 255.


       Формат:

       LIB$CHAR строка, код


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Символьная строка КОИ-8 состоящая из  одного  символа,

  за которым следуют пробелы, если это необходимо,  создавае-




                           - 42 -

                       00152-01 33 09-2


  мые процедурой LIB$CHAR во время преобразования символьного

  кода КОИ-8. Аргумент строка - адрес точечного дескриптора с

  символьной строкой, записываемой процедурой LIB$CHAR.


       Код

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Единичный восьмибитовый символьный код КОИ-8,  который

  процедура LIB$CHAR преобразует в строку КОИ-8. Аргумент

  код - адрес беззнакового бита, содержащего  символьный  код

  КОИ-8.


       Описание.

       Процедура LIB$CHAR  является  обратной  для  процедуры

  LIB$ICHAR.  Процедура  LIB$CHAR  не  является   стандартной

  процедурой  преобразования   из   двоичной   системы.   Эта

  процедура просто интерпретирует  аргумент  код  в  качестве

  символьного кода КОИ-8 и преобразует его в строку.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRTRU

       - процедура  успешно   выполнена,   но   строка   была

         оборвана. Строка  заданной  фиксированной  длины  не

         может вместить все символы;





                           - 43 -

                       00152-01 33 09-2


  LIB$_FATERRLIB

       - неисправимая    внутренняя    ошибка.     Внутренняя

         последовательность  не  может  быть  проверена.  Это

         обычно   указывает   на    внутреннюю    ошибку    в

         исполнительной библиотеке;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память.  Вызов  LIB$GET_VM

         не  осуществляется,  так  как  программа   превысила

         допустимую квоту виртуальной памяти;

  LIB$_INVSTRDES

       - неправильный    строчный    дескриптор.     Строчный

         дескриптор   -   неверная   величина    в    области

         DSC$B_CLASS.



       1.10. LIB$CRC   -   вычисление   циклического

             контроля по избыточности


       Процедура LIB$CRC вычисляет  циклический  контроль  по

  избыточности   для   потока   данных.   Процедура   LIB$CRC

  аналогична инструкции CRC системы МОС ВП.


       Формат:

       LIB$CRC таблица, исходный контроль, поток


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись





                           - 44 -

                       00152-01 33 09-2


       Механизм: посредством значения

       Вычисленный циклический контроль по избыточности.


       Аргументы:

       Таблица

       Использование в МОС ВП: длинное слово со знаком

       Тип: длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Таблица   циклического   контроля   по   избыточности,

  состоящая  из  16  длинных  слов,  создающаяся   процедурой

  LIB$CRC_TABLE. Аргумент таблица  -  адрес  целого  длинного

  слова со знаком, содержащего эту таблицу.  Так  как  данная

  таблица  создается   процедурой   LIB$CRC_TABLE   и   затем

  используется процедурой LIB$CRC для ввода, программа  поль-

  зователя должна вызвать процедуру LIB$CRC_TABLE  до  вызова

  процедуры LIB$CRC.


       Исходный контроль

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово со знаком

       Доступ: только чтение

       Механизм: посредством ссылки

       Исходный   циклический   контроль   по   избыточности.

  Аргумент исходный контроль - адрес целого длинного слова со

  знаком,  содержащего  исходный  циклический   контроль   по

  избыточности.






                           - 45 -

                       00152-01 33 09-2


       Поток

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Поток данных, для которых процедура LIB$CRC  вычисляет

  циклический контроль по избыточности (CRC). Аргумент  поток

  - адрес точечного дескриптора потока данных.


       Описание.

       Прежде  чем  программа  пользователя  сможет   вызвать

  процедуру   LIB$CRC,   она   должна    вызвать    процедуру

  LIB$CRC_TABLE. Процедура LIB$CRC_TABLE берет входные данные

  и строит таблицу, которую процедура LIB$CRC использует  для

  вычисления циклического контроля по избыточности.

       Процедура  LIB$CRC  позволяет  программам  на   языках

  высокого  уровня  использовать  инструкцию   CRC,   которая

  вычисляет  циклический  контроль   по   избыточности.   Эта

  инструкция проверяет сохранность потока  данных,  сравнивая

  его состояние в посылаемой точке и получаемой точке. Каждый

  символ из потока данных используется для создания исходного

  значения полинома. Значения для каждого символа будут затем

  складываться вместе. Данная операция выполняется для  обоих

  концов  передачи  данных,   и   сравнивает   два   значения

  результата.  Если  результат  сравнения  отрицательный,  то

  происходит ошибка во время передачи данных.

       Алгоритм использования и вычисления CRC описан в доку-

  менте [3].



                           - 46 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

       отсутствуют


       Пример.

       Примером использования процедуры LIB$CRC может служить

  программа на языке программирования бейсик,  приведенная  в

  описании процедуры LIB$CRC_TABLE.



       1.11. LIB$CRC_TABLE   -   создание    таблицы

             циклического контроля по избыточности


       Процедура LIB$CRC_TABLE создает таблицу из 16  длинных

  слов,   которая    использует    полиномную    спецификацию

  циклического контроля по избыточности  в  качестве  битовой

  маски.


       Формат:

       LIB$CRC_TABLE полином, таблица.


       Код возврата:

       отсутствует


       Аргументы:

       Полином

       Использование в МОС ВП: маска_длинное слово

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Битовая   маска,   показывающая   какие   коэффициенты

  полинома генерируются  процедурой  LIB$CRC_TABLE.  Аргумент



                           - 47 -

                       00152-01 33 09-2


  полином  -  адрес  целого   длинного   слова   без   знака,

  содержащего битовую маску.


       Таблица

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки, ссылки на массив.

       Таблица, состоящая из  16  длинных  слов,  создаваемая

  процедурой LIB$CRC_TABLE. Аргумент таблица -  адрес  целого

  длинного слова со знаком, содержащего таблицу.


       Описание.

       Таблица,   создаваемая    процедурой    LIB$CRC_TABLE,

  передается процедуре LIB$CRC при  генерации  значения  кода

  циклического контроля по избыточности для потока символов.


       Возвращаемые значения состояния:

       отсутствуют


       Пример.

        %TITLE "данный пример демонстрирует использование

               процедур  LIB$CRC и LIB$CRC_TABLE".

        %SBTTL "DECLARATIONS"

        %IDENT " 1-001"

        !+

        ! Средство:

        !

        ! исполнительная библиотека системы МОС ВП.




                           - 48 -

                       00152-01 33 09-2


        !

        ! Функциональное описание:

        !

        ! данная программа демонстрирует использование

        ! процедур LIB$CRC и LIB$CRC_TABLE

        !

        ! Полный ввод:

        !

        ! пользователь запрашивает ввод двух  строк

        !

        ! Полный вывод:

        !

        ! вывод печатается на  контрольный  терминал.

        !

        ! Побочный эффект:

        !

        ! не существует

        !

        ! Дата создания: 22-FEB-1985

        !

        !-

        OPTION TYPE = EXPLICIT

        DECLARE LONG       CRC_TABLE(15),! Массив CRC таблицы

                LONG       CRC_VAL_1,    ! CRC для первого

                                         ! потока

               LONG        CRC_VAL_2     ! для следующего

                                         ! потока




                           - 49 -

                       00152-01 33 09-2


               STRING DATA _1,           ! Первое данное

                                         ! потока

               STRING DATA_2             ! Следующее данное

                                         ! потока

  EXTERNAL LONG FUNCTION LIB$CRC         ! Вычисление CRC

  EXTERNAL SUB LIB$CRC_TABLE             ! Устанавливает

                                         ! таблицу для CRC

  OPEN "SYS$INPUT:" FOR INPUT AS FILE 1%

  !+

  ! Инициализация  CRC таблицы. Использование полинома

  ! CRC-16

  ! Этот полином использует DDCMP.

  !-

  CALL LIB$CRC_TABLE (0'120001'L, CRC_TABLE() BY REF)

  !+

  ! Получение данных от пользователя

  ! -

  LINPUT#1% 'введите строку:';DATA_1

  !+

  ! Вызов CRC для ввода пользователя. Этот CRC полином

  ! требует инициализацию CRC с 0.

  ! Процедура LIB$CRC возвращает длиное слово,

  ! но только младший байт слова используется для этого

  ! полинома.

  !-

  CRC_VAL_1=LIB$CRC(CRC_TABLE() BY REF,0%, DATA_1)

  CRC_VAL_1=CRC_VAL_1 AND 32767%




                           - 50 -

                       00152-01 33 09-2


  !+

  ! Дальнейшее получение данных от пользователя.

  !-

  LINPUT#1%.'введите следующую строку:':DATA_2

  CRC_VAL_2=LIB$CRC(CRC_TABLE() BY REF. 0%,DATA_2)

  CRC_VAL_2=CRC_VAL_2 AND 32767%

  !+

  ! Сообщение пользователю результатов сравнения CRC.

  !-

  IF CRC_VAL_1=CRC_VAL_2

  THEN

        PRINT "две CRC'";CRC_VAL_1;" и ";

               CRC_VAL_2; " одинаковы "

  ELSE

        PRINT "две CRC'";CRC_VAL_1;" и ";

               CRC_VAL_2; " разные "

  END IF

  IF DATA_1= DATA_2

  THEN

        PRINT "две строки одинаковы"

  ELSE

        PRINT "две строки разные"

  END IF

  END

       Данная  прграмма  на  языке  программирования   БЕЙСИК

  демонстрирует    использование    процедур    LIB$CRC     и

  LIB$CRC_TABLE.




                           - 51 -

                       00152-01 33 09-2


       Результат работы программы:

       $RUN CRC

       Введите строку: DOVE

       Введите следующую строку: HOSE

       Две CRC'  7156 и 7156 одинаковы

       Две строки разные



       1.12. LIB$CREATE_DIR - создание каталога


       Процедура   LIB$CREATE_DIR   создает    каталог    или

  подкаталог.


       Формат:

       LIB$CREATE_DIR каталог, [кип] [, маска] [ ,защита]

                      [, версия] [номер тома]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       каталог

       Использование в МОС ВП: имя устройства

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Спецификация   каталога   или   подкаталога,   которая




                           - 52 -

                       00152-01 33 09-2


  создается процедурой  LIB$CREATE_DIR.  Аргумент  каталог  -

  адрес точечного дескриптора со спецификацией каталога.

       Формат  строки  спецификации  каталога   соответствует

  формату  системы  управления  данными  (далее   по   тексту

  СУД-32). Данная спецификация может  содержать  спецификацию

  каталога или подкаталога. Она может содержать  спецификацию

  диска.  Например,  SMD:[TNIS.IS.IT]  -  спецификация  файла

  формата  системы  управления  данными  СУД-32,  где  SMD  -

  спецификация   диска,   а   THIS.IS.IT    -    спецификация

  подкаталога.

       Данная спецификация не может содержать имя  узла,  имя

  файла, тип  файла,  версию  файла  или  символы  обобщения.

  Максимальный размер строки 255 символов.


       Кип

       Использование в МОС ВП: код идентификации пользователя

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Код идентификации пользователя (КИП) -  идентифицирует

  владельца создающего каталог или подкаталог. Аргумент КИП -

  адрес   длинного   слова   без   знака,   содержащего   код

  идентификации пользователя. Если аргумент кип  нулевой,  то

  код идентификации  пользователя  будет  тот  же,  что  и  у

  основного каталога.

       Данный   аргумент   необязательный.    По    умолчанию

  принимается   код   идентификации   пользователя   текущего

  процесса, за исключением того случая, когда  каталог  имеет



                           - 53 -

                       00152-01 33 09-2


  формат кода идентификации, например  123,321,  используется

  код идентификации пользователя созданного каталога.


       Маска

       Использование в МОС ВП: маска-слово

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Маска,  указывающая,  что  биты  защита  должны   быть

  установлены.  Аргумент  маска  -  адрес  слова  без  знака,

  содержащего маску защиты. В  табл.  2  приведена  структура

  маски защиты. Доступ  разрешен  для  бит,  установленных  в

  положение 0.

                                                    Таблица 2

                    Структура маски защиты

  -----------------------------------------------------------

     Все        !  Группа      !  Владелец     !   Система

  -----------------------------------------------------------

   D E W R      ! D E W R      ! D E W R       ! D E W R

   E X R E      ! E X R E      ! E X R E       ! E X R E

   L E I A      ! L E I A      ! L E I A       ! L E I A

   E C T D      ! E C T D      ! E C T D       ! E C T D

   T U E        ! T U E        ! T U E         ! T U E

   E T          ! E T          ! E T           ! E T

   E            ! E            ! E             ! E


       Биты, установленные в аргументе маска  указывают,  что

  соответствующие   биты   аргумента   защита   должны   быть




                           - 54 -

                       00152-01 33 09-2


  установлены. Очищенные биты в  аргументе  маска  указывают,

  что соответствующие биты в аргументе защита, берут значение

  соответствующего бита из файла защиты  основного  каталога.

  Тем не менее,  биты  в  файле  защиты  основного  каталога,

  указывающие  на  уничтожение  доступа,  не  указывают,  что

  соответствующие   биты   аргумента   маска   должны    быть

  установлены.

       Табл. 3 показывает как определяется маска защиты.

                                                    Таблица 3

  -----------------------------------------------------------

    Имя маски      ! Шестнадцати- !       Значение

                   ! ричное число !

  -----------------------------------------------------------

  Защита разрешена !   %XDBF      ! S:NONE,O:NONE, G:E, W:W

  Основной каталог !   %X13FF     ! S:RWED,O:RWED, G:RW, W:R

  Значение защиты  !   %X37FF     ! S:RWE,O:RWE, G:RWE, W:RW


       Аргумент    маска    является    необязательным.    Он

  используется, когда необходимо изменить  значения,  которые

  установлены по умолчанию в файле защиты основного каталога.

  По умолчанию  в  аргементе  маска  все  биты  нулевые,  как

  результат передачи из файла защиты основного каталога. Если

  аргумент  маска  состоит  из  нулей,  то  аргумент   защита

  игнорируется.











                           - 55 -

                       00152-01 33 09-2


       Защита

       Использование в МОС ВП: файл защиты

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством сообщения

       Система /владелец/группа/ все, создаваемые пользовате-

  лем значения защиты каталога. Аргумент защита - адрес слова

  без знака, которое содержит маску защиты.

       Аргумент защита является необязательным. По  умолчанию

  все биты слова нулевые, что указывает на полный доступ  для

  всех категорий. Обычно  аргумент  защита  не  пропускается,

  если также не пропускается аргумент  маска.  Если  аргумент

  маска пропущен, то аргумент защита игнорируется.


       Версия

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Максимальный допустимый номер версии  для  создаваемых

  файлов, во вновь созданных  каталогах.  Аргумент  версия  -

  адрес слова без знака, содержащего  значение  максимального

  номера версии.

       Аргумент версия является необязательным. По  умолчанию

  наибольшая  версия  принятая  по   умолчанию   в   основном

  каталоге. Если он определен как  нулевой,  то  максимальный

  номер версии не ограничен.





                           - 56 -

                       00152-01 33 09-2


       Номер тома

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Соответствующий номер тома, в пределах  установленного

  тома, на котором создается каталог или подкаталог. Аргумент

  номер  тома  -   адрес   слова   без   знака,   содержащего

  соответствующий  номер  тома.   Аргумент   номер   тома   -

  необязательный   аргумент.   По    умолчанию    размещается

  произвольно в пределах установленного тома.


       Описание.

       Процедура LIB$CREATE позволяет  владельцу  осуществить

  вывод  на  экран  и  защиту  при  создании   каталога   или

  подкаталога.  Вызывающая  программа  также  может   указать

  максимальное число версии файла, которые будут сохранены  и

  соответствующий номер тома, в котором создается каталог или

  подкаталог.


       Возвращаемые значения состояния:

  SS$_CREATED

       - процедура успешно выполнена; созданы один  или  нес-

         колько каталогов;

  SS$_NOPMAL

       - процедура успешно завершена; все указанные  каталоги

         уже существуют;






                           - 57 -

                       00152-01 33 09-2


  LIB$_INVARG

       - неверный аргумент исполнительной библиотеки; один из

         необходимых аргументов пропущен или аргумент каталог

         длиннее 255 символов;

  LIB$_INVFILSPE

       - неверная спецификация файла.  Одна  из  спецификаций

         файла не содержит  подробного  описания  каталога  и

         имени устройства, или  она  содержит  имя  узла  или

         файла, тип файла, версию файла или символ  обощения.

         Эта   ошибка   также   возникает,   если   указанное

         устройство не является диском.

       Любое возвращаемое значение состояния $ASSIGN.

       Любое возвращаемое значение состояния $DASSGN.

       Любое возвращаемое значение состояния $PARSE.

       Любое возвращаемое значение состояния $QIO.

       Любое  возвращаемое   значение   состояния   процедуры

  LIB$ANALYZE_SDESC.

       Любое  возвращаемое   значение   состояния   процедуры

  LIB$GET_EF.




















                           - 58 -

                       00152-01 33 09-2


       1.13. LIB$CREATE_USER_VM_ZONE - создание зоны

             памяти, определенной пользователем


       Процедура   LIB$CREATE_USER_VM_ZONE   создает   новую,

  определенную пользователем, зону памяти.


       Формат:

       LIB$CREATE_USER_VM_ZONE идентификатор-зоны

                               [, аргумент-пользователя]

                               [, размещение]

                               [, освобождение]

                               [, установка] [, удаление]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Идентификатор-зоны

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Идентификатор  зоны.  Аргумент  идентификатор-зоны   -

  адрес  длинного   слова,   устанавливающего   идентификатор

  создаваемой зоны.






                           - 59 -

                       00152-01 33 09-2


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Аргумент            пользователя.            Процедура

  LIB$CREATE_USER_VW_ZONE копирует значение аргумента пользо-

  вателя и передает это значение всем  вызываемым  программам

  пользователя.


       Размещение

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Программы размещения пользователя. Аргумент размещение

  - адрес маски входа процедуры для дополнительной  программы

  пользователя,  которая   вызывается   каждый   раз,   когда

  процедура LIB$GET_VM вызывается для зоны.


       Освобождение

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Программа освобождения пользователя. Аргумент освобож-

  дение - адрес  маски  входа  процедуры  для  дополнительной

  программы  пользователя,  которая  вызывается  каждый  раз,




                           - 60 -

                       00152-01 33 09-2


  когда процедура LIB$FREE_VM вызывается для зоны.


       Установка

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Смещение зоны программы пользователя.  Аргумент  уста-

  новка  -  дополнительная  программа  пользователя,  которая

  вызывается   каждый   раз,   когда   вызывается   процедура

  LIB$REZETE_VM_ZONE для зоны.


       Удаление

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Удаление   зоны   программы   пользователя.   Аргумент

  удаление - дополнительная программа  пользователя,  которая

  вызывается, когда процедура  LIB$DELETE_VM_ZONE  вызывается

  для зоны.


       Описание.

       Процедура LIB$CREATE_USER_VM_ZONE создает определенную

  пользовательскую  зону.  Если  возникает  ошибка  состояния

  возврата, то зона не создается.

       Каждый раз, когда вызывается одна из групп управляющих

  процедур (LIB$GET_VM,  LIB$FREE_VM,  LIB$RESET_VM_ZONE  или

  LIB$DELETE_VM_ZONE), выполняется операция, на  определенной



                           - 61 -

                       00152-01 33 09-2


  пользователем зоне, заданная программой пользователя.



       1.14. LIB$CRF_INS_KEY - ввод ключа в  таблицу

             перекрестных ссылок


       Процедура LIB$CRF_INS_KEY вводит информацию о ключе  в

  таблицу перекрестных ссылок.


       Формат:

       LIB$CRF_INS_KEY таблица, ключ, значение 1, флаги


       Код возврата:

       отсутствует


       Аргументы:

       Таблица

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Таблица  перекрестных  ссылок,  в  которую   процедура

  LIB$CRF_INS_KEY вводит информацию о ключе. Аргумент таблица

  - адрес целого длинного слова со знаком, задающего  таблицу

  перекрестных  ссылок.  Каждый  раз,  при  вызове  процедуры

  перекрестной ссылки, необходимо указывать имя этой таблицы,

  так как накапливать информацию можно  одновременно  в  нес-

  кольких таблицах перекрестных ссылок.








                           - 62 -

                       00152-01 33 09-2


       Ключ 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Числовая строка КОИ-8, содержащая символьное  имя  или

  двоичное длинное слово без знака. Аргумент ключ 1  -  адрес

  точечного дескриптора, задающего ключ.


       Значение 1

       Использование в МОС ВП: длинное слово со знаком

       Тип: длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Символьное   значение,   адрес   которого    процедура

  LIB$CRF_INS_KEY  вносит  в  таблицу  перекрестных   ссылок.

  Аргумент значение  1  -  адрес  целого  длинного  слова  со

  знаком, содержащего это значение. Оба адреса ключа и значе-

  ния должны быть постоянными адресами в  символьной  таблице

  пользователя.


       Флаги

       Использование в МОС ВП: маска-длинное слово

       Тип: доступ длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Значение 1, используемое при выборе содержимого  полей

  ключ 2 и значение 2; эта величина заносится в память вместе




                           - 63 -

                       00152-01 33 09-2


  с входными данными. Аргумент флаги - адрес  длинного  слова

  без знака, содержащего флаги. При подготовке строки  вывода

  процедура  LIB$CRF_OUTPUT  использует  значение   аргумента

  флаги и шестнадцатибитовую  маску  в  таблице  дескрипторов

  поля для выделения данных. Старший бит слова  резервируется

  для процедуры LIB$CRF_INS_KEY.


       Описание.

       Процедура LIB$CRF_INS_KEY хранит  информацию,  которая

  печатается в полях ключ 1, значение 1  и  значение  2.  При

  вызове  этой  процедуры,  в  таблице  перекрестных   ссылок

  создается вход для ключа, которого нет в таблице. Если ключ

  присутствует в таблице, то производится  обновление  адреса

  значения и флага полей.

       В  процессе  использования  процедуры  LIB$CRF_INS_KEY

  предусматривается выполнение следующих шагов:

       1)  определение  таблицы  управляющей   информации   с

  использованием макропроцедуры $CRFCTLTABLE;

       2) определение каждого поля текстовой строки вывода, с

  использованием макропроцедуры $CRFFIELD;

       3)  точное  определение  конца  каждой   установленной

  макрокоманды,  которая  определяет  поле  текстовой  строки

  вывода, используя макропроцедуру $CRFFIELDEND;

       4)    обеспечивает    данные,    вызывая     процедуру

  LIB$CRF_INS_KEY для помещения ссылки для ключа  в  заданную

  таблицу символов. Эти данные  используются  для  построения

  таблиц в виртуальной памяти;





                           - 64 -

                       00152-01 33 09-2


       5) вызов процедуры перекрестного вывода LIB$CRF_OUTPUT

  для  суммирования  и  форматирования  данных.  Обеспечивает

  процедуру,  которая  вызывает  LIB$CRF_OUTPUT  для   печати

  каждой строки в файл вывода.


       Возвращаемые значения состояния:

       отсутствуют



       1.15. LIB$CRF_INS_REF - ввод ссылки для ключа

             в таблицу перекрестных ссылок


       Процедура LIB$CRF_INS_REF вводит ссылки  для  ключа  в

  таблицу перекрестных ссылок.


       Формат:

       LIB$CRF_INS_REF таблица, ключ 1, поле 2,

                       поле 1, указатель


       Код возврата:

       отсутствует


       Аргументы:

       Таблица

       Использование в МОС ВП: вектор длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Управляющая таблица, связанная с перекрестной ссылкой.

       Аргумент  таблица   -   адрес   массива,   содержащего

  управляющую таблицу.



                           - 65 -

                       00152-01 33 09-2


       Ключ 1

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Ключ, на который ссылается процедура  LIB$CRF_INS_REF.

  Аргумент ключ 1 - адрес целого  длинного  слова  со  знаком

  содержащего ключ. Ключ -  числовая  строка  в  коде  КОИ-8,

  содержащая символьное имя или двоичное  длинное  слово  без

  знака. Ключ должен быть  постоянным  адресом  в  символьной

  таблице пользователя.


       Поле 2

       Использование в МОС ВП: длинное слово со знаком

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Числовая строка элементов в коде КОИ-8, содержащая  не

  более 31 символа, без счетчика байтов. Аргумент  поле  2  -

  адрес точечного дескриптора с числовой строкой элементов  в

  коде КОИ-8.


       Поле 1

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Шестнадцатибитовое значение, используемое  при  выборе




                           - 66 -

                       00152-01 33 09-2


  содержимого поля REFI. Аргумент поле  2  -  адрес  длинного

  целого слова  со  знаком,  содержащего  это  значение.  При

  подготовке    текстовой    строки     вывода,     процедура

  LIB$CRF_OUTPUT использует это значение и  битовую  маску  в

  таблице дескрипторов поля для выделения данных. Старший бит

  слова резервируется для процедуры LIB$CRF_INS_REF.


       Указатель

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Указатель  ссылка/определение,  который   используется

  процедурой  LIB$CRF_INS_REF  для  разграничения  ссылки  на

  символ и определение символа. Аргумент  указатель  -  адрес

  целого  длинного  слова   со   знаком,   содержащего   этот

  указатель. Единственная разница между обработкой символьной

  строки и символьного определения  заключается  в  том,  где

  процедура LIB$CRF_INS_REF хранит эту инфорацию.

       Указатель может иметь любое из значений, приведенных в

  табл. 4.

















                           - 67 -

                       00152-01 33 09-2


                                                    Таблица 4

  -----------------------------------------------------------

  Символьное имя   !              Описание

  -----------------------------------------------------------

  CRF$K_REF        ! Ссылка на символ

  CRF$K_DEF        ! Символьное определение


       Описание.

       Процедура LIB$CRF_INS_REF вставляет ссылку для ключа в

  таблицу  перекрестных  символов.   При   попытке   вставить

  информацию для ключа, который не задан в  вызове  процедуры

  LIB$CRF_INS_KEY, процедура LIB$CRF_INS_REF использует адрес

  этого ключа для локализации имени символа  и  устанавливает

  поле  1.  Будучи  однажды  установленным,  либо  процедурой

  LIB$CRF_INS_KEY, либо процедурой  LIB$CRF_INS_REF,  поле  1

  никогда не изменяется. Если  поле1  установлено  процедурой

  LIB$CRF_INS_REF, то оно  имеет  пространственно-заполненное

  поле значение 1, связанное с ним до тех пор,  пока  оно  не

  будет  вновь  прочитано   последующим   вызовом   процедуры

  LIB$CRF_INS_KEY.

       В  процессе  использования  процедуры  LIB$CRF_INS_KEY

  предусматривается выполнение следующих шагов:

       1)  определение  таблицы  контрольной   информации   с

  использованием макропроцедуры $CRFCTLTABLE;

       2)  определение   каждого   поля   строки   вывода   с

  использованием макропроцедуры $CRFFIELD;

       3)  точное  определение  конца  каждой   установленной

  макрокоманды,  которая  определяет  поле  текстовой  строки



                           - 68 -

                       00152-01 33 09-2


  вывода, используя макропроцедуру $CRFFIELDEN;

       4) обеспечение данных,  посредством  вызова  процедуры

  LIB$CRF_INS_REF  при   помещении   ссылки   для   ключа   в

  определенную таблицу символов. Эти данные используются  для

  построения таблиц в виртуальной памяти;

       5) вызов процедуры перекрестных ссылок  LIB$CRF_OUTPUT

  для  суммирования  и  форматирования  данных.  Обеспечивает

  процедуру,  которая  вызывает  LIB$CRF_OUTPUT  для   печати

  каждой строки в файл вывода.


       Возвращаемые значения состояния:

       отсутствуют



       1.16. LIB$CRF_OUTPUT -  вывод  информации  из

             таблицы перекрестных ссылок


       Процедура  LIB$CRF_OUTPUT  извлекает   информацию   из

  таблицы перекрестных ссылок.


       Формат:

       LIB$CRF_OUTPUT таблица, ширина, строка 1,

                      строка 2, указатель


       Код возврата:

       отсутствует












                           - 69 -

                       00152-01 33 09-2


       Аргументы:

       Таблица

       Использование в МОС ВП: вектор длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Управляющая таблица, связанная с перекрестной ссылкой.

  Аргумент таблица - адрес массива,  содержащего  управляющую

  таблицу.   Данная   таблица   содержит    адрес    заданной

  пользователем процедуры, которая печатает текстовую строку,

  сформатированную процедурой LIB$CRF_OUTPUT.


       Ширина

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Ширина строки вывода. Аргумент ширина -  адрес  целого

  длинного слова со знаком, содержащее эту ширину.


       Строка 1

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество  текстовых  строк   на   первой   странице.

  Аргумент строка 1 - адрес целого длинного слова со  знаком,

  содержащего  это  количество.  Данный  аргумент   позволяет




                           - 70 -

                       00152-01 33 09-2


  пользователю  резервировать  место  для  печати  информации

  заголовка на первой странице перекрестной ссылки.


       Строка 2

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество строк текста на других страницах.  Аргумент

  строка  2  -  адрес  целого  длинного  слова   со   знаком,

  содержащего это количество.


       Указатель 1

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Указатель режима вывода. Аргумент указатель 1 -  адрес

  целого длинного  слова  со  знаком,  содержащего  указатель

  режима.

       В табл. 5 приведены три возможных указателя режима.

                                                    Таблица 5

  -----------------------------------------------------------

     Режим   вывода  !             Описание

  -----------------------------------------------------------

  CRF$K_VALUES       ! Должны быть напечатаны только значение

                     ! и ключ полей. Процедура LIB$CRF_OUTPUT

                     ! создает несколько столбцов на страни-




                           - 71 -

                       00152-01 33 09-2


                                          Продолжение табл. 5

  -----------------------------------------------------------

     режим   вывода  !             описание

  -----------------------------------------------------------

                     ! це. Каждый столбец состоит из полей

                     ! ключ 1, ключ 2, значение 1, значение

                     ! 2. Между столбцами гарантируется рас-

                     ! стояние минимум в один пробел

  CRF$K_VALS_REFS    ! Требует суммарную сводку перекрестной

                     ! ссылки, у которой не остается прост-

                     ! ранства для столбца, определяющего

                     ! ссылку. Если пользователь вставляет

                     ! ссылку с указателем CRF$K_DEFS, то

                     ! этот вход игнорируется

  CRF$K_DEFS_REFS    ! Требует суммарную сводку перекрестной

                     ! ссылки, в которой первые поля поле 1

                     ! и поле 2 используются только для

                     ! определения ссылок. Если  определение

                     ! ссылки не задается, то эти поля за-

                     ! полняются пробелами


       Указатель 2

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Указатель   удалить/сохранить,    который    процедура

  LIB$CRF_OUTPUT использует  для  определения  сохранить  или



                           - 72 -

                       00152-01 33 09-2


  удалить   построенные   таблицы   накопленной    символьной

  информации, как только вызывается перекрестная ссылка.

       Этот указатель может иметь одно из следующих значений:

  CRF$K_SAVE - сохранить таблицы для последующей обработки;

  CRF$K_DELETE - удалить таблицы.


       Описание.

       Процедура  LIB$CRF_OUTPUT  может  формировать   строки

  вывода для трех типов таблиц перекрестных ссылок:

       1)   таблица   перекрестных   ссылок,   состоящая   из

  символьных имен и их значений, приведенная в табл. 6;

       2)   таблица   перекрестных   ссылок,   состоящая   из

  символьных  имен,  их  значений  и  имен  модулей,  которые

  обращаются к этим символьным именам, приведенная в табл. 7;

       3)   таблица   перекрестных   ссылок,   состоящая   из

  символьных имен, их значений, имени определяющего модуль  и

  имен тех модулей,  которые  обращаются  к  этим  символьным

  именам, приведенная в табл. 8.

                                                    Таблица 6

  -----------------------------------------------------------

   Символьное  !  Значение   !  Символьное    !  Значение

      имя      !             !     имя        !

  -----------------------------------------------------------

  BAS$INSTR    ! 000020B0_RU ! BAS$SCRATCH    ! 00002308_RU

  BAS$IN_D_R   ! 000021F0_RU ! BAS$STATUS     ! 00002338_RU

  BAS$IN_F_R   ! 000021E8_RU ! BAS$STR_D      ! 000020C0_RU

  BAS$IN_L_R   ! 000021E0_RU ! BAS$STR_F      ! 000020B8_RU




                           - 73 -

                       00152-01 33 09-2


                                          Продолжение табл. 6

  -----------------------------------------------------------

   Символьное  !  Значение   !  Символьное    !  Значение

      имя      !             !     имя        !

  -----------------------------------------------------------

  BAS$IN_I_DX  ! 000021F8_RU ! BAS$STR_L      ! 000020C8_RU

  BAS$IN_W_R   ! 000021D8_RU ! BAS$UNLOCK     ! 00002310_RU

  BAS$IO_END   ! 000021D0_RU ! BAS$UPDATE     ! 000022E8_RU

  BAS$LINKAGE  ! 00001G74_R  ! BAS$UPDATE_COUN! 000022F0_RU

  BAS$LINPUT   ! 000021A8_RU ! BAS$VAL_D      ! 00002110_RU

  BAS$MAT_INPUT! 000022G8_RU ! BAS$VAL_F      ! 00002108_RU


                                                    Таблица 7

  -----------------------------------------------------------

   Символьное  имя !  Значение !      Ссылка ...

  -----------------------------------------------------------

  BASSK_DIUBY_ZER  ! 0000003D  ! ALLGBL        BASSERROR

  BASS POWDJ       !           ! BASS POWII    BAS$POWII

  BASS POWRJ       !           ! BASS POWRR    BAS$POWRR

  BAS SK_DUPKEYDET ! 000008G   ! ALLGBL        BASSSSIGNAL_IO

  BASSK_ENDFILDEU  ! 0000000в  ! ALLGBL        BASSSRES_PROC

                   !           ! BASSSUDF_RL

  BASSK_ENDOF_STA  ! 000000GC  ! ALLGBL













                           - 74 -

                       00152-01 33 09-2


                                                    Таблица 8

  -----------------------------------------------------------

   Символьное    !  Значение !  Определение !  Ссылка ...

      имя        !           !              !

  -----------------------------------------------------------

  LIB$FREE_VM    ! 0001E185_R! LIB$VM       ! ALLGBL

                 !           !              ! BAS$MARGIN

                 !           !              ! BAS$XLATE

                 !           !              ! FOR$UM

                 !           !              ! STR$APPEND

                 !           !              ! STR$DUPL_CHAR

                 !           !              ! STR$REPLACE

  LIB$GET_COMMAND! 0001E2BO_R! LIB$GET_INPUT! ALLGBL

  LIB$GET_COMMON ! 0001E4DG_R! LIB$COMMON   ! ALLGBL



       Несмотря на формат  вывода,  процедура  LIB$CRF_OUTPUT

  рассматривает  строку  вывода,  как  состоящую   из   шести

  различных типов полей:

       1) KEY 1 - первое поле в строке, содержащее символьное

  имя;

       2)  KEY  2  -  второе  поле   в   строке,   содержащее

  установленный флаг (например, -R), который дает  информацию

  о символе;

       3) VAL 1 - третье поле в строке,  содержащее  значение

  символа;

       4)  VAL  2  -  четвертое  поле  в  строке,  содержащее

  установленные флаги, описывающие значение 1;




                           - 75 -

                       00152-01 33 09-2


       5) поля: REF 1 и REF 2 - в каждой паре поле 1  и  поле

  2, поле 1 предусмотрено для  установки  флагов,  а  поле  2

  предусмотрено для имени модуля, который обращается  к  сим-

  вольному имени.

       Некоторые из этих полей могут быть пропущены во  время

  печати.


       Пример.

  Символьное   Значение     Символьное    Значение

    имя                       имя

  ---------   -----------   -----------   -----------

  BAS$NSTR    000020BO-RU   BAS$SCRATCH   00002308-RU



  KEY1        VAL1   VAL2   KEY1          VAL1   VAL2



  Символьное    Значение    Определения   Ссылка ...

     имя

  ----------    ----------  -----------   ----------

  LIB$FREE_VM   0001E185-R  LIB$VM        ALLGBL



  KEY1          VAL1  VAL2  REF1          REF2

                            (CRF$K_DEF)   (CRF$K_REF)


       Возвращаемые значения состояния:

       отсутствуют










                           - 76 -

                       00152-01 33 09-2


       1.17. LIB$CURRENCY  -  получение   системного

             валютного символа


       Процедура LIB$CURRENCY вызывает валютный символ систе-

  мы.


       Формат:

       LIB$CURRENCY символ [, длина]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запсь

       Механизм: посредством значения


       Аргументы:

       Символ

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Валютный символ. Аргумент  символ  -  адрес  точечного

  дескриптора с валютным символом.


       Длина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки





                           - 77 -

                       00152-01 33 09-2


       Количество символов,  которое  процедура  LIB$CURRENCY

  записывает в  аргумент  символ,  не  считая  заполнения,  в

  случае строки элементов фиксированной длины. Аргумент длина

  - адрес  слова  без  знака,  содержащего  длину   валютного

  символа. Если вводимая строка символов оборвана на размере,

  указанном в дескрипторе  символ,  длина  устанавливается  в

  этот  размер.  Следовательно,  аргумент  длина  может  быть

  всегда  использован  вызывающей  программой  для  получения

  доступа к значащей подстроке аргумента символ.


       Описание.

       Процедура LIB$CURRENCY пытается переводить  логическое

  имя SYS$CURRENCY как логическое имя  процесса,  группы  или

  системы, в указанном порядке. Если перевод не  удается,  то

  процедура вызывает знак денежной единицы ($). Если  перевод

  выполняется успешно, то на экране терминала распечатывается

  созданный  текст.   Таким   образом   администратор   может

  определять SYS$CURRENCY, как логическое имя в пределах всей

  системы, чтобы обеспечить значение по  умолчанию  для  всех

  пользователей,  а  индивидуальный  пользователь,  со  своей

  конкретной  задачей,   может   задать   SYS$CURRENCY,   как

  логическое имя процесса, чтобы отменить системное значение,

  принятое по умолчанию.

       Например, при использовании британского  знака  фунта,

  как текущего символа во время выполнения процесса, с сохра-

  нением  знака  доллара,  как   системного,   принятого   по

  умолчанию, необходимо  определить  процедурой  SYS$CURRENCY

  знак фунта (#) в таблице логического имени этого  процесса.



                           - 78 -

                       00152-01 33 09-2


  После этого, любой вызов процедуры LIB$CURRENCY в  пределах

  вашего процесса вызывает знак фунта (#),  в  то  время  как

  любой внешний вызов процесса выдает знак  денежной  единицы

  ($).

       Процедура  LIB$CURRENCY  подразумевает   использование

  языка программирования БЕЙСИК.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRTRU

       - процедура успешно завершена, строка с валютным  сим-

         волом оборвана;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка.  Эта  ошибка  обычно

         указывает  на  внутреннюю  ошибку  в  исполнительной

         библиотеке;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память вызов LIB$GET_VM не

         может быть осуществлен  из-за  того,  что  программа

         превышает допустимый размер памяти;

  LIB$INVSTRDES

       - неправильный    строчный    дескриптор.     Строчный

         дескриптор  -  неверная   величина   и   его   вызов

         DSC$B_CLASS не может быть осуществлен.









                           - 79 -

                       00152-01 33 09-2


       Пример.

       10 !+

          ! В данном примере используется

          ! процедура LIB$CURRENCY для вывода по

          ! умолчанию текущего системного символа.

          ОUTLEN=1

          CALL LIB$CURRENCY (CURR$, OUTLEN)

          PRINT CURR$

       99 END

       Данная  программа  на  языке  программирования  БЕЙСИК

  демонстрирует   использование    процедуры    LIB$CURRENCY,

  вызывающей текущий системный символ, принятый по умолчанию.

       Результатом работы программы  является  знак  денежной

  единицы ($).



       1.18. LIB$CVT_DX_DX  -  общий   тип   данных,

             процедура преобразования


       Процедура  LIB$CVT_DX_DX  преобразует   элементы   или

  строковые  данные  системы  МОС  ВП,   описанные   исходным

  дескриптором,  в  другие  элементы  или  строковые   данные

  системы МОС ВП, описанные результирующим дескриптором.


       Формат:

       LIB$CVT_DX_DX элемент 1, элемент 2 [, длина]










                           - 80 -

                       00152-01 33 09-2


       Код возврата:

       Использование в МОС ВП: значения состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Элемент 1

       Использование в МОС ВП: адрес

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходный     элемент     преобразуемый      процедурой

  LIB$CVT_DX_DX.  Аргумент  элемент  1  -   адрес   точечного

  дескриптора  с  преобразуемым   исходным   элементом.   Тип

  преоразуемого элемента находится в дескрипторе.  Комбинации

  класса и типа данных исходного дескриптора ограничены, при-

  ведены в табл. 9...11.


       Элемент 2

       Использование в МОС ВП: адрес

       Тип: неопределенный

       Доступ: только запись

       Механизм: посредством дескриптора

       Результат преобразования. Аргумент элемент 2  -  адрес

  точечного   дескриптора   с    результирующим    элементом.

  Результирующий     дескриптор     задает     тип     данных

  преобразованного исходного элемента.




                           - 81 -

                       00152-01 33 09-2


       Комбинации  класса  и  типа   данных   результирующего

  дескриптора ограничены и приведены в табл. 9...11.


       Длина

       Использование в МОС ВП: адрес без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Длина результирующего элемента в  байтах  (когда  этот

  элемент   строка),    который    преобразован    процедурой

  LIB$CVT_DX_DX,   исключая   любые   заполнения   пробелами.

  Аргумент длина - адрес слова  без  знака,  содержащего  эту

  длину.

       Если строка элементов оборвана,  то  выдаваемая  длина

  указывает на обрыв. Это слово может быть  использовано  для

  определения, если  произошел  обрыв  или  выделение  строки

  точной длины, когда строка содержит заполнения пробелами.


       Описание.

       Процедура LIB$CVT_DX_DX - универсальная  преобразующая

  служебная  процедура.  Хотя  некоторые  из   функций   этой

  процедуры можно найти в  других  процедурах  исполнительной

  библиотеки,  модули  процедуры  LIB$CVT_DX_DX   преобразуют

  функции  с  общим  интерфейсом.  Поэтому  общий   интерфейс

  вызываемой   программы   не   определяет    точно,    какое

  преобразование должно быть  выполнено  и  для  какого  типа

  данных.

       Описание  данной  процедуры  разделено  на   следующие




                           - 82 -

                       00152-01 33 09-2


  части:

       1)    руководство    по    использованию     процедуры

  LIB$CVT_DX_DX;

       2)  использование  числовых  строк   байтовых   данных

  (NBDS).


       Руководство по использованию процедуры LIB$CVT_DX_DX


       Тип данных и класс дескриптора исходных и результирую-

  щих  аргументов   определяют,   каким   образом   процедура

  LIB$CVT_DX_DX осуществляет преобразования,  в  соответствии

  со следующими правилами:

       1) преобразование определяется  тремя  наборами  типов

  данных, состоящих из элементов, строк элементов и  цифровой

  строки байтовых данных (далее по тексту NBDS).  Хотя  набор

  типов  данных  в  виде  цифровой  строки  байтовых   данных

  фактически  служит  поднабором  элементарных  или  строчных

  типов данных, эти три набора являются взаимноисключающимися

  в данной процедуре;

       2)  масштаб  применяется  тогда,  когда  он  задан   в

  дескрипторе  (только  DSC$K_CLASS_SD),  и   масштабирование

  определяется для типа данных;

       3)  не   применяется   семантика   конкретного   языка

  программирования   такая,   как   масштаб    бейсика    для

  DSC$K_DTYPE_D;

       4) для достижения назначенного типа  данных  некоторые

  преобразования  должны  применять  промежуточные  значения.

  Хотя неизбежны некоторые потери быстродействия,  применение




                           - 83 -

                       00152-01 33 09-2


  промежуточных значений не вызывает потерю точности;

       5) результаты всегда округляются, а не обрываются,  за

  исключением случая, который описан в  пункте  7.  Если  при

  переходе к результирующему типу  данных  происходит  потеря

  точности или размера, то сообщение об ошибке не выдается;

       6) если результирующая строка  элементов  представляет

  собой цифровую строку байтовых  данных  и  имеет  семантику

  фиксированной строки и,  если  исходная  информация  короче

  информации, получаемой после преобразования,  то  результи-

  рующие данные дополняются пробелами.

       7) если и источник,  и  результат  являются  цифровыми

  строками байтовых данных и не требуется масштабирование, то

  производится   прямое   копирование   без   перевода    или

  преобразования и возможен обрыв результата. Если  требуется

  масштабирование,   то   имеет   место   преобразование    в

  соответствии с табл. 11;

       8) если исходная строка  представляет  собой  цифровую

  строку  байтовых  данных,  а  результирующая  строка  имеет

  другой  тип  данных,   и   во   вводимой   строке   имеется

  неправильный  элемент  или  значение  выходит  за   пределы

  размера,  который  может  быть  представлен  результирующей

  строкой, то вызывается процедура LIB$INVNBDS;

       9) попытки преобразования  отрицательного  значения  в

  тип данных, не имеющий знака, приводят к  выдаче  сообщения

  об ошибке LIB$INVCVT;

       10)  если  результирующая  строка  представляет  собой

  цифровую строку байтовых данных  класса  DSC$K_CLASS_D,  то




                           - 84 -

                       00152-01 33 09-2


  при необходимости  для  нее  будет  отведена  новая  строка

  соответсвующего размера;

       11) неправильные преобразования, приводящие к  ошибке,

  вызывают непредсказуемые результаты.


       Использование цифровых строк байтовых данных


       Для  простоты  и  для  того,  чтобы  определить  общую

  цифровую   строку,    которую    процедура    LIB$CVT_DX_DX

  воспринимает как цифровую строку, задается  набор  цифровой

  строки байтовых данных (NBDS) в  виде  набора  дескрипторов

  представленных в табл. 9.

                                                    Таблица 9

     Применяемый поднабор стандартных типов данных МОС ВП

  -----------------------------------------------------------

                  !          DSC$K_CLASS_XXX

                  ! -----------------------------------------

  DSC$K_DTYPE_YYY !  A  !   D  ! NCA !  S  !  SD  !  VS

  -----------------------------------------------------------

      B           !     !      !     !     !      !       !

      BU          !  х  !      !  х  !     !      !       !

      T           !  х  !  х   !  х  !  х  !   х  !   х   !

      VT          !     !      !     !     !      !   х   !



       Примечание. Массив будет иметь семантику фиксированной

  строки элементов. Цифровая строка  байтовых  данных  должна

  иметь формат, заданный в табл. 11.

       Комбинация   типа   данных   и   класса   дескрипторов




                           - 85 -

                       00152-01 33 09-2


  устанавливает, определен ли  аргумент  в  формате  цифровой

  строки  байтовых  данных  (NBDS).  Табл.  10  демонстрирует

  комбинацию класса дескриптора и типа данных (как указано  в

  поле    дескриптора),    которую    распознает    процедура

  LIB$CVT_DX_DX. Комбинация обозначенная NBDS рассматривается

  как принадлежащая NBDS'S.

                                                   Таблица 10

      Tипы данных, применяемые в процедуре LIB$CVT_DX_DX

  -----------------------------------------------------------

        Из:                  !         В:

  -----------------------------------------------------------

   текст (десятичный)        ! длинное слово

   текст (шестнадцатиричный) ! длинное слово

   текст (восьмеричный)      ! длинное слово

   текст (двоичный)          ! длинное слово

   текст (целый со знаком)   ! длинное слово

   текст (логический)        ! длинное слово

   текст (восьмеричный)      ! длинное слово

   текст (шестнадцатиричный) ! длинное слово

   текст                     ! с плавающей запятой формата D

   текст                     ! с плавающей запятой формата F

   текст                     ! с плавающей запятой формата G

   текст                     ! с плавающей запятой формата н

   длинное слово             ! текст (двоичный)

   длинное слово             ! текст (целый со знаком)

   длинное слово             ! текст (логический)

   длинное слово             ! текст (восьмеричный)




                           - 86 -

                       00152-01 33 09-2


                                         Продолжение табл. 10

  -----------------------------------------------------------

        Из:                  !         В:

  -----------------------------------------------------------

   длинное слово             ! текст (щестнадцатиричный)



       Например,   процедура   LIB$CVT_DX_DX   обращается   к

  комбинации DSC$K_DTYPE_B/DSC$K_CLASS_S (склярный  байт  без

  знака) как  к  неделимому  типу  данных.  Однако  процедура

  рассматривает                DSC$K_DTYPE_BU/DSC$K_CLASS_NCA

  (несоприкасающаяся область с байтами без знака), как формат

  цифровой строки байтовых данных (NBDS).

       Данные результирующей цифровой строки байтовых  данных

  (NBDS) всегда выравниваются слева.

       Если результирующий формат  цифровой  строки  байтовых

  данных (NBDS) требует более  50  цифр  для  своего  формата

  (включая  знак,  если  он  есть),  тогда  он  выражается  в

  экспоненциальном формате. Этот формат будет использоваться,

  если требуется масштабирование при преобразовании  цифровой

  строки байтовых данных в цифровую строку  байтовых  данных.

  Иначе  копирование  будет  немедленно  прекращено.   Формат

  исходной цифровой строки байтовых данных (NBDS) будет таким

  же, как формат, определенный для аргумента ввод в процедуре

  OTS$_CVT_T_Z, с битами 0,  2,  4  в  аргументе  флаг.  т.е.

  пробелы  игнорируются,   исчезновение   значащих   разрядов

  вызывает ошибку и табуляция игнорируется.






                           - 87 -

                       00152-01 33 09-2


                                                  Таблица 11

  Форматы назначенной цифровой строки байтовых данных (NBDS)

  ----------------------------------------------------------

  Исходный тип данных       !   Формат назначенной NBDS

  ----------------------------------------------------------

                            !        3),1)

  байт целый (со знаком)    ! S числа

                            !        3),1)

  байт (без знака)          ! S числа

                            !        3),1)

  слово целое (со знаком)   ! S числа

                            !      1)

  слово (без знака)         ! числа

                            !        3),1)

  длинное целое слово       ! S числа

  (со  знаком)              !

                            !      1)

  длинное слово (без знака) ! числа

                            !        3),1)

  целое квадрослово         ! S числа

  (со знаком)               !

                            !                       4),3),2)

  с плавающей запятой форма-! S0.MиH(16,W_7)E(+или-)NN

  та D                      !

                            !                       4),3),2)

  с плавающей запятой форма-! S0.MиH(7,W-7)E(+или-)NN

  та F                      !




                           - 88 -

                       00152-01 33 09-2


                                        Продолжение табл. 11

  ----------------------------------------------------------

  Исходный тип данных       !   Формат назначенной NBDS

  ----------------------------------------------------------

                            !                       4),3),2)

  с плавающей запятой форма-! S0.MиH(15,W-8)E(+или-)NNN

  та G                      !

                            !                       4),3),2)

  с плавающей запятой форма-! S0.MиH(33,W-9)E(+или-)NNNN

  та H                      !

                            !                          3),1)

  десятичная строка         ! S числа (определяется архи-

                            ! тектурой системы МОС ВП)

  ----------------------


       1) числа - цифры от 0 до 9 и десятичная запятая  тогда

  и  только  тогда,  когда  дескриптор  источника  определяет

  DSCSB_SCALE меньше 0;

       2) W - ширина получаемого набора данных в байтах;

       3)  S   -   знак,   для   положительных   чисел   знак

  подразумевается;

       4) мин - минимум два значения.

       Для конкретных языков программирования существует  два

  дескриптора  массива   DSC$K_CLASS_A   и   DSC$K_CLASS_NCA,

  которые описывают  строки  элементов,  используя  следующие

  механизмы:

       1) DSC$B _DIMCT=1 - распознается только одна  величина

  массива;



                           - 89 -

                       00152-01 33 09-2


       2) DSC$_LENGIH=1  -  длина  каждого  элемента  массива

  должна быть байтом;

       3) DSC$L_ARSIZE меньше или равна 65,535 - общий размер

  массива должен быть меньше, чем 65,535 байтов;

       4) если DSC$L_ARSIZE=0, то длина массива равна нулю;

       5)  DSC$L_S1=1  -  для  несмежных  массивов  шаг   при

  прохождении  массива  должен  быть  равен  1.   Это   будет

  действительно так, если  класс  дескриптора  массива  будет

  несмежным массивом, а сам массив должен быть смежным;

       6) массив записан с семантикой фиксированной строки.

       Если   вызываемая   программа    передает    процедуре

  LIB$CVT_DX_DX дескриптор, который не соответствует

  табл. 10, то выдается одно из следующих сообщений:

       1) LIB$INVDTYDSC;

       2) LIB$INVCLADSC;

       3) LIB$INVCLADTY;

       4) LIB$INVNBDS.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$DECOVF

       - ошибка   переполнения    упакованного    десятичного

         формата. Серьезная ошибка;

  LIB$FLTOVF

       - переполнение при символическом представлении  числа.

         Серьезная ошибка;





                           - 90 -

                       00152-01 33 09-2


  LIB$FLTUND

       - ошибка   потери   значимости    при    символическом

         представлении числа. Серьезная ошибка;

  LIB$INVCLADSC

       - неправильный   класс   дескриптора.    Этот    класс

         дескриптора не обрабытывается. Серьезная ошибка;

  LIB$INVCLADTY

       - неправильный класс и тип данных в  дескрипторе.  Эта

         комбинация класса и тип  данных  не  обрабатывается.

         Серьезная ошибка;

  LIB$INVCVT

       - исходное    значение    отрицательное,     а     тип

         результирующих данных не имеет знака;

  LIB$INVDTYDSC

       - неправильный тип  данных  в  дескрипторе.  Серьезная

         ошибка;

  LIB$INTOVF

       - ошибка переполнения целого числа. Серьезная ошибка;

  LIB$INVNBDS

       - неправильная цифровая  строка  байтовых  данных.  Во

         входной  строке   элементов   имеется   неправильный

         элемент  или  значение  выходит  за  рамки  размера,

         который  может   быть   представлен   результирующей

         строкой, или неправильный дескриптор цифровой строки

         байтовых данных. Эта ошибка также  возникает  в  том

         случае,  когда  размер   массива   цифровой   строки

         байтовых данных больше, чем 65,535 байтов, или  мас-




                           - 91 -

                       00152-01 33 09-2


         сив является многомерным;

  LIB$OUTSTRTRU

       - оборвана  строка  вывода.  Это  сообщение   выдается

         только в тех случаях, когда цифровая строка байтовых

         данных служит типом данных и источника и результата,

         а масштабирование не требуется.  Результат  оборван.

         Серьезная ошибка;

  LIB$_ROPRAND

       - ошибка резервного операнда. Серьезная ошибка.



       1.19. LIB$CVT_XTB  преобразование   числового

             текста в двоичный код


       Процедуры LIB$CVT_DTB, LIB$CVT_HTB, LIB$CVT_OTB выдает

  двоичное представление текстовых  строк  КОИ-8,  выраженных

  десятичными, восьмиричными и шестнадцатиричными числами.


       Формат:

       LIB$CVT_DTB счетчик, строка, результат

       LIB$CVT_HTB счетчик, строка, результат

       LIB$CVT_OTB счетчик, строка, результат


       Код возврата:

       Использование в МОС ВП: значения состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения







                           - 92 -

                       00152-01 33 09-2


       Аргументы:

       Счетчик

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством значения

       Счетчик байтов  вводимой  текстовой  строки.  Аргумент

  счетчик - целое длинное слово со знаком, содержащее счетчик

  байтов вводимой строки.


       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством ссылки

       Текстовая  строка   элементов   КОИ-8   представленная

  десятичным,  восьмеричным  или  шестнадцатиричным   числом,

  которую  процедура  LIB$CVT_XTB  преобразует   в   двоичное

  представление. Аргумент строка -  адрес  символьной  строки

  содержащей     вводимую     строку,      которая      будет

  преобразовываться.


       Результат

       Использование в МОС ВП: длинное слово (со знаком)

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Двоичное  представление  вводимой   строки.   Аргумент




                           - 93 -

                       00152-01 33 09-2


  результат  -  адрес  целого  длинного  слова   со   знаком,

  содержащего преобразованную строку.


       Описание.

       Процедура  LIB$CVT_DTB  преобразует  текстовую  строку

  элементов, представленную  десятичным  числом,  в  двоичное

  представление. Процедура LIB$CVT_HTB преобразует  текстовую

  строку элементов  КОИ-8,  представленную  шестнадцатиричным

  числом, в  двоичное  представление.  Процедура  LIB$CVT_OTB

  преобразует    текстовую    строку     элементов     КОИ-8,

  представленную    восьмеричным    числом,    в     двоичное

  представление.

       Примечание.   Процедуры   LIB$CVT_DTB,    LIB$CVT_HTB,

  LIB$CVT_OTB  предназначены   для   вызова   преимущественно

  программами   на   языках    программирования    БЛИСС    и

  макроассемблер.  Поэтому  они   требуют,   чтобы   вводимые

  скалярные параметры передавались  посредством  значения,  а

  строки  элементов  посредством  ссылки.  Пробелы   являются

  неверными элементами.


       Возвращаемые значения состояния:

       1 - процедура успешно завершена;

       0 - элемент во вводимой  строке  элементов,  не  имеет

  основания или  имеет  знак,  стоящий  не  на  своем  месте.

  Пробелы  и  табуляция  являются  неправильными   символами.

  Переполнение  свыше  32  битов  (без  знака)   приводит   к

  появлению ошибки.






                           - 94 -

                       00152-01 33 09-2


       1.20. LIB$DATE_TIME - выдача даты и времени в

             виде строки элементов


       Процедура LIB$DATE_TIME выдает дату  и  время  системы

  МОС ВП в виде задаваемой пользователем строки.


       Формат:

       LIB$DATE_TIME результирующая строка


       Код возврата:

       использование в МОС ВП: значение состояния

       тип: длинное слово (без знака)

       доступ: только запись

       механизм: посредством значения


       Аргументы:

       результирующая строка

       использование в МОС ВП: дата_время

       тип: символьная строка

       доступ: только запись

       механизм: посредством дескриптора

       Результирующая    строка,    в    которую    процедура

  LIB$DATE_TIME записывает дату  и  время  системы.  Аргумент

  результирующая  строка  -  адрес  точечного  дескриптора  с

  результирующей строкой.












                           - 95 -

                       00152-01 33 09-2


       Данная строка длиной в 23 символа. Она имеет следующий

  формат:

       DD_MM:SS. HH


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$STRTRU

       - процедура  успешно  завершена,   но   результирующая

         строка символов оборвана;

  LIB$INSVIRMEM

       - недостаточная виртуальная  память.  Вызов  процедуры

         LIB$DATE_TIME выполнен со сбоем, так  как  программа

         превысила квоту виртуальной памяти;

  LIB$INVSTRDES

       - неправильный    строчный    дескриптор.     Строчный

         дескриптор  имеет  неправильное  значение   в   поле

         DSC$B_CLASS.


       Пример.


        10 !+

           ! Данный пример демонстрирует использование

           ! процедуры  LIB$DATE_TIME.

           ! -

           CALL LIB$DATE_TIME (DSTSTR$)

           PRINT DSTSTR$

        99 END





                           - 96 -

                       00152-01 33 09-2


       Данная  программа  на  языке  программирования  бейсик

  использует процедуру LIB$DATE_TIME для вывода  на  терминал

  текущих даты и времени системы.

       Результат работы программы:

       26-JUL-1986 13:41:22.67



       1.21. LIB$DAY -  выдача  номера  дня  в  виде

             целого длинного числа


       Процедура LIB$DAY выдает номер дня, начиная с  нулевой

  даты системы - 17 ноября 1858 года или начиная  с  заданной

  пользователем начальной даты.


       Формат:

       LIB$DAY номер дня [, время-пользователя]

                         [, время-дня]


       Код возврата:
       
       Использование в МОС ВП: значения состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Номер дня

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки




                           - 97 -

                       00152-01 33 09-2


       Номер дня начиная с  нулевой  даты  системы.  Аргумент

  номер  дня  -  адрес  целого  длинного  слова  со   знаком,

  содержащего номер дня.


       Время-пользователя

       Использование в МОС ВП: время_имя

       Тип: целое квадрослово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Заданное  пользователем   время   в   сотых   единицах

  наносекунды. Аргумент  время-пользователя  -  адрес  целого

  квадрослова  со  знаком,  содержащего  время  пользователя.

  Положительное значение указывает на абсолютное время, в  то

  время как отрицательное значение  указывает  на  допустимое

  время. Это необязательный аргумент. Если он отсутствует, то

  по  умолчанию  принимается  текущее  время   системы.   Это

  квадрослово, содержащее значение  времени,  получается  при

  помощи вызова программы системного обслуживания SYS$BINTIM.

  Если время  указано  посредством  значения,  как  нуль,  то

  выдается числовое значение текущего дня. Если время указано

  посредством  ссылки,   как   нуль,   то   выдается   число,

  представленное датой 17 ноября  1858  года,  а  не  текущая

  дата.


       Время-дня

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись




                           - 98 -

                       00152-01 33 09-2


       Механизм: посредством ссылки

       Количество единиц, равных 10 миллисекундам, начиная  с

  0 часов аргумента время-пользователя. Аргумент время-дня  -

  адрес целого динного слова со знаком, в  которое  процедура

  LIB$DAY записывает это количество единиц.


       Описание.

       Процедура LIB$DAY выдает номер дня, начиная с  нулевой

  даты системы - 17  ноября  1858  года.  Пользователь  может

  произвольно задать  время  в  формате  системного  времени,

  которое будет  использоваться  вместо  системного  времени.

  Произвольно выдаваемым аргументом служит количество единиц,

  равных 10 миллисекундам, начиная с 0 часов.

       Примечание. Если  пользователь  задает  время  в  виде

  квадрослова, то оно не проверяется. Если оно  отрицательное

  (бит 63), то значение номера дня отрицательное.

       Исполнительная  библиотека  использует  дата/временные

  служебные процедуры для языков программирования,  неимеющих

  встроенных функций времени и даты, и для частных прикладных

  задач, которые запрашивают  время  и  дату  в  определенном

  формате одного из языков программирования. В  основном  это

  просто  вызов  процедур   исполнительной   библиотеки   для

  системных даты и времени, которые вызывают  программы  сис-

  темного обслуживания.











                           - 99 -

                       00152-01 33 09-2


       Возвращаемые значение состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_INTOVF

       - присутствует   дополнительный   аргумент,    который

         определяет дату после 8600 года.


       Пример.

        РROGRAM DAY(INPUT, OUTPUT);

        (+)

        ( Данный пример демонстрирует использование

        ( процеруры LIB$DAY.

        (-)

        VAR

          DAYNUMBER :INTEGER;

        PROCEDURE LIB$DAY(DAYNUM :INTEGER);

          EXTERN;

        BEGIN

          LIB$DAY (DAYNUMBER);

          WRITELN('день недели ', DAYNUMBER);

        END

       Данная программа  на  языке  программирования  ПАСКАЛЬ

  демонстрирует использование процедуры LIB$DAY.













                           - 100 -

                       00152-01 33 09-2


       1.22. LIB$DAY_OF_WEEK  -  отображение  номера

             дня недели


       Процедура LIB$DAY_OF_WEEK выдает номер дня недели  для

  введенного  значения  времени.  Если   введенное   значение

  времени равно нулю, то выдается текущий день недели. Номера

  дней  изменяются  от  1  до  7,  с  понедельника,   который

  указывается как 1 и до воскресенья, которое указывается как

  7.


       Формат:

       LIB$DAY_OF_WEEK время, номер дня


       Код возврата:

       Использование в МОС ВП: значения состояния

       Тип: значение состояния

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Время

       Использование в МОС ВП: дата-время

       Тип: квадрослово

       Доступ: только чтение

       Механизм: посредством ссылки

       Время, переводимое в день недели  или  нуль.  Аргумент

  время - адрес квадрослова без знака,  содержащего  значение

  времени. Время может передаваться, как абсолютное системное

  время. Это значение  времени  получается  в  соответсвующем




                           - 101 -

                       00152-01 33 09-2


  квадрослову    формате    вызова    программы    системного

  обслуживания SYS$BINTIM.

       Если это время указано посредством значения, как нуль,

  то  выдается  номер  текущего  дня.  Если   время   указано

  посредством  ссылки,  как  нуль,  то  выдается  номер   дня

  представленный 17 ноября 1858 года, а не текущий день.


       Номер-дня

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Номер дня недели. Аргумент номер-дня - адрес  длинного

  слова  без  знака,  в  которое  процедура   LIB$DAY_OF_WEEK

  записывает целое значение, представляющее день недели.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена.


       Пример.

        РROGRAM DAYOFWEEK (INPUT,OUPUT);

        (+)

        ( Данный пример демонстрирует использование

        ( процедуры LIB$DAY_OF_WEEK.

        (-)

        VAR

          OUTDAT : INTEGER

        PROCEDURE LIB$DAY_OF_WEEK(TIM : INTEGER;



                           - 102 -

                       00152-01 33 09-2


                  %REF OUTDA :INTEGER);EXTERN;

        BEGIN

          LIB$DAY_OF_WEEK (%IMMED O,OUTDAT);

          WRITELN(OUTDAT);

        END

       Данная программа  на  языке  программирования  ПАСКАЛЬ

  демонстрирует использование процедуры LIB$DAY_OF_WEEK. Дан-

  ным примером проверяется на понедельник.

       Результат работы программы:

       "1"



       1.23. LIB$DECODE_FAULT - декодирование потока

             инструкций при неисправности


       Процедура  LIB$DECODE_FAULT  является  средством   для

  создания  программ  обработки  условий,  которые  выполняют

  отказ от  инструкции  при  обнаружении  неисправности.  Она

  вызывается из программы обработки состояния.


       Формат:

       LIB$DECODE_FAULT сигнальный-аргумент,

                        механизм-аргумент,

                        процедура-пользователя

                        [, аргумент-пользователя]

                        [, определения]










                           - 103 -

                       00152-01 33 09-2


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Сигнальный-аргумент

       Использование в МОС ВП: вектор-длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Массив сигнальных аргументов, который был  передан  из

  системы МОС  ВП  программе  обработки  состояния.  Аргумент

  сигнальный-аргумент - адрес массива сигнальных аргументов.


       Механизм-аргумент

       Использование в МОС ВП: вектор-длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Массив механизм-аргументов, который был передан систе-

  мой    МОС    ВП    обработчику     состояния.     Аргумент

  механизм-аргумент - адрес массива механизм-аргументов.


       Процедура-пользователя

       Использование в МОС ВП: процедура

       Тип: значение граничной процедуры или маска входа

            процедуры



                           - 104 -

                       00152-01 33 09-2


       Доступ: вызов после развертки стека

       Механизм: посредством дескриптора, процедуры.

       Задаваемая пользователем процедура  действия,  которая

  вызывается  процедурой  LIB$DECODE_FAULT   для   выполнения

  отказа.

       Аргумент  процедура-пользователя  -  адрес   точечного

  дескриптора пользовательской процедуры  действия.  Аргумент

  процедура-пользователя может иметь  тип  данных  "граничное

  значение процедуры", когда вызывается языками  программиро-

  вания высокого уровня. Если аргумент процедура-пользователя

  не имеет тип  данных  "граничное  значение  процедуры",  то

  предлагается тип данных адрес маски входа.


       Аргумент-пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством значения

       Дополнительная информация, передаваемая из обработчика

  состояния,    в    процедуру     действия     пользователя.

  Аргумент-пользователя содержит значение этой дополнительной

  информации. Это необязательный аргумент, если  он  отсутст-

  вует, то используется нуль.


       Определения

       Использование в МОС ВП: вектор_байт_без_знака

       Тип: байт (без знака)

       Доступ: только чтение




                           - 105 -

                       00152-01 33 09-2


       Механизм: посредством ссылки, ссылки на массив.

       Массив байтов, задающий  коды  операции  инструкции  и

  определения операндов, которые должны заменить  или  допол-

  нить стандартные определения инструкции. Аргумент определе-

  ние - адрес этого массива.

       Если этот аргумент пропущен,  то  используются  только

  инструкции, определенные в  системе  МОС  ВП.  Если  данный

  аргумент присутствует, то сначала рассматривается аргумент,

  а затем стандартные определения.

       Каждое определение состоит из серии байтов, из которых

  первые один или два представляют собой код  операции  инст-

  рукции. Если код операции  инструкции  двухбайтовый,  то  в

  первом из двух байтов размещается  байт  перехода,  который

  должен быть шестнадцатеричным FD, FE или  FF.  После  этого

  кода операции могут следовать от 0 до 16 байтов определения

  операнда. Эти байты задают тип доступа операнда и тип  дан-

  ных.

       Конец каждого определения инструкции обозначается  при

  помощи байта, содержащего значение LIB$K_DCFOPR_END (нуль).

  Список определения инструкций заканчивается двумя  шестнад-

  цатиричными байтами, содержащими значение "-1"  (шестнадца-

  тиричная FF).


       Описание.

       Описание раздела процедуры LIB$DECODE_FAULT делится на

  пять частей:

       1)    руководство    по    использованию     процедуры

  LIB$DECODE_FAULT;



                           - 106 -

                       00152-01 33 09-2


       2) отказы, распознаваемые процедурой LIB$DECODE_FAULT;

       3) коды определения операнда команды;

       4) формат вызова для процедуры действия пользователя;

       5) формат вызова для сигнальной процедуры.


       Руководство      по      использованию       процедуры

  LIB$DECODE_FAULT


       Процедура LIB$DECODE_FAULT является средством для соз-

  дания обработчиков состояний, которые  выполняют  отказ  от

  инструкции при  обнаружении  неисправности.  Вызываемая  из

  обработчика состояния процедура LIB$DECODE_FAULT, выполняет

  следующие действия в указанном порядке:

       1) возвращает промежуточные стековые фрагменты к месту

  отказа;

       2) декодирует поток инструкций для определения  опера-

  ции и ее операндов;

       3) вызывает задаваемую пользователем процедуру  дейст-

  вия,  передавая  ей  последовательное  описание  содержания

  инструкции.

       Процедура действия пользователя выполняет все  необхо-

  димые задачи для обработки неисправности и  возвращается  к

  процедуре LIB$DECODE_FAULT, которая  затем  восстанавливает

  контекст в соответствии с изменениями, сделанными  процеду-

  рой действия пользователя, и продолжает работу.

       Прежде всего обработчик состояния должен решить  будет

  он обрабатывать отказ или нет. Список сигнальных аргументов

  содержит код отказа и адрес счетчика программы. Если  отказ




                           - 107 -

                       00152-01 33 09-2


  представляет собой ошибку, которую может анализировать дан-

  ная процедура, то после  вызова  процедуры,  управление  не

  возвращается к обработчику состояния. Поэтому обработчик не

  должен зависеть от  получения  управления  после  обработки

  отказа.

       Примечание. Процедура действия  пользователя  способна

  генерировать новый отказ, включая такой,  который  выглядит

  идентично исходному отказу. Процедура действия пользователя

  также может повторить сигнал, но если решение о  повторении

  сигнала сделано внутри процедуры действия пользователя,  то

  теряются все кадры стека после сигнала.

       После того, как обработчик состояния  принял  решение,

  что он будет  обрабатывать  отказ,  он  вызывает  процедуру

  LIB$DECODE_FAULT, передавая в  качестве  аргументов  адреса

  сигнала и списки механизм-аргументов,  а  также  дескриптор

  для точки входа пользовательской процедуры действия. Проце-

  дура будет тогда выполнять следующие действия:

       1) определять, является ли отказ такой системой, кото-

  рую она воспринимает. Если нет, то  выдается  сообщение  об

  ошибке SS$_RESIGNAL;

       2) определять  контекст,  в  котором  появился  отказ,

  включая содержание  регистра  и  длинного  слова  состояния

  программы и сохранить его;

       3) разворачивать в обратном направлении все кадры сте-

  ка до того, в котором произошел отказ.

       4) оценивать режим адресации каждого операнда,  вычис-

  ляя результирующую ячейку для операнда.  Операнды,  переда-




                           - 108 -

                       00152-01 33 09-2


  ваемые посредством значения,  преобразуются  до  их  полной

  формы. Если обнаруживается неправильный режим адресации, то

  генерируется отказ SS$_RADRMOD;

       5) проверять каждый операнд на допустимость, за исклю-

  чением тех случаев, когда исходным отказом был  SS$_ACCVIO.

  При необходимости об'является нарушение E доступа, как если

  бы команда попыталась работать нормально;

       6) проверять каждый операнд с плавающей запятой, кото-

  рый должен быть прочтен для зарезервированного  операнда  с

  плавающей запятой, за исключением тех случаев, когда исход-

  ным отказом был SS$_ROPRAND. При необходимости  об'является

  ошибка зарезервированного операнда;

       7) определять адрес следующей по порядку команды;

       8) вызывать процедуру действия пользователя с аргумен-

  тами;

       9) вплоть до возвращения из процедуры действия пользо-

  вателя, отражать изменения в регистрах  и  в  данном  слове

  состояния программы, а также продолжать выполнение с адреса

  команды, заданной процедурой действия пользователя.  Допол-

  нительно процедура действия пользователя может указать, что

  она хочет повторить сигнал об исходном отказе.

       Некоторые команды могут генерировать больше, чем  одну

  ошибку, если оценка одного операнда вызывает ошибку,  кото-

  рая возникает до просмотра следующего операнда,  который  в

  свою очередь тоже вызывает  ошибку.  Примером  этого  может

  быть случай, когда команда деления, в  режиме  с  плавающей

  запятой может сообщить об ошибке, связанной с  делением  на




                           - 109 -

                       00152-01 33 09-2


  нуль, при регистрации нулевого делителя до того, как  заме-

  тит,  что  делимое  было  зарезервированным  операндом  или

  недоступно.

       В таких случаях ошибки, связанные с конкретным операн-

  дом,    будут     об'являться     немедленно     процедурой

  LIB$DECODE_FAULT, с учетом того, что  обработчик  состояния

  (другой, или тот же самый) может  исправить  ситуацию.  Это

  может привести к изменению порядка последовательности отка-

  зов, воспринимаемого программой. Если отказ  операнда  исп-

  равлен, то исходный отказ будет повторен и будут предприня-

  ты необходимые действия.

       В этом случае, следует попытаться определить,  необхо-

  дима ли повторная сигнализация внутри обработчика  условия,

  который вызывает процедура LIB$DECODE_FAULT,  а  не  внутри

  пользовательской программы. Причиной этого является то, что

  процедура  LIB$DECODE_FAULT  удаляет  все   пост-сигнальные

  фрагменты стека  перед  вызовом  вашей  программы  действий

  пользователя.

       Все входные операнды читаются в порядке слева направо,

  а затем все выходные операнды записываются тоже  в  порядке

  слева направо для предотвращения противоречивых результатов

  при  перекрытиии  операндов.   Это   особенно   важно   для

  регистровых операндов.

       РSL  может  быть  изменен.  Если  Т-бит  в   PSL   был

  установлен    в    начале    инструкции,    то    процедура

  LIB$DECODE_FAULT  устанавливает   бит   ТР.   Для   запуска

  трассировки нужно установить только Т-бит,  для  запрещения




                           - 110 -

                       00152-01 33 09-2


  трассировки нужно очистить Т-бит и ТР-бит. Более  подробное

  описание трассировки приведено в документе [3].

       Если бит  FPD  (первая  часть  выполнена)  в  PSL  был

  установлен при сбое инструкции, процедура  LIB$DECODE_FAULT

  продвигает РС через инструкцию; она не выполняет повторного

  вычисления операнда и устанавливает счетчик операндов в  0.

  Предполагается,  что,   если   FPD   установлен,   операнды

  находятся в известных ячейках (обычно это регистры).

       Для инструкций CASEB, CASEL только аргументы операндов

  выбор,  база,  предел  представлены  в  операнде  счета   и

  операнде чтения. Элементы регистров, которые  соответствуют

  рс,  описанные  в  тексте  как  R15,  указывают  на  первое

  смещение длиной в слово.  Программа  действий  пользователя

  должна изменить  R15  для  отображения  ячейки,  в  которой

  находится следующая выполняемая инструкция.

       Описание    инструкций,     использующих     процедуру

  LIB$DECODE_FAULT,  определяет   инструкцию   XFC   (которая

  вызывает  сбой  SS$_OPCCUS)  как  инструкцию,  не   имеющую

  операндов. Можно переопределить XFC, если  это  необходимо,

  используя  аргумент  определение  инструкций  в   процедуре

  LIB$DECODE_FAULT.

       Если   необязательно    выполнять    инструкцию    для

  возобновления   последующего   потока   инструкций,   нужно

  соответствующим  образом  модифицировать   R15.   Программа

  действий пользователя затем возвращает управление процедуре

  LIB$DECODE_FAULT, которая восстанавливает регистры и PSL, и

  завершает выполнение инструкции. Аналогичные функции выпол-




                           - 111 -

                       00152-01 33 09-2


  няет процедура LIB$RESTART.


       Отказы, распознаваемые процедурой LIB$DECODE_FAULT


       Процедура LIB$DECODE_FAULT распознает следующие ошибки

  системы МОС ВП:

  SS$_ACCVIO

       - нарушение доступа;

  SS$_BREAK

       - ошибка точности прерывания;

  SS$_FLTDIV_F

       - деление на ноль при работе с плавающей запятой;

  FLTOVF_F

       - переполнение при работе с плавающей запятой;

  SS$_FLTUND_F

       - потеря значимости при работе с плавающей запятой;

  SS$_OPCCUS

       - код операции зарезервирован для пользователей и CSS;

  SS$_OPCDEC

       - зарезервированный код операции;

  SS$_ROPRAND

       - зарезервированный операнд;

  SS$_TBIT

       - Т-битовое  ожидающее  прерывание.   Это   фактически

         ошибка, связанная с  установкой  бита  ТР  в  начале

         выполнения команды.  Она  позволяет  интрпретировать

         все  команды,  устанавливая  Т-бит  длинного   слова

         состояния  программы  и  разрешая   каждой   команде




                           - 112 -

                       00152-01 33 09-2


         прослеживать ошибку.

       Все другие отказы, включая  SS$_COMPAT  и  SS$_RADRMOD

  приводят    к    немедленному     возвращению     процедуры

  LIB$DECODE_FAULT в состояние SS$_RESIGNAL.

       SS$_COMPAT выдается  командами  режима  совместимости,

  которые данная процедура не обрабатывает.

       SS$_RADRMOD    выдается    в    связи    с     ошибкой

  зарезервированного  режима  адресации.   Данная   процедура

  предполагает, что все команды  соответствуют  спецификациям

  режима адресации системы МОС ВП.


       Коды определения операнда команды


       Каждый командный операнд имеет соотвествующий ему  тип

  доступа (чтение, запись и т.д.) и тип данных (байт, слово и

  т.д.).  Коды   определения   операнда,   использованные   в

  параметре определения команды (который передается процедуре

  LIB$DECODE_FAULT) и в параметре  типов  операндов  (который

  передается процедуре действия пользователя), указывают типы

  доступа и типы данных в байте. Поля и  значения  для  типов

  доступа операнда и типов данных  операнда  описываются  при

  помощи таких символов, как имя макро или модуля $LIBDCFDEF.

  LIB$V_DCFACC

       - поле кода описания операнда, которое определяет  тип

         доступа операнда. (Биты с 0 по 2);

  LIB$S_DCFACC

       - размер поля типа доступа. (Бит 3);






                           - 113 -

                       00152-01 33 09-2


  LIB$M_DCFACC

       - маска для поля типа доступа. Это 3-х  битовое  поле,

         которое может содержать какое-либо двоичное значение

         от 000 до 111. Целое значение  этого  установленного

         бита определяет код типа доступа операнда  для  поля

         LIB$M_DCFACC. Текущие шесть  кодов  определены.  Эти

         коды имеют символические имена. Очень важно помнить,

         что LIB$M_DCFACC не имеет маски. Числа  от  0  до  6

         включительно не имеют отношения к битам от  0  до  6

         включительно. Они представляют собой двоичное значе-

         ние от 001 до 110, содержащееся  в  3-битовом  поле.

         Коды типа доступа операнда,  определенные  для  поля

         LIB$M_DCFACC следующие:

  LIB$K_DCFACC_R=1

       - операнд только для чтения;

  LIB$K_DCFACC_W=2

       - операнд только для записи;

  LIB$K_DCFACC_M=3

       - операнд должен быть изменен;

  LIB$K_DCFACC_A=4

       - операнд представляет собой  адрес  (не  должен  быть

         регистром);

  LIB$K_DCFACC_V=5

       - операнд представляет собой базу битового поля (такой

         же как адрес, но может быть регистром);

  LIB$K_DCFACC_B=6

       - операнд представляет собой адрес ветви;




                           - 114 -

                       00152-01 33 09-2


  LIB$V_DCFTYP

       - поле кода дескриптора  операнда,  которое  описывает

         тип данных операнда (биты с 3 по 7);

  LIB$S_DCFTYP

       - размер поля типа данных операнда (5 битов);

  LIB$M_DCFTYP

       - маска для поля типа данных операнда.  Это  5-битовое

         поле ( биты с  3  по  7),  которое  может  содержать

         двоичное значение от 00000 до 11111. Целое  значение

         этого  установленного  бита  определяет   код   типа

         доступа операнда для поля  LIB$M_DCFACC.  Определены

         текущие девять кодов. Эти коды  имеют  символические

         имена. Очень  важно  помнить,  что  LIB$M_DCFTYP  не

         имеет бит маски. Числа от 0  до  9  включительно  не

         имеют отношения к битам от 0 до 9. Они  представляют

         собой двоичные числа от 00001 до 01001, содержащиеся

         в  5-битовом  поле.  Коды  типа  доступа   операнда,

         определенные для поля LIB$V_DCFTYP следующие:

  LIB$V_DCFTYP_B=1

       - операнд равен байту;

  LIB$K_DCFTYP_W=2

       - операнд равен слову;

  LIB$K_DCFTYP_L=3

       - операнд равен длинному слову;

  LIB$K_DCFTYP_Q=4

       - операнд равен квадрослову;






                           - 115 -

                       00152-01 33 09-2


  LIB$K_DCFTYP_O=5

       - операнд равен октаслову;

  LIB$K_DCFTYP_F=6

       - операнд с плавающей запятой формата F;

  LIB$K_DCFTYP_D=7

       - операнд с плавающей запятой формата D;

  LIB$K_DCFTYP_G=8

       - операнд с плавающей запятой формата G;

  LIB$K_DCFTYP_H=9

       - операнд с плавающей запятой формата Н.

       Кроме того определены  символы  типа  LIB$K_DCFOPR_XY,

  где Х - это тип доступа и  Y  -  это  тип  данных,  которые

  об'единяют указания типа данных и типа  доступа.  Например,

  LIB$K_DCFOPR_MF имеет следующее значение:

       51 (3 + (6 * 8))

       Это  обозначает  изменение  доступа   к   элементу   с

  плавающей запятой формата F и G. Для  типа  доступа  ветви,

  определены только типы  ВВ,  BW,  BL;  в  противном  случае

  доступны все комбинации.



       1.24. Формат вызова  для  процедуры  действия

             пользователя


       Процедура действия пользователя вызывается  процедурой

  LIB$DECODE_FAULT  при   необходимости   обработки   отказа.

  Процедура действия пользователя  обрабатывает  отказ  любым

  способом, затем возвращается к процедуре LIB$DECODE_FAULT.





                           - 116 -

                       00152-01 33 09-2


       Формат:

       процедура действия - код, значение РС, PSL, регистры,

       счетчик операндов, типы операндов, адреса операндов

       чтения, адреса операндов записи, аргументы сигналов,

       сигнальная процедура, контекст, аргумент пользователя,

       первоначальный регистр.


       Аргументы:

       Код

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Код операции команды, которая вызвала ошибку. Аргумент

  код - адрес длинного слова, содержащего этот код. Для  двух

  байтовых   кодов   операции   код    перехода    (например,

  шестнадцатиричный  FD)   представлен   в   младшем   байте.

  Используется этот параметр для исследования кода  операции,

  вместо чтения байтов заданных аргументом значение  РС.  Это

  связано с тем, что если точка прерывания программы  отладки

  содержалась в команде, то только данный  аргумент  содержит

  исходную команду.


       Значение РС

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки




                           - 117 -

                       00152-01 33 09-2


       Значение счетчика инструкций (PC) для команды, которая

  вызвала прерывание. Аргумент значение PC -  адрес  длинного

  слова, содержащего значение счетчика инструкций.

       Существует   разница   между   данным   значением    и

  содержанием    элемента    массива    регистров,    который

  соответствует счетчику программы.  R15  -  элемент  массива

  регистров содержит адрес следующего байта команды,  которая

  вызвала ошибку.


       РSL

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки, ссылки на массив.

       Длинное слово  состояния  процессора  (PSL)  в  момент

  появления ошибки. Аргумент  PSL  -  адрес  длинного  слова,

  содержащего это состояние  процессора.  Процедура  действия

  пользователя  может  изменить   длинное   слово   состояния

  процессора   (PSL)   в   рамках   ограничений,   задаваемых

  архитектурой системы МОС ВП.


       Регистры

       Использование в МОС ВП: вектор длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки, ссылки на массив.

       Содержит значения регистров от R0 до R15 (PC) в момент

  появления  ошибки,  но  после  обработки  режима  адресации




                           - 118 -

                       00152-01 33 09-2


  операнда,   включая   автоматические    приращения    и/или

  отрицательные приращения. Аргумент регистры - адрес массива

  16 длинных слов. Каждое  длинное  слово  массива  регистров

  содержит содержимое одного регистра.

       Процедура действия  пользователя  может  изменить  эти

  значения. В случае  продолжения  выполнения  команды  будут

  отражены новые значения.

       R15  будет  использоваться  для  обозначения  элемента

  данного аргумента, который соответствует счетчику  инструк-

  ций. R15 содержит  адрес  следующего  байта  после  текущей

  инструкции.  Выполнение  команды  будет  возобновляться   с

  данного адреса, за исключением тех случаев, когда это  зна-

  чение было изменено процедурой действия. Когда отказ связан

  с командами CASEB, CASEW, CASEL, R15 содержит адрес первого

  слова смещения. Для данных команд процедура действия должна

  изменить R15, чтобы он задавал на  новую  команду,  которую

  нужно выполнить.

       После выполнения команды, регистры с R0 по  R15  будут

  восстановлены в данном массиве. Тем не менее, если аргумент

  процедура использует  вызов  ошибки  или,  если  инструкция

  перезапускается, то  будет  выдаваться  ошибка  LIB$RESTART

  вместо использования аргумента первоначальный регистр.


       Счетчик операндов

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение





                           - 119 -

                       00152-01 33 09-2


       Механизм: посредством ссылки

       Количество  операндов  в  инструкции  декодируемой   в

  данный момент. Аргумент счетчик операндов - адрес  длинного

  слова, в котором находится это количество.


       Типы операндов

       Использование в МОС ВП: вектор длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Массив длинных слов, по одному  элементу  для  каждого

  операнда, содержит коды типов для соотвествующего операнда.

  Аргумент типы операндов - адрес данного массива.


       Адреса операндов чтения

       Использование в МОС ВП: вектор длинное слово без знака

       Тип: длинное слово без знака

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Массив длинных слов, по одному  элементу  для  каждого

  операнда, содержащий адреса операндов, которые должны  быть

  прочитаны. Аргумент адреса операндов чтения -  адрес  этого

  массива.

       Заданный адрес может не  быть  действительным  адресом

  операнда, если операнд не  является  ячейкой  памяти.  Если

  операнд  является  регистром,  то  адрес  указывает   копию

  значения  регистра  в  момент  оценки  операнда.  Если  тип

  доступа операнда  ADDRESS  или  FIELD,  а  сам  операнд  не




                           - 120 -

                       00152-01 33 09-2


  является  регистром,  то  адрес  представляет  собой  адрес

  элемента.  Если  тип  доступа  операнда  FIELD,  а  операнд

  представляет  собой   регистр,   то   адрес   относится   к

  соответствующему  элементу  массива  регистры.   Если   тип

  доступа операнда BRANCH, то адрес - это  счетчик  программы

  назначения ветви (PC). Для операнда типа доступа WRITE зна-

  чения адреса равна нулю.


       Адреса операндов записи

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Массив длинных слов, по одному  элементу  для  каждого

  операнда, содержащий адреса операндов, которые должны  быть

  записаны. Аргумент адреса операндов записи  -  адрес  этого

  массива. Если тип доступа для операнда отличен  от  MODEFY,

  WRITE, ADDRESS или FIELD, значение указателя = 0.


       Возвращаемые значения состояния для процедуры действия

  пользователя


       Процедура  действия  пользователя   может   возвращать

  следующие значения состояния процедуре LIB$DECODE_FAULT:

  SS$_CONTINUE

       - если  программа  действия  пользователя   возвращает

         значение SS$_CONTINUE, то выполнение  команды  будет

         продолжаться  в  соответвии  с  текущим  содержанием

         аргумента регистры для счетчика инстукций (PC);



                           - 121 -

                       00152-01 33 09-2


  SS$_RESIGNAL

       - если программа действия пользователя возвращает зна-

         чение SS$RESIGNAL, то повторяется  сигнал  исходного

         отказа, только с изменениями,  которые  определяются

         элементами аргумента регистры для регистров R0 и  R1

         (которые сохраняются в векторе  механизм-агументов),

         PC и PSL. Содержимое других регистров изменяется  на

         то, которое существует в момент отказа;

  LIB$_RESTART

       - если программа действия пользователя возвращает зна-

         чение   SS$RESTART,   то   текущая   команда   будет

         перезапущена   с   восстановлением   регистров   для

         первоначального регистра и PSL  для  длинного  слова

         состояния процессора (PSL). Эта особенность  полезна

         для отслеживания записи обрабатывающей программы.


       Формат записи для сигнальной процедуры


       Сигнальная процедура, вызываемая  процедурой  действия

  пользователя, имеет следующий формат:

       Сигнальная процедура  флаг, контекст, символьные

                                             аргументы


       Флаг

       Использование в МОС ВП: маска длинное слово

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки





                           - 122 -

                       00152-01 33 09-2


       Длинное слово, младший бит которого определяет, должен

  ли быть отказ об'явлен как ошибка или как захват.  Аргумент

  флаг содержит адрес этого слова.  Если  младший  бит  этого

  аргумента установлен в 1,  то  отказ  об'является  ошибкой.

  Если младший бит равен 0, то  отказ  об'является  захватом;

  используется текущее значение массива аргумента регистры. В

  любом  случае  текущее  содержание  PSL  используется   для

  установки отказа в PSL.


       Контекст

       Использование в МОС ВП: контекст

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Контекст, в котором новый отказ происходит посредством

  передачи   процедуре   действия   пользователя   процедурой

  LIB$DECODE_FAULT. Аргумент контекст - адрес этого  значения

  контекста.


       Сигнальные аргументы

       Использование в МОС ВП: список аргументов

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Сигнальные    аргументы,    которые    должны     быть

  использованы. Аргумент сигнальные аргументы - адрес массива

  длинных слов, которые содержат сигнальные аргументы. Первое

  длинное слово содержит количество последующих длинных слов;




                           - 123 -

                       00152-01 33 09-2


  последующий список содержит имена сигналов и аргументов.  В

  отличие  от  списка  сигнальных  аргументов,   передаваемых

  обработчику  состояний,  в  этом  случае  нет  ни  счетчика

  программы  (PC),  ни  длинного  словосостояния   процессора

  (PSL).

       Перед об'явлением отказа кадры  стека  разворачиваются

  обратно к исходному отказу.  Необходимо  быть  внимательным

  при вызове нового сигнала, чтобы при этом не  был  случайно

  сгенерирован цикл  ошибок.  Например,  обработчик  условий,

  который   вызвал   процедуру    LIB$DECODE_FAULT,    обычно

  вызывается для второго сигнала.  Если  этот  обработчик  не

  будет анализировать второй сигнал как таковой, то он  может

  зациклиться по тому же маршруту, что и для первого сигнала.

       Чтобы повторить сигнал о текущем отказе, нужно,  чтобы

  стандартная программа действия выдала значение SS$_RESIGNAL

  вместо  вызванного  аргумента  сигнальные   аргументы,   за

  исключением тех случаев,  когда  необходимо  снова  вызвать

  обработчики условий, которые были вызваны ранее.


       Возвращаемые значения состояния:

  SS$_RESIGNAL

       - условия    повторения    сигнала    для    следующей

         обрабатывающей   программы.   Отказы,    описываемые

         аргументом сигнальные аргументы не  вызывают  ошибку

         команды, обрабатываемую процедурой LIB$DECODE_FAULT.

         Если  процедура  LIB$DECODE_FAULT  может  обработать

         ошибку,  она  не   возвращается   к   вызвавшей   ее

         программе.



                           - 124 -

                       00152-01 33 09-2


       Сигнализируемые значения состояния:

  LIB$_INVARG

       - неверный   аргумент    исполнительной    библиотеки.

         Определена   инструкция,   содержащая    более    16

         операндов,   или   определен   операнд,   содержащий

         неверный тип данных или код доступа.  Это  сообщение

         появляется после того, как были возвращены фрагменты

         стеков, т.е. оно выдается процедурой,  которая  была

         вызвана командой, столкнувшейся с ошибкой.



       1.25. LIB$DEC_OVER    -    разрешение     или

             запрещение   обнаружения    десятичного

             переполнения


       Процедура   LIB$DEC_OVER   разрешает   или   запрещает

  обнаружение  десятичного   переполнения   при   активизации

  вызываемой процедуры. Возвращается предыдущее установленное

  переполнение.


       Формат:

       LIB$DEC_OVER  новая установка


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: целое длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Старая установка, разрешающая десятичное  переполнение

  (предыдущее  содержание  SF$W_PSW[PSW$V_DV]  во   фрагменте



                           - 125 -

                       00152-01 33 09-2


  вызывающей программы).


       Аргументы:

       Новая установка

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Новая установка, разрешающая десятичное  переполнение.

  Аргумент новая установка - адрес байта без  знака,  который

  содержит   новую    установку,    разрешающую    десятичное

  переполнение.  Если  нулевой  бит  установлен  в   1,   это

  означает,  что  переполнение  возможно,  если  нулевой  бит

  установлен в 0, это означает, что переполнение невозможно.


       Описание.

       Процедура   LIB$DEC_OVER   изменяет   фрагмент   стека

  вызывающей   программы.   Вызов   процедуры    LIB$DEC_OVER

  действует только на  активизацию  текущей  процедуры  и  не

  влияет на любую из вызывающих  ее  программ  или  на  любую

  процедуру, которую она может вызвать. Однако эта  установка

  остается  действительной  для  любой   процедуры,   которая

  вводится через точку входа JSB.














                           - 126 -

                       00152-01 33 09-2


       1.26. LIB$DELETE_FILE - удаление  одного  или

             более файлов


       Процедура  LIB$DELETE_FILE  удаляет  один  или   более

  файлов. Спецификация файла (файлов),  который  должен  быть

  удален, может содержать символы обобщения.

       Процедура LIB$DELETE_FILE по своим функциям аналогична

  команде DELETE диалогового командного языка.


       Формат:

       LIB$DELETE_FILE  спецификация файла [, спецификация

                        файла по умолчанию]

                        [, относительная спецификация файла]

                        [, успешная процедура]

                        [, процедура ошибки]

                        [, процедура подтверждения]

                        [, аргумент пользователя]

                        [, имя результата] [, файл контекста]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения













                           - 127 -

                       00152-01 33 09-2


       Аргументы:

       Спецификация файла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка,  содержащая   спецификацию   файла   (файлов),

  который удаляется.  Аргумент  спецификация  файла  -  адрес

  точечного  дескриптора   со   спецификацией   файла.   Если

  спецификация  содержит  символы  обобщения,  каждый   файл,

  который соответствует спецификации будет удален. Строка  не

  должна содержать более 255 символов.  Поддерживаются  любые

  классы строк.


       Спецификация файла по умолчанию

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Спецификация удаляемого файла, принятая по  умолчанию.

  Аргумент спецификация файла по умолчанию - адрес  точечного

  дескриптора.   Это   необязательный   аргумент,   если   он

  отсутствует, то по  умолчанию  принимается  пустая  строка.

  Поддерживается любой класс строк.

       Более полная информация о спецификации файла приводит-

  ся в документе [1].







                           - 128 -

                       00152-01 33 09-2


       Относительная спецификация файла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Относительная спецификация удаляемого файла  (файлов).

  Аргумент относительная спецификация файла - адрес точечного

  дескриптора   с    относительной    спецификацией    файла.

  Поддерживается   любой   класс   строк.    Этот    аргумент

  необязательный,  если  он  отсутствует,  то  по   умолчанию

  принимается пустая строка.

       Используется синтаксический контроль  входного  файла.

  Более полная информация об относительной спецификации файла

  и синтаксическом контроле входного файла приводится в доку-

  менте [1].

       Относительная   спецификация   файла   полезна,    при

  обработке списков спецификаций файла. Неопределенные  части

  спецификации файла берутся  от  последнего  обрабатываемого

  файла.


       Успешная процедура

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки

       Заданная  пользователем  успешная  процедура,  которую

  процедура LIB$DELETE_FILE вызывает после успешного удаления

  файла. Аргумент успешная  процедура  -  адрес  маски  входа



                           - 129 -

                       00152-01 33 09-2


  успешной процедуры.

       Успешная   процедура    может    использоваться    при

  регистрации файлов, которые удаляются.


       Процедура ошибки

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки

       Заданная  пользователем  процедура   ошибки,   которую

  процедура  LIB$DELETE_FILE  вызывает,  если  обнаруживается

  ошибка.

       Процедура   ошибки   возвращает    успешное/неуспешное

  значение, которое используется процедурой  LIB$DELETE_FILE,

  чтобы определить будут ли обрабатываться последующие файлы.


       Процедура подтверждения

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки

       Заданная   пользователем   процедура    подтверждения,

  которую процедура LIB$DELETE_FILE вызывает перед  удалением

  каждого файла. Аргумент  процедура  подтверждения  -  адрес

  маски  входа  данной  процедуры.   Величина,   возвращаемая

  процедурой  подтверждения,  определяет,   будет   или   нет

  удаляться  данный  файл.  Процедура   подтверждения   может

  использоваться при выборе спецификации файлов для удаления,




                           - 130 -

                       00152-01 33 09-2


  основываясь на таких критериях, как текущая дата, размер  и

  др.


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Заданный  пользователем  аргумент,  который  процедура

  LIB$DELETE_FILE    передает    успешной,    ошибочной     и

  подтверждающей  процедурам   при   каждом   вызове.   Любой

  механизм,  также  используемый   для   передачи   аргумента

  пользователя процедуре LIB$DELETE_FILE, использует передачу

  его  процедурам.  Этот  аргумент  необязательный.  Если  он

  отсутствует, то передается значение 0.


       Имя результата

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Строка, в которую процедура LIB$DELETE_FILE записывает

  результирующую спецификацию последнего обработанного файла.

  Аргумент имя результата -  адрес  точечного  дескриптора  с

  именем  результата.  Если  он  имеется,  то  аргумент   имя

  результата  использует  при  хранении  спецификации   файла

  передаваемого  заданной  пользователем  процедуре,   вместо

  определенного по умолчанию класса S, типа строки Т. Поэтому




                           - 131 -

                       00152-01 33 09-2


  данный аргумент определяется, когда  используется  заданная

  пользователем  процедура,  и  эта  процедура  требует   тип

  дескриптора иной, чем класс S, тип Т. Поддерживается  любой

  класс строк.


       Файл контекста

       Использование в МОС ВП: контекст

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Контекст для удаляемого  списка  спецификаций  файлов.

  Аргумент файл контекста - адрес длинного слова, содержащего

  значение контекста.

       Перед первой серией вызовов процедуры  LIB$DELETE_FILE

  необходимо инициализировать файл и внимательно изучить кон-

  текст с нуля.  Процедура  LIB$FILE_SCAN  использует  данный

  контекст, сохраняя файл контекста для  многократного  ввода

  файлов. Определить контекст можно только когда многократный

  ввод файлов рассматривается как команда DELETE  диалогового

  командного   языка.    Можно    переразместить    контекст,

  размещенный  процедурой  LIB$FILE_SCAN,  вызвав   процедуру

  LIB$FILE_SCAN_END после завершения всех  вызовов  процедуры

  LIB$DELETE_FILE.


       Описание.

       Раздел "описание" состоит из трех частей:

       1) формат вызова успешной процедуры;

       2) формат вызова ошибочной процедуры;




                           - 132 -

                       00152-01 33 09-2


       3) формат вызова подтверждающей процедуры.


       Формат вызова успешной процедуры


       Успешная  процедура  вызывается  только  тогда,  когда

  аргумент  успешная  процедура  задан  в  списке  аргументов

  процедуры LIB$DELETE_FILE.


       Формат:

       Успешная процедура  спецификация файла

                           [, аргумент пользователя]


       Аргументы:

       Спецификация файла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая спецификация удаляемого файла. Аргумент

  спецификация  файла  -  адрес  точечного   дескриптора   со

  спецификацией   файла.   Если   аргумент   имя   результата

  определен, то он используется при передаче строки  успешной

  процедуре.  Поэтому  передается  класс  S  строки  типа  Т.

  Поддерживается любой класс строк.


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение





                           - 133 -

                       00152-01 33 09-2


       Механизм: неопределенный

       Значение аргумента пользователя передается  процедурой

  LIB$DELETE_FILE   успешной   процедуре.   Каждый   механизм

  передачи,    который    использует    передачу    аргумента

  пользователя    процедуре    LIB$DELETE_FILE,    использует

  процедуру   LIB$DELETE_FILE    при    передаче    аргумента

  пользователя   успешной   процедуре.   Это   необязательный

  аргумент.


       Формат вызова ошибочной процедуры


       Ошибочная процедура вызывается только  в  том  случае,

  когда аргумент процедура ошибки задан в  списке  аргументов

  процедуры LIB$DELETE_FILE.


       Формат:

       процедура ошибки, спецификация файла, первоначальный

       условный код, вторичный условный код, ключ ошибки

       [, аргумент пользователя]


       Аргументы:

       Спецификация файла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая  спецификация  удаляемого  файла.  Если

  аргумент имя результата определен, то он  используется  при

  передаче  строки  успешной  процедуре.  Поэтому  передается




                           - 134 -

                       00152-01 33 09-2


  класс S, строки типа Т. Поддерживается любой класс строк.


       Первоначальный условный код

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Первоначальный   условный   код   FAB$L_STS,   который

  описывает  произошедшую  ошибку.  Аргумент   первоначальный

  условный код - адрес длинного слова без знака,  содержащего

  первоначальный условный код.


       Вторичный условный код

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством дескриптора

       Вторичный условный код (FAB$L_STV), который  описывает

  произошедшую ошибку.  Аргумент  вторичный  условный  код  -

  адрес  длинного  слова  без  знака,  содержащего  вторичный

  условный код.


       Ключ ошибки

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Целочисленный код, который указывает точку, в  которой

  обнаружена ошибка. Аргумент  ключ  ошибки  -  адрес  целого



                           - 135 -

                       00152-01 33 09-2


  длинного слова, содержащего код ключа ошибки.

       Возможные значения кодов ошибок следующие:

       0 - ошибка поиска спецификации файла;

       1 - ошибка удаления файла


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Значение,  передаваемое   процедуре   LIB$DELETE_FILE,

  которое  затем  передается  аргументу   процедура   ошибки,

  используя тот же механизм  передачи,  который  используется

  при   передаче   его   процедуре    LIB$DELETE_FILE.    Это

  необязательный аргумент.

       Если ошибочная процедура возвращает успешное состояние

  (бит  установлен  в  0),   то   процедура   LIB$DELETE_FILE

  продолжает обрабатывать файлы. Если возвращается  состояние

  сбоя (бит установлен в 1), то дальнейшая  обработка  файлов

  немедленно  прекращается,   и   процедура   LIB$DELETE_FILE

  возвращается в состояние ошибки.

       Ошибочная  процедура   не   вызывается   для   ошибок,

  связанных с копированием строки.


       Формат вызова процедуры подтверждения


       Процедура  подтверждения  вызывается  только   в   том

  случае, когда аргумент  процедура  подтверждения  указан  в

  списке аргументов процедуры LIB$DELETE_FILE.



                           - 136 -

                       00152-01 33 09-2


       Формат:

       процедура подтверждения  спецификация файла, блок 1,

                                аргумент пользователя.


       Спецификация файла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая спецификация удаляемого файла. Аргумент

  спецификация  файла  -  адрес  точечного   дескриптора   со

  спецификацией   файла.   Если   аргумент   имя   результата

  определен, то он используется при передаче строки процедуре

  подтверждения. Поэтому передается класс S, строки  типа  Т.

  Поддерживается любой класс строк.


       Блок 1

       Использование в МОС ВП: блок доступа к файлу

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Блок доступа  к  файлу,  описывающий  удаляемый  файл.

  Программа может выполнить команду $OPEN блок доступа к фай-

  лу  для  получения  доступа  к   атрибутам   файла,   чтобы

  определить будет ли файл удален,  но  должна  закрыть  файл

  командой   $CLOSE   перед    возвращением    в    процедуру

  LIB$DELETE_FILE.






                           - 137 -

                       00152-01 33 09-2


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Значение аргумента пользователя передается  процедурой

  LIB$DELETE_FILE процедуре подтверждения, используя такой же

  механизм  передачи,  что  и  при  ее   передаче   процедуре

  LIB$DELETE_FILE. Это необязательный аргумент.

       Если  процедура  подтверждения   возвращает   успешное

  состояние (бит установлен в 0), файл  удаляется,  если  бит

  установлен в 1, то файл не удаляется.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно выполнена;

  LIB$_ERRROUCAL

       - успешно,   но   вызывается   ошибочная    процедура.

         Встретилась ошибка файла, однако ошибочная процедура

         вызвала обработчик условия;

  LIB$INVFILSPE

       - неверная спецификация файла. Аргументы  спецификация

         файла или спецификация файла  по  умолчанию  длиннее

         255 символов;

  LIB$_INVSTRDES

       - неверный дескриптор строки;

  LIB$_WRONUMARG

       - неверное количество аргументов. Неверное  количество



                           - 138 -

                       00152-01 33 09-2


         аргументов передано процедуре LIB$DELETE_FILE.

       Любые  возвращаемые   значения   состояния   процедуры

  LIB$SCOPY_XXX,  за  исключением  тех  значений   состояния,

  которые обозначают ошибки усечения.

       Любые возвращаемые значения состояния системы управле-

  ния данными СУД-32. Если не  определен  аргумент  процедура

  ошибки, то это наиболее серьезная ошибка системы управления

  данными СУД-32, встретившаяся во время удаления файлов.


       Пример.

          РROGRAM DELETE_EXAMPLE(INPUT, OUTPUT);

  (+)

  ( Об'явить процедуру LIB$DELETE_FILE внешней функцией

  ( в данном примере не используется аргумент пользователя.

  (-)

  FUNCTION LIB$DELETE_FILE(

          FILESPEC: VARYING [A] OF CHAR;

          DEFAULT_FILESPEC: VARYING [B] OF CHAR;

          REL_FILESPEC : VARYING [D] OF CHAR;

          %IMMED [UNBOUND] PROCEDURE SUCCESS_ROUTINE

              (FILESPEC : VARYING [A] OF CHAR) := %IMMED 0;

          %IMMED [UNBOUND] FUNCTION ERROR_ROUTINE

              (FILESPEC : VARYING [A] OF CHAR; RMS_STS,

               RMS_STV : INTEGER)

              : BOOLEAN :=%IMMED 0;

          %IMMED [UNBOUND] FUNCTION CONFIRM_ROUTINE

              (FILESPEC : VARYING [A] OF CHAR)

               : BOOLEN := %IMMED 0;



                           - 139 -

                       00152-01 33 09-2


          VAR USER_ARG : [UNSAFE] INTEGER := %IMMED 0;

          VAR RESULT_NAME : VARYING [C] OF CHAR : %IMMED 0;

      ) : INTEGER; EXTERN;

  (+)

  ( Об'явить процедуру, которая выводит на экран имена

  ( удаляемых файлов.

  (-

  PROCEDURE LOG_ROUTINE(FILESPEC - VARYING [A] OF CHAR);

          BEGIN

            WRITELN('FILE ', FILESPEC, ' успешное удаление');

          END;

  (+)

  ( Об'явить процедуру, которая уведомляет пользователя

  ( о произошедшей ошибке.

  (-)

  FUNCTION ERR_ROUTINE(FILESPEC: VARYING [A] OF CHAR;

          RMS_STS,RMS_STV: INTEGER): BOOLEAN;

          BEGIN

          WRITELN('DELETE OF ', FILESPEC, ' FAILED ',

                   HEX(RMS_STS));

          ERR_ROUTINE := TRUE;

          END;

  (+)

  ( Об'явить процедуру, которая проверяет, удален ли файл.

  ( Если имя файла содержит строку "XYZ", то он будет удален.

  (-

  FUNCTION CONFIRM_ROUTINE( FILESPEC: VARYING [A] OF CHAR):




                           - 140 -

                       00152-01 33 09-2


  BOOLEAN;

          BEGIN

              IF INDEX(FILESPEC, 'XYZ') <> 0

              THEN

                  CONFIRM_ROUTINE := TRUE

              ELSE

                  CONFIRM_ROUTINE := FALSE;

          END;

  (+)

  ( Начало основной программы.

  (-

  VAR

          FILE_TO_DELETE, RESULTANT_NAME : VARYING [255]

          OF CHAR;

          RET_STATUS : INTEGER;

  BEGIN

          WRITE ('удалить файлы: ');

          READLN(FILES_TO_DELETE);

          RET_STATUS := LIB$DELETE_FILE(

              FILES_TO_DELETE, '*;', '', LOG_ROUTINE,

              ERR_ROUTINE, CONFIRM_ROUTINE,,RESULTANT_NAME);

          IF NOT ODD(RET_STATUS)

          THEN

              WRITELN('файл удален. Ошибки ',

                       HEX(RET_STATUS));

          END.

       Данная программа  на  языке  программирования  ПАСКАЛЬ




                           - 141 -

                       00152-01 33 09-2


  демонстрирует удаление файловых спецификаций.  Она  удаляет

  файлы, которые содержат строку 'XYZ' в спецификации  файла.

  Имена удаленных файлов выводятся на экран.



       1.27. LIB$DELETE_LOGICAL      -      удаление

             логического имени


       Процедура    LIB$DELETE_LOGICAL     требует,     чтобы

  интерпретатор командного  языка  CLI  вызываемого  процесса

  удалил  логическое  имя  процесса,  работающего  в   режиме

  супервизора. Процедура LIB$DELETE_LOGICAL выполняет  ту  же

  функцию,  что  и  команда  диалогового   командного   языка

  DEASSIGN.


       Формат:

       LIB$DELETE_LOGICAL логическое имя

                          [, таблица]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Логическое имя

       Использование в МОС ВП: логическое имя

       Тип: символьная строка

       Доступ: только чтение




                           - 142 -

                       00152-01 33 09-2


       Механизм: посредством значения

       Логическое имя, которое должно быть удалено.  Аргумент

  логическое имя  -  адрес  точечного  дескриптора  строки  с

  логическим именем. Максимальная длина логического имени 255

  символов.


       Таблица

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя таблицы,  из  которой  удаляется  логическое  имя.

  Аргумент таблица - адрес точечного дескриптора, со  строкой

  с именем таблицы.  Это  необязательный  аргумент.  Если  он

  отсутствует, используется таблица LNM$PROCESS.


       Описание.

       Процедура    LIB$DELETE_LOGICAL     требует,     чтобы

  интерпретатор командного  языка  CLI  вызываемого  процесса

  удалил  логическое  имя  процесса,  работающего  в   режиме

  супервизора. Если необязательный аргумент  таблица  опреде-

  лен, то логическое имя удаляется из таблицы LNM$PROCESS.

       В отличие от программ системного обслуживания  $DELLOC

  и $DELLNM, процедура LIB$DELETE_LOGICAL не  требует,  чтобы

  вызывающая программа выполнялась в режиме  супервизора  при

  удалении логического имени режима супервизора.

       Процедура LIB$DELETE_LOGICAL используется с диалоговым

  командным языком DCL  и  интерпретатором  командного  языка




                           - 143 -

                       00152-01 33 09-2


  (MCR).

       Если    образ    выполняется    непосредственно    как

  подпроцессор или как отсоединенный процесс, то в этом  слу-

  чае отсутствует CLI и выдается состояние ошибки LIB$_NOCLI.

       Более полная информация о команде DEASSIGN диалогового

  командного языка находится в документе [2].


       Возвращаемые значения состояния:

  SS$_ACCVIO

       - нарушение  доступа.  Логическое   имя   не   удалось

         прочитать;

  SS$_IVLOGNAM

       - неверное логическое имя.  Логическое  имя  содержало

         запрещенные символы или более 255 символов;

  SS$_IVLOGTAB

       - неверное логическое имя таблицы;

  SS$_NOLOGNAM

       - логическое имя отсутствует. Логическое имя  не  было

         определено, как логическое имя процесса, работающего

         в режиме супервизора;

  SS$_NOPRIV

       - нет привилегий для выполнения операции;

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INVSTRDES

       - неверный  дескриптор  строки.  Дескриптор   содержит

         неверное значение в поле DSC$B_CLASS;





                           - 144 -

                       00152-01 33 09-2


  LIB$_NOCLI

       - отсутствует  интерпретатор  командного  языка   CLI.

         Вызываемый   процесс   не    имеет    интерпретатора

         командного языка для выполнения этой функции. Выпол-

         нение образа, как  подпроцесса  или  как  отдельного

         процесса не имеет интерпретатора командного языка;

  LIB$UNECLIERR

       - неожиданная ошибка интерпретатора  командного  языка

         (CLI).   Интерпретатор   командного   языка    выдал

         состояние ошибки,  которое  не  было  опознано.  Эта

         ошибка   может   быть   связана   с   использованием

         нестандартного интерпретатора командного языка.



       1.28. LIB$DELETE_SYMBOL  -  удаление  символа

             интерпретатора командного языка CLI


       Процедура     LIB$DELETE_SYMBOL     требует,     чтобы

  интерпретатор командного  языка  CLI  вызываемого  процесса

  удалил существующий файл интерпретатора командного языка.


       Формат:

       LIB$DELETE_SYMBOL  символ [, указатель таблицы]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения





                           - 145 -

                       00152-01 33 09-2


       Аргументы:

       Символ

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Символ,  который   должен   быть   удален   процедурой

  LIB$DELETE_SYMBOL. Аргумент символ - адрес точечного  деск-

  риптора  с   символьной   строкой.   Перед   использованием

  символьное имя преобразуется в символы верхнего регистра, а

  конечные пробелы удаляются.

       Аргумент  символ  должен  начинаться  с  буквы,  знака

  денежной  единицы  ($),  или   знака   подчеркивания   (_).

  Максимальная длина аргумента символ - 255 символов.


       Указатель таблицы

       Использование в МОС ВП: длинное слово со знаком

       Тип: длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Указатель таблицы, которая содержит удаляемый  символ.

  Аргумент указатель таблицы - адрес целого  длинного  слова,

  которое является указателем таблицы.

       Если  данный  аргумент  отсутствует,  то  используется

  таблица локальных символов.  Возможные  значения  аргумента

  указатель таблицы приведены в табл. 12.







                           - 146 -

                       00152-01 33 09-2


                                                   Таблица 12

  -----------------------------------------------------------

     Символьное имя   ! Значение !   Используемая таблица

  -----------------------------------------------------------

  LIB$K_CLI_LOCAL_SYM !    1     ! Таблица локальных символов

  LIB$K_CLI_GLOBAL_SYM!    2     ! Таблица глобальных симво-

                      !          ! лов


       Описание.

       Процедура    LIB$DELETE_SYMBOL    предназначена    для

  использования с DCL CLI. Если  процедура  LIB$DELETE_SYMBOL

  используется с интерпретатором командного языка  MCR,  или,

  если образ выполняется непосредственно как подпроцесс,  или

  как отсоединенный  процесс,  то  в  этих  случаях  выдается

  ошибка состояния LIB$NOCLI.

       Символы  LIB$K_CLI_LOCAL_SYM  и   LIB$K_CLI_GLOBAL_SYM

  определены в символьных библиотеках (макро или  имя  модуля

  $LIBCLIDEF) и как глобальные символы.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_FATERRLIB

       - неисправимая    внутренняя    ошибка.     Внутренняя

         последовательность не может быть проверена;

  LIB$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         LIB$GET_VM не может быть вызвана, так как  программа




                           - 147 -

                       00152-01 33 09-2


         превысила допустимую квоту  образа  для  виртуальной

         памяти;

  LIB$_IVARG

       - неверный аргумент. Неверно задан аргумент таблица;

  LIB$_INVSTRDES

       - неверный дескриптор строки. Неверное  значение  поля

         DSC$B_CLASS дескриптора строки;

  LIB$_INVSYMNAM

       - неверное символьное  имя.  Символьное  имя  содержит

         более 255 символов или начинается не с буквы,  знака

         денежной единицы или знака подчеркивания;

  LIB$_NOCLI

       - отсутствует  интерпретатор  командного  языка   CLI.

         Вызывающий   процесс   не    имеет    интерпретатора

         командного языка для выполнения  этой  функции,  или

         интерпретатор  командного  языка   не   работает   с

         требуемым типом. Выполнение  образа  непосредственно

         как подпроцесса или отсоединенного процесса не имеет

         интерпретатора командного языка;

  LIB$_UNECLIERR

       - неожиданная ошибка. Интерпретатор  командного  языка

         выдал   состояние   возврата,   которое   не    было

         распознано.  Эта  ошибка  может   быть   связана   с

         использованием     нестандартного     интерпретатора

         командного языка;

  LIB$NOSUCHSYM

       - неверный символ. Символ не был определен.




                           - 148 -

                       00152-01 33 09-2


       1.29. LIB$DELETE_VM_ZONE  -   удаление   зоны

             виртуальной памяти


       Процедура LIB$DELETE_VM_ZONE удаляет зону и возвращает

  все страницы зоны в пул обработанных страниц.


       Формат:

       LIB$DELETE_VM_ZONE идентификатор зоны


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Идентификатор зоны

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Аргумент идентификатор зоны -  адрес  длинного  слова,

  содержащего  идентификатор   зоны,   созданной   предыдущим

  вызовом   процедуры   LIB$CREATE_VM_ZONE   или    процедуры

  LIB$CREATE_USER_VM_ZONE.


       Описание.

       Процедура LIB$DELETE_VM_ZONE удаляет зону и возвращает

  все страницы  в  пул  обрабатываемых  страниц,  управляемый

  процедурой LIB$GET_VM_PAGE. После этого  страницы  доступны



                           - 149 -

                       00152-01 33 09-2


  для  перераспределения  последующими   вызовами   процедуры

  LIB$GET_VM или LIB$GET_VM_PAGE.

       Вызов  процедуры  LIB$DELETE_VM_ZONE  занимает  меньше

  времени для  освобождения  памяти,  чем  при  размещении  и

  освобождении каждого блока памяти процедурой LIB$GET_VM.

       Перед вызовом процедуры LIB$DELETE_VM_ZONE, необходимо

  убедиться, что программа не использует память в зоне. После

  вызова процедуры  LIB$DELETE_VM_ZONE  программа  не  должна

  выполнять никаких операций над зоной.

       Если при создании зоны задано заполнение освобожденной

  зоны,  процедура  LIB$DELETE_VM_ZONE  пометит  все   блоки,

  которые освобождены.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - успешное завершение процедуры;

  LIB$_BADBLOADR

       - неверный аргумент идентификатор зоны.



       1.30. LIB$DIGIT_SEP   -   получение   символа

             отделения цифр


       Процедура  LIB$DIGIT_SEP   выдает   системный   символ

  отделения цифр.


       Формат:

       LIB$DIGIT_SEP  символ отделения цифр

                      [, длина символа отделения]





                           - 150 -

                       00152-01 33 09-2


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Символ отделения цифр

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Символ   отделения   цифр,    выдаваемый    процедурой

  LIB$DIGIT_SEP.  Аргумент  символ  отделения  цифр  -  адрес

  точечного дескриптора с символом отделения цифр.


       Длина символа отделения

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Число  символов,   записанных   в   аргументе   символ

  отделения  цифр,  не  считая  пробелов,  в  случае   строки

  фиксированной длины. Аргумент  длина  символа  отделения  -

  адрес  слова  (без  знака),   содержащего   длину   символа

  отделения цифр. Если вводимая строка  усечена  до  размера,

  определенного в дескрипторе строки символ  отделения  цифр,

  то аргумент длина символа отделения устанавливается  равным




                           - 151 -

                       00152-01 33 09-2


  этому размеру. Поэтому  аргумент  длина  символа  отделения

  всегда может быть  использован  вызывающей  программой  для

  доступа к действительной подстроке строки символ  отделения

  цифр.


       Описание.

       Процедура  LIB$DIGIT_SEP   выдает   системный   символ

  отделения цифр, который используется для  отделения  группы

  из трех цифр в целой части числа для облегчения восприятия.

       Процедура LIB$DIGIT_SEP пытается перевести  логическое

  имя SYS$DIGIT_SEP, как логическое имя процесса, группы  или

  системы. Если перевод не удается  выполнить,  то  процедура

  LIB$DIGIT_SEP  устанавливает  знак  ","   (запятую).   Если

  перевод удается выполнить, то  выдается  полученный  текст.

  Таким  образом,  администратор  системы  может  задать  имя

  SYS$DIGIT_SEP, как логическое имя, действующее  в  пределах

  системы, чтобы обеспечить значение по  умолчанию  для  всех

  пользователей, а пользователь с  конкретными  потребностями

  может задать это имя, как логическое  имя  процесса,  чтобы

  обойти значение по умолчанию.

       Например, можно использовать разделителем точку (.).

       Язык   программирования    БЕЙСИК    использует    имя

  LIB$DIGIT_SEP в неявном виде.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;






                           - 152 -

                       00152-01 33 09-2


  LIB$_STRTRU

       - успешно завершена, но символ отделения цифр усечен;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка;

  LIB$_INSVIRMEM

       - недостаточно    виртуальной    памяти.     Процедура

         LIB$GET_VM не может быть вызвана, так как  программа

         превысила допустимую квоту для виртуальной памяти;

  LIB$_INVSTRDES

       - неверный   строчный   дескриптор.   Значение    поля

         DSC$B_CLASS ошибочно.


       Пример.

  РROGRAM DIGIT_SEP (INPUT, OUTPUT)

  (+)

  ( Данная программа использует процедуру LIB$DIGIT_SEP

  ( для получения текущего значения SYS$DIGIT_SEP.

  (+)

  PROCEDURE LIB$DIGIT_SEP (%DESCR DIGIT_SEPSTR : VARYING [а]

      OF CHAR;  % REF OUT_LEN : INTEGER ; EXTERN;

  VAR

      SEPARATOR : VARYING [256] OF CHAR;

      LENGTH : INTEGER;

  BEGIN

      LIB$DIGIT_SEP (SEPARATOR, LENGTH):

      WRITELN('104',SEPARATOR,'567',SEPARATOR,934'):

  END





                           - 153 -

                       00152-01 33 09-2


       Результат работы программы:

       104, 567, 934



       1.31. LIB$DISABLE_CTRL - запрещение перехвата

             управляющих  символов   интерпретатором

             командного языка CLI


       Процедура     LIB$DISABLE_CTRL     требует,      чтобы

  интерпретатор командного языка CLI вызывающего процесса  не

  перехватывал выбранные управляющие  символы  при  печати  в

  процессе  интерактивного  терминального  сеанса.  Процедура

  LIB$DISABLE_CTRL выполняет ту же функцию, что и команда SET

  NOCONTROL диалогового командного языка.


       Формат:

       LIB$DISABLE_CTRL  маска [, старая маска]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Маска

       Использование в МОС ВП: маска длинное слово

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки




                           - 154 -

                       00152-01 33 09-2


       Битовая маска,  которая  указывает  какой  контрольный

  символ не должен быть перехвачен. Аргумент  маска  -  адрес

  длинного слова без знака, содержащего битовую маску.

       Каждый  из  32  битов   соответствует   32   возможным

  управляющим   символам.    Если    бит    установлен,    то

  соответствующий управляющий  символ  не  перехватывается  в

  дальнейшем  интерпретатором   командного   языка   CLI.   В

  настоящее  время  распознаются  только   биты   20   и   25

  соответствующие УС/Т и УC/Y.

       Маски, приведенные в табл. 13, могут быть использованы

  для задания значения аргумента маска.

                                                   Таблица 13

  -----------------------------------------------------------

       Символ     ! Шестнадцатиричное !     Функция

                  !     значение      !

  -----------------------------------------------------------

  LIB$M_CLI_CTRLT ! %х'00100000'      ! Запрещен УС/Т

  LIB$M_CLI_CTRLY ! %х'02000000'      ! Запрещен УC/Y


       Старая маска

       Использование в МОС ВП: маска длинное слово

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Предыдущая битовая  маска.  Аргумент  старая  маска  -

  адрес  длинного  слова  без  знака,  в  которое   процедура

  LIB$DISABLE_CTRL записывает старую  битовую  маску.  Старая

  битовая маска имеет ту же форму, что и аргумент маска.



                           - 155 -

                       00152-01 33 09-2


       Описание.

       Интерпретаторы  командного  языка  DCL  и  MCR   могут

  перехватывать  управляющий   символ   УC/Y.   Интерпретатор

  командного языка DCL может перехватывать управляющий символ

  УС/Т. Более  полная  информация  об  обработке  контрольных

  символов для  диалогового  командного  языка  содержится  в

  документе [2].

       Процедура     LIB$DISABLE_CTRL     используется      с

  интерпретаторами командного языка DCL  и  MCR.  Если  образ

  выполняется  непосредственно   как   подпроцесс   или   как

  отсоединенный процесс, то для выполнения  этих  функций  не

  существует интерпретатора командного языка. В этих  случаях

  процедура   LIB$DISABLE_CTRL   выдает   состояние    ошибки

  LIB$_NOCLI.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INVARG

       - неверный аргумент. В аргументе маска был  установлен

         бит, который не соответствует управляющему  символу,

         обрабатываемому CLI;

  LIB$_NOCLI

       - отсутствует  CLI.  Вызывающий   процесс   не   имеет

         интерпретатора командного языка для выполнения  этой

         функции,  или  интерпретатор  командного  языка   не

         работает с требуемым типом. Если  образ  выполняется

         непосредственно  как  подпроцесс  или  отсоединенный



                           - 156 -

                       00152-01 33 09-2


         процесс, то он не  имеет  интерпретатора  командного

         языка CLI;

  LIB$_UNECLIERR

       - непредвиденная ошибка CLI. Интерпретатор  командного

         языка  выдал  состояние  ошибки,  которое  не   было

         распознано.  Эта  ошибка  может   быть   связана   с

         использованием     нестандартного     интерпретатора

         командного языка.



       1.32. LIB$DO_COMMAND - выполнение команды


       Процедура  LIB$DO_COMMAND   останавливает   выполнение

  текущей программы  и  направляет  интерпретатор  командного

  языка на выполнение команды, которая задана  как  аргумент.

  При  успешном  выполнении   процедура   LIB$DO_COMMAND   не

  возвращает управление вызывающей программе.  Вместо  этого,

  процедура LIB$DO_COMMAND  начинает  выполнение  специальной

  команды.

       Если  требуется   возвратить   управление   вызывающей

  программе лучше использовать процедуру LIB$SPAWN.


       Формат:

       LIB$DO_COMMAND    команда


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись





                           - 157 -

                       00152-01 33 09-2


       Механизм: посредством значения


       Аргументы:

       Команда

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Текст    команды,    которую    выполняет    процедура

  LIB$DO_COMMAND.  Аргумент   команда   -   адрес   точечного

  дескриптора  с  текстом  команды.  Если  аргумент   команда

  содержит в себе пробелы, то они  должны  быть  заключены  в

  скобки. Максимальная длина команды 255 символов.


       Описание.

       Процедура LIB$DO_COMMAND завершает выполнение текущего

  образа и  затем  выполняет  команду,  указанную  аргументом

  команда. Грамматический  разбор  команды  осуществляется  с

  использованием обычных правил диалогового командного языка.

       Процедура  LIB$DO_COMMAND  особенно   полезна,   когда

  требуется выполнить CLI команду после окончания  выполнения

  программы.  Например,  можно  использовать  процедуру   для

  выполнения команды SUBMIT или PRINT для управления  файлом,

  который создала программа.

       Если процедура LIB$DO_COMMAND  включена  в  программу,

  необходимо   учитывать   следующие   ограничения   при   ее

  использовании:

       1) во время вызова  процедуры  LIB$DO_COMMAND  текущий




                           - 158 -

                       00152-01 33 09-2


  образ  завершает   выполнение   и   управление   не   может

  возвратиться к нему;

       2) текст команды  передается  текущему  интерпретатору

  командного языка. Можно определить интерпретатор командного

  языка,  отличный  от  DCL  и  MCR,  но  прежде   необходимо

  убедиться,  что  команда   будет   управляема   назначенным

  интерпретатором командного языка;

       3) если процедура  LIB$DO_COMMAND  вызвана  из  образа

  выполняемого  непосредственно  как   подпроцесс   или   как

  отсоединенный процесс, она будет выполнена неверно, так как

  ни  один  интерпретатор  командного  языка  не   связан   с

  подпроцессом.


       Возвращаемые значения состояния:

  LIB$_INVARG

       - неверный аргумент. Аргумент команда  содержит  более

         255 символов;

  LIB$_NOCLI

       - отсутствует  CLI.  Вызывающий   процесс   не   имеет

         интерпретатора командного языка для выполнения  этой

         функции,  или  интерпретатор  командного  языка   не

         работает с требуемым типом. Если  образ  выполняется

         непосредственно как подпроцесс или как отсоединенный

         процесс, то он не имеет CLI;

  LIB$_UNECLIERR

       - непредвиденная  ошибка   интерпретатора   командного

         языка.   Интерпретатор   командного   языка    выдал

         состояние ошибки, которое не было распознано.



                           - 159 -

                       00152-01 33 09-2


       Пример.

  РROGRAM DO_COMMAND (INPUT, OUTPUT)

  (+)

  ( В данном примере процедура LIB$DO_COMMAND используется

  ( для выполнения нескольких команд DCL, которые

  ( вводятся пользователем в ответ на подсказку.

  (-)

  PROCEDURE LIB$DO_COMMAND(CMDTXT : VARYING [а] OF CHAR):

      EXTERN;

  VAR

      COMMAND : VARYING [256] OF CHAR;

  BEGIN

      WRITELN ('введите команду, которую нужно выполнить: ');

      READLN (COMMAND);

      LIB$DO_COMMAND(COMMAND);

  END

       Данная программа  на  языке  программирования  ПАСКАЛЬ

  демонстрирует использование процедуры LIB$DO_COMMAND.


       Результат работы программы:

       30-MAY-1985 14:07:28



       1.33. LIB$EDIV   -   деление   с   повышенной

             точностью


       Процедура LIB$EDIV выполняет деление с повышенной точ-

  ностью. Процедура LIB$EDIV аналогична инструкции EDIV  сис-

  темы МОС ВП.




                           - 160 -

                       00152-01 33 09-2


       Формат:

       LIB$EDIV  делитель, делимое, частное, остаток


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Делитель

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Делитель. Аргумент делитель -  адрес  целого  длинного

  слова со знаком, содержащего делитель.


       Делимое

       Использование в МОС ВП: квадрослово со знаком

       Тип: целое квадрослово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Делимое. Аргумент делимое - адрес  целого  квадрослова

  со знаком, содержащего делимое.











                           - 161 -

                       00152-01 33 09-2


       Частное

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Частное. Аргумент  частное  -  адрес  целого  длинного

  слова со знаком содержащего частное.


       Остаток

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Остаток. Аргумент  остаток  -  адрес  целого  длинного

  слова со знаком, содержащего остаток.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_INTOVF

       - целочисленное   переполнение.   Частное   заменяется

         битами 31:0 делимого, остаток заменяется нулем;

  SS$_INTDIV

       - целочисленное делимое равно  0.  Частное  заменяется

         битами 31:0 делимого, а остаток замещается нулем.










                           - 162 -

                       00152-01 33 09-2


       Пример.

  С+

  С В данном примере используется  процедура  LIB$EDIV.

  С-

        INTEGER DIVISOR,DIVIDEND(2), QUOTIENT, REMAINDER

  С+

  С Найти частное и остаток деления 4600387192  на 4096.

  С Так как число 4600387192 слишком большое для хранения

  С его в виде длинного слова, используется процедура

  С LIB$EDIV.

  С-

        DIVISOR = 4096

  С+

  С Делимое должно быть представлено как квадрослово.

  С Чтобы выполнить это необходимо использовать

  С вектор длины 2.

  С Первый элемент будет в младшем разряде длинного слова,

  С а второй элемент в старшем разряде длинного слова.

  С 4600387192 = '00000000112345678'Х. Где,

  С-

        Делимое (1) ='12345678'Х

        Делимое (2) = '00000001'Х

  С+

  С Вычисляем частное и остаток от деления  4600387192

  С на 4096.

  С-

        RETURN = LIB$EDIV(DIVISOR,DIVIDEND, QUOTIENT,




                           - 163 -

                       00152-01 33 09-2


               REMAINDER)

        TYPE *,'целое длинное слово остатка от деления

        46000387192/4096 будет :'

        TYPE *,'        ',частное

        TYPE *,'целое длинное слово остатка от деления

        46000387192/4096 будет :'

        TYPE * ,'         ',остаток

        END

       Данная программа  на  языке  программирования  ФОРТРАН

  демонстрирует использование процедуры LIB$EDIV.


       Результат работы программы:

       целое    длинное    слово    частного    от    деления

  4600387192/4096 = 1123141;

       целое длинное слово остатка от деления 4600387192/4096

  = 1656.



       1.34. LIB$EMODX  -  расширенное  умножение  с

             выделением целой части


       Процедура    LIB$EMODX    позволяет     пользователям,

  программирующим на языках программирования высокого уровня,

  использовать инструкции EMODF, EMODD, EMODG, EMODH  системы

  МОС ВП.


       Формат:

       LIB$EMODF  множитель, порядок, множимое,

                  целая часть, дробная часть

       LIB$EMODD  множитель, порядок, множимое,



                           - 164 -

                       00152-01 33 09-2


                  целая часть, дробная часть

       LIB$EMODG  множитель, порядок, множимое,

                  целая часть, дробная часть

       LIB$EMODM  множитель, порядок, множимое,

                  целая часть, дробная часть


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Множитель

       Использование МОС ВП: число с плавающей запятой

       Тип: число с плавающей запятой формата F

            число с плавающей запятой формата D

            число с плавающей запятой формата G

            число с плавающей запятой формата н

       Доступ: только чтение

       Механизм: посредством ссылки

       Множитель. Для процедуры LIB$EMODF аргумент  множитель

  - число  с  плавающей  запятой  формата  F.  Для  процедуры

  LIB$EMODD аргумент множитель - число  с  плавающей  запятой

  формата D. Для процедуры  LIB$EMODG  аргумент  множитель  -

  число  с  плавающей  запятой  формата  G.   Для   процедуры

  LIB$EMODH аргумент множитель - число  с  плавающей  запятой

  формата H.




                           - 165 -

                       00152-01 33 09-2


       Порядок

       Использование  в МОС ВП: байт со знаком, слово без

                                знака

       Тип: целый байт (со знаком), целое слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Показатель степени множителя. Для процедуры  LIB$EMODF

  и LIB$EMODD аргумент порядок - байт со знаком, для процедур

  LIB$EMODG и LIB$EMODH аргумент порядок - слово без знака.


       Множимое

       Использование в МОС ВП: число с плавающей запятой

       Тип: число с плавающей запятой формата F

            число с плавающей запятой формата D

            число с плавающей запятой формата G

            число с плавающей запятой формата н

       Доступ: только чтение

       Механизм: посредством ссылки

       Множимое. Для процедуры LIB$EMODF аргумент множимое  -

  число  с  плавающей  запятой  формата  F.   Для   процедуры

  LIB$EMODD аргумент множимое -  число  с  плавающей  запятой

  формата D. Для  процедуры  LIB$EMODG  аргумент  множимое  -

  число  с  плавающей  запятой  формата  G.   Для   процедуры

  LIB$EMODH аргумент множимое -  число  с  плавающей  запятой

  формата H.









                           - 166 -

                       00152-01 33 09-2


       Целая часть

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Целая часть результата. Аргумент целая часть  является

  адресом целого длинного слова со знаком, содержащего  целую

  часть результата.


       Дробная часть

       Использование в МОС ВП: число с плавающей запятой

       Тип: число с плавающей запятой формата F

            число с плавающей запятой формата D

            число с плавающей запятой формата G

            число с плавающей запятой формата н

       Доступ: только запись

       Механизм: посредством ссылки

       Дробная  часть  результата.  Для  процедуры  LIB$EMODF

  аргумент дробная часть - число с плавающей запятой  формата

  F. Для процедуры LIB$EMODD аргумент дробная часть - число с

  плавающей  запятой  формата  D.  Для  процедуры   LIB$EMODG

  аргумент дробная часть - число с плавающей запятой  формата

  G. Для процедуры LIB$EMODH аргумент дробная часть - число с

  плавающей запятой формата H.











                           - 167 -

                       00152-01 33 09-2


       Описание.

       Второй   операнд   (показатель   степени    множителя)

  соединяется с первым операндом (множителем)  для  получения

  порядка дроби (биты X).

       Множимое умножается  на  множитель.  После  умножения,

  выделяется целая часть, а бит Y числа с  плавающей  запятой

  образуется  из  дробной  части  результата  путем  усечения

  лишних бит.

       Результат умножения эквивалентен точному произведению,

  с выделенной дробной частью.

       Если представить результат в виде  сложения  целого  и

  дроби с одним знаком, то целый операнд  запишется  в  целую

  часть результата, а дробный  операнд  запишется  в  дробную

  часть результата.

       Значение X и Y приведены в табл. 14.

                                                   Таблица 14

  -----------------------------------------------------------

  Процедура       !    X    !     Биты     !      Y

  -----------------------------------------------------------

  LIB$EMODF       !    8    !     7:0      !     32

  LIB$EMODD       !    8    !     7:0      !     64

  LIB$EMODG       !   11    !    15:5      !     64

  LIB$EMODH       !   15    !    15:1      !    128



       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;




                           - 168 -

                       00152-01 33 09-2


  SS$_INTOVF

       - целочисленное переполнение. SS$INTOVF указывает  так

         же на переполнение с плавающей запятой;

  SS$_ROPRAND

       - ошибка резервного операнда.



       1.35. LIB$EMUL  -  умножение   с   повышенной

             точностью


       Процедура LIB$EMUL выполняет  умножение  с  повышенной

  точностью. Процедура LIB$EMUL  аналогична  инструкции  EMUL

  системы МОС ВП.


       Формат:

       LIB$EMUL  множитель, множимое, второе слагаемое,

                 результат


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Множитель

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки




                           - 169 -

                       00152-01 33 09-2


       Множитель,  используемый   процедурой   LIB$EMUL   при

  умножении с  повышенной  точностью.  Аргумент  множитель  -

  адрес  целого  длинного  слова   со   знаком,   содержащего

  множитель.


       Множимое

       Использование в МОС ВП: длинное слово со знаком

       Тип: длинное целое слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Множимое,   используемое   процедурой   LIB$EMOD   при

  умножении с повышенной точностью. Аргумент множимое - адрес

  целого длинного слова со знаком, содержащего множимое.


       Второе слагаемое

       Использование МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Второе слагаемое, используемое процедурой LIB$EMUL при

  умножении с повышенной точностью. Аргумент второе слагаемое

  - адрес целого длинного слова со знаком, содержащего второе

  слагаемое.


       Результат

       Использование в МОС ВП: квадрослово со знаком

       Тип: целое квадрослово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки



                           - 170 -

                       00152-01 33 09-2


       Результат умножения с повышенной  точностью.  Аргумент

  результат - адрес целого квадрослова со знаком,  в  которое

  процедура LIB$EMUL записывает результат.


       Описание.

       Аргумент множимое умножается  на  аргумент  множитель.
        
  Результат умножения получится двойной длины.  К  результату

  добавляется аргумент второе слагаемое,  расширенный  знаком

  до  двойной  длины.  Затем  аргумент  результат  заменяется

  окончательным результатом.

       Более подробная информация содержится в документе [3].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена.



       1.36. LIB$ENABLE_CTRL - разрешение прерывания

             интерпретатора     командного     языка

             управляющими символами


       Процедура LIB$ENABLE_CTRL требует, чтобы интерпретатор

  командного  языка  CLI  вызывающего   процесса   возобновил

  прерывание заданными управляющими символами, введенными  во

  время  интерактивного   терминального   сеанса.   Процедура

  LIB$ENABLE_CTRL выполняет те же функции, что и команда диа-

  логового командного языка SET CONTROL.









                           - 171 -

                       00152-01 33 09-2


       Формат:

       LIB$ENABLE_CTRL  маска [, старая маска]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Маска разрешения

       Использование в МОС ВП: маска длинное слово

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством значения

       Битовая маска,  указывающая  для  какого  управляющего

  символа  процедура  LIB$ENABLE_CTRL  разрешила  прерывание.

  Аргумент  маска  -  адрес   длинного   слова   без   знака,

  содержащего  эту  битовую  маску.  Каждый   из   32   битов

  соответствует одному из 32 возможных управляющих  символов.

  Если бит установлен, то соотвествующий  управляющий  символ

  прерывает интепретатор командного языка. В настоящее  время

  распознаются только биты 20 и 25,  соответствующие  УС/Т  и

  УC/Y.

       Маски, задающие значение  аргумента,  опеределенные  в

  символьных библиотеках, приведены в табл. 15.








                           - 172 -

                       00152-01 33 09-2


                                                   Таблица 15

  -----------------------------------------------------------

   Значение        ! Шестнадцатиричное  !    Функция

                   !     значение       !

  -----------------------------------------------------------

  LIB$M_CLI_CTRLT  !  %х'00100000'      ! Разрешено УС/Т

  LIB$M_CLI_CTRLY  !  %х'02000000'      ! Разрешено УC/Y


       Если  установлен   бит   маски,   не   соответствующий

  элементу, описанному в табл. 15, выдается состояние ошибки.


       Старая маска

       Использование в МОС ВП: маска длинное слово

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Предыдущая битовая  маска.  Аргумент  старая  маска  -

  адрес длинного слова без знака, содержащего старую  битовую

  маску. Старая битовая маска имеет такую  же  форму,  что  и

  аргумент маска.


       Описание.

       Процедура LIB$ENABLE_CTRL выполняет те же функции, что

  и DCL команда SET CONTROL. Обычно  УC/Y  прерывает  текущую

  команду, командную процедуру или образ. При  каждом  вызове

  процедуры LIB$DISABLE_CTRL, УC/Y будет  обрабатываться  как

  УC/U,  за  которым  следует  возврат   каретки.   Процедура

  LIB$ENABLE_CTRL восстанавливает операции УC/Y или УС/Т.





                           - 173 -

                       00152-01 33 09-2


       Оба интерпретатора командного языка DCL  и  MCR  могут

  прерываться управляющими символами. Более полная информация

  об обработке контрольных символов MCR и  CLI  содержится  в

  документах [2] и [4].

       Процедура    LIB$ENABLE_CTRL     предназначена     для

  использования с DCL или  интерпретатором  командного  языка

  MCR.

       Если образ выполняется непосредственно как  подпроцесс

  или как  отсоединенный  процесс,  то  для  выполнения  этой

  функции не существует интерпретатора  командного  языка.  В

  таких случаях выдается состояние ошибки LIB$NOCLI.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INVARG

       - неверный аргумент. В первом аргументе был установлен

         бит, который не соответствует управляющему  символу,

         обрабатываемому  интерпретатором  командного   языка

         CLI;

  LIB$_NOCLI

       - отсутствует  CLI.  Вызывающий   процесс   не   имеет

         интерпретатора командного языка для выполнения  этой

         функции, или CLI не работает с требуемым типом. Если

         образ выполняется непосредственно как подпроцесс или

         как  отсоединенный   процесс,   то   он   не   имеет

         интерпретатора командного языка CLI;





                           - 174 -

                       00152-01 33 09-2


  LIB$_UNECLIERR

       - непредвиденная  ошибка  CLI.  СLI  выдал   состояние

         ошибки, которое не было распознано.



       1.37. LIB$ESTABLISH - определение обработчика

             условия


       Процедура LIB$ESTABLISH  переносит  адрес  стандартной

  программы,     обрабатывающей     состояние     (написанной

  пользователем  или  библиотечной  процедуры),   в   нулевое

  длинное слово кадра стека  программы,  вызвавшей  процедуру

  LIB$ESTABLISH.


       Формат:

       LIB$ESTABLISH   обработчик


       Код возврата:

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: только запись

       Механизм: посредством ссылки

       Предыдущее содержание  SF$A_HANDLER  (нулевое  длинное

  слово)  кадра  стека  вызывающей  программы;   нуль,   если

  обработчик отсутствует.













                           - 175 -

                       00152-01 33 09-2


       Аргументы:

       Обработчик

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: только чтение

       Механизм: посредством ссылки

       Процедура,    которая    определяется    в    качестве

  обработчика.  Аргумент  обработчик  -  адрес  маски   входа

  процедуры.


       Описание.

       Процедура LIB$ESTABLISH  переносит  адрес  стандартной

  программы     обрабатывающей     состояние      (написанной

  пользователем  или  библиотечной  процедуры),   в   нулевое

  длинное слово кадра стека  программы,  вызвавшей  процедуру

  LIB$ESTABLISH.    Процедура    LIB$ESTABLISH     возвращает

  предыдущее содержимое нулевого длинного  слова.  Оно  может

  быть  либо  адресом   предыдущего   обработчика   состояния

  вызывающей  программы,  либо  нулем,  если  обработчик   не

  существовал.

       Новый обработчик остается действительным для программы

  до тех пор, пока не будет вызвана процедура LIB$REVERT, или

  пока  управление   не   передастся   программе,   вызвавшей

  процедуру LIB$ESTABLISH. При этом необходимо снова  вызвать

  процедуру, если  тот  же  или  новый  обработчик  состояния

  должен  быть  связан  с  программой,  вызвавшей   процедуру

  LIB$ESTABLISH.





                           - 176 -

                       00152-01 33 09-2


       Процедура LIB$ESTABLISH изменяет кадр стека вызывающей

  программы.

       Процедура LIB$ESTABLISH предназначена  преимущественно

  для использования с языками программирования без встроенных

  средств  обработки  ошибки.  Процедура   LIB$ESTABLISH   не

  используется   с    языками    программирования,    которые

  предусматривают обработку ошибок, такими как БЕЙСИК, КОБОЛ,

  ПАСКАЛЬ и ПЛ/1.  Использование  процедуры  LIB$ESTABLISH  с

  данными   языками   программирования   может   отрицательно

  повлиять на работу программы. Ориентированная на конкретный

  язык программирования библиотека зависит от  предварительно

  заданных специализированных обработчиков. Кроме того, адрес

  обработчика используется для того, чтобы найти кадры  стека

  процедур, написанных на этих языках программирования.

       В   языке   макроассемблер,   вместо   вызова   данной

  процедуры, используется следующая инструкция:

       МOVAB HANDDLER, (FP): установить адрес  обработчика  в

  текущем кадре стека.


       Возвращаемые значения состояния:

       отсутствуют


       Пример.

  С+

  С Данный пример демонстрирует использование процедуры

  С LIB$ESTABLISH.

  С

  С Основная программа.




                           - 177 -

                       00152-01 33 09-2


  С-

        EXTERNAL LOG_HANDL

        CHARACTER TIMBUF

        OPEN (UNIT=99, FILE = 'ERRLOG', STATUS = 'NEW')

        CALL LIB$ESTABLISH (LOG_HANDL)

        CALL SYS$BINTIM (TIMBUF, TIMADR)

        END

        INTEGER *4 FUNCTION LOG_HANDL (SIGARGS, MECHARGS)

        INTEGER *4 SIGARGS (*), MECHARGS (5)

  С+

  С Обработчик журнала любых сообщений об ошибках.

  С-

        INCLUDE ' ($SSDEF)'

        EXTERNAL PUT_LINE

        LOG_HANDL = SS$_RESIGNAL

        CALL SYS$PUTMSG (SIGARGS, PUT_LINE,)

        RETURN

        END

  С+

  С Подпрограмма действия.

  С-

        LOGICAL*4 FUNCTION PUT_LINE (LINE)

        CHARACTER *(*)LINE

        PUT_LINE = .FALSE

        WRITE (99,200)LINE

  200   FORMAT (A)

        RETURN




                           - 178 -

                       00152-01 33 09-2


        END

       В данной программе на языке  программирования  ФОРТРАН

  функция  LOG_HANDL  является  обработчиком  состояния   для

  программы и ему передается  управление,  когда  встречается

  ошибка.



       1.38. LIB$EXTV - выделение  знакорасширенного

             поля


       Процедура LIB$EXTV выдает  поле,  знакорасширенное  до

  длинного слова, которое было  выделено  из  заданного  поля

  битовой   переменной.   Процедура    LIB$EXTV    аналогична

  инструкции EXTV системы МОС ВП.


       Формат:

       LIB$EXTV  позиция, размер, база


       Код возврата:

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством значения

       Поле, выделенное процедурой LIB$EXTV, знакорасширенное

  до длинного слова.













                           - 179 -

                       00152-01 33 09-2


       Аргументы:

       Позиция

       Использование в: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Позиция (относительно начального адреса) первого  бита

  в поле, которое выделяется  процедурой  LIB$EXTV.  Аргумент

  позиция  -  адрес  целого   длинного   слова   со   знаком,

  содержащего позицию.


       Размер

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Размер битового поля, выделяемого процедурой LIB$EXTV.

  Аргумент  размер  -  адрес  байта  без  знака,  содержащего

  размер. Максимальный размер 32 бита.


       База

       Использование МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством значения

       Начальный адрес битового поля, выделяемого  процедурой

  LIB$EXTV из заданного  поля  битовой  переменной.  Аргумент

  база  -  адрес  длинного  слова  без   знака,   содержащего




                           - 180 -

                       00152-01 33 09-2


  начальный адрес.


       Описание.

       Битовое поле переменной длины является  типом  данных,

  используемым для  хранения  малых  целых  структур  данных,

  упакованных вместе в большие. Они  часто  используются  для

  хранения битов знакового флага.

       Переменное  битовое  поле  определяют  три   скалярных

  отношения:

       1) начальный адрес - адрес  байта  в  памяти,  который

  обслуживается как ссылка, указывающая где размещено битовое

  поле;

       2)  положение  бита  -  длинное   слово   со   знаком,

  содержащее смещение  наименьшего  значащего  бита  в  поле,

  относительно нулевого бита начального адреса;

       3) размер - целый байт,  указывающий  размер  битового

  поля в битах (от 0 до 32), т.е. битовое поле может  быть  в

  длину более одного длинного слова.

       Битовое поле переменной длины имеет формат,  приведен-

  ный на рис. 1. Заштрихованная часть обозначает поле.


           Р+S-1              р                 0
  +--------+------------------+-----------------+
  !        !* * * * * * * * * !                 !:A LIB$EXTV
  +--------+------------------+-----------------+
                    V                 V
                    V                 V
  S = размер поля <<V                 V
      в битах                         V
  P = битовое смещение поля  <<<<<<<<<V
      от нулевого бита адреса A

                            Рис. 1





                           - 181 -

                       00152-01 33 09-2


       Битовое поле начинается  с  нуля,  это  означает,  что

  процедура  рассматривает  первый  бит  знакового  поля  как

  существующее нулевое положение.

       Процедуры исполнительной библиотеки для  осуществления

  операций с полями (битовыми)  переменной  длины  используют

  инструкции прямого доступа к битовым полям языков  высокого

  уровня.


       Возвращаемые значения состояния:

  SS$_ROPRAND

       - произошла ошибка зарезервированного  операнда,  если

         указанный размер более чем 32.


       Пример.

  SIGN_EXTEND: PROCEDURE OPTIONS (MAIN);

  DECLARE LIB$EXTV ENTRY

          FIXED BINARY (31),      /* Адрес длинного слова,

                                  /* содержащего первона-

                                  /* чальную позицию бита */

          FIXED BINARY (7),       /* Адрес бита, содержа-

                                  /* щего размер поля     */

          FIXED BINARY (31),      /* Адрес поля           */

          RETURNS (FIXED BINARY (31)); /* Возвращаемая

                                       /* величина        */

          DECLARE (VALUE, SMALL_INT) FIXED BINARY (31);

          ON ENDFILE (SYSIN) STOP;

          DO WHILE ('1',B);            /* Непрерывный цикл

                                          до конца поля */




                           - 182 -

                       00152-01 33 09-2


              PUT SKIP(2);

              GET LIST (VALUE) OPTIONS (PROMPT ('VALUE: '));

              SMALL_INT = LIB$EXTV

                          ( 0, 4, VALUE);

                                         /* Выделенные и

                                         /* знакорасширенные

                                         /* первые 4 бита */

              PUT SKIP LIST (VALUE, SMALL_INT);

              END;

  END SIGN_EXTEND;

       Данная  программа  на  языке   программирования   ПЛ/1

  выделяет поле и выдает его со  знакорасширением  в  длинном

  слове.



       1.39. LIB$EXTZV     -     выделение     поля,

             расширенного нулем


       Процедура выдает поле, расширенное нулем  до  длинного

  слова,  которое  выделяется  из  заданного   поля   битовой

  переменной длины. Процедура LIB$EXTZV аналогична инструкции

  EXTZV системы МОС ВП.


       Формат:

       LIB$EXTZV  позиция, размер, база


       Код возврата:

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись



                           - 183 -

                       00152-01 33 09-2


       Механизм: посредством значения

       Поле, выделенное процедурой  LIB$EXTZV  и  расширенное

  нулем до длинного слова.


       Аргументы:

       Позиция

       Использование в МОС ВП: длинное слово со знаком

       Тип: длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Позиция (относительно начального адреса) первого  бита

  в поле, которое выделяется процедурой  LIB$EXTZV.  Аргумент

  позиция  -  адрес  целого   длинного   слова   со   знаком,

  содержащего позицию.


       Размер

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Размер   битового   поля,    выделяемого    процедурой

  LIB$EXTZV.  Аргумент  размер  -  адрес  байта  без   знака,

  содержащего размер. Максимальный размер равен 32 битам.


       База

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством значения



                           - 184 -

                       00152-01 33 09-2
                      

       Начальный адрес битового поля, выделяемого  процедурой

  LIB$EXTZV из заданного поля  битовой  переменной.  Аргумент

  база - адрес длинного слова без знака, содержащего  началь-

  ный адрес.


       Описание.

       Битовое поле переменной длины является  типом  данных,

  используемым для  хранения  малых  целых  структур  данных,

  упакованных в большие. Они часто используются для  хранения

  битов знакового флага.

       Битовое поле определяют три скалярных отношения:

       1) начальный адрес - адрес  байта  в  памяти,  который

  обслуживается как ссылка, указывающая где размещено битовое

  поле;

       2)  положение  бита  -  длинное   слово   со   знаком,

  содержащее смещение  наименьшего  значащего  бита  в  поле,

  относительно нулевого бита начального адреса;

       3) размер - целый байт,  указывающий  размер  битового

  поля в битах (от 0 до 32), т.е. битовое поле может  быть  в

  длинну более одного длинного слова.

       Битовое поле переменной длины имеет формат,  приведен-

  ный на рис. 2. Заштрихованная часть обозначает поле.















                           - 185 -

                       00152-01 33 09-2



               P+S-1          р              0
  +------------+--------------+--------------+
  !            !* * * * * * * !              !:A
  +------------+--------------+--------------+
                      V             V
                      V             V
  S = размер поля <<<<V             V
  P = битовое смещение поля <<<<<<<<V
      от нулевого бита адреса A


                            Рис. 2


       Битовое поле начинается с нуля  -  это  означает,  что

  процедура рассматривает  первый  бит  знакового  поля,  как

  существующее нулевое положение. Более полная  информация  о

  размерности байта и формате данных содержится  в  документе

  [3].

       Процедуры исполнительной библиотеки для  осуществления

  операций над полями переменной длины используют  инструкции

  прямого доступа к  битовым  полям  языков  программирования

  высокого уровня.


       Возвращаемые значения состояния:

  SS$_ROPRAND

       - ошибка зарезервированного операнда,  если  указанный

         размер больше 32.
















                           - 186 -

                       00152-01 33 09-2


       1.40. LIB$FFX - поиск первого очищенного  или

             установленного бита


       Процедуры LIB$FFC  и  LIB$FFS  выполняют  поиск  поля,

  заданного начальной позицией, размером и базой для  первого

  очищенного или установленного  бита.  Процедуры  LIB$FFC  и

  LIB$FFS аналогична инструкциям FFC и FFS системы МОС ВП.


       Формат:

       LIB$FFC      Начальная позиция, размер,

                    база, найденная позиция

       LIB$FFS      Начальная позиция, размер,

                    база, найденная позиция


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Начальная позиция

       Использование МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Начальная позиция относительно  адреса  базы  битового

  поля, которое разыскивается  процедурой  LIB$FFX.  Аргумент

  начальная позиция - адрес целого длинного слова со  знаком,




                           - 187 -

                       00152-01 33 09-2


  содержащего начальную позицию.


       Размер

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество байтов  разыскиваемых  процедурой  LIB$FFX.

  Аргумент размер  -  адрес  байтов  без  знака,  содержащего

  размер разыскиваемого битового поля.


       База

       Использование МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Базовый адрес  битового  поля,  которое  разыскивается

  процедурой LIB$FFX. Аргумент база -  адрес  длинного  слова

  без знака, содержащего базовый адрес.


       Найденная позиция

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством  ссылки

       Позиция первого бита в заданном состоянии (очищен  или

  установлен)   относительно   базового   адреса.    Аргумент

  найденная позиция - адрес целого длинного слова со  знаком,

  в которое  процедура  LIB$FFC  записывает  позицию  первого



                           - 188 -

                       00152-01 33 09-2


  очищенного бита, а  процедура  LIB$FFS  записывает  позицию

  первого установленного бита.


       Описание.

       Процедура  LIB$FFC  выполняет  поиск  поля,  заданного

  начальной позицией, размером и базой для первого очищенного

  бита.   Процедура   LIB$FFS   выполняет    поиск    первого

  установленного бита.

       Если бит в указанном состоянии  найден,  то  процедура

  LIB$FFX записывает позицию (относительно базы) этого бита в

  аргумент найденная позиция и выдается  состояние  успешного

  выполнения процедуры. Если бит  в  указанном  состоянии  не

  найден или, если аргумент нулевой,  то  выдается  состояние

  ошибки  LIB$_NOTFOU  и   в   аргумент   найденная   позиция

  записывается начальная позиция плюс размер.

       Процедура LIB$FFX рассматривает первый бит в поле  как

  существующую нулевую позицию.  Более  полная  информация  о

  вычислении байта и форматах данных содержится в

  документе [3].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура  успешно  завершена.   Бит   в   указанном

         состоянии обнаружен;

  LIB$_NOTFOU

       - бит в указанном состоянии не обнаружен.








                           - 189 -

                       00152-01 33 09-2


       Сигнализируемые значения состояния:

  SS$_ROPRAND

       - ошибка зарезервированного операнда. Заданный  размер

         больше 32.



       1.41. LIB$FILE_SCAN - сканирование файла


       Процедура  LIB$FILE_SCAN  выполняет   поиск   области,

  например   такой   как   директория,   для   всех    файлов

  соответствующих   данной    спецификации    файла,    перед

  выполнением   программы    заданной    процедурой.    Могут

  использоваться  символы   обобщения.   Процедура   действия

  вызывается для каждого  файла  и/или  обнаруженной  ошибки.

  Процедура LIB$FILE_SCAN позволяет найти  последовательность

  даже, если встретилась ошибка во  время  обработки  данного

  файла.


       Формат:

       LIB$FILE_SCAN  блок, успешная процедура

                      процедура ошибки [, контекст]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения









                           - 190 -

                       00152-01 33 09-2


       Аргументы:

       Блок

       Использование в МОС ВП: блок доступа к файлу

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Блок доступа к файлу (FAB), указывающий действительный

  блок имени файла NAM. Аргумент блок - адрес блока доступа к

  файлу,  который  содержит  адрес  и   длину,   существующей

  спецификации файла, разыскиваемой процедурой LIB$FILE_SCAN.


       Успешная процедура

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: вызываемая функция (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Заданная пользователем  процедура,  которую  процедура

  LIB$FILE_SCAN  вызывает,  когда  обнаружен  файл.  Аргумент

  успешная процедура - адрес маски  входа  данной  процедуры.

  Успешная процедура  используется  вместе  с  адресом  блока

  доступа   к   файлу,   который   был   передан    процедуре

  LIB$FILE_SCAN. Контекст  пользователя  может  быть  передан

  этой  процедуре  с  использованием  поля  FAB$L_CTX   блока

  доступа к файлу.











                           - 191 -

                       00152-01 33 09-2


       Процедура ошибки

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов

       Механизм: посредством ссылки, ссылки на процедуру.

       Заданная пользователем  процедура,  которую  процедура

  LIB$FILE_SCAN вызывает, когда  встречает  ошибку.  Аргумент

  процедура ошибки -  адрес  маски  входа  данной  процедуры.

  Процедура  ошибки  вызывается  вместе  с  аргументом  блок,

  который был передан процедуре LIB$FILE_SCAN.


       Контекст

       Использование в МОС ВП: контекст

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Установленный    по    умолчанию    контекст    файла,

  используемый   при   обработке   спецификации   файла   для

  многократного  ввода  файлов.  Аргумент  контекст  -  адрес

  длинного слова, которое  должно  быть  обнулено  программой

  перед первым вызовом процедуры LIB$FILE_SCAN. После первого

  вызова процедура LIB$FILE_SCAN сохраняет это длинное слово.

  Нельзя изменять значение аргумента контекст при последующих

  вызовах процедуры LIB$FILE_SCAN.

       Блоки имен и  строки  спецификаций  файла  размещаются

  процедурой LIB$FILE_SCAN.  Аргумент  контекст  используется

  для сохранения их адресов, поэтому позднее они  могут  быть

  освобождены. Если аргумент  контекст  передан,  неуказанные



                           - 192 -

                       00152-01 33 09-2


  части спецификации файла будут унаследованы  от  предыдущей

  спецификации  файла,  скорее  чем  при  многократном  вводе

  спецификации файла.


       Описание.

       Процедура LIB$FILE_SCAN вызывается  вместе  с  адресом

  блока доступа к файлу (FAB) и вызывает  процедуру  действия

  для каждого  обнаруженного  файла  и/или  выдает  состояние

  ошибки. Процедура LIB$FILE_SCAN позволяет продолжить  поиск

  последовательности, даже если встретилась ошибка  во  время

  обработки данного файла.

       Если данная процедура вызывается  только  для  каждого

  аргумента спецификации  файла  в  командной  строке,  части

  спецификации  файла,  которые  не  указаны   пользователем,

  наследуются из последнего обрабатываемого файла.

       Перед  запуском   новой   последовательности   вызовов

  процедуры  LIB$FILE_SCAN   необходимо   вызвать   процедуру

  LIB$FILE_SCAN_END.


       Возвращаемые значения состояния:

       любые   возвращаемые   значения   состояния    системы

  управления данными СУД-32 синтаксического анализа.
















                           - 193 -

                       00152-01 33 09-2


       1.42. LIB$FILE_SCAN_END - конец поиска файла


       Процедура LIB$FILE_SCAN_END  вызывается  после  каждой

  последовательности   вызовов   процедурой    LIB$FILE_SCAN.

  Процедура LIB$FILE_SCAN_END  открепляет  любой  сохраняемый

  системой управления данными СУД-32  контекст  и  открепляет

  виртуальную память, которая была  закреплена  для  хранения

  информации о соответствующей спецификации файла.


       Формат:

       LIB$FILE_SCAN_END  блок [,контекст]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Блок

       Использование в МОС ВП: блок доступа к файлу

       Тип: неопределенный

       Доступ: модификация

       Механизм: посредством ссылки

       Блок доступа к файлу  (FAB),  используемый  процедурой

  LIB$FILE_SCAN. Аргумент FAB - адрес блока доступа  к  файлу

  (FAB), который содержит адрес и длину спецификации файла.








                           - 194 -

                       00152-01 33 09-2


       Контекст

       Использование в МОС ВП: контекст

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Временный, установленный по умолчанию, контекст файла,

  используемый в процедуре LIB$FILE_SCAN. Аргумент контекст -

  адрес длинного слова, содержащего временный контекст.


       Описание.

       Процедура    LIB$FILE_SCAN_END    должна    вызываться

  программой   после   каждой   последовательности    вызовов

  процедуры LIB$FILE_SCAN.  Если  выполняется  синтаксический

  анализ нулевой строки, то открепляется сохраняемый контекст

  системы   управления   данными   СУД-32   и   освобождается

  виртуальная память, которая была распределена для  хранения

  информации о соответствующей спецификации файла.

       Если   процедура    LIB$FILE_CSAN    определена    для

  многократного ввода файлов, то процедура  LIB$FILE_SCAN_END

  используется  для  освобождения  сохраняемых   спецификаций

  файла.   Если   процедура   LIB$FILE_SCAN_END    вызывается

  программой   после   каждой   последовательности    вызовов

  процедуры   LIB$FILE_SCAN,   то   она   предотвращает,   по

  умолчанию, употребление значения контекстов из  предыдущего

  вызова в последующем вызове процедуры LIB$FILE_SCAN.









                           - 195 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  RMS$_NORMAL

       - процедура успешно завершена;

  RMS$_FAB

       - аргумент блок  не  является  действительным  адресом

         блока доступа к файлу.



       1.43. LIB$FIND_FILE - поиск файла


       Процедура LIB$FIND_FILE  осуществляет  поиск  файловой

  спецификации,  состветствующих  файловых   спецификаций   с

  символом обобщения. Процедура LIB$FIND_FILE возвращает  все

  файловые  спецификации,  которые   соответствуют   файловой

  спецификации с символом обобщения.


       Формат:

       LIB$FIND_FILE  спецификация файла, результирующая

                      спецификация файла, контекст

                      [, спецификация по умолчанию]

                      [, соответствующая спецификация]

                      [, адрес состояния]

                      [, флаги пользователя]


       Код возврата:

       Использование в МОС ВП  значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения





                           - 196 -

                       00152-01 33 09-2


       Аргументы:

       Спецификация файла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Спецификация  файла,  содержащая  символы   обобщения,

  которую  процедура  LIB$FIND_FILE  использует  для   поиска

  необходимого файла. Аргумент  спецификация  файла  -  адрес

  точечного дескриптора со спецификацией файла.  Максимальная

  длина спецификации файла 255 байтов.

       Используемая  спецификация   файла   может   содержать

  искомый список логических имен. Если он указан, то элементы

  искомого списка логических имен могут быть использованы как

  накопитель для  связи  спецификаций  файлов,  причем  части

  спецификации   файла   не    определенные    пользователем,

  наследуются из предыдущих спецификаций файла.


       Результирующая спецификация файла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: модификация

       Механизм: посредством дескриптора

       Результирующая спецификация файла,  которую  процедура

  LIB$FIND_FILE  возвращает,  когда  находит  файл,   который

  соотвествует спецификации, заданной аргументом спецификация

  файла.





                           - 197 -

                       00152-01 33 09-2


       Контекст

       Использование в МОС ВП: контекст

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Нуль  или  адрес   внутреннего   FAB/NAM   буфера   из

  предыдущего  вызова   процедуры   LIB$FIND_FILE.   Аргумент

  контекст - целое длинное слово без знака, содержащее  адрес

  контекста.  Процедура   LIB$FIND_FILE   использует   данный

  аргумент для сохранения контекста во время передачи входных

  файлов. Части спецификации файла, которые  пользователь  не

  указывает, наследуются из последнего  обработанного  файла,

  так как контексты файла сохраняются в данном аргументе.


       Спецификация файла по умолчанию

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Спецификация файла, принятая  по  умолчанию.  Аргумент

  спецификация  файла  по   умолчанию   -   адрес   точечного

  дескриптора со спецификацией файла, принятой по умолчанию.


       Адрес состояния

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством дескриптора




                           - 198 -

                       00152-01 33 09-2


       Значение  вторичного  состояния   системы   управления

  данными СУД-32 из  ошибочной  операции  системы  управления

  данными. Аргумент  адрес  состояния  -  длинное  слово  без

  знака, содержащее адрес буфера (длиной в длинное слово) для

  получения значения вторичного состояния системы  управления

  данными (обычно возвращается в поле блока доступа  к  файлу

  FAB$I_STV).


       Соответствующая спецификация

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Родственная спецификация  файла,  содержащая  контекст

  последнего обработанного  файла,  аргумент  соответствующая

  спецификация - адрес точечного дескриптора с  соответствую-

  щей спецификацией файла.


       Флаги пользователя

       Использование в МОС ВП: маска_длинное слово

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Флаги  пользователя.  Аргумент  флаги  пользователя  -

  адрес  длинного  слова   без   знака,   содержащего   флаги

  пользователя.

       Биты флагов и  их  символьное  обозначение  описаны  в

  табл. 16.




                           - 199 -

                       00152-01 33 09-2


                                                   Таблица 16

  -----------------------------------------------------------

  Бит   ! Символ   ! Описание

  -----------------------------------------------------------

     0  ! NOWILD   ! Если установлен, процедура LIB$FIND_FILE

        !          ! выдает состояние ошибки, если введен

        !          ! символ обобщения

     1  ! MULTIPLE ! Если установлен, временно выполняется

        !          ! установка спецификации входных файлов

        !          ! по умолчанию и аргумент соответствующая

        !          ! спецификация игнорируется. Каждый раз

        !          ! процедура LIB$FIND_FILE  вызывается с

        !          ! различной спецификацией файла, специфи-

        !          ! кация предыдущего вызова автоматически

        !          ! используется как соответствующая специ-

        !          ! фикация файла. Это разрешает граммати-

        !          ! ческий разбор элементов искомого списка

        !          ! логического имени, такого как DISK2:

        !          ! [SMITH] FIL1.TYP, FIL*2.TYP и т.д. Даль-

        !          ! нейшее использование требует получение

        !          ! желаемой установки по умолчанию с иско-

        !          ! мым списком логического имени


       Возвращаемые значения состояния:

  RMS$_NORMAL

       - процедура успешно завершена;

  LIB$_NOWILD

       - в  грамматическом  разборе   файловой   спецификации



                           - 200 -

                       00152-01 33 09-2


         представлен символ обобщения, а  бит  флага  символа

         обобщения установлен на его отсутствии.  (Фактически

         это   сообщение   об   ошибке   SHR$_NOWILD    после

         употребления допустимого кода LIB$).

       Любые   возвращаемые   значения   состояния    системы
                      
  управления  данными  СУД-32,  служебных   программ   поиска

  LIB$GET_VM, LIB$FREE_VM, LIB$SCOPY_R_DX.



       1.44. LIB$FIND_FILE_END  -  окончание  поиска

             файла


       Процедура LIB$FIND_FILE_END  вызывается  после  каждой

  последовательности   вызовов    процедуры    LIB$FIND_FILE.

  Процедура LIB$FIND_FILE_END освобождает  любой  сохраняемый

  контекст системы управления данными  СУД-32  и  освобождает

  виртуальную  память,  используемую  для  размещения   блока

  контекста.


       Формат:

       LIB$FIND_FILE_END   контекст


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения









                           - 201 -

                       00152-01 33 09-2


       Аргументы:

       Контекст

       Использование в МОС ВП: контекст

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Нуль  или  адрес   внутреннего   FAB/NAM   буфера   из

  предыдущего  вызова   процедуры   LIB$FIND_FILE.   Аргумент

  контекст - адрес длинного слова, содержащего контекст.


       Описание.

       Процедура    LIB$FIND_FILE_END    вызывается     после

  последовательности  вызовов  процедуры  LIB$FIND_FILE.  Это

  препятствует  значениям,  установленным  по  умолчанию,  из

  предыдущего вызова воздействовать на следующую спецификацию

  файла. Процедура  LIB$FIND_FILE_END  освобождает  контекст,

  используемый в последнем  вызове  процедуры  LIB$FIND_FILE,

  сохраняемый   контекст   не    будет    использоваться    в

  последовательности вызовов  процедуры  LIB$FIND_FILE.  Если

  процедура  LIB$FIND_FILE  указывает  процессу  спецификацию

  файла  для  многократного  ввода  файлов,  то   сохраняемые

  спецификации файла будет также освобождаться.


       Возвращаемые значения состояния:

  RMS$_NORMAL

       - процедура успешно завершена;

  RMS$_FAB

       - аргумент блок доступа к файлу  не  является  адресом




                           - 202 -

                       00152-01 33 09-2


         действительного блока доступа к файлу (FAB).



       1.45. LIB$FIND_IMAGE_SYMBOL      -      поиск

             глобального     символа     в     файле

             разделяемого образа


       Процедура  LIB$FIND_IMAGE_SYMBOL   читает   глобальные

  символы  из  файла  разделяемого  образа.   Эта   процедура

  динамически   активизирует   разделяемый   образ    в    Р0

  обрабатываемом адресном пространстве.


       Формат:

       LIB$FIND_IMAGE_SYMBOL имя файла, дескриптор, символ


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Имя файла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя      файла,      для      которого       процедура

  LIB$FIND_IMAGE_SYMBOL  осуществляет  поиск.  Аргумент   имя

  файла - адрес точечного дескриптора строки с именем  файла.




                           - 203 -

                       00152-01 33 09-2


  этот аргумент может содержать только имя файла.  Тип  файла

  на указывается. Если спецификация  файла  содержит  символы

  пунктуации  (:,  [,  <),  то  выдается   состояние   ошибки

  SS$_IVLOGNAM.

       По   умолчанию    принимается    спецификация    файла

  SYS$SHARE:.EXE. Если файл не находится в SYS$SHARE:.EXE, то

  может  использоваться   логическое   имя   для   управления

  процедурой  размещения  файла.  Только  логические   имена,

  определенные  в  системной  таблице  логического  имени   с

  атрибутом  /EXEC  рассматриваются,   в   то   время   когда

  активизатор образа обрабатывает запрос образа, который  был

  установлен  с  привилегиями.  Если  вызывающий  образ   был

  установлен с привилегиями, то образ, который активизируется

  должен быть установлен с привилегиями.


       Дескриптор

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Символ,        который        ищется        процедурой

  LIB$FIND_IMAGE_SYMBOL в файле с именем, заданным аргументом

  имя  файла.  Аргумент  дескриптор  -   адрес   дескриптора,

  содержащего строку с  именем  символа.  Строка  символьного

  имени должна  быть  введена  большими  буквами  (в  верхнем

  регистре); данная  программа  не  выполняет  преобразования

  верхнего регистра.





                           - 204 -

                       00152-01 33 09-2


       Символ

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Значение  символа,  который  был  размещен  процедурой

  LIB$FIND_IMAGE_SYMBOL.  Аргумент  символ  -  адрес   целого

  длинного   слова   со   знаком,   в    которое    процедура

  LIB$FIND_IMAGE_SYMBOL  записывает  значение  символа.  Если

  символ повторно размещен, то  начальный  виртуальный  адрес

  разделяемого  образа  в  памяти  прибавляется  к   значению

  символа.


       Описание.

       Разделяемый  образ,  который  активизирует   процедура

  LIB$IMAGE_SYMBOL,   должен   быть   уже    скомпанован    и

  позиционно-независим.  Для  использования  этой   процедуры

  необходим доступ по чтению к файлу разделяемого образа.

       Процедура  LIB$FIND_IMAGE_SYMBOL  записывает  значение

  символа, который размещен в аргументе символ.

       После первого вызова  процедуры  LIB$FIND_IMAGE_SYMBOL

  для  конкретного  образа,  успешные  вызовы  образа   будут

  обрабатываться быстро. Образ активизируется только однажды,

  и  база  данных  поддерживается  в  памяти.  Не  существует

  способов освобождения базы данных, и нет каких-либо методов

  поддержки  для   удаления   активизированного   образа   из

  адресного  пространства.  Все   образы   активизируются   в

  пространстве Р0.



                           - 205 -

                       00152-01 33 09-2


       Процедура       LIB$FIND_IMAGE_SYMBOL        запрещает

  распознавание асинхронного системного прерывания  (AST)  во

  время   своего   выполнения.   Распознавание   асинхронного

  системного   прерывания   повтороно    разрешается    перед

  возвращением  в  вызвавшую  его  программу,   только   если

  распознавание асинхронного системного прерывания было ранее

  разрешено.

       Процедура  LIB$FIND_IMAGE_SYMBOL  сообщает  обо   всех

  ошибках и возвращает состояние в R0.


       Возвращаемые значения состояния:

  LIB$_BADCCC

       - неправильный код компиляции;

  LIB$_EOMERROR

       - ошибка компиляции;

  LIB$_EOMFATAL

       - фатальная ошибка компиляции;

  LIB$_EOMWARN

       - предупреждение компиляции;

  LIB$_GSDTYP

       - неверный глобальный символ введен в типе директории;

  LIB$_ILLFMLCNT

       - количество    аргументов     процедуры     превышает

         максимально допустимое количество аргументов;

  LIB$ILLMODNAM

       - недопустимая длина имени модуля;

  LIB$_ILLPSCLEN

       - недопустимая длина программной секции



                           - 206 -

                       00152-01 33 09-2


  LIB$_ILLRECLEN

       - недопустимая длина записи в модуле;

  LIB$_ILLRECLN2

       - недопустимая длина записи;

  LIB$_ILLRECTYP

       - недопустимый тип записи в модуле;

  LIB$_ILLRECTY2

       - недопустимый тип записи;

  LIB$_ILLSYMLEN

       - недопустимая длина символа;

  LIB$_NOEOM

       - нет записи конца модуля;

  LIB$_RECTOOSML

       - очень маленькая запись;

  LIB$_SEQUENCE

       - неверная последовательность записей в модуле;

  LIB$_SEQUENCE2

       - неверная последовательность записей;

  LIB$_STRVL

       - неверный уровень структуры языка в модуле.

       Примечание.  Все  приведенные  сообщения  об   ошибках

  указывают на ошибку формата в разделяемом образе.

  LIB$_INSVIRMEM

       - недостаточная виртуальная память;

  SS$_IVLOGNAM

       - аргумент  имя  файла  содержит  количество  символов

         больше допустимого; неверно указано  устройство  или




                           - 207 -

                       00152-01 33 09-2


         директорий в строке.

       Все возвращаемые значения состояния LIB$INSERT_TREE.

       Все возвращаемые значения состояния системы управления

  данными.



       1.46. LIB$FIXUP_FLT      -       фиксирование

             зарезервированного операнда в формате с

             плавающей запятой


       Процедура  LIB$FIXUP_FLT   находит   зарезервированный

  операнд для любой команды с плавающей запятой  форматов  F,

  D, G, H (с некоторыми исключениями) после появления сигнала

  об   ошибке    зарезервированного    операнда.    Процедура

  LIB$FIXUP_FLT позволяет изменить зарезервированный  операнд

  от -0.0  до  значения  аргумента  новый  операнд,  если  он

  присутствует; или до  +0.0,  если  аргумент  новый  операнд

  отсутствует.


       Формат:

       LIB$FIXUP_FLT  сигнальный аргумент, механизм-аргумент

                      [, новый операнд]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения







                           - 208 -

                       00152-01 33 09-2


       Аргументы:

       Сигнальный аргумент

       Использование в МОС ВП: вектор_длинное слово_без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Вектор  сигнального  аргумента.  Аргумент   сигнальный

  аргумент - адрес массива длинных слов без знака, содержащих

  вектор сигнального аргумента.


       Механизм-аргумент

       Использование в МОС ВП: вектор_длинное слово_без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Вектор механизм-аргумента. Механизм-аргумент  -  адрес

  массива  длинных  слов  без   знака,   содержащего   вектор

  механизм-аргумента.


       Новый операнд

       Использование в МОС ВП: число с плавающей запятой

       Тип: число с плавающей запятой формата F

       Доступ: только чтение

       Механизм: посредством ссылки

       Значение числа  с  плавающей  запятой  формата  F  для

  замещения  зарезервированного  операнда.   Аргумент   новый

  операнд -  адрес  числа  с  плавающей  запятой  формата  F,

  содержащего новый  операнд.  Это  необязательный  аргумент.




                           - 209 -

                       00152-01 33 09-2


  если он отсутствует, то по умолчанию принимается  значение,

  равное +0.0.


       Описание.

       Процедура  LIB$FIXUP_FLT   выдает   состояние   ошибки

  SS$_RESIGNAL и не обрабатывает следующие ситуации:

       1) текущим действующим  сигнализируемым  состоянием  в

  данный момент является не SS$_ROPRAND;

       2) тип данных зарезервированного операнда  отличен  от

  форматов F, D, G, H числа с плавающей запятой;

       3)  зарезервированный   операнд   является   элементом

  таблицы коэффициентов POLYX.

       Если   возвращаемое   значение   состояния,   выданное

  процедурой    LIB$FIXUP_FLT,    воспринято     устройством,

  обрабатывающим состояние (как,  если  бы  данная  процедура

  была   обработчиком),   то   любое    успешное    значение,

  эквивалентное  SS$_CONTINUE,  вызывает   повторный   запуск

  команды. Любое значение ошибки эквивалентное  SS$_RESIGNAL,

  которое вызывается обработчиком, вызывает повторение сигна-

  ла для следующего  обработчика.  Это  состояние  повторения

  сигнала появляется вследствии того, что обработчик не  смог

  правильно обработать состояние.

       Процедура  LIB$FIXUP_FLT   может   быть   использована

  непосредственно как обработчик условий. Аргументы  сигналь-

  ный аргумент  и  механизм-аргумент  передаются  обработчику

  состояния посредством исключительной диспетчиризации.







                           - 210 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура   успешно   завершена.   Зарезервированный

         операнд был найден и зафиксирован;

  SS$_ACCVIO

       - нарушение доступа. Аргумент для данной процедуры или

         операнд  для  ошибочной  инструкции  не  может  быть

         прочитан или записан;

  SS$_RESIGNAL

       - значение   состояния   было   не   SS$ROPRAND,   или

         зарезервированный операнд не  является  значением  с

         плавающей запятой, или он является элементом таблицы

         коэффициентов POLYX;

  SS$_ROPRAND

       - неверный зарезервированный операнд.  Аргумент  новый

         операнд  является  зарезервированным   операндом   с

         плавающей запятой формата F;

  LIB$_BADSTA

       - плохой  стек.  Связность   фрагментов   стека   была

         нарушена   с   момента   отказа   зарезервированного

         операнда.
















                           - 211 -

                       00152-01 33 09-2


       1.47. LIB$FLT_UNDER       -       обнаружение

             переполнения с плавающей запятой


       Процедура  LIB$FLT_UNDER   разрешает   или   запрещает

  обнаружение переполнения при работе с числами  с  плавающей

  запятой для активизации  вызываемой  процедуры.  Предыдущая

  установка выдается как значение функции.


       Формат:

       LIB$FLT_UNDER  новая установка


       Код возврата:

       Использование в МОС ВП: длинное слово (без знака)

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Новая установка

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Новая установка, разрещающая переполнение при работе с

  плавающей запятой. Аргумент новая установка -  адрес  байта

  без  знака,  содержащего  новую  установку.  Нулевой   бит,

  установленный  в  1  означает  разрешение,   нулевой   бит,

  установленный в 0 означает запрещение.






                           - 212 -

                       00152-01 33 09-2


       Описание.

       Процедура LIB$FLT_UNDER оказывает  влияние  только  на

  активизацию текущей процедуры  и  не  влияет  на  любую  из

  вызывающих ее программ или  любую  процедуру,  которую  она

  может вызвать. Однако,  установка  остается  действительной

  для любой процедуры, вызванной через точку входа JSB.

       Посредством этой процедуры  модифицируется  вызываемый

  кадр стека.


       Возвращаемые значения состояния:

       отсутствуют


       Пример.

  С+

  С Данный пример демонстрирует использование

  С процедуры LIB$FLT_UNDER.

  С-

        INTEGER * 4 NEW_SETTING

        REAL* 4 X, Y, Z

        NEW_SETTING = 0

        X = 1E-20

        Y = 1E20

        CALL LIB$FLT_UNDER (NEW_SETTING)

        TYPE *, первый вызов: нет исключительного состояния

        переполнения'

        Z = X/Y

        TYPE *,'если эта строка печатается,

        переполнение запрещено.'




                           - 213 -

                       00152-01 33 09-2


        TYPE*

        NEW_SETTING = 1

        X = 1E-20

        Y = 1E20

        CALL LIB$FLT_UNDER (NEW_SETTING)

        TYPE * ,'следующий вызов: имеет место переполнение

        и тогда остановка.'

        Z = X/Y

        TYPE *,'если печатается эта строка, переполнение

        запрещено.'

  С     CALL EXIT

        END

       В данной программе на языке  программирования  фортран

  обнаружение переполнения с плавающей запятой  запрещено  во

  время  деления  X  на  Y.  В  следующий   отрезок   времени

  обнаружение переполнения  разрядов  разрешено  и  программа

  останавливается из-за генерации ошибки.



       1.48. LIB$FREE_EF   -   освобождение    флага

             события


       Процедура  LIB$FREE_EF  освобождает  флаг   локального

  события, ранее размещенный процедурой LIB$GET_EF. Процедура

  LIB$FREE_EF является дополнением процедуры LIB$GET_EF.











                           - 214 -

                       00152-01 33 09-2


       Формат:

       LIB$FREE_EF номер флага


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Номер флага

       Использование в МОС ВП: цифра

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Номер флага события, который  должен  быть  освобожден

  процедурой LIB$FREE_EF. Аргумент номер флага - адрес целого

  длинного слова со знаком, содержащего номер флага  события,

  который  является   значением   возвращаемым   пользователю

  процедурой LIB$GET_EF.


       Описание.

       Когда флаг локального события,  размещенный  во  время

  вызова процедуры LIB$GET_EF  больше  не  нужен,  необходимо

  вызвать процедуру LIB$FREE_EF, для того, чтобы  снять  этот

  флаг, который может быть использован другими процедурами.









                           - 215 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_EF_ALRFRE

       - флаг события уже снят;

  LIB$_EF_RESSYS

       - флаг  события  зарезервирован   для   системы.   Это

         происходит в тех случаях, когда номер флага  выходит

         за пределы от 1 до 23 и от 32 до 63.


       Пример.

       Примером  использования  процедуры  LIB$FREE_EF  может

  служить пример, приведенный в процедуре LIB$GET_EF.



       1.49. LIB$FREE_LUN  -   освобождение   номера

             логического блока


       Процедура  LIB$FREE_LUN  переносит  номер  логического

  блока,  размещенный  процедурой  LIB$GET_LUN  в  накопитель

  разрешенных  номеров.  Процедура   LIB$FREE_LUN   дополняет

  процедуру LIB$GET_LUN.


       Формат:

       LIB$FREE_LUN  номер логического устройства


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись




                           - 216 -

                       00152-01 33 09-2


       Механизм: посредством значения


       Аргументы:

       Номер логического устройства

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Номер  логического  устройства,  который  должен  быть

  освобожден. Аргумент номер логического устройства  -  адрес

  целого длинного слова со  знаком,  содержащего  этот  номер

  логического устройства.


       Описание.

       Когда номер логического  устройства,  размещенный  при

  вызове процедуры LIB$GET_LUN больше не нужен,  его  следует

  освободить для использования другими процедурами.

       Процедура   LIB$FREE_LUN   используется    только    в

  программах на языках программирования БЕЙСИК и ФОРТРАН.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_LUNALRFRE

       - номер логического устройства уже освобожден;

  LIB$_LUNRESSYS

       - номер  логического  устройства  зарезервирован   для

         системы.  Это  происходит  в  тех   случаях,   когда

         заданный номер  логического  устройства  выходит  за



                           - 217 -

                       00152-01 33 09-2


         пределы интервала от 100 до 119.


       Пример.

       Примером использования процедуры  LIB$FREE_LUN,  может

  служить пример, приведенный в подразделе 1.60.



       1.50. LIB$FREE_TIMER  -   освободить   память

             таймера


       Процедура    LIB$FREE_TIMER    освобождает     память,

  размещенную процедурой LIB$INIT_TIMER.


       Формат:

       LIB$FREE_TIMER  адрес указателя


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Адрес указателя

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Указатель   блока   памяти,    содержащий    значение,

  возвращаемое  процедурой   LIB$INIT_TIMER;   т.е.   память,

  которую  освобождает  процедура  LIB$FREE_TIMER.   Аргумент



                           - 218 -

                       00152-01 33 09-2


  адрес указателя - адрес целого длинного  слова  без  знака,

  содержащего это значение.


       Описание.

       Процедура LIB$FREE_TIMER освобождает блок памяти ранее

  размещенный    процедурой     LIB$INIT_TIMER.     Процедура

  LIB$FREE_TIMER предполагает, что аргумент  адрес  указателя

  определяется  посредством  предыдущего   вызова   процедуры

  LIB$INIT_TIMER.  Если  блок,  указанный  в  аргумент  адрес

  указателя,  размещен  не  процедурой   LIB$INIT_TIMER,   то

  выдается  состояние  ошибки.   Если   процедура   выполнена

  успешно, процедура  LIB$FREE_TIMER  устанавливает  аргумент

  адрес указателя в нуль.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INVARG

       - неверный аргумент; не указан аргумент или нет  точки

         таймера блока;

  LIB$BADBLOADR

       - неверный  адрес  блока;  процедура  LIB$FREE_VM   не

         освободила блок, который указан в аргументе адрес.














                           - 219 -

                       00152-01 33 09-2


       1.51. LIB$FREE_VM - освобождение  виртуальной

             памяти из программной области


       Процедура LIB$FREE_VM освобождает целый  блок  смежных

  байтов, который был размещен предыдущим  вызовом  процедуры

  LIB$GET_VM. Аргументы передаются так же как и  в  процедуре

  LIB$GET_VM.


       Формат:

       LIB$FREE_VM  число байт, базовый адрес

                    [, идентификатор зоны]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Число байт

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество  смежных  байтов,   которые   освобождаются

  процедурой LIB$FREE_VM. Аргумент число байт - адрес  целого

  длинного слова со знаком,  содержащего  количество  смежных

  байтов. Значение аргумента число байт  должно  быть  больше

  нуля.




                           - 220 -

                       00152-01 33 09-2


       Счетчик округляется таким же образом как и в процедуре

  LIB$GET_VM.

       Примечание. Аргумент число байт не используется,  если

  используются признаки границы (LIB$M_VM_BOUNDARY_TAGS).


       Базовый адрес

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Адрес первого байта, который  должен  быть  освобожден

  процедурой LIB$FREE_VM.  Аргумент  базовый  адрес  содержит

  адрес длинного слова без знака  с  адресом  первого  байта.

  Значение аргумента базовый адрес должно быть адресом  блока

  памяти,   размещенного   предыдущим    вызовом    процедуры

  LIB$GET_VM.


       Идентификатор зоны

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Аргумент идентификатор зоны -  адрес  длинного  слова,

  содержащего  идентификатор   зоны,   созданный   предыдущим

  вызовом       процедуры       LIB$CREATE_VM_ZONE        или

  LIB$CREATE_USER_VM_ZONE.

       Можно указать то же значение  аргумента  идентификатор

  зоны, что и в вызове процедуры  LIB$GET_VM  при  размещении




                           - 221 -

                       00152-01 33 09-2


  блока. Если аргумент идентификатор зоны указан неправильно,

  то выдается состояние ошибки. Аргумент идентификатор зоны -

  необязательный аргумент. Если аргумент  идентификатор  зоны

  отсутствует  или  если  длинное  слово  содержит  значение,

  равное нулю, то по умолчанию используется зона LIB$VM.


       Описание.

       Процедура LIB$FREE_VM заносит указанный блок памяти  в

  список свободных для распределения  зон,  после  чего  этот

  блок   доступен   для   последующего   вызова    процедурой

  LIB$GET_VM.

       Аргумент базовый адрес должен содержать адрес  первого

  байта памяти, которая  была  размещена  предыдущим  вызовом

  процедуры LIB$GET_VM.  Процедура  LIB$FREE_VM  округляет  в

  большую сторону значение аргумента число байт  до  кратного

  размера блока зоны.

       Примечание. Можно освободить часть блока, который  был

  размещен вызовом процедуры LIB$GET_VM.  Весь  блок  целиком

  должен освобождаться одним вызовом процедуры LIB$FREE_VM.

       Нельзя скомбинировать смежные  блоки  памяти,  которые

  были размещены несколькими вызовами процедуры LIB$GET_VM  в

  один большой  блок,  чтобы  освободить  его  одним  вызовом

  процедуры LIB$FREE_VM.

       Если при создании зоны задано заполнение освобожденной

  зоны, процедура LIB$FREE_VM заполнит  каждый  освобожденный

  байт.  Часть  свободных  блоков  будет  использоваться  для

  сохранения контрольной информации, так как некоторые  байты

  не содержат значения заполнения.



                           - 222 -

                       00152-01 33 09-2


       Процедура  LIB$FREE_VM  реентерабельна,  так  как  она

  может  быть  вызвана  процедурой,  выполняемой  на   уровне

  асинхронного системного прерывания.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_BADBLOADR

       - аргумент базовый адрес содержит плохой адрес  блока.

         Адрес  был  вне  области,   размещенной   процедурой

         LIB$GET_VM,  или  содержание  второго  аргумента  не

         выравнено по границе слова, или часть освобождаемого

         пространства была освобождена ранее;

  LIB$_BADBLOSIZ

       - аргумент число  байт  меньше  или  равен  нулю,  или

         аргумент   число   байт   некорректный   для   зоны,

         содержащей блоки фиксированной длины.



       1.52. LIB$FREE_VM_PAGE     -     освобождение

             страницы виртуальной памяти


       Процедура LIB$FREE_VM_PAGE  освобождает  блок  смежных

  страниц,  которые  были  распределены  предыдущим   вызовом

  процедуры LIB$GET_VM_PAGE.












                           - 223 -

                       00152-01 33 09-2


       Формат:

       LIB$FREE_VM_PAGE  число страниц, базовый адрес


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Число страниц

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество страниц. Аргумент  число  страниц  -  адрес

  целого длинного слова, которое  задает  количество  смежных

  страниц для освобождения. Значение аргумента число  страниц

  должно быть больше нуля.


       Базовый адрес

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Адрес блока. Аргумент базовый адрес -  адрес  длинного

  слова, содержащего адрес  первого  байта  первой  страницы,

  которая будет освобождаться.





                           - 224 -

                       00152-01 33 09-2


       Описание.

       Процедура LIB$FREE_VM_PAGE  освобождает  блок  смежных

  страниц, начиная со значения, заданного аргументом  базовый

  адрес. Каждая из  страниц,  определенных  аргументом  число

  страниц  и  базовый   адрес,   должна   быть   распределена

  предварительным вызовом процедуры LIB$GET_VM_PAGE. Страницы

  заносятся в накопитель  страниц  процесса  и  доступны  для

  последующих вызовов процедуры LIB$GET_VM_PAGE.

       Можно освободить меньшую группу страниц, чем выделена,

  т.е., если выделена группа страниц с помощью одного  вызова

  LIB$GET_VM_PAGE, можно освободить  эти  страницы  используя

  несколько   вызовов   процедуры   LIB$FREE_VM_PAGE.   Можно

  комбинировать смежные группы страниц, которые были выделены

  с помощью нескольких вызовов процедуры  LIB$GET_VM_PAGE,  в

  одну большую группу, которая  освобождается  одним  вызовом

  процедуры LIB$FREE_VM_PAGE.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_BADBLOADR

       - страницы  выделены  не  процедурой  LIB$GET_VM_PAGE.

         Значение  аргумента  базовый   адрес   не   является

         границей страниц, или страницы уже были  освобождены

         ранее;

  LIB$_BADBLOSIZ

       - значение аргумента число страниц  меньше  или  равно

         нулю.



                           - 225 -

                       00152-01 33 09-2


       1.53. LIB$GET_COMMAND -  получение  текстовой

             строки из SYS$COMMAND


       Процедура LIB$GET_COMMAND получает одну запись  текста

  в  коде  КОИ-8  с  текущего  устройства  ввода,   заданного

  логическим именем SYS$COMMAND.


       Формат:

       LIB$GET_COMMAND  строка [, строка подсказки]

                        [, длина]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Строка

       Использование МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Строка, которую процедура LIB$GET_COMMAND получает  от

  SYS$COMMAND. Аргумент строка - адрес точечного  дескриптора

  с этой строкой.










                           - 226 -

                       00152-01 33 09-2


       Строка подсказки

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка  подсказки  -   сообщение,   которое   выдается

  процедурой   LIB$GET_COMMAND   на   контрольный   терминал.

  Аргумент строка подсказки - адрес точечного  дескриптора  с

  подсказкой. Строка подсказки содержит текст без  комбинации

  возврат каретки/перевод строки, за которой может  следовать

  двоеточие (:) и пробел.


       Длина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Число байт, записываемых в аргумент строка  процедурой

  LIB$GET_COMMAND,  не  считая  заполнений  в  случае  строки

  фиксированной длины.  Аргумент  длина  -  адрес  слова  без

  знака, содержащего длину. Если входная  строка  усечена  по

  сравнению с  размером,  заданным  в  дескрипторе  аргумента

  строка, то аргумент длина устанавливается в  нуль.  Поэтому

  аргумент длина может использоваться  вызывающей  программой

  для доступа к действительной подстроке аргумента строка.









                           - 227 -

                       00152-01 33 09-2


       Описание.

       Процедура LIB$GET_COMMAND использует программу систем-

  ного обслуживания. Для получения одной записи текста в коде

  КОИ-8 с текущего устройства ввода, заданного SYS$COMMAND.

       При регистрации в системе по умолчанию  создаются  три

  файла, управляющие потоками ввода-вывода процесса:

       1) SYS$INPUT - устройство ввода по умолчанию;

       2) SYS$OUTPUT - устройство вывода по умолчанию;

       3) SYS$COMMAND - устройство ввода команд.

       Данные файлы остаются открытыми до выхода из  системы.

  Они осуществляют связь между  интерактивным  вводом-выводом

  или   программами   в   пакетном   режиме   и   программным

  обеспечением системы МОС ВП. Первоначально  все  три  файла

  закрепляются  за  терминалом,  однако,  с  помощью  команды

  ASSIGN  можно  изменить   их   назначения   для   получения

  информации из файла или ввода  информации  в  файл.  Обычно

  SYS$INPUT и  SYS$COMMAND  идентичны,  но  потоки  команд  и

  входных  данных  могут  отличаться.  Например,   во   время

  выполнения косвенного  командного  файла  на  интерактивном

  терминале, SYS$COMMAND обращается к терминалу, а  SYS$INPUT

  к командному файлу.

       Процедура LIB$GET_COMMAND открывает  файл  SYS$COMMAND

  при  первом  вызове.  Индентификатор   внутреннего   потока

  сохраняется в статической памяти процедуры для  последующих

  вызовов.

       Если аргумент строка указан и  устройство  SYS$COMMAND

  является терминалом, то процедура  LIB$GET_COMMAND  выводит




                           - 228 -

                       00152-01 33 09-2


  сообщение-подсказку.   Если    устройство    не    является

  терминалом, то этот аргумент игнорируется.

       Процедура    LIB$GET_COMMAND    используется,    когда

  подпрограмме  требуются  входные   данные   из   некоторого

  источника, отличного от текущего  входного  потока.  Обычно

  она используется для ввода с терминала. Например, программа

  может задать вопрос, на который не может быть дан  ответ  с

  помощью ввода косвенного командного файла.  В  этом  случае

  программе следует  вызвать  процедуру  LIB$GET_COMMAND  для

  получения одной записи текста в коде КОИ-8  с  SYS$_COMMAND

  (с терминала).


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_FATERRLIB

       - проверка  внутреннего  состояния   структур   данных

         исполнительной библиотеки была неудачной. Это свиде-

         тельствует  о  внутренней  ошибке  в  исполнительной

         библиотеке  или  о  переполнении   структур   данных

         программой пользователя;

  LIB$_INPSTRTRU

       - вводимая строка была усечена до  размера,  заданного

         дескриптором первого  аргумента  (только  для  строк

         фиксированной длины). Аргумент длина указывает такую

         же  длину.  Это  является  ошибкой  (в  отличии   от

         LIB$STRTRU,  которая  будет   успешной),   так   как

         усечение строки управляется программой;



                           - 229 -

                       00152-01 33 09-2


  LIB$_INSVIRMEM

       - недостаточная  виртуальная  память  для   размещения

         динамической строки;

  LIB$_INVARG

       - неправильные аргументы. Поле класса  дескриптора  не

         является распознаваемым кодом или нулем.

       Любые действительные коды состояния системы управления

  данными СУД-32.

       Любые коды, возвращаемые  процедурами  LIB$GET_VM  или

  LIB$COPY_R_DX.



       1.54. LIB$GET_COMMON - вызов строки из  общей

             области


       Процедура  LIB$GET_COMMON  копирует  строку  из  общей

  области в  результирующую  строку.  (Общая  область  -  это

  область памяти, которая остается определенной после многок-

  ратной активизации образа в процессе). Длина строки берется

  из первого длинного слова общей области.


       Формат:

       LIB$GET_COMMON  результирующая строка

                       [, число символов]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения



                           - 230 -

                       00152-01 33 09-2


       Аргументы:

       Результирующая строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая    строка,    в    которую    процедура

  LIB$GET_COMMON записывает  строку,  копируемую  из  области

  сохранения.  Аргумент   результирующая   строка   -   адрес

  дескриптора с результирующей строкой.


       Число символов

       Использование в МОС ВП: слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Количество    символов,    записываемых     процедурой

  LIB$GET_COMMON в аргумент результирующая строка, не  считая

  заполнений,  в  случае  строки  с   фиксированной   длиной.

  Аргумент число символов - адрес  целого  слова  со  знаком,

  содержащего количество копируемых символов.  Если  вводимая

  строка оборвана на размере,  заданном  дескриптором  строки

  результата, аргумент число символов устанавливается в  этот

  размер.  Поэтому  аргумент  число  символов   может   также

  использоваться   вызывающей    программой    для    доступа

  действительной подстроки аргумента результирующая строка.







                           - 231 -

                       00152-01 33 09-2


       Описание.

       Процедура    LIB$PUT_COMMON    позволяет     программе

  копировать строку в обрабатываемую  общую  область  памяти.

  Эта область остается  определенной  во  время  многократной

  активизации  образа.  Процедура  LIB$GET_COMMON   позволяет

  программе   копировать   строку   из   общей   области    в

  результирующую строку. Программы, читающие  и  записывающие

  данные в общую область, должны соотвествовать ее величине и

  формату.

       Максимальное количество символов, которые  могут  быть

  скопированы  252.  Фактически,   количество   скопированных

  символов передается необязательному аргументу число  симво-

  лов (если он указан).

       Можно   использовать   процедуры   LIB$PUT_COMMON    и

  LIB$GET_COMMON    при     передаче     информации     между

  последовательно выполняемыми образами, например, в  цепочке

  выполняемых образов процедуры LIB$RUN_PROGRAM.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRTRU

       - успешно  завершена.  Строка  больше  чем  буфер  или

         оборвана;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка;

  LIB$_INSVIRMEM

       - недостаточная виртуальная  память.  Вызов  процедуры



                           - 232 -

                       00152-01 33 09-2


         LIB$GET_VM  не  может  быть  осуществлен,  так   как

         программа  превысила  допустимую  квоту  виртуальной

         памяти;

  LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         неверная величина в поле DSC$B_CLASS.



       1.55. LIB$GETDVI  -   вызов   информации   об

             устройстве/значении


       Процедура LIB$GETDVI использует упрощенный интерфейс с

  программой  системного  обслуживания  $GETDVI.  Она  выдает

  информацию  об   основных   и   вторичных   характеристиках

  устройств  ввода-вывода.  Вызываемый  процесс  не   требует

  назначения канала с устройством,  о  котором  запрашивается

  информация.


       Формат:

       LIB$GETDVI  единичный код [, канал] [, имя устройства]

                   [, выходное значение] [, выходная строка]

                   [длина]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения







                           - 233 -

                       00152-01 33 09-2


       Аргументы:

       Единичный код

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Код,  задающий   единицу   запрашиваемой   информации.

  Аргумент единичный код - адрес длинного  слова  со  знаком,

  содержащего этот код.  Допускаются  единичные  коды,  имена

  которых начинаются с DVI$.


       Канал

       Использование в МОС ВП: канал

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Канал  ввода-вывода,   назначенный   устройству,   для

  которого процедура LIB$GETDVI возвращает  информацию.  Если

  аргумент канал не указан, вместо него используется аргумент

  имя устройства.

       Необходимо указать аргумент  канал  или  аргумент  имя

  устройства,  но  не  оба  одновременно.  Если  одновременно

  указаны  оба  аргумента,  то  выдается   состояние   ошибки

  LIB$_INVARG.











                           - 234 -

                       00152-01 33 09-2


       Имя устройства

       Использование в МОС ВП: имя устройства

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя  устройства,  для  которого  процедура  LIB$GETDVI

  выдает  информацию.  Аргумент  имя   устройства   -   адрес

  дескриптора  строки  с  именем  устройства.   Если   строка

  содержит двоеточие, то двоеточие  и  символ,  следующий  за

  ним, игнорируются.

       Аргумент имя устройства может быть именем  физического

  устройства или логическим  именем.  Если  первый  символ  в

  строке - подчеркивание (_),  имя  рассматривается  как  имя

  физического   устройства.   В   противном    случае,    имя

  рассматривается, как логическое имя,  и  обращение  к  нему

  выполняется  до  тех  пор,  пока  или  не  обнаружится  имя

  физического устройства, или количество обращений будет рав-

  но количеству обращений, принятому в системе по умолчанию.

       Если аргумент имя устройства не указан, то вместо него

  используется аргумент канал.

       Может быть задан или аргумент канал или  аргумент  имя

  устройства, но не оба одновременно. Если одновременно зада-

  ны оба аргумента или не задан ни один из них, выдается сос-

  тояние ошибки LIB$_INVARG.

       Имя устройства не должно быть более 255 символов.








                           - 235 -

                       00152-01 33 09-2


       Выходное значение

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Числовое значение запрашиваемой  информации.  Аргумент

  выходное  значение  -  адрес  длинного  слова  без   знака,

  содержащего числовое значение. Если сообщение  записывается

  только  как  возвращаемое  строковое  значение,   то   этот

  аргумент игнорируется.


       Выходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Строковое  представление   запрашиваемой   информации.

  Аргумент выходная строка - адрес дескриптора, задающего эту

  информацию. Если аргумент выходная строка не  определен,  и

  если   возвращаемое   значение   имеет   только   строковое

  представление, то возвращается состояние ошибки LIB$INVARG.

       Описание   строкового   представления   для    каждого

  используемого элемента приведено в табл. 17.


       Длина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись




                           - 236 -

                       00152-01 33 09-2


       Механизм: посредством ссылки

       Число  значащих  символов,   записываемых   процедурой

  LIB$GETDVI  в  аргумент  выходная  строка.  Аргумент  длина

  является адресом слова без знака, содержащего эту длину.


       Описание.

       Процедура   LIB$GETDVI   возвращает   две    категории

  информации:

       1) основные характеристики устройства;

       2) вторичные характеристики устройства.

       Процедура LIB$GETDVI не позволяет получить больше, чем

  одну единицу информации за один вызов.

       Процедура LIB$GETDVI обеспечивает  следующие  дополни-

  тельные возможности по сравнению  с  программой  системного

  обслуживания $GETDVI:

       1)  вместо  списка  единичных  дескрипторов,   которые

  трудно составляются  на  языках  высокого  уровня,  единица

  информации  определяется  как   код,   который   передается

  посредством  ссылки.  Результат  записывается  в  отдельный

  аргумент;

       2) для единичного кода,  который  возвращает  числовые

  значения, процедура LIB$GETDVI может произвольно обеспечить

  интерпретацию  сформатированной  строки   этого   значения.

  Например,  если  запрашивалось  устройство  с  именем  кип,

  процедура LIB$GETDVI может возвратить сформатированный  кип

  как [идентификатор];

       3)  для  строковых  аргументов  процедура   LIB$GETDVI

  распознает все  поддерживаемые  исполнительной  библиотекой



                           - 237 -

                       00152-01 33 09-2


  классы строк;

       4) вызов процедуры  LIB$GETDVI  синхронный;  процедура

  LIB$GETDVI вызывает  процедуру  LIB$GET_EF  для  размещения

  номера флага локального события синхронизации.


       Единичные коды

       Все единичные коды, которые могут быть использованы  в

  программе  системного  обслуживания  $GETDVI,  могут   быть

  использованы,  как  аргумент  единичный  код,  в  процедуре

  LIB$GETDVI.   Эти   коды   имеют    символические    имена,

  начинающиеся с DVI$.

       Использование  DVI$  кода,  как  такового,  возвращает

  основные характеристики устройства, связанные с этим кодом.

  Для получения вторичных характеристик устройств  необходимо

  добавить к коду единицу.


       Форматы значения


       При  использовании  аргументов  выходное  значение   и

  выходная  строка  в  процедуре  LIB$GETDVI,   запрашиваемая

  информация может быть возвращена в двух различных формах:

       1) для единичных кодов, описанных как строка в таблице

  кодов идентификаторов единичных кодов программы  системного

  обслуживания  $GETDVI,  значение  возвращается   только   в

  аргумент  выходная  строка;  аргумент   выходное   значение

  игнорируется и возвращается переменное  успешное  состояние

  LIB$STRVALITE;

       2) для всех  других  единичных  кодов,  которые  имеют

  числовые   значения   в   аргумент    выходное    значение,



                           - 238 -

                       00152-01 33 09-2


  возвращается   числовое   представление   и   интерпретация

  сформатированной  строки  этого  значения  возвращается   в

  аргумент выходная строка.

       Каждый   сформатированный   единичный   код   записан,

  выравненным влево; аргумент длина, если он определен, опре-

  деляет число используемых символов. В  табл.  17  приведены

  форматы, используемые для интерпретации строки.

                                                   Таблица 17

  -----------------------------------------------------------

  Единичный код    !              Описание

  или формат       !

  -----------------------------------------------------------

  DVI$_ACPPID      ! Строковое значение возвращается в виде

                   ! 8-цифрового шестнадцатиричного числа

  DVI$_PID         ! Строковое значение возвращается в виде

                   ! 8-цифрового шестнадцатиричного числа

  DVI$_ACPTYPE     ! Строка, содержащая тип вспомагательного

                   ! управляющего процесса:

                   ! NONE  - не вспомагательный управляющий

                   !         процесс

                   ! F11V1 - файловая структура

                   ! F11V2 - файловая структура

                   ! MTA   - магнитная лента

                   ! NET   - сети

                   ! REM   - дистанционный ввод-вывод

                   ! JNL   - журнал

  DVI$_OWNUIC      ! Стандартный используемый формат кода




                           - 239 -

                       00152-01 33 09-2


                                         Продолжение табл. 17

  -----------------------------------------------------------

  Единичный код    !              Описание

  или формат       !

  -----------------------------------------------------------

                   ! идентификации пользователя (КИП) (груп-

                   ! па, член).  Если  формат  КИП включает

                   ! идентификатор прав доступа к базе данных

                   ! на месте восьмеричной группы  и номеров

                   ! членов, возвращаемый КИП  будет  содер-

                   ! жать эти идентификаторы,  если это воз-

                   ! можно

  DVI$_VPROT       ! Строка защиты тома в формате:

                   ! SYSTEM=RWLP,  OWNER=RWLP,  GROUP=RWLP,

                   ! WORLD=RWLP

                   ! Если категория не имеет доступа, экви-

                   ! валентный знак опускается.  Строка не

                   ! содержит никаких вставленных областей

  Булева функция   ! Возвращаемое строковое значение являет-

                   ! ся истинным, если младший бит значения

                   ! установлен,  или ложным,  если младший

                   ! бит обнулен

  Все другие       ! Строковое значение, возвращается в фор-

                   ! мате целого десятичного значения без

                   ! знака








                           - 240 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRVALITE

       - неверная  строка  единичного  кода.  Это  переменное

         успешное состояние. Возвращаемое значение единичного

         кода имеет только строковое значение, если  аргумент

         выходное значение определен, он игнорируется;

  LIB$_INSEF

       - флаги недостаточного события. Номер флага локального

         события не может  быть  размещен  вызовом  процедуры

         LIB$GET_EF;

  LIB$_INVARG

       - неверный аргумент. Ни аргумент выходное значение, ни

         аргумент  выходная   строка   не   определены,   или

         определены оба;

  LIB$_INVSTRDES

       - неверный дескриптор  строки.  Дескриптор  строки  не

         является допустимым дескриптором строки;

  LIB$_UNRITECOD

       - нераспознаваемый единичный  код.  Единичный  код  не

         распознается  программой   системного   обслуживания

         $GETDVI или процедурой LIB$GETDVI;

  LIB$_WRONUMARG

       - неверное число аргументов. Неверное число аргументов

         передается процедуре LIB$GETDVI.

       Возвращаемые     значения     состояния      процедуры




                           - 241 -

                       00152-01 33 09-2


  LIB$SCOPY_XXX, которые возвращаются процедурой  LIB$GETDVI.

  Ошибка усечения игнорируется.

       Любые  вовзращаемые   значения   состояния   процедуры

  SYS$GETDVI.



       1.56. LIB$GET_EF - получение флага события


       Процедура LIB$GET_EF размещает  один  флаг  локального

  события в обрабатываемом накопителе  страниц  и  возвращает

  вызывающей программе номер  размещенного  флага.  Если  нет

  доступных флагов, процедура LIB$GET_EF возвращает ошибку, в

  виде функционального значения.


       Формат:

       LIB$GET_EF  флаг события


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргумент

       Флаг события

       Использование в МОС ВП: флаг события_номер

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Номер  флага  локального  события,  который  процедура




                           - 242 -

                       00152-01 33 09-2


  LIB$GET_EF размещает, или -1,  если  никакой  флаг  события

  невозможен. Аргумент флаг события - адрес  целого  длинного

  слова со знаком, в которое процедура LIB$GET_EF  записывает

  номер размещаемого флага локального события.


       Описание.

       Процедуры  LIB$GET_EF  и   LIB$FREE_EF   размещают   и

  освобождают флаги локального события во время работы, таким

  образом,  что  процедура  остается  независимой  от  других

  процедур, выполняемых в том же процессе.

       В  табл.  18  описаны  состояния   флагов   локального

  события.

                                                   Таблица 18

  -----------------------------------------------------------

     Номер   !                Состояние

  -----------------------------------------------------------

  0          ! Никогда не используется этой процедурой  и

             ! всегда доступен

  1-23       ! Первоначально зарезервированы; могут использо-

             ! ваться после освобождения процедурой

             ! LIB$FREE_EF

  24-31      ! Зарезервированы системой МОС ВП

  32-63      ! Свободны


       Флаги локального события с номерами 32-63 доступны для

  программы  пользователя.  Эти   флаги   события   позволяют

  процедурам об'единять и синхронизировать их операции.

       Использование   процедуры   LIB$GET_EF    обеспечивает




                           - 243 -

                       00152-01 33 09-2


  программу пользователя номером флага произвольного события.

  Можно получить номер флага  заданного  события  посредством

  вызова  процедуры  LIB$RESERVE_EF  и  передачи  в  качестве

  аргумента   зарезервированного   номера   флага   заданного

  события.  Однако,  резервирование  номера  флага  заданного

  события не рекомендуется. Если используется флаг  заданного

  события в процедуре пользователя,  другая  процедура  может

  пытаться использовать тот же флаг, и у флага не будет столь

  длительной  функции  как  ожидалось.  Поэтому,   необходимо

  вызывать  LIB$GET_EF   для   получения   следующего   флага

  произвольного события, и LIB$FREE_EF для возвращения его  в

  накопитель памяти.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INSEF

       - недостаточные  флаги  события.  Нет  флагов  события

         возможных для размещения.



       1.57. LIB$GET_FOREIGN -  получение  командной

             строки пользователя


       Процедура  LIB$GET_FOREIGN  запрашивает  интерпретатор

  командного  языка  вызываемого   образа   для   возвращения

  содержимого строки с командой пользователя, которая активи-

  зирует текущий образ.






                           - 244 -

                       00152-01 33 09-2


       Формат:

       LIB$GET_FOREIGN   строка [, подсказка] [, длина]

                         [, управление подсказкой]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Строка, которую LIB$GET_FOREIGN использует для  приема

  командной строки  пользователя.  Аргумент  строка  является

  адресом дескриптора, задающего  строку  пользователя.  Если

  текст  команды  пользователя  получен   как   подсказка   в

  SYS$INPUT, он  переводится  в  символы  верхнего  регистра,

  чтобы    текст    совпадал    с    текстом,    возвращаемым

  интерпретатором командного языка.


       Подсказка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора



                           - 245 -

                       00152-01 33 09-2


       Необязательная, задаваемая пользователем подсказка для

  текста, которую LIB$GET_FOREIGN использует, если невозможна

  никакая  текстовая  командная  строка.  Аргумент  подсказка

  является   адресом   дескриптора,    задающего    подсказку

  пользователя. Если этот  аргумент  опущен,  не  выполняется

  никакая подсказка. Рекомендуется, чтобы аргумент  подсказка

  был определен. Если аргумент подсказка опущен и  невозможна

  никакая текстовая  командная  строка,  возвращается  строка

  нулевой длины.


       Длина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Число байт, записываемых в  аргумент  выходная  строка

  процедурой LIB$GET_FOREIGN, не считая конечных  пробелов  в

  случае  фиксированной  длины  аргумента  выходная   строка.

  Аргумент длина является адресом слова без знака, в  которое

  LIB$GET_FOREIGN записывает число байт.


       Управление подсказкой

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: изменение

       Механизм: посредством ссылки

       Значение,    которое     процедура     LIB$GET_FOREIGN

  использует, чтобы  определить  будет  или  нет  выполняться




                           - 246 -

                       00152-01 33 09-2


  подсказка. Аргумент управление подсказкой  -  адрес  целого

  длинного слова со знаком, содержащего  это  значение.  Если

  младший бит аргумента управление подсказкой является  нулем

  или если аргумент управление подсказкой  опущен,  подсказка

  выполняется.

       В основном аргумент управление подсказкой используется

  для  разрешения  программам  системного  обслуживания  быть

  вызванными однажды с текстом подкоманды в командной строке,

  а  затем  повторно  выполнить  подсказку  для   последующих

  подкоманд с SYS$INPUT.  Это  достигается  путем  повторного

  вызова процедуры LIB$GET_FOREIGN, определяя в вызове строку

  подсказка пользователя и переменную управление  подсказкой,

  которая инициализируется в 0  в  начале  программы.  Первый

  вызов получает текст подкоманды из командной строки,  после

  чего аргумент управление подсказкой устанавливается в 1,  а

  последующие  подкоманды   запрашиваются   через   подсказку

  SYS$INPUT.


       Описание.

       Процедура   LIB$GET_FOREIGN   возвращает    содержимое

  командной  строки,  которая  используется  для  активизации

  образа. Она может использоваться для доступа квалификаторам

  команды пользователя или  для  подсказки  текста  следующей

  командной строки.

       Команда пользователя - это команда, определенная поль-

  зователем и затем использующаяся для выполнения  программы,

  как  если  бы  она  была  командой   DCL   или   MCR.   При

  использовании команды  пользователя  на  командном  уровне,



                           - 247 -

                       00152-01 33 09-2


  интерпретатор команд выполняет только грамматический разбор

  и активизирует образ.  Он  игнорирует  любые  варианты  или

  квалификаторы, которые определены для команды пользователя.

  Когда интерпретатор команд  активизирует  образ,  программа

  может  вызвать  LIB$GET_FOREIGN   для   получения   остатка

  командной строки и  грамматического  разбора  (после  самой

  команды).

       Если   нет   таких    командных    строк,    процедура

  LIB$GET_FOREIGN может произвольно вызвать LIB$GET_INPUT для

  подсказки   пользователю    текста    команды.    Процедура

  LIB$GET_FOREIGN может  быть  вызвана  повторно  для  выдачи

  командной   строки   первого   вызова   и   подсказки   для

  последующего текста в последовательности вызовов.

       LIB$GET_FOREIGN может также  использоваться  образами,

  вызванными командой  RUN,  для  которых  последующий  текст

  получается с помощью подсказки.  Такой  образ  может  также

  быть  вызван  DCL  командой  MCR  или  MCR  интерпретатором

  командного  языка.  Текст,  следующий  за  именем   образа,

  возвращается в выполняемый образ.

       Действие   процедуры   LIB$GET_FOREIGN   зависит    от

  окружения, в котором сформирован образ.

       При  использовании  команды  пользователя  для  вызова

  образа  можно   вызвать   процедуру   LIB$GET_FOREIGN   для

  получения командных квалификаторов, сопровождающих  команду

  пользователя.   Можно    также    использовать    процедуру

  LIB$GET_FOREIGN  повторно  для  выполнения  подсказки   для

  получения большего количества квалификаторов после команды.




                           - 248 -

                       00152-01 33 09-2


  этот технический прием показан в примере.

       Если образ вызван DCL командой MCR или интерпретатором

  командного языка MCR, он находится в директории SYS$SYSTEM.

  В этом случае процедура  LIB$GET_FOREIGN  возвращает  текст

  командной строки, следующий за именем.

       Если  образ  вызван  DCL   командой   RUN,   процедура

  LIB$GET_FOREIGN используется для подсказки  дополнительного

  текста.

       Если образ вызван не командой пользователя или  коман-

  дой  MCR,  или  больше  нет  информации,  а  есть  заданная

  пользователем   подсказка,   то   процедура   LIB$GET_INPUT

  вызывается для выполнения подсказки командной строке.  Если

  подсказка не задана, процедура  LIB$GET_FOREIGN  возвращает

  строку нулевой длины.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_FATERRLIB

       - обнаружена неустранимая ошибка;

  LIB$_INPSTRTRU

       - входная строка усечена. Аргумент выходная строка  не

         может содержать  всех  символов.  Аргумент  выходная

         длина отражает усеченную строку;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память;

  LIB$_INVSTRDES

       - неверный строковый дескриптор



                           - 249 -

                       00152-01 33 09-2


       Значения состояния, возвращаемые  системой  управления

  данными СУД-32. С SYS$INPUT  введена  подсказка  с  текстом

  команды, а система  управления  данными  СУД-32  возвратила

  ошибку. Наиболее типичной ошибкой будет  RMS$_EOF  -  конец

  файла.


       Пример.

  ЕXAMPLE: PROCEDURE OPTIONS (MAIN);

  %INCLUDE $ STSDEF; /*  определения проверяемых состояний */

  DECLARE COMMAND_LINE CHARACTER (80) VARYING,

        PROMPT_FLAG FIXED BINARY (31) INIT(0),

        LIB$GET_FOREIGN ENTRY (CHARACTER(*) VARYING,

                  CHARACTER(*) VARYING,

                  FIXED BINARY (15),

                  FIXED BINARY (31)

        OPTIONS (VARIABLE) RETURNS (FIXED BINARY (31)),

        RMS$_EOF GLOBALREF FIXED BINARY (31) VALUE;

  /*  Повторение вызовов процедуры LIB$GET_FOREIGN

      для получения текста подкоманды и печать текста.

      Выход, когда будет обнаружен конец файла. */



  DO WHILE ('1'B); /* Выполнять до тех пор, пока будет

                      TRUE */

     STS$VALUE = LIB$GET_FOREIGN

               (COMMAND_LINE, ' ввод: ',,

                PROMPT_FLAG);

     IF STS$SUCCESS THEN

      PUT LIST (' команда ', командная строка);



                           - 250 -

                       00152-01 33 09-2


      ELSE DO ;

        IF STS$VALUE^ = RMS$_EOF THEN

           PUT LIST ('встретилась ошибка');

       RETURN;

       ЕND;

    PUT SKIP; /* Пропуск до следующей строки. */

    END; /* Конец цикла. */

  END;

       Данный пример программы на языке программирования ПЛ/1

  демонстрирует использование  разрешения  повторных  вызовов

  процедуры   LIB$GET_FOREIGN.   Текст    командной    строки

  возвращается  только  в  первом   проходе;   после   этого,

  программа делает подсказку с SYS$INPUT.



       1.58. LIB$GET_INPUT  -  получение  строки   с

             SYS$INPUT


       Процедура LIB$GET_INPUT получает одну запись текста  в

  коде  КОИ-8  с  текущего  управляющего  устройства   ввода,

  определенного посредством SYS$INPUT.


       Формат:

       LIB$GET_INPUT  входная строка [, длина строки]

                      [, подсказка]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись



                           - 251 -

                       00152-01 33 09-2


       Механизм: посредством значения


       Аргументы:

       Входная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Строка, которую  процедура  LIB$GET_INPUT  получает  с

  устройства ввода. Аргумент входная строка является  адресом

  дескриптора,  задающего  символьную   строку,   в   которую

  LIB$GET_INPUT  записывает  текст,  принимаемый  с  текущего

  устройства ввода.


       Подсказка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Подсказывающее  сообщение,  которое  отображается   на

  управляющем терминале. Аргумент подсказка является  адресом

  дескриптора, содержащего подсказку. В подсказке допускается

  двоеточие (:) и пробел, не допускается  комбинация  возврат

  каретки/перевод строки. Максимальный размер подсказывающего

  сообщения - 255 символов. Если управляющее устройство ввода

  не терминал, этот аргумент игнорируется.








                           - 252 -

                       00152-01 33 09-2


       Длина строки

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Число байт, записываемых  процедурой  LIB$GET_INPUT  в

  аргумент входная строка,  не  считая  конечных  пробелов  в

  случае строки фиксированной длины. Аргумент длина строки  -

  адрес слова без  знака,  содержащего  длину.  Если  входная

  строка усекается  до  размера,  определенного  дескриптором

  входная строка, в аргументе  длина  строки  устанавливается

  данный размер.  Поэтому  длина  строки  может  быть  всегда

  использована   вызывающей   программой   для   доступа    к

  действительной подстроке аргумента входная строка.


       Описание.

       Процедура LIB$GET_INPUT использует программу $GET  для

  получения одной записи  текста  в  коде  КОИ-8  с  текущего

  управляющего устройства  ввода,  определенного  посредством

  SYS$INPUT.

       При входе в систему МОС ВП по умолчанию создаются  три

  файла:

       1) SYS$INPUT, установленное по  умолчанию,  устройство

  ввода;

       2) SYS$OUTPUT, установленное по умолчанию,  устройство

  вывода;

       3)  SYS$COMMAND,  устройство,   дающее   команды   для

  процесса пользователя.



                           - 253 -

                       00152-01 33 09-2


       Эти файлы остаются открытыми до выхода из системы  МОС

  ВП.  Они  являются  интерфейсов  между   взаимодействующими

  входом  и  выходом  или  пакетом   команд   и   программным

  обеспечением  системы.   Первоначально,   все   три   имени

  присвоены терминалу. Однако, с помощью команды ASSIGN можно

  изменить эти назначения для получения информации  из  файла

  или посылки информации  в  файл.  SYS$INPUT  и  SYS$COMMAND

  обычно идентичны, но входной и командый потоки  могут  быть

  различны.  Например,   во   время   выполнения   косвенного

  командного   файла    с    взаимодействующего    терминала,

  SYS$COMMAND ссылается на терминал, а SYS$INPUT ссылается на

  командный файл.

       Процедура LIB$GET_INPUT  открывает  файл  SYS$INPUT  в

  первом    вызове.    Идентификатор    внутреннего    потока

  запоминается   в   статической   памяти    процедуры    для

  последовательности вызовов. Следовательно, данная процедура

  не является повторно входимой.

       Если аргумент подсказка указан, а устройство SYS$INPUT

  является  терминалом,  процедура  LIB$GET_INPUT  отображает

  подсказку.  Если  устройство  не  терминал,   то   аргумент

  подсказка игнорируется.

       Для  входа  из  некоторого,  отличного   от   текущего

  входного    потока,    лучше     использовать     процедуру

  LIB$GET_COMMAND.










                           - 254 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_FATERRLIB

       - нарушен  контроль  внутренней  последовательности  в

         структурах  данных  исполнительной  библиотеки.  Это

         может означать программную ошибку  в  исполнительной

         библиотеке, или программа пользователя слишком много

         записывает в эти структуры данных;

  LIB$_INPSTRTRU

       - входная строка  усечена  до  размера,  определенного

         дескриптором   входная   строка    (только    строки

         фиксированной длины). В аргументе длина строки также

         установлен данный размер. Это ошибка (в  отличие  от

         LIB$_STRTRU, которая является успешной), потому  что

         усечение происходит не под программным управлением;

  LIB$_INSVIRMEM

       - недостаточная  виртуальная  память  для   размещения

         динамической строки;

  LIB$_INVARG

       - неверные аргументы. Поле класса дескриптора является

         нераспознаваемым кодом или нулем.

       Любые значения состояния, возвращаемые программой сис-

  темного обслуживания $GET.

       Любые  значения  состояния,  возвращаемые  процедурами
                     
  LIB$GET_VM или LIB$COPY_R_DX.






                           - 255 -

                       00152-01 33 09-2


       1.59. LIB$GETJPI  -  получение  информации  о

             работе процесса


       Процедура LIB$GETJPI обеспечивает упрощенный интерфейс

  с   программой   системного   обслуживания   $GETJPI.   Она

  обеспечивает учет, состояние и идентифицирование информации

  об определенном процессе.

       Процедура LIB$GETJPI получает  только  одну  отдельную

  информацию при каждом вызове.


       Формат:

       LIB$GETJPI  единичный код [, идентификатор процесса]

                   [, имя процесса] [, выходное значение]

                   [, выходная строка] [, выходная длина]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Единичный код

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Код  идентификатора  единичного   кода,   определяющий

  единицу, запрашиваемой информации. Аргумент единичный код -




                           - 256 -

                       00152-01 33 09-2


  адрес  целого  длинного  слова   со   знаком,   содержащего

  единичный код. Можно запрашивать только один единичный  код

  при каждом вызове процедуры LIB$GETJPI.

       LIB$GETJPI принимает все единичные коды $GETJPI.

       Эти имена, начинаются с префикса JPI$_, и определены в

  символьных библиотеках в модуле $JPIDEF.


       Идентификатор процесса

       Использование в МОС ВП: идентификатор процесса

       Тип: длинное слово (без знака)

       Доступ: изменение

       Механизм: посредством ссылки

       Идентификатор  процесса,  для  которого  запрашивается

  информация.  Аргумент   идентификатор   процесса   является

  адресом длинного слова без знака, содержащего идентификатор

  процесса.   Если   аргумент   идентификатор   процесса   не

  определен, то используется аргумент имя процесса.


       Имя процесса

       Использование в МОС ВП: имя процесса

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       1-15 символьная строка, определяющая имя процесса, для

  которого запрашивается информация.  Это  имя  должно  точно

  соответствовать имени процесса, для которого  запрашивается

  информация;  процедура  LIB$GETJPI  не  допускает  конечных

  пробелов или сокращений.





                           - 257 -

                       00152-01 33 09-2


       Если аргумент имя процесса не определен,  используется

  аргумент  идентификатор  процесса.  Если  не  определен  ни

  аргумент имя процесса, ни аргумент идентификатор  процесса,

  используется процесс вызывающей программы.


       Выходное значение

       Использование в МОС ВП: изменяемый аргумент

       Тип: неопределенный

       Доступ: только запись

       Механизм: посредством ссылки

       Числовое значение запрашиваемой  информации.  Аргумент

  выходное  значение  является  адресом  длинного  слова  или

  квадрослова,  в  которое  процедура  LIB$GETJPI  записывает

  числовое  значение  данной  информации.  Форматы  единичных

  кодов приведены в табл. 19.


       Выходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Строковое  представление   запрашиваемой   информации.

  Аргумент  выходная  строка  является   адресом   символьной

  строки, в которую процедура LIB$GETJPI записывает строковое

  представление.   В    табл.    19    приведены    строковые

  представления, используемые для единичных кодов.

       Если  не   указан   аргумент   выходная   строка,   но

  запрашиваемый  единичный   код   имеет   только   строковое




                           - 258 -

                       00152-01 33 09-2


  представление, возвращается состояние ошибки LIB$_INVARG.


       Выходная длина

       Использование в МОС ВП: слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Число  значащих  символов,   записываемых   процедурой

  LIB$GETJPI в аргумент выходная  строка.  Аргумент  выходная

  длина является адресом целого  длинного  слова,  в  которое

  процедура LIB$GETJPI записывает число символов.


       Описание.

       Процедура  LIB$GETJPI  дополнительно  к  возможностям,

  предоставляемым программой системного обслуживания $GETJPI,

  предоставляет следующие возможности:

       1) вместо списка единичных дескрипторов, которые могут

  быть трудны для  составления  на  языках  высокого  уровня,

  единица информации  определяется  как  целый  код,  который

  передается посредством  ссылки.  Результат  записывается  в

  отдельный аргумент;

       2) для единичных кодов, которые  возвращаются  в  виде

  числовых   значений,   процедура   LIB$GETJPI   произвольно

  обеспечивает интерпретацию сформатированной строки  данного

  значения.  Например,   если   запрашивался   КИП   процесс,

  процедура LIB$GETJPI возвращает  сформатированный  КИП  как

  "[G,M]";

       3) для строковых аргументов, процедура LIB$GETJPI рас-




                           - 259 -

                       00152-01 33 09-2


  познает  все,  поддерживаемые  исполнительной   библиотекой

  классы строк;

       4) вызовы процедуры  LIB$GETJPI  синхронны.  Процедура

  LIB$GETJPI вызывает  процедуру  LIB$GET_EF  для  размещения

  номера флага локального события синхронизации.

       Запрашиваемая информация может быть возвращена в  двух

  различных  режимах  посредством  использования   аргументов

  выходная строка и выходное значение в процедуре LIB$GETJPI,

  для единичных кодов, описанных как строка в  таблице  кодов

  идентификатора единичных кодов программы $GETJPI,  значение

  возвращается только в аргумент  выходная  строка;  аргумент

  выходное значение игнорируется  и  возвращается  переменное

  успешное состояние LIB$VALITE. Для  всех  других  единичных

  кодов, таких которые имеют числовые  значения,  в  аргумент

  выходное значение  возвращается  числовое  представление  и

  интерпретация  сформатированной   строки   этого   значения

  возвращается в аргументе выходная строка.

       Каждый   сформатированный   единичный   код    записан

  выравненным  влево;  аргумент  выходная  длина,   если   он

  определен, дает число используемых символов. Для  единичных

  кодов, которые возвращают  строки,  заполненные  пробелами,

  например, JPI$_USERNAME - конечные пробелы удаляются.

       В табл. 19 приведены форматы, используемые для  интеп-

  ретации строки.










                           - 260 -

                       00152-01 33 09-2


                                                   Таблица 19

            Форматы единичных кодов для LIB$GETJPI

  -----------------------------------------------------------

  Единичный код  !               Описание

  или формат     !

  -----------------------------------------------------------

  JPI$_AUTHPRIV  ! Строковое представление этих масок  при-

                 ! велегий, представленных  квадрословом яв-

                 ! ляется списком имен каждой возможной при-

                 ! велегии, разделенных запятой.  Имена при-

                 ! велегий представлены символами верхнего

                 ! регистра

  JPI$_CURPRIV   ! Такое же как для JPI$AVTHPRIV

  JPI$_IMAGPRIV  ! Такое же как для JPI$AUTHPRIV

  JPI$_PROCPRIV  ! Такое же как для JPI$AUTHPRIV

  JPI$_LOGINTIM  ! Строковое представление времени, пред-

                 ! ставленное квадрословом, является стан-

                 ! дартной строкой абсолютного времени-даты

  JPI$_PID       ! строка идентификации процесса является

                 ! 8-цифровым шестнадцатиричным числом

  JPI$_STATE     ! Строка состояния процесса может быть одной

                 ! из следующих:

                 ! CEF   - ожидание флага общего события

                 ! COM   - вычисляемая

                 ! COMO  - СОМ разгруженная

                 ! CUR   - текущий процесс

                 ! COLPG - ожидание столкновения страницы




                           - 261 -

                       00152-01 33 09-2


                                         Продолжение табл. 19

  -----------------------------------------------------------

  Единичный код  !               Описание

  или формат     !

  -----------------------------------------------------------

                 ! FPG   - ожидание свободной страницы

                 ! HIB   - ожидание управления

                 ! HIBO  - HIB, разгруженное

                 ! LEF   - ожидание флага локального события

                 ! LEFO  - LEF, разгруженное

                 ! MWAIT - ожидание неудачного и переменного

                 !         ресурса

                 ! PFW   - ожидание поврежденной страницы

                 ! SUSP  - приостановка

                 ! SUSPO - приостановка, разгруженная

  JPI$_UIC       ! Стандартный используемый формат кода

                 ! идентификации пользователя (группа, член).

                 ! Если  формат КИП включает идентификаторы

                 ! прав доступа к базе данных, то на месте

                 ! восьмиричной группы и номеров членов,

                 ! возвращаемая кип строка будет содержать

                 ! эти идентификаторы, если это возможно

  JPI$_MODE      ! Строка текущего режима одна из следующих:

                 ! BATCH, INTERACTIVE или NETWORK

  Все другие     ! Значение строки возвращается в формате

                 ! целого десятичного числа без знака






                           - 262 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRVALITE

       - единичный  код,  имеющий  строковое  значение.   Это

         переменное     успешное     состояние.      Значение

         возвращаемого единичного кода имеет только строковое

         значение. Если аргумент выходное значение определен,

         он игнорируется;

  LIB$_INSEF

       - номер  флага  локального  события  не   может   быть

         размещен вызовом процедуры LIB$GET_EF;

  LIB$_INVSTRDES

       - неверный дескриптор строки. Дескриптор для аргумента

         строки является недопустимым дескриптором строки;

  LIB$_UNRITECOD

       - нераспознаваемый единичный код.  Аргумент  единичный

         код  не  распознается  как   допустимый   программой

         $GETJPI или процедурой LIB$GETJPI;

  LIB$_WRONUMARG

       - неверное число аргументов. Неверное число аргументов

         передается процедуре LIB$GETJPI.

       Любые  значения  состояния,  возвращаемые   процедурой

  LIB$SCOPY_XXX; ошибки усечения игнорируются.

       Любые  значения  состояния,  возвращаемые   процедурой

  SYS$GETJPI.






                           - 263 -

                       00152-01 33 09-2


       1.60. LIB$GET_LUN    -    получение    номера

             логического устройства


       Процедура LIB$GET_LUN размещает один номер логического

  устройства.   Если   устройство   доступно,    его    номер

  возвращается в вызывающую  программу.  В  противном  случае

  возвращается ошибка в виде значения функции.


       Формат:

       LIB$GET_LUN номер логического устройства


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово без знака

       Доступ: только запись

       Механизм: посредством значения




       Аргумент:

       Номер логического устройства

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Размещенный номер логического устройства или  1,  если

  устройство недоступно. Аргумент номер логического устройст-

  ва является адресом длинного  слова,  в  которое  процедура

  LIB$GET_LUN возвращает  значение  размещенного  логического

  устройства.




                           - 264 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INSLUN

       - номер несуществующего логического устройства.


       Пример.

  РROGRAM LOGICAL_UNIT_NUM(INPUT, OUTPUT);

  (+)

  ( Данная программа демонстрирует использование процедуры

  ( LIB$GET_LUN для размещения номера логического устройства

  ( и процедуры LIB$FREE_LUN для освобождения номера

  ( логического устройства.

  РROCEDURE LIB$GET_LUN(%REF LOG_UNIT_NUM : INTEGER);

  EXTERN;

  PROCEDURE LIB$FREE_LUN(%REF LOG_UNIT_NUM : INTEGER);

  EXTERN;

  VAR

    UNIT_NUMBER : INTEGER;

  BEGIN

    LIB$GET_LUN(UNIT_NUMBER);

    WRITELN('размещенный номер логического устройства':

             ',UNIT_NUMBER);

    LIB$FREE_LUN(UNIT_NUMBER);

  END









                           - 265 -

                       00152-01 33 09-2


       Результат выполнения программы:

       Размещенный номер логического устройства: 119.



       1.61. LIB$GETSYI  -  получение  общесистемной

             информации


       Процедура  LIB$GETSYI  обеспечивает  упрощенную  связь

  (интерфейс с программой системного  обслуживания  $GETSYI).

  Программа  системного  обслуживания  получает  состояние  и

  соответствующую информацию о системе. Процедура  LIB$GETSYI

  выдает только одну единицу информации за один вызов.


       Формат:

       LIB$GETSYI  единичный код [, значение] [, строка]

                   [, длина строки] [, кластер] [, имя узла]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Единичный код

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Единичный   код,   задающий   запрашиваемую    единицу




                           - 266 -

                       00152-01 33 09-2


  информации. Аргумент единичный код - адрес целого  длинного

  слова, содержащего данный код. Допустимы все действительные

  единичные коды $GETSYI.


       Значение

       Использование в МОС ВП: изменяемый аргумент

       Тип: неопределенный

       Доступ: только запись

       Механизм: посредством ссылки

       Числовое значение, возвращаемое процедурой LIB$GETSYI.

  Аргумент значение - адрес длинного слова  или  квадрослова,

  содержащего числовое значение.  Если  возвращаемая  единица

  информации представляется только в  виде  строки,  аргумент

  значение игнорируется.


       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Информация,   возвращаемая   процедурой    LIB$GETSYI.

  Аргумент строка - адрес точечного дескриптора с  символьной

  строкой, которая подучает информацию.

       Если аргумент строка не указан, а возвращаемое  значе-

  ние  представляется  только  в  виде  строки,  то  выдается

  состояние ошибки LIB$_INVARG.








                           - 267 -

                       00152-01 33 09-2


       Длина строки

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Количество значащих символов,  записанных  в  аргумент

  строка,  за  исключением  пробелов  и  связующих  символов.

  Аргумент длина строки - адрес слова без  знака,  в  которое

  процедура LIB$GETSYI возвращает это количество.


       Кластер

       Использование в МОС ВП: длинное слово без знака

       Тип:  длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Идентификатор кластера системы для узла,  из  которого

  возвращается информация. Аргумент кластер - адрес идентифи-

  катора кластера системы. Если указаны аргументы  кластер  и

  имя узла, процедура LIB$GETSYI использует аргумент имя узла

  и записывает  в  аргумент  кластер  идентификатор  кластера

  системы, соответствующий узлу, заданному именем узла.

       Аргумент кластер  назначается  программой  обеспечения

  связи с  кластером  и  может  быть  получен  командой  SHOW

  CLUSTER. Значение аргумента кластер для узла не  постоянно;

  узлу назначается новое  значение,  если  он  связывается  с

  кластером или, если эта связь переустанавливается.

       Если  аргумент  кластер  задан  как  "-1",   процедура

  LIB$GETSYI возвращает запрашиваемую информацию для  каждого



                           - 268 -

                       00152-01 33 09-2


  узла в кластере, один узел за вызов.

       Если аргумент, кластер не задан, используется аргумент

  имя узла.


       Имя узла

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя  узла,  для  которого   возвращается   информация.

  Аргумент имя узла - адрес дескриптора строки с именем узла.

  Если аргумент имя узла не указан, то используется  аргумент

  кластер. Если не указаны оба аргумента имя узла и  кластер,

  используется вызывающий узел.

       Строка с именем узла  должна  содержать  от  1  до  15

  символов и соответствовать точному имени узла, без конечных

  пробелов и сокращений.


       Описание.

       Дополненительно к  возможностям  программы  системного

  обслуживания  $GETSYI  процедура  LIB$GETSYI  предоставляет

  следующие возможности:

       1) вместо списка дескрипторов, который в языках  прог-

  раммирования   высокого   уровня,   может   быть    сложной

  конструкцией, запрашиваемая единица информации определяется

  как  целый  код,  который  передается  посредством  ссылки.

  Результат записывается в отдельные аргументы;

       2) для информации,  представленной  в  виде  числового




                           - 269 -

                       00152-01 33 09-2


  значения,   процедура   LIB$GETSYI    может    использовать

  сформатированную строку, интерпретируя ее как значение;

       3) для строковых аргументов подразумеваются все классы

  строк, поддерживаемые исполнительной библиотекой;

       4) вызов процедуры  LIB$GETSYI  синхронный.  Процедура

  LIB$GETSYI вызывает  процедуру  LIB$GET_EF  для  размещения

  числа флага локального события для синхронизации.

       Все единичные коды, которые  могут  быть  использованы

  программой  системного  обслуживания  $GETSYI  могут   быть

  использованы  как  аргумент  единичный  код   в   процедуре

  LIB$GETSYI.


       Форматы значения


       При  использовании  аргументов   значение   и   строка

  процедурой LIB$GETSYI, информация может быть выдана в  двух

  различных режимах. Для кода, который описан  как  строка  в

  таблице  кодов  единичных  идентификаторов  для   программы

  системного  обслуживания  $GETSYI,  значение   возвращается

  только в аргумент строка, аргумент значение игнорируется  и

  выдается состояние LIB$STRVALITE. Для всех остальных кодов,

  которые имеют  числовое  значение,  числовое  представление

  возвращается в аргумент значение (если он указан), а  целое

  беззнаковое   десятичное   представление   сохраняется    в

  аргументе строка.










                           - 270 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INSEF

       - неверный  флаг  события.  Флаг  локального  местного

         события не может  быть  размещен  вызовом  процедуры

         LIB$GET_EF;

  LIB$_INVSTRDES

       - неверный   дескриптор.   Дескриптор,   заданный    в

         аргументе строка, является неверным;

  LIB$_STRVALITE

       - единица информации. Это успешное состояние.  Единица

         возвращаемой информации представляется только в виде

         строки.  Если  определен   аргумент   значение,   он

         игнорируется;

  LIB$_UNRITECOD

       - недопустимый единичный код. Аргумент  единичный  код

         не был распознан процедурами $GETSYI или  LIB$GETSYI

         как значение.

  LIB$_WRONUMARG

       - неверное  число  аргументов.   Неверное   количество

         аргументов передано процедуре LIB$GETSYI.

       Любые возвращаемые значения  состояния  LIB$SCOPY_XXX;

  ошибки усечения игнорируются.

       Любые  возвращаемые   значения   состояния   программы

  системного обслуживания $GETSYI.






                           - 271 -

                       00152-01 33 09-2


       1.62. LIB$GET_SYMBOL  -  получение   значения

             символа интерпретатора командного языка


       Процедура  LIB$GET_SYMBOL  требует  от  интерпретатора

  командного языка,  вызывающего  процесса,  выдать  значение

  символа интерпретатора  командного  языка  в  виде  строки.

  Дополнительно процедура LIB$GET_SYMBOL может выдать  длину,

  возвращаемого значения и таблицу, в которой был найден этот

  символ.


       Формат:

       LIB$GET_SYMBOL символ, значение [, длина] [, таблица]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Символ

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя   символа,   который   разыскивается    процедурой

  LIB$GET_SYMBOL.  Аргумент  символ  -  адрес  дескриптора  с

  именем  символа.  Перед  поиском  процедура  LIB$GET_SYMBOL

  преобразует  это  символьное  имя  в  прописной  шрифт,   а




                           - 272 -

                       00152-01 33 09-2


  конечные пробелы удаляет. Аргумент символ может  начинаться

  с буквы или знака доллара ($). Максимальная длина аргумента

  символ 255 символов.


       Значение

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Значение возвращаемого символа.  Аргумент  значение  -

  адрес дескриптора, задающего символьную строку,  в  которую

  процедура LIB$SYMBOL записывает значение символа.


       Длина

       Использование в МОС ВП: слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Длина      символа,      возвращаемого      процедурой

  LIB$GET_SYMBOL. Аргумент длина  -  адрес  целого  слова  со

  знаком, в которое процедура LIB$GET_SYMBOL записывает длину

  символа.


       Таблица

       Использование в МОС ВП: длинное слово (со знаком)

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки





                           - 273 -

                       00152-01 33 09-2


       Указатель  таблицы,  в  которой   содержится   символ.

  Аргумент таблица - адрес целого длинного слова со знаком, в

  которое  процедура  LIB$GET_SYMBOL   записывает   указатель

  таблицы.

       Возможные значения аргумента таблица описаны в

  табл. 20.

                                                   Таблица 20

  -----------------------------------------------------------

  Символьное имя       ! Значения !        Таблица

  -----------------------------------------------------------

  LIB$_CLI_LOCAL_SYM   !   1      ! Таблица локальных симво-

                       !          ! лов

  LIB$K_CLI_GLOBAL_SYM !   2      ! Таблица глобальных симво-

                       !          ! лов



       LIB$K_CLI_LOCAL_SYM и LIB$K_CLI_GLOBAL_SYM  определены

  в  символьной  библиотеке  (макро  или  модуле   с   именем

  $LIBCLIDEF) и как глобальные символы.


       Описание.

       Процедура  LIB$GET_SYMBOL  сначала   разыскивает   имя

  символа в таблице локальных символов,  а  затем  в  таблице

  глобальных символов. Перед возвращением  цифровые  значения

  преобразуются в код КОИ-8.

       Если образ задачи выполняется, просто  как  подпроцесс

  или как  отсоединенный  процесс,  то  для  выполнения  этой

  функции не существует интерпретатора  командного  языка.  В

  этом  случае  процедура  LIB$GET_SYMBOL  выдает   состояние



                           - 274 -

                       00152-01 33 09-2


  ошибки LIB$_NOCLI.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRTRU

       - процедура успешно  завершена,  но  строка  элементов

         усечена. Результирующая строка  элементов  не  может

         содержать все символы;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка. Эта ошибка указывает

         на внутреннюю ошибку в исполнительной библиотеке;

  LIB$_INSCLIMEM

       - недостаточно памяти. Интерпретатор командного  языка

         не  смог  получить  достаточный  об'ем   виртуальной

         памяти  для  выполнения  функции.  Это  может   быть

         связано с тем, что задано  слишком  много  символов.

         Удалив несколько определений  символов  можно  попы-

         таться исправить ситуацию;

  LIB$_INVSTRDES

       - неверный дескриптор строки. Дескриптор строки  имеет

         неверное значение в поле DSC$B_CLASS;

  LIB$_INSYIRMEM

       - недостаточная    виртуальная    память.    Программа

         превысила допустимую квоту виртуальной памяти;

  LIB$_INVSYMNAM

       - неверное символьное  имя.  Символьное  имя  содержит

         больше 255 символов или оно не  начинается  с  буквы



                           - 275 -

                       00152-01 33 09-2


         или знака денежной единицы ($);

  LIB$_NOCLI

       - отсутствует    интерпретатор    командного    языка.

         Вызывающий   процесс   не    имеет    интерпретатора

         командного языка для  выполнения  этой  функции  или

         интерпретатор  командного  языка   не   работает   с

         требуемым типом. Выполнение образа  как  подпроцесса

         или   как   отсоединенного   процесса    не    имеет

         интерпретатора командного языка;

  LIB$_NOSUCHSYM

       - нет такого символа. Этот символ не  определен  ни  в

         таблице локальных, ни в таблице глобальных символов;

  LIB$_UNECLIERR

       - непредвиденная  ошибка   интерпретатора   командного

         языка.   Эта   ошибка   может   быть    связана    с

         использованием     нестандартного     интерпретатора

         командного языка.



       1.63. LIB$GET_VM  -  размещение   виртуальной

             памяти

                              
       Процедура  LIB$GET_VM  размещает  заданное  количество

  смежных  байтов  в   программной   области   и   возвращает

  виртуальный адрес первого размещенного байта.











                           - 276 -

                       00152-01 33 09-2


       Формат:

       LIB$GET_VM  число байтов, базовый адрес

                   [, указатель зоны]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Число байтов

       Использование в МОС ВП: длинное слово со знаком

       Тип: длинное слово (со знаком)

       Доступ: только чтение

       Механизм:посредством ссылки

       Количество смежных байтов, которые размещает процедура

  LIB$GET_VM. Аргумент число байтов - адрес  целого  длинного

  слова, содержащего количество байтов. Процедура  LIB$GET_VM

  размещает количество памяти, достаточное для удовлетворения

  запроса. Программа  пользователя  не  должна  ссылаться  на

  адрес до того, как  будет  размещен  первый  байт  (базовый

  адрес) или после того, как размещен последний байт (базовый

  адрес плюс число байтов), поскольку  данная  область  может

  быть предназначена для другой процедуры. Значение аргумента

  число байтов должно быть больше 0.








                           - 277 -

                       00152-01 33 09-2


       Базовый адрес

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Первый виртуальный адрес с размещенным смежным  блоком

  байтов. Аргумент базовый адрес - адрес длинного  слова  без

  знака, содержащего начальный адрес.


       Указатель зоны

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Аргумент  указатель  зоны  -  адрес  длинного   слова,

  содержащего  идентификатор  зоны,   созданной   посредством

  вызова        процедур        LIB$CREATE_VM_ZONE        или

  LIB$CREATE_USER_VM_ZONE.  Данный  аргумент  необязательный.

  Если аргумент указатель зоны отсутствует, или, если длинное

  слово   содержит   значение,   равное   0,   по   умолчанию

  используется зона LIB$VM.


       Описание.

       Процедура   LIB$GET_VM   удовлетворяет    запрос    на

  размещение    посредством    многократного    использования

  свободной  памяти  в  зоне,   или   посредством   получения

  дополнительной   памяти   из   пула    страниц    процесса,

  управляемого процедурой LIB$GET_VM_PAGE.




                           - 278 -

                       00152-01 33 09-2


       Процедура  LIB$GET_VM  округляет  значение   аргумента

  число байтов до кратного размеру блока, заданному для зоны.

  Первый  размещенный  байт  ставится  на  границе,  заданной

  посредством выравнивания значения для зоны.

       Если,  при  создании  зоны,  задано   заполнение,   то

  процедура LIB$GET_VM  заполняет  каждый  размещенный  байт.

  Если заполнение зоны не определено, процедура LIB$GET_VM не

  инциализирует память и ее содержимое будет непредсказуемым.

       Вся память, размещенная процедурой  LIB$GET_VM,  может

  быть доступна пользователю  в  режиме  чтения/записи,  даже

  если вызов процедуры  LIB$GET_VM  осуществляется  из  более

  привилегированного режима доступа.

       Область,  распределенная  последовательными   вызовами

  процедуры LIB$GET_VM,  может  быть  несмежной,  так  как  в

  промежутках между вызовами другие процедуры  могут  вызвать

  процедуру   LIB$GET_VM.   Фактически,    если    происходит

  асинхронное системное прерывание, область может быть занята

  другой процедурой между выполнением любой пары операторов в

  программе.  Даже,   если   последующие   вызовы   процедуры

  LIB$GET_VM возвратят два смежных блока, можно не об'единять

  их в один большой блок, который будет  доступен  единичному

  вызову процедуры LIB$FREE_VM.

       Процедура LIB$GET_VM полностью реентерабельна, так как

  она может быть вызвана процедурами, выполняемыми на  уровне

  асинхронного системного  прерывания  или  в  мультизадачном

  окружении АДА.                     






                           - 279 -

                       00152-01 33 09-2


       Возращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память. Запрос  потребовал

         больше   динамической    памяти,    чем    разрешено

         операционной  системой.  В  этом  случае   частичное

         размещение не производится;

  LIB$_BADBLOSIZ

       - неверный  размер  блока.  Значение  аргумента  число

         байтов меньше или равно нулю;

  LIB$_BADBLOADR

       - неверный аргумент указатель зоны;

  LIB$_PAGLIMEXC

       - размещение превышает  максимально  допустимое  число

         страниц.



       1.64. LIB$GET_VM_PAGE  -  получение  страницы

             виртуальной памяти


       Процедура    LIB$GET_VM_PAGE    размещает     заданное

  количество смежных страниц памяти в программную  область  и

  возвращает виртуальный адрес первой размещенной страницы.


       Формат:

       LIB$GET_VM_PAGE   число страниц, базовый адрес








                           - 280 -

                       00152-01 33 09-2


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Число страниц

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество страниц. Аргумент  число  страниц  -  адрес

  целого длинного слова, которое задает количество  размещае-

  мых  страниц  (смежных).  Значение  аргумента  должна  быть

  больше нуля.


       Базовый адрес

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Адрес блока. Аргумент базовый адрес -  адрес  длинного

  слова, в котором устанавливается адрес первого байта  вновь

  размещенного блока страниц.










                           - 281 -

                       00152-01 33 09-2


       Описание.

       Процедура  LIB$GET_VM_PAGE  размещает  блоки   смежных

  (512-байтных)  страниц  в  программной  области.  Процедура

  LIB$GET_VM_PAGE управляет пулом процесса свободных страниц.

  Если нет достаточного количества смежных свободных страниц,

  удовлетворяющих запросу на  размещение,  то  дополнительные

  страницы    создаются    вызовом    программы    системного

  обслуживания  $EXPREG.  Страницы   памяти,   распределенные

  процедурой LIB$GET_VM_PAGE,  выравниваются  таким  образом,

  что младшие девять битов начального адреса будут нулевыми.

       Вся память, размещенная посредством  вызова  процедуры

  LIB$GET_VM_PAGE,   доступна    пользователям    в    режиме

  чтения/записи, даже если  вызов  процедуры  LIB$GET_VM_PAGE

  осуществляется из режима более привилегированного доступа.

       Содержимое  памяти  размещенной   посредством   вызова

  процедуры LIB$GET_VM_PAGE непредсказуемо.  Программа  может

  назначить значение для всех размещений.

       Процедура LIB$GET_VM_PAGE предназначена  для  запросов

  размером от страницы  до  нескольнких  сотен  страниц.  Для

  запросов очень больших размеров (более 1000 страниц за один

  вызов)   вызывается   программа   системного   обслуживания

  $EXPREG.

       Процедура  LIB$GET_VM_PAGE  полностью  реентерабельна,

  так как она может быть вызвана процедурами выполняемыми  на

  уровне   асинхронного   системного   прерывания    или    в

  мультизадачном окружении АДА.






                           - 282 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_BADBLOSIZ

       - значение аргумента число страниц  меньше  или  равно

         нулю;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память. Запрос  потребовал

         больше  динамической  памяти,  чем  было   разрешено

         операционной  системой  МОС  ВП.   В   этом   случае

         частичное размещение не производится.



       1.65. LIB$ICHAR - преобразовать первый символ

             строки в целое число


       Процедура LIB$ICHAR преобразует первый символ исходной

  строки  в  восьмибитовое  целое   число   в   коде   КОИ-8,

  расширенное до значения длинного слова.


       Формат:

       LIB$ICHAR   исходная строка


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Первый   символ   исходной   строки.    Этот    символ

  возвращается процедурой LIB$ICHAR как восьмибитовое  значе-



                           - 283 -

                       00152-01 33 09-2


  ние в коде  КОИ-8,  расширенное  до  длинного  слова.  Если

  исходная строка была нулевой длины, то процедура  LIB$ICHAR

  возвратит нуль.


       Аргументы:

       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная строка, первый символ  которой  преобразуется

  процедурой  LIB$ICHAR  в  целое  число.  Аргумент  исходная

  строка - адрес дескриптора с исходной строкой.


       Описание.

       Пользователи  языка  программирования  фортран   могут

  использовать вызов процедуры LIB$ICHAR, но более эффективно

  использование функции ICHAR языка программирования фортран,

  которая генерирует эквивалентный код.


       Возвращаемые значения состояния:

       отсутствуют                      


       Пример.

  РROGRAM ICHAR(INPUT, OUTPUT);

  (+)

  ( Данная программа  демонстрирует использование процедуры

  ( LIB$ICHAR для преобразования первого символа строки в

  ( целое число;




                           - 284 -

                       00152-01 33 09-2


  (-)

  FUNCTION LIB$ICHAR(SRCSTR : VARYING [A] OF CHAR) :

  INTEGER;

           EXTERN;

  (+)

  ( Oб'явление используемых переменных.

  (-)

  VAR

    CHARSTR     : VARYING [256] OF CHAR;

    RET_STATUS  : INTEGER;

  (+)

  ( Nачало основной программы. Чтение символьной

  ( строки, вызов процедуры LIB$ICHAR и печать результата.

  (-)

  BEGIN

     WRITELN('введите строку')

     READLN(CHARSTR);

     RET_STATUS := LIB$ICHAR(CHARSTR);

     WRITELN(RET_STATUS);

  END.

       Результат выполнения программы:

       $RUN ICHAR

       Введите строку:

       разбили чашку

           80








                           - 285 -

                       00152-01 33 09-2


       1.66. LIB$INDEX   -   индекс   относительного

             положения подстроки


       Процедура    LIB$INDEX    выдает    индекс,    который

  представляет   собой   относительное   положение    первого

  появления подстроки в исходной строке.


       Формат:

       LIB$INDEX  исходная строка, подстрока


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Относительная позиция первого символа подстроки,  если

  такая найдена, или нуль, если не найдена.


       Аргументы:

       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная  строка,  исследуемая  процедурой  LIB$INDEX.

  Аргумент исходная строка -  адрес  дескриптора  с  исходной

  строкой.








                           - 286 -

                       00152-01 33 09-2


       Подстрока

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Подстрока,  которая  должна  быть  найдена.   Аргумент

  подстрока - адрес дескриптора с подстрокой.


       Описание.

       Относительная позиция найденного символа, возвращаемая

  процедурой  LIB$INDEX,  нумеруется  1,  2,....,  N.   Таким

  образом нуль означает, что подстрока не была найдена.

       Если  подстрока  имеет  нулевую  длину,  то  процедура

  LIB$INDEX возвращает единицу, которая указывает на успешную

  операцию,  независимо  от  длины  исходной   строки.   Если

  исходная строка имеет нулевую длину, а подстрока  имеет  не

  нулевую длину, то возвращается нуль, который означает,  что

  подстрока не обнаружена.

       Пользователи  языка  программирования  фортран   могут

  использовать встроенную функцию $INDEX, вместо вызова  про-

  цедуры LIB$INDEX.


       Возвращаемые значения состояния:

       отсутствуют












                           - 287 -

                       00152-01 33 09-2


       1.67. LIB$INIT_TIMER - инициализация  времени

             и счетчика


       Процедура LIB$INIT_TIMER  сохраняет  текущее  значение

  заданного  времени   и   счетчика   для   последующего   их

  использования      процедурами      LIB$SHOW_TIMER      или

  LIB$STAT_TIMER.


       Формат:

       LIB$INIT_TIMER  [адрес блока управления]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Адрес блока управления

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Указатель блока управления, в котором будут  храниться

  значения  времени  и   счетчика.   Аргумент   адрес   блока

  управления содержит адрес длинного слова без знака, которое

  является указателем. При вызове  процедуры  LIB$INIT_TIMER,

  аргумент адрес блока управления  используется,  если  нужно

  сохранить несколько характеристик одновременно:




                           - 288 -

                       00152-01 33 09-2


       1) если аргумент адрес блока  управления  отсутствует,

  то управляющий блок размещается в статической памяти.  Этот

  метод не является реентерабельным;

       2) если аргумент адрес блока управления равен нулю, то

  управляющий  блок   размещается   в   динамической   памяти

  (неупорядоченный). Значения времени и счетчика  хранятся  в

  этом блоке, а адрес блока  размещается  в  аргументе  адрес

  блока   управления.   Этот   метод    является    полностью

  реентерабельным и модульным;

       3) если аргумент адрес блока управления не нулевой, то

  он рассматривается  как  адрес  управляющего  блока,  ранее

  размещенного  вызовом  процедуры  LIB$INIT_TIMER.  В   этом

  случае, управляющий блок используется  повторно  и  в  него

  заносятся на хранение новые данные времени и счетчика.


       Описание.

       Процедура LIB$INIT_TIMER заносит на  хранение  текущие

  значения времени и счетчика и размещает их в одном из  трех

  мест,  определенных   значением   аргумента   адрес   блока

  управления.

       Если в процедуре LIB$INIT_TIMER задан  аргумент  адрес

  блока управления, то для освобождения всей  неупорядоченной

  памяти необходим вызов процедуры LIB$FREE_TIMER.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;






                           - 289 -

                       00152-01 33 09-2


  LIB$_INVARG

       - неверный аргумент; аргумент адрес  блока  управления

         не равен нулю, а блок, к которому  он  ссылается  не

         был инициализирован при предыдущем вызове  процедуры

         LIB$INIT_TIMER;

  LIB$_INSVIRMEM

       - аргумент  адрес  блока  управления  равен  нулю,   и

         недостаточно виртуальной памяти для размещения блока

         памяти.



       1.68. LIB$INSERT_TREE -  добавление  входа  в

             сбалансированное двоичное дерево


       Процедура    LIB$INSERT_TREE    добавляет    узел    в

  сбалансированное двоичное дерево.


       Формат:

       LIB$INSERT_TREE  заголовок дерева, символьный ключ,

                        флаги, процедура сравнения,

                        процедура размещения, узел

                        [, данные пользователя]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством значения







                           - 290 -

                       00152-01 33 09-2


       Аргументы:

       Заголовок дерева

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Заголовок для  двоичного  дерева.  Аргумент  заголовок

  дерева  -  адрес  длинного  слова,  которое  является  этим

  заголовком дерева.


       Символьный ключ

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Ключ,   который   должен   быть   вставлен.   Аргумент

  символьный ключ - адрес дескриптора с символьным ключом.


       Флаги

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Управляющие флаги. Аргумент флаги - адреса управляющих

  флагов. В данный момент используется только нулевой бит.  В

  табл. 21 описаны управляющие флаги.








                           - 291 -

                       00152-01 33 09-2


                                                   Таблица 21

  -----------------------------------------------------------

      Бит  !                  Описание

  -----------------------------------------------------------

     1     ! Если установлен, то добавляются дублированные

           ! входы

     0     ! Если очищен, то выдается адрес существующего

           ! дублированного входа


       Процедура сравнения

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Заданная пользователем  процедура  сравнения,  которую

  процедура LIB$INSERT_TREE вызывает для сравнения символа  с

  узлом. Аргумент процедура сравнения  -  адрес  маски  входа

  процедуры сравнения. Аргумент процедура сравнения - необхо-

  димый аргумент; процедура LIB$INSERT_TREE  всегда  вызывает

  процедуру  сравнения.  Значение,  возвращаемое   процедурой

  сравнения, определяет зависимость между значением  ключа  и

  узлом.


       Процедура размещения

       Использование в МОС ВП: процедура

       Тип:  маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.




                           - 292 -

                       00152-01 33 09-2


       Заданная пользователем процедура  размещения,  которую

  процедура   LIB$INSERT_TREE   вызывает    при    размещении

  виртуальной памяти для узла. Аргумент процедура  размещения

  - адрес  маски   входа   процедуры   размещения.   Аргумент

  процедура  размещения  обязательный   аргумент;   процедура

  LIB$INSERT_TREE всегда вызывает процедуру размещения.


       Узел

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Адрес позиции, в которую вставлен новый ключ. Аргумент

  узел - адрес длинного слова  без  знака,  которое  является

  новым размещением узла.


       Данные пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: неопределенный

       Механизм: неопределенный

       Данные пользователя, которые процедура LIB$INSERT_TREE

  передает процедурам сравнения и размещения. Аргумент данные

  пользователя необязательный аргумент.


       Описание.

       Данное описание состоит из трех частей:

       1)    руководство    по    использованию     процедуры

  LIB$INSERT_TREE;



                           - 293 -

                       00152-01 33 09-2


       2) формат вызова процедуры сравнения;

       3) формат вызова процедуры размещения.


       Руководство      по      использованию       процедуры

  LIB$INSERT_TREE.

       Процедура    LIB$INSERT_TREE    вставляет    узел    в

  сбалансированное двоичное дерево. Задаются  две  процедуры:

  процедура  сравнения  и  процедура  размещения.   Процедура

  сравнения сравнивает символьный ключ с узлом,  а  процедура

  размещения  распределяет  виртуальную  память   для   узла,

  который  вставляется.  Сначала  процедура   LIB$INSERT_TREE

  вызывает процедуру сравнения для  определения  места,  куда

  вставляется новый  узел.  Затем  процедура  LIB$INSERT_TREE

  вызывает процедуру размещения  для  размещения  памяти  для

  нового узла. Пользователь может  вставить  данные  в  новый

  узел путем инициализации их  внутри  процедуры  размещения,

  сразу после размещения памяти.

       Передать данные, которые вставляются  в  дерево  можно

  используя один аргумент символьный ключ или  оба  аргумента

  символьный ключ и данные пользователя. Аргумент  символьный

  ключ обязательный  аргумент.  Он  содержит  все  данные,  а

  именно имя узла или адрес данных. Если аргумент  символьный

  ключ используется для передачи непосредственно имени  узла,

  необходимо использовать аргумент  данные  пользователя  для

  передачи остальных  данных,  которые  вставляются  в  новый

  узел.







                           - 294 -

                       00152-01 33 09-2


       Формат вызова процедуры сравнения.


       Процедура сравнения символьный ключ,

       Заголовок дерева [, данные пользователя]

       Процедура    LIB$INSERT_TREE    передает     аргументы

  символьный ключ и  заголовок  дерева  процедуре  сравнения,

  используя тот же механизм передачи, который был использован

  при передаче их процедуре LIB$INSERT_TREE. Аргумент  данные

  пользователя   передается   тем   же   способом,   но    он

  необязателен.

       В вызове процедуры LIB$INSERT_TREE аргумент  процедура

  сравнения  задает  процедуру  сравнения.  Это  обязательный

  аргумент.

       Значение, возвращаемое процедурой сравнения,  является

  результатом сравнения символьного ключа с текущим узлом.  В

  табл.  22  приведены   возможные   значения,   возвращаемые

  процедурой сравнения.

                                                   Таблица 22

  -----------------------------------------------------------

  Значение      !              Описание

  -----------------------------------------------------------

  Отрицательное ! Аргумент символьный ключ меньше, чем

                ! текущее значение узла

  Нуль          ! Аргумент символьный ключ равен текущему

                ! значению узла

  Положительное ! Аргумент символьный ключ больше, чем

                ! текущее значение узла





                           - 295 -

                       00152-01 33 09-2


       Пример.

  FUNCTION LONG COMPARE_NODE (                     &

                             STRING    KEY_STRING, &

                             NODE_TYPE NODE,       &

                             LONG      DUMMY)

  !+

  ! Программа сравнивает строку KEY_STRING со строкой,

  ! содержащей данные узла NODE и возвращает значение нуль,

  ! если строки эквивалентны, -1, если KEYSTRING меньше

  ! NODE и 1, если KEY_STRING больше NODE.

  !-

       ОPTION TYPE = EXPLICIT

       RECORD NODE_TYPE

          BYTE    HEADER (9)      ! заголовок

          BYTE    LENGTH          ! длина

          STRING  техт = 80       ! строка

       ЕND RECORD NODE_TYPE

       DECLARE STRING NODE_STRING

  !+

  ! Возвращаемый результат сравнения.

  !-

       NODE_STRING = SEC$ (NODE::TEXT, 1, NODE::LENGTH)

       SELECT KEY_STRING

       СASE > NODE_STRING

          COMPARE_NODE = -1%

       СASE < NODE_STRING

          COMPARE_NODE = 1%




                           - 296 -

                       00152-01 33 09-2


       СASE ELSE

          COMPARE_NODE = 0%

       ЕND SELECT

  END FUNCTION

       Данная  программа  на  языке  программирования  БЕЙСИК

  демонстрирует заданную пользователем процедуру сравнения.


       Формат вызова процедуры размещения.


       Процедура    LIB$INSERT_TREE    вызывает     процедуру

  размещения для распределения виртуальной памяти  для  узла.

  Процедура размещения  затем  сохраняет  значение  аргумента

  данные пользователя в поле размещения узла.


       Формат вызова данной процедуры следующий:

        процедура размещения символьный ключ, новый узел

                             [, данные прользователя]

       Процедура   LIB$INSERT_TREE,    передавая    аргументы

  символьный ключ, новый узел и данные пользователя программе

  размещения, использует тот же  механизм  передачи,  который

  используется при  передаче  их  процедуре  LIB$INSERT_TREE.

  Использование данных пользователя не обязательно.

       Заголовок узла располагается в начале каждого узла. На

  рис. 3 показана структура заголовка узла:













                           - 297 -

                       00152-01 33 09-2



     +--------------------------------------+
     !        Левая связь                   !  (4 байта)
     +--------------------------------------+
     !        Правая связь                  !  (4 байта)
     +------------------+-------------------+
                        !  Зарезервировано  !  (2 байта)
                        +-------------------+


                            Рис. 3


       Любой узел, о котором об'явлено, что он обрабатывается

  с помощью процедуры  LIB$INSERT_TREE  должен  содержать  10

  зарезервированных байтов,  в  начале  для  заголовка  узла.

  Структура узла будет зависеть от того, как размещены данные

  пользователя.  Данные  можно  разместить  одним   из   двух

  способов:

       1) данные следуют непосредственно за заголовком  узла.

  В этом случае, программа размещения должна разместить  блок

  равный по размеру сумме данных плюс 10 байтов для заголовка

  узла.

       Этот способ показан на рис. 4.



       +---------------------------------------+
       !                Левая связь            ! (4 байта)
       +---------------------------------------+
       !                Правая связь           ! (4 байта)
       +--------------------+------------------+
       !     Данные         ! Зарезервировано  ! (2 байта)
       !                    +------------------+
       !           Пользователя                !(переменная)
       +---------------------------------------+


                            Рис. 4


       2) узел  содержит  10  байтов  для  заголовка  узла  и

  длинное слово, задающее данные пользователя.



                           - 298 -

                       00152-01 33 09-2


       Этот способ показан на рис. 5.


       +---------------------------------+
       !          Левая связь            ! (4 байта)
       +---------------------------------+
       !          Правая связь           ! (4 байта)
       +---------------------------------+ (зарезервировано
       !    Адрес       ! Зарезервировано! = 2 байта)
       !    данных      !                ! (адреса данных
       +---------------------------------+ = 2 байта)


                            Рис. 5


       Аргумент  процедура  размещения  в  вызове   процедуры

  LIB$INSERT_TREE   задает   процедуру   размещения.   Данный

  аргумент - обязательный. Процедура  LIB$INSERT_TREE  всегда

  вызывает процедуру размещения.


       Пример.

  FUNCTION LONG ALLOC_NODE (                   &

                            STRING KEY_STRING, &

                            LONG   RET_ADDR,   &

                            LONG   DUMMY)

  !+

  ! Размещение виртуальной памяти для нового узла.

  ! KEY_STRING - дескриптор строки, вновь введенные и

  ! размещенный узел RET_ADDR содержит адрес размещенной

  ! памяти.

  !-

       ОPTION TYPE = EXPLICIT

       DECLARE LONG STATUS_CODE

       ЕXTERNAL LONG FUNCTION LIB$GET_VM

       ЕXTERNAL SUB LIB$MOVC3



                           - 299 -

                       00152-01 33 09-2


  !+

  ! Размещенный узел: 10 для заголовка, 1 для длины плюс

  ! длина строки.

  !-

       STATUS_CODE = LIB$GET_VM (10% + LEN (KEY_STRING) + 1%,

                                 RET_ADDR)

       СALL LIB$STOP (STATUS_CODE)    IF (STATUS_CODE AND 1%)

                                      <> 1%

  !+

  ! Сохранить длину строки ключа в байте - 11 узла.

  ! Отметим, что процедура LIB$MOVCS принимает аргументы

  ! посредством ссылки.

  !-

       СALL LIB$MOVC3 (1%, LEN (KEY_STRING).

                      (RET_ADDR + 10%) BY VALUE)

  !+

  ! Сохранить ключ в байтах 12: N узла.

  !-

       СALL LIB$MOVC3 (LEN (KEY_STRING), KEY_STRING BY REF, &

                      (RET_ADDR + 11%) BY VALUE)

       АLLOC_NODE = 1%

  END FUNCTION


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_KEYALRINS

       - процедура успешно завершена, но ключ  был  найден  в



                           - 300 -

                       00152-01 33 09-2


         дереве. Новый ключ не введен;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память.  Вызов  LIB$GET_VM

         не  может   быть   осуществлен   из-за   того,   что

         виртуальная   память,    запрашиваемая    программой

         превышает квоту процесса (PGFLQUOTA)  или  системный

         параметр VIRTUALPAGCNT.



       1.69. LIB$INSQHI  -  помещение   элемента   в

             начало очереди


       Процедура  LIB$INSQHI  добавляет  элемент   в   начало

  заданной циклической очереди. Процедура  LIB$INSQHI  анало-

  гична инструкции INSQHI системы МОС ВП.


       Формат:

       LIB$INSQHI точка входа, заголовок [, число повторений]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Точка входа

       Использование МОС ВП: квадрослово со знаком

       Тип: целое квадрослово (со знаком)

       Доступ: модификация




                           - 301 -

                       00152-01 33 09-2


       Механизм: посредством ссылки, ссылки на массив.

       Элемент, который  вставляется  процедурой  LIB$INSQHI.

  Аргумент точка входа  содержит  адрес  массива  выровненных

  квадрослов со знаком, который должен быть  в  длину  меньше

  восьми байтов. Байты, следующие за первыми восемью байтами,

  могут быть использованы  вызывающей  программой  для  любой

  цели.


       Заголовок

       Использование в МОС ВП:  квадрослово со знаком

       Тип: целое  квадрослово (со знаком)

       Доступ: модификация

       Механизм: посредством ссылки

       Заголовок   очереди,   задающий   в   какую    очередь

  добавляется вход. Аргумент заголовок содержит адрес  целого

  выровненного  квадрослова  со  знаком.  Аргумент  заголовок

  должен быть установлен в нуль перед  первым  использованием

  очереди; нуль означает пустую очередь.


       Число повторений

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество  повторных  попыток  добавления,  в  случае

  ошибки при  использовании  разделяемой  памяти  процессора.

  Аргумент число повторений - адрес длинного слова без знака,

  которое содержит значение  счетчика  повторений.  Если  это




                           - 302 -

                       00152-01 33 09-2


  значение равно единице, то  повторений  нет.  По  умолчанию

  принимается значение равное 10.


       Описание.

       Очередь, в которую процедура LIB$INSQHI добавляет вход

  может находиться в личной памяти  процесса,  личной  памяти

  процессора или в разделяемой памяти процессора для поддерж-

  ки  очередей  в  процессах,  процессорах  или  параллельных

  процессорах.

       Очередь  -  это  список  с  двумя  связями.  Процедуры

  исполнительной   библиотеки   задают    элементы    очереди

  посредством их адресов. Два длинных слова, начальная  связь

  и  конечная  связь  определяют   размещение   элемента   по

  отношению к предшествующим и последующим элементам.

       Циклическая очередь - это  очередь,  в  которой  связи

  между элементами определяются смещениями; два длинных слова

  представляют смещение предшествующего и  последующего  эле-

  ментов по отношению к  текущему.  Команды  INSQHI,  INSQTI,

  REMQHI и  REMOTI  системы  мос  вп  позволяют  добавлять  и

  исключать элементы в начало или конец циклической  очереди.

  Каждая команда очереди передается соответствующей процедуре

  исполнительной библиотеки.

       Команды циклической очереди  блокированы  и  не  могут

  быть прерваны, поэтомы другие процессы  не  могут  вставить

  или  удалить  элементы  очереди  в  то  время,  когда   это

  выполняет текущая программа. Так как эта  операция  требует

  одновременного изменения двух указателей, то она  не  может

  выполняться языками программирования  высокого  уровня  без



                           - 303 -

                       00152-01 33 09-2


  вызова процедур доступа к очереди испонительной библиотеки.

       Когда используются эти процедуры, совместные  процессы

  могут связываться без дальнейшей синхронизации и без боязни

  быть прерванными или единичным процессором или в  многопро-

  цессорной среде. Процедуры доступа к очереди также  исполь-

  зуются и в среде асинхронного  системного  прерывания,  они

  позволяют добавлять или убирать  элементы  из  очереди  без

  опасности   быть   прерванными   посредством   асинхронного

  системного прерывания.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура  успешно  завершена.  Элемент  добавлен  в

         начало очереди, а  результирующая  очередь  содержит

         более одного элемента;

  LIB$_ONEENTQUE

       - процедура  успешно  завершена.  Элемент  добавлен  в

         начало очереди, но результирующая  очередь  содержит

         один элемент;

  LIB$_SECINTFAI

       - повторная попытка была неудачной. Счетчик повторений

         превысил  значение   аргумента   число   повторений.

         Очередь не изменена. Это состояние может  возникнуть

         только в  том  случае,  когда  очередь  находится  в

         памяти,   разделенной   между   двумя   или    более

         процессорами.







                           - 304 -

                       00152-01 33 09-2


       1.70. LIB$INSQTI - помещение элемента в конец

             очереди


       Процедура  LIB$INSQTI  вставляет   элемент   в   конец

  заданной циклической очереди. Процедура  LIB$INSQTI  анало-

  гична инструкции INSQTI$ системы МОС ВП.


       Формат:

       LIB$INSQTI  точка входа, заголовок

                   [, число повторений]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Точка входа

       Использование в МОС ВП: квадрослово со знаком

       Тип: целое квадрослово (со знаком)

       Доступ: модификация

       Механизм: посредством ссылки, ссылки на массив.

       Элемент, который  вставляется  процедурой  LIB$INSQTI.

  Аргумент точка входа  содержит  адрес  массива  выравненных

  квадрослов, со знаком, который должен быть в  длину  меньше

  восьми байтов. Байты, следующие за первыми  восемью,  могут

  быть использованы вызывающей программой для любой цели.






                           - 305 -

                       00152-01 33 09-2


       Заголовок

       Использование в МОС ВП: квадрослово со знаком

       Тип: целое квадрослово (со знаком)

       Доступ: модификация

       Механизм: посредством ссылки

       Заголовок  очереди,  в  которую  вставляется  элемент.

  Аргумент  заголовок  содержит  адрес  целого   выравненного

  квадрослова  со  знаком.  Аргумент  заголовок  должен  быть

  установлен  в  нуль  первым  использованием  очереди;  нуль

  означает пустую очередь.


       Число повторений

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество повторных попыток  добавления  элемента,  в

  случае  ошибки,  при   использовании   разделяемой   памяти

  процессора. Аргумент  число  повторений  -  адрес  длинного

  слова  без  знака,  которое  содержит   значение   счетчика

  повторений. Если это значение равно единице, то  повторений

  нет. По умолчанию принимается значение равное 10.


       Описание.

       Очередь, в которую процедура LIB$INSQTI вставляет эле-

  мент может находится в личной памяти процесса, личной памя-

  ти процессора или разделяемой памяти  процессора  для  под-

  держки очередей в процессах, процессорах  или  параллельных




                           - 306 -

                       00152-01 33 09-2


  процессорах.

       Очередь  -  это  список  с  двумя  связями.  Процедуры

  исполнительной   библиотеки   задают    элементы    очереди

  посредством их адресов. Два длинных слова, начальная  связь

  и  конечная  связь  определяют   размещение   элемента   по

  отношению к предшествующим и последующим элементам.

       Циклическая очередь - очередь, в которой  связи  между

  элементами  определяются  смещением:  два   длинных   слова

  представляют смещение предшествующего и  последующего  эле-

  ментов по отношению к текущему  элементу.  Команды  INSQHI,

  INSQTI, REMQHI, REMQTI системы МОС ВП позволяют добавлять и

  исключать  элементы  в  начало  или  в  конец   циклической

  очереди. Каждая команда очереди передается  соответствующей

  процедуре исполнительной библиотеки.

       Команды циклической очереди  блокированы  и  не  могут

  быть прерваны, поэтому другие процессы не  могут  вставлять

  или  удалять  элементы  очереди  в  то  время,  когда   это

  выполняет текущая программа. Так как эта  операция  требует

  одновременного изменения двух указателей, то  эта  операция

  не  может  выполняться  языками  программирования  высокого

  уровня без вызова процедур доступа к очереди исполнительной

  библиотеки.

       Когда используются эти процедуры, совместные  процессы

  могут  связываться  без  дальнейшей  синхронизации  и   без

  опасности быть прерванными или единичным процессором или  в

  многопроцессорной среде. Процедуры доступа к очереди  также

  используются в среде  асинхронного  системного  прерывания,




                           - 307 -

                       00152-01 33 09-2


  они позволяют добавлять или убирать элементы из очереди без

  опасности   быть   прерванными   посредством   асинхронного

  системного прерывания.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура  успешно  завершена.  Элемент  добавлен  в

         конец очереди,  а  результирующая  очередь  содержит

         более одного элемента;

  LIB$_ONEENTQUE

       - процедура успешно завершена. Элемент был добавлен  в

         конец очереди, но  результирующая  очередь  содержит

         один элемент;

  LIB$_SECINTFAI

       - повторная попытка была  неудачной  такое  количество

         раз подряд, которое  содержится  в  аргументе  число

         повторений. Очередь не изменена. Это состояние может

         возникнуть  только  в  том  случае,  когда   очередь

         находится в  памяти,  разделенной  между  двумя  или

         более процессорами.



       1.71. LIB$INSV  -   добавить   битовое   поле

             переменной длины


       Процедура LIB$INSV заменяет  битовое  поле  переменной

  длины, заданное аргументами основание, положение и  размер,

  битами от 0 до  значения  [размер-1]  исходного  аргумента.

  Если  размер  битового  поля  равен  нулю,  то  ничего   не




                           - 308 -

                       00152-01 33 09-2


  добавляется. Процедура LIB$INSV выполняет инструкцию  INSV,

  как вызываемую процедуру.


       Формат:

       LIB$INSV   исходный аргумент, положение, размер,

                  основание


       Код возврата:

       Отсутствует


       Аргументы:

       Исходный аргумент

       Использование в МОС ВП: длинное слово со знаком

       Тип:  целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Исходное   поле,   которое   добавляется    процедурой

  LIB$INSV. Аргумент исходное поле -  адрес  целого  длинного

  слова, содержащего исходное поле.


       Положение

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Положение  бита  относительно   базового   адреса,   с

  которого   начинается   добавление   исходного   аргумента.

  Аргумент  положение  -   адрес   целого   длинного   слова,

  содержащего относительное положение бита.




                           - 309 -

                       00152-01 33 09-2


       Размер

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Размер битового поля, которое  добавляется  процедурой

  LIB$INSV.  Аргумент  размер  -  адрес  байта   без   знака,

  содержащего размер битового поля.  Максимальный  размер  32

  бита.


       Основание

       Использование в МОС ВП: адрес

       Тип: выровненная битовая строка

       Доступ: только запись

       Механизм: посредством ссылки

       Поле, в которое процедура LIB$INSV добавляет  исходное

  поле. Аргумент основание содержит базовый адрес выровненной

  битовой строки.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_ROPRAND

       - ошибка зарезервированного операнда, которая выдается

         в случае, если задан размер больше 32.










                           - 310 -

                       00152-01 33 09-2


       Пример 1.

       INTEGER*4 COND_VALUE

       СALL LIB$INSV (4, 0, 3, COND_VALUE)

       В данной программе на языке  программирования  фортран

  биты  с  0  до  2  длинного  слова  COND_VALUE   заменяются

  значением 4.


       Пример 2.

       DECLARE INTEGER COND_VALUE

       СALL LIB$INSV (4%, 0%, 3%, COND_VALUE)

       В данной программе на  языке  программирования  бейсик

  биты с 0 до 2 длинного слова COND_VALUE  заменяются  значе-

  нием 4.



       1.72. LIB$INT_OVER       -        обнаружение

             целочисленного переполнения


       Процедура   LIB$INT_OVER   разрешает   или   запрещает

  обнаружение  целочисленного  переполнения  для  активизации

  вызываемой процедуры. Возвращается предыдущее целочисленное

  переполнение, разрешающее установку.


       Формат:

       LIB$INT_OVER  новая установка


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись




                           - 311 -

                       00152-01 33 09-2


       Механизм: посредством значения

       Старая    установка,     разрешающая     целочисленное

  переполнение (предыдущее  содержимое  SF$W_PSW[PSW$V_IV]  в

  вызываемом кадре).


       Аргументы:

       Новая установка

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Новая     установка,     разрешающая     целочисленное

  переполнение. Аргумент новая установка -  адрес  байта  без

  знака,    содержащего    новую    установку,    разрешающую

  целочисленное переполнение. Если бит 0 установлен в  1  это

  означает, что разрешено  целочисленное  переполнение,  если

  бит 0 очищен (нулевой), то целочисленное переполнение  зап-

  рещено.


       Описание.

       Процедура LIB$INT_OVER изменяет вызываемый кадр стека.

       Процедура LIB$INT_OVER влияет  только  на  активизацию

  текущей процедуры и не влияет на  любую  из  вызывающих  ее

  программ или любую процедуру, которую  она  может  вызвать.

  Однако,  установки  остаются  действительными   для   любых

  процедур, которые вводятся через точку входа JSB.








                           - 312 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

       Отсутствуют


       Пример.

  INTOVF: PROCEDURE OPTIONS (MAIN);

  DECLARE LIB$INT_OVER ENTRY

  (FIXED BINARY (7))            /* адрес байта для

                                /* разрешения/запрещения

                                /* установки             */

  RETURNS (FIXED BINARY (31));  /* старая установка      */

  DECLARE  DISABLE FIXED BINARY (7) INITIAL (0) STATIC

                         READONLY;

  DECLARE (А, В) FIXED BINARY (7);

  ON FIXEDOVERFLOW PUT SKIP LIST ('переполнение')

  А = 127;     

  В = А + 2;

  PUT LIST ('в основном');

          BEGIN;

          DECLARE RESULT FIXED BINARY (31);

  /* Запрещено распознование целочисленного переполнения */

  /* в этом блоке                                        */

          RESULT = LIB$INT_OVER (DISABLE);

          В = А + 2;

          PUT SKIP LIST ('в начале блока')

          CALL Q;

                  Q: PROCEDURE;

                  В = А + 2;

                  PUT LIST ('в Q')



                           - 313 -

                       00152-01 33 09-2


                  END Q;

          END /* начало */

  END INTOVF

       Данная  программа  на  языке   программирования   ПЛ/1

  демонстрирует  использование  процедуры  LIB$INT_OVER   для

  разрешения  или   запрещения   обнаружения   целочисленного

  переполнения. В языке программирования  ПЛ/1  целочисленное

  переполнение разрешено всегда, если только оно не испорчено

  вызовом этой программы. Однако,  запрещение  целочисленного

  переполнения  осуществляется  только  для  блока,   который

  вызывается данной процедурой; другие блоки не изменяются.

       Результат выполнения программы:

       В основном

       В начале блока

       Переполнение   в Q



       1.73. LIB$LEN -  длина  строки,  возвращаемая

             как значение длинного слова


       Процедура LIB$LEN возвращает длину строки.


       Формат:

       LIB$LEN   строка


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения



                           - 314 -

                       00152-01 33 09-2


       Длина исходной строки, выделенной и дополненной нулями

  до 32 битов.


       Аргументы:

       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная строка, длина которой возвращается процедурой

  LIB$LEN.  Аргумент  строка  содержит  адрес  дескриптора  с

  исходной строкой.


       Описание.

       Максимальная длина строки МОС ВП 65,535 символов.

       Функция LEN, присущая языкам программирования бейсик и

  фортран,   во   время   работы   генерирует   эквивалентный

  последовательный код. Поэтому пользователям языков програм-

  мирования фортран и бейсик лучше использовать  функцию  LEN

  вместо процедуры LIB$LEN.

       Если необходимо получить одновременно длину  строки  и

  адрес  ее  первого  байта,  лучше  использовать   процедуру

  LIB$ANALYZE_SDESC.


       Возвращемые значения состояния:

       Отсутствуют









                           - 315 -

                       00152-01 33 09-2


       1.74. LIB$LOCC - обнаружение символа


       Процедура LIB$LOCC отыскивает символ  в  строке  путем

  сравнения  последовательных  байтов  в  строке  с  заданным

  символом. Поиск продолжается до тех пор, пока  все  символы

  не будут проверены. Процедура LIB$LOCC выполняет инструкцию

  LOCC системы МОС ВП как вызываемую процедуру.


       Формат:

       LIB$LOCC символьная строка, исходная строка


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Относительное положение первого эквивалентного символа

  относительно начала исходной строки или нуль, если  таковой

  не найден.


       Аргументы:

       Символьная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка, первый символ которой используется  процедурой

  LIB$LOCC для поиска. Аргумент  символьная  строка  содержит

  адрес дескриптора с этой строкой. Используется только  пер-




                           - 316 -

                       00152-01 33 09-2


  вый символ аргумента символьная строка, а его длина не про-

  веряется.


       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка,  в  которой  производится   поиск   процедурой

  LIB$LOCC. Аргумент исходная строка -  адрес  дескриптора  с

  символьной строкой.


       Описание.

       Процедура   LIB$LOCC   возвращает   позицию    первого

  эквивалентного символа относительно начала исходной  строки

  в виде индекса.  Индекс  -  относительная  позиция  первого

  обнаружения подстроки в исходной  строке.  Если  символ  не

  обнаружен, или если строка имела нулевую длину, то выдается

  нуль.


       Возвращаемые значения состояния:

       Отсутствуют



       1.75. LIB$LOOKUP_KEY - поиск ключевого  слова

             в таблице


       Процедура   LIB$LOOKUP_KEY    просматривает    таблицу

  ключевых слов,  чтобы  найти  одно,  которое  соответствует

  ключевому  слову  или  сокращению,   заданному   аргументом




                           - 317 -

                       00152-01 33 09-2


  исходная строка.


       Формат:

       LIB$LOOKUP_KEY   исходная строка, таблица

                        [, ключевое слово] [, соответствие]

                        [, длина]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка,   для   которой    процедура    LIB$LOOKUP_KEY

  осущетвляет  поиск  в  таблице  ключевых   слов.   Аргумент

  исходная строка - адрес дескриптора с этой строкой.


       Таблица

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Таблица ключевых слов. Аргумент таблица содержит адрес




                           - 318 -

                       00152-01 33 09-2


  массива длинных слов без знака, который является этой  таб-

  лицей ключевых слов.


       Ключевое слово

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Значение  ключевого   слова,   найденного   процедурой

  LIB$LOOKUP_KEY.  Аргумент  ключевое  слово  содержит  адрес

  длинного слова без знака с этим значением ключевого  слова.

  Процедура LIB$LOOKUP_KEY записывает  адрес  длинного  слова

  без знака, содержащего значение ключевого слова в  аргумент

  ключевое слово.


       Соответствие

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Значение, полностью соответствующее  ключевому  слову.

  Аргумент соответствие  содержит  адрес  дескриптора  строки

  ключевого слова. Процедура LIB$LOOKUP_KEY записывает  адрес

  дескриптора  в  аргумент  соответствие,  если   установлено

  полное соответствие ключевого слова.










                           - 319 -

                       00152-01 33 09-2


       Длина

       Использование в МОС ВП: слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Количество  символов  в  ключевом  слове,  не   считая

  заполнений. Аргумент длина - адрес целого слова со  знаком,

  содержащего количество символов ключевого слова.  Процедура

  LIB$LOOKUP_KEY  записывает  адрес  этого  целого  слова  со

  знаком в аргумент длина.


       Описание.

       Процедура  LIB$LOOKUP_KEY  предназначена  для   помощи

  программистам в написании обслуживающих  программ,  имеющих

  командные квалификаторы со значениями.

       Процедура  LIB$LOOKUP_KEY  отыскивает  соответствующее

  ключевое  слово  или  сокращение  ключевого  слова,   путем

  сравнения первых символов ключевого слова из таблицы ключе-

  вых слов с исходной строкой, где N - длина исходной строки.

       Когда ключевое  слово  найдено,  вызывающей  программе

  возвращается следующая информация:

       1)    значение    длинного    слова,    связанное    с

  соответствующим ключевым словом;

       2)  полная  строка  ключевого   слова   (любого   типа

  дескриптора).

       Точное соответствие обнаруживается в том случае,  если

  длина ключевого слова, равна длине заданной строки.





                           - 320 -

                       00152-01 33 09-2


       Если обнаружено точно соответствующее ключевое  слово,

  то  дальнейшая   обработка   прекращается,   а   вызывающей

  программе  возвращается  нормальное  возвращаемое  значение

  состояния.   Иначе,   после    обнаружения    соответствия,

  выполняется просмотр остальной части таблицы ключевых слов.

  Если   обнаруживается   дополнительное   соответствие,   то

  вызывающей  программе   возвращается   значение   состояния

  LIB$AMBKEY. Если таблица ключевых  слов  содержит  ключевое

  слово, которое является сокращением другого ключевого слова

  из этой таблицы, то точное соответствие обнаруживается  для

  коротких сокращений.

       На рис. 6 приведена структура таблицы  ключевых  слов,

  которую  вызывающая   программа   создает   для   процедуры

  LIB$LOOKUP_KEY.


               Таблица ключевых слов

           Вектор
  +----------------------------+
  !Вектор-счетчик              !
  +----------------------------+
  !Адрес строки ключевого слова!>>>>>>>>>>>>
  +----------------------------+           V
  !Значение, соответствующее   !           V
  !ключевому слову             !           V
  +----------------------------+     Строка ключевого слова
  !                            !   +------------------------+
  !                            !   !Вычисленная строка КОИ-8!
  +----------------------------+   +------------------------+

                            Рис. 6


       Вектор-счетчик - количество длинных слов, следующих за

  вектором-счетчиком.  Вычисленная  строка   в   коде   КОИ-8

  начинается с  байта,  который  представляет  собой  счетчик

  последующих за ним символов в коде КОИ-8.



                           - 321 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно  завершена.  Найдено  единственное

         соответствующее ключевое слово;

  LIB$_AMBKEY

       - найдено  несколько  соответствующих  ключевых  слов.

         Задано  недостаточное  количество  символов,   чтобы

         найти единственное соответствие;

  LIB_INVARG

       - неверный  аргумент,  не  хватает  аргументов   и/или

         плохая таблица ключевых слов;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память для возврата строки

         ключевого слова. Эта  ситуация  может  возникнуть  в

         случае,   если   аргумент   соответствие    является

         динамическои строкой;

  LIB$_STRTRU

       - строка оборвана;

  LIB$_UNRKEY

       - заданное ключевое слово не найдено в заданой таблице

         ключевых слов.


       Пример 1.

       КEYTABLE:

          $LIB_KEY_TABLE < -

                  <ADD, 1>, -

                  <DELETE, 2>, -

                  <EXIT, 3>>



                           - 322 -

                       00152-01 33 09-2


       Данная программа на языке  макроассемблера  определяет

  таблицу ключевых слов с  именем  KEYTABLE,  содержащую  три

  кючевых слова ADD, DELETE, EXIT со значениями ключевых слов

  1,2,3 соответственно.

       Макрокоманда  $LIB_KEY_TABLE  задана  по  умолчанию  в

  макробиблиотеке  SYS$LIBRARY:STARLET.MLB.   Так   как   эта

  библиотека  автоматически  разыскивается  ассемблером,   не

  нужно задавать ее в макрокоманде.


       Пример 2.

          РARAMETER (

         1        MAXKEYSIZE = 6     ! Максимальный размер

                                     ! ключевого слова

         2        NKEYS = 3)         ! Количество ключевых

                                     ! слов

          BYTE KEYWORDS (MAXKEYSIZE+1, NKEYS)

          INTEGER*4 KEYTABLE (0:NKEYS*2)

          DATA KEYWORDS /

         1        3,'A','D','D',' ', ' ',' '.! Строка 'ADD' в

                                             ! коде КОИ-8

         2        6,'D','E','L','E','T','E', ! Строка 'DELE-

                                             ! те' в коде

                                             ! КОИ-8

         3        4,'E','X','I','T',' ',' '/ ! Строка 'EXIT'

                                             ! в коде КОИ-8

          KEYTABLE(0) = NKEYS*2              ! Количество по-

                                             ! лученных длин-

                                             ! ных слов;



                           - 323 -

                       00152-01 33 09-2


          KEYTABLE(1) = %LOC(KEYWORDS(1,1))  ! Адрес строки

                                             ! ключевого сло-

                                             ! ва

          KEYTABLE(2) = 1                    ! Значение клю-

                                             ! чевого слова

                                             ! 'ADD'

          KEYTABLE(3) = %LOC(KEYWORDS(1,2))  ! Адрес строки

                                             ! ключевого сло-

                                             ! ва

          KEYTABLE(4) = 2                    ! Значение клю-

                                             ! чевого слова

                                             ! 'DELETE'

          KEYTABLE(5) = %LOC(KEYWORDS(1,3))  ! Адрес строки

                                             ! ключевого сло-

                                             ! ва

          KEYTABLE(6) = 3                    ! Значение клю-

                                             ! чевого слова

                                             ! 'EXIT'

       Данная программа  на  языке  программирования  фортран

  создает таблицу ключевых слов с именем KEYTABLE, содержащую

  три ключевых слова 1, 2, 3. Этот метод создания приводит  к

  получению данных, являющихся позиционно-независимым  кодом,

  хотя код,  генерированный  для  типичного  модуля  фортрана

  содержит      другие      значения,      не      являющиеся

  позиционно-независимым кодом.








                           - 324 -

                       00152-01 33 09-2


       1.76. LIB_LOOKUP_TREE   -   поиск   входа   в

             сбалансированном двоичном дереве


       Процедура LIB_LOOKUP_TREE ищет вход в сбалансированном

  двоичном дереве.


       Формат:

       LIB$LOOKUP_TREE    заголовок, ключ, процедура

                          сравнения, новый узел


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Заголовок

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово без знака

       Доступ: только чтение

       Механизм: посредством ссылки

       Заголовок в  двоичном  дереве.  Аргумент  заголовок  -

  адрес длинного слова без знака, которое является заголовком

  дерева.


       Ключ

       Использование в МОС ВП: символьная строка

       Тип: символьная строка





                           - 325 -

                       00152-01 33 09-2


       Доступ: только чтение

       Механизм: посредством дескриптора

       Ключ, который ищется в двоичном дереве. Аргумент  ключ

  - адрес дескриптора с ключом.


       Процедура сравнения

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Заданная пользователем  процедура  сравнения,  которую

  процедура LIB$LOOKUP_TREE вызывает для сравнения символа  с

  узлом. Аргумент процедура сравнения - адрес входа процедуры

  сравнения.  Значение,  возвращаемое  процедурой  сравнения,

  определяет зависимость между символьным  ключем  и  текущим

  узлом.

       В табл. 23 описаны возможные значения аргумента проце-

  дура сравнения.

                                                 Таблица 23

   --------------------------------------------------------

     Знначения     !            Описание

   --------------------------------------------------------

   Отрицательное   ! Ключ меньше текущего узла

   Нуль            ! Ключ равен текущему узлу

   Положительное   ! Ключ больше текущего узла









                           - 326 -

                       00152-01 33 09-2


       Новый узел

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Местоположение, в котором найден новый  символ.  Аргу-

  мент новый символ - адрес длинного слова без знака, которое

  является размещением нового узла.


       Описание.


       Формат вызова процедуры сравнения:


       Процедура сравнения    ключ, заголовок

       Процедура LIB$LOOKUP_TREE передает  аргументы  ключ  и

  заголовок процедуре сравнения, используя  тот  же  механизм

  передачи, который был использован при передаче их процедуре

  LIB$LOOKUP_TREE.


       Возвращаемые значения состояния:

  LIB$NORMAL

       - процедура успешно завершена. Ключ найден;

  LIB$KEYNOTFOU

       - ошибка. Ключ не найден.














                           - 327 -

                       00152-01 33 09-2


       1.77. LIB$LP_LINES   -   строки   на   каждой

             печатной странице


       Процедура  LIB$LP_LINES  вычисляет  количество  строк,

  принятое по умолчанию, на печатной странице. Эта  процедура

  используется обслуживающими  программами  основного  режима

  системы МОС  ВП,  которые  выполняют  распечатку  файлов  и

  делают постраничную разметку.


       Формат:

       LIB$LP_LINES


       Код возврата:

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством значения

       Количество строк, принятых по умолчанию, на физической

  печатной  странице.  Если  перевод  логического  имени  или

  преобразование в двоичный файл не удаются, то  возвращается

  значение, принятое по умолчанию, равное 66.


       Аргументы:

       Отсутствуют


       Описание.

       Процедура LIB$LP_LINES использует следующий алгоритм:

       1) переводит логическое имя SYS$LP_LINES;

       2) преобразует величину в коде КОИ-8 в двоичное  целое

  число;



                           - 328 -

                       00152-01 33 09-2


       3) проверяет, находится ли результирующее  значение  в

  интервале от 30 до 255;

       4) если любой из предыдущих шагов  был  ошибочный,  то

  возвращается значение, принятое по умолчанию, 66 строк.

       При написании обслуживающей  программы,  форматирующей

  страницу,  для  вывода  ее  на   линейную   печать,   можно

  использовать   процедуру   LIB$LP_LINES,   которая   делает

  обслуживающую  программу  независимой   от,   принятой   по

  умолчанию, длины страницы.

       Можно использовать процедуру LIB$LP_LINES, для получе-

  ния текущей длины стрианицы. Процедура  LIB$LP_LINES  также

  подсчитывает количество строк  текста  на  каждой  странице

  путем вычитания строк, используемых для  нижней  и  верхней

  границы страницы.


       Один из предполагаемых форматов следующий:

       1) три строки для верхнего края страницы;

       2) три строки для нижнего края страницы;

       3) три строки для печати шапки информации:

       - строка, определяющая языковый процессор;

       - строка, определяющая исходную программу;

       - одна пустая строка.


       Возвращаемые значения состояния:

       Отсутствуют










                           - 329 -

                       00152-01 33 09-2


       Пример 1.

          LPLINES = LIB$LP_LINES()

          PRINT 10, LPLINES

  10      FORMAT ( 'печатная страница = ',1S,' строкам.')

          END

       Данная программа  на  языке  программирования  ФОРТРАН

  выводит на дисплей печатную страницу  длиной,  принятой  по

  умолчанию.



       1.78. LIB$MATCHC  -   выдача   относительного

             положения соответствующих символов


       Процедура LIB$MATCHC ищет исходную строку для заданной

  подстроки и выдает индекс, который  является  относительным

  положением первого  местонахождения  подстроки  в  исходной

  строке. Процедура LIB$MATCHC  выполняет  инструкцию  MATCHC

  системы МОС ВП, как вызываемую процедуру.


       Формат:

       LIB$MATCHC   подстрока, исходная строка


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Относительная позиция первого символа подстроки,  если

  он найден, или нуль, если он не найден.





                           - 330 -

                       00152-01 33 09-2


       Аргументы:

       Подстрока

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Подстрока,  которая  должна  быть  найдена.   Аргумент

  подстрока - адрес дескриптора с подстрокой.


       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная  строка,   которая   проверяется   процедурой

  LIB$MATCHC. Аргумент исходная строка - адрес дескриптора  с

  исходной строкой.


       Описание.

       Относительная позиция символа, возвращаемая процедурой

  LIB$MATCHC  -  это  цифра  1,2,...N.  Нуль  означает,   что

  подстрока не обнаружена.

       Если  подстрока  имеет  нулевую  длину,  то  процедура

  LIB$MATCHC  возвращает  единицу,   которая   указывает   на

  успешную операцию, независимо  от  длины  исходной  строки.

  Если исходная строка имеет нулевую длину, то выдается  нуль

  который указывает на то, что подстрока не найдена.

       Порядок   аргументов    для    процедуры    LIB$MATCHC




                           - 331 -

                       00152-01 33 09-2


  аналогичный порядку аргументов инструкции MATCHC.


       Возвращаемые значения состояния:

       Отсутствуют



       1.79. LIB$MATCH_COND    -     соответствующее

             значение состояния


       Процедура LIB$MATCH_COND  проверяет  соответствует  ли

  данное значение состояния заданному списку значений состоя-

  ния.


       Формат:

       LIB$MATCHC_COND состояние, I-COCTOяHиE, ...


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Нуль,   если   введенное   значение    состояния    не

  соответствует ни одному значению состояния из списка,  или,

  если найдено соответствие между первым  аргументом  и  I-ыM

  аргументом.


       Аргументы:

       Состояние

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)





                           - 332 -

                       00152-01 33 09-2


       Доступ: только чтение

       Механизм: посредством ссылки

       Соответствующее значение состояния. Аргумент состояние

  - адрес длинного слова без знака, которое содержит это зна-

  чение состояния.


       I-COCTOяHиE

       Использование в МОС ВП: значение состояния

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Значение состояния, которое сравнивается с  аргументом

  состояние. Аргумент I-COCTOяHиE - адрес длинного слова  без

  знака, содержащего значение состояния.


       Описание.

       Процедура     LIB$MATCH_COND     проверяет     наличие

  соответствия   между   значением   состояния,    задаваемым

  аргументом состояние и значениями состояния, адреса которых

  задаются последовательностью  аргументов.  Каждый  аргумент

  представляет собой адрес длинного слова, содержащего значе-

  ние состояния.

       Процедура LIB$MATCH_COND предназначена для  приведения

  в соответствие списка из одного или более значений  состоя-

  ния.   Данная   процедура   используется   в   многовходных

  ветвящихся операторах, имеющихся в языках  программирования

  высокого уровня.

       Процедура     LIB$MATCH_COND     сравнивает      часть




                           - 333 -

                       00152-01 33 09-2


  (STS$V_COND_ID) значения состояния, задаваемого  аргументом

  состояние с такой же частью значения состояния, задаваемого

  аргументами со второго до  N-ого.  Если  бит,  определяющий

  устройство ( STS$V_FAC_SP = бит 15 ) в аргументе  состояние

  равен  0  (это  означает,  что  значение  состояния  задает

  системы,  а  не  устройство),  то  поле   кода   устройства

  (STS$V_FAC_NO = биты  27:17)  игнорируется  и  сравнивается

  только поля STS$V_MSG_ID (биты 15:3).

       Процедура  возвращает  нуль,  если   соответствие   не

  найдено, и 1, если значение состояния соответствует первому

  значению состояния в списке (второй аргумент); 2, если зна-

  чение состояния соответствует второму значению состояния  в

  списке (третий аргумент) и так далее.

       Когда процедура  LIB$MATCH_COND  вызывается  только  с

  двумя  аргументами,  возможны  только  два   значения   для

  возвращаемых значений, это истина (1), или ложь (0).

       Каждый  обработчик  состояния  должен   контролировать

  вектор сигнального аргумента,  чтобы  определить  какое  из

  состояний выдало сигнал. Если это условие не  единственное,

  о котором знает обработчик, то он должен  подать  повторный

  сигнал. Обработчик не должен предполагать, что только  один

  тип встретится в процедуре,  которая  его  создала,  или  в

  любой из процедур, которые он вызывает. Однако,  вследствии

  того,  что   значение   состояния   может   быть   изменено

  посредством вмешательства  обработчика,  каждый  обработчик

  должен  сравнивать  только  ту  часть  значения  состояния,

  которая отличает ее от другого.




                           - 334 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

       Отсутствуют



       1.80. LIB$MOVC3 - пересылка символов


       Процедура LIB$MOVC3 выполняет инструкцию MOVC3 системы

  мос  вп,  как  вызываемую   процедуру.   Исходный   элемент

  пересылается в результирующий элемент. Наложение  исходного

  и результирующего элементов не влияет на результат.


       Формат:

       LIB$MOVC3 длина, источник, приемник


       Код возврата:

       Отсутствует


       Аргументы:

       Длина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество   байтов,   которые   будут    пересылаться

  процедурой  LIB$MOVC3  из  аргумента  источник  в  аргумент

  приемник.  Аргумент  длина  -  адрес   слова   без   знака,

  содержащего   количество   байтов.    Максимальное    число

  передаваемых байтов 65,535.








                           - 335 -

                       00152-01 33 09-2


       Источник

       Использование в МОС ВП: адрес

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Элемент, который  пересылается.  Аргумент  источник  -

  адрес этого элемента.


       Приемник

       Использование МОС ВП: адрес

       Тип: неопределенный

       Доступ: только запись

       Механизм: посредством ссылки

       Элемент, в который процедура LIB$MOVC3 пересылает зна-

  чение аргумента источник. Аргумент приемник -  адрес  этого

  элемента.


       Описание.

       Процедура LIB$MOVC3 используется для пересылки крупных

  блоков данных, таких как массивы; в противном случае  такая

  операция потребовала бы выполнения программного цикла.


       Возвращаемые значения состояния:

       Отсутствуют













                           - 336 -

                       00152-01 33 09-2


       1.81. LIB$MOVC5  -   пересылка   символов   с

             заполнением


       Процедура LIB$MOVC5 выполняет инструкцию MOVC5 системы

  МОС  ВП,  как  вызываемую   процедуру.   Исходный   элемент

  пересылается в результирующий элемент. Наложение  исходного

  и  результирующего  элементов  не   влияют   на   результат

  выполнения процедуры.


       Формат:

       LIB$MOVC5   длина источника, источник, символ

                   заполнения, длина приемника, приемник

       Код возврата:

       Отсутствует


       Аргументы:

       Длина источника

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество байтов в исходном элементе. Аргумент  длина

  источника - адрес слова без знака,  содержащего  количество

  байтов.  Максимальная  длина  исходного   элемента   65,535

  байтов.











                           - 337 -

                       00152-01 33 09-2


       Источник

       Использование в МОС ВП: адрес

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Элемент, который  пересылается  процедурой  LIB$MOVC5.

  Аргумент источник - адрес  этого  элемента.  Если  аргумент

  длина источника нулевой, то аргумент приемник  должен  быть

  полностью заполнен  символами  заполнения.  В  этом  случае

  аргумент источник игнорируется процедурой LIB$MOVC5.


       Символ заполнения

       Использование в МОС ВП: байт со знаком

       Тип: целыи байт (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Символ, используемый для заполнения аргумента источник

  до длины аргумента приемник. Аргумент символ  заполнения  -

  адрес  целого   байта   со   знаком,   содержащего   символ

  заполнения.


       Длина приемника

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Длина аргумента  приемник  в  байтах.  Аргумент  длина

  приемника - адрес слова без знака,  содержащего  количество




                           - 338 -

                       00152-01 33 09-2


  байтов. Максимально  допустимое  значение  аргумента  длина

  приемника равно 65,535.


       Приемник

       Использование в МОС ВП: аргумент изменения

       Тип: неопределенный

       Доступ: только запись

       Механизм: посредством ссылки

       Элемент,  в  который  пересылается  исходный  элемент.

  Аргумент приемник - адрес этого элемента.


       Описание.

       Если результирующий элемент короче, чем  исходный,  то

  старшие адресные байты исходного элемента не пересылаются.


       Возвращаемые значения состояния:

       Отсутствуют



       1.82. LIB$MOVTC -  пересылка  транслированных

             символов


       Процедура   LIB$MOVTC   пересылает   исходную   строку

  посимвольно  в  результирующую  строку   после   трансляции

  каждого   символа   с   использованием   заданной   таблицы

  трансляции. Процедура LIB$MOVTC выполняет инструкцию  MOVTC

  системы МОС ВП, как вызываемую процедуру.










                           - 339 -

                       00152-01 33 09-2


       Формат:

       LIB$MOVTC   источник, символ заполнения,

                   таблица трансляции, результирующая строка.


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Источник

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная строка, которая  транслируется  и  передается

  при помощи процедуры LIB$MOVTC. Аргумент источник  -  адрес

  дескриптора с исходной строкой.


       Символ заполнения

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Символ   заполнения,   используемый   для   заполнения

  аргумента источник до длины  аргумента  приемник.  Аргумент

  символ заполнения - адрес дескриптора  со  строкой.  Первый

  символ этой строки используется как символ заполнения. Дли-



                           - 340 -

                       00152-01 33 09-2


  на этой строки не проверяется, и аргумент символ заполнения

  не транслируется.


       Таблица трансляции

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Таблица трансляции, используемая процедурой LIB$MOVTC.

  Аргумент таблица трансляции - адрес  точечного  дескриптора

  со строкой таблицы трансляции.

       Строка таблицы трансляции должна содержать точное  имя

  таблицы трансляции. Например, аргумент  таблица  трансляции

  может   описывать   строку,   содержащую   такие   символы:

  "LIB$AB_ASC_EBC".


       Результирующая строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка, в которую  процедура  LIB$MOVTC

  записывает   транслируемую   исходную   строку.    Аргумент

  результирующая  строка  -  адрес  точечного  дескриптора  с

  результирующей строкой.










                           - 341 -

                       00152-01 33 09-2


       Описание.

       Каждый  символ  в  исходной  строке  используется  как

  индекс  в  таблице  трансляции.   Найденный   байт,   затем

  помещается  в  результирующую  строку.  Символ   заполнения

  используется,  если  результирующая  строка  длиннее,   чем

  исходная  строка.  Если  исходная   строка   длиннее,   чем

  результирующая  строка,  то  исходная  строка   обрывается.

  Наложение исходной и  результирующей  строк  не  влияет  на

  выполнение процедуры.

       Таблицы трансляции, используемые процедурами LIB$MOVTC

  и LIB$MOVTUC описаны в пунктах 1.82.1...1.82.10.



       1.82.1. Таблица перевода из кода  КОИ-8  в  код

               ДКОИ


       В табл.  24  в  левой  колонке  представлены  числа  в

  шестнадцатиричной  системе,  являющиеся   младшими   битами

  символа в коде КОИ-8.

       В табл. 24  в  верхней  строке  представлены  числа  в

  шестнадцатиричнои  системе,  являющиеся   старшими   битами

  символа в коде КОИ-8.

       В  основной  части  табл.24   представлены   числа   в

  шестнадцатиричной системе,  эквивалентные  символу  в  коде

  ДКОИ.











                           - 342 -

                       00152-01 33 09-2


                                                   Таблица 24

                        LIB$AB_ASC_EBC

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !10!40!F0!7C!D7!79!97!3F!3F!3F!3F!3F!3F!3F!3F

   1    !01 !11!4F!F1!C1!D8!81!98!3F!3F!3F!3F!3F!3F!3F!3F

   2    !02 !12!7F!F2!C2!D9!82!99!3F!3F!3F!3F!3F!3F!3F!3F

   3    !03 !13!7B!F3!C3!E2!83!A2!3F!3F!3F!3F!3F!3F!3F!3F

   4    !37 !3C!5B!F4!C4!E3!84!A3!3F!3F!3F!3F!3F!3F!3F!3F

   5    !2D !3D!6C!F5!C5!E4!85!A4!3F!3F!3F!3F!3F!3F!3F!3F

   6    !2E !32!50!F6!C6!E5!86!A5!3F!3F!3F!3F!3F!3F!3F!3F

   7    !2F !26!7D!F7!C7!E6!87!A6!3F!3F!3F!3F!3F!3F!3F!3F

   8    !16 !18!4D!F8!C8!E7!88!A7!3F!3F!3F!3F!3F!3F!3F!3F

   9    !05 !19!5D!F9!C9!E8!89!A8!3F!3F!3F!3F!3F!3F!3F!3F

   A    !25 !3F!5C!7A!D1!E9!91!A9!3F!3F!3F!3F!3F!3F!3F!3F

   B    !0B !27!4E!5E!D2!4A!92!C0!3F!3F!3F!3F!3F!3F!3F!3F

   C    !0C !1C!6B!4C!D3!E0!93!6A!3F!3F!3F!3F!3F!3F!3F!3F

   D    !0D !1D!60!7E!D4!5A!94!D0!3F!3F!3F!3F!3F!3F!3F!3F

   E    !0E !1E!4B!6E!D5!5F!95!A1!3F!3F!3F!3F!3F!3F!3F!3F

   F    !0F !1F!61!6F!D6!6D!96!07!3F!3F!3F!3F!3F!3F!3F!FF












                           - 343 -

                       00152-01 33 09-2


       1.82.2. Таблица  обратной  трансляции  из  кода

               КОИ-8 в код ДКОИ.


       В табл.  25  в  левой  колонке  представлены  числа  в

  шестнадцатиричной  системе,  являющиеся   младшими   битами

  символа в коде КОИ-8.

       В табл. 25  в  верхней  строке  представлены  числа  в

  шестнадцатиричной  системе,  являющиеся   старшими   битами

  символа в коде КОИ-8.

       В  основной  части  табл.  25  представлены  числа   в

  шестнадцатиричной системе,  эквивалентные  символу  в  коде

  ДКОИ.

                                                   Таблица 25

                      LIB$AB_ASC_EBC_REV

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !10!40!F0!7C!D7!79!97!20!30!41!58!76!9F!B8!DC

   1    !01 !11!4F!F1!C1!D8!81!98!21!31!42!59!77!A0!B9!DD

   2    !02 !12!7F!F2!C2!D9!82!99!22!1A!43!62!78!AA!BA!DE

   3    !03 !13!7B!F3!C3!E2!83!A2!23!33!44!63!80!AB!BB!DF

   4    !37 !3C!5B!F4!C4!E3!84!A3!24!34!45!64!8A!AC!BC!EA

   5    !2D !3D!6C!F5!C5!E4!85!A4!15!35!46!65!8B!AD!BD!EB

   6    !2е !32!50!F6!C6!E5!86!A5!06!36!47!66!8C!AE!BE!EC

   7    !2F !26!7D!F7!C7!E6!87!A6!17!08!48!67!8D!AF!BF!ED




                           - 344 -

                       00152-01 33 09-2


                                         Продолжение табл. 25

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   8    !16 !18!4D!F8!C8!E7!88!A7!28!38!49!68!8E!B0!CA!EE

   9    !05 !19!5D!F9!C9!E8!89!A8!29!39!51!69!8F!B1!CB!EF

   A    !25 !3F!5C!7A!D1!E9!91!A9!2A!3A!52!70!90!B2!CC!FA

   B    !0B !27!4E!5E!D2!4A!92!C0!2B!3B!53!71!9A!B3!CD!FB

   C    !0C !1C!6B!4C!D3!E0!93!6A!2C!04!54!72!9B!B4!CE!FC

   D    !0D !1D!60!7E!D4!5A!94!D0!09!14!55!73!9C!B5!CF!FD

   E    !0E !1E!4B!6E!D5!5F!95!A1!0A!3E!56!74!9D!B6!DA!FE

   F    !0F !1F!61!6F!D6!6D!96!07!1B!E1!57!75!9E!B7!DB!FF



       1.82.3. Таблица трансляции из кода ДКОИ  в  код

               КОИ-8


       В табл.  26  в  левой  колонке  представлены  числа  в

  шестнадцатиричной  системе,  являющиеся   младшими   битами

  символа в коде ДКОИ.

       В табл. 26  в  верхней  строке  представлены  числа  в

  шестнадцатиричной системе, являющиеся старшими битами  сим-

  вола в коде ДКОИ.

       В  основной  части  табл.  26  представены   числа   в

  шестнадцатиричной системе,  эквивалентные  символу  в  коде

  КОИ-8.





                           - 345 -

                       00152-01 33 09-2


                                                   Tаблица 26

                        LIB$AB_EBC_ASC

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !10!5C!5C!20!26!2D!5C!5C!5C!5C!5C!7B!7D!5C!30

   1    !01 !11!5C!5C!5C!5C!2F!5C!61!6A!7E!5C!41!4A!5C!31

   2    !02 !12!5C!16!5C!5C!5C!5C!62!6B!73!5C!42!4B!53!32

   3    !03 !13!5C!5C!5C!5C!5C!5C!63!6C!74!5C!43!4C!54!33

   4    !5C !5C!5C!5C!5C!5C!5C!5C!64!6D!75!5C!44!4D!55!34

   5    !09 !5C!0A!5C!5C!5C!5C!5C!65!6E!76!5C!45!4E!56!35

   6    !5C !08!17!5C!5C!5C!5C!5C!66!6F!77!5C!46!4F!57!36

   7    !7F !5C!1B!04!5C!5C!5C!5C!67!70!78!5C!47!50!58!37

   8    !5C !18!5C!5C!5C!5C!5C!5C!68!71!79!5C!48!51!59!38

   9    !5C !19!5C!5C!5C!5C!5C!60!69!72!7A!5C!49!52!5A!39

   A    !5C !5C!5C!5C!5B!5D!7C!3A!5C!5C!5C!5C!5C!5C!5C!5C

   B    !0B !5C!5C!5C!2E!24!2C!23!5C!5C!5C!5C!5C!5C!5C!5C

   C    !0C !1C!5C!14!3C!2A!25!40!5C!5C!5C!5C!5C!5C!5C!5C

   D    !0D !1D!05!15!28!29!5F!27!5C!5C!5C!5C!5C!5C!5C!5C

   E    !0E !1E!06!5C!2B!3B!3E!3D!5C!5C!5C!5C!5C!5C!5C!5C

   F    !0F !1F!07!1A!21!5E!3F!22!5C!5C!5C!5C!5C!5C!5C!FF












                           - 346 -

                       00152-01 33 09-2


       1.82.4. Таблица  обратной  трансляции  из  кода

               ДКОИ в код КОИ-8


       В табл.  27  в  левой  колонке  представлены  числа  в

  шестнадцатиричной  системе,  являющиеся   младшими   битами

  символа в коде ДКОИ.

       В табл. 27  в  верхней  строке  представлены  числа  в

  шестнадцатиричной системе, являющиеся старшими битами  сим-

  вола в коде ДКОИ.

       В  основной  части  табл.  27  представлены  числа   в

  шестнадцатиричной системе,  эквивалентные  символу  в  коде

  КОИ-8.

                                                   Таблица 27

                      LIB$AB_EBC_ASC_REV

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !10!80!90!20!26!2D!BA!C3!CA!D1!D8!7B!7D!5C!30

   1    !01 !11!81!91!A0!A9!2F!BB!61!6A!7E!D9!41!4A!9F!31

   2    !02 !12!82!16!A1!AA!B2!BC!62!6B!73!DA!42!4B!53!32

   3    !03 !13!83!93!A2!AB!B3!BD!63!6C!74!DB!43!4C!54!33

   4    !9с !9D!84!94!A3!AC!B4!BE!64!6D!75!DC!44!4D!55!34

   5    !09 !85!0A!95!A4!AD!B5!BF!65!6E!76!DD!45!4E!56!35

   6    !86 !08!17!96!A5!AE!B6!C0!66!6F!77!DE!46!4F!57!36

   7    !7F !87!1B!04!A6!AF!B7!C1!67!70!78!DF!47!50!58!37




                           - 347 -

                       00152-01 33 09-2


                                         Продолжение табл. 27

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   8    !97 !18!88!98!A7!B0!B8!C2!68!71!79!E0!48!51!59!38

   9    !8D !19!89!99!A8!B1!B9!60!69!72!7A!E1!49!52!5A!39

   A    !8E !92!8A!9A!5B!5D!7C!3A!C4!CB!D2!E2!E8!EE!F4!FA

   B    !0B !8F!8B!9B!2E!24!2C!23!C5!CC!D3!E3!E9!EF!F5!FB

   C    !0C !1C!8C!14!3C!2A!25!40!C6!CD!D4!E4!EA!F0!F6!FC

   D    !0D !1D!05!15!28!29!5F!27!C7!CE!D5!E5!EB!F1!F7!FD

   E    !0E !1E!06!9E!2B!3B!3E!3D!C8!CF!D6!E6!EC!F2!F8!FE

   F    !0F !1F!07!1A!21!5E!3F!22!C9!D0!D7!E7!ED!F3!F9!FF



       1.82.5. Таблица  трансляции   из   упакованного

               дясятичного формата в  формат  числовой

               строки


       В табл.  28  в  левой  колонке  представлены  числа  в

  шестнадцатиричной системе, являющиеся младшими битами  зна-

  чения в упакованном десятичном формате.

       В табл. 28  в  верхней  строке  представлены  числа  в

  шестнадцатиричной системе, являющиеся старшими битами  зна-

  чения в упакованном десятичном формате.

       В  основной  части  табл.  28  представлены  числа   в

  шестнадцатиричной системе, эквивалентные значению в формате

  числовой строки.



                           - 348 -

                       00152-01 33 09-2


                                                   Таблица 28

                        LIB$AB_CVTPT_O

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   1    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   2    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   3    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   4    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   5    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   6    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   7    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   8    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   9    !7B !7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B!7B

   A    !7B !41!42!43!44!45!46!47!48!49!7B!7B!7B!7B!7B!7B

   B    !7D !4A!4B!4C!4D!4E!4F!50!51!52!7B!7B!7B!7B!7B!7B

   C    !7B !41!42!43!44!45!46!47!48!49!7B!7B!7B!7B!7B!7B

   D    !7D !4A!4B!4C!4D!4E!4F!50!51!52!7B!7B!7B!7B!7B!7B

   E    !7B !41!42!43!44!45!46!47!48!49!7B!7B!7B!7B!7B!7B

   F    !7B !41!42!43!44!45!46!47!48!49!7B!7B!7B!7B!7B!7B












                           - 349 -

                       00152-01 33 09-2


       1.82.6. Таблица  трансляции   из   упакованного

               десятичного    формата     в     формат

               беззнаковой числовой строки


       В табл.  29  в  левой  колонке  представлены  числа  в

  шестнадцатиричной системе, являющиеся младшими битами  зна-

  чения в упакованном десятичном формате.

       В табл. 29  в  верхней  строке  представлены  числа  в

  шестнадцатиричной системе являющиеся старшими битами значе-

  ния в упакованном десятичном формате.

       В  основной  части  табл.  29  представлены  числа   в

  шестнадцатиричной системе, эквивалентные значению в формате

  беззнаковой числовой строки.

                                                   Таблица 29

                        LIB$AB_CVTPT_U

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   1    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   2    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   3    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   4    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   5    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   6    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00


                                                            

                           - 350 -

                       00152-01 33 09-2


                                         Продолжение табл. 29

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   7    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   8    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   9    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   A    !30 !31!32!33!34!35!36!37!38!39!00!00!00!00!00!00

   B    !30 !31!32!33!34!35!36!37!38!39!00!00!00!00!00!00

   C    !30 !31!32!33!34!35!36!37!38!39!00!00!00!00!00!00

   D    !30 !31!32!33!34!35!36!37!38!39!00!00!00!00!00!00

   E    !30 !31!32!33!34!35!36!37!38!39!00!00!00!00!00!00

   F    !30 !31!32!33!34!35!36!37!38!39!00!00!00!00!00!00



       1.82.7. Таблица трансляции из формата  числовой

               строки в упакованный десятичный формат


       В табл.  30  в  левой  колонке  представлены  числа  в

  шестнадцатиричной системе, являющиеся младшими битами  зна-

  чения в формате числовой строки.

       В табл. 30  в  верхней  строке  представлены  числа  в

  шестнадцатиричной системе, являющиеся старшими битами  зна-

  чения в формате числовой строки.

       В  основной  части  табл.  30  представлены  числа,  в

  шестнадцатиричной   системе,   эквивалентные   значению   в

  упакованном десятичном формате.



                           - 351 -

                       00152-01 33 09-2


                                                   Таблица 30

                        LIB$AB_CVTTP_O

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !00!00!0C!00!7D!00!00!00!00!00!00!00!00!00!00

   1    !00 !00!00!1C!1C!8D!00!00!00!00!00!00!00!00!00!00

   2    !00 !00!00!2C!2C!9D!00!00!00!00!00!00!00!00!00!00

   3    !00 !00!00!3C!3C!00!00!00!00!00!00!00!00!00!00!00

   4    !00 !00!00!4C!4C!00!00!00!00!00!00!00!00!00!00!00

   5    !00 !00!00!5C!5C!00!00!00!00!00!00!00!00!00!00!00

   6    !00 !00!00!6C!6C!00!00!00!00!00!00!00!00!00!00!00

   7    !00 !00!00!7C!7C!00!00!00!00!00!00!00!00!00!00!00

   8    !00 !00!00!8C!8C!00!00!00!00!00!00!00!00!00!00!00

   9    !00 !00!00!9C!9C!00!00!00!00!00!00!00!00!00!00!00

   A    !00 !00!00!0D!1D!00!00!00!00!00!00!00!00!00!00!00

   B    !00 !00!00!00!2D!0C!00!0C!00!00!00!00!00!00!00!00

   C    !00 !00!00!00!3D!00!00!00!00!00!00!00!00!00!00!00

   D    !00 !00!00!00!4D!0D!00!0D!00!00!00!00!00!00!00!00

   E    !00 !00!00!00!5D!00!00!00!00!00!00!00!00!00!00!00

   F    !00 !00!00!0C!6D!00!00!00!00!00!00!00!00!00!00!00












                           - 352 -

                       00152-01 33 09-2


       1.82.8. Таблица    трансляции    из     формата

               беззнаковой    числовой    строки     в

               упакованный десятичный формат


       В табл.  31  в  левой  колонке  представлены  числа  в

  шестнадцатиричной системе, являющиеся младшими битами  зна-

  чения в формате беззнаковой числовой строки.

       В табл. 31  в  верхней  строке  представлены  числа  в

  шестнадцатиричной системе, являющиеся старшими битами  зна-

  чения в формате беззнаковой числовой строки.

       В  основной  части  табл.  31  представлены  числа   в

  шестнадцатиричной   системе,   эквивалентные   значению   в

  упакованном десятичном формате.

                                                   Таблица 31

                        LIB$AB_CVTTP_U

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !00!00!0C!00!00!00!00!00!00!00!00!00!00!00!00

   1    !00 !00!00!1C!00!00!00!00!00!00!00!00!00!00!00!00

   2    !00 !00!00!2C!00!00!00!00!00!00!00!00!00!00!00!00

   3    !00 !00!00!3C!00!00!00!00!00!00!00!00!00!00!00!00

   4    !00 !00!00!4C!00!00!00!00!00!00!00!00!00!00!00!00

   5    !00 !00!00!5C!00!00!00!00!00!00!00!00!00!00!00!00

   6    !00 !00!00!6C!00!00!00!00!00!00!00!00!00!00!00!00




                           - 353 -

                       00152-01 33 09-2


                                         Продолжение табл. 31

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   7    !00 !00!00!7C!00!00!00!00!00!00!00!00!00!00!00!00

   8    !00 !00!00!8C!00!00!00!00!00!00!00!00!00!00!00!00

   9    !00 !00!00!9C!00!00!00!00!00!00!00!00!00!00!00!00

   A    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   C    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   D    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   E    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00

   F    !00 !00!00!00!00!00!00!00!00!00!00!00!00!00!00!00



       1.82.9. Таблица трансляции из  числовой  строки

               перфо-формата  в  беззнаковую  числовую

               строку


       В табл.  32  в  левой  колонке  представлены  числа  в

  шестнадцатиричной системе, являющиеся младшими битами  зна-

  чения в перфо-формате числовой строки.

       В табл. 32 в верхней строке представлены числа в шест-

  надцатиричной системе, являющиеся старшими битами  значения

  в перфо-формате числовой строки.

       В  основной  части  табл.  32  представены   числа   в

  шестнадцатиричной системе, эквивалентные значению в формате

  беззнаковой числовой строки.



                           - 354 -

                       00152-01 33 09-2


                                                   Таблица 32

                        LIB$AB_CVT_O_U

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !10!20!30!40!37!60!70!80!90!A0!B0!C0!D0!E0!F0

   1    !01 !11!30!31!31!38!61!71!81!91!A1!B1!C1!D1!E1!F1

   2    !02 !12!22!32!32!39!62!72!82!92!A2!B2!C2!D2!E2!F2

   3    !03 !13!23!33!33!53!63!73!83!93!A3!B3!C3!D3!E3!F3

   4    !04 !14!24!34!34!54!64!74!84!94!A4!B4!C4!D4!E4!F4

   5    !05 !15!25!35!35!55!65!75!85!95!A5!B5!C5!D5!E5!F5

   6    !06 !16!26!36!36!56!66!76!86!96!A6!B6!C6!D6!E6!F6

   7    !07 !17!27!37!37!57!67!77!87!97!A7!B7!C7!D7!E7!F7

   8    !08 !18!28!38!48!58!68!78!88!98!A8!B8!C8!D8!E8!F8

   9    !09 !19!29!39!49!59!69!79!89!99!A9!B9!C9!D9!E9!F9

   A    !0A !1A!2A!30!31!5A!6A!7A!8A!9A!AA!BA!CA!DA!EA!FA

   B    !0B !1B!2B!3B!32!30!6B!30!8B!9B!AB!BB!CB!DB!EB!FB

   C    !0C !1C!2C!3C!33!5C!6C!7C!8C!9C!AC!BC!CC!DC!EC!FC

   D    !0D !1D!2D!3D!34!30!6D!30!8D!9D!AD!BD!CD!DD!ED!FD

   E    !0E !1E!2E!3E!35!5E!6E!7E!8E!9E!AE!BE!CE!DE!EE!FE

   F    !0F !1F!2F!30!36!5F!6F!7F!8F!9F!AF!BF!CF!DF!EF!FF












                           - 355 -

                       00152-01 33 09-2


       1.82.10. Таблица   трансляции   из   беззнаковой

                числовой  строки  в   числовую   строку

                перфо-формата


       В табл. 33 положительные значения в перфо-формате и от

  10 до 19 отрицательные  значения  перфо-формата  определены

  битами  с  0  до  9.  Беззнаковое  двоичное   представление

  наименьшего цифрового значения передается в R2.

       Для получения положительного  результата  генерируется

  следующий код:

       МOVC3   LIB$AB_CVT_U_0[R2], #1,R0

       Если    запрашивается     отрицательный     результат,

  генерируется следующий код:

       МOVC3 LIB$AV_CVT_U_O + 10[R2], #1,R0

       Результат представления значения в  перфо-формате  для

  последнего байта - отрицательное число.

                                                   Таблица 33

                        LIB$AB_CVT_U_0

  -----------------------------------------------------------

            0 - 9              !         10 - 19

  -----------------------------------------------------------

  7B!41!42!43!44               ! 7D!4A!4B!4C!4D

  45!46!47!48!49               ! 4E!4F!50!51!52



       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;





                           - 356 -

                       00152-01 33 09-2


  LIB$_STRTRU

       - процедура  успешно   завершена.   Строка   элементов

         оборвана. Результирующая строка фиксированной  длины

         не может вместить все элементы;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка;

  LIB$INSVIRMEM

       - недостаточная виртуальная память;

  LIB_INVSTRDES

       - неверный дескриптор строки.



       1.83. LIB$MOVTUC -  передача  транслированной

             строки посимвольно


       Процедура   LIB$MOVTUC   передает   исходную    строку

  посимвольно  в  результирующую  строку   после   трансляции

  каждого  символа,   с   использованием   заданной   таблицы

  трансляции, до тех пор, пока не встретится символ  признака

  конца строки.  Процедура  LIB$MOVTUC  выполняет  инструкцию

  MOVTUC системы МОС ВП, как вызываемую процедуру.


       Формат:

       LIB$MOVTUC  исходная строка, конечный символ, таблица

                   трансляции, результирующая строка

                   [, символ заполнения]










                           - 357 -

                       00152-01 33 09-2


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Относительное  положение  в  строке  символа,  который

  транслируется  в  конечный  символ  строки.  Если  конечный

  элемент строки не найден, то возвращается нуль. Это  значе-

  ние устанавливается  в  -1,  если  аргумент  результирующая

  строка не может быть размещен.


       Аргументы:

       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная строка,  которая  траслируется  и  передается

  процедурой LIB$MOVTUC. Аргумент  исходная  строка  -  адрес

  точечного дескриптора с исходной строкой.


       Конечный символ

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Символ  признака  конца  строки,  который   заставляет

  процедуру LIB$MOVTUC прекратить трансляцию исходной строки.




                           - 358 -

                       00152-01 33 09-2


  аргумент конечный символ - адрес точечного  дескриптора  со

  строкой. Первый символ этой строки используется, как символ

  признака конца строки. Длина этой строки не  контролируется

  и конечный символ не транслируется.


       Таблица трансляции

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Таблица    трансляции,     используемая     процедурой

  LIB$MOVTUC. Аргумент таблица трансляции -  адрес  точечного

  дескриптора со строкой таблицы трансляции.  Строка  таблицы

  трансляции должна содержать точное имя таблицы трансляции.

       Например,   аргумент   таблица-трансляции    описывает

  строку,  содержащую  символы:   "LIB$AB_ASC_EBC".   Таблица

  трансляции размещается в дескрипторе LIB$MOVTC.


       Результирующая строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка, в которую процедура  LIB$MOVTUC

  записывает транслируемый аргумент исходная строка. Аргумент

  результирующая  строка  -  адрес  точечного  дескриптора  с

  результирующей строкой.






                           - 359 -

                       00152-01 33 09-2


       Символ заполнения

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Символ, используемый для заполнения аргумента исходная

  строка до длины  аргумента  результирующая  строка.  Первый

  символ этой  строки  используется  как  символ  заполнения.

  Длина этой  строки  не  контролируется  и  аргумент  символ

  заполнения не транслируется.

       Если   символ   заполнения    указан,    то    остаток

  результирующей  строки,  (после  символа   признака   конца

  строки) заполняется заданным символом заполнения. Если этот

  аргумент  не  указан,  то  остаток  результирующей   строки

  остается неизменным.


       Описание.

       Во время трансляции процедура LIB$MOVTUC обращается  к

  каждому символу в исходной строке  и,  использует  его  как

  индекс в таблице трансляции.  Если  вход  таблицы  содержит

  символ  признака  конца  строки,  то  выполнение  процедуры

  прекращается   и   возвращается   относительное   положение

  исходного символа.

       Если исходная строка длиннее, чем  результирующая,  то

  исходная  строка  обрывается.  Если  задан   необязательный

  аргумент  заполнение,  то   все   позиции,   оставшиеся   в

  результирующей  строке  заполняются  этим  символов.   Если

  исходная   или   результирующая   строка   исчерпаны    (до



                           - 360 -

                       00152-01 33 09-2


  обнаружения символа признака конца строки), то возвращается

  нулевой индекс.

       Если исходная и результирующая строка накладываются  и

  имеют  разные  начальные   адреса,   то   результат   будет

  непредсказуемым.

       Таблицы трансляции для процедур LIB$MOVTC и LIB$MOVTUC

  приведены  в  описании  процедуры   LIB$MOVTC   в   пунктах

  1.82.1...1.82.10. Каждой  таблице  трансляции  предшествует

  об'яснительный текст.


       Возвращаемые значения состояния:

       Отсутствуют



       1.84. LIB$POLYZ - вычисление многочленов


       Процедуры LIB$POLYF, LIB$POLYD,  LIB$POLYG,  LIB$POLYH

  позволяют  использовать  языки  программирования   высокого

  уровня для вычисления многочленов. Эти процедуры используют

  элементы инструкций POLYF, POLYD, POLYG, POLYH системы  МОС

  ВП.


       Формат:

       LIB$POLYF   аргумент, старший коэффициент,

                   коэффициент, результат

       LIB$POLYD   аргумент, старший коэффициент,

                   коэффициент, результат

       LIB$POLYG   аргумент, старший коэффициент,

                   коэффициент, результат

       LIB$POLYH   результат, старший коэффициент,



                           - 361 -

                       00152-01 33 09-2


                   коэффициент, результат

       Каждый из приведенных форматов  использует  для  ввода

  одного из четырех форматов чисел с плавающей запятой.


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Аргумент

       Использование в МОС ВП: число с плавающей запятой

       Тип: число с плавающей запятой формата F,

            число с плавающей запятой формата D,

            число с плавающей запятой формата G,

            число с плавающей запятой формата H

       Доступ: только чтение

       Механизм: посредством значения

       Аргумент для многочлена.  Аргумент  -  адрес  числа  с

  плавающей запятой,  которое  содержит  этот  аргумент.  Для

  процедуры LIB$POLYF, аргумент - число с  плавающей  запятой

  формата F. Для  процедуры  LIB$POLYD  аргумент  -  число  с

  плавающей  запятой  формата  D.  Для  процедуры   LIB$POLYG

  аргумент  -  число  с  плавающей  запятой  формата  G.  Для

  процедуры LIB$POLYH аргумент - число  с  плавающей  запятой

  формата H.






                           - 362 -

                       00152-01 33 09-2


       Старший коэффициент

       Использование в МОС ВП: слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Наибольший числовой ненулевой коэффициент, участвующий

  в  вычислении.  Аргумент  наибольший  коэффициент  -  адрес

  целого слова со знаком, которое  содержит  этот  наибольший

  числовой коэффициент.

       Если порядок равен 0, то результат эквивалентен  с[0].

  Диапозон степени от 0 до 31.


       Коэффициент

       Использование в МОС ВП: число с плавающей запятой

       Тип: число с плавающей запятой формата F,

            число с плавающей запятой формата D,

            число с плавающей запятой формата G,

            число с плавающей запятой формата H

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Коэффициенты с плавающей запятой. Аргумент коэффициент

  - адрес  массива   коэффициентов   с   плавающей   запятой.

  Коэффициент члена наивысшего  порядка  многочлена  является

  наименьшим адресом этого массива. Для  процедуры  LIB$POLYF

  аргумент коэффициент - массив  чисел  с  плавающей  запятой

  формата F. Для процедуры LIB$POLYD аргумент  коэффициент  -

  массив чисел с плавающей запятой формата D.  Для  процедуры

  LIB$POLYG аргумент коэффициент - массив чисел  с  плавающей



                           - 363 -

                       00152-01 33 09-2


  запятой  формата  G.  Для  процедуры   LIB$POLYH   аргумент

  коэффициент - массив чисел с плавающей запятой формата H.


       Результат

       Использование в МОС ВП: число с плавающей запятой

       Тип: число с плавающей запятой формата F,

            число с плавающей запятой формата D,

            число с плавающей запятой формата G,

            число с плавающей запятой формата H

       Доступ: только запись

       Механизм: посредством ссылки

       Результат вычисления. Аргумент результат - адрес числа

  с  плавающей  запятой,  которое  содержит  этот  результат.

  Процедура LIB$POLYF записывает  адрес  аргумента  результат

  как  число  с  плавающей  запятой  формата   F.   Процедура

  LIB$POLYD записывает адрес аргумента результат как число  с

  плавающей запятой формата D. Процедура LIB$POLYG записывает

  адрес аргумента результат как  число  с  плавающей  запятой

  формата G. Процедура LIB$POLYH записывает  адрес  аргумента

  результат как число с плавающей запятой формата H.

       Промежуточные   умножения   выполняются   при   помощи

  расширенных дробей с плавающей запятой (31 бит  для  POLYF,

  63 бита для POLYD, 63  бита  для  POLYG  и  127  битов  для

  POLYH).











                           - 364 -

                       00152-01 33 09-2


       Описание.

       Процедуры LIB$POLYF, LIB$POLYD,  LIB$POLYG,  LIB$POLYH

  предоставляют   пользователям    языков    программирования

  высокого уровня  возможность  вычисления  многочленов.  Эти

  процедуры  используют  элементы  инструкций  POLYF,  POLYD,

  POLYG, POLYH системы МОС ВП.

       Вычисления  выполняются  методом  хорнера.   Результат

  вычисляется по формуле:

       РEЗУЛЬTAT=C[0]+X*(C[I]+X*(C[2]+...X*(C[D])...))

  где D - степень полинома;

      X - аргумент.

       Более подробное описание инструкции POLY содержится  в

  документе [1].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_FLTUND

       - переполнение снизу для чисел  с  плавающей  запятой.

         После округления, промежуточный результат замещается

         нулем и операция продолжается. Если в одной и той же

         инструкции   происходит   переполнение   сверху    и

         переполнение снизу, то  условие  переполнения  снизу

         теряется;

  SS$_ROPRAND

       - зарезервированный операнд.







                           - 365 -

                       00152-01 33 09-2


       Пример 1.

  С+

  С Данный пример на языке программирования фортран

  С Демонстрирует использование процедуры LIB$POLYF;

  С-

          REAL*4 X,COEFF(5),RESULT

          INTEGER*2 DEG

  С+

  С Вычисление X**4 + 2*X**3 - X**2 + X - 3

  С С использованием POLYF;  X = 2.

  С необходимые коэффициенты следующие:

  С-

          DATA COEFF/1.0,2.0,-1.0,1.0,-3.0/

          X = 2.0

          DEG = 4                 ! DEG - длинное слово.

  С+

  С Вычисление (2)**4 + 2*(2**3) -2**2 + 2 - 3.

  С Результат вычисления 27.

  С-

          RETURN = LIB$POLYF(X,DEG,COEFF,RESULT)

          TYPE *,'(2)**4 + 2*(2**3) -2**2 + 2 - 3 = ',RESULT

          END


       Результат работы программы

       (2)**4 + 2*(2**3) -2**2 + 2 - 3 = 27.00000









                           - 366 -

                       00152-01 33 09-2


       Пример 2.

  РROGRAM POLYF(INPUT,OUTPUT);

  (+)

  ( Данный пример демонстрирует использование

  ( процедуры LIB$POLYF для вычисления многочлена.

  (

  (-)

       ТYPE

          WORD = [WORD] 0..65535;

       VAR

          COEFF  : ARRAY [0..2] OF REAL := (1.0,2.0,2.0);

          RESULT : REAL;

          RETURNED_STATUS : INTEGER;

       [EXTERNAL] FUNCTION LIB$POLYF(

             ARG        : REAL;

             DEGREE     : WORD;

             COEFF      : [REFERENCE] ARRAY [L..U:INTEGER]

                          OF REAL;

             VAR RESULT : REAL

             ) : INTEGER; EXTERNAL;

       [EXTERNAL] FUNCTION LIB$STOP(

             CONDITION_STATUS : [IMMEDIATE,UNSAFE] UNSIGNED;

             FAO_ARGS         : [IMMEDIATE,UNSAFE,LIST]

                                 UNSIGNED

             ) : INTEGER; EXTERNAL;

  BEGIN

  (+)




                           - 367 -

                       00152-01 33 09-2


  ( Вызов процедуры LIB$POLYF для вычисления

  (  2(X**2) + 2*X + 1.

  (-)

  RETURNED_STATUS :=LIB$POLYF(1.0,2,COEFF,RESULT);

  IF NOT ODD(RETURNED_STATUS)

  THEN

       LIB$STOP(RETURNED_STATUS);

  WRITELN('F(1.0) = ',RESULT:5:2);

  END.

       Данная программа  на  языке  программирования  ПАСКАЛЬ

  демонстрирует использование процедуры LIB$POLYF.


       Результат работы программы:

       $ RUN POLYF

       F(1.0) = 5.00



       1.85. LIB$PUT_COMMON - ввести строку в  общую

             область


       Процедура LIB$PUT_COMMON копирует содержимое строки  в

  общую  область.  Общая  область  -  это  область,   которая

  сохраняется неизменной при многократной активизации  образа

  в процессе.

       Процедура LIB$PUT_COMMON возвращает  число  копируемых

  символов. Максимальное количество символов,  которые  могут

  быть скопированы - 252.








                           - 368 -

                       00152-01 33 09-2


       Формат:

       LIB$PUT_COMMON  исходная строка [, число]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная строка, которая копируется  в  общую  область

  процедурой LIB$PUT_COMMON. Аргумент исходная строка - адрес

  точечного дескриптора с исходной строкой.


       Число

       Использование в МОС ВП: слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Количество     символов,     копируемых     процедурой

  LIB$PUT_COMMON в общую  область.  Аргумент  число  -  адрес

  целого слова со знаком, содержащего  количество  копируемых

  символов.   Процедура   LIB$PUT_COMMON    записывает    это

  количество в аргумент число.



                           - 369 -

                       00152-01 33 09-2


       Описание.

       Процедуры LIB$PUT_COMMON  и  LIB$GET_COMMON  позволяют

  программам  копировать  строки  в  или  из  общей  области.

  Программы, читающие и записывающие данные в общую  область,

  должны соответствовать ее размеру и  формату.  Максимальная

  длина результирующей строки определяется следующим образом:

       [MIN(256,длиHA данного в области сохранения)-4]

       Таким  образом,  максимально  допустимая   длина   252

  символа.

       В языках программирования  бейсике  и  фортране  можно

  использовать эти процедуры, позволяющие процедуре  USEROPEN

  передавать  информацию  обратно   процедуре,   которая   ее

  вызвала. Процедура USEROPEN не может записывать  аргументы.

  Однако,  она  может   вызвать   процедуру   LIB$PUT_COMMON,

  пересылающую  информацию  в   общую   область.   Вызывающая

  программа может также использовать процедуру LIB$GET_COMMON

  для вызова этой информации.

       Можно также использовать  процедуры  LIB$PUT_COMMON  и

  LIB$GET_COMMON    для     передачи     информации     между

  последовательно выполняемыми образами, например такими  как

  последовательно      выполняемые      образы      процедуры

  LIB$RUN_PROGRAM.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRTRU

       - процедура  успешно  завершена,  но  исходная  строка



                           - 370 -

                       00152-01 33 09-2


         элементов оборвана;

  LIB$_FATERRLIB

       - внутренняя неисправимая ошибка. Эта ошибка указывает

         на внутреннюю ошибку исполнительной библиотеки;

  LIB$_INSVIRMEM

       - недостаточная виртуальная  память.  Вызов  процедуры

         LIB$GET_VM  не  может  быть  осуществлен,  так   как

         программа превысила  допустимый  размер  виртуальной

         памяти;

  LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         имеет неверное значение в его поле DSC$B_CLASS.     



       1.86. LIB$PUT_OUTPUT - копирование строки  на

             SYS$OUTPUT


       Процедура LIB$PUT_OUTPUT копирует  запись  на  текущее

  управляющее   устройство   вывода,   заданное   посредством

  SYS$OUTPUT,  используя  программу  системного  обслуживания

  RMS$PUT.

       LIB$PUT_OUTPUT  строка сообщения


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения






                           - 371 -

                       00152-01 33 09-2


       Аргументы:

       Строка сообщения

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством дескриптора

       Строка сообщения, записываемая на текущее  управляющее

  устройство ввода процедурой LIB$PUT_OUTPUT. Аргумент строка

  сообщения - адрес  точечного  дескриптора  с  этой  строкой

  сообщения. Сообщение не должно содержать инструкции в  коде

  КОИ-8 такие как возврат каретки <ВК>.


       Описание.

       При входе в систему МОС ВП по умолчанию создаются  три

  файла, управляющие потоками ввода-вывода процесса:

       1) SYS$INPUT, принятое по умолчанию, устройство ввода;

       2)  SYS$OUTPUT,  принятое  по  умолчанию,   устройство

  вывода;

       3)  SYS$COMMAND   устройство,   которое   обеспечивает

  команды процесса.

       Эти файлы остаются открытыми  до  выхода  из  системы.

  Существует интефейс между диалоговыми вводом и выводом  или

  пакетом команд и программными средствами  системы  МОС  ВП.

  Первоначально все три файла связаны  с  терминалом.  Однако

  командой диалогового командного языка ASSIGN можно изменить

  эти  назначения  для  получения  информации  из  файла  или

  передачи  информации  в  файл.   Устройства   SYS$INPUT   и

  SYS$COMMAND обычно одинаковы, но ввод  и  командные  потоки



                           - 372 -

                       00152-01 33 09-2


  могут быть разные. Например, во время выполнения косвенного

  командного  файла  на  диалоговом  терминале,   SYS$COMMAND

  ссылается на терминал, а SYS$INPUT ссылается  на  командный

  файл.

       При  первом  вызове  процедуры  LIB$PUT_OUTPUT,   если

  выходной  файл  не  является  постоянным  файлом  процесса,

  процедура  LIB$PUT_OUTPUT   открывает   выходной   файл   и

  располагает его у метки конца файла или создает файл,  если

  он не существует. Для всех последующих вызовов,  внутренний

  идентификатор потока запоминается  в  статистичекой  памяти

  процедур для последовательности вызовов.  Данная  процедура

  не является AST повторно входной.

       Процедура   LIB$PUT_OUTPUT   использует   СУД-32   для

  форматирования  записи  на  вывод,  причем  запись   СУД-32

  включает в себя возврат каретки.  Это  значит,  что  обычно

  запись соответвует строке текста. Поэтому,  чтобы  получить

  явныи контроль возврата каретки, вместо имеющегося в СУД-32

  можно обеспечить его в пределах исходной строки.

       Процедура   LIB$PUT_OUTPUT   наиболее   подходит   для

  программ, написанных на  языках  программирования  БЛИСС  и

  макроассемблера для записи информации в SYS$OUTPUT.

       Если несколько разделяемых образов вызывают  процедуру

  LIB$PUT_OUTPUT, и если каждый разделяемый образ включает  в

  себя копирование LIB$PUT_OUTPUT,  программа  может  сделать

  умножение выходных потоков  и  умножение  версий  выходного

  файла.  Единичное  применение  ссылки   дает   одну   копию

  LIB$PUT_OUTPUT.




                           - 373 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена

       Любые возвращаемые значения СУД-32.


       Пример.

  10      !+

          ! Данная программа демонстрирует использование

          ! процедуры LIB$PUT_OUTPUT для вывода

          ! единичного сообщения.

          !-

          MSGSTR$ = 'единичное сообщение';

          CALL LIB$PUT_OUTPUT(MSGSTR$)

          !+

          ! В данном примере используется установленное

          ! по умолчанию значение SYS$OUTPUT,

          ! поэтому вывод осуществляется на экран терминала.

          !-

          END

       Данная  программа  на  языке  программирования  БЕЙСИК

  иллюстрирует использование процедуры LIB$PUT_OUTPUT.

       Результат работы данной программы следующий:

       единичное сообщение













                           - 374 -

                       00152-01 33 09-2


       1.87. LIB$RADIX_POINT  -  символ  запятой   в

             позиционном представлении числа


       Процедура LIB$RADIX_POINT возвращает системный  символ

  запятой  в  позиционном  представлении  числа.  Этот   знак

  используется внутри числовой  строки  для  отделения  целой

  части  от  дробной.  Эта  процедура  работает   посредством

  попыток  перевода  логического  имени   SYS$RADIX_POINT   в

  логичекое имя процесса, группы или системы.


       Формат:

       LIB$RADIX_POINT  строка [, число символов]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: толко запись

       Механизм: посредством дескриптора

       Строка с символом запятой в позиционном  представлении

  числа. Аргумент строка - адрес точечного дескриптора с этой

  строкой.






                           - 375 -

                       00152-01 33 09-2


       Число символов

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Число символов,  записанных  в  аргументе  строка,  не

  считая конечных  пробелов  в  случае  строки  фиксированной

  длины. Аргумент число символов -  адрес  слова  без  знака,

  содержащего это количество.

       Если строка оборвана на размере, заданном дескриптором

  строки  фиксированной  длины,   аргумент   число   символов

  устанавливается  в  этот  размер.  Поэтому  аргумент  число

  символов   всегда   может   быть   использован   вызывающей

  программой для доступа к действительной  подстроке  первого

  аргумента.


       Описание.

       Если невозможно осуществить перевод логического  имени

  SYS$RADIX_POINT, процедура  LIB$RADIX_POINT  выдает  символ

  запятой в позиционном представлении числа (.). Если перевод

  удается,  то  выдается  созданныи  текст.  Таким   образом,

  администратор  системы  может  задать   SYS$RADIX_POINT   в

  качестве  логического  имени  системы,   чтобы   обеспечить

  значением по умолчанию всех пользователей, а индивидуальный

  пользователь может задать SYS$RADIX_POINT,  как  логическое

  имя процесса, чтобы обойти значение по умолчанию. Процедура

  LIB$RADIX_POINT  используется   в   неявном   виде   языком

  программирования БЕЙСИК.



                           - 376 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRTRU

       - процедура успешно завершена, но строка оборвана;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память;

  LIB$_INSVTRDES

       - неверный строчный дескриптор.



       1.88. LIB$REMQHI  -  удаление   элемента   из

             начала очереди


       Процедура  LIB$REMQHI  удаляет   элемент   из   начала

  заданной, циклической очереди. Процедура LIB$REMQHI  выпол-

  няет инструкцию  REMQHI  системы  МОС  ВП,  как  вызываемую

  процедуру.


       Формат:

       LIB$REMQHI   заголовок, адрес входа [, число

                     повторений]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись





                           - 377 -

                       00152-01 33 09-2


       Механизм: посредством значения


       Аргументы:

       Заголовок

       Использование в МОС ВП: квадрослово со знаком

       Тип: целое квадрослово (со знаком)

       Доступ: модификация

       Механизм: посредством ссылки

       Заголовок  очереди,  из  которой  удаляется   элемент.

  Аргумент  заголовок  содержит  адрес  целого   выравненного

  квадрослова со знаком. Заголовок должен быть установлен в 0

  перед первым  использованием  очереди;  0  означает  пустую

  очередь.


       Адрес входа

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Адрес удаляемого входа. Аргумент адрес входа  -  адрес

  слова без знака, содержащего этот адрес. Если очередь  была

  пустой, то этот аргумент устанавливается в адрес  аргумента

  заголовок.


       Число повторений

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение





                           - 378 -

                       00152-01 33 09-2


       Механизм: посредством ссылки

       Количество  повторений  операции  удаления,  в  случае

  использования  памяти  разделяемой  процессором.   Аргумент

  счетчик повторений - адрес длинного слова, которое содержит

  значение счетчика повторений. Значение равное 1,  указывает

  на отсутствие повторений. По умолчанию принимается значение

  равное 10.


       Описание.

       Очередь, из которой процедура LIB$REMQHI удаляет вход,

  может находится в личной памяти процесса, в  личной  памяти

  процессора или в разделяемой памяти процессора для поддерж-

  ки  очередей  в  процессах,  процессорах  или  параллельных

  процессорах.

       Очередь  -  это  список  с  двумя  связями.  Процедуры

  исполнительной   библиотеки   задают    элементы    очереди

  посредством их адресов. Два длинных слова, начальная  связь

  и конечная связь определяют размещение элемента по  отноше-

  нию к предыдущему и последующему элементам.

       Циклическая очередь - это  очередь,  в  которой  связи

  между элементами определяются смещениями; два длинных слова

  представляют смещение предыдущего и последующего  элементов

  по отношению к текущему. Команды INSQHI  и  REMQHI  системы

  МОС ВП позволяют добавлять и исключать  элементы  в  начало

  циклической    очереди.    Соответствующими     процедурами

  исполнительной библиотеки являются процедуры  LIB$INSQHI  и

  LIB$REMQHI.





                           - 379 -

                       00152-01 33 09-2


       Команды циклической очереди  блокированы  и  не  могут

  быть прерваны, поэтому другие процессы  не  могут  вставить

  или удалить элементы очереди, в то время, когда это  делает

  текущая программа. Так как эта операция требует одновремен-

  ного изменения двух указателей, то она не может выполняться

  языками  программирования  высокого   уровня   без   вызова

  процедур доступа к очереди исполнительной библиотеки.

       Когда используются  эти  процедуры,  взаимодействующие

  процессы могут сообщаться без  дальнейшей  синхронизации  и

  боязни  быть  прерваннми  в  отдельном   процессе   или   в

  мультипрограммной среде. Процедуры доступа к очереди  также

  используются в  AST  среде;  они  позволяют  добавлять  или

  удалять элементы  из  очереди,  без  выполнения  прерывания

  посредством асинхронного системного захвата.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура  успешно  завершена.  Элемент  удален   из

         начала очереди, а  результирующая  очередь  содержит

         один или более элементов;

  LIB$_ONEENTQUE

       - процедура успешно завершена. Элемент был  удален  из

         начала очереди, а результирующая очередь пустая;

  LIB$_SECINTFAI

       - повторная  попытка  была  неудачной   столько   раз,

         сколько  указано  в  аргументе   число   повторений.

         Очередь   не   изменяется.   Это   состояние   может

         возникнуть только в случае, когда очередь  находится



                           - 380 -

                       00152-01 33 09-2


         в  памяти,  распределенной  между  двумя  или  более

         процессорами;

  LIB$_QUEWASEMP

       - очередь была пустой. Очередь не изменена;

  SS$_ROPRAND

       - ошибка зарезервированного  операнда.  Либо  элемент,

         либо начало очереди находится по адресу, который  не

         является выравненным квадрословом или  адрес  начала

         очереди равен адресу элемента.



       1.89. LIB$REMQTI - удаление элемента из конца

             очереди


       Процедура LIB$REMQTI удаляет элемент из конца заданной

  циклической   очереди.   Процедура   LIB$REMQTI   выполняет

  инструкцию REMQTI системы МОС ВП, как вызываемую процедуру.


       Формат:

       LIB$REMQTI  заголовок, адрес входа

                   [, число повторений]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения









                           - 381 -

                       00152-01 33 09-2


       Аргументы:

       Заголовок

       Использование в МОС ВП: квадрослово со знаком

       Тип: целое квадрослово (со знаком)

       Доступ: модификация

       Механизм: посредством ссылки

       Заголовок очереди, определяющий  очередь,  из  которой

  удаляется элемент. Аргумент заголовок содержит адрес  этого

  выравненного квадрослова со знаком. Заголовок  должен  быть

  установлен в  0  перед  первым  использованием  очереди;  0

  означает пустую очередь.


       Адрес входа

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Адрес удаляемого  элемента.  Аргумент  адрес  входа  -

  адрес слова без знака, содержащего этот адрес. Если очередь

  была пустой, то  этот  аргумент  устанавливается  на  адрес

  начала очереди.


       Число повторений

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество повторенных  попыток  удаления  элемента  в




                           - 382 -

                       00152-01 33 09-2


  случае  ошибки   при   использовании   разделяемой   памяти

  процессора. Аргумент  число  повторений  -  адрес  длинного

  слова, содержащего значение счетчика  повторений.  Значение

  равное 1, указывает на отсутствие повторений. По  умолчанию

  принимается значение равное 10.


       Описание.

       Очередь, из которой процедура LIB$REMQTI удаляет  эле-

  мент, может находится  в  личной  памяти  процесса,  личной

  памяти процессора или  разделяемой  памяти  процессора  для

  поддержки   очередей   в   процессах,    процессорах    или

  параллельных процессорах.

       Очередь  -  это  список  с  двумя  связями.  Процедуры

  исполнительной   библиотеки   задают    элементы    очереди

  посредством их адресов. Два длинных слова, начальная  связь

  и   конечная   связь   определяют    размещение    элемента

  относительно предыдущего и последующего элементов.

       Циклическая очередь - это  очередь,  в  которой  связи

  между элементами определяются смещением; два длинных  слова

  представляют смещение предыдущего и последующего  элементов

  по отношению к текущему элементу. Команды INSQTI  и  REMQTI

  системы МОС ВП позволяют добавлять  и  удалять  элементы  в

  конце  циклической  очереди.  Соответствующими  процедурами

  исполнительной библиотеки являются LIB$INSQTI и LIB$REMQTI.

       Команды циклической очереди  блокированы  и  не  могут

  быть прерваны, поэтому другие процессы  не  могут  добавить

  или удалить элементы очереди, в то время, когда это  делает

  текущая программа. Так как при этом требуется одновременное



                           - 383 -

                       00152-01 33 09-2


  изменение двух указателей, то эта операция не может  выпол-

  няться языками программирования высокого уровня без  вызова

  процедур доступа к очереди исполнительной библиотеки.

       Когда     используется      процедура      LIB$REMQTI,

  взаимодействующие процессы могут сообщаться без  дальнейшей

  синхронизации и без опасности быть прерванными в  отдельном

  процессе  или  в  мультипрограммном  среде;  они  позваляют

  добавлять или удалять элемент  из  очереди  без  выполнения

  прерывания посредством асинхронного системного захвата.


       Возращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена. Элемент удален из конца

         очереди, а результирующая очередь содержит один  или

         более элементов;

  LIB$_ROPRAND

       - ошибка  зарезервированного  операнда.   Очередь   не

         изменена.  Либо   элемент,   либо   начало   очереди

         находится по адресу, который не является выравненным

         квадрословом, или адрес начала очереди равен  адресу

         входа;

  LIB$ONEENTQUE

       - процедура успешно завершена. Элемент был  удален  из

         конца очереди, а результирующая очередь пустая;

  LIB$_QUEWASEMP

       - очередь была пустой. Очередь не изменена;

  LIB$_SECINTFAI

       - повторная  попытка  была  неудачной   столько   раз,



                           - 384 -

                       00152-01 33 09-2


         сколько раз определено в аргументе число повторений.

         Очередь   не   изменяется.   Это   состояние   может

         возникнуть только в случае, когда очередь  находится

         в  памяти,  разделенной  между   двумя   или   более

         процессорами.



       1.90. LIB$RENAME_FILE - переименование одного

             или нескольких файлов


       Процедура LIB$RENAME_FILE изменяет имя (имена)  одного

  или более файлов. Спецификация переименуемого  файла  может

  содержать символы обобщения.

       Процедура LIB$RENAME_FILE по своим функциям аналогична

  команде DCL RENAME.


       Формат:

       LIB$RENAME_FILE файл 1, файл 2 [, файл 3]

                       [, файл 4] [, флаги]

                       [, успешная процедура]

                       [, процедура ошибки]

                       [, процедура подтверждения]

                       [, аргумент пользователя]

                       [, строка 1] [, строка 2]

                       [, контекст]


       Код возврата:

       Использование в МОС ВП: значение_состояния

       Тип: длинное слово (без знака)





                           - 385 -

                       00152-01 33 09-2


       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Файл 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Спецификация   файла,    который    переименовывается.

  Аргумент файл 1 - адрес  точечного  дескриптора  со  старой

  спецификацией файла. Спецификация может  содержать  символы

  обобщения, в этом случае каждый файл, который соответствует

  указанной  спецификации  переименовывается.  Строка  должна

  содержать не более 255 символов. Поддерживается любой класс

  строк.


       Файл 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора.

       Файловая спецификация с новым именем  файла.  Аргумент

  файл 2 - адрес точечного дескриптора с новой  спецификацией

  файла.

       Эта   спецификация   не   должна   быть   законченной;

  отсутствующие поля,  или  определенные  с  помощью  символа

  обобщения  (*),  заполняются  из  существующего   файлового




                           - 386 -

                       00152-01 33 09-2

                           
  имени, используя те же правила, что и  команда  диалогового

  командного языка RENAME.

       Эта строка не должна содержать  больше  255  символов.

  Поддерживается любой класс строк.


       Файл 3

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Спецификация файла, принятая по умолчанию  для  файла,

  который  переименовывается.  Аргумент  файл   3   -   адрес

  точечного дескриптора с файловой спецификацией, принятой по

  умолчанию.

       Это необязательный аргумент; если он  отсутствует,  то

  по  умолчанию  принимается  нулевая  строка.  Информация  о

  спецификации файла, принятой  по  умолчанию,  содержится  в

  документе [1]. Эта строка не должна  содержать  больше  255

  символов. Поддерживается любой класс строк.


       Файл 4

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Относительная спецификация  переименовываемого  файла.

  Аргумент  файл  4   -   адрес   точечного   дескриптора   с

  относительной  спецификацией  файла.   Это   необязательный




                           - 387 -

                       00152-01 33 09-2


  аргумент,  по   умолчанию   принимается   нулевая   строка.

  Поддерживается любой класс строк.

       Используется синтаксический контроль  входного  файла.

  Более полная информация об относительной спецификации файла

  и входном файле синтаксического контроля содержится в доку-

  менте [1].

       Относительная спецификация файла  используется,  когда

  обрабатываются списки  спецификации  файла.  Неопределенные

  части  спецификации   файла   наследуются   от   последнего

  обрабатываемого процесса.


       Флаги

       Использование в МОС ВП: маска длинное слово

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Длинное    слово    флаговых    битов,    обозначающих

  необязательный режим. Аргумент флаги - адрес длинного слова

  без знака, содержащего флаговые  биты.  Это  необязательный

  аргумент; если он отсутствует, то все флаги будут очищены.

       Числовой бит, символ и их значения описаны в табл. 34.

















                           - 388 -

                       00152-01 33 09-2


                                                   Таблица 34

  -----------------------------------------------------------

   Бит  !                Описание

  -----------------------------------------------------------

    0   ! Если аргумент  файл 2  не определяет  номер версии,

        ! то флаг контролирует  будет ли назначен номер вер-

        ! сии для выходного файла. Если он очищен, файлу да-

        ! ется номер версии на 1 выше,  чем любой предыдущий

        ! существующий файл, с таким же именем и типом файла.

        ! Это действие установлено по умолчанию.  Если уста-

        ! новлен,  используется текущий  номер версии.  Если

        ! файл уже существует с тем же именем,  типом файла

        ! и номером версии, выдается ошибка RMS$_FEX. Этот

        ! флаг эквивалентен квалификатору  /NONEW_VERSION

        ! команды RENAME диалогового командного языка


       Успешная процедура

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки

       Заданная  пользователем  упешная  процедура,   которую

  процедура LIB$RENAME_FILE вызывает после каждого  успешного

  переименования. Аргумент успешная процедура -  адрес  маски

  входа успешной процедуры.









                           - 389 -

                       00152-01 33 09-2


       Процедура ошибки

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов

       Механизм: посредством ссылки

       Заданная  пользователем  процедура   ошибки,   которую

  процедура  LIB$RENAME_FILE  вызывает  каждый   раз,   когда

  обнаруживается ошибка. Аргумент процедура  ошибки  -  адрес

  маски  входа  процедуры  ошибки.   Значение,   возвращаемое

  процедурой   ошибки,   определяет,   будет   ли   процедура

  LIB$RENAME_FILE продолжать обработку файлов.


       Процедура потверждения

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональныи вызов

       Механизм: посредством ссылки

       Заданная пользователем процедура потверждения, которую

  процедура LIB$RENAME_FILE  вызывает  перед  переименованием

  фаила. Аргумент процедура потверждения - адрес маски  входа

  процедуры подтверждения.  Возвращаемое  значение  процедуры

  потверждения определяет, будет или  нет  переименован  файл

  процедурой LIB$RENAME_FILE.

       Процедура потверждения может использоваться при выборе

  спецификации файла, который переименовывается,  основываясь

  на таких критериях как текущая дата, размер и т.д.







                           - 390 -

                       00152-01 33 09-2


       Аргументы пользователя

       Использованние в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Значение, которое процедура  LIB$RENAME_FILE  передает

  успешной, ошибочной и подтверживающей процедурам при каждом

  вызове.  При  передаче  аргумента  пользователя   процедуре

  LIB$RENAME_FILE используется любой механизм, приемлемый для

  передачи его процедурам. Это необязательный аргумент;  если

  он отсутствует, то передается нулевое значение.


       Строка 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Строка, в которую процедура LIB$RENAME_FILE записывает

  старую   результирующую   спецификацию   файла   последнего

  обработанного   файла.   Это    необязательный    аргумент.

  Поддерживается любой класс строк.


       Строка 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Строка, в которую процедура LIB$RENAME_FILE записывает




                           - 391 -

                       00152-01 33 09-2


  новую  результирующую  файловую   спецификацию   последнего

  обрабатываемого файла. Аргумент строка 2 - адрес  точечного

  дескриптора с новым именем.  Это  необязательный  аргумент.

  Поддерживается любой класс строк.


       Контекст

       Использование в МОС ВП: контекст

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Контекс   для   переименованного    списка    файловых

  спецификаций. Аргумент контекст  -  адрес  длинного  слова,

  которое  содержит  контекст.  Можно  инициализировать   это

  длинное  слово  перед  первой  серией   вызовов   процедуры

  LIB$RENAME_FILE. Процедура LIB$RENAME_FILE использует  этот

  контекст, сохраняя файл контекста для  многократного  ввода

  файлов.

       Это   необязательный    аргумент;    его    необходимо

  определить, только если используется  многократно  вводимые

  файлы, как это делает команда RENAME диалогового командного

  языка.

       Можно  освободить   контекст   посредством   процедуры

  LIB$FILE_SCAN во время обработки запросов LIB$FILE_SCAN_END

  после завершения всех вызовов процедуры LIB$RENAME_FILE.











                           - 392 -

                       00152-01 33 09-2


       Описание.

       Описание состоит из трех частей:

       1) формат вызова успешой процедуры;

       2) формат вызова процедуры ошибок;

       3) формат вызова процедуры подтверждения.


       Формат вызова успешной процедуры


       Успешная  процедура  не  обязательный  аргумент;   она

  вызывает  лишь  тогда,  когда   задан   аргумент   успешная

  процедура в вызове процедуры LIB$RENAME_FILE:


       Формат:

       Успешная процедура   файл 1, файл 2

                            [, аргумент пользователя]


       Файл 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая     файловая     спецификация     перед

  переименованием файла. Если аргумент файл 1  определен,  то

  он используется для  передачи  строки  успешной  процедуре.

  Поэтому передается класс S строки  типа  Т.  Поддерживается

  любой класс строк.










                           - 393 -

                       00152-01 33 09-2


       Файл 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая     файловая     спецификация     вновь

  переименованного файла. Если аргумент файл 2 определен,  он

  используется  для  передачи  строки   успешной   процедуре.

  Поэтому передается класс S строки  типа  Т.  Поддерживается

  любой класс строк.


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Значение аргумента пользователя передается  процедурой

  LIB$RENAME_FILE  успешной  процедуре   используя   тот   же

  механизм передачи, который используется  при  передаче  его

  процедуре LIB$RENAME_FILE.


       Формат вызова процедуры ошибки


       Процедура ошибки  возвращает  успешное  или  неудачное

  значение, которое процедура LIB$RENAME_FILE использует  при

  определении, будет ли  производиться  дальнейщая  обработка

  файлов,   если   встретилась   ошибка.   Процедура   ошибки

  вызывается в том случае, когда определен аргумент процедура

  ошибки в вызове процедуры  LIB$RENAME_FILE.  Если  аргумент



                           - 394 -

                       00152-01 33 09-2


  процедура ошибки не определен, то по умолчанию определяется

  продолжение обработки файлов.


       Формат вызова процедуры ошибки следующий:

       Процедура ошибки  файл 1, файл 2, код 1, код 2,

                         код ошибки, аргумент пользователя


       Файл 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая     спецификация     файла,     которая

  переименовывается,  в  случае  обнаружения   ошибки.   Если

  аргумент файл 1 определен, то он используется для  передачи

  строки  процедуре  ошибки.  Поэтому  используется  класс  S

  строки типа т. Поддерживается любой класс дескриптора.


       Файл 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая  файловая  спецификация  нового   имени

  фаила, используемого  в  момент  обнаружения  ошибки.  Если

  аргумент файл 2 определен, то он используется для  передачи

  строки  процедуре  ошибки.  Поэтому  используется  класс  S

  строки типа Т. Поддерживается любой класс строк.





                           - 395 -

                       00152-01 33 09-2


       Код 1

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Первоначальный  условный  код   (FAB$L_STS),   который

  описывает произошедшую  ошибку.  Аргумент  код  1  -  адрес

  длинного  слова  без  знака,   содержащего   первоначальный

  условный код.


       Код 2

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Вторичный условный код (FAB$L_STV), который  описывает

  произошедшую ошибку. Аргумент код 2 - адрес длинного  слова

  без знака, содержащего вторичный условный код.


       Код ошибки

       Использование МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Целочисленный код, который определяет точку, в которой

  произошла ошибка. Аргумент  код  ошибки  -  адрес  длинного

  слова, содержащего целочисленный код.

       Возможные  значения  кодов  ошибок  и  их   об'яснения




                           - 396 -

                       00152-01 33 09-2


  следующие:

       1) 0 - ошибка поиска аргумента файл 1;

       2) 1 - синтаксическая ошибка аргумента файл 2;

       3) 2 - ошибка переименования файла.


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Значение  аргумента  пользователя,  которое  процедура

  LIB$RENAME_FILE передает процедуре ошибки, используя тот же

  механизм передачи, который использовался при  передаче  его

  процедуре LIB$RENAME_FILE.

       Если процедура ошибки  возвращает  успешное  состояние

  (бит  установлен  в  0),   то   процедура   LIB$RENAME_FILE

  продолжает обработку файлов.  Если  возвращается  состояние

  ошибки (бит установлен в 1), то дальнейшая обработка файлов

  немедленно   прекращается   и   процедура   LIB$RENAME_FILE

  возвращается в состояние ошибки.

       Процедура ошибок не вызывается для ошибок, связанных с

  копированием строки.


       Формат вызыва процедуры подтверждения

       Процедура подтверждения имеет следующий формат вызова:

       Процедура подтверждения  файл 1, файл 2,

                                фаб [, аргумент пользователя]






                           - 397 -

                       00152-01 33 09-2


       Файл 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая     спецификация     файла,     которая

  перименовывается. Если аргумент файл  1  определен,  то  он

  используется для передачи строки  процедуре  подтверждения.

  Поэтому передается класс S строки  типа  Т.  Поддерживается

  любой класс строк.


       Файл 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая файловая спецификация, переименованного

  файла. Если аргумент файл 2 определен, то  он  используется

  для  передачи  строки  процедуре   подтверждения.   Поэтому

  используется класс S строки типа  Т.  Поддерживается  любой

  класс строк.


       Фаб

       Использование в МОС ВП: фаб

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Адрес СУД-32, который  описывает  переименуемый  файл.




                           - 398 -

                       00152-01 33 09-2


  Программа пользователя должна выполнить команду  $OPEN  для

  получения  признаков  файла,  необходимых  для  определения

  бедет ли переименован файл, и должна закрыть файл с помощью

  команды   $CLOSE    перед    возвращением    в    процедуру

  LIB$RENAME_FILE.


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Значение аргумента пользователя передается  процедурой

  LIB$RENAME_FILE процедуре подтверждения, используя  тот  же

  механизм передачи, который  используется  при  ее  передаче

  LIB$RENAME_FILE.

       Этот необязательный аргумент.

       Если процедура подтверждения возвращает успешное  зна-

  чение (бит установлен в 0), файл  переименовывается,  иначе

  файл не переименовывается.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_ERROUCAL

       - процедура успешно  завершена,  но  процедура  ошибки

         вызвала обработчик состояния;

  LIB$_INVARG

       - неверный аргумент. Аргумент  флаги  имеет  один  или




                           - 399 -

                       00152-01 33 09-2


         более неверно установленных бита;

  LIB$_INVFILSPE

       - неверная спецификация файла. Аргументы файл 1,  файл

         2, файл 3 содержат более чем 255 символов.

  LIB$_INVSTRDES

       - неверный   строчный   дескриптор.   Дескриптор   для

         аргумента   строки   является   неверным    строчным

         дескриптором;

  LIB$_WRONUMARG

       - неверное количество  аргументов  передано  процедуре

         LIB$RENAME_FILE.

       Любые  возвращаемые   значения   состояния   процедуры

  LIB$SCOPY_XXX; ошибки усечения игнорируются.

       Любые возвращаемые  значения  состояния  СУД-32.  Если

  аргумент процедура ошибки не  определен,  то  это  наиболее

  тяжелая   ошибка    СУД-32,    встретившаяся    во    время

  переименования файла.



       1.91. LIB$RESERVE_EF -  резервирование  флага

             события


       Процедура   LIB$RESERVE_EF   размещает   номер   флага

  локального события, определенного  аргументом  номер  флага

  события.











                           - 400 -

                       00152-01 33 09-2


       Формат:

       LIB$RESERVE_EF номер флага события


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Номер флага события

       Использование в МОС ВП: число

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Номер флага события,  который  размещается  процедурой

  LIB$RESERVE_EF. Аргумент номер флага события содержит адрес

  целого длинного слова  со  знаком,  которое  является  этим

  номером флага события.


       Описание.


       Процедура LIB$RESERVE_EF размещает номер определенного

  флага  события.  Эта   процедура   отлична   от   процедуры

  LIB$GET_VM, которая размещает произвольный флаг события.

       Можно   использовать   процедуру    LIB$FREE_EF    для

  освобождения   флага   события   размещенного    процедурой

  LIB$RESERVE_EF.






                           - 401 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_EF_ALRRES

       - флаг события уже зарезервирован;

  LIB$_EF_RESSYS

       - флаг события зарезервирован для системы МОС ВП.  Это

         происходит тогда, когда номер флага события  выходит

         за пределы 1 - 23 и 32 - 63.


       Пример.

  РROGRAM RESERVE_EF(INPUT, OUTPUT);

  PROCEDURE LIB$RESERVE_EF(%REF EVENT_FLAG_NUM : INTEGER);

                            EXTERN;

  PROCEDURE LIB$FREE_EF(%REF EVENT_FLAG_NUM : INTEGER);

                         EXTERN;

  VAR

    FLAG_NUM : INTEGER;

  BEGIN

    FLAG_NUM := 37;

    LIB$RESERVE_EF(FLAG_NUM);

    WRITELN(FLAG_NUM);

    LIB$FREE_EF(FLAG_NUM);

  END.

       Результат работы программы:

       37







                           - 402 -

                       00152-01 33 09-2


       1.92. LIB$RESET_VM_ZONE - восстановление зоны

             виртуальной памяти


       Процедура  LIB$RESET_VM_ZONE  освобождает  все   блоки

  памяти, которые были предварительно размещены в зоне.


       Формат:

       LIB$RESET_VM_ZONE  идентификатор зоны


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Идентификатор зоны

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Идентификатор  зоны.  Аргумент  идентификатор  зоны  -

  адрес  длинного  слова,  содержащего  идентификатор   зоны,

  созданной предыдущими вызовами процедуры LIB$CREATE_VM_ZONE

  или процедуры LIB$CREATE_USER_VM_ZONE.


       Описание.

       Процедура  LIB$RESET_VM_ZONE  освобождает  все   блоки

  памяти, которые были предварительно размещены в зоне. После

  этого  память  может  вновь  использоваться  запросами   на



                           - 403 -

                       00152-01 33 09-2


  размещение в зоне. Программа пользователя может  продолжить

  использование     зоны     после      вызова      процедуры

  LIB$RESET_VM_ZONE.

       Восстановление  зоны  наиболее  эффективный  путь  для

  многократного   использование   накопителя,   кроме    того

  индивидуально освобождает каждый размещенный об'ект зоны.

       При попытке осуществить любые операции в зоне во время

  выполнения процедуры LIB$RESET_VM_ZONE результат будет неп-

  редсказуемым.

       Если определено освобождение заполнением при  создании

  зоны, процедура LIB$RESET_VM_ZONE заполняет все размещенные

  блоки, которые освобождаются.


       Возвращаемые значения состояния:

  SS$NORMAL

       - процедура успешно завершена;

  LIB$_BADBLOADR

       - неверный аргумент идентификатор зоны.



       1.93. LIB$REVERT - возвращение к обработчику,

             активизирующему процедуру


       Процедура  LIB$REVERT  удаляет  обработчик  состояния,

  установленный процедурой LIB$ESTABLISH, посредством  удале-

  ния адреса, задающего обработчик состояния, из кадра  стека

  процедуры.








                           - 404 -

                       00152-01 33 09-2


       Формат:

       LIB$REVERT


       Код возврата:

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Предыдущее содержание SF$A_HANDLER (длинное  слово  0)

  вызываемого фрагмента стека. Это адрес действующего  преды-

  дущего  обработчика  состояния.  Если  обработчик  не   был

  задействован, то возвращается 0.


       Аргументы:

       отсутствуют


       Описание.

       Процедура LIB$REVERT  возвращает  адрес,  который  она

  обнулила в фрагменте стека вызываемой программы.  Процедура

  LIB$REVERT используется только, если процедура пользователя

  должна установить обработчик состояния  для  ее  частичного

  выполнения.

       Процедура LIB$REVERT предназначена преимущественно для

  использования с языками без встроенных обработчиков ошибок,

  таких как ФОРТРАН. Нельзя использовать процедуру LIB$REVERT

  для языков программирования БЕЙСИК, КОБОЛ, ПАСКАЛЬ, ПЛ/1.

       В макроассемблере лучше использовать  следующую  инст-

  рукцию вместо использования процедуры LIB$REVERT:





                           - 405 -

                       00152-01 33 09-2


       СLRL     (FP)  ; Установить адрес обработчика состоя-

                      ; ния в 0 в текущем фрагменте стека.




       Возвращаемые значения состояния:

       отсутствуют



       1.94. LIB$RUN_PROGRAM    -    запуск    новой

             программы


       Процедура  LIB$RUN_PROGRAM  останавливает   выполнение

  текущей программы и начинает выполнение другой программы.


       Формат:

       LIB$RUN_PROGRAM    имя программы


       Код возврата:

       Использование в МОС ВП: символьная строка

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Имя программы

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя файла программы, которая будет выполняться  вместо

  текущей программы. Аргумент имя  программы  содержит  адрес



                           - 406 -

                       00152-01 33 09-2


  точечного дескриптора со строкой с именем файла. Максималь-

  ная длина строки с именем файла 255 символов. По  умолчанию

  принимается тип файла .EXE.


       Описание.

       Процедура  LIB$RUN_PROGRAM  останавливает   выполнение

  текущей программы и начинает выполнение другой программы.

       Если она завершена успешно, то управление  не  возвра-

  щается вызываемой программе. Вместо этого вызывается  прог-

  рамма системного обслуживания $EXIT, образ старой программы

  заменяется образом новой программы в процессе  пользователя

  и интерпретатор команды передает управление  новому  образу

  если  неудачно,  управление   возвращается   интерпретатору

  команды.

       Процедура LIB$RUN_PROGRAM предназначена для  использо-

  вания с интерпретаторами командного языка DCL и  MCR.  Если

  образ выполняется как подпроцесс или как отсоединенный про-

  цесс, то для выполнения этой функции не существует  интерп-

  ретатора командного языка. В этом случае выдается сообщение

  об ошибке LIB$_NOCLI.

       Процедура LIB$RUN_PROGRAM вызывает  текущий  образ  на

  выходе в  точке  вызова,  и  непосредственно  интерпретатор

  командного языка, если  он  имеется,  запускает  выполнение

  другой программы. Если процедура LIB$RUN_PROGRAM  выполнена

  успешно, то управление передается следующей программе, если

  нет, то  управление  передается  интерпретатору  командного

  языка. Вызывающая программа не может восстановить  управле-

  ние. Здесь используется  метод  -  формирования  вызывающей



                           - 407 -

                       00152-01 33 09-2


  последовательности.

       Процедура LIB$RUN_PROGRAM работает в режиме  совмести-

  мости с операционной системой реального времени  (далее  по

  тексту система ОС РВ), где формирование  последовательности

  используется для расширения адресного пространства  системы

  МОС ВП. Так как данная процедура используется в режиме сов-

  местимости, она не будет работать до тех пор, пока  система

  МОС ВП имеет произвольный режим совместимости.

       Процедура LIB$RUN_PROGRAM может  также  применяться  в

  системе МОС ВП, где адресное пространство строго ограничено

  и большие образы не допустимы. Например, можно использовать

  формирование последовательности  для  выполнения  системной

  генерации (SYSGEN) на маленьком  виртуальном  пространстве,

  из-за  недостатка  дискового  пространства.  Из   процедуры

  LIB$RUN_PROGRAM вызывающая программа может передавать аргу-

  менты следующей программе  в  последовательности  используя

  только общую область сохранения. Для этого вызывающей прог-

  рамме вначале необходимо вызвать  процедуру  LIB$PUT_COMMON

  для передачи информации в общую область  сохранения.  Вызы-

  вающая программа использует  процедуру  LIB$GET_COMMON  для

  восстановления данных.

       Применение этого  метода  не  рекомендуется,  т.к.  не

  существует способа для определения аргументов, передаваемых

  в общую  область  сохранения.  Поэтому  программы,  которые

  передают аргументы этим способом, должны  знать  о  формате

  данных перед тем как они будут переданы. Если  используется

  общая область сохранения, очень трудно сохранить  программ-




                           - 408 -

                       00152-01 33 09-2


  ный модуль и AST-PEEHTEPAБEЛЬHOCTЬ.

       Кроме того, процедура LIB$RUN_PROGRAM  не  может  быть

  использована, если не существует интерпретатора  командного

  языка, для выполнения образа  в  качестве  подпроцесса  или

  отсоединенного подпроцесса.

       Для возвращения управления вызывающей программе вместо

  процедуры  LIB$RUN_PROGRAM  лучше  использовать   процедуру

  LIB$SPAWN.


       Возвращаемые значения состояния:

  LIB$_INVARG

       - неверный аргумент;

  LIB$_NOCLI

       - отсутствует интепретатор командного языка для выпол-

         нения функции. Вызывающий процесс не имеет интерпре-

         татора командного языка для выполнения этой  функции

         или интерпретатор командного  языка  не  работает  с

         требуемым  типом.  Отметим,  что  выполнение  образа

         задачи в виде подпроцесса или отсоединенного процес-

         са не имеет интерпретатора командного языка;

  LIB$_UNECLIERR

       - непредвиденная ошибка интерпретатора командного язы-

         ка. Интерпретатор командного языка  выдал  состояние

         ошибки, которое не было распознано. Эта ошибка может

         быть связана с использованием нестандартного интерп-

         ретатора командного языка.







                           - 409 -

                       00152-01 33 09-2


       1.95. LIB$SCANC - поиск символа в строке


       Процедура LIB$SCANC используется для  поиска  заданных

  установленных  символов  в   исходной   строке.   Процедура

  LIB$SCANC выполняет инструкцию SCANC системы  МОС  ВП,  как

  вызываемую процедуру.


       Формат:

       LIB$SCANC  исходная строка, таблица, маска


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Относительная позиция в исходной строке символа, кото-

  рый является конечным для операции или нуль  если  конечный

  символ не найден. Если исходная строка имеет нулевую длину,

  возвращается нуль.


       Аргументы:

       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная строка, используемая процедурой LIB$SCANC как

  индекс в таблице. Аргумент исходная строка  содержит  адрес

  точечного дескриптора с этой исходной строкой.




                           - 410 -

                       00152-01 33 09-2


       Таблица

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Таблица, индексы которой процедура  LIB$SCANC  склады-

  вает с байтом аргумента маска.  Аргумент  таблица  содержит

  адрес массива байтов без знака, который является этой  таб-

  лицей.


       Маска

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Маска, которая складывается с байтом из аргумента таб-

  лица. Аргумент маска содержит адрес байта без знака,  кото-

  рый является этой маской.


       Описание.

       Процедура LIB$SCANC использует последовательные байты,

  заданная аргументом исходная строка как  индекс  в  таблице

  байт, выбирающийся из таблицы складывается с байтом  маски.

  Операция заканчивается, когда результат равен единице.


       Возвращаемые значения состояния:

       отсутствуют







                           - 411 -

                       00152-01 33 09-2


       1.96. LIB$SCOPY_DXDX  -  копирование  строки,

             передаваемой посредством дескриптора, в

             результирующую строку


       Процедура  LIB$SCOPY_DXDX  копирует  исходную  строку,

  передаваемую  посредством  дескриптора,  в   результирующую

  строку.


       Формат:

       LIB$SCOPY_DXDX    Исходная строка, результирующая

                         строка


       Точка входа JSB:

       LIB$SCOPY_DXDX6


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством ссылки

       Исходная строка, которая копируется  в  результирующую

  строку процедурой LIB$SCOPY_DXDX. Аргумент исходная  строка

  содержит адрес точечного дескриптора  с  исходной  строкой.



                           - 412 -

                       00152-01 33 09-2


  Класс дескриптора может быть неопределенным,  фиксированной

  длины, десятичной строкой,  массивом,  несвязным  массивом,

  переменным или динамическим.


       Результирующая строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка, в которую  копируется  исходная

  строка.  Аргумент  результирующая  строка  содержит   адрес

  точечного дескриптора с результирующей  строкой.  Действия,

  выполняемые в зависимости от класса  дескриптора  результи-

  рующей строки, определены в табл. 35.

                                                   Таблица 35

  -----------------------------------------------------------

     Поле класса       !           Действие

  -----------------------------------------------------------

  DSC$K_CLASS_S,Z,SD,A,! Копирование элементов исходной стро-

  NCA                  ! ки. Если необходимо, строка допол-

                       ! няется или обрывается справа

  DSC$K_CLASS_D        ! Если область задана при помощи

                       ! результирующего дескриптора и до-

                       ! статочно велика, для размещения

                       ! исходной строки,  то  выполняется

                       ! копирование исходной строки и за-

                       ! дается новая длина в результирую-




                           - 413 -

                       00152-01 33 09-2


                                         Продолжение табл. 35

  -----------------------------------------------------------

     Поле класса       !           Действие

  -----------------------------------------------------------

                       ! щем дескрипторе.  Если  заданная

                       ! область недостаточно  велика, то

                       ! выдается предыдущее деление облас-

                       ! ти (если оно есть), а  затем ди-

                       ! намически размещается необходимое

                       ! количество  области.  Элементы

                       ! исходной строки копируются, уста-

                       ! навливается новая длина и адрес

                       ! результирующего дескриптора

  DSC$K_CLASS_VS       ! Выполняется копирование исходной

                       ! строки в результирующую строку до

                       ! предела DSC$W_MAXSTRLEN без запол-

                       ! нения. Выполняется чтение только

                       ! поля текущей длины для действи-

                       ! тельного количества копируемых бай-

                       ! тов


       Описание.

       Процедура LIB$SCOPY_DXDX возвращает все  значения  как

  состояния; обрыв квалифицируется как успешное значение сос-

  тояния (нулевой бит установлен в 1). Возможны эквивалентные

  точки входа JSB, при этом R0 содержит первый аргумент, а R1

  содержит второй.





                           - 414 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена. Все символы из введеной

         строки скопированы в результирующую строку;

  LIB$_STRTRU

       - процедура  успешно   завершена.   Строка   оборвана.

         Результирующая строка фиксированной длины  не  может

         вместить все символы, копируемые из исходной строки;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка. Эта ошибка указывает

         на внутреннюю ошибку исполнительной библиотеки;

  LIB$_INSVIRMEM

       - недостаточная виртуальная  память.  Вызов  процедуры

         LIB$GET_VM не может быть осуществлен из-за того, что

         программа  превысила  допустимую  квоту  виртуальной

         памяти;

   LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         имеет неверное значение в поле DSC$B_CLASS.



       1.97. LIB$SCOPY_R_DX -  копирование  исходной

             строки, передаваемой посредством ссылки

             в результирующую строку


       Процедура  LIB$SCOPY_R_DX  копирует  исходную  строку,

  передаваемую посредством ссылки в результирующую строку.







                           - 415 -

                       00152-01 33 09-2


       Формат:

       LIB$SCOPY_R_DX  длина, исходная строка,

                       результирующая строка


       Точка входа JSB:

       LIB$SCOPY_R_DX6

       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Длина

       Использование в МОС ВП: слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Длина исходной строки. Аргумент длина  содержит  адрес

  слова без знака, являющегося длиной.


       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством ссылки

       Исходная строка, которая копируется  в  результирующую

  строку процедурой LIB$SCOPY_R_DX. Аргумент исходная  строка

  - адрес исходной строки.



                           - 416 -

                       00152-01 33 09-2


       Результирующая строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Результирующая строка, в которую  копируется  исходная

  строка.  Аргумент  результирующая  строка  содержит   адрес

  точечного дескриптора с результирующей  строкой.  Действия,

  выполняемые в зависимости от класса  дескриптора  результи-

  рующей строки описаны в табл. 36.

                                                   Таблица 36

  -----------------------------------------------------------

     Поле класса       !            Действие

  -----------------------------------------------------------

  DSC$K_CLASS_S,Z,SD,A,! Копирование исходной строки. Если

  NCA                  ! необходимо, строка дополняется или

                       ! обрывается справа

  DSC$K_CLASS_D        ! Если область задана при помощи ре-

                       ! зультирующего дескриптора и доста-

                       ! точно велика,  для  размещения ис-

                       ! ходной строки, то выполняется копи-

                       ! рование исходной строки и задается

                       ! новая длина в  результирующем дес-

                       ! рипторе.

                       ! Если заданная область недостаточно

                       ! велика, то выдается предыдущее рас-

                       ! пределение области (если оно есть),




                           - 417 -

                       00152-01 33 09-2


                                         Продолжение табл. 36

  -----------------------------------------------------------

     Поле класса       !            Действие

  -----------------------------------------------------------

                       ! а затем динамически размещается

                       ! требуемое количество области.

                       ! исходная строка копируется, устана-

                       ! вливается новая длина и адрес резу-

                       ! льтирующего дескриптора

  DSC$K_CLASS_VS       ! Выполняется копирование исходной

                       ! строки в результирующую строку до

                       ! предела DSC$W_MAXSTRLEN без запол-

                       ! нения. Выполняется чтение только

                       ! текущего поля длины для действите-

                       ! льного количества копируемых байтов


       Описание.

       Процедура LIB$SCOPY_R_DX возвращает все значения  сос-

  тояния как условные состояния.  Обрыв  квалифицируется  как

  успешное значение состояния (бит 0 установлен в 1).

       Возможны эквивалентные точки входа JSB, с R0 начинает-

  ся первый аргумент, R1 - второй и R2 - третий. Длина  аргу-

  мента передается битами 15:0 в R0.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена. Все символы из  введен-

         ной строки скопированы в результирующую строку;




                           - 418 -

                       00152-01 33 09-2


  LIB$_STRTRU

       - процедура  успешно   завершена.   Строка   оборвана.

         Результирующая строка фиксированной длины  не  может

         вместить  все  символы,  скопированные  из  исходной

         строки;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка. Эта ошибка указывает

         на внутренную ошибку исполнительной библиотеки;

  LIB$INSVIRMEM

       - недостаточная виртуальная  память.  Вызов  процедуры

         LIB$GET_VM не может быть осуществлен из-за того, что

         программа  превысила  допустимую  квоту  виртуальной

         памяти;

  LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         имеет неверное значение в поле DSC$B_CLASS.



       1.98. LIB$SET_LOGICAL - установка логического

             имени


       Процедура LIB$SET_LOGICAL требует, чтобы интерпретатор

  командного языка вызываемого процесса определил или переоп-

  ределил логическое  имя  в  режиме  супервизора.  Процедура

  LIB$SET_LOGICAL имеет те же функции что и команда  диалого-

  вого командного языка DEFINE.









                           - 419 -

                       00152-01 33 09-2


       Формат:

       LIB$SET_LOGICAL   имя [, значение] [, таблица]

                         [, характеристики] [, список]

       Должен быть определен или аргумент список,  или  аргу-

  мент значение. Если заданы оба аргумента,  то  игнорируется

  аргумент значение.


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством дескриптора


       Аргументы:

       Имя

       Использование в МОС ВП: логическое имя

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Логическое имя, которое определяется  или  переопреде-

  ляется. Аргумент имя содержит адрес  точечного  дескриптора

  со строкой с логическим именем. Максимальная длина логичес-

  кого имени 255 символов.


       Значение

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение





                           - 420 -

                       00152-01 33 09-2


       Механизм: посредством дескриптора

       Значение,  которое  присваивается  логическому  имени.

  Аргумент значение содержит адрес точечного  дескриптора  со

  строкой значения.  Максимальная  длина  аргумента  значение

  логического имени 255 символов.

       Если  этот  аргумент  отсутствует,  отдельный  элемент

  списка должен быть задан значением (значениями) логического

  имени.


       Таблица

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя  таблицы,  в  которой  создается  логическое  имя.

  Аргумент таблица содержит  адрес  точечного  дескриптора  с

  таблицей логического имени. Если таблица не задана,  то  по

  умолчанию используется LNM$PROCESS.


       Характеристики

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Логическое имя или характеристики трансляции. Аргумент

  характеристики  -   адрес   длинного   слова   без   знака,

  содержащего логическое имя или характеристики трансляции.

       LNM$M_CONFINE и LNM$M_NO_ALIAS текущие  характеристики




                           - 421 -

                       00152-01 33 09-2


  логичекого   имени.    Характеристики    LNM$M_CONFINE    и

  LNM$M_NO_ALIAS описаны в программе системного  обслуживания

  $CRELNM в документе [1].

       Если аргумент список не  указан,  могут  быть  указаны

  характеристики трансляции LNM$M_CONCEALED и LNM$M_TERMINAL.

  Описание команды ASSIGN содержится в документе [2].

       Если аргумент список задан, он содержит характеристики

  трансляции    для    каждой    эквивалентной    строки    в

  характеристике.


       Список

       Использование в МОС ВП: список элементов

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Список элементов, описывающий эквивалентные имена  для

  этих  логических  имен.  Аргумент  список  содержит   адрес

  массива длинных слов без  знака,  которые  содержат  список

  элементов. Если аргумент список не указан,  логическое  имя

  имеет только одно значение,  которое  указано  в  аргументе

  значение.

       Если  аргумент  список  указан,  то  разрешены  только

  характеристики логического имени. Характеристики трансляции

  находятся в списке элементов.

       Список  необходим,  только  тогда,   когда   создаются

  многократно дублируемые строки с одним логическим именем.







                           - 422 -

                       00152-01 33 09-2


       Описание.

       Если необязательный  аргумент  таблица  определен,  то

  логическое   имя   помещается   в   таблицу,   определенную

  аргументом  таблица,  в  противном  случае  логическое  имя

  размещается в таблице LNM$PROCESS.

       В отличие от программ системного обслуживания  $CRELNM

  и $CRELOG,  процедура  LIB$SET_LOGICAL  не  требует,  чтобы

  вызывающая программа выполнялась в режиме  супервизора  для

  того, чтобы задать логическое  имя  в  режиме  супервизора.

  Когда образ задачи  выполняется,  логические  имена  режима

  супервизора не удаляются. Программа может получить  текущее

  значение любого логического имени при помощи  вызова  прог-

  раммы  системного  обслуживания   $TRNLNM.   Более   полная

  информация о логичеких именах содержится в документе [1].

       Процедура    LIB$SET_LOGICAL     предназначена     для

  использования с интепретаторами командного языка DCL и MCR.

  Если   образ   задачи   выполняется   непосредственно   как

  подпроцесс или как отсоединенный процесс, то не  существует

  интерпретатора  командного  языка   для   выполнения   этой

  функции. В этом случае выдается ошибка LIB$_NOCLI.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_SUPERSEDE

       - процедура успешно завершена. Предыдущее  определение

         логического имени заменено;





                           - 423 -

                       00152-01 33 09-2


  SS$_BUFFEROVF

       - процедура  успешно   завершена,   однако   произошло

         переполнение буфера;

  SS$_ACCVIO

       - нарушение правил доступа.  Логическое  имя  или  его

         значение не могут быть прочитаны;

  SS$_BADPARAM

       - неверныи аргумент;

  SS$_INSFMEM

       - недостаточная динамическая память;

  SS$_IVLOGNAM

       - неверное логическое  имя.  Логическое  имя  или  его

         значение содержит более 255 символов;

  SS$_IVLOGTAB

       - неверная таблица логичекого имени;

  SS$_NOPRIV

       - нет привелегии для выполнения операции;

  SS$_TOOMANYLNAM

       - транслируемое логическое  имя  превышает  допустимую

         глубину;

  LIB$_INVARG

       - ни аргумент список, ни аргумент значение не указаны;

  LIB$_INVSTRDES

       - неверный строчный дескриптор;

  LIB$_NOCLI

       - отсутствует  интерпретатор  командного   языка   для

         выполнения  функции,  вызывающий  процесс  не  имеет




                           - 424 -

                       00152-01 33 09-2


         интерпретатора командного языка. Выполнение образа в

         качестве подпроцесса или отсоединенного процесса  не

         имеет интерпретатора командного языка;

  LIB$_UNECLIERR

       - непредвиденная ошибка интепретатора командного  язы-

         ка. Интерпретатор командного языка  выдал  сообщение

         об ошибке, которое не было  распознано.  Эта  ошибка

         может быть связана с  использованием  нестандартного

         интерпретатора командного языка.


       Пример.



      0    !    1    !    2    !    3    !    4    !

  12345678901234567890123456789012345678901234567890

      5    !    6    !    7    !

  123456789012345678901234567890

  С* Инициализация логического имени

  С                       MOVE 'RPG_LOG' LOGICAL  7

  С* Инициализация значения, для которого устанавливается

  С  логика

  С                       MOVE 'OFF'      SETVAL  3

  С               SETLOG  EXTRN'LIB$SET_LOGICAL'

  С* Вызов  процедуры для установления логики

  С                       CALL SETLOG

  С                       PARMD           LOGICAL

  С                       PARMD           SETVAL

  С                       SETON                   LR





                           - 425 -

                       00152-01 33 09-2


       Программа RPG II, устанавливает логическое имя RPG_LOG

  с OFF. Это значение может быть выведено на экран  терминала

  после выполнения программы с SHOW LOGICAL:

       $SHOW LOGICAL RPG_LOG

       "RPG_LOG" = "OFF" (LNM$PROCESS_TABLE)



       1.99. LIB$SET_SYMBOL -  определение  значения

             символа интерпретатора командного языка


       Процедура LIB$SET_SYMBOL требует, чтобы  интерпретатор

  командного  языка  вызываемого   процесса   определил   или

  переопределил символ интепретатора командного языка.


       Формат:

       LIB$SET_SYMBOL  символ, значение [, таблица]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Символ

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Имя символа, который определяется  или  модифицируется




                           - 426 -

                       00152-01 33 09-2


  процедурой  LIB$SET_SYMBOL.   Аргумент   символ   -   адрес

  точечного  дескриптора  со   строкой   с   символом.   Если

  переопределяется ранее определенный символ CLI, то значение

  символа заменяется на новое значение, которое задано.

       Имя символа преобразуется в прописной шрифт, а  конеч-

  ные пробелы удаляются. Аргумент символ может  начинаться  с

  буквы (от а  до  Z),  знака  подчеркивания  (_)  или  знака

  доллара  ($).  Максимальная  длина  аргумента  символ   255

  символов.


       Значение

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Значение, которое задается символу. Аргумент  значение

  - адрес точечного декриптора со строкой с этим значением.

       Конечные пробелы удаляются перед использованием  этого

  значения.  Максимальная  длина  аргумента  значение  -  255

  символов.  Не   допускаются   целые   значения.   Процедура

  LIB$SET_SYMBOL предназначена для  использования  символьной

  строки CLI, но не целых символов CLI.


       Таблица

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки




                           - 427 -

                       00152-01 33 09-2


       Указатель  таблицы,  которая   содержит   определяемый

  символ. Аргумент таблица - адрес целого длинного  слова  со

  знаком, которое и является этим указателем таблицы.

       Если аргумент  таблица  отсутствует,  то  используется

  таблица  локальных   символов.   Возможные   значения   для

  аргумента таблица приведены в табл. 37.

                                                   Таблица 37

  -----------------------------------------------------------

    Символьное имя    ! Значение !   Используемая таблица

  -----------------------------------------------------------

  LIB$K_CLI_LOCAL_SYM !  1       ! Таблица локальных симвлов

  LIB$K_CLI_GLOBAL_SYM!  2       ! Таблица глобальных симво-

                      !          ! лов


       Описание.

       Символы интерпретатора командного  языка,  создаваемые

  процедурой LIB$SET_SYMBOL, могут быть недоступны для других

  команд  интерпретатора  командного  языка.  Чтобы  избежать

  такой ситуации, необходимо убедиться, что имена этих симво-

  лов являются буквенно-цифровыми, и, что первый символ  бук-

  венный.

       LIB$K_CLI_LOCAL_SYM  или  LIB$K_CLI_GLOBAL  определены

  как глобальные символы в символьной  библиотеке.  Процедура

  LIB$SET_SYMBOL   предназначена    для    использования    с

  интепретатором командного языка DCL. Если она  используется

  с интерпретатором командного языка MCR, то выдается  ошибка

  LIB$_NOCLI. Если образ выполняется непосредствено как подп-

  роцесс, или как отсоединенный процесс, то для этой  функции



                           - 428 -

                       00152-01 33 09-2


  не существует интерпретатора командного языка, в этом  слу-

  чае выдается состояние ошибки LIB$_NOCLI.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_AMBSYMDEF

       - неодназначное определение символа. При  сравнении  с

         существующими именами символов  данное  имя  символа

         оказалось неодназначным. Это состояние может возник-

         нуть, если ранее были заданы сокращенные символы;

  LIB$FATERRLIB

       - неисправимая внутренняя  ошибка.  Она  указывает  на

         внутреннюю ошибку исполнительной библиотеки;

  LIB$_INSCLIMEM

       - память интерпретатора командного языка  недостаточна

         для получения виртуальной  памяти,  необходимой  для

         выполнения данной функции. Это может быть связано  с

         заданием слишком большого числа  символов.  Ситуация

         может быть облегчена путем удаления некоторых  опре-

         делений символов;

  LIB$_INSVIRMEM

       - недостаточная виртуальная  память.  Вызов  процедуры

         LIB$GET_VM не выполнен, так как программа  превысила

         допустимую квоту виртуальной памяти;

  LIB$_INVARG

       - неверный аргумент.  Неверный  аргумент  таблица  или

         длина, или аргумент значение больше 255 символов;



                           - 429 -

                       00152-01 33 09-2


  LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         неверная величина в его поле DSC$B_CLASS;

  LIB$_NOCLI

       - отсутствует  интерпретатор  командного   языка   для

         выполнения данной  функции.  Вызывающий  процесс  не

         имеет интерпретатора командного языка для выполнения

         этой функции, или интерпретатор командного языка  не

         работает с  требуемым  типом.  Выполнение  образа  в

         качестве подпроцесса или  отсоединного  процесса  не

         имеет интерпетатора командного языка;

  LIB$UNECLIERR

       - непредсказуемая  ошибка.  Интерпретатор   командного

         языка CLI выдал состояние ошибки,  которое  не  было

         распознано. Эта ошибка может быть связана с  исполь-

         зованием  нестандартного  интерпретатора  командного

         языка.


       Пример.



      0    !    1    !    2    !    3    !    4    !

  12345678901234567890123456789012345678901234567890

      5    !    6    !    7    !

  123456789012345678901234567890

  С+

  С* Инициализация логического имени

  С                       MOVE 'RPG_LOG' SYMBOL   7

  С* Инициализация значения, для которого устанавливается



                           - 430 -

                       00152-01 33 09-2


  С  логика

  С                       MOVE 'ON'      SETVAL  2

  С               SETSYM  EXTRN'LIB$SET_SYMBOL'

  С* Вызов процедуры для установления символа

  С                       CALL SETSYM

  С                       PARMD           SYMBOL

  С                       PARMD           SETVAL

  С                       SETON                   LR

       Программа RPG II устанавливает символ  RPG_SYM  в  ON.

  Это значение может быть выведено на экран  терминала  после

  выполнения программы с SHOW SYMBOL:

       $ SHOW SYMBOL RPG_SYM

       RPG_SYM="ON"



       1.100. LIB$SFREE1_DD  -   освобождение   одной

              динамической строки


       Процедура LIB$SFREE1_DD возвращает  одну  динамическую

  строку, освобождая ее область сохранения.


       Формат:

       LIB$SFREE1_DD      дескриптор


       Точка входа JSB:

       LIB$SFREE1_DD6











                           - 431 -

                       00152-01 33 09-2


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Дескриптор

       Использование в МОС ВП: квадрослово без знака

       Тип: квадрослово (без знака)

       Доступ: модификация

       Механизм: посредством значения

       Динамический   дескриптор,   задающий    освобождаемую

  область. Аргумент дескриптор - адрес квадрослова без знака,

  которое является  этим  дескриптором.  Предполагается,  что

  дескриптор динамический, а поле его класса не проверяется.


       Описание.

       Прежде чем освободить динамический дескриптор,  проце-

  дура  должна  использовать  процедуры   LIB$SFREE1_DD   или

  LIB$SFREEN_DD чтобы освободить область  сохранения  строки,

  заданную динамическим  дескриптором.  В  противном  случае,

  область сохранения строки не освобождается. Данная процеду-

  ра освобождает описанную область сохранения строки и  флаги

  дескриптора, как описывающие не все строки (DSC$A_POINTER=0

  и DCS$LENGTH=0).








                           - 432 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка.



       1.101. LIB$SFREEN_DD - освобождение одной  или

              несколько динамических строк


       Процедура  LIB$SFREEN_DD  возвращает  одну  или  более

  динамические строки, освобождая их область сохранения.


       Формат:

       LIB$SFREE_DD     количество, дескриптор


       Точка входа JSB:

       LIB$SFREEN_DDR6


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Количество

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение





                           - 433 -

                       00152-01 33 09-2


       Механизм: посредством ссылки

       Количество смежных  дескрипторов,  которые  устанавли-

  ваются процедурой LIB$SFREEN_DD как  имеющие  неразмещенную

  область (DSC$A_POINTER=0 и  DCS$LENGTH=0).  Аргумент  коли-

  чество содержит адрес длинного  слова  без  знака,  с  этим

  количеством. Освобождаемая область передается  в  свободную

  память.


       Дескриптор

       Использование в МОС ВП: вектор квадрослово без знака

       Тип: квадрослово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки, ссылки на массив.

       Первый дескриптор массива дескрипторов. Аргумент деск-

  риптор - адрес квадрослова без знака, которое является пер-

  вым  дескриптором.  Предполагается,  что  эти   дескрипторы

  являются динамическими и классы их полей не проверяются.


       Описание.

       Перед тем, как процедура, размещающая область вернется

  к вызывающей ее программе, она должна использовать процеду-

  ру LIB$SFREE1_DD или процедуру LIB$SFREEN_DD, чтобы освобо-

  дить область сохранения строки, заданную несколькими  деск-

  рипторами, расположенную в стеке. Иначе область не освобож-

  дается и программа выполняется вне виртуальной памяти.

       Эта процедура освобождает описанную область сохранения

  строки  и  об'являет  каждый  дескриптор  как   описывающий

  отсутствие строки (DSC$A_POINTER=0 и DSC_LENGTH=0).




                           - 434 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

   LIB$_FATERRLIB

       - неисправимая внутренняя ошибка.



       1.102. LIB$SGET1_DD    -    получение    одной

              динамической строки


       Процедура LIB$SGET1_DD распределяет динамическую  вир-

  туальную память для заданного дескриптора строки.


       Формат:

       LIB$SGET1_DD    длина, строка


       Точка входа JSB:

       LIB$SGET1_DD_R6


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Длина

       Использование в МОС ВП: слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись





                           - 435 -

                       00152-01 33 09-2


       Механизм: посредством значения

       Количество  байтов  динамической  виртуальной  памяти,

  которое размещается процедурой LIB$SGET1_DD. Аргумент длина

  - адрес слова без знака, содержащего это количество. Размер

  распределенной памяти должен быть  округлен  автоматически.

  Если количество байтов равно нулю, то размещается  наимень-

  ший размер памяти.


       Строка

       Использование в МОС ВП: квадрослово без знака

       Тип: квадрослово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки

       Дескриптор динамической строки, для которого процедура

  LIB$SGET1_DD распределяет динамичекую  виртуальную  память.

  Аргумент строка - адрес квадрослова без знака с этим  деск-

  риптором. Аргумент строка должен содержать адрес дескрипто-

  ра динамической строки; процедура  LIB$SGET1_DD  возвращает

  непредсказуемый результат,  если  в  этом  аргументе  будет

  задан любой другой тип дескриптора. Поле класса  не  прове-

  ряется,  но  устанавливается  динамически  (LIB$B_CLASS=2).

  Длина поля (DSC$W_LENGTH) устанавливается аргументом длина,

  а адрес поля  (DSC$A_POINTER)  задает  размещенную  область

  строки.











                           - 436 -

                       00152-01 33 09-2


       Описание.

       Процедура     LIB$SGET1_DD      подобна      процедуре

  LIB$SCOPY_DX_DX за исключением того, что исходная строка не

  копируется. Можно записать все в отведенную  область.  Если

  аргумент строка уже имеет размещенную для него  динамичекую

  память, но ее размер меньше чем, тот который указан в аргу-

  менте длина, то эта область освобождается  перед  тем,  как

  процедура LIB$SGET1_DD разместит новую область.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка. Эта ошибка указывает

         на внутреннюю ошибку исполнительной библиотеки;

  LIB$_INSVIRMEM

       - недостаточная виртуальная память.  Вызов  LIB$GET_VM

         не может быть осуществлен из-за того, что  программа

         превысила допустимую квоту виртуальной памяти.



       1.103. LIB$SHOW_TIMER    -     воспроизведение

              накопленных значений времени и счетчика


       Процедура  LIB$SHOW_TIMER  воспроизводит   накопленные

  значения времени и счетчика, начиная  с  последнего  вызова

  процедуры LIB$INIT_TIMER  и  отображает  их  на  устройстве

  SYS$OUTPUT. Задаваемая пользователем стандартная  программа

  может менять этот, установленный по умолчанию режим.




                           - 437 -

                       00152-01 33 09-2


       Формат:

       LIB$SHOW_TIMER [блок памяти] [, код] [, стандартная

                       программа] [, аргумент пользователя]


       Код возврата:

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Блок памяти

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Блок памяти, содержащий значение возвращаемое предыду-

  щим вызовом процедуры LIB$INIT_TIMER. Аргумент блок  памяти

  - адрес длинного слова без знака, содержащего это значение.

  Если он указан, то указатель должен иметь то  же  значение,

  которое   было   выдано   предыдущим   вызовом    процедуры

  LIB$INIT_TIMER.    Если    он    отсутствует,     процедура

  LIB$SHOW_TIMER использует блок памяти, размещенный процеду-

  рой LIB$INIT_TIMER. Если аргумент блок памяти  отсутствует,

  а процедура LIB$INIT_TIMER ранее не вызывалась, то  исполь-

  зованное время будет соответствовать действительному време-

  ни дня, а остальные значения будут  равными  накопленным  с

  момента загрузки процесса. Процедура LIB$SHOW_TIMER предпо-




                           - 438 -

                       00152-01 33 09-2


  лагает,   что   предварительно   была   вызвана   процедура

  LIB$INIT_TIMER, и что результаты этого вызова храняться или

  в блоке, указанном посредством аргумента блок памяти или  в

  памяти распределенной процедурой LIB$INIT_TIMER.


       Код

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Целочисленный код, определяющий заданные  статистичес-

  кие данные; если он отсутствует или равен нулю, то все пять

  статистических данных выводятся в строку.  Аргумент  код  -

  адрес целого длинного слова со знаком, содержащего  статис-

  тический код. Значения, допустимые для аргумента код приве-

  дены в табл. 38.

                                                  Таблица 38

  ----------------------------------------------------------

    Значение   !             Описание

  ----------------------------------------------------------

      1        ! Использованное время

      2        ! Время центрального процессора

      3        ! Буферный ввод-вывод

      4        ! Прямой ввод-вывод

      5        ! Испорченные страницы









                           - 439 -

                       00152-01 33 09-2


       Стандартная программа

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: фукциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Поддерживаемая  пользователем  стандартная  программа,

  вызываемая процедурой LIB$SHOW_TIMER. Аргумент  стандартная

  программа - адрес входа в эту программу. По умолчанию  про-

  цедура LIB$SHOW_TIMER записывает  результат  в  SYS$OUTPUT.

  Стандартная программа возвращает  либо  значение  состояния

  успеха, либо  значение  состояния  неудачи.  Это  состояние

  возвращается вызывающей программе  как  значение  процедуры

  LIB$SHOW_TIMER.


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством значения

       32-битовое значение, передаваемое стандартной програм-

  ме без преобразования. Если  данный  аргумент  отсутствует,

  процедура LIB$SHOW_TIMER передает значение  нуль  программе

  пользователя.


       Описание.

       Процедура  LIB$SHOW_TIMER  воспроизводит   накопленные

  значения времени и счетчика, начиная  с  последнего  вызова

  процедуры LIB$INIT_TIMER.




                           - 440 -

                       00152-01 33 09-2


       По умолчанию, когда в вызове не  определены  аргументы

  код  и  стандартная  программа,  процедура   LIB$SHOW_TIMER

  записывает в SYS$OUTPUT строку с информацией, приведенной в

  табл. 39.

                                                  Таблица 39

  ----------------------------------------------------------

          Строка        !        Описание

  ----------------------------------------------------------

  ELAPSED=HHHH:MM:SS.CC ! Использованное реальное время

  CPU=HHHH:MM:SS.CC     ! Использованое время центрального

                        ! процессора

  BUFIO=NNNN            ! Счетчик буферных операций ввода-

                        ! вывода

  DIRIO=NNNN            ! Счетчик прямых операций ввода-

                        ! вывода

  PAGEFAULTS=NNNN       ! Счетчик испорченных страниц


       Какое-нибудь одно, или все пять статистических  данных

  могут быть записаны  в  SYS$OUTPUT  или  переданы  заданной

  пользователем   стандартной   программе   для    дальнейшей

  обработки.


       Формат вызова стандартной программы


       Стандартная программа - это  задаваемая  пользователем

  программа, вызываемая процедурой LIB$SHOW_TIMER.  Стандарт-

  ная программа используется, если нужно  записать  результат

  на устройство, отличное от SYS$OUTPUT. Программа вызывается

  только, если задан аргумент стандартная программа в  вызове



                           - 441 -

                       00152-01 33 09-2


  процедуры LIB$SHOW_TIMER.

       Процедура    LIB$SHOW_TIMER    вызывает    стандартную

  программу, используя следующий формат:

       Стандартная программа  строка  [, аргумент

                                         пользователя]


       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка фиксированной длины,  содержащая  запрашиваемые

  статистические данные. Строка будет  сформатирована,  точно

  так  же,  как  она  бы  была  сформирована  для  записи  на
             
  SYS$OUTPUT. Первый символ - пробел.


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством значения

       32-битовое     значение     передаваемое     процедуре

  LIB$SHOW_TIMER. Аргумент пользователя передается  стандарт-

  ной программе без преобразования.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;





                           - 442 -

                       00152-01 33 09-2


  LIB$_INVARG

       - неверный аргумент. Неверно указаны или аргумент код,

         или аргумент блок памяти.


       Пример.

  РROGRAM SHOW_TIMER(INPUT,OUTPUT);

  (+)

  ( Данный пример демонстрирует использование

  ( процедуры LIB$SHOW_TIMER.

  (-)

       VAR

          RETURNED_STATUS : INTEGER;

       [EXTERNAL] FUNCTION LIB$INIT_TIMER(

             HANDLE_ADR : [REFERENCE] UNSIGNED := %IMMED 0

             ) : INTEGER; EXTERNAL

       [EXTERNAL] FUNCTION LIB$SHOW_TIMER(

             HANDLE_ADR : [REFERENCE] UNSIGNED := %IMMED 0;

             CODE       : INTEGER;

             [IMMEDIATE,UNBOUND]

  PROCEDURE ACTION_RTN( OUT_STR  : [CLASS_S PACKED ARRAY

                        [L..U:INTEGER] OF CHAR;

                        USER_ARG : INTEGER) : = %IMMED 0;

             USER_ARG : INTEGER) : = %IMMED 0

             ) : INTEGER; EXTERNAL;

       [EXTERNAL] FUNCTION LIB$STOP(

             CONDITION_STATUS : [IMMEDIATE,UNSAFE] UNSIGNED;

             FAO_ARGS         : [IMMEDIATE,UNSAFE,LIST]

                                 UNSIGNED



                           - 443 -

                       00152-01 33 09-2


             ) : INTEGER; EXTERNAL;

          PROCEDURE USER_ACTION_RTN(

             OUT_STR : [CLASS_S] PACKED ARRAY [L..U:INTEGER]

                                               OF CHAR;

             USER_ARG : INTEGER);

             BEGIN

             WRITELN('USER ARGUMENT IS ',USER_ARG:1);

             WRITELN(OUT_STR);

             END

  BEGIN

  (+)

  ( Вызов процедуры LIB$INIT_TIMER  для инициализации

  ( внутреннего счетчика исполнительной библиотеки.

  (-)

  RETURN_STATUS : = LIB$INIT_TIMER;

  IF NOT ODD(RETURNED_STATUS)

  THEN

       LIB$STOP(RETURNED_STATUS);

  (+)

  ( Печать текстовой строки с потерянным временем.

  (-)

  WRITELN('израсходованное время достигло использованного

           времени и испорченных страниц');

  (+)

  ( Вызов процедуры LIB$SHOW_TIMER для вывода счетчика.

  (-)

  RETURNED_STATUS := LIB$SHOW_TIMER(,O,USER_ACTION_RTN,5)




                           - 444 -

                       00152-01 33 09-2


  END.C

       Данная  программа  на  языке  програмирования  ПАСКАЛЬ

  демонстрирует использование процедуры LIB$SHOW_TIMER.

       Результат работы программы:

       $RUN SHOW_TIMER

       Израсходаванное время достигло использованного времени

  и испорченных страниц.

       Аргумент пользователя равен 5.

       ЕLAPSED:00:00:00.66 CPU:0:00:00.13 BUFIO 2 DIRIO:7

       FAULTS:17



       1.104. LIB$SHOW_VM      -      воспроизведение

              статистических    данных    виртуальной

              памяти


       Процедура LIB$SHOW_VM  выдает  статистические  данные,

  накопленные  вызовом  процедур   LIB$GET_VM,   LIB$FREE_VM,

  LIB$GET_VM_PAGE и LIB$FREE_VM_PAGE.


       Формат:

       LIB$SHOW_VM      [код] [, стандартная программа]

                        [, аргумент пользователя]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения





                           - 445 -

                       00152-01 33 09-2


       Аргументы:

       Код

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Код,   задающий   одно   из   статистических   данных,

  записанное на SYS$OUTPUT или переданное  стандартной  прог-

  рамме обработки.  Аргумент  код  -  адрес  целого  длинного

  слова,   содержащего   этот   статистический    код.    Это

  необязательный аргумент. Если статистический  код  отсутст-

  вует, или, если он равен нулю, то в одной  строке  выдаются

  все три статистические параметра 1, 2 и 3. Допустимые  зна-

  чения для аргумента код приведены в табл. 40.

                                                  Таблица 40

   ---------------------------------------------------------

   Значение  !              Статистика

   ---------------------------------------------------------

     0       ! Выдается статистика для параметров 1, 2, 3

     1       ! количество успешных вызовов процедуры

             ! LIB$GET_VM

     2       ! Количество успешных вызовов процедуры

             ! LIB$FREE_VM

     3       ! Количество байтов, размещенных процедурой

             ! LIB$GET_VM, но еще не освобожденных процеду-

             ! рой LIB$FREE_VM

     4       ! Выдается статистика для параметров  5, 6, 7




                           - 446 -

                       00152-01 33 09-2


                                        Продолжение табл. 40

   ---------------------------------------------------------

   Значение  !              Статистика

   ---------------------------------------------------------

     5       ! Количество вызовов процедуры LIB$GET_VM_PAGE

     6       ! Количество вызовов процедуры LIB$FREE_VM_PAGE

     7       ! Количество страниц, размещенных процедурой

             ! LIB$GET_VM_PAGE, но еще не освобожденных про-

             ! цедурой LIB$FREE_VM_PAGE


       Стандартная программа

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ : функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на процедуру.

       Поддерживаемая  пользователем  стандартная  программа,

  вызываемая процедурой LIB$SHOW_VM. По умолчанию,  процедура

  LIB$SHOW_VM возвращает статистические данные на SYS$OUTPUT.

  Стандартная программа используется, если необходимо возвра-

  тить статистические данные в файл или на устройство, отлич-

  ное от SYS$OUTPUT. Аргумент стандартная программа  -  адрес

  маски входа стандартной программы. Программа возвращает или

  успешное  или   ошибочное   значение   состояния,   которое

  возвращается как значение процедуры LIB$SHOW_VM.











                           - 447 -

                       00152-01 33 09-2


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       32-битовое  значение,   передаваемое   непосредственно

  стандартной программе без преобразования. т.е.,  содержимое

  списка входов аргумента пользователя копируется в  аргумент

  стандартная программа.


       Описание.

       Процедура LIB$SHOW_VM возвращает  статистические  дан-

  ные, накопленные из вызовов процедур LIB$GET_VM/LIB$FREE_VM

  или LIB$GET_VM_PAGE/LIB$FREE_VM_PAGE. По умолчанию, когда в

  вызове не определены ни аргумент код, ни аргумент стандарт-

  ная программа, процедура LIB$SHOW_VM записывает  строку  со

  следующей информацией:

       МММ вызовов LIB$GET_VM, NNN вызовов LIB$FREE_VM,

       РРР еще размещенные байты

       Любое одно из  6  состояний  может  быть  выведено  на

  SYS$OUTPUT и/или  строка  информации  может  быть  передана

  заданной пользователем процедуре для дальнейшей обработки.


       Формат вызова стандартной программы


       Стандартная программа - это  задаваемая  пользователем

  процедура,   вызываемая   процедурой    LIB$SHOW_VM.    Она

  вызывается, если задан  аргумент  стандартная  программа  в

  вызове процедуры LIB$SHOW_VM.



                           - 448 -

                       00152-01 33 09-2


       Формат:

       стандартная программа  строка, аргумент пользователя


       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Статистические    данные,    обеспечиваемые    вызовом

  процедуры LIB$SHOW_VM. Аргумент строка  -  адрес  точечного

  дескриптора с  адресом,  в  который  процедура  LIB$SHOW_VM

  записывает  статистические  данные.  Строка   форматируется

  точно так же, как она бы была сформатирована для записи  на

  SYS$OUTPUT. Первый  символ  -  пробел;  комбинации  возврат

  каретки/перевод строки не включаются.


       Аргумент пользователя

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством значения

       32-битовое    значение,    передаваемое     процедурой

  LIB$SHOW_VM стандартной программе без преобразования.  Если

  аргумент  пользователя  отсутствует  в   вызове   процедуры

  LIB$SHOW_VM,  программе  пользователя  передается   нулевое

  значение.








                           - 449 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INVARG

       - неверный аргумент. Это  может  быть,  когда  неверно

         указано значение аргумента.

       Любые  возвращаемые   значения   состояния   процедуры

  LIB$PUT_OUTPUT или стандартной программы.



       1.105. LIB$SIGNAL - сигнализируемое  состояние

              отказа


       Процедура LIB$SIGNAL вызывается во всех случаях, когда

  генерируется сигнал, который  указывает,  что  в  программе

  появилось состояние отказа, если  обработчик  состояния  не

  предпринимает исправляющего действия и состояние неисправи-

  мое, программа завершается.


       Формат:

       LIB$SIGNAL    состояние 1 [, счетчик 1] [, FAO-1...]

                     [, состояние 2] [, счетчик 2]

                     [, FAO-2...]

       Обязательно должен быть задан только аргумент  состоя-

  ние 1; другие аргументы являются необязательными.  Аргумент

  счетчик  1,  если  он  задан,   содержит   количество   FAO

  аргументов,  которые   должны   соответствовать   аргументу

  состояние 1. Аргумент состояние 2 необязательныи  аргумент,

  он может быть задан с  или  без  аргумента  счетчик  2  или




                           - 450 -

                       00152-01 33 09-2


  аргументов FAO-2. Аргумент  состояние  2,  если  он  задан,

  содержит количество FAO аргументов,  которые  соответствуют

  аргументу состояние 2. Можно задать аргументы состояние  3,

  состояние 4, состояние 5 и т.д.  Вместе  с  соответсвующими

  аргументами счетчик и FAO.


       Код возврата:

       отсутствует


       Аргументы:

       Состояние

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством значения

       32-битовое значение состояния системы МОС ВП. Аргумент

  состояние - длинное слово без  знака,  содержащее  значение

  состояния.


       Счетчик

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством значения

       Количество  FAO  аргументов,  связанных  со  значением

  состояния.  Аргумент  счетчик  -  целое  длинное  слово  со

  знаком, содержащее это количество.  Если  аргумент  счетчик

  отсутствует или задан  как  0,  то  следовательно  нет  FAO

  аргументов.



                           - 451 -

                       00152-01 33 09-2


       FAO - аргументы

       Использование в МОС ВП: изменяемый аргумент

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Дополнительные FAO аргументы  (формат  вывода  КОИ-8),

  соответствующие заданным значениям состояния.


       Описание.

       Программа вызывает процедуру  LIB$SIGNAL  всякий  раз,

  когда ей необходимо показать состояние отказа  или  вывести

  сообщение  вместо  того,  чтобы  передать   код   состояния

  вызывающей программе.

       Процедура LIB$SIGNAL проверяет первичный  и  вторичные

  вектора отказа,  и  затем  сканирует  (просматривает)  стек

  фрагмент за фрагментом, начиная с его  начала,  и  вызывает

  каждый обработчик  состояния,  который  находит.  Процедура

  LIB$SIGNAL  размещает   блоки   данных   стека,   используя

  указатель фрагмента хранящийся  в  каждом  фрагменте  (FP),

  чтобы  образовать  обратную  связь   через   все   стековые

  фрагменты.

       Если  один  из  обработчиков,  вызываемый   процедурой

  LIB$SIGNAL выдает  код  продолжения,  (то  есть  любой  код

  успешного завершения, у которого нулевой бит равен  1),  то

  процедура  возвращается  к  вызывающей  программе,  которая

  должна быть подготовлена для продолжения работы.

       Если  обработчик,  вызываемый  процедурой  LIB$SIGNAL,

  выдает  код  повторного  сигнала  (то   есть,   любой   код



                           - 452 -

                       00152-01 33 09-2


  неудачного завершения, у которого нулевой бит равен 0),  то

  эта процедура продолжает сканирование стека.

       Если  обработчик,  вызванный  процедурой   LIB$SIGNAL,

  вызывает SYS$UNWIND, управление не возвращается к программе

  вызвавшей процедуру LIB$SIGNAL, а изменяет  код  программы.

  Обработчик может также  изменить  сохраняемую  копию  R0/R1

  после развертки стека. Если обработчик не выполняет ни одно

  из этих условий, то все регистры R0 и R1 и  коды  состояния

  оборудования   сохраняются.   Процедура   LIB$SIGNAL,   при

  необходимости,  будет  сканировать  до   65536   предыдущих

  стековых  фрагментов   и   затем,   исследовать   последний

  оставшийся  вектор  отказа.  Список  аргументов   процедуры

  LIB$SIGNAL,  счетчик  инструкций  (PC)  и   длинное   слово

  состояния  процессора  (PSL)   вызывающей   программы   при

  построении добавляются к вектору сигнального аргумента.


       Возвращаемые значения состояния:

       отсутствуют


       Пример 1.

  С+

  С Данная программа демонстрирует использование

  С процедуры LIB$SIGNAL.

  С

  С Данная программа определяет SS$ ... Сигналы и затем все

  С LIB$SIGNAL, передающие код доступа нарушения как

  С аргумент.

  С-




                           - 453 -

                       00152-01 33 09-2


          INCLUDE '($SSDEF)'

          CALL LIB$SIGNAL ( %VAL(SS$_ACCVIO) )

          END

       В ФОРТРАНе этот  код  сигнального  фрагмента  является

  стандартным сообщением ACCESS VIOLATION.

       Результат работы программы:

  %SYSTEM-F-ACCVIO, ACCESS VIOLATION, REASON MASK=10,

  VIRTUAL ADDRESS=03C00020, рс=00000000, PSL=08000000

  %TRACE-F-TRACEBACK, SYMBOLIC STACK DUMP FOLLOWS

  Имя модуля    Имя процедуры   Строка  REL PC    ABS PC

  D2$MAIN       D2$MAIN         683     00000010  00000410


       Пример 2.

  ;+

  ; Данная  программа  макроассемблера демонстрирует

  ; использование  процедуры LIB$SIGNAL, которая

  ; сигнализирует о нарушении доступа.

  ;-

  : EXTRN SS$_ACCVIO : об'явление внешнего символа

    .ENTRY START,0

  PUSHL #SS$_ACCVIO : символ значения состояния

  ;   FOR ACCESS VIOLATION

  CALLS#1,  G^LIB$SIGNAL : сигнализация состояния

  RET

    .END START

         .EXTRN    SS$_ACCVIO      ; Об'явление внешнего

                                   ; символа

         PUSHL     #SS$ACCVIO      ; Символ значения состо-



                           - 454 -

                       00152-01 33 09-2


                                   ; яния для нарушения

                                   ; доступа

         CALLS     #1, LIB$SIGNAL  ; Сигнализируемое состо-

                                   ; яние

       Данный пример демонстрирует эквивалентный макрокод.

       Результат работы программы:

  %SYSTEM-F-ACCVIO, ACCESS VIOLATION, REASON MASK=OF,

  VIRTUAL ADDRESS=03C00000, PC=00000000, PSL=00000000

  %TRACE-F-TRACEBACK, SYMBOLIC STACK DUMP FOLLOWS

  Имя модуля    Имя процедуры   Строка  REL PC    ABS PC

    .$MAIN        START                 0000000F  0000020F



       1.106. LIB$SIG_TO_RET - преобразование сигнала

              в состояние возврата


       Процедура     LIB$SIG_TO_RET     преобразует     любое

  сигнализируемое значение состояния в значение, возвращаемое

  в виде функции.  Это  значение  возвращается  в  программу,

  вызывающую процедуру  пользователя  LIB$SIG_TO_RET.  Данная

  процедура может быть  установлена  в  качестве  обработчика

  состояния или вызвана из него.


       Формат:

       LIB$SIG_TO_RET  сигнал, механизм


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)





                           - 455 -

                       00152-01 33 09-2


       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Сигнал

       Использование в МОС ВП: вектор длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Вектор  сигнального  аргумента.  Аргумент   сигнал   -

  содержит адрес массива  длинных  слов  без  знака,  который

  является вектором стека сигнального аргумента.


       Механизм

       Использование в МОС ВП: вектор длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Вектор   аргументов   механизма.   Аргумент   механизм

  содержит адрес массива  длинных  слов  без  знака,  которые

  являются вектором стека аргументов механизма.


       Описание.

       Процедура   LIB$SIG_TO_RET   вызывается   со   списком

  аргументов, переданным  обработчику  состояния  при  помощи

  средств  обработки  состояния   МОС   ВП.   Сигнализируемое

  состояние  преобразуется   в   значение,   возвращаемое   в

  программу,   которая   вызвала   процедуру,    установившую

  обработчик.  Стек  не  подведен  к  вызывающей   программе,



                           - 456 -

                       00152-01 33 09-2


  установившей   обработчик    состояния.    Код    состояния

  возвращается   посредством   значения   в   R0.   Процедура

  LIB$SIG_TO_RET заставляет стек быть развернутым  для  прог-

  раммы, вызывающей  процедуру,  установленную  обработчиком,

  вызванным этим сигналом.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура упешно завершена;

  SS$_UNWIND

       - процедура завершена с ошибкой.



       1.107. LIB$SIG_TO_STOP    -     преобразование

              сигнализируемого      состояния       в

              сигнализируемую остановку


       Ппроцедура LIB$SIG_TO_STOP преобразует сигнализируемое

  состояние в сигнализируемое  состояние,  которое  не  может

  быть продолжено.


       Формат:

       LIB$SIG_TO_STOP сигнал, механизм


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения






                           - 457 -

                       00152-01 33 09-2


       Аргументы:

       Сигнал

       Использование в МОС ВП: вектор длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: модификация

       Механизм: посредством ссылки, ссылки на массив.

       Вектор сигнального аргумента. Аргумент сигнал содержит

  адрес массива длинных  слов  без  знака,  которое  является

  стеком вектора сигнального аргумента.


       Механизм

       Использование в МОС ВП: вектор длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Вектор аргумента механизм. Аргумент механизм  содержит

  адрес массива длинных  слов  без  знака,  которые  являются

  стеком вектора аргумента механизм.


       Описание.

       Процедура     LIB$SIG_TO_STOP     вызывает      сигнал

  появляющийся, при  сигнализировании  посредством  процедуры

  LIB$STOP. Код серьезности ошибки устанавливается в  SEVERE,

  а управление не может быть  возвращено  процедуре,  которая

  сигнализирует о состоянии. Процедура LIB$SIG_TO_STOP  может

  быть разрешена как обработчик состояния для процедуры,  или

  она может быть вызвана из обработчика состояния. Если  зна-

  чение  состояния  в  аргументе  сигнал   SS$UNWIND,   тогда




                           - 458 -

                       00152-01 33 09-2


  процедура  LIB$SIG_TO_STOP  возвращает   состояние   ошибки

  LIB$_INVARG.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_UNWIND

       - процедура завершена с ошибкой;

  LIB$_INVARG

       - неверный аргумент. Условный код в  аргументе  сигнал

         будет SS$_UNWIND.



       1.108. LIB$SIM_TRAP - моделировние  прерывания

              с плавающей запятой


       Процедура LIB$SIM_TRAP преобразует ошибки при работе с

  плавающей запятой. Она может быть разрешена как  обработчик

  состояния или может быть вызвана самостоятельно.


       Формат:

       LIB$SIM_TRAP    сигнал, механизм


       Аргументы:

       Сигнал

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Вектор  сигнального  аргумента.  Аргумент   сигнал   -




                           - 459 -

                       00152-01 33 09-2


  содержит  адрес  массива  длинных  слов,  который  является

  стеком вектора сигнального аргумента.


       Механизм

       Использование в МОС ВП: вектор длинное слово без знака

       Тип: длиное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Вектор аргумента механизм. Аргумент механизм  содержит

  адрес  длинных  слов,  которые  являются   стеком   вектора

  аргумента механизм.


       Описание.

       Процедура LIB$SIM_TRAP преобразует ошибки при работе с

  плавающей запятой. Она может быть разрешена как  обработчик

  состояния или может быть вызвана самостоятельно.  Процедура

  LIB$SIM_TPAP     перехватывает     ошибки     переполнения,

  переполнения  снизу  и  деления  на  нуль.  Она  моделирует

  инструкцию вызывающую состояние для той запятой, в  которой

  должен быть подан сигнал об ошибке, затем  сигнализирует  о

  соответствующем захвате-ловушке.

       Поскольку    процедура    LIB$SIM_TRAP     анализирует

  обработчик   состояния   исходной   ошибки,   то   конечное

  состояние, выдаваемое этой стандартной программой,  берется

  из контекста самой инструкции, а не из обработчика  состоя-

  ния. Маршрут сигнализации индентичен  тому,  который  имеет

  прерывание, сгенерированное аппаратными средствами.  Вектор

  аргумента сигнал размещается таким образом,  что  последний




                           - 460 -

                       00152-01 33 09-2


  вход в вектор является  указателем  стеков  пользователя  в

  конце инструкций (для прерывания) или в  начале  инструкций

  (для ошибки). Подробная информация об ошибках и прерываниях

  приведена в документе [3].


       Возвращаемые значения состояния:

  SS$_RESIGNAL

       - условие   повторения   сигналов    для    следующего

         обработчика. Этот отказ был не единственный, который

         может обработать данная процедура.



       1.109. LIB$SKPC  -   сравнение   символов   на

              эквивалентность


       Процедура LIB$SKPC  сравнивает  каждый  символ  данной

  строки  с  заданным  символом  и  возвращает  относительную

  позицию  первого  несовпадающего   символа,   как   индекс.

  Процедура LIB$SKPC выполняет инструкцию  SKPC  системы  МОС

  ВП, как вызываемую процедуру.


       Формат:

       LIB$SKPC   символ, исходная строка


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения






                           - 461 -

                       00152-01 33 09-2


       Аргументы:

       Символ

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка, первый символ которой используется  процедурой

  LIB$SKPC для  сравнения.  Аргумент  символ  содержит  адрес

  точечного дескриптора с этой строкой.  Используется  только

  первый символ аргумента символ, а длина аргумента символ не

  контролируется.


       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная  строка,   которая   проверяется   процедурой

  LIB$SKPC. Аргумент исходная строка содержит адрес точечного

  дескриптора с этой строкой.


       Описание.

       Процедура LIB$SKPC сравнивает первый символ  аргумента

  символ с  последовательными  символами  аргумента  исходная

  строка до тех пор, пока она не  находит  различия,  или  не

  достигнет  конца  исходной  строки.  Процедура   возвращает

  относительную позицию эквивалентного символа,  как  индекс,

  который является относительной позицией первого обнаружения




                           - 462 -

                       00152-01 33 09-2


  подстроки в исходной строке.


       Возвращаемые значения состояния:

       отсутствуют


       Пример.

  С+

  С Данный пример демонстрирует использование

  С процедуры LIB$SKPC. Процедура LIB$SKPC

  С выполняет инструкцию МОС ВП SKPC как вызываемую

  С процедуру LIB$SKPC, сравнивает каждый символ исходной

  С строки с заданным символом. Она возвращает относительную

  С позицию первого неэквивалентного символа как индекс.

  С-

  I = LIB$SKPC (' ', ' ABC')

  TYPE 1, I

  1 FORMAT( 'символ пробела совпадает с "I2 символом"

  TYPE *,  'в строке "ABC"'

  /Y/ = LIB$SKPC ('A', 'AAA')

  2 FORMAT( 'символ "A" TYPE 2, /Y/ совпадает с "I2 символом"

  TYPE *, 'в строке "AAA"'

  END

       Результат работы программы:

       Символ пробела совпадает со 2-м символом в строке

       "ABC"

       Символ "A" совпадает с 0-м симвлом в строке

       "AAA"






                           - 463 -

                       00152-01 33 09-2


       1.110. LIB$SPANC - просмотр выбранных символов


       Процедура   LIB$SPANC   используется   для   просмотра

  определенного ряда символов в  исходной  строке.  Процедура

  LIB$SPANC выполняет инструкцию SPANC системы  мос  вп,  как

  вызываемую процедуру.


       Формат:

       LIB$SPANC       исходная строка, таблица, маска


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Относительная  позиция  в  исходной  строке   символа,

  который заканчивает операцию. Эта  позиция  выдается,  если

  такой символ обнаружен, иначе выдается нуль. Если  исходная

  строка имеет нулевую длину, то возвращается нуль.


       Аргументы:

       Исходная строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Иходная строка, используемая процедурой LIB$SPANC  как

  индекс в таблице. Аргумент исходная строка  содержит  адрес

  точечного дескриптора с этой исходной строкой.




                           - 464 -

                       00152-01 33 09-2


       Таблица

       Использование в МОС ВП: вектор байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Таблица, в которую процедуре LIB$SPANC заносит индексы

  и складывает их с байтом маски. Аргумент  таблица  содержит

  адрес массива байтов без знака, являющегося этой таблицей.


       Маска

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Маска,  которая  складывается  с   байтами   аргумента

  таблица. Аргумент маска содержит  адрес  байта  без  знака,

  являющегося этой маской.


       Описание.

       Процедура LIB$SPANC использует последовательные  байты

  строки, заданные аргументом исходная строка  как  индекс  в

  таблице. Байт выбирается из таблицы и складывается с байтом

  маски.  Операция  заканчивается,  когда  результатом  этого

  сложения является нуль.












                           - 465 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

       отсутствуют


       Пример.

  !+

  ! Данная программа демонстрирует использование

  ! процедур LIB$SCANC и STR$UPCASE.

  !-

         INTEGER*4 STR$UPCASE       ! Перевод верхнего

                                    ! регистра

         INTEGER*4 LIB$SCANC        ! Просмотр символов

         INTEGER*4 LIB$SPANC        ! Просмотр символов

  !+

  ! Об'явление алфавита, из которого конструируются

  ! "слова".

  !-

  CHARACTER*(38)  ALPHABET

  DATA  ALPHABET /'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$_'/

  !+

  ! LOCAL VARIABLE DECLARATIONS

  !-

         INTEGER*4 WORD_COUNT /0/     ! Об'явление частных

                                      ! переменных

         INTEGER*4 WORD_LENGTH /0/    ! Длина слова

         INTEGER*4 TOTAL_LENGTH/0/    ! Сумма длин слова

         INTEGER*4 START_POS   /0/    ! Позиция начального

                                      ! слова

         INTEGER*4 END_POS     /0/    ! Позиция последнего



                           - 466 -

                       00152-01 33 09-2


                                      ! слова

         REAL*4 AVERAGE_LENGTH /0.0/  ! Среднее значение

                                      ! длины слова

         CHARACTER*80 LINE            ! Исследуемая строка

                                      ! для слова

         BYTE MATCH_TABLE(0:255)/256*0! Совпадение таблицы

                                      ! для просмотра

  !+

  ! Процедуры LIB$SCANC и LIB$SPANC запрашивают таблицу

  ! с вводом для каждого возможного символа.

  !-

          DO I = 1, LEN(ALPHABET)

            MATCH_TABLE(ICHAR(ALPHABET(I:I))) = 1

            END DO

  !+

  ! Цикл встретившихся слов в строке. Когда строка
    
  ! исчерпана, указатель устанавливается в нуль посредством

  ! START_POS, читается еще одна строка.

  ! В конце файла устанавливается цикл и печатаются

  ! статистики.

  !-

          OPEN( UNIT = 1, FILE = 'TEST.DAT', TYPE = 'OLD')

          DO WHILE (.TRUE.)

          DO WHILE(START_POS.EQ.0)



          READ (1, '(A)' ,END=900) LINE

           CALL STR$UPCASE(LINE,LINE)




                           - 467 -

                       00152-01 33 09-2


           START_POS=LIB$SCANC(LINE,MATCH_TABLE, 1)! Начало

                                         ! поиска первого

                                         ! слова

  !+

  ! START_POS - точки начинающие слова. Вызов процедуры

  ! LIB$SPANCE для поиска первого символа, который не

  ! является частью слова. Установка START_POS в начало

  ! следующего слова. Если процедура LIB$SPANCE не

  ! обнаружила символов не принадлежащих слову, она

  ! возвращает в нуль.

  !-

          END_POS =

      1      START_POS + LIB$SPANC (LINE(START_POS:),

                                    MATCH_TABLE,1) - 1

          IF (END_POS .LT. START_POS) THEN ! Слово, продол-

                                           ! жающееся до

                                           ! конца строки

          WORD_LENGTH = (LEN(LINE) + 1) - START_POS

          START_POS = 0                    ! Указатель

                                           ! исчерпывания

                                           ! строки

       ЕLSE

          WORD_LENGTH = END_POS - START_POS

          START_POS =

      1      END_POS + LIB$SCANC (LINE(END_POS:),

                                  MATCH_TABLE,1) - 1

      IF (START_POS .LT. ЕND_POS) START_POS = 0 ! Не больше




                           - 468 -

                       00152-01 33 09-2


                                                ! слов на

                                                ! линии

      END IF

  !+

  ! Корректировка счетчика и длина статистик.

  !-

          WORD_COUNT = WORD_COUNT + 1

          TOTAL_LENGTH = TOTAL_LENGTH + WORD_LENGTH

          END DO

  900   CONTINUE

  !+

  ! Подсчет длины слова и вывод статистик.

  !-

          IF (WORD_COUNT .NE. О)

       1    AVERAGE_LENGTH = FLOAT(TOTAL_LENGTH)

                             / FLOAT(WORD_COUNT)

          TYPE 901,WORD_COUNT,AVERAGE_LENGTH

  901     FORMAT (1X,I10, ' WORDS FOUND, AVERAGE LENGTH WAS',

       1          F4.1, ' LETTERS. ')

          CLOSE (1)

          END



       Данная программа  на  языке  программирования  ФОРТРАН

  считывает текст с устройства ввода, принятого по умолчанию,

  и ищет слова.  Слово,  определенное  как  строка,  содержит

  только символы от A до Z (верхнего или  нижнего  регистра),

  числа от 0 до 9, знак денежной единицы ($) и символ подчер-




                           - 469 -

                       00152-01 33 09-2


  кивания (_). В результате программа  сообщает  общее  коли-

  чество слов и их среднюю длину.

       Программа использует три процедуры исполнительной биб-

  лиотеки STR$UPCASE, LIB$SCANC и LIB$SPANC:

       1) процедура STR$UPSASE преобразует строку  в  символы

  верхнего регистра, так как при поиске слов символы  нижнего

  регистра игнорируются;

       2) процедура LIB$SCANC ведет поиск в строке одного  из

  символов, заданного как  ненулевой  элемент  в  256-байтной

  таблице;

       3) процедура  LIB$SPANC  использует  инструкцию  SPANC

  системы МОС ВП для поиска в строке символа, вход которого в

  таблице не является нулевым.

       Значение, возвращаемое каждой процедурой - это  индекс

  символа в строке, первым совпавшим с  символом,  или  нуль,

  если не совпадает.

       Результат работы программы:

       Обнаружено 12 слов, средняя длина = 4.2 буквы.



       1.111. LIB$SPAWN - создание подпроцесса


       Процедура  LIB$SPAWN  требует,   чтобы   интерпретатор

  командного языка вызываемого  процесса,  создал  подпроцесс

  для выполнения команд интерпретатора командного языка. Про-

  цедура LIB$SPAWN выполняет те же  функции,  что  и  команда

  диалогового командного языка SPAWN.







                           - 470 -

                       00152-01 33 09-2


       Формат:

       LIB$SPAWN    [, строка] [, имя 1] [, имя 2]

                    [, флаги] [, процесс] [, идентификатор]

                    [, состояние 1] [, состояние 2]

                    [, состояние 3] [, состояние 4]

                    [, подсказка] [, CLI]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Команда  CLI,  выполняющаяся  созданным  подпроцессом.

  Аргумент  строка  -  адрес  точечного  дескриптора  с  этой

  командной  строкой.  Если  этот  аргумент  отсутствует,  то

  команда берется из аргумента имя 1.


       Имя 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение





                           - 471 -

                       00152-01 33 09-2


       Механизм: посредством дескриптора

       Эквивалентное имя, соответствующее  логическому  имени

  SYS$INPUT в таблице логических имен  подпроцесса.  Аргумент

  имя 1 - адрес точечного дескриптора  с  этой  эквивалентной

  строкой. Если аргумент имя 1 отсутствует, то  по  умолчанию

  вызывается SYS$INPUT.


       Имя 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Эквивалентное имя, соответствующее  логическому  имени

  SYS$OUTPUT и SYS$ERROR в таблице логических имен подпроцес-

  са. Аргумент имя 2 - адрес  точечного  дескриптора  с  этой

  эквивалентной строкой. Если аргумент имя 2 отсутствует,  по

  умолчанию принимается SYS$OUTPUT.


       Флаги

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Биты флага,  определяющие  возможный  режим.  Аргумент

  флаги - адрес длинного слова  без  знака,  содержащего  эти

  биты флага. По умолчанию все флаги нулевые.

       В табл. 40 приведено описание всех флагов.






                           - 472 -

                       00152-01 33 09-2


                                                   Таблица 41

  -----------------------------------------------------------

   Бит ! Символ   !            Значение

  -----------------------------------------------------------

   0   ! NOWAIT   ! Если установлен  этот флаг,  то процесс

       !          ! продолжает работать  параллельно с под-

       !          ! процессом.  Если не установлен, то про-

       !          ! цесс ожидает пока не закончится  выпол-

       !          ! нение подпроцесса

   1   ! NOCLISYM ! Если установлен этот флаг, то созданный

       !          ! подпроцесс не наследует символ интерпре-

       !          ! татора командного  языка  от вызывающей

       !          ! программы.  Если флаг не установлен, то

       !          ! созданный подпроцесс наследует все задан-

       !          ! ные в  данный момент  символы  интер-

       !          ! претатора командного языка

   2   ! NOLOGNAME! Если установлен этот флаг, то созданный

       !          ! подпроцесс не наследует логические име-

       !          ! на процессора от вызвавшей его програм-

       !          ! мы. Если флаг не установлен,  то этот

       !          ! подпроцесс наследует все заданные в дан-

       !          ! ный момент логические имена процесса

   3   ! NOKEYPAD ! Если этот флаг  установлен,  то символы

       !          ! малой клавиатуры и состояния передаются

       !          ! подпроцессору.  Если этот флаг не уста-

       !          ! новлен, то символы  малой клавиатуры не

       !          ! передаются подпроцессору




                           - 473 -

                       00152-01 33 09-2


                                         Продолжение табл. 41

  -----------------------------------------------------------

   Бит ! Символ   !            Значение

  -----------------------------------------------------------

   4   ! NOTIFY   ! Если установлен этот флаг, сообщение пе-

       !          ! редается устройству SYS$OUTPUT,  после

       !          ! завершения или удаления подпроцесса. Если

       !          ! флаг не установлен, то сообщение не пере-

       !          ! дается. Этот бит не устанавливается, если

       !          ! не установлен бит NOWAIT

   5   ! NOCONTROL! Если  установлен  этот флаг, то символы

       !          ! возврат каретки/перевод строки не добав-

       !          ! ляются к любой  строке  подсказке. Если

       !          ! этот флаг установлен, то символы возврат

       !          ! каретки/перевод строки добавляются к лю-

       !          ! бой заданной строке подсказке


       Биты с 6 по 31 зарезервированы для будущего расширения

  и должны быть нулевыми. Символические имена флагов  опреде-

  лены    в    STARLET:     CLI$M_NOWAIT,     CLI$M_NOCLISYM,

  CLI$M_NOLOGNAM,     CLI$M_NOKEYPAD,     CLI$M_NOTIFY      и

  CLI$M_NOCONTROL.


       Процесс

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора




                           - 474 -

                       00152-01 33 09-2


       Имя, определенное для подпроцессора. Аргумент  процесс

  - адрес точечного дескриптора со  строкой  с  этим  именем.

  Если аргумент процесс отсутствует, используется имя процес-

  са. Если существует не  одно  заданное  имя,  то  процедура

  LIB$SPAWN возвращает состояние ошибки SS$_DUPLNAM.


       Идентификатор

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Идентификатор процесса создавшего подпроцесс. Аргумент

  идентификатор - адрес длинного слова без знака, содержащего

  значение идентификатора процесса.

       Это значение идентификатора процесс используется толь-

  ко в случае, когда установлен бит флага NOWAIT.


       Состояние 1

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Состояние окончательного завершения подпроцесса. Аргу-

  мент  состояние  1  -  адрес  длинного  слова  без   знака.

  Процедура LIB$SPAWN записывает адрес состояния  окончатель-

  ного завершения подпроцесса в аргумент состояние 1.

       Если установлен бит флага NOWAIT, то это  значение  не

  сохраняется до завершения подпроцесса; аргументы  состояние




                           - 475 -

                       00152-01 33 09-2


  2 или состояние 3 используются для определения, когда окан-

  чивается подпроцесс.


       Состояние 2

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Номер флага локального события, который устанавливает-

  ся после завершения создания подпроцесса. Аргумент  состоя-

  ние 2 - адрес байта без знака, содержащего этот номер флага

  локального события. Если аргумент состояние 2  отсутствует,

  то флаг события не устанавливается.

       Задавать аргумент состояние 2 имеет  смысл,  только  в

  случае, когда установлен бит флага NOWAIT.


       Состояние 3

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: вызов без разворачивания стека

       Механизм: посредством ссылки

       Маска входа процедуры. Вызывается  посредством  асинх-

  ронного  системного  захвата  после  завершения  выполнения

  подпроцесса. Аргумент состояние 3 - адрес этой маски  входа

  процедуры.

       Задавать аргумента состояние 3 имеет  смысл  только  в

  случае, когда установлен бит флага NOWAIT.






                           - 476 -

                       00152-01 33 09-2


       Состояние 4

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Значение, передаваемое AST процедуре. Обычно, аргумент

  состояние 4 - адрес блока сохранения используемого AST про-

  цедурой.

       Задавать этот аргумент имеет смысл, лишь в случае ког-

  да установлен бит флага NOWAIT и задан  аргумент  состояние

  4.


       Подсказка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка подсказки, используемая в подпроцессе. Аргумент

  подсказка - адрес дескриптора со  строкой  подсказки.  Если

  аргумент подсказка отсутствует, подпроцесс использует стро-

  ку подсказки, используемую основным процессом.


       СLI

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Спецификация файла для интерпретатора командного языка




                           - 477 -

                       00152-01 33 09-2


  CLI, выполняемая в подпроцессе. Аргумент CLI - адрес специ-

  фикации файла дескриптора строки. Если в спецификации файла

  не указано устройство или директорий, то по умолчанию  при-

  нимается текущее устройство и текущий директорий.

       Если аргумент CLI отсутствует,  подпроцесс  использует

  тот же интерпретатор командного языка, что и основной  про-

  цесс. Если аргумент CLI задан,  контекст  не  копируется  в

  подпроцесс.


       Описание.

       Подпроцесс, создаваемый процедурой  LIB$SPAWN,  насле-

  дует следующие атрибуты от вызывающей среды:

       1) логические имена процесса;

       2) глобальные и локальные символы CLI;

       3) значения по умолчанию для устройств и директория;

       4) привилегии процесса;

       5) неуменьшаемые квоты процесса;

       6) проверку установки текущей команды.

       Подпроцесс не наследует ни постоянные файлы  процесса,

  ни процедуру, ни контекст образа  задачи.  Если  не  заданы

  аргументы строка или имя 1, то ввод команды  осуществляется

  со старшего терминала. Если указаны оба аргумента, то подп-

  роцесс сначала использует первый аргумент, а  затем  считы-

  вает второй. Если задан только аргумент строка, то  команда

  выполняется и подпроцесс  завершается.  Если  задан  только

  аргумент имя 1, то  подпроцесс  завершается  либо  командой

  LOGOUT, либо в конце файла. Подпроцесс не наследует ни пос-

  тоянные файлы процесса, ни процедуру,  ни  контекст  образа



                           - 478 -

                       00152-01 33 09-2


  задачи. Файл LOGIN.COM не выполняется.

       Если не установлен бит  флага  NOWAIT,  то  вызывающий

  процесс переводится в состояние ожидания до тех  пор,  пока

  не будет завершен подпроцесс. В следствии того, что процесс

  вызывающей задачи находится в состоянии ожидания в суперви-

  зорном режиме, любой асинхронный системный захват в  режиме

  пользователя, стоящий в  очереди  к  вызывающей  программе,

  выходит из подпроцесса при помощи команды ATTACH или  соот-

  ветсвующего вызова процедуры LIB$ATTACH.

       Процедура LIB$SPAWN предназначена для использования  с

  интерпретатором командного языка DCL. Если она используется

  с интерпритатором командного языка MCR, то выдается состоя-

  ние ошибки LIB$_NOCLI.

       Если образ  задачи  выполняется  непосредственно,  как

  попроцесс или как отсоединенный  подпроцесс,  то  для  этой

  функции нет интепретатора командного языка. В таких случаях

  выдается состояние ошибки LIB$_NOCLI. Более полное описание

  команды SPAWN приведено в документе [2].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_ACCVIO

       - нарушение доступа. Один из  аргументов  в  процедуре

         LIB$SPAWN не может быть прочитан или не  может  быть

         записан как аргумент состояние 1;

  SS$_DUPLNAM

       - имя процесса  дублированно.  Если  аргумент  процесс



                           - 479 -

                       00152-01 33 09-2


         задан, то он дублирует  существующее  имя  процесса.

         Если аргумент процесс отсутствует, то  процедура  не

         может создать специальное  имя  для  подпроцесса,  и

         возникает ошибка создания подпроцесса;

  LIB$_INVARG

       - неверный  аргумент.  Задан  необязательный  аргумент

         флаги и установлены биты с 0 по 2;

  LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Один  из  аргументов

         строки имеет неверный дескриптор;

  LIB$_NOCLI

       - отсутствует интерпретатор командного языка. Вызываю-

         щий процесс не имеет CLI для выполнения данной функ-

         ции. Выполнение образа задачи в виде подпроцесса или

         отсоединенного  процесса  не  имеет   интерпретатора

         командного языка.

       Если  при  попытке  создания  подпроцесса  встречается

  ошибка, то значение состояния этой ошибки выдается процеду-

  рой LIB$SPAWN.


       Пример.

       ISTAT=LIB$SPAWN(,,,CLI$M_NOKEYPAD.......'> ')

       IF (.NOT. ISTAT) CALL LIB$STOP(%VAL (ISTAT))

       Данная программа  на  языке  программирования  ФОРТРАН 

  демонстрирует вызов процедуры  LIB$SPAWN.  Подпроцесс  соз-

  дается путем ввода с устройства SYS$INPUT и вывода на  уст-

  ройство SYS$OUTPUT. Состояние малой клавиатуры не передает-

  ся подпроцессу. Для  подпроцесса  задана  строка  подсказки



                           - 480 -

                       00152-01 33 09-2


  ">".



       1.112. LIB$STAT_TIMER  -   выдача   статистик,

              накопленных    значений    времени    и

              счетчиков


       Процедура LIB$STAT_TIMER возвращает  вызывающей  прог-

  рамме одну из пяти возможных статистик. В отличии от проце-

  дуры LIB$SHOW_TIMER, которая форматирует значения для выво-

  да, процедуры LIB$STAT_TIMER  возвращает  значение  в  виде

  длинного слова без знака или квадрослова.


       Формат:

       LIB$STAT_TIMER код, значение [, указатель]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Код

       Использование в МОС ВП: функциональный код

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством значения

       Код, определяющий какие статистики должны быть возвра-

  щены. Аргумент код содержит адрес целого длинного слова  со




                           - 481 -

                       00152-01 33 09-2


  знаком, являющегося этим кодом. Код должен быть целым  чис-

  лом от 1 до 5. Значения, допустимые для кода,  приведены  в

  табл. 41.

                                                  Таблица 42

  ----------------------------------------------------------

   Значение !        Возвращаемая статистика

  ----------------------------------------------------------

    1       ! Использованное время (квадрослово, в формате

            ! системного времени)

    2       ! Время центрального процессора (длинное слово,

            ! в приращениях по 10 миллисекунд)

    3       ! Счетчик операций буферного ввода-вывода (длин-

            ! ное слово)

    4       ! Счетчик операций прямого ввода-вывода (длинное

            ! слово)

    5       ! Счетчик плохих страниц (длинное слово)


       Значение

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только запись

       Механизм: посредством ссылки

       Статистики,  возвращаемые  процедурой  LIB$STAT_TIMER.

  Аргумент значение содержит адрес длинного слова  или  квад-

  рослова, которое является этими статистиками. Все статисти-

  ки - целые длинные  слова  за  исключением  использованного

  времени, которое является квадрословом. Более полная инфор-

  мация о формате системного времени содержится  в  документе



                           - 482 -

                       00152-01 33 09-2


  [1].


       Указатель

       Использование в МОС ВП: адрес

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Указатель блока сохранения. Аргумент указатель  содер-

  жит адрес длинного слова без знака с этим указателем.  Если

  аргумент указатель задан, то он должен иметь такое же  зна-

  чение, которое было выдано по предыдущему вызову  процедуры

  LIB$STAT_TIMER. Аргумент указатель необязательный аргумент,

  если он отсутствует, то процедура LIB$STAT_TIMER использует

  собственную память.


       Описание.

       Только одна из пяти статистик возвращается  на  каждый

  вызов процедуры LIB$STAT_TIMER. Использованное время  возв-

  ращается в системном формате квадрослова, поэтому  область,

  в которую оно возвращается должна иметь длину  восемь  бай-

  тов. Все другие значения являются длинными словами.

       Табл. 42 кратко иллюстрирует различия между процедура-

  ми LIB$SHOW_TIMER и LIB$STAT_TIMER.














                           - 483 -

                       00152-01 33 09-2


                                                   Таблица 43

  -----------------------------------------------------------

  Код! Статистика             !Формат для    !Формат для

     !                        !LIB$SHOW_TIMER!LIB$STAT_TIMER

  -----------------------------------------------------------

  1  ! Реальное использованное! HHHH:MM:SS.CC! Квадрослово

     ! время                  !              ! в системном

     !                        !              ! формате

  2  ! Использованное время   ! HHHH:MM:SS.CC!

     ! центрального процессора!              ! Длинное слово

     !                        !              ! в приращениях

     !                        !              ! по 10 миллисе-

     !                        !              ! кунд

  3  ! Счетчик операции буфер-! NNNN         !

     ! ного ввода-вывода      !              ! Длинное слово

     !                        !              !

  4  ! Счетчик операций прямо-! NNNN         ! Длинное слово

     ! го ввода-вывода        !              !

  5  ! Счетчик плохих страниц ! NNNN         ! Длинное слово


       При  вызове  процедуры  LIB$INIT_TIMER  необязательный

  аргумент указатель  используется  только  в  случае,  когда

  необходимо  сохранить  несколько   установленых   статистик

  одновременно. Этот аргумент указывает, что блок  памяти,  в

  котором находятся статистики, сохраняется.  Можно  осущест-

  вить вызов процедуры LIB$FREE_TIMER только в случае, если в

  процедуре LIB$INIT_TIMER был задан  аргумент  указатель,  и

  все блоки памяти освобождены. В большинстве случаев  доста-



                           - 484 -

                       00152-01 33 09-2


  точно неявного освобождения во время входа программы.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INVARG

       - неверный аргумент. Или  аргумент  код  или  аргумент

         указатель неверны.


       Пример.

  РROGRAM STAT_TIMER(INPUT,OUTPUT);

  (+)

  ( Данный пример демонстрирует использование

  ( процедуры LIB$STAT_TIMER.

  (-)

       ТYPE

          BYTE = [BYTE] 0..255;

          WORD = [WORD] 0..65535;

          QUADWORD_SYSTEM_TIME = [QUAD] RECORD

              FIRST_LONGWORD : UNSIGNED;

              SECOND_LONGWORD : UNSIGNED;

          END;

       VAR

          ELAPSED_REAL_TIME : QUADWORD_SYSTEM_TIME;

          ELAPSED_STRING    : VARYING [32] OF CHAR;

          PAGE_FAULT_COUNT  : UNSIGNED;

          RETURNED_STATUS   : UNSIGNED;

       [EXTERNAL] FUNCTION LIB$INIT_TIMER(




                           - 485 -

                       00152-01 33 09-2


          HANDLE_ADR : [REFERENCE] UNSIGNED := %IMMED 0

          ) : INTEGER: EXTERNAL;

       [EXTERNAL] FUNCTION LIB$STAT_TIMER(

          CODE       : INTEGER;

          VALUE      : [UNSAFE,REFERENCE] PACKED

                       ARRAY [L..U:INTEGER] OF BYTE;

          HANDLE_ADR : [REFERENCE] UNSIGNED := %IMMED 0

          ) : INTEGER; EXTERNAL;

       [EXTERNAL] FUNCTION LIB$STOP (

          CONDITION_STATUS: [IMMEDIATE,UNSAFE] UNSIGNED;

          FAO_ARGS        : [IMMEDIATE,UNSAFE.LIST] UNSIGNED

          ) : INTEGER; EXTERNAL;

       [EXTERNAL] FUNCTION LIB$SYS_ASCTIM(

          OUT_LEN     : [REFERENCE] WORD := %IMMED 0;

          VAR DST_STR : PACKED ARRAY [L..U:INTEGER] OF CHAR;

          USER_TIME   : QUADWORD_SYSTEM_TIME := %IMMED 0;

          CNV_FLG     : UNSIGNED := %IMMED 0

          ) : INTEGER; EXTERNAL;

  BEGIN

  (+)

  ( Вызов процедуры LIB$INIT_TIMER

  ( для инициализации внутренних кодов.

  (-)

  RETURNED_STATUS := LIB$INIT_TIMER;

  IF NOT ODD(RETURNED_STATUS)

  THEN

       LIB$STOP(RETURNED_STATUS);




                           - 486 -

                       00152-01 33 09-2


  (+)

  ( Печать строки текста с лишним временем.

  (-)

  WRITELN('расход времени для получения реального

  израсходованного времени и счетчика плохих страниц');

  (+)

  ( Вызов процедуры LIB$STAT_TIMER для возвращения

  ( значений из процедуры.

  (-)

  RETURNED_STATUS := LIB$STAT_TIMER(1,ELAPSED_REAL_TIME);

  IF NOT ODD(RETURNED_STATUS)

  THEN

       LIB$STOP(RETURNED_STATUS);

  RETURNED_STATUS := LIB$STAT_TIMER(5,RAGE_FAULT_COUNT);

  IF NOT ODD(RETURNED_STATUS)

  THEN

       LIB$STOP(RETURNED_STATUS);

  (+)

  ( Печать статистик возвращенных из

  ( процедуры LIB$STAT_TIMER.

  (-)

  WRITELN('счетчик плохих страниц', PAGE_FAULT_COUNT:1);

  RETURNED_STATUS := LIB$SYS_ASCTIM(

                         ELAPSED_STRING.LENGTH,

                         ELAPSED_STRING.BODY,

                         ELAPSED_REAL_TIME,

                         1);




                           - 487 -

                       00152-01 33 09-2


  IF NOT ODD(RETURNED_STATUS)

  THEN

       LIB$STOP(RETURNED_STATUS);

  WRITELN('реальное израсходованное время будет '

            ,ELAPSED_STRING);

  END.

       Данная программа  на  языке  программирования  ПАСКАЛЬ

  демонстрирует использование процедуры LIB$STAT_TIMER.


       Результат работы прораммы:

       Расход времени для получения реального израсходованно-

  го времени и плохих страниц

       Счетчик плохих страниц равен 22

       Реальное израсходованное время будет 00:00:00.61



       1.113. LIB$STAT_VM    -    выдача    статистик

              виртуальной памяти


       Процедура LIB$STAT_VM возвращает вызывающей  программе

  одну из  шести  статистик,  имеющихся  в  вызовах  процедур

  LIB$GET_VM/LIB$FREE_VM и  LIB$GET_VM_PAGE/LIB$FREE_VM_PAGE.

  В отличии от  процедуры  LIB$SHOW_VM,  которая  форматирует

  значения для вывода и печати на устройство SYS$OUTPUT, про-

  цедура LIB$STAT_VM возвращает статистику в аргумент  значе-

  ние. Один вызов  процедуры  LIB$STAT_VM  возвращает  только

  одну статистику.








                           - 488 -

                       00152-01 33 09-2


       Формат:

       LIB$STAT_VM код, значение


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки


       Аргументы:

       Код

       Использование в МОС ВП: функциональной код

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Код, который определяет какая из статистик будет возв-

  ращена. Аргумент код содержит адрес целого  длинного  слова

  со знаком, являющееся этим кодом. Значения, допустимые  для

  аргумента код, приведены в табл. 43.

                                                   Таблица 44

  -----------------------------------------------------------

   Код!                    Статистика

  -----------------------------------------------------------

   1  ! Количество удачных вызовов процедуры LIB$GET_VM

   2  ! Количество удачных вызовов процедуры LIB$FREE_VM

   3  ! Количество байтов размещенных процедурой LIB$GET_VM,

      ! но еще не освобожденных процедурой LIB$FREE_VM

   5  ! Количество вызовов процедуры LIB$GET_VM_PAGE




                           - 489 -

                       00152-01 33 09-2


                                         Продолжение табл. 44

  -----------------------------------------------------------

   Код!                    Статистика

  -----------------------------------------------------------

   6  ! Количество вызовов процедуры LIB$FREE_VM_PAGE

   7  ! Количество страниц, размещенных процедурой

      ! LIB$GET_VM_PAGE, но еще не освобожденных процедурой

      ! LIB$FREE_VM_PAGE


       Если аргумент код отсутствует, или если он равен 0 или

  4, то возникает ошибка.


       Значение

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Значение    статистики,    возвращаемое     процедурой

  LIB$STAT_VM. Аргумент значение содержит адрес целого  длин-

  ного слова со знаком с этим значением.


       Описание.

       Процедура LIB$STAT_VM возвращает вызывающей  программе

  одну  из  шести   статистик.   В   отличие   от   процедуры

  LIB$SHOW_VM, которая форматирует значения для вывода,  про-

  цедура LIB$STAT_VM возвращает значение, как аргумент.

       За один вызов процедуры LIB$STAT_VM может быть возвра-

  щена только одна из шести статистик.  Аргумент  код  должен

  быть одним из шести значений, приведенных в табл. 43.  Если



                           - 490 -

                       00152-01 33 09-2


  значение аргумента код равно 0 или 4, то выдается состояние

  ошибки. В отличии от процедуры LIB$SHOW_VM, которая готовит

  для вывода значения в  коде  КОИ-8,  процедура  LIB$STAT_VM

  возвращает значение в двоичном формате в аргумент.


       Возвращаемые значения состояния:

  SS_NORMAL

       - процедура успешно завершена;

  LIB$_INVARG

       - неверный аргумент. Значение аргумента  код  является

         недопустимым значением для процедуры LIB$STAT_VM.



       1.114. LIB$STOP  -  прекращение  выполнения  и

              сигнализация состояния


       Процедура LIB$STOP генерирует сигнал, который  показы-

  вает, что в программе появилось  исключительное  состояние.

  Состояния, сигнализируемые  процедурой  LIB$STOP  не  могут

  быть продолжены из точки сигнализации.


       Формат:

       LIB$STOP   состояние 1 [, число 1] [, FAO 1...FAON1]

                  состояние 2 [, число 2] [, FAO 2...FAON2]


       Код возврата.

       Процедура LIB$STOP генерирует сигнал  и  останавливает

  выполнение вызванной программы. Значение состояния не возв-

  ращается.






                           - 491 -

                       00152-01 33 09-2


       Аргументы:

       Состояние 1

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       32-битное значение состояния. Аргумент состояние  1  -

  длинное слово без знака, содержащее значение состояния.


       Число 1

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством значения

       Количество FAO аргументов связанных с  значением  сос-

  тояния. Аргумент число 1 - целое длинное слово  со  знаком,

  которое содержит это  количество.  Если  аргумент  число  1

  отсутствует или равен 0, это значит, что нет  FAO  аргумен-

  тов.


       FAO

       Использование в МОС ВП: изменяемый аргумент

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством значения

       Дополнительные FAO аргументы (в формате вывода КОИ-8),

  которые соответсвуют заданному значению состояния. Аргумент

  FAO - адрес целого длинного слова без знака, или символьная




                           - 492 -

                       00152-01 33 09-2


  строка, которая содержит эти дополнительные FAO аргументы.


       Описание.

       Процедура LIB$STOP вызывается, если  программа  указы-

  вает исключительное состояние, при котором невозможно  про-

  должение выполнения или возвращения кода состояния в  вызы-

  вающую программу.  Процедура  LIB$STOP  просматривает  стек

  фрагмент за фрагментом, начиная с самого  последнего  фраг-

  мента, вызывая каждый установленный  обработчик  состояния.

  Процедура LIB$STOP гарантирует, что управление  не  возвра-

  тится вызывающей программе, а список  аргументов  процедуры

  LIB$STOP, счетчик программы (PC) и слово состояния  процес-

  сора (PSL) добавляются при построении  вектора  сигнального

  аргумента.

       Если обработчик состояния пытается  продолжить  работу

  посредством возвращения кода успешно завершения, то возвра-

  щается сообщение об ошибке аттемрт то CONTINUE FROM STOP  и

  программа завершается. Если обработчик, вызванный  процеду-

  рой LIB$STOP вызывает SYS$UNWID, управление не возвращается

  к программе, вызвавшей процедуру LIB$STOP. Обработчик может

  также изменять сохраняемые копии R0/R1 в векторе механизма,

  изменяя регистры R0 и R1 после  того  как  стек  развернут.

  Если обработчик не делает ничего из этого, то все регистры,

  включая R0/R1 и аппаратные коды состояния сохраняются.

       Только используя обработчик, можно предохранить  образ

  от остановки, после того, как процедура LIB$STOP  развернет

  стек,   используя   программу    системного    обслуживания

  SYS$UNWIND.



                           - 493 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

       Отсутствуют


       Пример.

  10  EXTERNAL LONG FUNCTION LIB$RESERVE_EF

      DECLARE LONG RET_STATUS



      RET_STATUS = LIB$$RESERVE_EF(2%)

      IF (RET_STATUS AND 1%) = 0% THEN

  CALL LIB$STOP( RET_STATUS BY VALUE )

      END IF

      PRINT "флаг события 2 зарезервирован успешно"

      END

       В данной программе на  языке  программирования  БЕЙСИК

  процедура LIB$STOP используется для  выполнения  остановки,

  если выдан сигнал ошибки.



       1.115. LIB$SUBX  -  вычитание  двух   двоичных

              чисел произвольной длины


       Процедура LIB$SUBX вычитает два целых числа в двоичном

  дополнительном коде произвольной длины со знаком.


       Формат:

       LIB$SUBX    A,B, разность [, длина]











                           - 494 -

                       00152-01 33 09-2


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки


       Аргументы:

       А

       Использование в МОС ВП: вектор длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Уменьшаемое; при вычитании двух целых чисел со  знаком

  в двоичном дополнительном коде. Аргумент А - адрес длинного

  слова со знаком, содержащего это уменьшаемое.


       В

       Использование в МОС ВП: вектор длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки, ссылки на массив.

       Вычитаемое; при вичитании двух целых чисел со знаком в

  двоичном дополнительном коде. Аргумент B  -  адрес  массива

  целых длинных слов со знаком, которые содержат вычитаемое.


       Разность

       Использользование в МОС ВП: вектор  длинное слово

                                   со знаком





                           - 495 -

                       00152-01 33 09-2


       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки, ссылки на массив.

       Разность: при вычитании двух целых чисел со  знаком  в

  двоичном дополнительном коде.  Аргумент  разность  -  адрес

  массива целых длинных слов со знаком, содержащего разность.


       Длина

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Длина массивов длинных слов, обрабатываемых процедурой

  LIB$SUBX. Аргумент длина - адрес массива  длинных  слов  со

  знаком, содержащих длину.  Аргумент  длина  не  может  быть

  отрицательным. По умолчанию значение аргумента длина  равно

  2.


       Описание.

       Процедура LIB$SUBX вычитает два целых числа в двоичном

  дополнительном коде. Эти целые числа располагаются в масси-

  ве длинных слов. Чем старше  адреса,  тем  больше  точность

  частей значения. Самое старшее адресное слово содержит знак

  и 31 бит точности. Остальные длинные слова содержат  по  32

  бита точности в каждом. Количество  длинных  слов,  которое

  должно быть обработано задается  дополнительным  аргументом

  длина. По умолчанию этот аргумент равен 2,  что  соответст-

  вует типу данных квадрослова системы МОС ВП.




                           - 496 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_INTOVF

       - целочисленное переполнение. Результат правильный, но

         потерян знаковый бит;

  LIB$_INVARG

       - неверный аргумент. Аргумент длина - отрицательный.


       Пример.

  С+

  С В данном примере демонстрируется использование

  С процедуры LIB$SUBX.

  С-

          INTEGER A(2),B(2),C(2),RETURN

  С+

  С число А имеет значение 72057594037927937 =

  С = '1000000000000001'Х.

  С число В имеет значение 4294967295 =

  С = '00000000FFFFFFFF'X.

  С-

        A(1) = '00000001'X

        A(2) = '10000000'X

        B(1) = 'FFFFFFFF'X

        B(1) = '00000000'X

  С+

  С тогда "A" - "B" = 72057589742960642.

  С-



                           - 497 -

                       00152-01 33 09-2


        RETURN = LIB$SUBX(A,B,C)

        TYPE *,' '

        TYPE *,'если A = 72057594037927937 и B = 4294967295.'

        TYPE *,'то C = A - B =  72057589742960642.'

        TYPE 2,C(2),C(1)

  2     FORMAT(' 72057589742960642 представляется как

               ',1H',Z8,Z8,3H'X.)

        TYPE *, 51H  C(2) = '0FFFFFFF'X и C(1) = '00000002'X.

        ЕND

       Данная программа  на  языке  программирования  ФОРТРАН

  демонстрирует использование процедуры LIB$SUBX.

       Результат работы программы:

       А = 72057594037927937 и B = 4294967295.

       С = A - B =  72057589742960642.

       72057589742960642 представляется как

       ' FFFFFFF     2'X.

       С(2) = '0FFFFFFF'X и C(1) = '00000002'X.



       1.116. LIB$SYS_ASCTIM   -   вызов    программы

              системного  обслуживания  $ASCTIM   для

              преобразования    двоичного    значения

              времени в строку в коде КОИ-8


       Процедура LIB$SYS_ASCTIM вызывает программу системного

  обслуживания для преобразования двоичного значения  даты  и

  времени в строку в коде КОИ-8 используя семантику  вызывае-

  мой строки.





                           - 498 -

                       00152-01 33 09-2


       Формат:

       LIB$SYS_ASCTIM    [длина], строка [, время]

                         [, индикатор]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Длина

       Использование в МОС ВП: слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Количество байтов, записанных в аргументе  строка,  не

  считая пробелов в случае строки фиксированной длины.  Аргу-

  мент строка содержит адрес целого слова со знаком,  которое

  является этим количеством. Если вводимая строка  обрывается

  на размере, заданном в аргументе строка, то аргумент  длина

  устанавливается в этот размер. Поэтому аргумент длина может

  всегда использоваться вызываемой программой для  доступа  к

  действительной подстроке аргумента строка.


       Строка

       Использование в МОС ВП: имя времени

       Тип: символьная строка





                           - 499 -

                       00152-01 33 09-2


       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая    строка,    в    которую    процедура

  LIB$SYS_ASCTIM записывает строку в коде КОИ-8 со временем.

       Аргумент строка содержит адрес дескриптора с результи-

  рующей строкой.


       Время

       Использование в МОС ВП: число время

       Тип: целое квадрослово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Значение, которое процедура LIB$SYS_ASCTIM преобразует

  в строку в коде КОИ-8. Аргумент время содержит адрес целого

  квадрослова со знаком, с этим значением.

       Если этот аргумент равен 0, или его адрес  не  указан,

  то возвращаются текущее системное время и дата. Положитель-

  ное значение означает абсолютное время. Отрицательное  зна-

  чение представляет собой дельта время. Дельта время  должно

  быть меньше, чем 10,000 дней.


       Индикатор

       Использование в МОС ВП: маска длинное слово

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Индикатор преобразования. Аргумент индикатор  содержит

  адрес длинного слова без знака, которое является  индикато-




                           - 500 -

                       00152-01 33 09-2


  ром преобразования.

       Если это значение равно 1, то  выдаются  только  часы,

  минуты, секунды и сотни долей  секунды,  в  зависимости  от

  длины буфера. Если значение равно 0 (значение, принятое  по

  умолчанию), то выводится полное значение даты и времени,  в

  зависимости от длины буфера.

       Аргумент индикатор передается процедуре LIB$SYS_ASCTIM

  посредством ссылки и является изменяемым значением, исполь-

  зующимся программой системного обслуживания $ASCTIM.


       Описание.

       Работа  процедуры  LIB$SYS_ASCTIM  аналогична   работе

  программы системного обслуживания $ASCTIM, ее описание при-

  ведено в документе [1].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_STRTRU

       - процедура завершена, но исходная строка оборвана;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка.  Эта  ошибка  свиде-

         тельствует о внутренней ошибке  исполнительной  биб-

         лиотеки;

  LIB$_INSVIRMEM

       - недостаточная виртуальная  память.  Вызов  процедуры

         LIB$GET_VM не может быть осуществлен, так как  прог-

         рамма превысила допустимую квоту виртуальной памяти;




                           - 501 -

                       00152-01 33 09-2


  LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         имеет неверное значение в поле DSC$B_CLASS;

  SS$_IVTIME

       - заданное дельта-время больше или равно 10,000 дням.
                           


       1.117. LIB$SYS_FAO    -    вызов     программы

              системного   обслуживания   $FAO    для

              форматирования вывода


       Процедура LIB$SYS_FAO  вызывает  программу  системного

  обслуживания FAO и возвращает строку в  семантике,  исполь-

  зуемой пользователем. Если  при  вызове  процедуры  строка,

  предназначенная для вывода, нефиксированной длины, то длина

  результирующей строки ограничивается 256 байтами.


       Формат:

       LIB$SYS_FAO строка 1 [, длина], строка 2 [, P1,...,PN]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки













                           - 502 -

                       00152-01 33 09-2


       Аргументы:

       Строка 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Управляющая строка в коде КОИ-8,  предназначенная  для

  вывода и директив вывода в формате КОИ-8 (далее  по  тексту

  директив FAO). Аргумент строка 1 содержит  адрес  точечного

  дескриптора с управляющей строкой.


       Длина

       Использование в МОС ВП: целое слово

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Длина строки,  предназначенной  для  вывода.  Аргумент

  длина содержит адрес целого слова  со  знаком,  являющегося

  длиной.


       Строка 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Полностью сформатированная строка, предназначенная для

  вывода, возвращаемая процедурой LIB$SYS_FAO. Аргумент стро-

  ка 2 содержит адрес дескриптора со строкой, предназначенной




                           - 503 -

                       00152-01 33 09-2


  для вывода.


       Р1 - PN

       Использование в МОС ВП: изменяемый аргумент

       Тип: неопределенный

       Доступ: только чтение

       Механизм: неопределенный

       Механизм: посредством дескриптора

       Директивные аргументы, содержащиеся в длинных  словах.

  В зависимости от директивы аргумент р может быть значением,

  которое должно быть преобразовано адресом вставляемой стро-

  ки или длиной или счетчиком  аргумента.  Механизм  передачи

  для каждого из этих аргументов должен соответствовать прог-

  рамме системного обслуживания $FAO.


       Описание.

       Описание работы программы системного обслуживания $FAO

  содержится в документе [1].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_BUFFEROVF

       - процедура успешно завершена, но  строка  сформатиро-

         ванная для вывода переполнила буфер  вывода  и  была

         оборвана;

  LIB$_STRTRU

       - процедура завершена, но исходная строка оборвана;





                           - 504 -

                       00152-01 33 09-2


  SS$_BADPARAM

       - в управляющей строке в формате КОИ-8 задана неверная

         директива;

  LIB$_INSVIRMEM

       - недостаточная  виртуальная  память  для   размещения

         динамической строки;

  LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         неверное значение в поле DSC$B_CLASS.



       1.118. LIB$SYS_FAOL    -    вызов    программы

              системного обслуживания $FAOL


       Процедура LIB$SYS_FAOL вызывает  программу  системного

  обслуживания $FAOL  для  возвращения  строки  в  семантике,

  определенной  пользователем.  Если  при  вызове   процедуры

  LIB$SYS_FAOL,  строка,  предназначенная  для   вывода,   не

  является строкой фиксированной длины, то длина результирую-

  щей строки ограничивается 256 байтами.


       Формат:

       LIB$SYS_FAOL   строка 1 [, длина], строка 2, р1 - PN


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения





                           - 505 -

                       00152-01 33 09-2


       Аргументы:

       Строка 1

       Использование в МОС ВП: символьная строка

       Тип: только чтение

       Доступ: только чтение

       Механизм: посредством дескриптоа

       Управляющая строка в коде КОИ-8, состоящая из фиксиро-

  ванного текста строки, предназначенной для вывода  директив

  FAO. Аргумент строка 1 содержит адрес дескриптора с  управ-

  ляющей строкой.


       Длина

       Использование в МОС ВП: целое слово

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Длина строки,  предназначенной  для  вывода.  Аргумент

  длина  содержит  адрес  целого  слова  со  знаком,  которое

  является длиной.


       Строка 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Полностью сформатированная строка, предназначенная для

  вывода,  возвращаемая  процедурой  LIB$SYS_FAOL.   Аргумент

  строка 2 содержит адрес дескриптора со строкой,  предназна-




                           - 506 -

                       00152-01 33 09-2


  ченной для вывода.


       Р1...PN

       Использование в МОС ВП: изменяемый аргумент

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Директивные аргументы, содержащиеся в длинных  словах.

  Аргументы P1...PN содержатся в  массиве  длинных  слов  без

  знака аргументов FAO. В зависимости от директивы аргумент р

  может быть значением,  которое  должно  быть  преобразовано

  адресом вставляемой строки или длиной, или счетчиком  аргу-

  мента. Механизм передачи для  каждого  из  этих  аргументов

  должен соответствовать  программе  системного  обслуживания

  $FAOL.


       Описание.

       Описание  работы  программы  системного   обслуживания

  $FAOL приведено в документе [1].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_BUFFEROVF

       - процедура успешно завершена, но строка,  сформатиро-

         ванная для вывода переполнила буфер вывода и оборва-

         на;

  LIB$_STRTRU

       - процедура завершена, но исходная строка оборвана;



                           - 507 -

                       00152-01 33 09-2


  SS$_INSVIRMEM

       - в управляющей строке в формате КОИ-8 задана неверная

         директива;

  LIB$_BADPARMEM

       - недостаточная  виртуальная  память  для   размещения

         динамической строки;

  LIB$_INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         неверное значение в поле DSC$B_CLASS.



       1.119. LIB$SYS_GETMSG   -   вызов    программы

              системного  обслуживания  $GETMSG   для

              получения текста сообщения


       Процедура LIB$SYS_GETMSG вызывает программу системного

  обслуживания $GETMSG и возвращает строку сообщения в  аргу-

  мент строка в семантике вызываемой строки.


       Формат:

       LIB$SYS_GETMSG  идентификатор [, длина], строка

                       [, флаги] [, массив]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения







                           - 508 -

                       00152-01 33 09-2


       Аргументы:

       Идентификатор

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Идентификатор  сообщения,  которое   восстанавливается

  процедурой LIB$SYS_GETMSG. Аргументы идентификатор содержит

  адрес целого длинного слова  со  знаком  с  идентификатором

  сообщения.


       Длина

       Использование в МОС ВП: слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Количество элементов, записываемых в  аргумент  строка

  не считая пробелов, в случае  строки  фиксированной  длины.

  Аргумент длина содержит адрес слова со знаком, с этим коли-

  чеством.

       Если вводимая строка  оборвана  на  размере,  заданном

  аргументом строка,  то  аргумент  длина  устанавливается  в

  нуль. Поэтому аргумент длина может всегда быть  использован

  вызывающей программой для доступа к значащей подстроке.











                           - 509 -

                       00152-01 33 09-2


       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка. Аргумент строка содержит  адрес

  дескриптора    с    результирующей    строкой.    Процедура

  LIB$SYS_GETMSG записывает сообщение, которое выдается прог-

  раммой системного обслуживания $GETMSG в аргумент строка.


       Флаги

       Использование в МОС ВП: маска длинное слово

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Четыре флаговых бита, содержащих  сообщение.  Аргумент

  флаги - адрес длинного слова без знака, содержащего  флаго-

  вые биты. По умолчанию принято значение длинного  слова,  в

  котором биты от 0 до 3  установлены  в  1.  Аргумент  флаги

  передается процедуре LIB$SYS_GETMSG  посредством  ссылки  и

  является изменяемым значением для  использования  программы

  системного обслуживания $GETMSG.

       Номера битов, их значение и описание приведены в

  табл. 44.











                           - 510 -

                       00152-01 33 09-2


                                                  Таблица 45

  ----------------------------------------------------------

   Бит ! Значение !            Описание

  ----------------------------------------------------------

   0   !     1    ! Включить текст в сообщение

       !     0    ! Не включать  текст в сообщение

   1   !     1    ! Включить идентификатор сообщения

       !     0    ! Не включать идентификатор сообщения

   2   !     1    ! Включить индикатор "неустранимой" ошибки

       !     0    ! Не включать индикатор "неустранимой"

       !          ! ошибки

   3   !     1    ! Включить имя устройства

       !     0    ! Не включать имя устройства


       Массив

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки, ссылки на массив.

       4-х байтовый массив для получения сообщений.  Аргумент

  массив содержит адрес массива длинных слов без знака.

       Содержимое 4-х байтового массива приведено в табл. 45.















                           - 511 -

                       00152-01 33 09-2


                                                 Таблица 46

   --------------------------------------------------------

    Байт  !           Содержимое

   --------------------------------------------------------

    0     ! Зарезервированный

    1     ! Счетчик аргументов FAO

    2     ! Значение пользователя

    3     ! Зарезервированный


       Описание.

       Описание работы программы системного обслуживания при-

  ведено в документе [1].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_BUFFEROVF

       - процедура завершена, но результирующая строка  пере-

         полнила заданный буфер и была оборвана;

  SS_MSGNOTFND

       - процедура успешно завершена,  но  код  сообщения  не

         имеет соответствующего ему сообщения в файле;

  LIB$_STRTRU

       - процедура  успешно  завершена,  но  исходная  строка

         оборвана;

  LIB$_FATERRLIB

       - неисправимая внутренняя ошибка;






                           - 512 -

                       00152-01 33 09-2


  LIB$_INSVIRMEM

       - недостаточная виртуальная память;

  LIB$_INVSTRDES

       - неверный строчный дескриптор.



       1.120. LIB$SYS_TRNLOG   -   вызов    программы

              системного  обслуживания  $TRNLOG   для

              трансляции логического имени


       Процедура LIB$SYS_TRNLOG использует программы  систем-

  ного обслуживания $TRNLOG для трансляции логического имени.

  Процедура LIB$SYS_TRNLOG возвращает транслируемое  логичес-

  кое имя в семантике строки вызова.


       Формат:

       LIB$SYS_TRNLOG  имя  [, длина], строка [, таблица]

                       [, режим] [, маска]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством дескриптора


       Аргументы:

       Имя

       Использование в МОС ВП: логическое имя

       Тип: символьная строка

       Доступ: только чтение





                           - 513 -

                       00152-01 33 09-2


       Механизм: посредством дескриптора

       Логическое имя. Аргумент имя содержит адрес дескрипто-

  ра со строкой с логическим именем.


       Длина

       Использование в МОС ВП: слово со знаком

       Тип: целое слово со знаком

       Доступ: только запись

       Механизм: посредством ссылки

       Количество символов, записанных в аргумент строка,  не

  считая пробелов, в случае строки фиксированной длины. Аргу-

  мент длина содержит адрес целого слова  со  знаком  с  этим

  количеством.

       Если вводимая строка оборвана на размере  указанном  в

  аргументе строка, то аргумент длина устанавливается в  этот

  размер. Поэтому, аргумент длина может быть всегда использо-

  ван вызывающей программой для доступа к значащей  подстроке

  аргумента строка.


       Строка

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая    строка,    в    которую    процедура

  LIB$SYS_TRNLOG  записывает  транслируемое  логическое  имя.

  Аргумент строка содержит адрес дескриптора с результирующей

  строкой.




                           - 514 -

                       00152-01 33 09-2


       Таблица

       Использование в МОС ВП: целый байт

       Тип: целый байт (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Номер  таблицы  логического  имени.  Аргумент  таблица

  содержит адрес целого байта со знаком, с номером таблицы.


       Режим

       Использование в МОС ВП: режим доступа

       Тип: целый байт (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Режим доступа входа (только таблица  процесса).  Аргу-

  мент режим содержит целый байт со  знаком  с  этим  режимом

  доступа.

       Режимы доступа, их числовые значения  и  символические

  имена приведены в табл. 46.

                                                   Таблица 47

  -----------------------------------------------------------

       Режим       ! Значение !    Символическое имя

  -----------------------------------------------------------

  Основной         !    0     ! PSL$C_KERNEL

  Исполнительный   !    1     ! PSL$C_EXEC

  Супервизорный    !    2     ! PSL$C_SUPER

  Пользовательский !    3     ! PSL$C_USER







                           - 515 -

                       00152-01 33 09-2


       Маска

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Маска,  запрещающая  поиск  таблицы.  Аргумент   маска

  содержит адрес байта без знака с этой маской.

       Аргумент маска передается процедуре посредством ссылки

  и является изменяемым значением для использования  програм-

  мой системного обслуживания $TRNLOG.

       Если маска установлена, то выполняются действия,  опи-

  санные в табл. 47.

                                                   Таблица 48

  -----------------------------------------------------------

  Бит       !               Действие

  -----------------------------------------------------------

   0        ! Не выполняется поиск таблицы логического имени

            ! системы

   1        ! Не выполняется поиск таблицы логического имени

            ! группы

   2        ! Не выполняется поиск таблицы логического имени

            ! процесса


       Описание.

       Описание  работы  программы  системного   обслуживания

  $TRNLOG приведено в документе [1].







                           - 516 -

                       00152-01 33 09-2


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$_NOTRAN

       - процедура успешно завершена, но  вводимая  строка  с

         логическим именем помещена  в  буфер  результирующей

         строки, так как не было найдено эквивалентное имя;

  LIB$_STRTRU

       - процедура  успешно  завершена,  но  исходная  строка

         оборвана при копировании;

  SS$_ACCVIO

       - вызывающая  программа  не  может  прочитать   строку

         логического имени  или  дескриптор  строки,  или  не

         могут  быть  записаны  поля  длины  вывода,   буфера

         вывода, таблицы или режима доступа;

  SS$_IVLOGNAM

       - строка элементов заданного логического  имени  имеет

         нулевую длину или большую, чем 255;

  SS$_RESULTOVF

       - буфер результирующей строки имеет длину равную нулю,

         или его размер  меньше,  чем  размер  результирующей

         строки;

  LIB$_FATERRLIB

       - неисправимая  внутренняя   ошибка.   Данная   ошибка

         свидетельствует о внутренней  ошибке  исполнительной

         библиотеки;






                           - 517 -

                       00152-01 33 09-2


  LIB$INVSTRDES

       - неверный строчный  дескриптор.  Строчный  дескриптор

         имеет неверное значение в поле DSC$B_CLASS;

  LIB$_INSVIRMEM

       - недостаточная виртуальная  память.  Вызов  процедуры

         LIB$GET_VM  не  может  быть  осуществлен,  так   как

         программа  превысила  допустимую  квоту  виртуальной

         памяти.



       1.121. LIB$TRA_ASC_EBC -  трансляция  из  кода

              КОИ-8 в код ДКОИ


       Процедура LIB$TRA_ASC_EBC транслирует  строку  в  коде

  КОИ-8 в строку в коде ДКОИ.


       Формат:

       LIB$TRA_ASC_EBC  строка 1, строка 2


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Строка 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение




                           - 518 -

                       00152-01 33 09-2


       Механизм: посредством дескриптора

       Исходная строка в коде  КОИ-8,  которая  транслируется

  процедурой  LIB$TRA_ASC_EBC.  Аргумент  строка  1  содержит

  адрес дескриптора с исходной строкой.


       Строка 2

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка в коде ДКОИ. Аргумент  строка  2

  содержит адрес дескриптора с результирующей строкой.


       Описание.

       Процедура LIB$TRA_ASC_EBC транслирует  строку  в  коде

  КОИ-8 в строку в  коде  ДКОИ.  Если  результирующая  строка

  имеет   фиксированную   длину,   то   ее    длина    должна

  соответствовать  длине  вводимой  строки.   Заполнение   не

  производится.

       Аналогичная  операция  может  быть   выполнена   путем

  задания  таблицы  трансляции  из  кода  КОИ-8  в  код  ДКОИ

  LIB$AB_ASC_EBC   в   процедуре,   использующей    процедуру

  LIB$MOVTC, но при  этом  не  выполняется  тестирование  для

  нетранслируемых элементов.

       В табл. 48 приведена таблица трансляции из кода  КОИ-8

  в код ДКОИ.

       В  левой  колонке  табл.  48  представлены   числа   в

  шестнадцатиричной  системе,  являющиеся   младшими   битами




                           - 519 -

                       00152-01 33 09-2


  символа в коде КОИ-8.

       В  верхней  строке  табл.  48  представлены  числа   в

  шестнадцатиричной  системе,  являющиеся   старшими   битами

  символа в коде КОИ-8.

       В  основной  части  табл.  48  представлены  числа   в

  шестнадцатиричной системе,  эквивалентные  символу  в  коде

  ДКОИ.

                                                   Таблица 49

                        LIB$AB_ASC_EBC

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !10!40!F0!7C!D7!79!97!3F!3F!3F!3F!3F!3F!3F!3F

   1    !01 !11!4F!F1!C1!D8!81!98!3F!3F!3F!3F!3F!3F!3F!3F

   2    !02 !12!7F!F2!C2!D9!82!99!3F!3F!3F!3F!3F!3F!3F!3F

   3    !03 !13!7B!F3!C3!E2!83!A2!3F!3F!3F!3F!3F!3F!3F!3F

   4    !37 !3C!5B!F4!C4!E3!84!A3!3F!3F!3F!3F!3F!3F!3F!3F

   5    !2D !3D!6C!F5!C5!E4!85!A4!3F!3F!3F!3F!3F!3F!3F!3F

   6    !2E !32!50!F6!C6!E5!86!A5!3F!3F!3F!3F!3F!3F!3F!3F

   7    !2F !26!7D!F7!C7!E6!87!A6!3F!3F!3F!3F!3F!3F!3F!3F

   8    !16 !18!4D!F8!C8!E7!88!A7!3F!3F!3F!3F!3F!3F!3F!3F

   9    !05 !19!5D!F9!C9!E8!89!A8!3F!3F!3F!3F!3F!3F!3F!3F

   A    !25 !3F!5C!7A!D1!E9!91!A9!3F!3F!3F!3F!3F!3F!3F!3F

   B    !0B !27!4E!5E!D2!4A!92!C0!3F!3F!3F!3F!3F!3F!3F!3F

   C    !0C !1C!6B!4C!D3!E0!93!6A!3F!3F!3F!3F!3F!3F!3F!3F




                           - 520 -

                       00152-01 33 09-2


                                         Продолжение табл. 49

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   D    !0D !1D!60!7E!D4!5A!94!D0!3F!3F!3F!3F!3F!3F!3F!3F

   E    !0E !1E!4B!6E!D5!5F!95!A1!3F!3F!3F!3F!3F!3F!3F!3F

   F    !0F !1F!61!6F!D6!6D!96!07!3F!3F!3F!3F!3F!3F!3F!FF


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  LIB$_INVCHA

       - в  процессе  трансляции  было  обнаружено  одно  или

         несколько появлений нетранслируемого элемента;

  LIB$_INVARG

       - если  результирующая  строка   имеет   фиксированную

         длину, и ее длина не равна длине исходной строки, то

         трансляция не выполняется.



       1.122. LIB$TRA_EBC_ASC -  трансляция  из  кода

              ДКОИ в код КОИ-8


       Процедура LIB$TRA_EBC_ASC транслирует  строку  в  коде

  ДКОИ в строку в коде КОИ-8.








                           - 521 -

                       00152-01 33 09-2


       Формат:

       LIB$TRA_EBC_ASC   строка 1, строка 2


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством значения


       Аргументы:

       Строка 1

       Использование в МОС ВП: байт без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка   в   коде   ДКОИ,   транслируемая   процедурой

  LIB$TRA_EBC_ASC.   Аргумент   строка   1   содержит   адрес

  дескриптора с исходной строкой.


       Строка 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка в коде КОИ-8. Аргумент строка  2

  - адрес дескриптора с результирующей строкой. Эта процедура

  использует таблицу трансляции из  кода  ДКОИ  в  код  КОИ-8

  LIB$AB_EBC_ASC.





                           - 522 -

                       00152-01 33 09-2


       Описание.

       Процедура LIB$TRA_EBC_ASC транслирует  строку  в  коде

  ДКОИ в строку в  коде  КОИ-8.  Если  результирующая  строка

  имеет   фиксированную   длину,   то   ее    длина    должна

  соответствовать длине вводимой строки. Аналогичная операция

  может быть выполнена путем задания  таблицы  трансляции  из

  кода  ДКОИ  в  код   КОИ-8   LIB$AB_EBC_ASC   в   процедуре

  использующей  процедуру   LIB$MOVTC,   но   при   этом   не

  выполняется тестирование для нетранслируемых элементов. Эта

  процедура использует таблицу трансляции из кода ДКОИ в  код

  КОИ-8, которая приведена в табл. 49.

       В табл.  49  в  левой  колонке  представлены  числа  в

  шестнадцатиричной  системе,  являющиеся   младшими   битами

  символа в коде ДКОИ.

       В табл. 49  в  верхней  строке  представлены  числа  в

  шестнадцатиричной системе, являющиеся старшими битами  сим-

  вола в коде ДКОИ.

       В  основной  части  табл.  49  представены   числа   в

  шестнадцатиричной системе,  эквивалентные  символу  в  коде

  КОИ-8.












                  





                           - 523 -

                       00152-01 33 09-2


                                                   Таблица 50

                        LIB$AB_EBC_ASC

  -----------------------------------------------------------

  Строка!              Колонка биты 4 - 7

  Биты  !----------------------------------------------------

  0 - 3 ! 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !A !B !C !D !E !F

  -----------------------------------------------------------

   0    !00 !10!5C!5C!20!26!2D!5C!5C!5C!5C!5C!7B!7D!5C!30

   1    !01 !11!5C!5C!5C!5C!2F!5C!61!6A!7E!5C!41!4A!5C!31

   2    !02 !12!5C!16!5C!5C!5C!5C!62!6B!73!5C!42!4B!53!32

   3    !03 !13!5C!5C!5C!5C!5C!5C!63!6C!74!5C!43!4C!54!33

   4    !5C !5C!5C!5C!5C!5C!5C!5C!64!6D!75!5C!44!4D!55!34

   5    !09 !5C!0A!5C!5C!5C!5C!5C!65!6E!76!5C!45!4E!56!35

   6    !5C !08!17!5C!5C!5C!5C!5C!66!6F!77!5C!46!4F!57!36

   7    !7F !5C!1B!04!5C!5C!5C!5C!67!70!78!5C!47!50!58!37

   8    !5C !18!5C!5C!5C!5C!5C!5C!68!71!79!5C!48!51!59!38

   9    !5C !19!5C!5C!5C!5C!5C!60!69!72!7A!5C!49!52!5A!39

   A    !5C !5C!5C!5C!5B!5D!7C!3A!5C!5C!5C!5C!5C!5C!5C!5C

   B    !0B !5C!5C!5C!2E!24!2C!23!5C!5C!5C!5C!5C!5C!5C!5C

   C    !0C !1C!5C!14!3C!2A!25!40!5C!5C!5C!5C!5C!5C!5C!5C

   D    !0D !1D!05!15!28!29!5F!27!5C!5C!5C!5C!5C!5C!5C!5C

   E    !0E !1E!06!5C!2B!3B!3E!3D!5C!5C!5C!5C!5C!5C!5C!5C

   F    !0F !1F!07!1A!21!5E!3F!22!5C!5C!5C!5C!5C!5C!5C!FF


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завршена;





                           - 524 -

                       00152-01 33 09-2


  LIB$_INVCHA

       - в  процессе  трансляции  было  обнаружено  одно  или

         несколько появлений нетранслируемого элемента;

  LIB$_INVARG

       - если результирующая строка имеет фиксированную длину

         и  ее  длина  равна  длине   исходной   строки,   то

         трансляция не происходит.



       1.123. LIB$TRAVERSE_TREE      -       просмотр

              сбалансированной  двоичной  древовидной

              структуры


       Процедура   LIB$TRAVERSE_TREE    вызывает    процедуру

  действия для каждого узла в двоичном дереве.


       Формат:

       LIB$TRAVERSE_TREE   вершина, процедура действия

                           [, данные]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения













                           - 525 -

                       00152-01 33 09-2


       Аргументы:

       Вершина

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Вершина двоичного дерева.  Аргумент  вершина  -  адрес

  длинного  слова  без  знака,  которое   является   вершиной

  двоичного дерева.


       Процедура действия

       Использование в МОС ВП: процедура

       Тип: маска входа процедуры

       Доступ: функциональный вызов (перед возвращением)

       Механизм: посредством ссылки, ссылки на массив.

       Поддерживаемая   пользователем   процедура   действия,

  вызываемая процедурой LIB$TRAVERSE_TREE  для  каждого  узла

  двоичного дерева. Аргумент процедура действия - адрес маски

  входа процедуры действия.


       Данные

       Использование в МОС ВП: аргумент пользователя

       Тип: неопределенный

       Доступ: только чтение

       Механизм: посредством ссылки

       Данные      пользователя,      которые       процедура

  LIB$TRAVERSE_TREE  передает  процедуре  действия.  Аргумент

  данные   содержит   адрес    данных    пользователя.    Это




                           - 526 -

                       00152-01 33 09-2


  необязательный аргумент; по умолчанию принимается  значение

  равное нулю.

       Процедура  LIB$TRAVERSE_TREE  вызывет   поддерживаемую

  пользователем   процедуру   действия   для   каждого   узла

  просматриваемого сбалансированного двоичного дерева.


       Формат вызова процедуры действия


       Формат:

       Процедура действия      вершина, данные

       Процедура LIB$TRAVERSE_TREE передает аргументы вершина

  и данные процедуре действия посредством ссылки.

       Процедура действия  выполняет  действия,  определенные

  пользователями. Обычно процедура действия печатает содержи-

  мое каждого узла при просмотре двоичного дерева.


       Возвращаемые значения состояния:

  LIB$NORMAL

       - процедура успешно завершена. Просмотр окончен.

       Любое возвращаемое значение состояния процедуры дейст-

  вия пользователя.



       1.124. LIB$TRIM_FILESPEC     -      сокращение

              спецификации файла в фиксированном поле


       Процедура LIB$TRIM_FILESPEC берет файловую  специфика-

  цию и сокращает ее  (если  необходимо)  до  соответствующей

  ширины фиксированного поля.






                           - 527 -

                       00152-01 33 09-2


  Формат:

       LIB$TRIM_FILESPEC   файл 1, файл 2 [, ширина]

                           [, длина]


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Файл 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Файловая спецификация, которая  сокращается.  Аргумент

  файл 1 содержит адрес дескриптора со  строкой  спецификации

  файла. Файловая  спецификация  должна  быть  результирующей

  строкой имени СУД-32. Если аргумент файл 1  содержит  более

  255 символов, выдается состояние ошибки LIB$_INVARG.


       Файл 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Сокращенная файловая  спецификация.  Аргумент  файл  2

  содержит   адрес   дескриптора   со   строкой   сокращенной



                           - 528 -

                       00152-01 33 09-2


  спецификации файла. Процедура LIB$TRIM_FILESPEC  записывает

  сокращенную спецификацию файла в аргумент файл 2.


       Ширина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Максимальная ширина  поля.  Аргумент  ширина  -  адрес

  слова без знака, содержащего максимальную ширину поля. Если

  этот аргумент отсутствует, то  используется  текущая  длина

  аргумента  файл  2.  Если  аргумент   файл   2   -   строка

  нефиксированой длины, необходимо задавать аргумент  ширина,

  который обеспечивает необходимую ширину используемого поля.


       Длина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Длина  сокращенной  файловой  спецификации  без  учета

  пробелов.  Аргумент  длина  -  адрес   слова   без   знака,

  содержащего эту длину. Это необязательный аргумент.


       Описание.

       Процедура   LIB$TRIM_FILESPEC    сокращает    файловую

  спецификацию  определенным  способом   в   соответствии   с

  используемым   полем   фиксированной    длины.    Процедура

  LIB$TRIM_FILESPEC  позволяет  писать   программы,   которые



                           - 529 -

                       00152-01 33 09-2


  выводят файловую  спецификацию  с  заданной  шириной  поля.

  Процедура   LIB$TRIM_FILESPEC   удаляет   части    файловой

  спецификации в следующем порядке:

       1) узел;

       2) устройство;

       3) директорий;

       4) версия;

       5) тип.

       Процедура LIB$TRIM_FILESPEC поддерживает  любой  класс

  строк для аргументов строки файл 1 и файл 2.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура упешно завершена;

  LIB$_STRTRU

       - процедура успешно завершена, но строка оборвана;

  LIB$_INVARG

       - неверный аргумент. Аргумент файл  1  содержит  более

         255 символов;

  LIB$_INVSTRDES

       - неверный строчный дескриптор;

  LIB$_WRONUMARG

       - неверное количество аргументов.

       Любые  возвращаемые   значения   состояния   процедуры

  LIB$SCOPY_R_DX.

       Любые  возвращаемые   значения   состояния   программы

  системного обслуживания $FILESCAN.





                           - 530 -

                       00152-01 33 09-2


       Пример.

  РROGRAM TRIM_FILESPEC(INPUT, OUTPUT);

  (+)

  ( Данный пример демонстрирует использование

  ( процедуры LIB$TRIM_FILESPEC.

  (-)

       ТYPE

          WORD = [WORD] 0..65535

       VAR

          INPUT_FILESPEC   : VARYING [255] OF CHAR;

          OUTPUT_FILESPEC  : VARYING [32] OF CHAR;

          RETURNED_STATUS  : INTEGER;

       [EXTERNAL] FUNCTION LIB$TRIM_FILESPEC(

          IN_FILE          : VARYING [LEN1] OF CHAR;

          VAR OUT_FILE     : VARYING [LEN2] OF CHAR;

          WIDTH            : WORD := %IMMED 0;

          OUT_LEN          : [REFERENCE] WORD := %IMMED 0

          ) : INTEGER; EXTERNAL;

       [EXTERNAL] FUNCTION LIB$STOP(

              CONDITION_STATUS : [IMMEDIATE,UNSAFE] UNSIGNED;

              FAO_ARGS         : [IMMEDIATE,UNSAFE,LIST]

                                  UNSIGNED

              ) : INTEGER; EXTERNAL;

  BEGIN

  (+)

  ( Запуск со старшего INPUT_FILESPEC;

  (-)




                           - 531 -

                       00152-01 33 09-2


  INPUT_FILESPEC := 'DISK$NAME:[DIRECTORY1.DIRECTORY2]

                    FILENAME.EXTENSTION;1';

  (+)

  ( Использование процедуры LIB$TRIM_FILESPEC для

  ( сокращения наименьшей переменной.

  (-)

  RETURNED_STATUS := LIB$TRIM_FILESPEC(

                        INPUT_FILESPEC,

                        OUTPUT_FILESPEC,

                        SIZE(OUTPUT_FILESPEC.BODY));

  IF NOT ODD(RETURNED_STATUS)

  THEN

       LIB$STOP(RETURNED_STATUS);

  (+)

  ( Печать исходной файловой спецификации и

  ( сокращенной файловой спецификации.

  (-)

  WRITELN('исходная файловая спецификация

          ',INPUT_FILESPEC);

  WRITELN('сокращенная файловая спецификация

           ',OUTPUT_FILESPEC);

  END.

       Данная программа  на  языке  программирования  ПАСКАЛЬ

  демонстрирует использование процедуры LIB$TRIM_FILESPEC.










                           - 532 -

                       00152-01 33 09-2


       Результат работы программы:

  Исходная файловая    DISK$NAME:[DIRECTORY1.DIRECTORY2]

  Спецификация         FILENAME.EXTENSTION;1

  Сокращенная файловая FILENAME.EXTENSTION;1

  спецификация



       1.125. LIB$WAIT - ожидание в течение заданного

              периода времени


       Процедура  LIB$WAIT   помещает   текущий   процесс   в

  состоянии  прерывания  на  количество  секунд,  заданное  в

  аргументе время.


       Формат:

       LIB$WAIT     время


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:

       Время

       Использование в МОС ВП: плавающая запятая

       Тип: число с плавающей запятой формата F

       Доступ: только чтение

       Механизм: посредством ссылки

       Количество секуд  ожидания.  Аргумент  время  содержит




                           - 533 -

                       00152-01 33 09-2


  адрес числа с плавающей запятой  формата  F  с  количеством

  секунд. Перед использованием значение  времени  округляется

  до сотых  долей  секунды.  Аргумент  время  должен  быть  в

  интервале от 0.0 до 100.000.0


       Описание.

       Процедура   LIB$WAIT   округляет   заданное   значение

  аргумента  время  до  сотых   долей   секунды,   использует

  программу системного обслуживания $SCHDWK для запуска  про-

  цесса после прерывания и  использует  программу  системного

  обслуживания $HIBER  для  помещения  процесса  в  состояние

  прерывания. Подробно эти программы системного  обслуживания

  описаны в документе [1].


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  SS$INVARG

       - неверный аргумент. Значение аргумента время меньше 0

         или превысило значение 100.000.0;

  LIB$WRONUMARG

       - неверное количество аргументов.

       Любое возвращаемое значение состояния  программы  сис-

  темного обслуживания $SCHDWK.


       Пример.

  IDENTIFICATION DIVISION

  PROGRAM-ID. SAMPLE.

  DATA DIVISION.



                           - 534 -

                       00152-01 33 09-2


  WORKING-STORAGE SECTION.

  01     DELAY COMP-1.

  РROCEDURE DIVISION.

  START-SAMPLE.

       МOVE 3.5 TO DELAY.

       СALL "LIB$WAIT"

       USING BY REFERENCE DELAY.

       STOP RUN.

       Данная  программа  на  языке   програмирования   КОБОЛ

  демонстрирует использование процедуры  LIB$WAIT.  Во  время

  работы программа останавливается, 3.5 секунды  находится  в

  ожидании и продолжает работу.









                                                    
























                           - 535 -

                       00152-01 33 09-2





                 Перечень ссылочных документов




       1. Операционная система МОС ВП. Подсистема  системного

  сервиса.  Программы  системного  обслуживания.   Справочный

  материал. 00152-01 97 06.

       2. Операционная система МОС ВП. Подсистема управления.

  Диалоговый командный язык. Руководство оператора.  00152-01

  34 01.

       3. Операционная система МОС ВП. Архитектура и  система

  машинных инструкций. Справочный материал. 00152-01 97 01-1.

       4. Операционная система МОС ВП. Подсистема режима сов-

  местимости с ОС РВ. Справочный материал. 00152-01 97 14.


















                           - 535К -

                    2б.00152-01 33 09-2





                 Перечень ссылочных документов




       1. Операционная система МОС  ВП.  Подсистема   систем-

  ного сервиса. Программы системного обслуживания. Справочный

  материал. 2б.00152-01 97 06.

       2. Операционная система МОС ВП. Подсистема управления.

  Диалоговый  командный  язык.   Руководство  оператора. 

  2б.00152-01 34 01.

       3. Операционная система МОС ВП. Архитектура и  система

  машинных инструкций. Справочный материал. 2б.00152 97 01.

       4. Операционная система МОС ВП. Подсистема режима сов-

  местимости  с  ОС РВ.  Справочный  материал.  2б.00152-01  

  97 14.





























   
                       - 536K -  
  
                  2б.00152-01 33 09-2  
                                                      
   ------------------------------------------------------------
   I                                                          I
   I                  Лист регистрации изменений              I
   I                                                          I
   I----------------------------------------------------------I
   IНомера листов (страниц)IВсего IN     IВходящий IПодп.IДатаI
   I-----------------------IлистовIдоку- IN сопро- I     I    I
   IИ IИз- IЗа- IНо- IАнну-I(стра-Iмента Iводитель-I     I    I
   Iз Iме- Iме- Iвых Iлиро-Iниц)  I      Iного до- I     I    I
   Iм Iнен-Iнен-I    Iван- Iв до- I      Iкум. и   I     I    I
   I. Iных Iных I    Iных  Iкум.  I      Iдата     I     I    I
   I----------------------------------------------------------I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
  
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!