

















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


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


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










                        00152-01 33 09-5

                           Листов 138






















                             1987















  Утвержден


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







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



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



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



                     2б.00152-01 33 09-5


                       Листов 142/4К












1K
5K
138K
139K







                             1987

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

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


    



                            - 2 -

                       00152-01 33 09-5






                           АННОТАЦИЯ




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

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

  ваемых операционной системой МОС ВП.

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

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

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

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

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

































                            - 3 -

                       00152-01 33 09-5






                          СОДЕРЖАНИЕ





  1.  Процедуры обработки строк                             6


  1.1.    STR$ADD  -  сложение  двух   десятичных

          числовых строк                                    6

  1.2.    STR$ANALYZE_SDESC - анализ  дескриптора

          строки                                           13

  1.3.    STR$APPEND - присоединение строки                15

  1.4.    STR$CASE_BLIND_COMPARE   -    сравнение

          строк без учета регистров                        18

  1.5.    STR$COMPARE - сравнение двух строк               22

  1.6.    STR$COMPARE_EQL - сравнение двух  строк

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

  1.7.    STR$COMPARE_MULTI  -   сравнение   двух

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

          КОИ-8                                            28

  1.8.    STR$CONCAT - об'единение двух или более

          строк                                            31

  1.9.    STR$COPY_DX  -   копирование   исходной

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

          дескриптора в результирующую строку              36

  1.10.   STR$COPY_R   -   копирование   исходной

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

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


                            - 4 -

                       00152-01 33 09-5


  1.11.   STR$DIVIDE -  деление  двух  десятичных

          строк                                            44

  1.12.   STR$DUPL_CHAR - дублирование символа  N

          раз                                              51

  1.13.   STR$FIND_FIRST_IN_SET -  поиск  первого

          символа в ряду символов                          55

  1.14.   STR$FIND_FIRST_NOT_IN_SET    -    поиск

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

          в последовательности                             59

  1.15.   STR$FIND_FIRST_SUBSTRING    -     поиск

          подстроки в введенной строке                     63

  1.16.   STR$FREE1_DX   -   освобождение   одной

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

  1.17.   STR$GET1_DX    -    размещение    одной

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

  1.18.   STR$LEFT  -  выделение   подстроки   из

          строки                                           73

  1.19.   STR$LEN_EXTR - выделение  подстроки  из

          строки                                           79

  1.20.   STR$MATCH_WILD      -      соответствие

          спецификации символа обобщения                   84

  1.21.   STR$MUL  -  умножение  двух  десятичных

          строк                                            88

  1.22.   STR$POSITION       -        возвращение

          относительной позиции подстроки                  94

  1.23.   STR$POS_EXTR - выделение  подстроки  из

          строки                                           99




                            - 5 -

                       00152-01 33 09-5


  1.24.   STR$PREFIX - добавление строки                  103

  1.25.   STR$RECIP    -    обратная     величина

          десятичной строки                               106

  1.26.   STR$REPLACE - замена подстроки                  112

  1.27.   STR$RIGHT  -  выделение  подстроки   из

          строки                                          116

  1.28.   STR$ROUND  -  округление  или  усечение

          десятичной строки                               121

  1.29.   STR$TRANSLATE - трансляция  совпадающих

          символов                                        127

  1.30.   STR$TRIM   -   упорядочение    конечных

          пробелов и табуляций                            132

  1.31.   STR$UPCASE - преобразование всей строки

          в символы верхнего регистра                     134


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
































                            - 5К -

                    2б.00152-01 33 09-5


  1.24.   STR$PREFIX - добавление строки                  103

  1.25.   STR$RECIP    -    обратная     величина

          десятичной строки                               106

  1.26.   STR$REPLACE - замена подстроки                  112

  1.27.   STR$RIGHT  -  выделение  подстроки   из

          строки                                          116

  1.28.   STR$ROUND  -  округление  или  усечение

          десятичной строки                               121

  1.29.   STR$TRANSLATE  трансляция   совпадающих

          символов                                        127

  1.30.   STR$TRIM   -   упорядочение    конечных

          пробелов и табуляций                            132

  1.31.   STR$UPCASE - преобразование всей строки

          в символы верхнего регистра                     134


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



























                            - 6 -

                       00152-01 33 09-5


                 1. Процедуры обработки строк



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

  ки строк STR$. Они включают в себя процедуры строчной ариф-

  метики, символьно-ориентированные,  строчно-ориентированные

  процедуры и процедуры трансляции. Символьно-ориентированные

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

  ра,    преобразования,     задания     диапазона     строк.

  Строчно-ориентированные процедуры выполняют функции копиро-

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



       1.1. STR$ADD  -  сложение  двух   десятичных

            числовых строк


       Процедура  STR$ADD  складывает   десятичные   числовые

  строки.


       Формат:

       STR$ADD  знак A, порядок A, число A,

                знак B, порядок B, число B,

                знак C, порядок C, число C.


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

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

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

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

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







                            - 7 -

                       00152-01 33 09-5



       Аргументы:


       Знак A

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

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

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

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

       Знак  первого  операнда.  Аргумент  знак  A   является

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

  - рассматривается как положительный, 1 - как отрицательный.


       Порядок A

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

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

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

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

       Экспонента (степень 10-ти), на которую умножается чис-

  ло A для получения абсолютного значения  первого  операнда.

  Аргумент порядок A является адресом целого  длинного  слова

  со знаком, содержащего этот порядок.


       Число A

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

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

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

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

       Числовая строка без знака. Аргумент число  A  является

  адресом дескриптора, задающего эту  строку.  Строка  должна




                            - 8 -

                       00152-01 33 09-5


  быть десятичным числом без знака.


       Знак B

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

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

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

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

       Знак  второго  операнда.  Аргумент  знак  B   является

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

  операнда. 0 - рассматривается как положительный,  1  -  как

  отрицательный знак.


       Порядок B

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

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

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

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

       Экспонента  (степень  10-ти),  на  которую  умножается

  аргумент число B для получения абсолютного значения второго

  операнда.  Аргумент  порядок  B  является  адресом   целого

  длинного слова, содержащего этот порядок.


       Число B

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

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

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

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

       Числовая строка без знака. Аргумент число  B  является

  адресом дескриптора, задающего эту  строку.  Строка  должна



                            - 9 -

                       00152-01 33 09-5


  быть десятичным числом без знака.


       Знак C

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

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

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

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

       Знак результата.  Аргумент  знак  C  является  адресом

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

  результата. 0 рассматривается как положительный,  1  -  как

  отрицательный знак.


       Порядок C

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

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

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

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

       Экспонента  (степень  10-ти),  на  которую  умножается

  аргумент  число  C  для  получения   абсолютного   значения

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

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


       Число C

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

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

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

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

       Числовая строка без знака. Аргумент число  C  является

  адресом дескриптора, задающего эту строку. Строка  является



                           - 10 -

                       00152-01 33 09-5


  десятичным числом без знака.


       Описание.

       Процедура STR$ADD  складывает  две  строки  десятичных

  чисел (A и B). Каждое слагаемое представляется тремя числа-

  ми, которые передаются программе STR$ADD в виде аргументов:

       1) число X - числовая строка;

       2) порядок X - показатель степени  10-ти,  необходимый

  для получения абсолютного значения X;

       3) знак X - знак.

       Значение числа х получается умножением  первого  аргу-

  мента (число X) на экспоненту, которая определяется  вторым

  аргументом (порядок X), и добавлением знака плюс, если тре-

  тий аргумент (знак X) равен нулю или знака минус,  если  он

  равен единице. Например, число X равно 2, порядок X равен 3

  и знак X равен 1, тогда число, представленное в аргументе X

  = 2 * 10**3 плюс знак, или равно - 2000.

       Результат сложения (C) возвращается также в виде  трех

  аргументов.


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

  SS$_NORMAL

       - программа успешно завершена;

  STR$_TRU

       - предупреждение   усечения   строки.   Результирующая

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








                           - 11 -

                       00152-01 33 09-5



       Сигнализируемые значения состояния:

  LIB$_INVARG

       - неверный аргумент;

  STR$_FATINTERR

       - неустранимая  внутренняя  ошибка.   Не   выполняется

         внутренний  последовательный  контроль.  Это  обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

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

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

         строки, разрешенным вызовом процедуры МОС ВП;

  STR$_INSVIRMEM

       - недостаточная виртуальная память. Процедура  STR$ADD

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

         временной строки;

  STR$_WRONUMARG

       - неверное количество аргументов.

       Пример.

  100 !+

      ! в данном примере демонстрируется

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

      ! STR$ADD для сложения десятичных строк

      !-

      ASIGN% = 1%

      AEXP% = 3%

      ADIGITS$ = '1'



                           - 12 -

                       00152-01 33 09-5


      BSIGN% = 0%

      BEXP% = -4%

      BDIGITS$ = '2'

      CSIGN% = 0%

      CEXP% = 0%

      CDIGITS$ = '0'

      PRINT "A = "; ASIGN%; AEXP%; ADIGITS$

      PRINT "B = "; BSIGN%; BEXP%; BDIGITS$

      CALL STR$ADD      (ASIGN%, AEXP%, ADIGITS$, &

                        BSIGN%, BEXP%, BDIGITS$, &

                        CSIGN%, CEXP%, CDIGITS$)

      PRINT "C = "; CSIGN%; CEXP%; CDIGITS$

  999 END

       В данной программе на  языке  программирования  БЕЙСИК

  используется процедура STR$ADD для сложения двух десятичных

  строк, имеющих следующие значения:

       А = -1000 (ASIGN = 1, аехр = 3, ADIGITS = '1')

       В = 0002 (BSIGN = 0, вехр = -4, BDIGITS = '2')

       Результат выполнения программы следующий:

       А = 1     3    1

       В = 0     -4   2

       С = 1     -4   999 99 98

       Десятичное значение C = - 999.9998 (CSIGN = 1
                                                       
  CEXP = -4, CDIGITS = '999998').










                           - 13 -

                       00152-01 33 09-5


       1.2. STR$ANALYZE_SDESC - анализ  дескриптора

            строки


       Процедура STR$ANALYZE_SDECS выделяет длину и начальный

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


       Формат:

       STR$ANALYZE_SDESC дескриптор ввода, длина,

                         адрес-данных

       Точка входа JSB:

       STR$ANALYZE_SDESC_R1


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

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

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

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

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


       Аргументы:

       Дескриптор-ввода

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

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

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

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

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

  STR$ANALYZE_SDESC выделяет длину данных и адрес, с которого

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

  дескриптора, задающего вводимые данные.






                           - 14 -

                       00152-01 33 09-5


       Длина

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

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

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

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

  посредством значения для точки входа JSB.

       Длина данных - это слово,  выделяемое  из  дескриптора

  процедурой  STR$ANALYZE_SDESC.  Аргумент   длина   является

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

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


       Адрес-данных

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

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

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

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

  посредством значения для точки входа JSB.

       Адрес  данных.  Это   адрес,   выделяемый   процедурой

  STR$ANALYZE_SDESC. Аргумент адрес-данных  является  длинным

  словом без знака,  в  которое  процедура  STR$ANALYZE_SDESC

  записывает адрес данных.


       Описание.

       Процедура STR$ANALYZE_SDESC использует дескриптор  как

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

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

  Список    классов    приведен    в    описании    процедуры

  LIB$ANALYZE_SDESC в документе [1].




                           - 15 -

                       00152-01 33 09-5


       Процедура STR$ANALYZE_SDESC передает  длину  данных  в

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

  аргумент адрес-данных.

       Процедура STR$ANALYZE_SDESC сигнализирует  об  ошибке,

  если обнаружен неверный класс дескриптора.


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

       - неверный класс строки. Код  класса,  обнаруженный  в

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

         строки, разрешенным вызовом процедур МОС ВП.



       1.3. STR$APPEND - присоединение строки


       Процедура STR$APPEND присоединяет  исходную  строку  в

  конец результирующей строки. Результирующая  строка  должна

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


       Формат:

       STR$APPEND строка 1, строка 2


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

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

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

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

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










                           - 16 -

                       00152-01 33 09-5


       Аргументы:

       Строка 1

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

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

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

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

       Результирующая строка, к которой процедура  STR$APPEND

  присоединяет исходную строку. Аргумент  строка  1  -  адрес

  дескриптора, задающего результирующую строку. Эта результи-

  рующая строка должна быть динамической или переменной.


       Строка 2

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

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

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

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

       Исходная  строка,  которая  присоединяется   в   конец

  результирующей  строки.   Аргумент   строка   2   -   адрес

  дескриптора, задающего исходную строку.


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

  SS$_NORMAL

       - программа успешно завершена.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая  внутренняя  ошибка.   Не   выполняется

         внутренний  последовательный  контроль.  Это  обычно

         указывает на внутреннюю ошибку в исполнительной биб-



                           - 17 -

                       00152-01 33 09-5


         лиотеке;

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

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

         разрешенным вызовом процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$APPEND  не  зарезервировала  массив  памяти  для

         динамической или временной строки;

  STR$_STRTOOLON

       - общая длина исходной строки и результирующей  строки

         превышает 65,535.

       Пример.

  10  !+

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

      ! STR$APPEND для присоединения исходной строки

      ! к результирующей строке.

      !-

      DST$ = 'M32/'

      SRC$ = 'VOS'

      CALL STR$APPEND (DST$, SRC$)

      PRINT "DST$ = ";DST$

      END

       В данной программе на  языке  программирования  БЕЙСИК

  используется   процедура   STR$APPEND   для   присоединения

  исходной строки 'M32/' к результирующей строке 'VOS'.






                           - 18 -

                       00152-01 33 09-5


       Результат выполнения программы следующий:

       DST$=M32/VOS



       1.4. STR$CASE_BLIND_COMPARE   -    сравнение

            строк без учета регистров


       Процедура   STR$CASE_BLIND_COMPARE   сравнивает    две

  вводимые  строки  любого  поддерживаемого  класса  и   типа

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

  регистру, или нижнему.


       Формат:

       STR$CASE_BLIND_COMPARE строка 1, строка 2


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

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

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

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

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

       Значения,           возвращаемые            процедурой

  STR$CASE_BLIND_COMPARE   и   условия,   в    которые    они

  транслируются, представлены в табл. 1.

















                           - 19 -

                       00152-01 33 09-5


                                                    Таблица 1

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

     Возвращаемое  !       Условие

       значение    !

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

       -1          ! Строка 1 меньше чем строка 2

        0          ! Обе одинаковы (с добавлением пробелов

                   ! для более короткой строки)

        1          ! Строка 1  больше чем строка 2


       Аргументы:


       Строка 1

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

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

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

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

       Первая строка.  Аргумент  строка  1  является  адресом

  дескриптора, задающего первую строку.


       Строка 2

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

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

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

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

       Вторая строка.  Аргумент  строка  2  является  адресом

  дескриптора, задающего вторую строку.







                           - 20 -

                       00152-01 33 09-5



       Описание.

       Процедура STR$CASE_BLIND_COMPARE  не  делает  различия

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

  сравнением строк, содержимое обеих  строк  преобразуется  в

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

  не изменяются.

       Процедура  STR$CASE_BLIND_COMPARE   использует   набор

  символов КОИ-8.


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

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

         разрешенным вызовом процедур МОС ВП.

       Пример.

  РROGRAM CASE_BLIND (INPUT, OUTPUT);

  (+)

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

  ( процедура STR$CASE_BLIND_COMPARE.

  (

  ( описание внешних функций.

  (-)

  FUNCTION STR$CASE_BLIND_COMPARE(STR1 : VARYING

            [A] OF CHAR; STR2 : VARYING [B] OF

            CHAR) : INTEGER; EXTERN;

  (+)

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




                           - 21 -

                       00152-01 33 09-5


  ( основной программе.

  (-)

  VAR

      STRING1     : VARYING [256] OF CHAR;

      STRING2     : VARYING [256] OF CHAR;

      RET_STATUS  : INTEGER;

  (+)

  ( начало основной программы. Чтение значений для

  ( сравниваемых строк. Вызов процедуры

  ( STR$CASE_BLIND_COMPARE. Печать результата.

  (-)

  BEGIN

      WRITELN ('ENTER THE FIRST STRING: ');

      READLN (STRING1);

      WRITELN ('ENTER THE SECOND STRING: ');

      READLN(STRING2);

      RET_STATUS :=STR$CASE_BLIND_COMPARE(STRING1,STRING2);

      WRITELN(RET_STATUS);

  END

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

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

  STR$CASE_BLIND_COMPARE для сравнения двух строк  без  учета

  регистров.

       Результат работы программы следующий:

       $ RUN CASE_BLIND

       Введите первую строку: KITTEN






                           - 22 -

                       00152-01 33 09-5


       Введите вторую строку: KITTEN

           0



       1.5. STR$COMPARE - сравнение двух строк


       Процедура  STR$COMPARE  сравнивает   содержимое   двух

  строк. Если строки не равны по длине, то  перед  сравнением

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

  более длинной строки.


       Формат:

       STR$COMPARE строка 1, строка 2


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

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

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

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

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

       Возвращаемые   процедурой   STR$COMPARE   значения   и

  условия, в которые они транслируются, приведены в табл. 2.

                                                   Таблица 2

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

      Возвращаемое  !            Условие

        значение    !

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

     -1             ! Строка 1  меньше, чем строка 2

      0             ! Строка 1 равна  строке 2

      1             ! Строка 1 больше, чем строка 2





                           - 23 -

                       00152-01 33 09-5


       Аргументы:


       Строка 1

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

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

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

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

       Первая строка. Аргумент строка 1 - адрес  дескриптора,

  задающего первую строку.


       Строка 2

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

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

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

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

       Вторая строка. Аргумент строка 2 - адрес  дескриптора,

  задающего вторую строку.


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

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

         разрешенным вызовом процедур МОС ВП.

       Пример.

  100 EXTERNAL INTEGER FUNCTION STR$COMPARE

      SRC1$ = 'ABC'

      SRC2$ = 'BCD    '

      !+

      ! при сравнении процедура STR$COMPARE обращается



                           - 24 -

                       00152-01 33 09-5


      ! к строке 1 как к строке такой же длины,

      ! что и строка 2

      ! она дополняет содержимое аргумента  строка 1

      ! пробелами, тогда аргумент строка 1 имеет следующий

      ! вид: 'ABC    '.

      ! однако, она только обращается к содержимому такой

      ! длины, содержимое исходной строки фактически

      ! остается неизменным.

      !-

      т% = STR$COMPARE(SRC1$, SRC2$)

      IF I% = 1 THEN RESULT$ = ' больше чем '

      IF I% = 0 THEN RESULT$ = ' эквивалентна '

      IF I% = -1 THEN RESULT$ = ' меньше чем '

      PRINT SRC1$; RESULT$; SRC2$

  999 END

       Данная  программа  на  языке  программирования  БЕЙСИК

  использует процедуру STR$COMPARE для сравнения двух строк.

       Результат работы программы следующий:

       АВС меньше чем BCD



       1.6. STR$COMPARE_EQL - сравнение двух  строк

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


       Процедура STR$COMPARE_EQL сравнивает две строки, чтобы

  определить имеют ли они одну и ту же  длину  и  содержание.

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

  эквивалентными.





                           - 25 -

                       00152-01 33 09-5



       Формат:

       STR$COMPARE_EQL  строка 1, строка 2


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

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

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

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

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

       Значения, возвращаемые  процедурой  STR$COMPARE_EQL  и

  условия, в которые они транслируются, приведены в табл. 3.

                                                   Таблица 3

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

    Возвращаемое   !              Условие

      значение     !

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

          0        ! Длина и содержимое аргумента строка 1

                   ! эквивалентны длине и содержимому аргу-

                   ! мента строка 2

          1        ! Либо длина строка 1 не эквивалентна

                   ! длине строка 2, либо содержимое аргу-

                   ! мента строка 1 не эквивалентно содер-

                   ! жимому аргумента строка 2, либо и то

                   ! и другое












                           - 26 -

                       00152-01 33 09-5


       Аргументы:


       Строка 1

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

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

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

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

       Первая сравниваемая строка. Аргумент строка 1 является

  адресом дескриптора, задающего первую сравниваемую строку.


       Строка 2

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

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

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

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

       Вторая сравниваемая строка. Аргумент строка 2 -  адрес

  дескриптора, задающего вторую сравниваемую строку.


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

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

         разрешенным вызовом процедур МОС ВП.

       Пример.

  РROGRAM COMPARE_EQL(INPUT, OUTPUT);

  (+)

  ( данный пример демонстрирует использование процедуры

  ( STR$COMPARE_EQL для сравнения двух строк. Строки

  ( считаются эквивалентными, если они имеют одну и ту же



                           - 27 -

                       00152-01 33 09-5


  ( длину и одно и то же содержимое.

  (

  ( описание внешних функций.

  (-)

  FUNCTION STR$COMPARE_EQL(SRC1STR : VARYING

         [A] OF CHAR; SRC2STR : VARYING [B]

         OF CHAR) : INTEGER; EXTERN;

  (+)

  ( описание переменных, используемых в основной программе.

  (-)

  VAR

      STRING1    : VARYING [256] OF CHAR;

      STRING2    : VARYING [256] OF CHAR;

      RET_STATUS : INTEGER;

  (+)

  ( начало основной программы.

  ( чтение сравниваемых строк.

  ( печать результата.

  (-)

  BEGIN

      WRITELN ('введите первую строку: ');

      READLN (STRING1);

      WRITELN ('введите следующую строку: ');

      READLN (STRING2);

      RET_STATUS := STR$COMPARE_EQL(STRING1, STRING2);

      WRITELN (RET_STATUS);

  END




                           - 28 -

                       00152-01 33 09-5


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

  демонстрирует использование процедуры STR$COMPARE_EQL.
                                                      
       Результат работы программы следующий:

       $ RUN COMPARE_EQL

       Введите первую строку: FROG

       Введите следующую строку: FROGS

          1



       1.7. STR$COMPARE_MULTI  -   сравнение   двух

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

            КОИ-8


       Процедура STR$COMPARE_MULTI сравнивает две  символьные

  строки на эквивалентность, используя набор символов КОИ-8.


       Формат:

       STR$COMPARE_MULTI  строка 1, строка 2  [,флаг]

                          [,индикатор]


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

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

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

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

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

       Возвращаемые процедурой STR$COMPARE_MULTI  значения  и

  условия, в которые они транслируются, приведены в табл. 4.









                           - 29 -

                       00152-01 33 09-5


                                                   Таблица 4

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

    Возвращаемое !                 Условие

      значение   !

  ---------------!------------------------------------------

     -1          ! Строка 1 меньше, чем строка 2

      0          ! Строки одинаковы; более короткая

                 ! Строка дополнена пробелами

      1          ! Строка 1 больше, чем строка 2


       Аргументы:


       Строка 1

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

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

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

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

       Первая сравниваемая строка. Аргумент строка 1 является

  адресом дескриптора, указывающего первую строку.


       Строка 2

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

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

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

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

       Вторая сравниваемая строка. Аргумент строка 2 -  адрес

  дескриптора, задающего вторую строку.







                           - 30 -

                       00152-01 33 09-5



       Флаг

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

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

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

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

       Флаговый бит. Аргумент флаг является  длинным  словом,

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

  значение аргумента флаг = 0.

       Если флаговый бит установлен в 0,  это  означает,  что

  символы верхнего и нижнего регистров эквивалентны.


       Индикатор

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

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

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

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

       Индикатор,    определяющий    используемую     таблицу

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

  словом  без  знака,  содержащим  этот   индикатор   таблицы

  иностранного языка. По умолчанию устанавливается значение

  = 1, что означает использование набора символов КОИ-8.


       Описание.

       Процедура  STR$COMPARE_MULTI  сравнивает  две   строки

  символов,  чтобы  определить  имеют   ли   они   одинаковое

  содержимое.  Две  строки  эквивалентны,  если   они   имеют

  одинаковые символы в  одинаковой  последовательности,  даже

  если одна из  них  дополнена  пробелами  до  длины  большей



                           - 31 -

                       00152-01 33 09-5


  строки. При сравнении используется набор символов КОИ-8.


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

       - неверный   класс   строки.   Неисправимая    ошибка.

         Дескриптор строка 1 и/или строка 2  содержит  класс,

         который не поддерживается вызовом процедур МОС ВП;

  LIB$_INVARG

       - неверный аргумент. Неисправимая ошибка.



       1.8. STR$CONCAT - об'единение двух или более

            строк


       Процедура STR$CONCAT принимает до 254 исходных строк и

  об'единяет их в одну результирующую строку.


       Формат:

       STR$CONCAT  результирующая строка, строка 1

                   [,..., строка N]


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

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

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

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

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












                           - 32 -

                       00152-01 33 09-5



       Аргументы:


       Результирующая строка

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

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

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

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

       Результирующая строка, в которую STR$CONCAT об'единяет

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

  адресом дескриптора, задающего эту результирующую строку.


       Строка 1

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

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

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

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

       Первая исходная строка.  Аргумент  строка  1  является

  адресом дескриптора, задающего первую исходную строку.


       Строка N

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

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

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

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

       N-ная исходная  строка.  Аргумент  строка  N  -  адрес

  дескриптора, задающего N-ную исходную  строку.  Максимально

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






                           - 33 -

                       00152-01 33 09-5



       Описание.

       Процедура STR$CONCAT связывает все  заданные  исходные

  строки в одну  результирующую  строку.  Строки  могут  быть

  любого класса и  типа  данных  при  использовании  которых,

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

       Если один или более введенных символов не записались в

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

  состояния.

       Необходимо указать, по  крайней  мере,  одну  исходную

  строку, и можно указать до 254 исходных строк. Максимальная

  длина об'единенной строки 65,535 байт.


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

  SS$_NORMAL

       - процедура успешно завершена. Все  символы  введенных

         строк записаны в результирующую строку;

  STR$_TRU

       - предупреждение  усечения  строки.  Один  или   более

         символов не записан  в  результирующую  строку.  Это

         может   произойти,   когда   результирующая   строка

         фиксированной длины.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая  внутренняя  ошибка.   Не   выполняется

         внутренний  последовательный  контроль.  Это  обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;



                           - 34 -

                       00152-01 33 09-5


  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

         класса дескртора, не является кодом класса строки,

         разрешенным вызовом процедур МОС ВП;

  STR$_INSVIRMEN

       - недостаточная    виртуальная    память.    Процедура

         STR$CONCAT не может  зарезервировать  массив  памяти

         для динамической или временной строки;

  STR$_WRONUMARG

       - неверное количество аргументов.  Передано  меньше  2

         или больше 255 аргументов в процедуру STR$CONCAT.

       Пример 1.

     10 !+

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

        ! использование STR$CONCAT, которая об'единяет

        ! четыре строки в одну результирующую строку.

        ! -

        EXTERNAL INTEGER FUNCTION STR$CONCAT

        STATUS% = STR$CONCAT ( X$, 'A', 'B', 'C', 'D')

        PRINT "X$ = ";X$

     END

       Результат работы программы следующий:

       Х$ = ABCD

       Пример 2.



    МSG1:            .ASCII /Виктор Иванов/   ; первая

                                              ; строка.




                           - 35 -
                     
                       00152-01 33 09-5


    MSG1_LEN = .-MSG1                         ; ее длина.

    МSG2:           .ASCII /написал эту книгу/; следующая

                                              ; строка.

    МSG2_LEN = .-MSG2                         ; ее длина.

    RESULT:          .BLKB MSG1_LEN + MSC2_LEN; сохранение

                                              ; об'единен-

                                              ; ной строки.

    МSG1_DSC:          .WORD MSG1_LEN         ; DSC$W_

                                              ; LENGTH

                     .BYTE 14                 ; DSC$B_

                                              ; DTYPE

                     .BYTE 1                  ; DSC$B_CLASS

                     .ADDRESS MSG1            ; DSC$A_

                                              ; указатель

  MSG2_DSC:          .WORD MSG2_LEN           ; DSC$W_

                                              ; длина

                     .BYTE 14                 ; DSC$B_DTYPE

                     .BYTE 1                  ; DSC$B_CLASS

                     .ADDRESS MSG2            ; DSC$A_

                                              ; указатель

  RESULT_DSC:        .WORD MSG1_LEN + MSG2_LEN; DSC$W_

                                              ; длина

                     .BYTE 14                 ; DSC$B_DTYPE

                     .BYTE 1                  ; DSC$B_CLASS

                     .ADDRESS RESULT          ; DSC$A_

                                              ; указатель

                     .ENTRY  EXAM1, ^M<>      ; ввод указа-




                           - 36 -

                       00152-01 33 09-5


                                              ; теля

        PUSHAQ MSG2_DSC          ; поместить стек

        PUSHAQ  MSG1_DSC         ; дескрипторы в обратном

                                 ; порядке.

        РUSHAQ  RESULT_DSC       ;

        CALLS  $3.G^STR$CONCAT   ; об'единение строк

        PUSHAQ  RESULT_DSC       ; запись строки на дисплее.

  СALLS  $1, G^LIB$PUT_OUTPUT    ; печать строки.

        RET                      ; возвращение вызываемой

                                 ; процедуре.

        .END    EXAM1

       Результат работы программы следующий:

       Виктор Иванов написал эту книгу.



       1.9. STR$COPY_DX  -   копирование   исходной

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

            дескриптора в результирующую строку


       Процедура  STR$COPY_DX  копирует  исходную  строку   в

  результирующую строку. Обе  строки  передаются  посредством

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


       Формат:

       STR$COPY_DX строка 1, строка 2


       Точка входа JSB:

       STR$COPY_DX_R8







                           - 37 -

                       00152-01 33 09-5



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

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

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

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

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


       Аргументы:


       Строка 1

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

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

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

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

       Результирующая строка, в которую процедура STR$COPY_DX

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

  адресом дескриптора, задающего результирующую строку.

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

  поля.


       Строка 2

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

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

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

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

       Исходная   строка,   которую   процедура   STR$COPY_DX

  копирует  в  результирующую  строку.  Аргумент   строка   2

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

  Класс    дескриптора    исходной    строки    может    быть




                           - 38 -

                       00152-01 33 09-5


  неопределенным,    фиксированной    длины,    динамическим,

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

  изменяемым.


       Описание.

       Процедура  STR$COPY_DX  копирует  исходную  строку   в

  результирующую строку. Обе  строки  передаются  посредством

  дескриптора. Сигнализируются все состояния кроме  усечения;

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

  состояния (бит 0 очищен) в R0.

       Процедура   STR$COPY_DX   передает   исходную   строку

  посредством дескриптора. Дополнительно обеспечивается точка

  входа JSB с R0, являющимся  первым  аргументом  (дескриптор

  результирующей строки), и R1, являющимся вторым  аргументом

  (дескриптора исходной строки).

       В зависимости от класса результирующей  строки  выпол-

  няются действия, указанные в табл. 5.

                                                   Таблица 5

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

     Поле класса !             Действие

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

  DSC$K_CLASS_S, ! Копируется исходная строка. Если необхо-

  Z, SD, а, NCA  ! димо, область дополняется или усекается

                 ! справа

  DSC$K_CLASS_D  ! Если область, определенная дескриптором

                 ! результирующей строки достаточна для

                 ! размещения исходной строки, то копирует-




                           - 39 -

                       00152-01 33 09-5


                                         Продолжение табл. 5

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

     Поле класса !             Действие

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

                 ! ся исходная строка и  устанавливается

                 ! новая длина в дескрипторе результирующей

                 ! строки. Если определенной области недос-

                 ! таточно, то возвращаемся к предыдущему

                 ! распределению области и затем динамично

                 ! распределяем необходимую общую область.

                 ! копируется исходная строка и устанавли-

                 ! ваются новая длина и адрес в дескрипто-

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

  DSC$K_CLASS_VS ! Копируется исходная строка без дополне-

                 ! ния до предела SMG$W_MAXSTRLEN. Текущая

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

                 ! числом копируемых байтов


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

  SS$_NORMAL

       - процедура успешно завершена.  Все  символы  вводимой

         строки скопированы в результирующую строку;

  STR$_TRU

       - предупреждение   усечения   строки.   Результирующая

         строка  фиксированной   длины   не   содержит   всех

         копируемых символов исходной строки.







                           - 40 -

                       00152-01 33 09-5


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая  внутренняя  ошибка.   Не   выполняется

         внутренний  последовательный  контроль.  Это  обычно

         указывает  на  внутреннюю  ошибку  в  исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

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

         разрешенным вызовом процедур МОС ВП;

  STR$_INSVIRMEN

       - недостаточная    виртуальная    память.    Процедура

         STR$COPY_DX не  зарезервировала  массив  памяти  для

         динамической или временной строки.



       1.10. STR$COPY_R   -   копирование   исходной

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

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


       Процедура   STR$COPY_R   копирует   исходную   строку,

  передаваемую посредством ссылки в результирующую строку.


       Формат:

       STR$COPY_R строка 1, длина, строка 2

       Точка входа JSB:

       STR$COPY_R_R8








                           - 41 -

                       00152-01 33 09-5



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

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

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

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

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


       Аргументы:


       Строка 1

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

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

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

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

       Результирующая строка, в которую процедура  STR$COPY_R

  копирует  исходную  строку.  Аргумент  строка  1  -   адрес

  дескриптора, задающего результирующую строку.


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

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

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

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

       Длина исходной строки. Аргумент длина является адресом

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


       Строка 2

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

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





                           - 42 -

                       00152-01 33 09-5


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

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

       Исходная строка, которую процедура STR$COPY_R копирует

  в результирующую строку. Аргумент строка 2 - адрес исходной

  строки.


       Описание.

       Процедура STR$COPY_R копирует исходную строку, переда-

  ваемую посредством ссылки, в результирующую строку.  Сигна-

  лизируются   все   состояния   кроме   усечения;   усечение

  возвращается как значение предупреждающего состояния (бит 0

  очищен) в R0.

       Обеспечивается  точка  входа  JSB  с   регистром   R0,

  являющимся  первым  аргументом,  регистром  R1   -   вторым

  аргументом, и регистром  R2,  в  качестве  третьего.  Длина

  аргумента передается в битах с 15 по 0 регистра R1.

       В зависимости от класса результирующей  строки  выпол-

  няются действия, указанные в табл 6.

                                                   Таблица 6

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

     Поле класса  !         Действие

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

   DSC$K_CLASS_S,Z! Копируется исходная строка. Если необхо-

   ,SD, а, NCA    ! димо, область усекается или дополняется

                  ! справа

   DSC$K_CLASS_D  ! Если область результирующей строки,

                  ! определенная  дескриптором,  достаточна




                           - 43 -

                       00152-01 33 09-5


                                         Продолжение табл. 6

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

     Поле класса  !         Действие

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

                  ! Для содержания исходной строки, то  ис-

                  ! ходная строка копируется и устанавлива-

                  ! ется новая длина в дескрипторе результи-

                  ! рующей строки. Если определенной области

                  ! недостаточно, возвращаемся к предыдущему

                  ! распределению области и затем  динамично

                  ! распределяем необходимую общую область.

                  ! копируется исходная  строка и устанавли-

                  ! ваются новая длина и адрес в дескрипторе

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

   DSC$K_CLASS_VS ! копируется исходная строка без дополне-

                  ! ния до предела DSC$W_MAXSTRLEN. Текущая

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

                  ! числом копируемых байтов


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

  SS$_NORMAL

       - процедура успешно завершена. Все  символы  введенной

         строки скопированы в результирующую строку;

  STR$_TRU

       - предупреждение   усечения   строки.   Результирующая

         строка  фиксированной   длины   не   содержит   всех

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





                           - 44 -

                       00152-01 33 09-5


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая  внутренняя  ошибка.   Не   выполняется

         внутренний контроль последовательности,  это  обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

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

         разрешенным вызовом процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$COPY_R  не  зарезервировала  массив  памяти  для

         динамической или временной строки.



       1.11. STR$DIVIDE -  деление  двух  десятичных

             строк


       Процедура STR$DIVIDE делит две десятичные строки.


       Формат:

       STR$DIVIDE  знак A, порядок A, число A, знак B,

                   порядок B, число B, число-цифр,

                   указатель, знак C, порядок C,

                   число C.










                           - 45 -

                       00152-01 33 09-5



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

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

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

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

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


       Аргументы:


       Знак A

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

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

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

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

       Знак  первого  операнда.  Аргумент  знак  A   является

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

  операнда.


       Порядок A

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

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

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

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

       Экспонента  (степень  10-ти),  на  которую   число   A

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

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

  со знаком, содержащего порядок.








                           - 46 -

                       00152-01 33 09-5



       Число A

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

       Тип: числовая строка без знака

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

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

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

  адрес  дескриптора,  задающего  числовую   строку   первого

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

  знака.


       Знак B

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

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

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

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

       Знак  второго  операнда.  Аргумент  знак  B  -   адрес

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

  операнда. 0 рассматривается  как  положительный,  1  -  как

  отрицательный знак.


       Порядок B

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

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

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

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

       Экспонента (степень 10-ти), на которую нужно  умножить

  число  B  для  получения   абсолютного   значения   второго

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


                           - 47 -

                       00152-01 33 09-5


  со знаком, содержащего порядок.


       Число B

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

       Тип: числовая строка без знака

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

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

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

  адрес  дескриптора,  задающего  числовую   строку   второго

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

  знака.


       Число-цифр

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

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

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

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

       Число  цифр  справа  от  десятичной  точки.   Аргумент

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

  содержащего   число   всех   цифр.   Процедура   STR$DIVIDE

  использует это число при выполнении деления.


       Указатель

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

       Тип: выровненная битовая строка

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

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

       Указатель, показывающий округлен или усечен  результат

  процедурой STR$DIVIDE. 0 означает усечение, 1 - округление.



                           - 48 -

                       00152-01 33 09-5


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

  содержащей этот указатель.


       Знак C

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

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

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

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

       Знак  результата.  Аргумент  знак  C  -  адрес  целого

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

  рассматривается как положительный, 1 - отрицательный знак.


       Порядок C

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

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

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

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

       Экспонента (степень 10-ти), на которую умножается чис-

  ло  C  для  получения  абсолютного   значения   результата.

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

  содержащего порядок.


       Число C

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

       Тип: числовая строка без знака

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

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

       Результирующая числовая строка.  Аргумент  число  C  -

  адрес дескриптора, задающего  числовую  строку  результата.



                           - 49 -

                       00152-01 33 09-5


  эта строка является десятичным числом без знака.


       Описание.

       Процедура  STR$DIVIDE  делит  две  десятичные  строки.

  Делимое и делитель представляются  тремя  числами,  которые

  передаются программе STR$DIVIDE в виде аргументов:

       1) числовая строка;

       2)   степень   10-ти,   необходимая   для    получения

  абсолютного значения;

       3) знак десятичного числа.

       Результат также возвращается в виде трех аргументов.


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

  SS$_NORMAL

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

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка  фиксированной   длины   не   содержит   всех

         символов.


       Сигнализируемые значения состояния:

  LIB$_INVARG

       - неверный аргумент;

  STR$_DIVBY_ZER

       - деление на нуль;

  STR$_FATINTERR

       - неустранимая  внутренняя  ошибка.   Не   выполняется

         внутренний контроль последовательности,  это  обычно

         означает   внутреннюю   ошибку   в    исполнительной



                           - 50 -

                       00152-01 33 09-5


         библиотеке;

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

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

         разрешенным вызовом процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$DIVIDE  не  зарезервировала  массив  памяти  для

         динамической или временной строки;

  STR$_WRONUMARG

       - неверное число аргументов.

       Пример.

  100 !+

      ! в данном примере используется процедура STR$DIVIDE

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

      ! результата.

      !-

      ASIGN% = 1%

      AEXP% = 3%

      ADIGITS$ = '1'

      BSIGN% = 0%

      BEXP% = -4%

      BDIGITS$ = '2'

      CSIGN% = 0%

      CEXP% = 0%

      CDIGITS$ = '0'

      PRINT "A = "; ASIGN%; AEXP%; ADIGITS$




                           - 51 -

                       00152-01 33 09-5


      PRINT "B = "; BSIGN% BEXP%; BDIGITS$

      CALL STR$DIVIDE     (ASIGN%, AEXP%, ADIGITS&,

                          BSIGN%, BEXP%, BDIGITS&,

                          3%, 0%, CSIGN%, CEXP%, CDIGITS$)

      PRINT "C = "; CSIGN%, CEXP%, SDIGITS&

  1500 END

       Данная  программа  на  языке  программирования  БЕЙСИК

  складывает две десятичные строки A и  B,  значения  которых

  следующие:

       А = -1000 (ASIGN = 1, AEXP= 3, ADIGITS = '1')

       В = .0002 (BSIGN = 0, BEXP = -4, BDIGITS = '2')

       Результат работы программы следующий:

       А = 1  3  1

       В = 0  -4  2

       С = 1  -3  5000000000

       Величина с равна -5000000 (CSIGN=1, CEXP=-3,

   CDIGITS = 5000000000).



       1.12. STR$DUPL_CHAR - дублирование символа  N

             раз


       Процедура  STR$DUPL_CHAR  создает  строку,  содержащую

  N-копий  введенного  символа.  Если  результирующая  строка

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

  STR$DUMPL_CHAR размещает и инициализирует строку.









                           - 52 -

                       00152-01 33 09-5



       Формат:

       STR$DUMPL_CHAR результирующая строка [,число]

                      [,символ]


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

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

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

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

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


       Аргументы:


       Результирующая строка


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

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

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

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

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

  STR$DUPL_CHAR  записывает   N-копий   введенного   символа.

  Аргумент    результирующая    строка    является    адресом

  дескриптора, задающего результирующую строку.


       Число

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

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

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

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

       Количество  копий  символа;  аргумент  число  является




                           - 53 -

                       00152-01 33 09-5


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

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

  умолчанию устанавливается 1.


       Символ

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

       Тип: байт (без знака)

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

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

       Символ в коде КОИ-8, который  процедура  STR$DUPL_CHAR

  записывает N раз в результирующую строку.  Аргумент  символ

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

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

  умолчанию устанавливается пробел.


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

  SS$_NORMAL

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

  STR$_NEGSTRLEN

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

         отрицательное   значение;    используется    нулевое

         значение;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка  фиксированной   длины   не   содержит   всех

         символов.








                           - 54 -

                       00152-01 33 09-5



       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая  внутренняя  ошибка.   Не   выполняется

         внутренний контроль последовательности.  Это  обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

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

         разрешенным вызывом процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$DUPL_CHAR не зарезервировала массив  памяти  для

         динамической или временной строки;

  STR$_STRTOOLON

       - длина строки превышает 65,535 байт.

       Пример.

      10   !+

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

           ! STR$DUPL_CHAR для дублирования символа "A"

           ! четыре раза.

           !-

           EXTERNAL INTEGER FUNCTION STR$DURL_CHAR

           STATUS%=STR$DUPL_CHAR (X$,4%,'A' BY REF)

           PRINT X$

           END





                           - 55 -

                       00152-01 33 09-5


       Данная  программа  на  языке  программирования  БЕЙСИК

  устанавливает X$ эквивалентным 'AAAA'.



       1.13. STR$FIND_FIRST_IN_SET -  поиск  первого

             символа в ряду символов


       Процедура  STR$FIND_FIRST_IN_SET  анализирует   строку

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

  с каждым символом в заданном ряду  символов,  для  которого

  проводится    поиск.    Процедура     STR$FIND_FIRST_IN_SET

  возвращает  позицию  в  строке,  в  которой  найден  первый

  совпадающий  символ.  0  возвращается,   если   не   найден

  совпадающей символ.


       Формат:

       STR$FIND_FIRST_IN_SET исходная строка,

                             символьная последовательность


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

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

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

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

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

       Позиция в исходной строке,  в  которой  найден  первый

  совпадающий символ; 0, если совпадающий символ не найден.











                           - 56 -

                       00152-01 33 09-5



       Аргументы:


       Исходная строка

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

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

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

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

       Строка,   которую   процедура    STR$FIND_FIRST_IN_SET

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

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

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


       Символьная последовательность

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

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

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

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

       Последовательность   символов,    которую    процедура

  STR$FIND_FIRST_IN_SET ищет в  строке.  Аргумент  символьная

  последовательность является адресом  дескриптора  задающего

  последовательность символов.


       Описание.

       Процедура  STR$FIND_FIRST_IN_SET   сравнивает   каждый

  символ  в  строке  с  каждым  символом  в  указанном   ряду

  символов. Как только найдено первое  совпадение,  процедура

  STR$FIND_FIRST_IN_SET возвращает позицию в строке, где най-

  ден  совпадающий  символ.  Если  совпадение   не   найдено,




                           - 57 -

                       00152-01 33 09-5


  возвращается 0. 0 возвращается также в случае,  если  аргу-

  мент  исходная  строка  или  символьная  последовательность

  имеют нулевую длину.


       Сигнализируемые значения состояния:

  STR$ILLSTRCLA

       - неверный класс строки. Код класса, найденный в  поле

         дескриптора, не разрешен вызывом процедур МОС ВП.

       Пример.

      РROGRAM FIND_FIRST(INPUT,OUTPUT);

      (+)

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

      ( STR$FIND_FIRST_IN_SET для нахождения первого символа

      ( в исходной строке (STRING1), который совпадает с

      ( символом в указанном ряду символов (CHAR);

      (

      ( описание внешних функций;

      (-)

      FUNCTION STR$FIND_FIRST_IN_SET(STRING:

               VARYING [A] OF CHAR;SETOFCHARS:

               VARYING [B] OF CHAR) : INTEGER;

               EXTERN;

      (+)

      ( описание переменных, используемых в основной

      ( программе

      (-)

      VAR

           STRING1   : VARYING [256] OF CHAR;



                           - 58 -

                       00152-01 33 09-5


           CHARS     : VARYING [256] OF CHAR;

           RET_STATUS:INTEGER;

      (+)

      ( начало основной программы. Чтение исходной строки и

      ( указанного ряда символов. Вызов

      ( STR$FIND_FIRST_IN_SET для нахождения первого

      ( совпадения. Печать результата.

      (-)

      BEGIN

           WRITELN('ENTER THE STRING: ');

           READLN(STRING1);

           WRITELN('ENTER THE SET OF CHARACTERS: ');

           READLN(CHARS);

           RET_STATUS :=STR$FIND_FIRST_IN_SET(STRING1,CHARS);

           WRITELN(RET_STATUS);

      END

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

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

  STR$FIND_FIRST_IN_SET.  Если  при  запуске  этой  программы

  установить STRING равной ABCDEFGHIJK, а CHARS  равной  XYZA

  значение RET_STATUS будет равно 1.
















                           - 59 -

                       00152-01 33 09-5


       1.14. STR$FIND_FIRST_NOT_IN_SET    -    поиск

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

             в последовательности


       Процедура    STR$FIND_FIRST_NOT_IN_SET     анализирует

  строку, сравнивая каждый символ  с  символами  в  указанной

  последовательности символов. Строка анализируется символ за

  символом,         слева         направо.          Процедура

  STR$FIND_FIRST_NOT_IN_SET возвращает позицию первого симво-

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

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


       Формат:

       STR$FIND_FIRST_NOT_IN_SET исходная строка,

       Символьная последовательность


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

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

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

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

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

       Позиция  в  исходной   строке,   в   которой   найдено

  несовпадение. Возможные значения этой позиции  приведены  в

  табл. 7.













                           - 60 -

                       00152-01 33 09-5


                                                     Таблица 7

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

  Возвращаемое!                Состояние

     значение !

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

       0      ! Или все символы в исходной строке совпадают с

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

              ! ности, или  в  аргументе символьная последова-

              ! тельность нет символов

       1      ! Или первый несовпадающий символ в исходной

              ! строке найден в позиции 1, или в исходной

              ! строке нет символов

       N      ! Первый несовпадающий символ найден в позиции N

              ! в пределах исходной строки


       Аргументы:


       Исходная строка

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

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

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

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

       Строка,      которую       анализирует       процедура

  STR$FIND_FIRST_NOT_IN_SET.   Аргумент    исходная    строка

  является адресом дескриптора, задающего строку.










                           - 61 -

                       00152-01 33 09-5



       Символьная последовательность

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

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

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

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

       Последовательность   символов,    которую    процедура

  STR$FIND_FIRST_NOT_IN_SET сравнивает со строкой, разыскивая

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

  является адресом дескриптора, задающего эту  последователь-

  ность символов.


       Описание.

       Процедура    STR$FIND_FIRST_NOT_IN_SET     анализирует

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

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

  символов. Когда процедура STR$FIND_FIRST_NOT_IN_SET находит

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

  символов, она  прекращает  поиск  и  возвращает  позицию  в

  строке, где найден первый несовпадающий  символ.  Если  все

  символы в строке совпадают с некоторым символом в  последо-

  вательности символов, возвращается значение 0. Если  строка

  нулевой длины, возвращается значение  1,  т.к.  никакой  из

  элементов  в  последовательности  символов  (обычно  первый

  символ) не будет найден в строке. Если в ряду нет символов,

  возвращается значение 0, т.к. "ничего" может быть найдено.








                           - 62 -

                       00152-01 33 09-5


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

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

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

         процедур МОС ВП.

       Пример.

      РROGRAM NOT_IN_SET(INPUT,OUTPUT);

      (+)

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

      ( STR$FIND_FIRST_NOT_IN_SET для нахождения в исходной

      ( строке (STRING) позиции первого несовпадающего

      ( символа из последовательности символов (CHARS)

      (

      ( описание внешних функций

      (-)

      FUNCTION STR$FIND_FIRST_NOT_IN_SET (STRING :

           VARYING [A] OF CHAR,SETOFCHARS :

           VARYING [B] OF CHAR) : INTEGER ;

           EXTERN;

      (+)

      ( описание переменных, используемых основной

      ( программой

      (-)

      VAR

        STRING1      : VARYING [256] OF CHAR;

        CHARS        : VARYING [256] OF CHAR;

      RET_STATUS     : INTEGER;




                           - 63 -

                       00152-01 33 09-5


      (+)

      ( начало основной программы. Чтение исходной строки

      ( и последовательности символов. Вызов процедуры

      ( STR$FIND_FIRST_NOT_IN_SET. Печатать результата.

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

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

  STR$FIND_FIRST_NOT_IN_SET. Если запустить данную  программу

  и установить STRING1 равной FORTUNATE, а CHARS равным FORT,

  то значение RET_STATUS будет равно 5.



       1.15. STR$FIND_FIRST_SUBSTRING    -     поиск

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


       Процедура  STR$FIND_FIRST_SUBSTRING   находит   первую

  подстроку (в  заданном  списке  подстрок),  обнаруженную  в

  данной строке.


       Формат:

       STR$FIND_FIRST_SUBSTRING  исходная строка, индекс

                                 ,индекс-подстроки

                                 ,подстрока 1

                                 [,подстрока N]


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

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

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

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

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





                           - 64 -

                       00152-01 33 09-5


       Значения,           возвращаемые            процедурой

  STR$FIND_FIRST_SUBSTRING,  и  состояния,  в   которые   они

  транслируются, приведены в табл. 8.

                                                   Таблица 8

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

  Возвращаемое !      Состояние

    значение   !

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

       0       ! Исходная строка не содержит ни одной из

               ! определенных подстрок

       1       ! Процедура STR$FIND_FIRST_SUBSTRING нашла в

               ! строке по крайней мере одну из определенных

               ! подстрок


       Аргументы:


       Исходная строка

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

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

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

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

       Строка,            анализируемая            процедурой

  STR$FIND_FIRST_SUBSTRING. Аргумент исходная строка является

  адресом дескриптора, задающего строку.


       Индекс

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

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





                           - 65 -

                       00152-01 33 09-5


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

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

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

  которой процедура STR$FIND_FIRST_SUBSTRING  находит  совпа-

  дающую подстроку; 0, если не найдена совпадающая подстрока.

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

  содержащего эту позицию.


       Индекс-подстроки

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

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

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

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

       Порядковый номер совпавшей подстроки (1 для первой,  2

  для   второй   и    т.д),    или    0,    если    процедура

  STR$FIND_FIRST_SUBSTRING  не  нашла  подходящей  подстроки.

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

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


       Подстрока 1

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

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

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

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

       Первая заданная подстрока, которая  ищется  в  строке.

  Аргумент  подстрока   1   является   адресом   дескриптора,

  задающего первую подстроку.






                           - 66 -

                       00152-01 33 09-5



       Подстрока N

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

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

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

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

       N-ная заданная подстрока,  которая  ищется  в  строке.

  Аргумент  подстрока   N   является   адресом   дескриптора,

  задающего N-ную подстроку.


       Описание.

       Процедура  STR$FIND_FIRST_SUBSTRING   берет   вводимую

  строку и определенное число  подстрок,  для  которых  будет

  производиться  поиск.  Она   анализирует   эту   строку   и

  возвращает позицию подстроки, которая найдена самой  первой

  в  строке.  Нет  необходимости  определять  позицию  первой

  подстроки.

       В отличие  от  других  процедур  сравнения  и  поиска,

  процедура STR$FIND_FIRST_SUBSTRING не возвращает позицию  в

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

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

  найдено никакой  определенной  подстроки,  значение  индекс

  будет равным 0.

       Строки нулевой длины,  или  "нулевые"  аргументы  дают

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

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

  процедурой STR$FIND_FIRST_SUBSTRING подстрока всегда  будет

  позицией   нулевой   подстроки.   Все   другие    подстроки




                           - 67 -

                       00152-01 33 09-5


  интерпретируются как появившиеся  в  строке  после  нулевой

  подстроки.


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

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

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

         процедур МОС ВП;

  STR$_WRONUMARG

       - неправильное число аргументов. Необходимо указать по

         крайней мере одну подстроку.

       Пример.

   1  !+

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

      ! использование процедуры STR$FIND_FIRST_SUBSTRING.

      ! процедура STR$FIND_FIRST_SUBSTRING вызывается четыре

      ! раза (один раз для каждой строки) для нахождения

      ! первой подстроки, встречающейся в данной строке;

      !-

      OPTION TYPE=EXPLICIT

      DECLARE STRING MATCH_STRING

      DECLARE LONG   RET_STATUS,&

                     INDEX,&

                     I,&

                     SUB_STRING_NUM

      EXTERNAL LONG FUNCTION STR$FIND_FIRST_SUBSTRING

      FOR I=1 TO 4

        READ MATCH_STRING



                           - 68 -

                       00152-01 33 09-5


        RET_STATUS=STR$FIND_FIRST_SUBSTRING(MATCH_STRING,&

           INDEX,SUB_STRING_NUM,'ING','TH','CK')

        IF RET_STATUS=0% THEN

           PRINT MATCH_STRING;"не содержит никакой из

                               подстрок"

        ELSE

           SELECT SUB_STRING_NUM

                CASE 1

                     PRINT MATCH_STRING;"содержит ING в

                                         позиции";INDEX

                CASE 2

                     PRINT MATCH_STRING;"содержит TH в

                                        позиции";INDEX

                CASE 3

                     PRINT MATCH_STRING;"содержит CK в

                                         позиции";INDEX

           END SELECT

        END IF

      NEXT I

   2  DATA CHUCKLE,RAINING,FOURTH,THICK

   3  END

       Данная  программа  на  языке  программирования  БЕЙСИК

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

  STR$FIND_FIRST_SUBSTRING.










                           - 69 -

                       00152-01 33 09-5


       Результат выполнения программы следующий:

       $ BASIC FINDSUB

       $ LINK FINDSUB

       $ RUN FINDSUB

       СHUCKLE содержит CK в 4 позиции

       RAINING содержит ING в 5 позиции

       FOURTH содержит TH в 5 позиции

       ТHICK содержит TH в 1 позиции


       Строка "THICK" содержит обе  подстроки  "TH"  и  "CK".

  Однако, так как "TH" встречается в строке раньше чем  "CK",

  ее   порядковый   номер   будет   возвращен   в    аргумент

  индекс-подстроки, а позиция,  в  которой  встречается  "TH"

  будет возвращена в аргумент индекс.



       1.16. STR$FREE1_DX   -   освобождение   одной

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


       Процедура STR$FREE1_DX освобождает  одну  динамическую

  строку.

       Формат:

       STR$FREE1_DX  адрес-дескриптора

       Точка входа JSB:

       STR$FREE1_DX_R4


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

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

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





                           - 70 -

                       00152-01 33 09-5


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

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


       Аргументы:


       Адрес-дескриптора

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

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

       Доступ: модификация

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

       Дескриптор динамической  строки,  которую  освобождает

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

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

  класса (DSC$B_CLASS) проверяется.


       Описание.

       Процедура STR$FREE1_DX освобождает  описанную  область

  строки и модифицирует дескриптор, указывающий на отсутствие

  строки (DSC$A_POINTER=0, DSC$W_LENGTH=0).


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

  SS$_NORMAL

       - процедура успешно завершена.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности не выполняется. Это обычно  озна-

         чает внутреннюю ошибку в исполнительной библиотеке;





                           - 71 -

                       00152-01 33 09-5


  STR$_ILLSTRCLA

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

         поле класса дескриптора, не разрешен вызовом  проце-

         дур МОС ВП.



       1.17. STR$GET1_DX    -    размещение    одной

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


       Процедура STR$GET1_DX размещает  заданное  число  байт

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

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


       Формат:

       STR$GET1_DX  длина, строка


       Точка входа JSB:

       STR$GET1_DX_R4


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

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

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

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

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


       Аргументы:


       Длина

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

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

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




                           - 72 -

                       00152-01 33 09-5


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

       Количество   байт,   которые    размещает    процедура

  STR$GET1_DX. Аргумент длина,  является  адресом  слова  без

  знака, содержащего это число.


       Строка

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

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

       Доступ: изменение

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

       Дескриптор динамической строки,  в  которой  процедура

  STR$GET1_DX размещает  область.  Аргумент  строка  является

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

  строки.

       Поле класса (DSC$B_CLASS) проверяется.


       Описание.

       Процедура  STR$GET1_DX  размещает  определенное  число

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

  дескрипторе строки. Дескриптор должен быть динамическим.

       Если  дескриптор   уже   имеет   размещенную   в   нем

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

  длина, процедура STR$GET1_DX освобождает эту область  перед

  размещением новой области.

       Процедура STR$GET1_DX является методом,  рекомендуемым

  только для  размещения  динамического  дескриптора.  Просто

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

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




                           - 73 -

                       00152-01 33 09-5


  управления строкой.

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

  процедуру STR$FREE1_DX.


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

  SS$_NORMAL

       - процедура успешно завершена.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - найденный в  поле  класса  дескриптор,  не  разрешен

         вызывом процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$GET1_DX   не   разместит   массив   памяти   для

         динамической или временной строки.



       1.18. STR$LEFT  -  выделение   подстроки   из

             строки


       Процедура  STR$LEFT  копирует  подстроку  из  исходной

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







                           - 74 -

                       00152-01 33 09-5


       Формат:

       STR$LEFT результирующая строка, исходная строка,

       Конечная позиция

       Точка входа JSB:

       STR$LEFT_R8


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

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

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

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

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


       Аргументы:


       Результирующая строка

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

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

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

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

       Результирующая строка, в  которую  процедура  STR$LEFT

  копирует подстроку. Аргумент результирующая строка является

  адресом дескриптора, задающего результирующую строку.


       Исходная строка

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

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

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

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

       Исходная  строка,  из   которой   процедура   STR$LEFT




                           - 75 -

                       00152-01 33 09-5


  выделяет подстроку,  копируемую  в  результирующую  строку.

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

  задающего исходную строку.


       Конечная позиция

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

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

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

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

       Относительная позиция в  исходной  строке,  в  которой

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

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

  конечную позицию.

       Процедура STR$LEFT копирует  все  символы  в  исходной

  строке с позиции 1 до  позиции,  определенной  в  аргументе

  конечная позиция.


       Описание.

       Процедура  STR$LEFT  выделяет  подстроку  из  исходной

  строки и копирует эту подстроку  в  результирующую  строку,

  процедура STR$LEFT определяет подстроку посредством задания

  конечной позиции в исходной  строке.  Начальная  позиция  в

  исходной строке равна 1.  Исходная  строка  не  изменяется,

  если только она не является также результирующей строкой.

       Процедура  STR$LEFT   является   вариантом   процедуры

  STR$POS_EXTR.  Другими  процедурами,  которые  могут   быть

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

  являются STR$RIGHT и STR$LEN_EXTR.




                           - 76 -

                       00152-01 33 09-5


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

  SS$_NORMAL

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

  STR$_ILLSTRPOS

       - процедура успешно заверена, но аргумент ссылается на

         позицию символа вне  заданной  строки.  Используется

         значение, устанавливаемое по умолчанию;

  STR$_ILLSTRSPE

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

         слишком велика  для  заданной  строки.  Используется

         значение, установленное по умолчанию;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка  фиксированной   длины   не   содержит   всех

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


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса  найденный  в

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

         процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная виртуальная память. Процедура STR$LEFT



                           - 77 -

                       00152-01 33 09-5


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

         временной строки.

       Пример.

      РROGRAM LEFT (INPUT,OUTPUT);

      (+)

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

      ( использование процедуры STR$LEFT

      ( она читает исходную строку и конечную позицию

      ( подстроки, а возвращает подстроку содержащую

      ( все символы от начала (слева) исходной строки до

      ( последней введенной позиции.

      (-)

      (+)

      ( описание внешней процедуры STR$LEFT

      (-)

      PROCEDURE STR$LEFT (%DESCR DSTSTR:VARYING

           [A] OF CHAR;SRCSTR:

           VARYING [B] OF CHAR;ENDPOS:

           INTEGER);EXTERN;

      (+)

      ( описание переменных использующихся в этой программе.

      (-)

      VAR

           SRC_STR:VARYING [256] OF CHAR;

           DST_STR:VARYING [256] OF CHAR;

           END_POS:INTEGER;

      (+)




                           - 78 -

                       00152-01 33 09-5


      ( начало основной программы. Чтение исходной строки и

      ( конечной позиции. Вызов процедуры STR$LEFT. Печать

      ( результата.

      (-)

      BEGIN

           WRITELN('введите исходную строку:');

           READLN(SRC_STR);

           WRITELN('введите конечную позицию');

           WRITELN('подстроки:');

           READLN(END_POS);

           STR$LEFT(DST_STR,SRC_STR,END_POS);

           WRITELN;

           WRITELN('подстрока:',DST_STR);

      END

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

  демонстрирует использование процедуры STR$LEFT.

       Результат работы программы следующий:

       $ PASCAL LEFT

       $ LINK LEFT

       $ RUN LEFT

       Введите исходную строку: MAGIC CARPET

       Введите конечную позицию

       Подстроки: 9

       Подстрока: MAGIC CAR










                           - 79 -

                       00152-01 33 09-5


       1.19. STR$LEN_EXTR - выделение  подстроки  из

             строки


       Процедура STR$LEN_EXTR копирует подстроку из  исходной

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


       Формат:

       STR$LEN_EXTR  результирующая строка, исходная строка

                     начало, длина

       Точка входа JSB:

       STR$LEN_EXTR_R8


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

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

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

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

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


       Аргументы:


       Результирующая строка

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

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

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

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

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

  STR$LEN_EXTR копирует  подстроку.  Аргумент  результирующая

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

  щую строку.





                           - 80 -

                       00152-01 33 09-5


       Исходная строка

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

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

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

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

       Исходная строка,  из  которой  процедура  STR$LEN_EXTR

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

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

  дескриптора, задающего исходную строку.


       Начало

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

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

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

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

       Начальная  позиция  в  исходной  строке,   с   которой

  начинается подстрока,  копируемая  процедура  STR$LEN_EXTR.

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

  знаком, содержащего начальную позицию.


       Длина

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

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

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

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

       Число  символов   в   подстроке,   которую   процедура

  STR$LEN_EXTR копирует  в  результирующую  строку.  Аргумент

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




                           - 81 -

                       00152-01 33 09-5


  содержащим длину подстроки.


       Описание.

       Процедура STR$LEN_EXTR выделяет подстроку из  исходной

  строки и копирует эту подстроку в результирующую строку.

       Процедура STR$LIN_EXTR определяет подстроку  посредст-

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

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

  только она не является результирующей строкой.

       Если начальная позиция меньше 1, используется значение

  1. Если начальная позиция  больше  длины  исходной  строки,

  возвращается пустая строка.  Если  длина  меньше  1,  также

  возвращается пустая строка.

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

  для выделения и копирования подстроки, являются  STR$RIGHT,

  STR$LEFT и STR$POS_EXTR.


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

  SS$_NORMAL

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

  STR$_ILLSTRPOS

       - процедура   STR$LEN_EXTR   завершена   успешно,   но

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

         строки;  используется  значение,  установленное   по

         умолчанию;

  STR$_ILLSTRSPE

       - процедура STR$LEN_EXTR завершена успешно,  но  длина

         слишком велика  для  заданной  строки.  Используется




                           - 82 -

                       00152-01 33 09-5


         значение, установленное по умолчанию;

  STR$_NEGSTRLEN

       - процедура   STR$LEN_EXTR   завершена   успешно,   но

         аргумент  длина  содержит  отрицательное   значение.

         Используется значение 0;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка  фиксированной   длины   не   содержит   всех

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


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неразрешеный класс строки. Код класса,  найденный  в

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

         процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$LEN_EXTR  не   разместит   массив   памяти   для

         динамической или временной строки.

       Пример.

         СHARACTER*131    IN_STRING

         CHARACTER*1      FRONT_CHAR

         CHARACTER*1      TAIL_CHAR



                           - 83 -

                       00152-01 33 09-5


         INTEGER STR$LEN_EXTR,STR$REPLACE,STR$TRIM

         INTEGER FRONT_POSITION,TAIL_POSITION

   10    WRITE (6,800)

   800   FORMAT('BBECTи строку,131 символ или меньше:',$)

         READ (5,900,END=200) IN_STRING

   900   FORMAT (а)

         ISTATUS=STR$TRIM (IN_STRING,IN_STRING,LENGTH)

         DO 100 I=1,LENGTH/2

         FRONT_POSITION=I

         TAIL_POSITION=LENGTH+1-I

         ISTATUS=STR$LEN_EXTR(FRONT_CHAR,IN_STRING,

      а                       FRONT_POSITION,%REF(1))

         ISTATUS=STR$LEN_EXTR(TAIL_CHAR,IN_STRING,

      а                      TAIL_POSITION,%REF(1))

         ISTATUS=STR$REPLACE(IN_STRING,IN_STRING,

      а                      FRONT POSITION,FRONT POSITION,

                             TAIL_CHAR)

         ISTATUS=STR$REPLACE(IN_STRING,IN_STRING,

      а                      TAIL_POSITION,TAIL_POSITION,

      а                      FRONT_CHAR)

   100   CONTINUE

         WRITE (6,901) IN_STRING

   901   FORMAT(обратная строка:',/,1X A)

         GOTO 10

   200   CONTINUE

         END

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




                           - 84 -

                       00152-01 33 09-5


  принимает вводимую строку и выводит на печать эту строку  в

  обратном порядке.  Программа  продолжается  подсказкой  для

  ввода, до тех пор, пока не будет напечатано YC/Z.

       Результат работы программы следующий:

       $ FORTRAN   REVERSE

       $ LINK      REVERSE

       $ RUN       REVERSE

       Введите строку не более 131 символа:

       Африканские слоны часто имеют плоскую ступню.

       Обратная строка:

       .юнпутс юуксолп тюеми отсач ынолс еикснакирфА

       Введите строку не более 131 символа: YC/Z



       1.20. STR$MATCH_WILD      -      соответствие

             спецификации символа обобщения


       Процедура  STR$MATCH_WILD  сравнивает   строку-эталон,

  включающую  символы  обобщения,  с  заданной  строкой.  Она

  возвращает  значение  состояния  STR$_MATCH,  если   строки

  совпадают, и STR$_NOMATCH, если они не совпадают.


       Формат:

       STR$MATCH_WILD  строка 1, строка 2


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

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

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

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





                           - 85 -

                       00152-01 33 09-5


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


       Аргументы:


       Строка 1

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

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

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

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

       Строка,  которая  сравнивается  со  строкой  эталоном.

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

  строкой.


       Строка 2

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

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

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

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

       Строка, содержащая символы обобщения. Аргумент  строка

  2 является адресом  дескриптора,  задающего  строку-эталон.

  Символы обобщения транслируются, когда STR$MATCH_NAME  исс-

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

  строкой-эталоном.


       Описание.

       Процедура STR$MATCH_WILD выполняет трансляцию  символа

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

  падает ли  она  со  строкой-эталоном.  Строка-эталон  может

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




                           - 86 -

                       00152-01 33 09-5


  (*) и процент (%). Символ  звездочка  отображает  один  или

  более  символов.  Символ  процент  отображает  только  один

  символ.

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

  в строке-эталоне, могут использоваться только  как  символы

  обобщения. Если заданная строка содержит  символ  звездочки

  или символ процента,  возвращается  состояние  STR$NOMATCH,

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


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

  STR$_MATCH

       - заданная строка и строка-эталон совпадают;

  STR$_NOMATCH

       - заданная строка и строка-эталон не совпадают.


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

       - неверный класс строки. Код класса, найденый  в  поле

         класса дескриптора, не разрешен вызывом процедур МОС

         ВП.

       Пример.

  /*

   * в данном примере используется процедура STR$MATCH_WILD

   * (МОС ВП PL/1 V.2.3)

   *

   * данная программа читает строку-эталон и затем

   * сравнивает ее с вводимыми строками, пока не достигнет

   * конца введенного файла. Делая сравнение для каждой




                           - 87 -

                       00152-01 33 09-5


   * строки она печатает либо "совпадает со строкой

   * эталоном" или "не совпадает со строкой эталоном".

   */

  DECLARE STR$MATCH_WILD

          EXTERNAL ENTRY (CHARACTER (*) VARYING,

          CHARACTER (*) VARYING)

          RETURNE (BIT(1));

  EXAMPLE: PROCEDURE OPTIONS(MAIN);

          DCL PATTERN_STRING CHARACTER(80) VARYING;

          DCL TEST_STRING CHARACTER(80) VARYING;

          ON ENDFILE(SYSIN) STOP;

          PUT SKIP;

          GET LIST(PATTERN_STRING) OPTIONS(PROMPT('строка

          эталон:'));

          DO WHILE( '1'в );

          GET SKIP LIST(TEST_STRING) OPTIONS(PROMPT

          ('тестируемая строка:'));

          IF STR$MATCH_WILD(TEST_STRING,PATTERN_STRING)

          THEN PUT SKIP LIST('COBпAдAET со строкой

          эталоном')

          ELSE PUI SKIP LIST('HE  совпадает со строкой

          эталоном')

          END;

    END;

       Данная  программа  на  языке   программирования   PL/1

  демонстрирует использование процедуры STR$MATCH_WILD.






                           - 88 -

                       00152-01 33 09-5


       Результат работы программы следующий:

       $ PLI MATCH

       $ LINK MATCH

       $ RUN MATCH

       Строка эталон>'должна точно совпадать'

       Тестируемая строка>'пожелание этой работе?'

                          'должна точно совпадать.'

       Не совпадает со строкой эталоном.



       1.21. STR$MUL  -  умножение  двух  десятичных

             строк


       Процедура STR$MUL умножает две десятичные строки.


       Формат:

       STR$MUL    знак A, порядок A, число A,

                  знак B, порядок B, число B,

                  знак C, порядок C, число C


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

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

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

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

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


       Аргументы:


       Знак A

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





                           - 89 -

                       00152-01 33 09-5


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

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

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

       Знак  первого  операнда.  Аргумент  знак  A   является

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

  операнда. 0 рассматривается  как  положительный,  1  -  как

  отрицательный знак.


       Порядок A

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

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

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

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

       Экспонента (степень 10-ти), на которую умножается чис-

  ло A для получения абсолютного значения  первого  операнда.

  Аргумент порядок A является адресом целого  длинного  слова

  со знаком, содержащего эту экспоненту.


       Число A

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

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

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

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

       Числовая строка первого  операнда.  Аргумент  число  A

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

  первого операнда. Эта строка должна быть десятичным  числом

  без знака.






                           - 90 -

                       00152-01 33 09-5


       Знак B

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

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

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

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

       Знак  второго  операнда.  Аргумент  знак  B   является

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

  операнда. 0 рассматривается  как  положительный,  1  -  как

  отрицательный знак.


       Порядок B

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

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

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

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

       Экспонента (степень 10-ти), на которую умножается чис-

  ло B для получения абсолютного значения  второго  операнда.

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

  знаком, содержащего эту экспоненту.


       Число B

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

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

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

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

       Числовая строка второго  операнда.  Аргумент  число  B

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

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




                           - 91 -

                       00152-01 33 09-5


  знака.


       Знак C

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

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

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

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

       Знак результата.  Аргумент  знак  C  является  адресом

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

  результата. 0 рассматривается как положительный,  1  -  как

  отрицательный знак.


       Порядок C

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

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

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

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

       Экспонента (степень 10-ти), на которую умножается чис-

  ло C для получения абсолютного значения результат. Аргумент

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

  содержащего эту экспоненту.


       Число C

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

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

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

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

       Числовая строка результата. Аргумент число C  является

  адресом дескриптора, задающего числовую строку  результата.



                           - 92 -

                       00152-01 33 09-5


  эта строка должна быть десятичным числом без знака.


       Описание.

       Процедура STR$MUL умножает две десятичные строки. Каж-

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

  передаются процедуре STR$MUL в виде аргументов:

       1) числовая строка;

       2)   степень   10-ти,   необходимая   для    получения

  абсолютного значения;

       3) знак десятичного числа.

       Результат умножения возвращается  также  в  виде  трех

  аргументов.


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

  SS$_NORMAL

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

  STR$_TRU

       - предупреждение об усечении строки. Строка назначения

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


       Сигнализируемые значения состояния:

  LIB$_INVARG

       - неверный аргумент;

  STR$_FATINTERR

       - неустранимая  внутренняя  ошибка,   не   выполняется

         внутренний контроль последовательности.  Это  обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;





                           - 93 -

                       00152-01 33 09-5


  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса, найденный  в

         поле дескриптора, не разрешен вызовом  процедур  МОС

         ВП;

  STR$_INSVIRMEM

       - недостаточная   виртуальная   память.   STR$MUL   не

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

         временной строки;

  STR$_WRONUMARG

       - неправильное число аргументов.

       Пример.

  100 !+

      ! в данном примере процедура STR$MUL

      ! используется для умножения двух десятичных

      ! строк (A и B) и помещает результат

      ! в третью десятичную строку (C)

      ! (C)

      !-

      ASIGN% = 1%

      AEXP% = 3%

      ADIGITS$ = '1'

      BSIGN% = 0%

      BEXP% = -4%

      BDIGITS$ = '2'

      CSIGN% = 0%

      сехр% = 0%

      CDIGITS$ = '0'



                                  
                           - 94 -

                       00152-01 33 09-5


      PRINT "A = "; ASIGN%; AEXP%; ADIGITS$

      PRINT "B = "; BSIGN%; BEXP%;BDIGITS$

      CALL STR$MUL   (ASIGN%, AEXP%, ADIGITS$, &

                     BSIGN%, BEXP%, BDIGITS$, &

                     CSIGN%, CEXP%, CDIGITS$)

      PRINT "C = ";  CSIGN%; CEXR%; CDIGITS$

      999 END

       Данная  программа  на  языке  программирования  БЕЙСИК

  демонстрирует  использование  STR$MUL  для  умножения  двух

  десятичных строк, имеющих следующие значения:

       А=-1000 ( ASIGN = 1, AEXP =3,  ADIGITS = '1')

       В=.0002 ( BSIGN = 0, BEXP =-4, BDIGITS = '2')

       Результат работы программы следующий:

       А = 1  3 1

       В = 0 -4 2

       С = 1 -1 2

       Десятичное значение с равно -.2 (CSIGN = 1, CEXP = -1,

  CDIGITS = 2).



       1.22. STR$POSITION       -        возвращение

             относительной позиции подстроки


       Процедура  STR$POSITION  осуществляет  поиск   первого

  появления  подстроки  в  пределах  исходной  строки.   Если

  процедура STR$POSITION находит  подстроку,  она  возвращает

  относительную позицию подстроки. Если подстрока не найдена,

  процедура STR$POSITION возвращает 0.





                           - 95 -

                       00152-01 33 09-5


       Формат:

       STR$POSITION   исходная строка, подстрока [,начало]


       Точка входа JSB:

       STR$POSITION_R6


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

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

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

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

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

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

  Значение 0 возвращается,  если  процедура  STR$POSITION  не

  нашла подстроку.


       Аргументы:


       Исходная строка

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

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

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

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

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

  STR$POSITION  ищет  подстроку.  Аргумент  исходная   строка

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


       Подстрока

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

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





                           - 96 -

                       00152-01 33 09-5


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

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

       Подстрока,  которую   ищет   процедура   STR$POSITION.

  Аргумент является адресом дескриптора, задающего подстроку.


       Начало

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

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

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

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

       Позиция  в  исходной  строке,  с   которой   процедура

  STR$POSITION  начинает  поиск.  Аргумент  является  адресом

  целого длинного  слова  со  знаком,  содержащего  начальную

  позицию. Хотя этот  аргумент  необязателен,  он  требуется,

  если используется точка входа JSB.

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

  начинает  поиск  с  позиции  первого  символа  в  аргументе

  исходная строка.


       Описание.

       Процедура  STR$POSITION  возвращает  позицию   первого

  появления подстроки в исходной строке.  Возвращаемое  число

  является целым длинным словом без  знака.  Позиции  символа

  нумеруются 1,2,3, и  т.д.  0  означает,  что  подстрока  не

  найдена.

       Если  подстрока   имеет   нулевую   длину,   процедура

  STR$POSITION  возвращает  минимальное  значение   аргумента

  начало (длину исходной строки плюс 1).




                           - 97 -

                       00152-01 33 09-5


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

  имеет  не   нулевую   длину,   возвращается   значение   0,

  показывающее, что подстрока не найдена.


       Сигнализируемые значения состояния:

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса, найденный  в

         поле дескриптора, не разрешен вызовом  процедур  МОС

         ВП.

       Пример.

      РROGRAM POSITION (INPUT, OUTPUT);

      (+)

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

      ( STR$POSITION для определения первого появления

      ( подстроки (SUBSTRING) в пределах исходной строки

      ( (STRING) начиная с начальной позиции (START);

      (

      ( описание внешних функций;

      (-)

      FUNCTION STR$POSITION(SRCSTR :VARYING [A]

               OF CHAR; SUBSTR : VARING [B] OF CHAR;

               STARTPOS : INTEGER) : INTEGER ; EXTERN;

      (+)

      ( описание переменных, используемых в основной

      ( программе;

      (-)

      VAR

        STRING1      :VARYING [256] OF CHAR;



                           - 98 -

                       00152-01 33 09-5


        SUBSTRING    : VARYING [256] OF CHAR;

        START        : INTEGER;

        RETSTATUSN   : INTEGER;

      (+)

      ( начало основной программы. Чтение строки и

      ( подстроки. Установить START равной 1 для начала

      ( поиска подстроки с начала исходной строки. Вызов

      ( процедуры STR$POSITION и печать результата.

      (-)

      BEGIN

        WRITELN ('ENTER THE STRING: ')

        READLN(STRING1);

        WRITELN('ENTER THE SUBSTRING: ');

        READLN(SUBSTRING);

  START := 1;

  RETSTATUS :=STR$POSITION(STRING1, SUBSTRING, START);

        WRITELN(RETSTATUS);

      END

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

  демонстрирует использование  процедуры  STR$POSITION.  Если

  запустить эту программу и установить STRING1 равной KITTEN,

  а подстроку равной TEN, то возвращаемое значение RET_STATUS

  будет 4.












                           - 99 -

                       00152-01 33 09-5


       1.23. STR$POS_EXTR - выделение  подстроки  из

             строки


       Процедура STR$POS_EXTR копирует подстроку из  исходной

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


       Формат:

       STR$POS_EXTR  строка 1, строка 2, начало, конец


       Точка входа JSB:

       STR$POS_EXTR_R8


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

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

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

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

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


       Аргументы:


       Строка 1

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

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

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

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

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

  STR$POS_EXTR копирует подстроку. Аргумент строка 1 является

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








                           - 100 -

                       00152-01 33 09-5


       Строка 2

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

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

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

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

       Исходная строка,  из  которой  процедура  STR$POS_EXTR

  выделяет подстроку,  копируемую  в  результирующую  строку.

  Аргумент строка 2 является адресом  дескриптора,  задающего

  исходную строку.


       Начало

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

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

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

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

                 посредством значения для точки входа JSB.

       Позиция  в  исходной  строке,  с  которой   начинается

  подстрока,  копируемая  процедурой  STR$POS_EXTR.  Аргумент

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

  содержащего начальную позицию.


       Конец

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

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

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

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

                 посредством значения для точки входа JSB.

       Позиция в исходной  строке,  в  которой  заканчивается




                           - 101 -

                       00152-01 33 09-5


  подстрока,  копируемая  процедурой  STR$POS_EXTR.  Аргумент

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

  содержашего конечную позицию.


       Описание.

       Процедура STR$POS_EXTR выделяет подстроку из  исходной

  строки и копирует эту подстроку  в  результирующую  строку.

  STR$POS_EXTR  определяет  подстроку  заданием  начальной  и

  конечной  позиций  в  исходной  строке.   Исходная   строка

  неизменна, если только она не является также и результирую-

  щей строкой. Если  начальная  позиция  меньше,  чем  1,  то

  используется 1.

       Если начальная  позиция  больше,  чем  длина  исходной

  строки, возвращается пустая строка. Если  конечная  позиция

  больше, чем длина исходной строки,  то  используется  длина

  исходной строки.

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

  для выделения и копирования подстроки, являются STR$LEFT, и

  STR$RIGHT и STR$LEN_EXTR.

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

  SS$_NORMAL

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

  STR$_ILLSTRPOS

       - процедура успешно завершена, но  аргумент  ссылается

         на позицию символа вне заданной строки. Используется

         значение, устанавливаемое по умолчанию;

  STR$_ILLSTRSPE

       - процедура успешно завершена, но аргумент конец мень-



                           - 102 -

                       00152-01 33 09-5


         ше, чем аргумент начало. Используется величина, при-

         нятая по умолчанию;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

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

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


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутреняя ошибка.  Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLTRCLA

       - неразрешенный класс строки. Код класса, найденный  в

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

         процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$POS_EXTR  не   разместит   массив   памяти   для

         динамической или временной строки.

       Пример.

       0        1        2        3

       4        5        6        7

  1234567890123456789012345678901234567890

  1234567890123456789012345678901234567890

       FTTY    D   F     80    TTY

       С* инициализировать исходную строку и позицию;



                           - 103 -

                       00152-01 33 09-5


       С   MOVE '7 SW AVE ' SOURCE 8

       С   Z-ADD3   BEGPOS  90

       С   Z-ADD4  ENDPOS  90

       С POS_EXTR  EXTRN'STR$POS EXTR'

       С* выделить два символа строки, начиная с 3 позиции

       С   CALL POS EXTR

       С   PARMD  DEST  2

       С   PARMD  SOURCE

       С   PARM  BEGPOS  RL

       С   PARM  ENDPOS  RL

       С* распечатать на терминале выделенную строку

       С   DEST  DSPLYTTY

       С   SETON  LR

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

  выводит строку 'SW' на терминал.



       1.24. STR$PREFIX - добавление строки


       Процедура  STR$PREFIX  вставляет  исходную  строку   в

  начало результирующей строки. Результирующая строка  должна

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


       Формат:

       STR$PREFIX  строка 1, строка 2


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

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

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





                           - 104 -

                       00152-01 33 09-5


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

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


       Аргументы:


       Строка 1

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

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

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

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

       Результирующая строка (динамическая  или  переменная).

  Процедура STR$PREFIX копирует исходную строку в начало этой

  результирующей строки. Аргумент строка 1  является  адресом

  дескриптора, задающего результирующую строку.


       Строка 2

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

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

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

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

       Исходная строка, которую процедура STR$PREFIX копирует

  в начало результирующей строки. Аргумент строка 2  является

  адресом дескриптора, задающего исходную строку.


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

  SS$_NORMAL

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

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая




                           - 105 -

                       00152-01 33 09-5


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

         символов.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности не выполняется. Это обычно  озна-

         чает внутреннюю ошибку в исполнительной библиотеке;

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса, найденный  в

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

         процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$PREFIX не разместит массив для динамической  или

         временной строки.

       Пример.

      10 !+

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

         ! STR$PREFIX для дополнения результирующей

         ! строки [D$] исходной строкой ['ABCD']

         EXTERNAL INTERGER FUNCTION STR$PREFIX

         D$ = 'EFG'

         STATUS% = STR$PREFIX [D$, 'ABCD']

         PRINT D$

         END

       Данная  программа  на  языке  программирования  БЕЙСИК

  устанавливает значение D$ равным 'ABCDEFG' .



                           - 106 -

                       00152-01 33 09-5


       1.25. STR$RECIP    -    обратная     величина

             десятичной строки


       Процедура STR$RECIP вычисляет обратную величину первой

  десятичной строки с ограниченной точностью, заданной второй

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

  десятичной строки.


       Формат:

       STR$RECIP  знак A, порядок A, число A,

                  знак B, порядок B, число B,

                  знак C, порядок C, число C.


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

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

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

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

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


       Аргументы:


       Знак A

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

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

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

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

       Знак  первого  операнда.  Аргумент  знак  A   является

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

  первого операнда. 0 расматривается как положительный,  1  -

  как отрицательный знак.



                           - 107 -

                       00152-01 33 09-5


       Порядок A

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

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

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

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

       Экспонента (степень 10-ти), на которую умножается чис-

  ло A для получения абсолютного значения  первого  операнда.

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

  содержащего этот порядок.


       Число A

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

       Тип: строка без знака

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

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

       Числовая строка первого  операнда.  Аргумент  число  A

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

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

  знака.


       Знак B

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

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

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

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

       Знак  второго  операнда.  Аргумент  знак  B   является

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

  второго операнда. 0 рассматривается как положительный, 1  -




                           - 108 -

                       00152-01 33 09-5


  как отрицательный знак.


       Порядок B

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

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

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

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

       Экспонента (степень 10-ти), на которую умножается чис-

  ло B для получения абсолютного значения  второго  операнда.

  Аргумент порядок B является адресом целого  длинного  слова

  со знаком, содержащего этот порядок.


       Число B

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

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

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

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

       Числовая строка второго  операнда.  Аргумент  число  B

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

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


       Знак C

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

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

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

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

       Знак результата.  Аргумент  знак  C  является  адресом

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

  результата. 0 рассматривается как положительный,  1  -  как



                           - 109 -

                       00152-01 33 09-5


  отрицательный знак.


       Порядок C

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

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

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

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

       Экспонента (степень 10-ти), на которую умножается чис-

  ло C для получения абсолютного значения  результата.  Аргу-

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

  содержащегося этот порядок.


       Число C

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

       Тип: строка без знака

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

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

       Числовая строка результата. Аргумент число C  является

  адресом дескриптора, задающего числовую строку результата.


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

  SS$_NORMAL

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

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

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

         символов.







                           - 110 -

                       00152-01 33 09-5


       Сигнализируемые значения состояния:

  STR$_DIVBY_ZER

       - деление на нуль;

  LIB$_INVARG

       - неверный аргумент;

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса, найденный  в

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

         процедур МОС ВП;

  STR$_INSVIRMEN

       - недостаточная    виртуальная    память.    Процедура

         STR$RECIP   не   разместит   массив    памяти    для

         динамической или переменной строки;

  STR$_WRONUMARG

       - неверное число аргументов.

       Пример.

  100 !+

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

      ! STR$RECIP для нахождения обратного значения первой

      ! десятичной строки (A) с точностью, определенной

      ! второй десятичной строкой (B), и размещения

      ! результата в третьей десятичной строке (C).




                           - 111 -

                       00152-01 33 09-5


      !-

      ASIGN% = 1%

      AEXP% = 3%

      ADIGITS$ = '1'

      BSIGN% = 0%

      BEXP% = -4%

      BDIGITS$ = '2'

      CSIGN% = 0%

      CEXP% = 0%

      CDIGITS$ ='0'

      PRINT "A = "; ASIGN%; AEXP%; ADIGITS$

      PRINT "B = "; BSING%; BEXP%; BDIGITS$

      CALL STR$RECIP     (ASIGN%, AEXP%, ADICITS$, &

                           BSING%, BEXP%, BDIGITS$, &

                           CSIGN%, CEXP%, CDIGITS$)

      PRINT "C = "; CSIGN%; CEXR%; CDIGITC$

  999 END

       В данной программе на  языке  программирования  БЕЙСИК

  используется процедура STR$RECIP  для  нахождения  обратной

  величины  A  с  точностью,   определенной   в   строке   B.

  Используются следующие значения:

       А = -1000 (ASIGN=1,AEXP=3,ADIGITS=1)

       В = .0002 (BSIGN=0,BEXP=-4,BDIGITS=2)

       Результат работы программы следующий:

       А = 1 3 1

       В = 0-4 2

       С = 1-3 1




                           - 112 -

                       00152-01 33 09-5


       Десятичное значение с равно - .001



       1.26. STR$REPLACE - замена подстроки


       Процедура  STR$REPLACE  копирует  исходную  строку   в

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

  Заменяемая  подстрока  задается  ее  конечной  и  начальной

  позициями.


       Формат:

       STR$REPLACE строка 1, строка 2, начало, конец,

                   строка 3


       Точка входа JSB:

       STR$REPLACE_R8


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

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

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

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

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


       Аргументы:


       Строка 1

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

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

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

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

       Результирующая строка, в которую процедура STR$REPLACE




                           - 113 -

                       00152-01 33 09-5


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

  Аргумент строка 1 является адресом  дескриптора,  задающего

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


       Строка 2

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

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

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

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

       Исходная строка. Аргумент строка  2  является  адресом

  дескриптора, задающего исходную строку.


       Начало

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

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

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

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

  посредством значения для точки входа JSB.

       Позиция  B  исходной  строке,  с  которой   начинается

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

  целого длинного  слова  со  знаком,  содержащего  начальную

  позицию. Позиция является относительной к  началу  исходной

  строки.


       Конец

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

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

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





                           - 114 -

                       00152-01 33 09-5


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

  посредством значения для точки входа JSB.

       Позиция в  исходной  строке,  в  которой  оканчивается

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

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

  Позиция является относительной к началу исходной строки.


       Строка 3

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

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

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка замены, которой процедура STR$REPLACE  заменяет

  подстроку.

       Аргумент  строка  3  является   адресом   дескриптора,

  задающего строку замены.


       Описание.

       Процедура  STR$REPLACE  копирует  исходную  строку   в

  результирующую строку, заменяя часть строки другой строкой.

  Заменяемая  подстрока  задается  ее  конечной  и  начальной

  позициями.

       Если начальная позиция меньше 1, используется значение

  1. Если конечная  позиция  больше  длины  исходной  строки,

  используется длина исходной строки. Если начальная  позиция

  больше длины конечной позиции, совмещенная  часть  исходной

  строки будет скопирована дважды.






                           - 115 -

                       00152-01 33 09-5


       Возвращение значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  STR$_ILLSTRPOS

       - процедура успешно завершена, но  аргумент  ссылается

         на  позицию  вне   заданной   строки.   Используется

         значение, установленное по умолчанию;

  STR$_ILLSTRSPE

       - процедура  успешно  завершена,  но  аргумент   конец

         меньше начала, или длина слишком велика для заданной

         строки.  Используются  значения,  установленные   по

         умолчанию;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка фиксированной длины не будет  содержать  всех

         символов.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса, найденный  в

         поле  класса  дескриптора,   не   разрешен   вызовом

         процедур МОС ВП;





                           - 116 -

                       00152-01 33 09-5


  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$REPLACE   не   разместит   массив   памяти   для

         динамической или временной строки.

       Пример.

      !+

      ! в данном примере используется процедура

      ! STR$REPLACE для замены всех символов с начальной

      ! позиции (2%) до конечной позиции (3%) символами

      ! строки замены ('XYZ')

      EXTERNAL INTEGER FUNCTION STR$REPLACE

      D$ = 'ABCD'

      STATUS% = STR$REPLACE (D$, D$, 2%, 3%, 'XYZ')

      PRINT D$

      END

       Данная  программа  на  языке  программирования  БЕЙСИК

  устанавливает значение D$ равным 'AXYZD'.



       1.27. STR$RIGHT  -  выделение  подстроки   из

             строки


       Процедура STR$RIGHT  копирует  подстроку  из  исходной

  строки в результирующую строку.


       Формат:

       STR$RIGHT строка 1, строка 2, начало








                           - 117 -

                       00152-01 33 09-5


       Точка входа JSB:

       STR$RIGHT_R8


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:


       Строка 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка, в которую процедура  STR$RIGHT,

  копирует подстроку.  Аргумент  строка  1  является  адресом

  дескриптора, задающего результирующую строку.


       Строка 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная  строка,  из  которой  выделяется   подстрока

  копируемая  в  результирующую  строку.  Аргумент  строка  2

  является адресом дескриптора, задающего исходную строку.






                           - 118 -

                       00152-01 33 09-5


       Начало

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки  для  точки  входа  CALL,

  посредством значения для точки входа JSB.

       Относительная позиция в  исходной  строке.  С  которой

  начинается  подстрока,  копируемая  процедурой   STR$RIGHT.

  Аргумент начало является  адресом  целого  длинного  слова,

  содержащего начальную позицию.


       Описание.

       Процедура STR$RIGHT  выделяет  подстроку  из  исходной

  строки и копирует эту подстроку  в  результирующую  строку.

  STR$RIGHT определяет подстроку заданием начальной  позиции.

  Конечная позиция  равна  длине  исходной  строки.  Исходная

  строка неизменна, если  только  она  не  является  также  и

  результирующей строкой. Если начальная  позиция  меньше  2,

  копируется вся  исходная  строка.  Если  начальная  позиция

  больше исходной строки, копируется пустая строка. Процедура

  STR$RIGHT  является   вариантом   процедуры   STR$POS_EXTR.

  Другими  процедурами,  которые   можно   использовать   для

  выделения и  копирования  подстроки,  являются  STR$LEFT  и

  STR$LEN_EXTR.











                           - 119 -

                       00152-01 33 09-5


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  STR$_ILLSTRPOS

       - процедура успешно эавершена, но  аргумент  ссылается

         на  позицию  вне   заданной   строки.   Используется

         значение, установленное по умолчанию;

  STR$_TRU

       - предупреждение об  усечение  строки.  Результирующая

         строка фиксированной длины не будет  содержать  всех

         копируемых символов из исходной строки.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - недопустимый класс строки. Код класса,  найденный  в

         поле  класса  дескриптора,   не   разрешен   вызовом

         процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$RIGHT   не   разместит   массив    памяти    для

         динамической или временной строки.







                           - 120 -

                       00152-01 33 09-5


       Пример.

      РROGRAM RIGHT (INPUT,OUTPUT);

      (+)

      ( в данном примере процедура STR$RIGHT используется

      ( для выделения подстроки с заданной начальной

      ( позиции (START_POS) до конца (с правой стороны)

      ( исходной строки (SRC_STR) и записи результата в

      ( результирующую строку.

      (

      ( описание внешних процедур.

      (-)

      PROCEDURE STR$RIGHT(%DESCR DSTSTR:VARYING

                [A] OF CHAR;SRCSTR:VARYING [B] OF CHAR;

                STARTPOS:INTEGER);EXTERN;

      (+)

      ( описание переменных, используемых в основной

      ( программе

      (-)

      VAR

        SRC_STR      : VARYING [256] OF CHAR;

        DST_STR      : VARYING [256] OF CHAR;

        START_POS    : INTEGER;

      (+)

      ( начало основной программы. Чтение исходной строки и

      ( начальной позиции. Вызов процедуры STR$RIGHT и

      ( выделение подстроки. Печать результата.

      (-)




                           - 121 -

                       00152-01 33 09-5


      BEGIN

        WRITELN('введите исходную строку:');

        READLN(SRC_STR);

        WRITELN('введите начальную позицию');

        WRITELN('подсироку:');

        READLN(START_POS);

        STR$RIGHT(DST_STR,SRC_STR,START_POS);

        WRITELN;

        WRITELN('THE SUBSTRING IS:',DST_STR);

      END

       Результат работы программы следующий:

       $ RUN RIGHT

       Введите исходную строку: какое небо голубое

       Введите начальную позицию

       Подстроки:7

       Подстрока: небо голубое



       1.28. STR$ROUND  -  округление  или  усечение

             десятичной строки


       Процедура STR$ROUND округляет или  усекает  десятичную

  строку до определенного  числа  значащих  цифр  и  помещает

  результат в другую десятичную строку.













                           - 122 -

                       00152-01 33 09-5


       Формат:

       STR$ROUND    максимальное число, флаг, знак A,

                    порядок A, число A, знак C,

                    порядок C, число C.


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:


       Максимальное число

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Максимальное число десятичных цифр, которое  процедура

  STR$ROUND возвращает  в  результат.  Аргумент  максимальное

  число является адресом целого  длинного  слова  со  знаком,

  содержащего число десятичных цифр.


       Флаг

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Флаг. 0 показывает, что десятичная строка округляется,




                           - 123 -

                       00152-01 33 09-5


  1 - что усекается. Аргумент флаг является адресом  длинного

  слова без знака, содержащего флаг функции.


       Знак A

       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Знак  первого  операнда.  Аргумент  знак  A   является

  адресом длинного слова без знака, содержащего знак  первого

  операнда. Значение 0 показывает, что число положительное, 1

  - что отрицательное.


       Порядок A

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Экспонента (степень 10-ти), на которую умножается чис-

  ло A для получения абсолютного значения  первого  операнда.

  Аргумент порядок A является адресом целого  длинного  слова

  со знаком, содержащего этот порядок.


       Число A

       Использование в МОС ВП: символьная строка

       Тип: числовая строка без знака

       Доступ: только чтение

       Механизм: посредством дескриптора





                           - 124 -

                       00152-01 33 09-5


       Числовая строка первого  операнда.  Аргумент  число  A

  является адресом  дескриптора,  задающего  числовую  строку

  первого операнда. Строка должна быть десятичным числом  без

  знака.


       Знак C

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Знак результата.  Аргумент  знак  C  является  адресом

  целого  длинного  слова   со   знаком,   содержащего   знак

  результата. Значение 0 показывает, что число положительное,

  1 - что отрицательное.


       Порядок C

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое длинное слово (со знаком)

       Доступ: только запись

       Механизм: посредством ссылки

       Экспонента (степень 10-ти), на которую умножается чис-

  ло  C  для  получения  абсолютного   значения   результата.

  Аргумент порядок C является адресом целого  длинного  слова

  со знаком, содержащего этот порядок.


       Число C

       Использование в МОС ВП: символьная строка

       Тип: числовая строка без знака





                           - 125 -

                       00152-01 33 09-5


       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая  числовая  строка.  Аргумент  число   C

  является  адресом  дескриптора,  задающего   эту   числовую

  строку. Строка будет десятичным числом без знака.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка фиксированной длины не будет  содержать  всех

         символов.


       Сигнализизируемые значения состояния:

  LIB$_INVARG

       - неверный аргумент;

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса  найденный  в

         поле  класса  дескриптора,   не   разрешен   вызовом

         процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура




                           - 126 -

                       00152-01 33 09-5


         STR$ROUND   не   разместит   массив    памяти    для

         динамической или временной строки;

  STR$_WRONUMARG

       - неверное число аргументов.

       Пример.

   100 !+

       ! данный пример показывает различие между значениями,

       ! полученными при округлении и усечении десятичной

       ! строки.

       !-

       АSIGN% = 0%

       AEXP% = -4%

       АDIGITS$ = '9999998'

       СSIGN% = 0%

       CEXP% = 0%

       СDIGITS$ = '0'

       РRINT "A = ";ASIGN%; AEXP%; ADIGITS$

       !+

       ! вызов процедуры STR$ROUND для

       ! округления величины A;

       !-

       СALL STR$ROUND    (3%, 0%,ASIGN%, AEXP%,ADIGITS$, &

                         CSIGN%, CEXP%, CDIGITS$)

       РRINT "ROUNDED: C = "; CSIGN%; CEXP%; CDIGITS$

       !+

       ! вызов процедуры STR$ROUND для усечения

       ! величины A




                           - 127 -

                       00152-01 33 09-5


       !-

       СALL STR$ROUND    (3%, 1%, ASIGN%, AEXP%, ADIGITS$,

                         & CSIGN%,CEXP%, CDIGITS$)

       РRINT "TRUNCATED: C = "; CSIGN%; CEXP%; CDIGITS$

   999 END

       Данная  программа  на  языке  программирования  БЕЙСИК

  использует процедуру STR$ROUND сначала  для  округления,  A

  затем для усечения величины A до числа  десятичных  знаков,

  определенного аргументом максимальное количество.

       Используется следующая величина A:

       A=999.9998 (знак A=1, экспонента A=-4,

                   цифра A='999998')

       Результат работы программы следующий:

       A = 1 -4 9999998

       Округление: C = 0 1 100

       Усечение:   C = 0 0 999

       Т.е. Десятичное значение C равно 1000, при  округлении

  и C равно 999, при усечении.



       1.29. STR$TRANSLATE - трансляция  совпадающих

             символов


       Процедура  STR$TRANSLATE  последовательно   сравнивает

  каждый символ в исходной строке со всеми символами в строке

  совпадения.  Если  эти  символы  совпадают,  результирующий

  символ берется из строки преобразования. В  противном  слу-

  чае, процедура STR$TRANSLATE пересылает исходный  символ  в

  результирующую строку.



                           - 128 -

                       00152-01 33 09-5


       Формат:

       STR$TRANSLATE строка 1, строка 2, строка 3, строка 4


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:


       Строка 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая  строка.  Аргумент  строка  1  является

  адресом дескриптора, задающего результирующую строку.


       Строка 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная строка. Аргумент строка  2  является  адресом

  дескриптора, задающего исходную строку.










                           - 129 -

                       00152-01 33 09-5


       Строка 3

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка  преобразования.  Аргумент  строка  3  является

  адресом дескриптора, задающего строку преобразования.


       Строка 4

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Строка совпадения. Аргумент строка 4 является  адресом

  дескриптора, задающего строку совпадения.


       Описание.

       Процедура  STR$TRANSLATE  последовательно   сравнивает

  каждый символ из  исходной  строки  со  всеми  символами  в

  строке  совпадения.  Если  исходный  символ   совпадает   с

  каким-нибудь символом в  строке  совпадения,  то  процедура

  STR$TRANSLATE помещает символ из  строки  преобразования  в

  результирующую строку.

       Символ, взятый из строки преобразования, имеет  ту  же

  относительную позицию в строке, что имел совпавший символ в

  строке  совпадения.  Если  символ  встречается   в   строке

  совпадения несколько  раз,  то  для  выделения  символа  из

  строки преобразования используется символ, появившийся пер-




                           - 130 -

                       00152-01 33 09-5


  вым в строке совпадения. Если строка преобразования  короче

  строки совпадения, и позиция  совпадающего  символа  больше

  длины строки преобразования,  результирующий  символ  будет

  пробел.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка фиксированной длины не будет  содержать  всех

         символов.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса, найденный  в

         поле  класса  дескриптора,   не   разрешен   вызовом

         процедур МОС ВП;

  STR$_INSVIRMEN

       - недостаточная виртуальная память.  STR$TRANSLATE  не

         разместит  массив  памяти   для   динамической   или

         временной строки.






                           - 131 -

                       00152-01 33 09-5


       Пример.

  10    !+

        ! в данном примере используется процедура

        ! STR$TRANSLATE для преобразования всех символов

        ! исходной строки из символов верхнего регистра в

        ! символы нижнего регистра

        !-

        EXTERNAL INTEGER FUNSTION STR$TRANSLATE(STRING,

        STRING, STRING, STRING)

        TO$= '/ABCDEFIJKLMNOPGRSTUVWXYZ/'

        FROM$= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

        X% = STR$TRANSLATE(OUT$, 'TEST',TO$,FROM$)

        PRINT 'STATUS = ';X%

        PRINT 'RESULTING STRING = ';OUT$

  32767 END

       Данная  программа  на  языке  программирования  БЕЙСИК

  преобразует символы верхнего регистра в символы нижнего.

       Результат работы программы следующий:

       $RUN TRANSLATE

       STATUS=1

       Результирующая CTPOKA=TEST

       Более целесообразным, хотя и  более  сложным  является

  использование  процедуры  STR$TRANSLATE   для   кодирования

  данных  с  помощью  преобразования  символов  в  непонятные

  комбинации чисел и алфавитных символов.








                           - 132 -

                       00152-01 33 09-5


       1.30. STR$TRIM   -   упорядочение    конечных

             пробелов и табуляций


       Процедура STR$TRIM копирует исходную строку в  резуль-

  тирующую  строку  и  удаляет  конечные  пробелы  и  символы

  табуляции.


       Формат:

       STR$TRIM строка 1, строка 2, длина


       Код возврата:

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы:


       Строка 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка,  в  которую  STR$TRIM  копирует

  исходную упорядоченную строку. Аргумент строка  1  является

  адресом дескриптора, задающего результирующую строку.


       Строка 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка




                           - 133 -

                       00152-01 33 09-5


       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная  строка,  которую  STR$TRIM  упорядочивает  и

  затем копирует в результирующую строку. Аргумент  строка  2

  является адресом дескриптора, задающего исходную строку.


       Длина

       Использование в МОС ВП: слово без знака

       Тип: слово (без знака)

       Доступ: только запись

       Механизм: посредством ссылки

       Число байт, записываемых процедурой STR$TRIM в резуль-

  тирующую строку, не считая дополнения  пробелами  в  случае

  строки фиксированной длины. Аргумент длина является адресом

  слова  без  знака,  в  которое  STR$TRIM  записывает  длину

  выводимой  строки.  Если  введенная  строка  усекается   до

  размера,  определенного  дескриптором  строка  1,  аргумент

  длина устанавливается в этот размер.  Т.е.  аргумент  длина

  может быть всегда  использован  вызывающей  программой  для

  доступа к подстроке строка 1.


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка фиксированной длины не будет  содержать  всех

         символов.




                           - 134 -

                       00152-01 33 09-5


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательнности  не  выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса, найденный  в

         поле  класса  дескриптора,   не   разрешен   вызовом

         процедур МОС ВП;

  STR$_INSVIRMEM

       - недостаточная  виртуальная   память.   STR$TRIM   не

         разместит  массив  памяти   для   динамической   или

         временной строки.



       1.31. STR$UPCASE - преобразование всей строки

             в символы верхнего регистра


       Процедура STR$UPCASE  преобразует  исходную  строку  в

  строку  с  символами   верхнего   регистра   и   записывает

  преобразованную  строку  в   результирующую   строку.   Для

  сравнения символов без учета регистров, необходимо  сначала

  использовать процедуру STR$UPCASE для преобразования  обоих

  символов в символы верхнего регистра. Процедура  STR$UPCASE

  преобразует все символы в последовательности символов.









                           - 135 -

                       00152-01 33 09-5


       Формат

       STR$UPCASE строка 1, строка 2


       Код возврата

       Использование в МОС ВП: значение состояния

       Тип: длинное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения


       Аргументы


       Строка 1

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только запись

       Механизм: посредством дескриптора

       Результирующая строка, в которую процедура  STR$UPCASE

  записывает  строку,  преобразованную  в  символы   верхнего

  регистра. Аргумент строка 1 является  адресом  дескриптора,

  задающего результирующую строку.


       Строка 2

       Использование в МОС ВП: символьная строка

       Тип: символьная строка

       Доступ: только чтение

       Механизм: посредством дескриптора

       Исходная   строка,   которую   процедура    STR$UPCASE

  преобразует в символы верхнего регистра. Аргумент строка  2

  является адресом дескриптора задающего исходную строку.




                           - 136 -

                       00152-01 33 09-5


       Возвращаемые значения состояния:

  SS$_NORMAL

       - процедура успешно завершена;

  STR$_TRU

       - предупреждение об  усечении  строки.  Результирующая

         строка фиксированной длины не будет  содержать  всех

         символов.


       Сигнализируемые значения состояния:

  STR$_FATINTERR

       - неустранимая внутренняя ошибка. Внутренний  контроль

         последовательности  не   выполняется.   Это   обычно

         означает   внутреннюю   ошибку   в    исполнительной

         библиотеке;

  STR$_ILLSTRCLA

       - неразрешенный класс строки. Код класса, найденного в

         поле дескриптора, не разрешен вызовом  процедур  МОС

         ВП;

  STR$_INSVIRMEM

       - недостаточная    виртуальная    память.    Процедура

         STR$UPCASE   не   разместит   массив   памяти    для

         динамической или временной строки.

       Пример.

  30  !+

      ! в данном примере используется процедура STR$UPCASE

      ! для изменения всех символов в исходной строке

      ! (SRC$) на символы верхнего регистра и записи

      ! результата в результирующую строку (DST$).



                           - 137 -

                       00152-01 33 09-5


      !-

      SRC$ = '/ABCD/'

      PRINT "SRC$ =";SRC$

      CALL STR$UPCASE (DST$, STR$)

      PRINT "DST$ =";DST$

      END

       Результат работы программы следующий:

       SCR$ = /ABCD/

       DST$ = ABCD








































                           - 138 -

                       00152-01 33 09-5





                 Перечень ссылочных документов




       1. Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки.  Программы  исполнительной  библиотеки.

  Руководство программиста. 00152-01 33 09-2.














































                           - 138К -

                    2б.00152-01 33 09-5





                 Перечень ссылочных документов




       1. Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки.  Программы  исполнительной  библиотеки.

  Руководство программиста. 2б.00152-01 33 09-2.










































   
                       - 139K -  
  
                    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
  

                  
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!