


 
 
 
      Министерство приборостроения, средств автоматизации
 
                      и систем управления
 
 
 
 
 
 
 
 
 
                  Операционная система МОС ВП
 
          Подсистема редактирования и форматирования
 
                       ОБРАБОТКА ТЕКСТОВ
 
                     Руководство оператора
 
 
 
                       Лист утверждения
 
                    2б.00152-01 34 04-1-ЛУ
 
                           Листов 2
 
 
                                  Руководитель темы,
 
                                  Зам. директора ИНЭУМ
 
                                  _______________ Хрущев С.Н.
 
                                  "___"__________ 1987 г.
 
                     Представители предприятия-разработчика:
 
                                  Зав. отделом ВСКТБ
 
                                  _____________ Нахмансон В.С
 
                                  "___"________ 1987 г.
 
                                  Зав. сектором ВСКТБ
 
                                  _____________ Жуков А.Н.
 
                                  "___"________ 1987 г.
 
 
                             1987
 
      Перв. примен.                                  Литера O
      2б.00152-01
 
 


                            - 2 -
 
                   2б.00152-01 34 04-1-ЛУ
 
 
 
 
 
 
 
 
 
                       Представители ИНЭУМ:
 
 
                               Ответственный исполнитель темы
 
                               Зав. отделением
 
                               -------------- Остапенко Г.П.
 
                               "---"--------- 1987 г.
 
                                Нормоконтролер
 
                                --------------
 
                                "---"--------- 1987 г.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 










       Утвержден

       2б.00152-01 34 04-1-ЛУ














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

           Подсистема редактирования и форматирования 

                        ОБРАБОТКА ТЕКСТОВ 

                      Руководство оператора 

                      2б.00152-01 34 04-1


                          Листов 299/3К










1K
10K
297K








                              1987

         Перв. примен.                        Литера O
         2б.00152-01

 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                      Операционная система МОС ВП
 
              Подсистема редактирования и форматирования
 
                           ОБРАБОТКА ТЕКСТОВ
 
                         Руководство оператора
 
                           00152-01 34 04-1
 
 
                              Листов 296
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                 1987
 
 
 
  

                                - 2 -
 
                          00152-01 34 04-1
 
 
 
 
 
 
                              АННОТАЦИЯ
 
 
 
 
 
           В документе приведено описание обслуживающей программы
 
      (утилиты) для обработки текста в операционной  системе  МОС
 
      ВП (в дальнейшем МОС ВП). Документ предназначен для опытных
 
      Oператоров и программистов, знающих языки  программирования
 
      и основные концепции  операционной  системы  с  виртуальной
    
      памятью для эвм СМ 1700.
 
           Документ состоит из двух частей.
 
           Первая часть содержит назначение и условия  выполнения
 
      утилиты, описание типов  данных,  лексических  элементов  и
 
      встроенных процедур языка TPU.
 
           Во второй части приведены порядок выполнения программы
  
      и сообщения оператору.
 
 
 
 
 
 
 
 
 
 
                                        
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                                - 3 -
 
                          00152-01 34 04-1
 
 
 
 
 
 
                              СОДЕРЖАНИЕ
 
 
 
 
 
      1.  Назначение и условия выполнения программы           11
 
      1.1.  Общие сведения                                    11
 
      1.1.1.  Интерфейс расширенного редактора EVE            12
 
      1.1.2.  Интерфейс малой клавиатуры EDT                  13
 
      1.1.3.  Специальные возможности                         13
 
      1.2.  Язык TPU                                          14
 
      1.2.1.  Типы данных                                     15
 
      1.2.2.  Операторы                                       16
 
      1.2.3.  Встроенные процедуры                            17
 
      1.2.4.  Пользовательские процедуры                      18
 
      1.3.  Технические средства                              19
 
 
 
      2.  Команды оператора                                   20
 
      2.1.  Команда EDIT/TPU                                  20
 
      2.1.1.  Квалификаторы команды EDIT/TPU                  21
 
      2.1.2.  Файлы инициализации                             22
 
      2.2.  Завершение работы с утилитой                      24
 
      2.3.  Дальнейшие сведения об утилите                    24
 
 
 
      3.  Типы данных TPU                                     25
 
      3.1.  UNSPECIFIED                                       26
 
      3.2.  INTEGER                                           27
 
      3.3.  STRING                                            27
 
      3.4.  BUFFER                                            29
 
      3.5.  WINDOW                                            30


                                - 4 -
 
                          00152-01 34 04-1
 
 
 
      3.5.1.  Размеры окна                                    31
 
      3.5.2.  Создание окна                                   31
 
      3.5.3.  Характеристики положения окна                   32
 
      3.5.4.  Отображение окна                                33
 
      3.5.5.  Удаление окна                                   34
 
      3.5.6.  Диспетчер экрана                                35
 
      3.5.7.  Получение информации об окнах                   36
 
      3.6.  MARKER                                            37
 
      3.7.  RANGE                                             38
 
      3.8.  PATTERN                                           39
 
      3.8.1.  Шаблонные встроенные процедуры                  41
 
      3.8.2.  Шаблонные операторы                             42
 
      3.8.2.1.  Оператор дизьюнкции                           42
 
      3.8.2.2.  Оператор конкатенации                         43
 
      3.8.2.3.  Оператор присваивания части шаблона           43
 
      3.8.3.  Компиляция и выполнение шаблонов                44
 
      3.8.4.  Режимы поиска по шаблону                        45
 
      3.8.4.1.  Прямой поиск                                  46
 
      3.8.4.2.  Последовательный поиск                        46
 
      3.8.5.  Шаблонные переменные                            47
 
      3.9.  PROGRAM                                           49
 
      3.10. PROCESS                                           49
 
      3.11. LEARN                                             51
 
 
 
      4.  Лексические элементы TPU                            51
 
      4.1.  Набор символов                                    52
 
      4.1.1.  Ввод управляющих символов                       53
 
      4.1.2.  Символы языка TPU                               53
 
      4.2.  Идентификаторы                                    55
 


                                - 5 -
 
                          00152-01 34 04-1
 
 
      4.3.  Переменные                                        55
 
      4.4.  Константы                                         57
 
      4.5.  Операторы                                         57
 
      4.6.  Выражения                                         60
 
      4.6.1.  Арифметические выражения                        61
 
      4.6.2.  Выражения отношений                             62
 
      4.6.3.  Булевы выражения                                62
 
      4.6.4.  Шаблонные выражения                             63
 
      4.7.  Зарезервированные слова                           63
 
      4.8.  Операторы языка TPU                               63
 
      4.8.1.  Оператор процедуры                              65
 
      4.8.1.1.  Имена процедур                                66
 
      4.8.1.2.  Параметры процедуры                           66
 
      4.8.1.3.  Функциональные процедуры                      68
 
      4.8.1.4.  Рекурсивные процедуры                         70
 
      4.8.1.5.  Локальные переменные                          70
 
      4.8.1.6.  Обработка ошибок                              71
 
      4.8.2.  Оператор присваивания                           71
 
      4.8.3.  Оператор цикла                                  72
 
      4.8.4.  Оператор условия                                73
 
      4.8.5.  Оператор выбора                                 75
 
      4.8.6.  Операторы обработки ошибок                      77
 
      4.8.7.  Оператор ABORT                                  79
 
      4.8.8.  Оператор BREAK                                  80
 
      4.8.9.  Оператор LOCAL                                  81
 
      4.8.10. Оператор RETURN                                 81
 
      4.9.  Ключевые слова                                    83
 
      4.10. Глобальные переменные утилиты                     85
 
 
 
      5.  Встроенные процедуры языка TPU                      86


                                - 6 -
 
                          00152-01 34 04-1
 
 
 
      5.1.  Процедура ADJUST_WINDOW                           86
 
      5.2.  Процедура ANCHOR                                  89
 
      5.3.  Процедура ANY                                     91
 
      5.4.  Процедура APPEND_LINE                             93
 
      5.5.  Процедура ARB                                     94
 
      5.6.  Процедура ASCII                                   96
 
      5.7.  Процедура ATTACH                                  97
 
      5.8.  Процедура BEGINNING_OF                            98
 
      5.9.  Процедура CALL_USER                               100
 
      5.10. Процедура CHANGE_CASE                             105
 
      5.11. Процедура COMPILE                                 107
 
      5.12. Процедура COPY_TEXT                               110
 
      5.13. Процедура CREATE_BUFFER                           112
 
      5.14. Процедура CREATE_PROCESS                          115
 
      5.15. Процедура CREATE_RANGE                            117
 
      5.16. Процедура CREATE_WINDOW                           119
 
      5.17. Процедура CURRENT_BUFFER                          122
 
      5.18. Процедура CURRENT_CHARACTER                       123
 
      5.19. Процедура CURRENT_COLUMN                          125
 
      5.20. Процедура CURRENT_DIRECTION                       127
 
      5.21. Процедура CURRENT_LINE                            128
 
      5.22. Процедура CURRENT_OFFSET                          130
 
      5.23. Процедура CURRENT_ROW                             131
 
      5.24. Процедура CURRENT_WINDOW                          133
 
      5.25. Процедура CURSOR_HORIZONTAL                       134
 
      5.26. Процедура CURSOR_VERTICAL                         136
 
      5.27. Процедура DEFINE_KEY                              138
 
      5.28. Процедура DELETE                                  142
 
      5.29. Процедура EDIT                                    145
 


                                - 7 -
 
                          00152-01 34 04-1
 
 
      5.30. Процедура END_OF                                  148
 
      5.31. Процедура ERASE                                   149
 
      5.32. Процедура ERASE_CHARACTER                         150
 
      5.33. Процедура ERASE_LINE                              152
 
      5.34. Процедура EXECUTE                                 153
 
      5.35. Процедура EXIT                                    156
 
      5.36. Процедура EXPAND_NAME                             157
 
      5.37. Процедура FAO                                     159
 
      5.38. Процедура FILE_PARSE                              162
 
      5.39. Процедура FILE_SEARCH                             165
 
      5.40. Процедура FILL                                    167
 
      5.41. Процедура GET_INFO                                169
 
      5.42. Процедура HELP_TEXT                               182
 
      5.43. Процедура INDEX                                   184
 
      5.44. Процедура INT                                     185
 
      5.45. Процедура JOURNAL_CLOSE                           187
 
      5.46. Процедура JOURNAL_OPEN                            188
 
      5.47. Процедура кеY_NAME                                190
 
      5.48. Процедура LAST_KEY                                192
 
      5.49. Процедуры LEARN_BEGIN и LEARN_END                 193
 
      5.50. Процедура LENGTH                                  195
 
      5.51. Процедура LINE_BEGIN                              197
 
      5.52. Процедура LINE_END                                198
 
      5.53. Процедура LOOKUP_KEY                              199
 
      5.54. Процедура MAP                                     201
 
      5.55. Процедура MARK                                    203
 
      5.56. Процедура MATCH                                   205
 
      5.57. Процедура MESSAGE                                 206
 
      5.58. Процедура MOVE_HORIZONTAL                         207
 
      5.59. Процедура MOVE_TEXT                               209


                                - 8 -
 
                          00152-01 34 04-1
 
 
 
      5.60. Процедура MOVE_VERTICAL                           211
 
      5.61. Процедура NOTANY                                  213
 
      5.62. Процедура POSITION                                214
 
      5.63. Процедура QUIT                                    216
 
      5.64. Процедура READ_CHAR                               218
 
      5.65. Процедура READ_FILE                               219
 
      5.66. Процедура READ_KEY                                220
 
      5.67. Процедура READ_LINE                               221
 
      5.68. Процедура REFRESH                                 225
 
      5.69. Процедура REMAIN                                  226
 
      5.70. Процедура SAVE                                    227
 
      5.71. Процедура SCAN                                    229
 
      5.72. Процедура SCANL                                   231
 
      5.73. Процедура SCROLL                                  232
 
      5.74. Процедура SEARCH                                  234
 
      5.75. Процедура SELECT                                  237
 
      5.76. Процедура SELECT_RANGE                            239
 
      5.77. Процедура SEND                                    241
 
      5.78. Процедура SEND_EOF                                243
 
      5.79. Процедура SET                                     244
 
      5.79.1. Процедура SET (AUTO_REPEAT,...)                 246
 
      5.79.2. Процедура SET (BELL,...)                        247
 
      5.79.3. Процедура SET (DEBUG,...)                       249
 
      5.79.4. Процедура SET (EOB_TEXT,...)                    250
 
      5.79.5. Процедура SET (FACILITY_NAME,...)               250
 
      5.79.6. Процедура SET (FORWARD,...)                     251
 
      5.79.7. Процедура SET (INFORMATIONAL,...)               252
 
      5.79.8. Процедура SET (INSERT,...)                      252
 
      5.79.9. Процедура SET (JOURNALING,...)                  253
 


                                - 9 -
 
                          00152-01 34 04-1
 
 
      5.79.10.Процедура SET (MARGINS,...)                     254
 
      5.79.11.Процедура SET (MAX_LINES,...)                   255
 
      5.79.12.Процедура SET (MESSAGE_FLAGS,...)               256
 
      5.79.13.Процедура SET (NO_WRITE,...)                    258
 
      5.79.14.Процедура SET (OUTPUT_FILE,...)                 259
 
      5.79.15.Процедура SET (OVERSTRIKE,...)                  259
 
      5.79.16.Процедура SET (PAD,...)                         260
 
      5.79.17.Процедура SET (PERMANENT,...)                   261
 
      5.79.18.Процедура SET (PROMPT_AREA,...)                 262
 
      5.79.19.Процедура SET (REVERSE,...)                     264
 
      5.79.20.Процедура SET (SCREEN_UPDATE,...)               264
 
      5.79.21.Процедура SET (SCROLLING,...)                   265
 
      5.79.22.Процедура SET (SHIFT_KEY,...)                   267
 
      5.79.23.Процедура SET (STATUS_LINE,...)                 268
 
      5.79.24.Процедура SET (SUCCESS,...)                     270
 
      5.79.25.Процедура SET (SYSTEM,...)                      271
 
      5.79.26.Процедура SET (TAB_STOPS,...)                   271
 
      5.79.27.Процедура SET (TEXT,...)                        273
 
      5.79.28.Процедура SET (TIMER,...)                       273
 
      5.79.29.Процедура SET (VIDEO,...)                       274
 
      5.79.30.Процедура SET (WIDTH,...)                       275
 
      5.80. Процедура SHIFT                                   276
 
      5.81. Процедура SHOW                                    278
 
      5.82. Процедура SPAN                                    280
 
      5.83. Процедура SPANL                                   281
 
      5.84. Процедура SPAWN                                   283
 
      5.85. Процедура SPLIT_LINE                              284
 
      5.86. Процедура STR                                     285
 
      5.87. Процедура SUBSTR                                  286
 
      5.88. Процедура TRANSLATE                               288


                                - 10 -
 
                          00152-01 34 04-1
 
 
 
      5.89. Процедура UNDEFINE_KEY                            290
 
      5.90. Процедура UNMAP                                   291
 
      5.91. Процедура UPDATE                                  293
 
      5.92. Процедура WRITE_FILE                              294
 
 
 
      00152-01 34 04-2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                                - 10K -
 
                          2б.00152-01 34 04-1
 
 
 
      5.89. Процедура UNDEFINE_KEY                            290
 
      5.90. Процедура UNMAP                                   291
 
      5.91. Процедура UPDATE                                  293
 
      5.92. Процедура WRITE_FILE                              294
 
 
 
      2б.00152-01 34 04-2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                                - 11 -
 
                          00152-01 34 04-1
 
 
             1. Назначение и условия выполнения программы
 
 
 
           1.1. Общие сведения
 
 
           Обслуживающая программа обработки текста  (в  дальней-
 
      шем - утилита) предназначена для использования  разработчи-
 
      ками новых систем по редактированию, форматированию и  дру-
 
      гим операциям с текстовой информацией. Утилита  включает  в
 
      себя процедурный язык программирования высокого  уровня  (в
 
      дальнейшем - язык TPU),  компилятор,  интерпретатор  и  два
 
      интерфейса редактирования, написанных на языке TPU.
 
           Поставляемые в составе утилиты интерфейсы редактирова-
 
      ния могут использоваться без изменения для выполнения работ
 
      по редактированию текста. Можно использовать язык  TPU  для
 
      модификации этих интерфейсов, исходя из специфики  конкрет-
 
      ной работы, или  создать  новый  интерфейс  редактирования.
 
      Программисты,  например,  могут  использовать  утилиту  для
 
      конструирования  специализированного   редактора   текстов.
 
      Такой редактор или другая прикладная программма  становится
 
      интерфейсом между утилитой и пользователем.  Утилиту  можно
 
      рассматривать как некоторую базу, на которой  располагаются
 
      интерфейсы редактирования текста. Два интерфейса редактиро-
 
      вания, включенные в МОС ВП (расширенный редактор текста EVE
 
      и эмулятор малой клавиатуры EDT), являются примерами интер-
 
      фейсов утилиты, написанных на языке TPU.
 
           Можно написать программу, являющуюся расширением  этих
 
      двух интерфейсов;  можно  создать  и  совершенно  отдельный
 
      интерфейс для утилиты.
 
           Расширение существующего интерфейса может быть  реали-
 
      зовано с помощью командного файла утилиты  (исходный  текст
 


                                - 12 -
 
                          00152-01 34 04-1
 
 
      языка TPU) или с помощью секционного файла утилиты  (отком-
 
      пилированный код программы на языке TPU). Время  приведения
 
      в готовность интерфейса при использовании секционного файла
 
      гораздо меньше, чем в случае применения  командного  файла.
 
      Для реализации пользовательского  интерфейса  рекомендуется
 
      применять секционный файл.
 
 
 
           1.1.1. Интерфейс расширенного редактора EVE
 
 
           Расширенный текстовый редактор МОС ВП (в дальнейшем  -
 
      EVE) представляет собой интерфейс  редактирования,  сравни-
 
      тельно легкий в изучении и использовании. Большинство прос-
 
      тых функций редактирования EVE запускаются  нажатием  одной
 
      клавиши на малой  клавиатуре  терминала,  этим  об'ясняется
 
      скорость и легкость в изучении основных операций редактиро-
 
      вания.
 
           EVE представляет собой мощный и эффективный  редактор.
 
      Сложные операции редактирования доступны в нем  посредством
 
      ввода команд в командной строке. Многие специфичные возмож-
 
      ности утилиты (например, несколько окон) доступны с помощью
 
      команд редактора EVE.  К  другим  операциям  утилиты  можно
 
      получить доступ путем ввода операторов языка после подсказ-
 
      ки "TPU COMMAND". Для  выхода  на  этот  уровень  подсказки
 
      необходимо проделать следующее:
 
           1) нажать клавишу <DO>;
 
           2) после подсказки "COMMAND" ввести команду TPU;
 
           3) после подсказки "TPU COMMAND" ввести допустимые
 
      операторы языка TPU.
 


                                - 13 -
 
                          00152-01 34 04-1
 
 
           1.1.2. Интерфейс малой клавиатуры EDT
 
 
           Эмулятор малой клавиатуры  EDT,  написанный  на  языке
 
      TPU, обеспечивает все редакторские функции малой клавиатуры
 
      EDT и связывает эти функции с теми  же  клавишами,  которые
 
      использует редактор EDT. Эмулятор малой клавиатуры  обеспе-
 
      чивает также пользователей ограниченным набором команд  EDT
 
      построчного режима.
 
           Эмулятор малой клавиатуры EDT  обеспечивает  доступ  к
 
      функциям редактирования утилиты в  командной  строке  после
 
      подсказки "TPU COMMAND"; для доступа к этому  уровню  подс-
 
      казки необходимо проделать следующее:
 
           1) нажать клавишу <PF1>, затем <7>;
 
           2) после подсказки "TPU COMMAND" ввести допустимые
 
      операторы языка TPU.
 
 
 
           1.1.3. Специальные возможности
 
 
           Утилита обработки текста обеспечивает  следующие  спе-
 
      циальные возможности в дополнение  к  обычным  возможностям
 
      экранных редакторов:
 
           1) несколько текстовых буферов;
 
           2) несколько окон;
 
           3) несколько подпроцессов;
 
           4) текстовую обработку в пакетном режиме;
 
           5) вставку или врезку текстового фрагмента;
 
           6) свободное или ограниченное перемещение курсора;
 
           7) обучающие последовательности;
 
           8) подбор шаблонов;
 
           9) определение клавиш;
 
           10) процедурный язык;


                                - 14 -
 
                          00152-01 34 04-1
 
 
           11) вызываемый интерфейс.
 
           Использование интерфейса EVE позволяет  обратиться  ко
 
      многим из этих специальных возможностей из любой  отдельной
 
      команды EVE. Использование интерфейса эмулятора малой  кла-
 
      виатуры EDT позволяет получить доступ к расширенным возмож-
 
      ностям через командную строку  эмулятора  малой  клавиатуры
 
      EDT, однако наилучшим способом  подключения  к  расширенным
 
      функциям является  создание  нового  расширения  интерфейса
 
      эмулятора малой клавиатуры EDT и вызов утилиты с эмулятором
 
      и этим расширением.
 
 
 
           1.2. Язык TPU
 
 
           Язык TPU представляет собой процедурный язык  програм-
 
      мирования высокого уровня, позволяющий решать сложные зада-
 
      чи обработки  текста.  Язык  TPU  можно  рассматривать  как
 
      основную компоненту утилиты.  Для  доступа  к  возможностям
 
      этой компоненты необходимо написать программу на языке тPU,
 
      а затем использовать утилиту для  компиляции  и  выполнения
 
      созданной программы. Любая программа, написанная  на  языке
 
      TPU, может представлять собой один  оператор  языка;  может
 
      быть и сложной, как, например, секционный  файл,  создающий
 
      интерфейс редактора EVE.
 
           Язык TPU достаточно прост в изучении и использовании и
 
      представляет собой блочно-структурированный язык. Он содер-
 
      жит большое число типов данных,  операторы  для  управления
 
      обработкой ошибочных ситуаций, операторы  цикла  и  выбора,
 
      имеет расширенный набор  встроенных  процедур,  выполняющих
 
      важные функции. Комментарии определяются  заданием  символа
 
      (!), они помогают  документировать  создаваемые  процедуры.
 


                                - 15 -
 
                          00152-01 34 04-1
 
 
      имеется возможность отладки процедур с  помощью  отладочных
 
      средств, написанных пользователем.
 
 
 
           1.2.1. Типы данных
 
 
           Язык TPU имеет расширенный набор типов данных, исполь-
 
      зуемых для интерпретации значений переменных. В отличие  от
 
      многих существующих языков, язык утилиты не имеет  деклара-
 
      тивного оператора, связывающего тип данных и имя переменной
 
      (оператор задания типа). Тип данного для переменной в языке
 
      TPU определяется по контексту при ее указании  в  операторе
 
      присваивания. Например, в операторе присваивания назначает-
 
      ся тип данных STRING (строка) переменной THIS_VAR:
 
 
      THIS_VAR:='здесь может быть любая строка по вашему выбору'
 
 
           В  операторе  создания  окна  назначается  тип  данных
 
      WINDOW (окно) переменной х; окно занимает 15 строк  экрана,
 
      начинается со строки с номером 1; строка  состояния  экрана
 
      получает значение OFF (ее не видно на экране):
 
 
      X:=CREATE_WINDOW(1,15,OFF)
 
 
           Многие типы данных в языке TPU, например, LEARN  (обу-
 
      чение) и PATTERN  (шаблон),  отличаются  от  типов  данных,
 
      которые имеются в других языках программирования.  В  языке
 
      TPU используется набор ключевых слов, обозначающих  следую-
 
      щие типы данных:
 
           1) UNSPECIFIED - (неопределенный) - начальное  состоя-
 
      ние любой переменной языка TPU, после  того  как  она  была
 
      откомпилирована (т.е.внесена в таблицу символов языка TPU);
 


                                - 16 -
 
                          00152-01 34 04-1
 
 
           2) STRING - (строка) - строковая константа;
 
           3) INTEGER - (целый) - целочисленная константа;
 
           4) BUFFER - (буфер) - набор строк  текста.  Встроенная
 
      процедура CREATE_BUFFER  возвращает  этот  тип  данных  как
 
      результат своей работы;
 
           5) WINDOW - (окно) - некоторая часть экрана терминала.
 
      Встроенная процедура CREATE_WINDOW возвращает этот тип дан-
 
      ных как результат своей работы;
 
           6) MARKER - (маркер) - позиция символа внутри  какого-
 
      либо буфера. Встроенная процедура  MARKER  возвращает  этот
 
      тип данных как результат своей работы;
 
           7) RANGE - (диапазон) - весь текст в некотором  буфере
 
      между двумя маркерами (включительно). Встроенная  процедура
 
      CREATE_RANGE возвращает этот тип данных как результат своей
 
      работы;
 
           8) PATTERN - (шаблон)  -  последовательность  символов
 
      внутри буфера. Операторы и встроенные процедуры, работающие
 
      с шаблонами, возвращают этот тип данных как результат своей
 
      работы. Шаблоны используются встроенной  процедурой  SEARCH
 
      для нахождения заданного текста внутри некоторого буфера;
 
           9) PROGRAM - (программа) - набор готовых к  исполнению
 
      операторов языка TPU. Встроенная процедура COMPILE  возвра-
 
      щает этот тип данных как результат своей работы.
 
 
 
           1.2.2. Операторы
 
 
           В языке TPU имеются следующие операторы:
 
           1) оператор присваивания (:=);
 
           2) операторы процедуры (PROCEDURE - ENDPROCEDURE);
 
           3) операторы цикла (LOOP - ENDLOOP);
 


                                - 17 -
 
                          00152-01 34 04-1
 
 
           4) условные операторы (IF - THEN - ELSE - ENDIF);
 
           5) операторы выбора (CASE - ENDCASE);
 
           6) операторы обработки ошибок (ON_ERROR-ENDON_ERROR).
 
 
 
           1.2.3. Встроенные процедуры
 
 
           Язык TPU имеет много встроенных процедур,  реализующих
 
      функции управления экраном, использующихся при  определении
 
      клавиш и манипуляции текстом, применяющихся для  исполнения
 
      программ.
 
           Например, можно использовать встроенные процедуры  для
 
      создания  интерфейса  редактирования,  ориентированного  на
 
      несколько окон. Несколько окон позволяют видеть части  раз-
 
      личных файлов (или различные части одного файла) на  экране
 
      терминала  в  одно  и  тоже  время.  Встроенная   процедура
 
      CREATE_WINDOW позволяет создать несколько окон  на  экране,
 
      изменять их положение и размеры, задавать количество. Кроме
 
      этого утилита позволяет создавать несколько текстовых буфе-
 
      ров и связывать  их  с  окнами,  предоставляет  возможность
 
      редактировать несколько файлов одновременно.
 
           Встроенные  процедуры  позволяют  запустить  несколько
 
      процессов одновременно. Встроенная процедура CREATE_PROCESS
 
      позволяет создать подпроцесс во время работы с  утилитой  и
 
      присоединить к нему буфер,  в  котором  будет  запоминаться
 
      выводная информация этого подпроцесса. Встроенная процедура
 
      SPAWN позволяет приостановить работу с утилитой и выполнить
 
      команды диалогового командного языка DCL. Kогда  работа  по
 
      этим командам будет завершена, утилита обеспечит возврат  в
 
      сеанс редактирования.
 
           Встроенную процедуру DEFINE_KEY, написанную  на  языке
 


                                - 18 -
 
                          00152-01 34 04-1
 
 
      TPU, можно использовать для привязки некоторой программы  к
 
      определенной клавише или комбинации клавиш.  Эта  процедура
 
      позволяет задавать действия, которые будут выполняться  при
 
      нажатии   определенной   клавиши.   Встроенная    процедура
 
      UNDEFINE_KEY разрывает  существующую  связь  между  набором
 
      клавиш и кодом программы.
 
           Использование встроенной процедуры SAVE позволяет сох-
 
      ранить информацию об определениях клавиш,  о  процедурах  и
 
      значениях переменных от одного сеанса редактирования к дру-
 
      гому.
 
           Можно использовать  встроенные  процедуры  в  качестве
 
      операторов внутри новых процедур, в качестве команды интер-
 
      фейса редактора EVE либо интерфейса эмулятора малой клавиа-
 
      туры EDT.
 
 
 
           1.2.4. Пользовательские процедуры
 
 
           Допускается создание пользовательских процедур,  кото-
 
      рые представляют собой комбинацию операторов  языка  TPU  и
 
      обращений к встроенным процедурам утилиты. После  написания
 
      процедуры и ее компиляции можно обращаться к новой процеду-
 
      ре по ее имени. Синтаксис процедур, написанных  пользовате-
 
      лем, достаточно прост. Тело процедуры обрамляется  операто-
 
      рами PROCEDURE и ENDPROCEDURE. Тело любой  процедуры  может
 
      содержать ноль и более операторов языка.  Операторы  разде-
 
      ляются точкой с запятой  (;).  Процедуры  языка  TPU  могут
 
      возвращать значения, процедуры могут быть рекурсивными.
 
           Пример.
 
           Процедура  USER_TOP  использует  операторы  языка  TPU
 
      (PROCEDURE   и   ENDPROCEDURE)   и   встроенные   процедуры
 


                                - 19 -
 
                          00152-01 34 04-1
 
 
      (POSITION, BEGINNING_OF и CURRENT_ BUFFER) для  перемещения
 
      указателя положения текущего символа в начало буфера:
 
 
 
      ! Эта процедура передвигает курсор в начало буфера
 
      PROCEDURE USER_TOP
 
           POSITION (BEGINNING_OF (CURRENT_BUFFER));
 
      ENDPROCEDURE ; ! конец процедуры.
 
 
 
           После компиляции процедуры USER_TOP можно обращаться к
 
      ней по ее имени.
 
 
 
           1.3. Технические средства
 
 
           Утилита работает на всех эвм типа СМ 1700 под управле-
 
      нием МОС ВП. При необходимости работы с очень большими фай-
 
      лами в некоторых системах необходимо  подобрать  соответст-
 
      вующие параметры системы  или  разделить  большой  файл  на
 
      более мелкие сегменты; утилита выполняет все свои  действия
 
      в памяти, а не в рабочем (дисковом) файле.
 
           Утилита поддерживает экранный режим на терминалах типа
 
      VT200 и VT100, а также на других видеотерминалах, в которых
 
      функции управления соответствуют аналогичному стандарту.
 
           Увеличение скорости выполнения операций редактирования
 
      в экранном режиме является одной из главных целей разработ-
 
      ки утилиты. Оптимальная производительность экранного редак-
 
      тирования проявляется при работе утилиты с терминалами типа
 
      VT220 и VT100. Некоторые  видеотерминалы  имеют  аппаратные
 
      возможности, не соответсвующие оптимальной работе TPU.
 
           Работа утилиты на терминалах типа VT52, на  терминалах
 
      с другими функциями управления  возможна  только  в  режиме
                


                                - 20 -
 
                          00152-01 34 04-1
 
 
      построчного редактирования.
 
 
 
 
                         2. Команды оператора
 
 
 
           2.1. Команда EDIT/TPU
 
 
           Для получения доступа к утилите на  уровне  командного
 
      языка DCL необходимо ввести команду EDIT/TPU  и  затем  имя
 
      файла, например:
 
 
      $ EDIT/TPU TEXT_FILE.LIS                      (1)
 
 
           С помощью команды (1) для  редактирования  открывается
 
      файл TEXT_FILE.LIS. Можно задавать только один входной файл
 
      в этой команде. Подключиться к другим файлам можно во время
 
      сеанса  редактирования  с  помощью   встроенной   процедуры
 
      READ_FILE.
 
           Вызов утилиты обработки текста с помощью  команды  (1)
 
      приводит на уровень интерфейса редактирования, принятого по
 
      умолчанию. Таким интерфейсом для утилиты является EVE. Рас-
 
      ширенный редактор можно вызывать по его имени, если опреде-
 
      лить глобальный символ EVE следующим образом:
 
 
      $EVE := = EDIT/TPU
 
 
           Для вызова утилиты с эмулятором малой  клавиатуры  EDT
 
      нужно ввести следующую команду:
 
 
      $ EDIT/TPU/SECTION=EDTSECINI[.GBL]             (2)
 
 
           Вместо длинной команды (2)  можно  создать  глобальный
 
      символ уровня DCL:
 


                                - 21 -
 
                          00152-01 34 04-1
 
 
      $ EDTEM := = EDIT/TPU/SECTION=EDTSECINI[.GBL]
 
 
      После чего использовать команду EDTEM на уровне  языка  DCL
 
      для вызова TPU с  интерфейсом  эмулятора  малой  клавиатуры
 
      EDT. Экран терминала в  режиме  эмулятора  имеет  следующие
 
      отличия от принятого в обычной работе редактора EDT:
 
           1) [EOB] заменяется на [END OF MAIN] ;
 
           2) последние 2 строки на экране терминала резервируют-
 
      ся для информационных сообщений и сообщений об ошибках ;
 
           3) подсказка редактора EDT  "COMMAND:"  заменяется  на
 
      "TPU COMMAND:"; эта подсказка появляется на  третьей  снизу
 
      строке экрана терминала .
 
 
 
           2.1.1. Квалификаторы команды EDIT/TPU
 
 
           Квалификаторы, используемые в команде EDIT/TPU, управ-
 
      ляют восстановлением прерванного сеанса  работы  и  файлами
 
      инициализации;  квалификаторы  обеспечивают  интерфейс,   с
 
      помощью которого происходит обращение к утилите. Квалифика-
 
      торы для команды EDIT/TPU перечислены в табл. 1.
 
                                                  Таблица 1
 
             Kвалификаторы команды EDIT/TPU уровня DCL
 
      -----------------------------------------------------
                                !
           Квалификатор         !   Значение по умолчанию
                                !
      -----------------------------------------------------
                                !
      /[NO]COMMAND[=FILE_SPEC]  ! /COMMAND=TPUINI
                                !
      /[NO]CREATE               ! /CREATE
                                !
      /[NO]DISPLAY              ! /DISPLAY
                                !
      /[NO]JOURNAL[=FILE_SPEC]  ! /JOURNAL=INPUT_FILE.TJL
                                !
      /[NO]OUTPUT[=FILE_SPEC]   ! /OUTPUT=INPUT_FILE.TYPE
                                !
      /[NO]READ_ONLY            ! /NOREAD_ONLY


                                - 22 -
 
                          00152-01 34 04-1
 
 
                                        Продолжение табл. 1
      -----------------------------------------------------
                                !
           Квалификатор         !   Значение по умолчанию
                                !
      -----------------------------------------------------
                                !
      /[NO]RECOVER              ! /NORECOVER
                                !
      /[NO]SECTION=[FILE_SPEC]  ! /SECTION=TPUSECINI
 
 
           2.1.2. Файлы инициализации
 
 
           Существует два вида файлов  инициализации,  с  помощью
 
      которых можно создавать интерфейс TPU.
 
           Любой командный файл представляет собой исходный текст
 
      программы на языке TPU и имеет тип  'TPU'.  Этот  командный
 
      файл     используется     вместе      с      квалификатором
 
      /COMMAND=спецификация_файла. Утилита пытается читать  неко-
 
      торый командный файл, если не задано запрещение  квалифика-
 
      тором /NОCOMMAND.
 
           Любой  секционный  файл  утилиты  представляет   собой
 
      откомпилированную форму файла  исходного  текста  на  языке
 
      TPU. Секционный файл - это двоичный файл, имеющий тип файла
 
      'GBL'.   Он   используется    вместе    с    квалификатором
 
      /SECTION=спецификация_файла. При вызове утилиты по  умолча-
 
      нию  используется  секционный  файл,  создающий   интерфейс
 
      редактора EVE. Можно  задать  некоторый  другой  секционный
 
      файл (например, /SECTION = мой_секционный_файл) или  запре-
 
      тить его чтение квалификатором /NOSECTION, если нет необхо-
 
      димости использования интерфейса редактора EVE.
 
           Примечание.  При  вызове  утилиты   с   квалификатором
 
      /NOSECTION не происходит чтения никакого  двоичного  файла,
 
      обеспечивающего интерфейс с утилитой.  Не  определены  даже
 
      клавиши  <RETURN>  и  <DELETE>.  Использовать  квалификатор
 


                                - 23 -
 
                          00152-01 34 04-1
 
 
      /NOSECTION необходимо при создании нового секционного  фай-
 
      ла, когда не нужны процедуры, переменные и прочие определе-
 
      ния из уже существующего.
 
           Утилитой допускается использование командного или сек-
 
      ционного файла (или обоих) для модификации  или  расширения
 
      некоторого существующего интерфейса. Командный файл  обычно
 
      используется для выполнения  небольшого  набора  подготови-
 
      тельных операций с вызываемым интерфейсом. В силу того, что
 
      приведение в готовность интерфейса при  использовании  сек-
 
      ционного файла эффективнее, этот файл  обычно  используется
 
      при большой по об'ему или сложной подготовке или при созда-
 
      нии интерфейса,  который  не  базируется  ни  на  одном  из
 
      существующих.
 
           Копии командных и секционных файлов для EVE и для эму-
 
      лятора малой клавиатуры EDT находятся в файле  SYS$LIBRARY.
 
      Эти командные файлы включены для  того,  чтобы  можно  было
 
      читать исходный текст, который использовался  при  создании
 
      двух интерфейсов редактирования.  Исходный  текст  для  EVE
 
      содержится в файле EVESECINI.TPU. Файл EVESECINI.GBL предс-
 
      тавляет собой откомпилированный  двоичный  секционный  файл
 
      для редактора EVE. Файл, в котором содержится исходный  код
 
      для   эмулятора   малой   клавиатуры   EDT,    имеет    имя
 
      EDTSECINI.TPU. Соответствующий файл с типом .GBL  представ-
 
      ляет собой откомпилированный двоичный секционный файл  эму-
 
      лятора.
 


                                - 24 -
 
                          00152-01 34 04-1
 
 
           2.2. Завершение работы с утилитой
 
 
           Для завершения работы с утилитой используются  команды
 
      QUIT и EXIT. Применение команды QUIT в интерфейсах редакти-
 
      рования EVE или эмулятора малой клавиатуры EDT не позволяет
 
      сохранить результат работы, полученный к этому моменту.  По
 
      команде EXIT текущий буфер будет записан на диск (в случае,
 
      если этот буфер был модифицирован) и будут выданы запросы о
 
      сохранении других модифицированных буферов.
 
 
 
           2.3. Дальнейшие сведения об утилите
 
 
           Этот подраздел  предназначен  пользователям,  желающим
 
      программировать на языке TPU. Предполагается  знакомство  с
 
      концепциями программирования  и  с  системными  концепциями
 
      операционной системы МОС ВП; необходимо также изучение язы-
 
      ка TPU.
 
           Предполагаемый путь изучения языка  состоит  в  выборе
 
      одного из существующих интерфейсов редактирования и в  изу-
 
      чении руководства, описывающего этот интерфейс.
 
           После знакомства  с  функциями,  которые  поддерживает
 
      выбранный интерфейс, можно приступить к его расширению  или
 
      модификации. Для этого следует изучить исходный текст соот-
 
      ветствующего интерфейса. В любом случае необходимо убедить-
 
      ся, что новые программы, имеющие целью изменить или  расши-
 
      рить  интерфейс,  не  противоречат  существующим  элементам
 
      интерфейса.
 
           Данное руководство содержит большое количество  приме-
 
      ров процедур и программ на языке TPU. Использование  каждой
 
      встроенной процедуры демонстрируется соответствующим приме-
 
      ром, который представляет  собой  простой  оператор  языка,


                                - 25 -
 
                          00152-01 34 04-1
 
 
      использующий эту процедуру. Документ содержит примеры боль-
 
      ших процедур, выполняющих некоторые работы по  программиро-
 
      ванию; эти процедуры являются примерами,  однако  их  можно
 
      приспособить для эффективного применения.
 
           Можно  сосредоточить  усилия  на  создании  некоторого
 
      нового  интерфейса  редактирования.  Руководство   содержит
 
      текст (в качестве примера) минимального интерфейса, который
 
      можно взять за основу для дальнейшей работы.
 
 
 
 
                          3. Типы данных TPU
 
 
 
           Любой тип данных представляет собой  некоторую  группу
 
      элементов, которые формируются одинаковым образом  и  расс-
 
      матриваются единообразно. Тип данных любой переменной языка
 
      TPU определяет операции, которые можно выполнять  над  этой
 
      переменной. Типы данных языка TPU представляются с  помощью
 
      следующих ключевых слов:
 
           1) UNSPECIFIED (неопределенный);
 
           2) INTEGER (целый);
 
           3) STRING (строка);
 
           4) BUFFER (буфер);
 
           5) WINDOW (Oкно);
 
           6) MARKER (маркер);
 
           7) RANGE (диапазон);
 
           8) PATTERN (шаблон);
 
           9) PROGRAM (программа);
 
           10) PROCESS (процесс);
 
           11) LEARN (обучение) .
 
           Типы данных используются для интерпретации содержимого
 


                                - 26 -
 
                          00152-01 34 04-1
 
 
      любой переменной. В отличие от многих языков программирова-
 
      ния, язык TPU разрешает переменной иметь тип данных и расс-
 
      матривает этот тип как параметр этой переменной.  Язык  TPU
 
      не имеет оператора  об'явления  типа,  с  помощью  которого
 
      некоторый тип данных может быть  сопоставлен  с  какой-либо
 
      переменной. Переменные в языке TPU определяют свой тип пос-
 
      ле появления в левой части оператора  присваивания;  правая
 
      часть этого оператора определяет тип данных переменной.
 
           Не  возбраняется  совершенно  свободно   комбинировать
 
      переменные, но некоторые процедуры требуют, чтобы их  пара-
 
      метры имели вполне определенный тип данных; каждая встроен-
 
      ная процедура  может  оперировать  только  с  определенными
 
      типами данных. Отдельные  встроенные  процедуры  возвращают
 
      вполне определенный тип данных как результат своей работы.
 
 
 
           3.1. UNSPECIFIED
 
 
           Данные типа UNSPECIFIED (неопределенный) - это началь-
 
      ное значение любой переменной языка TPU после ее компиляции
 
      (т.е. Добавления в  таблицу  символов  утилиты).  Например,
 
      встроенная процедура COMPILE присваивает переменной х  зна-
 
      чение неопределенного типа:
 
 
      COMPILE (' X:=1 ');
 
                        0
           Любой  оператор  присваивания,  создающий  переменную,
 
      должен выполняться перед тем,  как  какой-либо  тип  данных
 
      будет присвоен  этой  переменной.  Например,  использование
 
      встроенной  процедуры  EXECUTE  для  выполнения  программы,
 
      записанной в переменной "PROG", приведет к присвоению  этой
 
      переменной целого значения:
 


                                - 27 -
 
                          00152-01 34 04-1
 
                         0
      PROG:=COMPILE ('X:=1');
 
      EXECUTE (PROG);
 
 
 
           3.2. INTEGER
 
 
           Язык TPU использует тип  данных  INTEGER  (целый)  для
 
      представления числовых данных. Утилита поддерживает  только
 
      целочисленную арифметику. Данные целого типа  могут  прини-
 
      мать  числовые  значения   в   диапазоне   от   -2147483648
 
      до 2147483647. В языке TPU любая целая константа  представ-
                         0
      ляет собой последовательность десятичных  цифр;  не  допус-
 
      каются запятые и десятичные точки.
 
           Например, переменной X присваивается  значение  целого
 
      типа:
 
 
      Х:=12345
 
 
 
           3.3. STRING
 
 
           TPU использует тип данных STRING (строка)  для  предс-
 
      тавления символьной 000000000000000чение, имеющее этот  тип
 
      данных, может содержать любой символ  из  набора  КОИ-8.  В
 
      качестве  ограничителей  строковой  константы  используются
 
      кавычки (") или апострофы (').
 
           Например, переменной X присваивается значение  строко-
 
      вого типа:
 
 
      X:='авс'
 
      X:="ABC"
 
 
           Для вставки текущего ограничителя строки внутрь  самой
 
      строки его нужно расположить в этой строке дважды.
 


                                - 28 -
 
                          00152-01 34 04-1
 
 
           Например, переменной X присваивается значение  символа
 
      ('), а затем - символ(");  эти  символы  являются  текущими
 
      ограничителями:
 
 
      X:='''';  ! Переменной Х присваивается значение ' ;
 
      Х:="""";  ! Переменной Х присваивается значение " .
 
 
           Альтернативный символ  -  ограничитель  строки  -  при
 
      употреблении его внутри строки повторяться дважды  не  дол-
 
      жен.
 
           Например, переменной X присваивается значение  ('),  а
 
      затем ("); эти символы являются альтернативными текущему:
 
 
      X:="'";  ! Переменной Х присваивается значение ' ;
 
      Х:='"';  ! Переменной Х присваивается значение " .
 
 
           Нулевая строка - это строка нулевой длины. Можно прис-
 
      воить переменной х строку нулевой длины следующим образом:
 
 
      X:='' ;
 
 
           Максимальная длина строки равна 65535 символам.
 
           Многие из встроенных процедур языка TPU  возвращают  в
 
      качестве результата своей работы тип данных STRING.  Напри-
 
      мер, встроенная процедура ASCII возвращает символьную стро-
 
      ку, соответствующую числовому значению, которое  указано  в
 
      качестве параметра. Например, значение строки 'к' (числовой
 
      код 75) присваивается переменной MY_CHAR:
 
 
      MY_CHAR: =ASCII(75) ;
 


                                - 29 -
 
                          00152-01 34 04-1
 
 
           3.4. BUFFER
 
 
           Тип данных BUFFER (буфер) - это рабочее  пространство,
 
      предназначенное для операций с текстом. Любой  буфер  может
 
      быть либо пустым, либо содержать текстовые  записи.  Разре-
 
      шается иметь несколько буферов. Тип данных  BUFFER  возвра-
 
      щается встроенными процедурами CREATE_BUFFER CURRENT_BUFFER
 
      и GET_INFO.
 
           Например, в результате  работы  функции  CREATE_BUFFER
 
      тип данных BUFFER присваивается переменной MY_BUF:
 
 
      MY_BUF:=CREATE_BUFFER("MY_BUFFER")
 
 
           Задание буфера в  качестве  параметра  для  встроенных
 
      процедур языка TPU допускается через использование перемен-
 
      ной, которой этот буфер назначен. Например, очистка  содер-
 
      жимого буфера MY_BUFF выполняется оператором:
 
 
      ERASE (MY_BUFF)                               (3)
 
 
           Примечание. Переменную, имеющую тип BUFFER ("MY_BUF"),
 
      следует отличать от  имени  буфера  ("MY_BUFFER").  Утилита
 
      использует имя буфера - строку "MY_BUFFER" - для  идентифи-
 
      кации буфера в строке состояния.
 
           Оператор (3) очищает содержимое буфера . Для  удаления
 
      самого буфера должна  использоваться  встроенная  процедура
 
      DELETE с указанием переменной типа BUFFER в качестве  пара-
 
      метра.
 
           Создание буфера не Oбязательно приводит  к  выводу  на
 
      экран информации, содержащейся в этом буфере; буфер  должен
 
      быть связан с  некоторым  окном,  отображаемым  на  экране.
 
      Редактирование возможно в любом буфере, даже если он  и  не
 


                                - 30 -
 
                          00152-01 34 04-1
 
 
      отображается на экране через окно.
 
           Текущий буфер содержит  текущую  позицию  символа  для
 
      редактирования. Эта позиция может  отличаться  от  текущего
 
      положения курсора на экране; чаще всего  они  имеют  разное
 
      положение. Когда текущий буфер связывается  с  отображаемым
 
      на экране окном, то текущая позиция символа и текущее поло-
 
      жение курсора совпадают. Любой буфер может  быть  связан  с
 
      некоторым множеством окон, число которых  может  изменяться
 
      от 0 до 255. Часто полезно иметь  буфер,  который  виден  в
 
      двух окнах; в этом случае можно наблюдать  различные  части
 
      одного и того же файла одновременно. Например, можно  отоб-
 
      разить в одном окне набор об'явлений, а в другом - их  код.
 
      Результаты операций  редактирования  отображаются  во  всех
 
      окнах, в которых наблюдается буфер.
 
 
 
           3.5. WINDOW
 
 
           Тип данных WINDOW (окно) относится к некоторой области
 
      на    экране.    Встроенные    процедуры     CREATE_WINDOW,
 
      CURRENT_WINDOW и GET_IFPO возвращают этот  тип  данных  как
 
      результат своей работы. Например, переменной х  назначается
 
      тип данных WINDOW:
 
 
      X:=CREATE_WINDOW(1,12,OFF)
 
 
           Первый параметр указывает на то, что окно располагает-
 
      ся с первой строки экрана; второй  параметр  задает  размер
 
      окна в 12 строк; ключевое слово OFF указывает  на  то  ,что
 
      строка состояния не высвечивается на дисплее во время отоб-
 
      ражения этого окна на экране.
 


                                - 31 -
 
                          00152-01 34 04-1
 
 
           3.5.1. Размеры окна
 
 
           Окно определяется по строкам и столбцам экрана. Строки
 
      экрана нумеруются от 1 до  длины  страницы  экрана,  то  же
 
      относится и к строкам окна. Столбцы  на  экране  нумеруются
 
      от 1 до физической ширины экрана, то же относится к  столб-
 
      цам окна. Минимальная длина окна на экране  -  одна  строка
 
      (если окно не включает строку  состояния)  или  две  строки
 
      (если окно использует строку состояния).  Строка  состояния
 
      занимает последнюю строку  окна  и  по  умолчанию  содержит
 
      информацию о буфере и файле, связанных с этим окном.  Обес-
 
      печивается выбор: разрешить или запретить отображение стро-
 
      ки состояния.
 
           Максимальная длина окна - максимальное число строк  на
 
      экране. Например, если экран имеет 24 строки, то максималь-
 
      ный размер окна тоже равен 24 строкам. На одном экране мож-
 
      но иметь 24 окна (это максимальное число), не имеющих строк
 
      состояния. Если используется строка состояния  для  каждого
 
      окна, то максимальное количество возможных окон равно 12.
 
 
 
           3.5.2. Создание окна
 
 
           Если используется терминальное  устройство,  поддержи-
 
      вающее работу с окнами, то в секционном или командном  фай-
 
      лах,  инициализирующих  интерфейс  редактирования,   должны
 
      выполняться действия по созданию и отображению  окон.  Если
 
      несвязать буфер с окном и не отобразить окно на  экран,  то
 
      на экране будут появляться только сообщения, причем с теку-
 
      щего положения курсора.
 
           Встроенная  процедура  CREATE_WINDOW  (создание  окна)
 
      определяет размер и положение  окна  и  задает  отображение


                                - 32 -
 
                          00152-01 34 04-1
 
 
      строки состояния. Эта встроенная процедура добавляет окно к
 
      внутреннему списку окон,  доступных  для  отображения.  При
 
      создании любое окно помечается как невидимое  (неотображае-
 
      мое) и для него определяются начальные значения его  харак-
 
      теристик:
 
           1) ORIGINAL_TOP - начальная верхняя строка окна. Номер
 
      строки экрана, который соответствует  первой  строке  окна;
 
      это значение вычисляEтся в момент создания окна;
 
           2) ORIGINAL_BOTTOM -  начальная  нижняя  строка  окна.
 
      Номер строки экрана, которая соответствует последней строке
 
      окна (не включается строка состояния); это значение  вычис-
 
      ляется в момент создания окна;
 
           3) ORIGINAL_LENGTH - начальная длина окна, равная чис-
 
      лу строк в окне (включая строку состояния).
 
 
 
           3.5.3. Характеристики положения окна
 
 
           При  создании  окна  с  помощью  встроенной  процедуры
 
      CREATE_WINDOW утилита запоминает значения номеров  экранных
 
      строк,  ограничивающих  окно  на   экране,   в   переменных
 
      ORIGINAL_TOP и ORIGINAL_BOTTOM. Отображение некоторого окна
 
      на экран с помощью  встроенной  процедуры  мар  делает  его
 
      видимым на экране. Если это единственное окно на экране, то
 
      его характеристики VISIBLE_TOP (видимая верхняя  строка)  и
 
      VISIBLE_BOTTOM (видимая  нижняя  строка)  равны  значениям,
 
      которые имеют ORIGINAL_TOP и ORIGINAL_BOTTOM. Можно  узнать
 
      значения начальных и видимых характеристик с помощью коман-
 
      ды SHOW (WINDOWS). Если на экране уже есть окно,  а  второе
 
      окно отображается на некоторую часть первого,  то  значения
 
      VISIBLE_TOP и VISIBLE_BOTTOM для первого окна будут модифи-
 


                                - 33 -
 
                          00152-01 34 04-1
 
 
      цированы. Новое значение VISIBLE_LENGTH  для  первого  окна
 
      будет отличаться от его ORIGINAL_LENGTH до  тех  пор,  пока
 
      второе окно не будет убрано с экрана.
 
 
 
           3.5.4. Отображение окна
 
 
           Для отображения на экране окна и соответствующего  ему
 
      буфера используется встроенная процедура  мар.  Отображение
 
      окна на экран сопровождается следующими изменениями:
 
           1) отображаемое  окно  становится  текущим,  и  курсор
 
      передвигается на текущую позицию редактирования  в  буфере,
 
      который связан с этим окном;
 
           2) буфер, связанный с отображенным  окном,  становится
 
      текущим буфером;
 
           3) окно помечается как "видимое" и "отображаемое";
 
           4) вычисляются  и  запоминаются  значения  VISIBLE_TOP
 
      (видимая верхняя строка),  VISIBLE_BOTTOM  (видимая  нижняя
 
      строка), VISIBLE_LENGTH (видимая длина). Первоначально  эти
 
      значения   совпадают   со   значениями    ORIGINAL_TOP    и
 
      ORIGINAL_BOTTOM, вычисляемыMи при создании окна.
 
           Отображение окна может иметь следующие побочные эффек-
 
      ты:
 
           1) вновь отображаемое окно может закрыть другие  окна.
 
      Это   происходит,   когда    значения    VISIBLE_TOP    или
 
      VISIBLE_BOTTOM нового окна перекрывают границы существующих
 
      видимых окон. Наложение может привести к тому, что  некото-
 
      рые окна будут полностью закрыты  (не  видны).  Такие  окна
 
      остаются помеченными как "отображаемые"; когда  закрывающее
 
      их окно удаляется с экрана, они могут появиться без  выпол-
 
      нения процедуры мар;
 


                                - 34 -
 
                          00152-01 34 04-1
 
 
           2)  если  вновь  отображаемое  окно  делит   некоторое
 
      существующее окно на две части,  то  только  верхняя  часть
 
      разделенного окна продолжает изменяться. Нижняя  его  часть
 
      будет стерта при следующем обновлении окна;
 
           3)    значения    VISIBLE_TOP,    VISIBLE_BOTTOM     и
 
      VISIBLE_LENGTH для закрытого окна изменяются по сравнению с
 
      его начальными значениями (ORIGINAL).
 
           Когда отображенное окно становится текущим окном  (это
 
      может  произойти  после  работы  встроенных  процедур  мар,
 
      POSITION и  ADJUST_WINDOW),  курсор  перемещается  в  него.
 
      Текущее окно имеет текущее положение курсора; окна, которые
 
      не являются в данный момент текущими (не содержат курсора),
 
      также имеют текущее положение  курсора.  Текущее  положение
 
      курсора в окне, являющемся в данный момент текущим,  -  это
 
      последняя позиция, в которой находился курсор,  когда  окно
 
      было текущим. Концепция текущей позиции в окнах, не  содер-
 
      жащих курсора, позволяет редактировать в нескольких  местах
 
      одного буфера, если этот буфер связан  с  более  чем  одним
 
      окном.
 
 
 
           3.5.5. Удаление окна
 
 
           Для удаления окна  с  экрана  используются  встроенные
 
      процедуры МАР и DELETE.  MAP  удаляет  окно  с  экрана,  но
 
      оставляет его во внутреннем списке окон утилиты; такое окно
 
      можно вновь отобразить на экран, не  создавая  его  заново.
 
      Процедура DELETE убирает окно с  экрана  и  из  внутреннего
 
      списка окон утилиты,  следовательно,  его  уже  нельзя  без
 
      нового создания отобразить на экран.
 
           Прекращение отображения или удаление окон  имеет  сле-
 


                                - 35 -
 
                          00152-01 34 04-1
 
 
      дующие последствия:
 
           1) окно, для которого  прекращено  отображение,  поме-
 
      чается как "невидимое" и "неотображаемое";
 
           2) другое окно становится текущим и курсор перемещает-
 
      ся в последнюю текущую позицию нового текущего окна;
 
           3) если другие окна были закрыты удаленным  окном,  то
 
      текст этих окон появляется на экране. Значения VISIBLE_TOP,
 
      VISIBLE_BOTTOM и VISIBLE_LENGTH первоначально закрытых окон
 
      изменяются в соответствии с теми строками, которые  возвра-
 
      щаются им после удаления закрывающего их окна.
 
 
 
           3.5.6. Диспетчер экрана
 
 
           Диспетчер экрана является частью утилиты  и  управляет
 
      выводом данных на экран. Допускается манипулирование данны-
 
      ми без отображения их на  экране  терминала,  однако,  если
 
      необходимо сделать выполненные изменения  данных  видимыми,
 
      то это выполняет  диспетчер  экрана.  Диспетчер  экрана  не
 
      вызывается для выполнения своей работы до тех пор, пока все
 
      команды, связанные с последней нажатой клавишей,  не  будут
 
      выполнены. После завершения этих  команд  диспетчер  экрана
 
      изменяет каждое окно, обновляя текущее состояние той  части
 
      буфера, которая отображается на экран. Для внесения измене-
 
      ний в изображение на экране  (соответственно  в  буфер)  до
 
      прекращения  команды  необходимо   использовать   процедуру
 
      UPDATE для изменения окна. Использование  процедуры  UPDATE
 
      рекомендуется для тех встроенных процедур, которые запраши-
 
      вают утилиту о текущей позиции курсора (например,  встроен-
 
      ная процедура CURRENT_COLUMN). Гарантией того, что  опреде-
 
      ленная позиция курсора верна (вплоть до последней  выданной
 


                                - 36 -
 
                          00152-01 34 04-1
 
 
      команды), является использование UPDATE  перед  процедурами
 
      CURRENT_COLUMN или CURRENT_ROW.
 
 
 
           3.5.7. Получение информации об окнах
 
 
           Существуют две встроеные процедуры языка ТPU,  которые
 
      возвращают информацию об окнах: GET_INFO и SHOW(WINDOW) или
 
      SHOW(WINDOWS).
 
           GET_INFO возвращает информацию, которую  можно  запом-
 
      нить в  некоторой  переменной.  Возвращается  информация  о
 
      текущих (VISIBLE) и начальных (ORIGINAL) значениях характе-
 
      ристик окон, а также некоторая другая информация о парамет-
 
      рах окон, имеющихся в текущем сеансе работы с утилитой.
 
           Процедура  SHOW(WINDOW)  или   SHOW(WINDOWS)   заносит
 
      информацию об окнах в SHOW_BUFFER. Если используется интер-
 
      фейс редактирования, имеющий INFO_WINDOW, то можно  отобра-
 
      зить информацию SHOW_BUFFER в INFO_WINDOW. Если использует-
 
      ся интерфейс эмулятора малой  клавиатуры  EDT,  то  команда
 
      SHOW(WINDOWS) отображает, например, следующую информацию на
 
      экране терминала:
 
 
      WINDOW: MAIN_WINDOW
 
      VISIBLE WINDOW NUMBER:1
 
      BUFFER: MAIN_BUFFER
 
      VIDEO: NONE
 
      STATUS_LINE: OFF   TEXT: BLANK_TABS  PAD: OFF
 
      MOST RECENT VISIBLE CURSOR WAS AT ROW 14 COLUMN 1
 
      VISIBLE_TOP: 1   BOTTOM:21   ORIGINAL_TOP: 1  BOTTOM: 21
 
      SCROLL_TOP:6 BOTTOM:7 AMOUNT:O
 
      WIDTH:8O SHIFT_AMOUNT:O
 
      WINDOW:INFO_WINDOW


                                - 37 -
 
                          00152-01 34 04-1
 
 
      NOT VISIBLE
 
      BUFFER:NOT MAPPED
 
      VIDEO:REVERSE
 
      STATUS_LINE:ON TEXT:BLANK_TABS  рAD:ON
 
      MOST RECENT VISIBLE CURSOR WAS UNKNOWN
 
      VISIBLE_TOP:1 BOTTOM:2O  ORIGINAL_TOP:1 BOTTOM:2O
 
      SCROLL_TOP:O BOTTOM:O AMOUNT:O
 
      WIDTH: 80  SHIFT_AMOUNT: 0
 
      WINDOW: MESSAGE_WINDOW
 
      VISIBLE WINDOW NUMBER:2
 
      BUFFER:MESSAGE_BUFFER
 
      VIDEO:NONE
 
      STATUS_LINE:OFF TEXT:BLANK_TABS PAD:OFF
 
      MOST RECENT VISIBLE CURSOR WAS AT ROW 24 COLUMN 1
 
      VISIBLE_TOP:23 BOTTOM:24  ORIGINAL_TOP:23 BOTTOM:24
 
      SCROLL_TOP:O  BOTTOM:O  AMOUNT:O
 
      WIDTH:8O  SHIFT_AMOUNT:O
 
 
 
 
 
           3.6. MARKER
 
 
           Тип данных МАRКЕR представляет собой ссылку на положе-
 
      ние символа внутри некоторого  буфера.  Тип  данных  МАRКЕR
 
      возвращают встроенные процедуры MARK, SELECT, BEGINNING_OF,
 
      END_OF и GET_INFO. Если символ, с  которым  связан  маркер,
 
      передвигается внутри буфера, то маркер передвигается вместе
 
      с ним. Если символ, с которым связан маркер, удаляется,  то
 
      маркер передвигается на  следующий  ближайший  символ.  Для
 
      удаления маркера используется  встроенная  поцедура  DELETE
 
      (MARK1) с маркером в качестве параметра или обнуление  всех
 


                                - 38 -
 
                          00152-01 34 04-1
 
 
      переменных, связанных с этим маркером (MARK1:=O).
 
           Например,  переменной  Х  присваивается   тип   данных
 
      МАRКЕR:
 
 
           X:=MARK(NONE)
 
 
      Теперь переменная Х связана с позицией символа внутри буфе-
 
      ра, которая была текущей в момент выполнения оператора.
 
           Можно отобразить любой маркер на  экране  терминала  с
 
      измененными атрибутами изображения (BLINK,  BOLD,  REVERSE,
 
      UNDERLINE). Ключевое слово NONE в  примере  указывает,  что
 
      маркер не должен иметь ни одного такого атрибута.
 
 
 
           3.7. RANGE
 
 
           Тип данных RANGE (диапазон)  представляет  весь  текст
 
      между двумя маркерами, определенными ранее (включая в  этот
 
      текст и символы, с которыми связаны маркеры). Можно сформи-
       ..
      ровать некоторый диапазон с  помощью  встроенной  процедуры
 
      СREATE_RANGE. Диапазон связывается с символами внутри буфе-
 
      ра. Если символы внутри диапазона перемещаются, то диапазон
 
      передвигается вместе с ними. Если символы  добавляются  или
 
      удаляются между двумя маркерами, ограничивающими  диапазон,
 
      то размер диапазона изменяется; если все символы из некото-
 
      рого диапазона удаляются, то этот диапазон передвигается на
 
      следующий ближайший символ. Для удаления диапазона  необхо-
 
      димо использовать встроеную процедуру DELETE с диапазоном в
 
      качестве  параметра (например, ДELETE  (MY_RANGE))или обну-
 
      лить  все  переменные,   ссылающиеся   на   этот   диапазон
 
      (MY_RANGE:=0).
 
           Удаление дипазона не удаляет символы  этого  диапазона
 


                                - 39 -
 
                          00152-01 34 04-1
 
 
      из буфера; просто удаляется тип данных RANGE. Для  удаления
 
      символов диапазона необходимо использовать встроенную  про-
 
      цедуру ERASE с диапазоном в качестве  параметра.  Например,
 
      ERASE (МY_RANGE) удаляет все символы в диапазоне  МY_RANGE,
 
      но не удаляет сам диапазон как некоторую  структуру;  TAKOE
 
      удаление делается встроенной процедурой DELETE. Тип  данных
 
      RANGE возвращается в качестве результата работы  встроенных
 
      процедур CREATE_RANGE,  SEARCH,  SELECT_RANGE  и  GET_TNFO.
 
      Например, переменной х назначается тип данных RANGE:
 
 
           X:=CREATE_RANGE (МАRК1,МАРК2,UNDERLINE)
 
 
           Можно отобразить любой диапазон с изменением его атри-
 
      бутов изображения (BLINK, BOLD, REVERSE, UNDERLINE). Ключе-
 
      вое слово UNDERLINE в примере указывает, что символы данно-
 
      го диапазона должны быть подчеркнуты при  появлении  их  на
 
      экране.
 
 
 
           3.8. PATTERN
 
 
           Тип данных PATTERN (шаблон) - это  структура,  которая
 
      представляет определенную последовательность символов внут-
 
      ри некоторого буфера. Шаблоны  используются  как  параметры
 
      для встроенной процедуры  SEARCH,  что  помогает  в  поиске
 
      заданного текста внутри любого буфера. Для создания шаблона
 
      используются "шаблонные" операторы (!,  &,  @),  с  помощью
 
      которых комбинируются следующие об'екты:
 
           1) строковые константы;
 
           2) строковые переменные;
 
           3) шаблонные переменные;
 
           4) встроенные процедуры, работающие с шаблонами;
 


                                - 40 -
 
                          00152-01 34 04-1
 
 
           5) круглые скобки (для заключения в них выражений).
 
           Шаблоны могут быть простыми или сложными  структурами.
 
      Любой простой шаблон  может  быть  составлен  из  множества
 
      строк, связанных шаблонными операторами. Например, перемен-
 
      ная PATH1 имеет тип PATTERN и состоит из  комбинации  строк
 
      'ABC' и 'DEF':
 
 
      PATH1: = 'АВС' & 'DEF'
 
 
           Более сложные шаблоны используют шаблонные  встроенные
 
      процедуры и уже существующие шаблоны для формирования ново-
 
      го шаблона. Например, шаблонная переменная PATH2 подбирает-
 
      ся из строки 'АВС', за которой следует самая длинная строка
 
      символов, содержащая любую часть строки '12345':
 
 
      PATH2:='АВС' & SPAN ('12345')
 
 
           Шаблон, определенный переменной PATH2, позволяет найти
 
      подстроку 'АВС123' в текстовой строке "XYZABC123DEF".
 
           Так как любой шаблон представляет собой структуру дан-
 
      ных, то его можно присвоить некоторой  переменной,  которую
 
      затем можно использовать в качестве параметра во встроенной
 
      процедуре SEARCH.  Эта  процедура  ищет  последовательность
 
      символов, определенную шаблоном, указанным  в  обращении  к
 
      процедуре в качестве параметра. Если  встроенная  процедура
 
      SEARCH  найдет  соответствие  шаблону,  то  она  возвращает
 
      текст, подходящий под шаблон, как диапазон,  который  можно
 
      запомнить в некоторой переменной.
 
           Например, можно использовать строки и шаблонные опера-
 
      торы для создания типа данных PATTERN, который запоминается
 
      в переменной MY_PAT. Эта переменная затем  используется  во
 
      встроенной  процедуре  SEARCH  для  поиска  в   направлении


                                - 41 -
 
                          00152-01 34 04-1
 
 
      FORWARD (вперед). Если SEARCH находит подходящую  пару  для
 
      MY_PAT, то диапазон этого найденного текста запоминается  в
 
      переменной MATCH_RANGE. Встроенная процедура POSITION пере-
 
      мещает текущую позицию в начало MATCH_RANGE:
 
 
      MY_PAT:=('ABC' ! 'DEF') & '::';
 
      MATCH_RANGE:= SEARCH (MY_PAT, FORWARD);
 
      POSITION (MATCH_RANGE);
 
 
 
           3.8.1. Шаблонные встроенные процедуры
 
 
           Данные типа PATTERN возвращают в  качестве  результата
 
      своей работы следующие встроенные процедуры:
 
           ANY - создает шаблон, совпадающий с любым из  символов
 
      строки, указанной в качестве параметра;
 
           ARB - создает шаблон, совпадающий с  любой  последова-
 
      тельностью символов заданной длины;
 
           LINE_BEGIN - создает шаблон,  совпадающий  с  условием
 
      начала строки;
 
           LINE_END - создает шаблон, совпадающий с условием кон-
 
      ца строки;
 
           MATCH - создает шаблон, совпадающий  с  последователь-
 
      ностью символов, начинающуюся с текущей позиции; использует
 
      строку, переданную ей в качестве параметра;
 
           NOTANY - создает шаблон, совпадающий с любым символом,
 
      не входящим в строку, указанную параметром;
 
           REMAIN - создает шаблон, совпадающий со строкой, начи-
 
      нающейся с текущей позиции и продолжающейся до конца  теку-
 
      щей строки;
 
           SCAN - создает шаблон, совпадающий со  строкой  макси-
 
      мальной длины, которая не содержит  ни  одного  символа  из


                                - 42 -
 
                          00152-01 34 04-1
 
 
      строки, заданной в качестве параметра;
 
           SCANL - выполняется аналогично SCAN, но  ей  разрешено
 
      пересекать границы записей;
 
           SPAN - создает шаблон, совпадающий со  строкой  макси-
 
      мальной длины, содержAщей только те символы, которые есть в
 
      строке, заданной в качестве параметра;
 
           SPANL - выполняется аналогично SPAN, но  ей  разрешено
 
      пересекать границы записей.
 
 
 
           3.8.2. Шаблонные операторы
 
 
           В языке TPU имеются следующие шаблонные операторы:
 
           1) оператор дизьюнкции (!);
 
           2) оператор конкатенации (&);
 
           3) оператор присваивания части шаблона (@).
 
           Шаблонные операторы имеют одинаковый приотитет.
 
 
 
           3.8.2.1. Оператор дизьюнкции
 
 
           Оператор дизьюнкции  указывает,  что  любые  элементы,
 
      разделенные знаком дизьюнкции (!), соответствуют  создавае-
 
      мому шаблону. Например, если текущий символ есть  'А',  или
 
      'В', или 'С', то он совпадает с шаблоном PAT_1,  определен-
 
      ным следующим образом:
 
 
      PAT_1: = ('A' ! 'B' ! 'С');
 


                                - 43 -
 
                          00152-01 34 04-1
 
 
           3.8.2.2. Оператор конкатенации
 
 
           Оператор конкатенации  указывает,  что  все  элементы,
 
      связанные знаком конкатенации (&), должны появляться в  том
 
      порядке, как это задано оператором  при  создании  шаблона.
 
      Например, символы 'АВС' будут совпадать  с  шаблоном  PAT2,
 
      определенным следующим образом:
 
 
      PAT2:= ('А' & 'В' & 'С')
 
 
 
           3.8.2.3. Оператор присваивания части шаблона
 
 
           Оператор присваивания части шаблона создает  некоторый
 
      диапазон, содержащий символы шаблона, для которого уже было
 
      совпадение. Если этот оператор (@) поставить  перед  именем
 
      переменной, то в ней  будет  диапазон  симолов  совпадения.
 
      Например, переменная WHATCHAR содержит  некоторый  диапазон
 
      символов, которые уже найдены по  шаблону  процедурой  ANY.
 
      Если следующая позиция символа в строке, в которой происхо-
 
      дит поиск, содержит символ 'D'  и  если  WHATCHAR  содержит
 
      совпавший символ из предыдущего выражения, то  этот  шаблон
 
      совпадает:
 
 
      PAT3:=ANY ('ABC') @WHATCHAR & 'D';
 
           Часто бывает так, что  хотя  символическая  последова-
 
      тельность формирует шаблон поиска, но  из  него  необходима
 
      лишь подстрока в диапазоне, который  возвращает  встроенная
 
      процедура SEARCH. В этом случае используется оператор прис-
 
      ваивания части шаблона (@) для назначения диапазонов частям
 
      шаблона. Например, присваивание части шаблона можно исполь-
 
      зовать для сохранения элементов, которые уже были  подобра-
 
      ны, в переменной NUMBER:


                                - 44 -
 
                          00152-01 34 04-1
 
 
      ! найти следующее локальное символьное определение
 
        PAT_1:= SPAN('0123456789') @NUMBER & "$:";
 
           По шаблону PAT_1 может быть найдена строка 12$:.  Пос-
 
      кольку только переменная NUMBER  представляет  интерес,  то
 
      @NUMBER заставляет записать уже совпавшие элементы в диапа-
 
      зон.
 
 
 
           3.8.3. Компиляция и выполнение шаблонов
 
 
           Компиляция шаблонного выражения приводит к  тому,  что
 
      утилита строит некоторое представление  шаблона,  пригодное
 
      для использования во  время  работы  программы.  Выполнение
 
      шаблонного оператора приводит к тому, что утилита назначает
 
      тип данных PATTERN переменной в левой части оператора прис-
 
      ваивания.
 
           Например, следующий шаблон назначается переменной PAT1
 
      во время выполнения:
 
 
      PAT1:=LINE_END & 'ENDIF';! конец строки за ENDIF
 
 
           После  компиляции  шаблонного  оператора   переменная,
 
      представляющая шаблон, может быть использована как параметр
 
      во встроенной процедуре поиска SEARCH.  Любой  поиск  начи-
 
      нается с текущей позиции символа. Если  поиск  успешен,  то
 
      SEARCH возвращает некоторый диапазон. Встроенная  процедура
 
      SEаRCH не перемещает курсор  (текущую  позицию  символа)  в
 
      указанный ею диапазон. Для перемещения на  позицию  первого
 
      символа,  указанного  диапазоном,  необходимо  использовать
 
      процедуру POSITION, передав ей требуемый диапазон в качест-
 
      ве параметра, например:
 


                                - 45 -
 
                          00152-01 34 04-1
 
 
      FOUND_RANGE:=SEARCH (PAT1, FORWARD, EXАCT);
 
      POSITION (FOUND_RANGE);
 
 
 
           3.8.4. Режимы поиска по шаблону
 
 
           В утилите существуют прямой и последовательный способы
 
      поиска по шаблону. Характеристикой, которая отличает прямой
 
      поиск от последовательного, является способ анализа  частей
 
      шаблона, сформированных оператором дизьюнкции.
 
           Поиск подстроки по шаблону продолжается  до  тех  пор,
 
      пока она не будет найдена или пока не будет исчерпано  поле
 
      поиска. Поиск начинается от текущего  символа;  если  поиск
 
      еще не завершен, то номер текущей позиции символа  увеличи-
 
      вается на  единицу  (при  поиске  в  направлении  вперед  -
 
      FORWARD) или уменьшается на единицу  (при  поиске  назад  -
 
      REVERSE).
 
           Можно запретить перемещение области поиска по  буферу;
 
      для  этого  необходимо  использовать  встроенную  процедуру
 
      ANCHOR, которая закрепляет область поиска за текущим симво-
 
      лом. Встроенная процедура  ANCHOR  должна  быть  указана  в
 
      самом начале шаблонного выражения. Например, при  использо-
 
      вании шаблона Х=ANCHOR & ('A' ! 'B' ! 'C') в качестве пара-
 
      метра при обращении к встроенной процедуре SEARCH,  утилита
 
      проверяет наличие 'A', начиная от текущего положения симво-
 
      ла; если не найдено, то проверяет появление 'В' (в  том  же
 
      месте); если не найдено, то проверяет появление  'С'.  Если
 
      не найден ни один из этих символов, то поиск считается неу-
 
      дачным.
 


                                - 46 -
 
                          00152-01 34 04-1
 
 
           3.8.4.1. Прямой поиск
 
 
           Прямой поиск по шаблону является режимом по  умолчанию
 
      для встроенной процедуры SEARCH; это  наиболее  эффективный
 
      метод поиска при большом числе символов. Вместо того, чтобы
 
      осуществлять поиск по всему шаблону с каждой  позиции,  при
 
      прямом поиске проверяется только первый элемент  шаблона  с
 
      текушей позиции. Если нет совпадения для первого  элемента,
 
      то текущая позиция увеличивается на единицу и утилита опять
 
      проверяет первый элемент в  шаблоне.  Когда  найдено  соот-
 
      ветствие для первого элемента, то утилита проверяет  остав-
 
      шуюся часть шаблона. Если не найдено совпадение для первого
 
      элемента и для оставшейся части шаблона, то утилита возвра-
 
      щается в начальную позицию и  начинает  проверку  части  со
 
      второго элемента шаблона и т.д.
 
           Например, если шаблон  Х:=('А'!'В'!'С')  &'D'  исполь-
 
      зуется как параметр для  встроенной  процедуры  SEARCH,  то
 
      утилита проверяет первое появление 'АD' в буфере; если сим-
 
      вол не найден, то проверяет появление 'ВD' в  буфере;  если
 
      символ не найден, то проверяет появление 'СD' в буфере.  По
 
      этому шаблону первым совпадением в  строке  'СDВDАD'  будет
 
      'АD', хотя 'СD' и 'ВD' предшествуют 'АD'.
 
 
 
           3.8.4.2. Последовательный поиск
 
 
           Последовательный поиск по шаблону означает, что утили-
 
      та проверяет весь шаблон от текущей позиции  символа;  если
 
      поиск неудачен, то текущая позиция символа увеличивается на
 
      единицу и опять проверяется весь шаблон и т.д. До тех  пор,
 
      пока не будет найдено соответствие  шаблону  или  не  будет
 
      исчерпан буфер.


                                - 47 -
 
                          00152-01 34 04-1
 
 
           Указать последовательный режим поиска вместо принятого
 
      по умолчанию прямого можно, если использовать оператор кон-
 
      катенации (&) непосредственно перед шаблоном. Один из  спо-
 
      собов сделать это - поставить нулевую  строку,  за  которой
 
      следует знак '&', а потом шаблон для поиска.
 
           Например, шаблон Х:=''&('А'!'В'!'С')&'D', указанный  в
 
      качестве параметра для встроенной процедуры SEARCH, перево-
 
      дит утилиту в режим последовательного поиска. Утилита  про-
 
      веряет, начиная от текущего положения, наличие  'АD';  если
 
      не найдено, то проверяет наличие 'BD', затем 'СD'; если  не
 
      найдено, то  перемещается  на  следующую  позицию  и  снова
 
      используется полный шаблон. В строке 'АDВDСD' первым  будет
 
      подобран символ 'СD', т.к. Каждый  символ  в  дизьюнктивном
 
      шаблоне должен быть проверен перед передвижением на следую-
 
      щую позицию символа для поиска.
 
           Обычно число символов в буфере достаточно велико, поэ-
 
      тому для поиска по всему буферу последовательный  поиск  не
 
      так эффективен, как прямой. Если же построить  шаблон  так,
 
      что его первый элемент не содержит оператора дизьюнкции (!)
 
      или если используется встроенная процедура ANY вместо него,
 
      то должен использоваться последовательный поиск.
 
 
                           
           3.8.5. Шаблонные переменные
 
 
           Можно использовать переменную, с которой связан  неко-
 
      торый шаблон, для формирования  нового  шаблона.  Например,
 
      шаблон РАT1 является частью РАТ2:
 
 
      РАТ1:=('А'&'В'&'С');
 
      РАТ2:='123'& РАТ1 & 'DEF';
 
 


                                - 48 -
 
                          00152-01 34 04-1
 
 
           Работа с начальным шаблоном приостанавливается,  когда
 
      встретится вложенный шаблон; символы, которые уже  совпали,
 
      сохраняются; вложенный шаблон обрабатывается; после  завер-
 
      шения обработки вложенного шаблона  продолжается  обработка
 
      начального шаблона. Обработка начального шаблона может про-
 
      должаться с позиции  символа,  который  явился  результатом
 
      обработки вложенного шаблона.
 
           Например, вложенный шаблон PAT2 используется для поис-
 
      ка подстроки в тексте 'ХХХYYYIZZZABCDEF':
 
 
      PAT1:='ABC'&'DEF';
 
      PAT2:='I' & PAT1;
 
 
      для РАТ2 будет подобран текст "IZZZABCDEF".
 
           Совпавшие символы по шаблону РАТ1 могут не быть  смеж-
 
      ными с первой частью шаблона РАТ2. Если  необходимо  подоб-
 
      рать смежные символы, то нужно использовать встроенную про-
 
      цедуру ANCHOR в начале РАТ1. Процедура ANCHOR не  допускает
 
      прослеживания шаблона далее текущего символа во время  про-
 
      цесса подбора. Например, вложенный шаблон PAT2 не  приведет
 
      к удачному поиску в  текстовой  строке  'XXXYYYIZZZABCDEF',
 
      т.к. Он требует поиска непрерывной подстроки 'IABCDEF':
 
 
      PAT1:=ANCHOR&'ABC' & 'DEF';
 
      PAT2:='I' & PAT1;
 
 
           Шаблонные переменные и вложенные  шаблоны  могут  быть
 
      использованы для реализации  поиска  с  символом  обобщения
 
      (групповая операция).
 
           Примечание. Не допускается создание  рекурсивных  шаб-
 
      лонных определений, например:
 


                                - 49 -
 
                          00152-01 34 04-1
 
 
      ! Недопустимое шаблонное выражение
 
      РАТ1:='АВС' & РАТ1;
 
 
 
           3.9. PROGRAM
 
 
           Тип данных PROGRAM (программа) - это набор выполняемых
 
      операторов  языка  TPU.  Встроенные  процедуры  COMPILE   и
 
      LOOKUP_KEY возвращают  тип  данных  PROGRAM  как  результат
 
      своей работы. Например, переменной х назначается тип данных
 
      PROGRAM:
 
 
         X:=COMPILE(MAIN_BUFFER)
 
 
           Буфер, с которым связана переменная MAIN_BUFFER,  дол-
 
      жен содержать только определения процедур языка  утилиты  и
 
      выполняемые  операторы.  Все  определения  процедур  должны
 
      появляться перед любым выполняемым оператором, не  включен-
 
      ным в процедуру. Эти процедуры и операторы компилируются, и
 
      результирующая программа запоминается в переменной с именем
 
      х.
 
 
 
           3.10. PROCESS
 
 
           Тип данных PROCESS (процесс) представляет собой  подп-
 
      роцесс в МОС ВП. Встроенная процедура CREATE_PROCESS  возв-
 
      ращает этот тип данных как результат своей работы.
 
           Процессы языка TPU имеют те же самые ограничения,  что
 
      и подпроцессы в МОС ВП, например, следующие:
 
           1) квота системного  подпроцесса,  определяющая  коли-
 
      чество создаваемых процессов в утилите;
 
           2) только те утилиты МОС ВП, которые могут быть  запу-
 
      щены через почтовый ящик и могут выполнять  простое  чтение


                                - 50 -
 
                          00152-01 34 04-1
 
 
      или запись (например, MAIL), могут быть запущены  как  про-
 
      цессы в утилите. Программы FMS, EDT, PHONE и другие процес-
 
      сы, полностью управляющие экраном, не могут правильно рабо-
 
      тать в качестве процесса в рамках языка TPU;
 
           3) не существует возможности  получения  подсказки  от
 
      используемой утилиты в рамках процесса TPU. Например,  ути-
 
      литу MAIL можно использовать,  хорошо  зная  последователь-
 
      ность ее подсказок; ее подсказка "MAIL" не будет видна.
 
           Пример.
 
           Переменной X присваивается тип данных PROCESS:
 
           X:=CREATE_PROCESS(MAIN_BUFFER, 'MAIL');
 
           Первый параметр определяет, что вывод подпроцесса дол-
 
      жен быть записан в буфер MAIN_BUFFER. Строка 'MAIL' являет-
 
      ся первой командой, которая посылается подпроцессу.
 
           Для  посылки  последовательности  команд   подпроцессу
 
      используется встроенная процедура SEND:
 
           SEND('MAIL',X)
 
           Например, чтобы послать  команду  READ  утилите  MAIL,
 
      следует ввести следующую команду утилиты TPU:
 
           SEND ('READ',X)
 
           Выводная информация по  команде  READ  запоминается  в
 
      буфере, который ассоциирован с подпроцессом х. Если  буфер,
 
      связанный с подпроцессом,  уничтожается,  то  и  подпроцесс
 
      уничтожается.
 


                                - 51 -
 
                          00152-01 34 04-1
 
 
           3.11. LEARN
 
 
           Тип данных LEARN представляет собой набор кодов  нажа-
 
      тых на клавиатуре терминала клавиш в процессе работы с ути-
 
      литой. Встроенная процедура LEARN_BEGIN запускает сбор этих
 
      кодов, а встроенная процедура LEARN_END заканчивает сбор  и
 
      возвращает тип данных LEARN  как  результат  своей  работы.
 
      Например, переменной х присваивается тип данных LEARN:
 
      LEARN_BEGIN (EXACT)
 
      X:=LEARN_END;
 
           Все коды нажатых клавиш,  которые  имели  место  между
 
      вызовами встроенных процедур LEARN_BEGIN и LEARN_END, запо-
 
      минаются в переменной Х. Ключевое слово (EXACT) задает, что
 
      при  повторении  собранной  последовательности   ввод   для
 
      встроенных процедур READ_CHAR, READ_KEY  и  READ_LINE  тоже
 
      будет автоматически повторен и будет введена  та  же  самая
 
      инжформация, что и при сборе обучающей  последовательности.
 
      Если задать ключевое слово NO_EXACT, то  повтор  встроенных
 
      процедур READ_LINE, READ_KEY и READ_CHAR  внутри  обучающей
 
      последовательности будет предполагать новый ввод.
 
 
 
 
                     4. Лексические элементы TPU
 
 
 
           Любая программа на языке TPU  состоит  из  лексических
 
      элементов. Лексический элемент  может  быть  как  отдельным
 
      символом (например, арифметическим оператором), так и груп-
 
      пой символов (например,  любым  идентификатором).  Основной
 
      единицей  любого  лексического  элемента  является   символ
 
      KOИ-8. В языке TPU различаются следующие  лексические  эле-
 
      менты:


                                - 52 -
 
                          00152-01 34 04-1
 
 
           1) набор символов;
 
           2) идентификаторы;
 
           3) переменные;
 
           4) константы;
 
           5) операторы;
 
           6) выражения;
 
           7) зарезервированные слова.
 
 
 
           4.1. Набор символов
 
 
           Набор  символов  КОИ-8  представляет  собой  множество
 
      из 256 символов с восьмиразрядными кодами.  Любому  символу
 
      поставлено в соответствие некоторое десятичное  число.  Эти
 
      числа изменяются в диапазоне от 0 до 255. Бсе символы могут
 
      быть разделены по следующим группам:
 
           1) коды от  0  до 31 представляют непечатаемые символы
 
      (например, табуляция, перевод строки, возврат каретки, зву-
 
      ковой сигнал);
 
           2) Kод 32-пробел;
 
           3) коды от  33  до 64 являются специальными символами;
 
      например, амперсанд  (&), символ вопроса  (?), знак  равен-
 
      ства (=), цифры от 0 до 9;
 
           4) коды от  65  до 122 представляют символы верхнего и
 
      нижнего регистров букв латинского алфавита;
 
           5) коды от 123 до 126 являются специальными символами;
 
           6) Kод 127-забой;
 
           7) коды  от  128  до 159 - символы расширенного
 
      управления;
 
           8) код 160-резерв;
 
           9) коды от 161 до 175 являются  дополнительными специ-
 


                                - 53 -
 
                          00152-01 34 04-1
 
 
      альными графическими символами;
 
           10) коды от 176  до  240 являются символами верхнего и
 
      нижнего регистров букв русского алфавита;
 
           11) код от 241 до 255 - резерв.
 
           Компилятор языка TPU не различает символы  верхнего  и
 
      нижнего регистра, кроме случая, когда они появляются внутри
 
      строки, заключенной в кавычки.
 
 
 
           4.1.1. Ввод управляющих символов
 
 
           Существует два способа для ввода управлящих символов:
 
           1) использование встроенной процедуры ASCII с десятич-
 
      ным значением кода управляющего символа, который необходимо
 
      ввести. Например, COPY_TEXT(ASCII (27)) приведет к  вводу в
 
      текущий буфер символа ESCAPE;
 
            2)  использование  специальных функций, которые обес-
 
      печиваются  редактором  EVE  или эмулятором клавиатуры EDT
 
      для ввода управляющих символов.
 
 
 
           4.1.2. Символы языка TPU
 
 
           Определенные символы в  языке  TPU  имеют  специальное
 
      назначение. Они могут использоваться как разделитель опера-
 
      торов (;), операндов (+) и других синтаксических элементов.
 
      Символы, составленные из нескольких букв,  не  могут  иметь
 
      внутренних  пробелов.  Символы  языка  TPU  представлены  в
 
      табл. 2.
 


                                - 54 -
 
                          00152-01 34 04-1
 
 
                                                        Таблица 2
 
                            Символы языка TPU
 
      -----------------------------------------------------------
               !
       Символ  !        Наименование
               !
       ----------------------------------------------------------
               !
        '      !   Апостроф
               !
        :=     !   Оператор присваивания
               !
        @      !   Частный шаблонный подбор
               !
        )      !   Закрывающая скобка; конец списка параметров
               !
               ! или выражения
               !
        '      !   Запятая, разделитель параметров
               !
        !      !   Ограничитель комментариев
               !
        $      !   Знак денежной единицы
               !
        =      !   Знак равенства
               !
        >      !   Больше чем
               !
        >=     !   Больше или равно
               !
        /      !   Целочисленное деление
               !
        .      !   Целочисленное умножение
               !
        [      !   Левая квадратная скобка, начало метки операто-
               !
               ! ра выбора
               !
        <      !   Меньше чем
               !
        <=     !   Меньше или равно
               !
        -      !   Минус
               !
        <>     !   Не равно
               !
        !      !   Операция шаблонной дизьюнкции
               !
        (      !   Открывающая скобка, начало списка параметров
               !
               ! или выражения
               !
        &      !   Операция шаблонной конкатенации
               !
        +      !   Плюс, операция строковой конкатенации
               !
        "      !   Кавычки


                                - 55 -
 
                          00152-01 34 04-1
 
 
                                              Продолжение табл. 2
      -----------------------------------------------------------
               !
       Символ  !        Наименование
               !
       ----------------------------------------------------------
               !
        ]      !   Правая квадратная скобка, конец метки операто-
               !
               ! ра выбора
               !
        ;      !   Точка с запятой, разделяет операторы языка
               !
               ! TPU
 
 
           4.2. Идентификаторы
 
 
           В языке TPU идентификаторы используются для именования
 
      программ, процедур, ключевых слов и переменных. Любой иден-
 
      тификатор представляет собой комбинацию букв,  цифр,  знака
 
      денежной единицы и символа подчеркивания и должен  удовлет-
 
      ворять следующим ограничениям:
 
           1) идентификатор не должен содержать пробелов и симво-
 
      лов языка TPU (кроме знака денежной единицы  и  подчеркива-
 
      ния);
 
           2) длина идентификатора не может превышать 132 знака.
 
           Идентификаторы, используемые в языке TPU для  именова-
 
      ния встроенных процедур, ключевых слов и  глобальных  пере-
 
      менных, являются зарезервированными словами и  представлены
 
      большими буквами (верхнего регистра) латинского алфавита.
 
 
 
           4.3. Переменные
 
 
           Переменные - это имена, данные  определенным  участкам
 
      памяти, содержащим значения. Имя  переменной  в  языке  TPU
 
      может быть любым  допустимым  идентификатором,  который  не
 
      совпадает с зарезервированными словами или уже определенны-
 
      ми именами процедур.  Переменной  можно  придать  значение,


                                - 56 -
 
                          00152-01 34 04-1
 
 
      если поместить допустимый идентификатор в левой части  опе-
 
      ратора присваивания, например:
 
 
      NEW_BUFFER:=CREATE_BUFFER ("NEW_BUFFER_NAME")
 
 
           В языке TPU допускается два вида переменных:  глобаль-
 
      ные и локальные. Глобальные переменные  действуют  во  всей
 
      среде, которую формирует при своей работе утилита.  Локаль-
 
      ные переменные действуют только в той процедуре, в  которой
 
      они об'явлены. Если  не  используется  оператор  LOCAL  для
 
      об'явления локальной переменной, то она по умолчанию  расс-
 
      матривается как глобальная переменная. В языке TPU нет пря-
 
      мого способа об'явления глобальных переменных.
 
 
           Пример.
 
           Процедура USER_TAB использует локальные переменные:
 
      ! Процедура клавиши табуляции. Всегда вставляет табуляцию,
 
      ! даже если текущий режим есть режим замещения символов.
 
 
 
      PROCEDURE USER_TAB
 
      LOCAL THIS_MODE;! локальная переменная
 
      !THIS_MODE  := GET_INFO (CURRENT_BUFFER, "MODE");
 
      !Сохранили текущее состояние
 
      !SET (INSERT, CURRENT_BUFFER); !установить режим ввода
 
      !COPY_TEXT (ASCII (9)); ! ввести табуляцию
 
      !SET (THIS_MODE, CURRENT_BUFFER); ! восстановить режим.
 
      !ENDPROCEDURE.
 
 
           Локальная переменная THIS_MODE будеть  иметь  установ-
 
      ленное в этой процедуре USER_TAB значение только  во  время
 
      выполнения этой процедуры. Можно использовать  это  же  имя
 
      переменной в другой процедуре и присвоить ей другое локаль-


                                - 57 -
 
                          00152-01 34 04-1
 
 
      ное значение. Не допускается  использование  THIS_MODE  как
 
      глобальной переменной, т.к. она имеет специальное  значение
 
      в процедуре USER_TAB.
 
 
 
           4.4. Константы
 
 
           В языке утилиты имеются два  типа  констант:  целые  и
 
      строковые.
 
           Целые константы могут быть  либо  одной  цифрой,  либо
 
      непрерывной цепочкой цифр.
 
           Строковые константы могут состоять из одного знака или
 
      нескольких знаков, ограниченных апострофами или кавычками.
 
 
 
           4.5. Операторы
 
 
           В языке TPU используются общепринятые символы и  знаки
 
      в качестве операторов языка. Имеется четыре  типа  операто-
 
      ров:
 
           1) арифметические;
 
           2) отношения;
 
           3) шаблонные;
 
           4) логические.
 
           В табл. 3 приведен список символов и языковых  элемен-
 
      тов, которые используются в языке TPU как операторы.
 
                                                       Таблица 3
 
                      Операторы языка TPU
 
      ----------------------------------------------------------
                     !        !
           Тип       !Oператор!         Описание
                     !        !
      ----------------------------------------------------------
                     !        !
      Целый          !   +    !   Сложение
                     !        !
                     !   +    !   Конкатенация строк


                                - 58 -
 
                          00152-01 34 04-1
 
 
                                             Продолжение табл. 3
      ----------------------------------------------------------
                     !        !
           Тип       !Oператор!         Описание
                     !        !
      ----------------------------------------------------------
                     !        !
                     !   +    !   Унарный плюс
                     !        !
      Арифметический !   -    !   Вычитание
                     !        !
                     !   -    !   Унарный минус
                     !        !
                     !   *    !   Умножение
                     !        !
                     !   /    !   Деление
                     !        !
      Отношений      !   <>   !   Не равно
                     !        !
                     !   =    !   Равно
                     !        !
                     !   <    !   Меньше
                     !        !
                     !   <=   !   Меньше или равно
                     !        !
                     !   >    !   Больше
                     !        !
                     !   >=   !   Больше или равно
                     !        !
      Шаблонный      !   !    !   Шаблонная дизьюнкция
                     !        !
                     !   &    !   Шаблонная конкатенация
                     !        !
                     !   @    !   Частное шаблонное значение
                     !        !
      Логический     !   NOT  !   Логическое отрицание
                     !        !
                     !   AND  !   Логическое и
                     !        !
                     !   OR   !   логическое или
 
           Приоритет  операторов  в  любом  выражении  определяет
 
      порядок обработки этих операторов. В табл. 4 приведен поря-
 
      док старшинства операторов языка TPU.
 
                                                        Таблица 4
 
                  Старшинство операторов TPU
 
      -----------------------------------------------------------
                                   !
             Оператор              !       Приоритет
                                   !
      -----------------------------------------------------------
                                   !
        NOT                        !  Наивысшее
                                   !


                                - 59 -
 
                          00152-01 34 04-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
                                   !
             Оператор              !       Приоритет
                                   !        
      -----------------------------------------------------------
        *,/, AND                   !
                                   !
        @,&,+,-,!,OR,унарный плюс, !
                                   !
        Унарный минус              !
                                   !
        =,<>,<,<=,>,>=             !
                                   !
        :=                         !  Низшее
 
 
           Операторы одного приоритета обрабатываются слева  нап-
 
      раво.
 
           Выражения, заключенные в скобки, вычисляются в  первую
 
      очередь. Рекомендуется использовать скобки для  правильного
 
      вычисления любого выражения, которое  об'единяет  операторы
 
      отношения. Необходимо также использовать скобки для  гаран-
 
      тии правильного использования выражений, содержащих унарный
 
      плюс и унарный минус. Например, для сложения 5  и  минус  7
 
      необходимо использовать следующую синтаксическую  конструк-
 
      цию:
 
           5 + (-7)
 
           Рекомендуется использовать скобки  в  любом  выражении
 
      для изменения порядка выполнения операторов, например:
 
           8*5/2-4     =     16
 
           8*5/(2-4)   =     -20
 


                                - 60 -
 
                          00152-01 34 04-1
 
 
           4.6. Выражения
 
 
           Любое выражение  может  быть  константой,  переменной,
 
      процедурой или комбинацией этих элементов, разделенных зна-
 
      ками операций. Выражения можно использовать в любой  проце-
 
      дуре TPU, где требуется задать идентификаторы или константы
 
      (исключая шаблоны). Выражения часто используются в условных
 
      операторах языка утилиты.
 
           Типы данных  для  любого  выражения  должны  совпадать
 
      (шаблоны и операторы отношения <> и = являются  исключением
 
      из   этого   правила).   Например,   элементы    (J>4)    и
 
      (MY_STRING='это моя строка')  рассматриваются  как  имеющие
 
      целый тип данных (целое 1 -  это  истина,  целое  0  -  это
 
      ложь), поэтому они могут быть использованы в операторе язы-
 
      ка TPU:
 
           IF (J>4) AND (MY_STRING='это моя строка')
 
              THEN
 
      !
 
      !Выполняемые операторы TPU
 
      !
 
           ENDIF;
 
           Типы данных всех элементов выражения в языке TPU долж-
 
      ны приводиться к одному и тому же типу. Утилита  не  выпол-
 
      няет неявных преобразований типа для того, чтобы  разрешить
 
      смешивание типов данных внутри выражения. Попытка  смешения
 
      типов данных приводит к сообщению об ошибке.
 
           За исключением шаблонов  результат  вычисления  любого
 
      выражения будет иметь тот же тип, что и элементы, из  кото-
 
      рых оно построено. Например, в  шаблонном  выражении  может
 
      быть использован строковый тип данных. Шаблонные встроенные
 


                                - 61 -
 
                          00152-01 34 04-1
 
 
      процедуры LINE_BEGIN и  REMAIN  используются  со  строковой
 
      константой 'THE' для того, чтобы создать тип данных PATTERN
 
      (шаблон), который затем запоминается в переменной PAT_1:
 
           PAT_1 := LINE_BEGIN&'THE' REMAIN
 
           Имеется четыре типа выражения в языке TPU:
 
           1) арифметическое;
 
           2) отношения;
 
           3) логическое или булевO;
 
           4) шаблонное.
 
 
 
           4.6.1. Арифметические выражения
 
 
           В утилите разрешено использовать арифметические опера-
 
      ции (+,-,*,/) с переменными целого  типа  для  формирования
 
      арифметических выражений. Утилита поддерживает только цело-
 
      численную арифметику (знак плюс  можно  использовать  также
 
      для об'единения строк).
 
           Примеры:
 
           1. Допустимые арифметические выражения:
 
      12 + 4         ! складываются два целых числа,
 
      'абс'+'DEF'    ! об'единяются две строки в одну.
 
           2. Недопустимое выражение (смешаны типы данных):
 
      'авс' + 12     ! не допустимо смешивать типы данных.
 
           3. При  выполнении  операции  целочисленного   деления
 
      остаток отбрасывается, а не округляется. Результаты  опера-
 
      ции деления:
 
       39/10   =    3
 
      -39/10   =   -3
 


                                - 62 -
 
                          00152-01 34 04-1
 
 
           4.6.2. Выражения отношений
 
 
           Выражение отношения проверяет отношение между  элемен-
 
      тами одного и того же типа и выдает  целочисленный  резуль-
 
      тат. Если это отношение истинно, то результат равен 1, если
 
      оно ложно - 0.
 
           Операторы <> (не равно) и = (равно) можно использовать
 
      с любым типом данных в языке TPU.
 
           Операторы > (больше), < (меньше), >= (больше или  рав-
 
      но), <= (меньше или равно) можно использовать для сравнения
 
      целых чисел и данных типа МАRКЕR.
 
           Когда обрабатываются данные типа МАRКЕR, то эти опера-
 
      торы сравнивают позиции маркеров относительно начала  соот-
 
      ветствующего буфера.
 
 
 
           4.6.3. Булевы выражения
 
 
           Любое  булево  выражение  выдает  в  качестве   своего
 
      результата значения 'истина' или 'ложь'. В утилите значение
 
      'истина' представляется целой единицей, а значение 'ложь' -
 
      целым нулем. Логические операторы используются для  об'еди-
 
      нения нескольких выражений в одно. Анализируются все  части
 
      любого булева выражения; выражения, заключенные  в  скобки,
 
      рассматриваются в первую очередь.
 
           Пример.
 
      IF (X=12) AND (Y<>40)
 
        THEN
 
           !
 
           !выполняемые операторы
 
           !
 
      ENDIF;


                                - 63 -
 
                          00152-01 34 04-1
 
 
           4.6.4. Шаблонные выражения
 
 
           Любое шаблонное выражение состоит из  строковых  конс-
 
      тант, строковых переменных, шаблонных переменных, шаблонных
 
      процедур, об'единенных шаблонными операторами  (@,&,!)  или
 
      скобками, например:
 
      PAT_1 := LINE_BEGIN & SPAN ('0123456789') & ANY ('ABC');
 
      PAT_2 := LINE_END & ('END'!'BEGIN');
 
      PAT_3 := SCAN (';"!') & (NOTANY ("'") & LINE_END);
 
 
 
           4.7. Зарезервированные слова
 
 
           Зарезервированные слова - это слова, которые уже опре-
 
      делены в языке TPU и имеют специальное значение для  компи-
 
      лятора. Зарезервированные слова можно разделить на  следую-
 
      щие категории:
 
         1) операторы языка;
 
         2) имена встроенных процедур;
 
         3) ключевые слова;
 
         4) глобальные переменные.
 
 
 
           4.8. Операторы языка TPU
 
 
           Любая программа на языке TPU состоит из последователь-
 
      ности операторов.  Операторы  языка  управляют  действиями,
 
      которые выполняются в процедурах и в программах. Зарезерви-
 
      рованные слова, являющиеся операторами языка TPU, приведены
 
      в табл. 5.
 


                                - 64 -
 
                          00152-01 34 04-1
 
 
                                                        Таблица 5
 
                   Операторы языка TPU
 
      ----------------------------------------------------------
                      !
           Оператор   !               Назначение
                      !
      ----------------------------------------------------------
                      !
       PROCEDURE      !    Оператор заголовка процедуры
                      !
       ENDPROCEDURE   !    Оператор конца процедуры
                      !
       LOOP           !    Оператор заголовка цикла
                      !
       EXITIF         !    Оператор выхода из цикла
                      !
       ENDLOOP        !    Оператор конца цикла
                      !
       IF THEN        !    Оператор заголовка условной
                      !
                      ! конструкции
                      !
       ELSE           !    Оператор альтернативы условной
                      !
                      ! конструкции
                      !
       ENDIF          !    Оператор конца условной конструкции
                      !
       CASE FROM TO   !    Служебные слова оператора выбора
                      !
       INRANGE        !    то же
                      !
       OUTRANGE       !      "
                      !
       ENDCASE        !      "
                      !
       ON_ERROR       !    Заголовок оператора обработки ошибок
                      !
       ENDON_ERROR    !    Конец оператора обработки ошибок
                      !
       ABORT          !    Оператор аварийного завершения
                      !
       BREAK          !    Оператор "выброса"
                      !
       LOCAL          !    Оператор описания локальной
                      !
                      ! переменной
                      !
       RETURN         !    Оператор возврата


                                - 65 -
 
                          00152-01 34 04-1
 
 
           4.8.1. Оператор процедуры
 
 
           Операторы PROCEDURE и ENDPROCEDURE ограничивают группу
 
      операторов языка TPU так, что ее  можно  рассматривать  как
 
      отдельный оператор, который выполняется  последовательно  в
 
      числе прочих. Комбинация PROCEDURE - ENDPROCEDURE позволяет
 
      именовать процедуру так, что  ее  затем  можно  вызвать  из
 
      некоторой другой процедуры или из командной  строки  интер-
 
      фейса редактирования. Если  процедура  откомпилирована,  то
 
      можно вводить имя этой процедуры  в  качестве  оператора  в
 
      тело другой процедуры или вводить имя процедуры после подс-
 
      казки "TPU COMMAND:" в командной строке редактора  EVE  или
 
      эмулятора малой клавиатуры EDT.
 
           Синтаксис:
 
      PROCEDURE имя_процедуры [(список параметров)]
 
        [LOCAL именA локальных переменных процедуры]
 
        [ON_ERROR ... ENDON_ERROR]
 
        Оператор-1;
 
        Оператор-2;
 
        Оператор-N;
 
      ENDPROCEDURE
 
           Тело процедуры может включать  любые  операторы  языка
 
      TPU, за исключением оператора  PROCEDURE  (любая  процедура
 
      может включать в себя вызов другой процедуры, но не  описа-
 
      ние процедуры). Операторы LOCAL должны предшествовать  опе-
 
      раторам ON_ERROR, а операторы ON_ERROR  должны  предшество-
 
      вать телу процедуры.  Операторы,  которые  составляют  тело
 
      процедуры, должны отделяться друг от друга точкой  с  запя-
 
      той.
 


                                - 66 -
 
                          00152-01 34 04-1
 
 
           Пример.
 
           Процедура выдачи сообщения о номере версии:
 
      PROCEDURE VERSION
 
      MESSAGE ("это версия 1-020");
 
      ENDPROCEDURE;
 
 
 
           4.8.1.1. Имена процедур
 
 
           Имя процедуры может быть любым допустимым  идентифика-
 
      тором, который не является зарезервированным словом.  Пред-
 
      полагается использование некоторого  соглашения  (например,
 
      каждое имя процедуры начинается с инициалов автора),  кото-
 
      рое позволит отличать новые процедуры от  уже  существующих
 
      встроенных процедур утилиты  и  от  процедур  используемого
 
      интерфейса  редактирования.  Например,  процедура  создания
 
      двух окон может называться IS_TWO_WINDOWS. Это обеспечивает
 
      уникальность имени процедуры.
 
 
 
           4.8.1.2. Параметры процедуры
 
 
           В процедурах можно пользоваться параметрами; они могут
 
      быть параметрами ввода, вывода или теми и  другими.  Напри-
 
      мер, в процедуре INPUT_OUTPUT параметр "А" -  это  параметр
 
      ввода и одновременно - вывода, т.к. он изменяется  процеду-
 
      рой INPUT_OUTPUT; параметр "B" - параметр вывода:
 
      PROCEDURE INPUT_OUTPUT (A,B)
 
      A := A+5;
 
      B := A;
 
      ENDPROCEDURE;
 
           Диапазон действия параметров ограничен  процедурой,  в
 
      которой они  определяются.  Максимальное  число  параметров


                                - 67 -
 
                          00152-01 34 04-1
 
 
      процедуры равно 31. Однако, сумма числа параметров процеду-
 
      ры и числа локальных переменных процедуры также  равна  31,
 
      поэтому наличие локальных переменных, используемых в проце-
 
      дуре, уменьшает общее число допустимых параметров  процеду-
 
      ры.
 
           Любой параметр процедуры  -  это  некоторый  указатель
 
      места или фиктивный идентификатор, который будет замещен на
 
      некоторое конкретное значение в программе,  вызывающей  эту
 
      процедуру. Это значение, которое заменяет  параметр,  назы-
 
      вается аргументом. Выражения также могут быть  аргументами.
 
      Не существует никакой связи между именами, которые  исполь-
 
      зуются как параметры, и значениями, используемыми как аргу-
 
      менты. Все аргументы передаются по ссылке.
 
           Примеры:
 
           1. Простая процедура с двумя параметрами:
 
      ! Эта процедура складывает два целых числа.
 
      ! Параметры INT1 и INT2 будут заменяться конкретными
 
      ! значениями, указанными пользователем процедуры.
 
      ! Результат сложения будет записан в область сообщений.
 
      PROCEDURE ADD (INT1, INT2)
 
         MESSAGE (STR (INT1 + INT2));
 
      ENDPROCEDURE;
 
           Вызов процедуры ADD со значениями 5  и  6  в  качестве
 
      аргументов - ADD (5,6) -  выдает  результат  (число  11)  в
 
      буфер сообщений.
 
           2. Сложная процедура с параметрами:
 
      ! BLISS$BEGIN_BLANKS - начало строки с пробелами
 
      !
 
      ! Свяжите эту процедуру с клавишей RETURN
 
      PROCEDURE BLISS$BEGIN_BLANKS  (START_LOOP_COUNT)


                                - 68 -
 
                          00152-01 34 04-1
 
 
      LOCAL LOOP_COUNT;
 
      SPLIT_LINE;
 
      ! Пользователь предоставит это значение как параметр,
 
      ! следующий за именем процедуры.
 
      LOOP_COUNT := START_LOOP_COUNT;
 
      !+
 
      ! Начинает строку с табуляциями
 
      !-
 
      LOOP;
 
         EXITIF LOOP_COUNT < 8;
 
         COPY_TEXT (ASCII (9));
 
         LOOP_COUNT := LOOP_COUNT - 8;
 
      ENDLOOP;
 
      !+
 
      ! Добавляет пробелы до достижения целевого столбца
 
      !-
 
      LOOP;
 
          EXITIF LOOP_COUNT = 0;
 
          COPY_TEXT (' ');
 
          LOOP_COUNT := LOOP_COUNT - 1;
 
      ENDLOOP;
 
      ENDPROCEDURE;
 
 
 
           4.8.1.3. Функциональные процедуры
 
 
           Процедуры, которые выдают результат (возвращают  неко-
 
      торое значение),  называются  функциональными  процедурами.
 
      Например, процедура USER_ON_END_OF_LINE возвращает значение
 
      истина (целая 1) или ложь (целый 0):
 


                                - 69 -
 
                          00152-01 34 04-1
 
 
      PROCEDURE USER_ON_END_OF_LINE  !проверка на конец строки
 
      IF CURRENT_OFFSET = LENGTH (CURRENT_LINE)! конец строки
 
         THEN
 
           USER_ON_END_OF_LINE := 1  !возвращает значение истина
 
         ELSE
 
           USER_ON_END_OF_LINE := 0  !возвращает значение ложь
 
      ENDIF;
 
      ENDPROCEDURE;
 
 
           Другим способом присвоения значений 0  и  1  некоторой
 
      процедуре является  использование  оператора  RETURN  языка
 
      TPU, за которым следует значение.
 
           Можно использовать любую  функциональную  процедуру  в
 
      любом условном операторе для проверки сложившихся  условий.
 
      Например, можно использовать процедуру  USER_ON_END_OF_LINE
 
      внутри другой процедуры:
 
      PROCEDURE
 
         !
 
         ! Операторы процедуры
 
         !
 
      IF
 
         USER_ON_END_OF_LINE = 1  ! курсор в конце строки
 
         THEN
 
           MESSAGE ("курсор в конце строки")
 
         ELSE
 
           MESSAGE ("курсор не находится в конце строки")
 
      ENDIF;
 
         !
 
         ! Операторы процедуры
 
         !
 


                                - 70 -
 
                          00152-01 34 04-1
 
 
      ENDPROCEDURE;
 
 
 
           4.8.1.4. Рекурсивные процедуры
 
 
           Процедуры, вызывающие сами себя, называются  рекурсив-
 
      ными процедурами. Например, процедура USER_REVERSE  отобра-
 
      жает  список  ответов  на  запросы   встроенной   процедуры
 
      READ_LINE в обратном порядке; в теле процедуры USER_REVERSE
 
      имеется вызов процедуры USER_REVERSE:
 
 
      PROCEDURE USER_REVERSE
 
      LOCAL TEMP_STRING;
 
      TEMP_STRING:= READ_LINE (INPUT>); !читать ответ
 
      IF TEMP_STRING <>"         !прекратить работу, если ничего
 
                                 !не введено, кроме RETURN
 
         THEN USER_REVERSE       !рекурсивный вызов USER_REVERSE
 
         ELSE RETURN             !все сделано, перейти на
 
                                 !отображение строк
 
      ENDIF;
 
      MESSAGE (TEMP_STRING);     !отобразить введенные
 
                                 !строки в обратном порядке
 
                                 !в окне для сообщений
 
      ENDPROCEDURE;
 
 
 
           4.8.1.5. Локальные переменные
 
 
           В процедуре разрешено пользоваться локальными перемен-
 
      ными. Используемые локальные переменные сохраняют  присвае-
 
      мые им значения только внутри той процедуры, в которой  они
 
      об'явлены. Максимальное  число  локальных  переменных  рав-
 
      но 31. Однако, максимальное количество  локальных  перемен-
 


                                - 71 -
 
                          00152-01 34 04-1
 
 
      ных, и параметров процедуры тоже равно  31;  следовательно,
 
      число параметров процедуры уменьшает число локальных  пере-
 
      менных, допустимых для использования.
 
           Синтаксис:
 
      LOCAL имя_переменной [,...];
 
 
 
           4.8.1.6. Обработка ошибок
 
 
           В  языке   TPU   разрешается   использовать   оператор
 
      ON_ERROR, определяющий действие или действия, которые необ-
 
      ходимо проделать при  получении  кода  ERROR  (ошибка)  или
 
      WARNING (предупреждение). Использование оператора  ON_ERROR
 
      предполагает его расположение  в  самом  начале  процедуры,
 
      сразу после оператора LOCAL.
 
 
 
           4.8.2. Оператор присваивания
 
 
           Оператор присваивания приписывает  некоторое  значение
 
      переменной. При этом  переменной  назначается  тип  данных,
 
      соответствующий указанному в операторе значению.
 
           Синтаксис:
 
      Идентификатор := выражение;
 
           Собственно оператор  присваивания  представляет  собой
 
      об'единение двух символов (:=); не следует путать этот опе-
 
      ратор со знаком равенства (=), представляющим собой  опера-
 
      тор отношения для проверки равенства.
 
           При обработке оператора  присваивания  не  выполняется
 
      проверок типа для конкретного типа данных; любой тип данных
 
      может быть связан с любой переменной,  а  точнее  с  именем
 
      переменной.
 


                                - 72 -
 
                          00152-01 34 04-1
 
 
           Пример.
 
           Х := 'АВС' ;
 
      В переменную Х записывается строка 'АВС'
 
 
 
           4.8.3. Оператор цикла
 
 
           Оператор  цикла  LOOP-ENDLOOP   задает   повторяющееся
 
      исполнение оператора или операторов до  тех  пор,  пока  не
 
      сложатся условия, заданные с помощью EXITIF.
 
           Синтаксис:
 
      LOOP
 
      Оператор-1;
 
      Оператор-2;
 
      ! и т.д.
 
      EXITIF выражение;
 
      Оператор-N;
 
      ENDLOOP;
 
           Оператор EXITIF является средством  выхода  из  цикла.
 
      Любой оператор, расположенный внутри цикла, может  привести
 
      к неявному выходу из цикла, если создает ситуацию появления
 
      ошибки. Можно разместить оператор EXITIF в любом месте меж-
 
      ду LOOP и ENDLOOP и использовать его необходимое число раз.
 
      Когда условие в операторе  EXITIF  истинно,  то  происходит
 
      переход на оператор, следующий за оператором ENDLOOP.
 
           Между LOOP и ENDLOOP может располагаться любой  опера-
 
      тор языка TPU, за исключением операторов PROCEDURE,  LOCAL,
 
      ON_ERROR. Глубина вложения операторов LOOP и  ENDLOOP  рав-
 
      на 20.
 


                                - 73 -
 
                          00152-01 34 04-1
 
 
           Пример.
 
      LOOP
 
          EXITIF CURRENT_OFFSET = 0;
 
          TEMP_STRING :=CURRENT_CHARACTER;
 
          EXITIF (TEMP_STRING <>" ") AND
 
                 (TEMP_STRING <> ASCII (9));
 
          NOVE_HORIZONTAL (-1);
 
          TEMP_LENGTH := TEMP_LENGTH + 1;
 
      ENDLOOP;
 
           Эта процедура использует  оператор  EXITIF  два  раза.
 
      Каждое выражение, следующее за EXITIF, определяет  условия,
 
      вызывающие выход из цикла. Операторы в цикле  будут  повто-
 
      ряться до тех пор, пока не выполнится хотя бы одно из усло-
 
      вий, заданых операторами EXITIF.
 
 
 
           4.8.4. Оператор условия
 
 
           Оператор условия IF-THEN вызывает выполнение оператора
 
      или группы операторов в зависимости от значения  некоторого
 
      булева выражения; если булево выражение истинно, то  опера-
 
      тор выполняется; в противном случае  програмное  управление
 
      передается оператору, который следует за оператором  ENDIF,
 
      задающим конец условного оператора, или ELSE (если он  при-
 
      сутствует).
 
           Необязательная конструкция ELSE задает  альтернативную
 
      группу операторов для выполнения. Эта  группа  выполняется,
 
      если  проверка   условия,   специфицированного   оператором
 
      IF-THEN, дает значение ложь.
 


                                - 74 -
 
                          00152-01 34 04-1
 
 
           Синтаксис:
 
      IF выражение
 
         THEN оператор-1;
 
              оператор-2;
 
              ! и т.д.
 
 
 
         [ELSE альтернативный-оператор-1;
 
               альтернативный-оператор-2;
 
               ! и т.д.]
 
 
 
      ENDIF;
 
           Можно использовать любой оператор языка TPU после THEN
 
      или  ELSE,  за  исключением  операторов  PROCEDURE,  LOCAL,
 
      ON_ERROR. Глубина вложения условных операторов равна 20.
 
           Пример.
 
           Вложенные операторы IF-THEN-ELSE проверяют направление
 
      в буфере, которое должно быть либо FORWARD, либо REVERSE:
 
 
      PROCEDURE SET_DIRECT
 
      MESSAGE ('нажмите PF4 или PF5 для задания направления');
 
      TEMP_CHAR := READ_KEY;
 
      IF TEMP_СHAR = KP5
 
         THEN SET (REVERSE, CURRENT_BUFFER);
 
         ELSE
 
            IF TEMP_CHAR = KP4
 
               THEN SET (FORWARD, CURRENT_BUFFER);
 
            ENDIF;
 
      ENDIF;
 
      ENDPROCEDURE
 


                                - 75 -
 
                          00152-01 34 04-1
 
 
           4.8.5. Оператор выбора
 
 
           Оператор выбора CASE -  это  некоторая  структура  для
 
      выбора управления, позволяющая  перечислить  альтернативные
 
      действия и выбрать одно из них для исполнения. В  операторе
 
      CASE постоянные значения, называемые метками выбора, связы-
 
      ваются операторами  или  действиями.  Когда  обрабатывается
 
      оператор CASE, то  выполняются  операторы,  помеченные  тем
 
      значением, которое соответствует значению переменной выбора
 
      (селектор) оператора CASE.
 
           Синтаксис:
 
      CASE селектор FROM минимальная_константа то максимальная
 
         [константа-1] : оператор;
 
         [константа-2] : оператор;
 
         ! и т.д.
 
         [константа-N] : оператор;
 
           [INRANGE] : оператор;
 
              [OUTRANGE] : оператор;
 
      ENDCASE;
 
           Примечание. Квадратные  скобки  являются  обязательной
 
      частью оператора CASE.
 
           Константы оператора CASE могут быть ключевыми словами,
 
      строковыми константами длиной в один символ или целыми чис-
 
      лами. В операторе CASE можно использовать  две  специальные
 
      константы: INRANGE (в диапазоне) и OUTRANGE  (вне  диапазо-
 
      на). На константу INRANGE переход осуществляется в том слу-
 
      чае, если значение селектора попало  в  ди[5~зон  оператора
 
      CASE (т.е. Заключено между минимальной и максимальной конс-
 
      тантой), но не совпало  ни  с  одной  константой  оператора
 
      выбора; на константу OUTRANGE переход осуществляется в  том
 


                                - 76 -
 
                          00152-01 34 04-1
 
 
      случае, если значение селектора не попало в диапазон опера-
 
      тора CASE. Эти две специальные константы CASE являются нео-
 
      бязательными элементами. Глубина вложения  операторов  CASE
 
      равна 20.
 
           Пример.
 
           В операторе CASE сравниваются значение селектора конс-
 
      тант ANSWERS с помеченными константами (числа от 0 до  10).
 
      Если значение ответа  (ANSWERS)  представляет  собой  число
 
      от 0 до 10, то выполняется оператор, стоящий справа от это-
 
      го числа.  Если  значение  ответа  находится  вне  диапазо-
 
      на 0-10, то выполняется оператор, стоящий справа  от  конс-
 
      танты  OUTRANGE.  Значение  переменной  SCORE  выводится  в
 
      область сообщений после выполнения оператора CASE:
 
 
      PROCEDURE GRADES
 
      ANSWERS := READ_LINE ('число правильных ответов?:',5);
 
      ANSWERS := INT (ANSWERS);
 
      CASE ANSWERS FROM 0 TO 10
 
                         [10] : SCORE := 'A+';
 
                          [9] : SCORE := 'A';
 
                          [8] : SCORE := 'B';
 
                          [7] : SCORE := 'C';
 
                          [6] : SCORE := 'D';
 
                [0,1,2,3,4,5] : SCORE := 'F';
 
                   [OUTRANGE] : SCORE := 'неверный ввод';
 
      ENDCASE;
 
      MESSAGE (SCORE);
 
      ENDPROCEDURE;
 


                                - 77 -
 
                          00152-01 34 04-1
 
 
           4.8.6. Операторы обработки ошибок
 
 
           Операторы  обработки  ошибок  ON_ERROR  и  ENDON_ERROR
 
      определяют действия, которые должны иметь  место  в  случае
 
      неудачного  выполнения  процедуры.  Комбинация  ON_ERROR  и
 
      ENDON_ERROR является необязательной частью процедур в языке
 
      TPU. Эти операторы перехватывают значения кодов  завершений
 
      типа WARNING и ERROR.
 
           Если состояние WARNING перехвачено некоторым  операто-
 
      ром ON_ERROR, то подавляется вывод предупреждающего сообще-
 
      ния. Если перехвачен статус типа  ERROR,  то  сообщение  об
 
      ошибке отображается, но такой перехват позволяет произвести
 
      дополнительную обработку ошибок хотя бы и после  того,  как
 
      сообщение об ошибке отображено.
 
           Синтаксис:
 
      ON_ERROR
 
      Оператор-1;
 
      Оператор-2;
 
      ! и т.д.
 
      Оператор-N;
 
      ENDON_ERROR;
 
           Оператор ON_ERROR должен быть расположен в начале про-
 
      цедуры  (после  списка  параметров  процедуры  или   списка
 
      локальных переменных, если они присутствуют  в  процедуре),
 
      перед телом процедуры.  Операторы  обработки  ошибок  могут
 
      содержать в себе любой оператор языка утилиты, за  исключе-
 
      нием операторов PROCEDURE, LOCAL, ON_ERROR.
 
           Существуют две зарезервированные  глобальные  перемен-
 
      ные, которые могут быть включены  в  операторы  ON_ERROR  и
 
      ENDON_ERROR: ERROR_LINE и ERROR. Этим двум переменным прис-
 


                                - 78 -
 
                          00152-01 34 04-1
 
 
      ваиваются значения, когда  процедура  возвращает  состояние
 
      ошибки (ERROR)  или  предупреждения  (WАRNING).  Переменная
 
      ERROR_LINE содержит номер строки, в которой появилась ошиб-
 
      ка или к которой относится некоторое предупреждение.  Пере-
 
      менная ERROR  содержит  ключевое  слово,  которое  кодирует
 
      ошибку или предупреждение.
 
           После выполнения оператора обработки ошибок можно выб-
 
      рать точку продолжения выполнения программы. Для этого есть
 
      следующие возможности:
 
           1) ABORT - оператор приводит к выходу из интерпретато-
 
      ра;
 
           2) RETURN - оператор осTанавливает выполнение процеду-
 
      ры, в которой появилась ошибка,  но  продолжает  выполнение
 
      остальной части программы.
 
           Если операторы АBORT или RETURN не заданы, то по умол-
 
      чанию, продолжается выполнение  программы  после  точки,  в
 
      которой имело место ошибка.
 
           Пример.
 
           Операторы обработки ошибок в начале процедуры  возвра-
 
      щают управление тому, кто их вызвал; если ввод в  командной
 
      строке некоторого интерфейса  некорректен  или  оператор  в
 
      теле процедуры выдает состояние ошибки или  предупреждения,
 
      то будет выполняться оператор обработки ошибок:
 
      !+
 
      ! Эмуляция клавиши GOLD/7 (обработка командной строки)
 
      !-
 
      PROCEDURE COMMAND_LINE
 
      LOCAL
 
         LINE_READ, X;
 
      ON_ERROR


                                - 79 -
 
                          00152-01 34 04-1
 
 
         MESSAGE ('неопределенная команда: '+LINE_READ);
 
         RETURN;
 
      ENDON_ERROR
 
      !+
 
      ! Получить команду для исполнения
 
      !-
 
      LINE_READ := READ_LINE ('TPU COMMAND: ');
 
      !+
 
      ! Компилировать ее
 
      !-
 
      IF LINE_READ <> ''
 
         THEN  X := COMPILE (LINE_READ);
 
         ELSE RETURN;
 
      ENDIF;
 
      !+
 
      ! Выполнить
 
      !-
 
      IF X <> 0
 
         THEN EXECUTE (X);
 
      ENDIF;
 
      ENDPROCEDURE;
 
 
 
           4.8.7. Оператор ABORT
 
 
           Оператор ABORT приводит к выходу из  интерпретатора  и
 
      возврату на высший уровень утилиты. Его действие аналогично
 
      вводу <CTRL/C> на уровне командного языка DCL. ABORT  может
 
      быть включен в оператор ON_ERROR в начале  любой  процедуры
 
      для выхода из вложенных процедур, а не для возврата к неко-
 
      торой промежуточной процедуре.
 


                                - 80 -
 
                          00152-01 34 04-1
 
 
           4.8.8. Оператор BREAK
 
 
           Оператор BREAK используется для установки точек  оста-
 
      нова при отладке. После проверки  определенного  условия  в
 
      операторе  IF-THEN  рекомендуется  использовать  BREAK  для
 
      того, чтобы при попадании на точку останова можно  было  бы
 
      произвести одну из следующих операций:
 
           1) вызвать отладчик, написанный самим пользователем;
 
           2) задать сообщение, которое должно быть помещено в
 
      буфер сообщений, например, такое:
 
           "останов в строке 130"
 
 
           Синтаксис:
 
      BREAK;
 
           Предопределенная  глобальная   переменная   DEBUG_LINE
 
      может быть использована в отладчиках, написанных  пользова-
 
      телем. Эта переменная  содержит  номер  строки,  в  которой
 
      находится точка останова.
 
           Пример.
 
           Процедура ONE имеет  точку  останова,  если  выражение
 
      EXPRESSION истинно:
 
      PROCEDURE ONE
 
           !
 
           ! Операторы процедуры
 
           !
 
      IF EXPRESSION
 
         THEN BREAK;
 
      ENDIF;
 
           !
 
           ! Операторы процедуры
 
           !


                                - 81 -
 
                          00152-01 34 04-1
 
 
      ENDPROCEDURE;
 
 
 
           4.8.9. Оператор LOCAL
 
 
           Оператор LOCAL используется для  об'явления  локальных
 
      идентификаторов (переменных). Оператор LOCAL должен исполь-
 
      зоваться сразу после оператора PROCEDURE.
 
           Синтаксис:
 
      PROCEDURE PROCEDURE_NAME
 
      LOCAL
 
           VARIABLE [,...];
 
           Оператор_1;
 
           Оператор_2;
 
           ! и т. д.
 
           Оператор_N;
 
      ENDPROCEDURE;
 
 
 
           4.8.10. Оператор RETURN
 
 
           Оператор RETURN вызывает возврат к процедуре,  которая
 
      вызвала текущую процедуру. Возврат осуществляется на опера-
 
      тор, который следует за оператором, вызвавшим текущую  про-
 
      цедуру.
 
           Оператор RETURN часто  используется  внутри  оператора
 
      ON_ERROR для задания возврата к вызвавшей процедуре, если в
 
      текущей появились ошибки.
 
           Пример.
 
           Использование  оператора   RETURN   внутри   оператора
 
      ON_ERROR:
 
      ! Обратное присоединение к процессу-отцу
 
      ! используется, когда EVE порождается из DCL и


                                - 82 -
 
                          00152-01 34 04-1
 
 
      ! работает в подпроцессе. Команда ATTACH может
 
      ! использоваться для более гибкого управления
 
      ! процессом.
 
      PROCEDURE EVE_ATTACH
 
      ON_ERROR
 
          IF ERROR = TPU$_NOPARENT
 
             THEN MESSAGE ("нет подпроцесса TPU");
 
             RETURN;
 
          ENDIF;
 
      ENDON_ERROR;
 
      ATTACH;
 
      ENDPROCEDURE
 
           Можно указывать  некоторое  значение  после  оператора
 
      RETURN; это значение будет передано  вызывающей  процедуре,
 
      например:
 
      PROCEDURE USER_GET_SHIFT_KEY
 
      LOCAL KEY_TO_SHIFT;   ! KEYWORD FOR KEY PRESSED AFTER
 
                            ! SHIFT KEY
 
      SET (SHIFT_KEY, LAST_KEY);
 
      KEY_TO_SHIFT := KEY_NAME (READ_KEY, SHIFT_KEY);
 
      RETURN (KEY_TO_SHIFT);
 
      ENDPROCEDURE;
 
           В дополнение к оператору RETURN для передачи  значения
 
      можно использовать число 1 (истина) или число  0  (ложь)  с
 
      оператором RETURN для индикации статуса  процедуры,  напри-
 
      мер:
 
         PROCEDURE USER_AT_END_OF_LINE
 
         ! Эта процедура возвращает 1(истина), если пользователь
 
         ! находится в конце строки, и значение 0 (ложь), если
 
         ! текущий символ не расположен в конце строки


                                - 83 -
 
                          00152-01 34 04-1
 
 
         ON_ERROR
 
         ! Подавляется сообщение (предупреждающее)
 
            RETURN (1);
 
         ENDON_ERROR;
 
         IF CURRENT_OFFSET = LENGTH (CURRENT_LINE)
 
            THEN
 
               RETURN (1)
 
            ELSE
 
               RETURN (0)
 
         ENDIF;
 
         ENDPROCEDURE;
 
 
 
           4.9. Ключевые слова
 
 
           Ключевые слова имеют специальное значение для компиля-
 
      тора в языке TPU и являются зарезервированными словами ути-
 
      литы. Ключевые слова используются для следующих целей:
 
           1) как параметры для  встроенных  процедур  языка  TPU
 
      (ALL, BLANK, PF2,...). Первый параметр во встроенной проце-
 
      дуре SET всегда является ключевым словом  (PAD,  SCROLLING,
 
      TAB, STATUS_LINE,...);
 
           2)  как  значения,  возвращаемые  процедурой  GET_INFO
 
      (FORWARD, CRAPHIC_TABS, UNDERLINE,...);
 
           3) для  спецификации  типов  данных  (BUFFER,  MARKER,
 
      LEARN,...);
 
           4) для обозначения возвращаемого состояния ошибки  или
 
      предупреждения (TPU$_BADMARGINS, TPU$_CREATEFAIL,...).
 
           Ключевые слова запоминаются как предопределенные целые
 
      значения.
 
           Можно отобразить упорядоченный по алфавиту список клю-
 


                                - 84 -
 
                          00152-01 34 04-1
 
 
      чевых слов утилиты с помощью команды SHOW (KEYWORDS), кото-
 
      рую можно подать после соответствующей подсказки из  интер-
 
      фейса редактирования.
 
           В табл. 6 показано соответствие между ключевыми слова-
 
      ми языка TPU, используемыми как имена клавиш,  и  клавишами
 
      на клавиатурах терминалов типа VT100 и VT200.
 
                                                        Таблица 6
 
               Ключевые слова, используемые для клавиш
 
      -----------------------------------------------------------
        Ключевые слова  !         Клавиша терминала
           языка TPU    !----------------------------------------
                        !  Типа VT200        !  Типа VT100
      ------------------!----------------------------------------
                        !                   !
                        !                   !
        PF1             !  PF1              !  PF1
                        !                   !
        PF2             !  PF2              !  PF2
                        !                   !
        PF3             !  PF3              !  PF3
                        !                   !
        PF4             !  PF4              !  PF4
                        !                   !
        KP0,KP1,...,KP9 !  0,1,...,9        !  0,1,...,9
                        !                   !
        PERIOD          !  .                !  .
                        !                   !
        COMMA           !  ,                !  ,
                        !                   !
        MINUS           !  -                !  -
                        !                   !
        ENTER           !  ENTER            !  ENTER
                        !                   !
        UP              !  Стрелка вверх    !  Стрелка вверх
                        !                   !
        DOWN            !  Стрелка вниз     !  Стрелка вниз
                        !                   !
        LEFT            !  Стрелка влево    !  Стрела влево
                        !                   !
        RIGHT           !  Стрелка вправо   !  Стрелка вправо
                        !                   !
        E1              !  FIND/E1          !
                        !                   !
        E2              !  INSERT_HERE/E2   !
                        !                   !
        E3              !  REMOVE/E3        !
                        !                   !
        E4              !  SELECT/E4        !
                        !                   !
        E5              !  PREV_SсREEN/E5   !
                        !                   !


                                - 85 -
 
                          00152-01 34 04-1
 
 
                                              Продолжение табл. 6
      -----------------------------------------------------------
        Ключевые слова  !         Клавиша терминала
           языка TPU    !----------------------------------------
                        !  Типа VT200        !  Типа VT100
      ------------------!----------------------------------------
        E6              !  NEXT_SсREEN/E6   !
                        !                   !
        HELP            !  HELP/F15         !
                        !                   !
        DO              !  DO/F16           !
                        !                   !
        F6,F7,...,F20   !  F6,F7,...,F20    !
                        !                   !
        TAB_KEY         !  TAB              !  TAB
                        !                   !
        RET_KEY         !  RETURN           !  RETURN
                        !                   !
        DEL_KEY         !  <X]              !  DELETE
                        !                   !
        LF_KEY          !                   !  LINE_FEED
                        !                   !
        BS_KEY          !                   !  BACK_SPACE
                        !                   !
        CTRL_A_KEY      !  CTRL/A           !  CTRL/A
                        !                   !
        CTRL_B_KEY      !  CTRL/B           !  CTRL/B
                        !                   !
        CTRL_Z_KEY      !  CTRL/Z           !  CTRL/Z
                        !                   !
 
           Примечание. CTRL/A  обозначает  одновременное  нажатие
 
      клавиши A и управляющей клавиши CTRL.
 
 
 
           4.10. Глобальные переменные утилиты
 
 
           Существует три зарезервированных слова, которые предс-
 
      тавляют собой глобальные переменные:
 
           ERROR      - ключевое слово, определяющее состояние
 
                        ошибки и предупреждения;
 
           ERROR_LINE - номер строки, в которой появилась  ошибка
 
                        или о которой выдается предупреждение;
 
           DEBUG_LINE - номер строки с точкой останова.
 


                                - 86 -
 
                          00152-01 34 04-1
 
 
                  5. Встроенные процедуры языка TPU
 
 
 
           5.1. Процедура ADJUST_WINDOW
 
 
 
           Процедура ADJUST_WINDOW изменяет  размер  и  положение
 
      окна на экране и об'являет указанное окно текущим.
 
           Формат:
 
 
      ADJUST_WINDOW (WINDOW, INTEGER1, INTEGER2)
 
 
           Параметры:
 
 
           WINDOW - окно, размер и положение которого  необходимо
 
      изменить. Указанное окно становится текущим окном;
 
           INTEGER1 - целое число со знаком (+  или  -),  которое
 
      добавляется к номеру строки экрана, соответствующей верхней
 
      строке окна;
 
           INTEGER2 - целое число со знаком (+  или  -),  которое
 
      добавляется к номеру строки экрана, соответствующей  нижней
 
      части окна.
 
           Описание.
 
           Для проверки размера и положения окна на экране  необ-
 
      ходимо использовать один из следующих операторов:
 
           1) SHOW (WINDOW);
 
           2) SHOW (WINDOWS);
 
           3) TOP := GET_INFO (WINDOW, "VISIBLE_TOP");
 
           MESSAGE (STR (TOP));
 
           4) BOTTOM := GET_INFO (WINDOW, "VISIBLE_BOTTOM");
 
           MESSAGE (STR (BOTTOM))
 
           Можно отрегулировать размер некоторого  видимого  окна
 
      посредством изменения номеров строк экрана, соответствующих
 


                                - 87 -
 
                          00152-01 34 04-1
 
 
      верху и низу окна. Производятся эти  изменения  добавлением
 
      или вычитанием из номера текущей строки экрана, а не указа-
 
      нием самого номера.
 
           Увеличивать размер окна допускается посредством умень-
 
      шения номера строки экрана, соответствующей верху окна (для
 
      параметра INTEGER1 указывается отрицательное  значение),  и
 
      посредством увеличения номера строки экрана,  соответствую-
 
      щей низу окна (для INTEGER2 указывается положительное  зна-
 
      чение). Например, к текущему окну добавляется  4  строки  и
 
      обеспечивается попадание этих значений внутрь границ  экра-
 
      на:
 
           ADJUST_WINDOW(CURRENT_WINDOW, -2, +2)
 
           Если заданы целые значения для верха  или  низа  окна,
 
      выводящие за границы экрана,  то  выдается  предупреждающее
 
      сообщение, а границы окна устанавливаются  по  краю  экрана
 
      (верхнему или нижнему, в зависимости от ситуации).
 
           Уменьшение размера окна достигается посредством увели-
 
      чения номера  строки  экрана,  соответствующей  верху  окна
 
      (задается положительное значение для параметра INTEGER1), и
 
      уменьшения номера строки экрана, соответствующей низу  окна
 
      (задается отрицательное  значение  для  INTEGER2).  Попытка
 
      сделать размер окна меньше одной строки экрана  приводит  к
 
      выдаче предупреждающего сообщения; с окном никаких  измене-
 
      ний не произойдет. Например, размер  текущего  окна  умень-
 
      шается на 4 строки:
 
           ADJUST_WINDOW(CURRENT_WINDOW, +2, -2)
 
           Процедура ADJUST_WINDOW может использваться для  изме-
 
      нения позиции окна на экране без изменения  размеров  этого
 
      окна. Например, следующая команда просто перемещает текущее
 
      окно на две строки выше на экране и обеспечивает расположе-


                                - 88 -
 
                          00152-01 34 04-1
 
 
      ние окна внутри границ экрана:
 
           ADJUST_WINDOW(CURRENT_WINDOW, -2, -2)
 
           Возвращаемые состояния:
 
           TPU$_WINDNOTMAPPED WARNING - неотображаемое окно;
 
           TPU$_BADWINDADJUST WARNING - неверная длина окна;
 
           TPU$_WINDNOTVIS WARNING - невидимое окно.
 
           Примеры:
 
           1. ADJUST_WINDOW (CURRENT_WINDOWN, +5, 0)
 
      оператор уменьшает текущее  окно,  удаляя  5  строк  сверху
 
      окна. Если верхняя строка окна имеет экранный номер 11,  то
 
      оператор изменяет номер строки верха окна на номер 16 стро-
 
      ки экрана, (если нижняя строка окна  имеет  экранный  номер
 
      строки меньше чем 16, то утилита будет  сигнализировать  об
 
      ошибке).
 
           2. В USER_DISPLAY_HELP удаляются 5 строк сверху окна и
 
      в этом месте располагается окно для вспомогательных сообще-
 
      ний:
 
 
      PROCEDURE USER_DISPLAY_HELP
 
       TOP_OF_WINDOW := GET_INFO (CURRENT_WINDOW, "VISIBLE_TOP");
 
             !
 
             ! Удаляет 5 верхних строк текущего окна и
 
             ! заменяет их на окно вспомогательных текстов
 
             !
 
         ADJUST_WINDOW (CURRENT_WINDOW, +5, 0);
 
         EXAMPLE_WINDOW := CREATE_WINDOW (TOP_OF_WINDOW, 5, ON);
 
         EXAMPLE_BUFFER := CREATE_BUFFER ("пример",
 
                                      "SYS$LOGIN:TEMPLATE.TXT");
 
         MAP (EXAMPLE_WINDOW, EXAMPLE_BUFFER);
 
      ENDPROCEDURE.
 


                                - 89 -
 
                          00152-01 34 04-1
 
 
           5.2. Процедура ANCHOR
 
 
           Процедура ANCHOR запрещает прямой  и  последовательный
 
      поиск совпадения шаблонов и связывает  с  текущей  позицией
 
      символа строку поиска.
 
           Формат:
 
      ANCHOR
 
           Параметры:
 
           Нет.
 
           Описание.
 
           Когда встроенная процедура SEARCH не  находит  искомый
 
      шаблон, то, по умолчанию, положение символа  изменяется  на
 
      единицу и поиск продолжается до тех пор, пока не будет най-
 
      дено совпадение или не сложатся условия конца поиска. Поло-
 
      жение символа изменяется на новое вперед или назад по текс-
 
      ту, в зависимости от  направления,  заданного  в  процедуре
 
      SEARCH. Условием конца поиска в направлении FORWARD являет-
 
      ся достижение конца буфера, а в направлении REVERSE  дости-
 
      жение начала буфера. Процедура ANCHOR отменяет этот продол-
 
      жительный режим поиска, который может быть прямым (режим по
 
      умолчанию) или  последовательным  поиском,  и  обрабатывает
 
      шаблон только один раз.
 
           При использовании процедуры ANCHOR для создания шабло-
 
      на поиск будет проходить быстрее, чем в случае прямого  или
 
      последовательного поиска.
 
           Примеры:
 
           1. PAT1:=ANCHOR & 'A'&'123';
 
      оператор  присваивания  создает  шаблон  из  символов  А  и
 
      цифр 1,2 и 3.  Когда  PAT1  используется  как  параметр  во
 
      встроенной процедуре SEARCH, то поиск не будет перемещаться
 


                                - 90 -
 
                          00152-01 34 04-1
 
 
      с символа на символ для  нахождения  этого  шаблона;  поиск
 
      будет неудачен, если этот шаблон не найден сразу с  текущей
 
      позиции символа.
 
           2. Процедура USER_REMOVE_COMMENT начинает свою  работу
 
      с начала буфера и осуществляет поиск в прямом  направлении,
 
      удаляя все комментарии, начинающиеся  с  первой  позиции  в
 
      строке. Процедура ANCHOR связывает  этот  поиск  с  текущим
 
      символом (с первым символом в строке) таким образом,  чтобы
 
      поиск не обнаруживал и не удалял  восклицательные  знаки  в
 
      середине строки, например, знаки, являющиеся частью  дирек-
 
      тивы:
 
      PROCEDURE USER_REMOVE_COMMENTS
 
      ! Перехват сообщений об ошибках
 
      ON_ERROR
 
      ! Останов по концу буфера
 
         IF ERROR = TPU$_ENDOFBUF
 
         THEN
 
         MESSAGE (STR (NUMBER_REMOVED) + 'комментарии удалены');
 
            RETURN;
 
         ENDIF;
 
      ENDON_ERROR
 
      ! Стартуем с самого начала буфера
 
      POSITION (BEGINNING_OF (CURRENT_BUFFER));
 
      NUMBER_REMOVED :=0;
 
      LOOP
 
      ! Закрепим шаблон в первой колонке
 
           PAT1 := ANCHOR & '!' & REMAIN;
 
      ! Поиск шаблона и, если найдено, возврат диапазона,
 
      !               иначе выход с 0;
 
          R1 := SEARCH (PAT1, FORWARD);


                                - 91 -
 
                          00152-01 34 04-1
 
 
          IF R1<>0
 
          THEN
 
      ! Комментарий найден - очистить;
 
             ERASE_LINE;
 
             NUMBER_REMOVED :=NUMBER_REMOVED +1;
 
         ELSE
 
      ! Переход на следующую строку
 
             MOVE_VERTICAL (1);
 
         ENDIF;
 
      ENDLOOP;
 
      ENDPROCEDURE
 
 
 
           5.3. Процедура ANY
 
 
           Встроенная процедура ANY возвращает шаблон для  поиска
 
      любого отдельного символа из строки, которая использовалась
 
      в качестве параметра.
 
           Формат:
 
      PATTERN:= ANY(STRING)
 
           Параметры:
 
           STRING - строка в кавычках или имя некоторой  перемен-
 
      ной, которая  обозначает  строковую  константу,  содержащую
 
      символы для шаблона.
 
           Описание.
 
           Шаблон, возвращенный процедурой  ANY,  используется  в
 
      процедуре SEARCH; поиск по этому  шаблону  будет  успешным,
 
      если в тексте будет обнаружен хотя бы один из символов это-
 
      го шаблона.
 


                                - 92 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. PAT1 := ANY ('АВСД1');
 
      Оператор присваивания создает шаблон для поиска любого сим-
 
      вола из набора А,В,С,Д,1.
 
           2. В процедуре USER_FIND_ENDPROCEDURE находится опера-
 
      тор ENDPROCEDURE, начинающийся с первой колонки; при успеш-
 
      ном поиске текущая позиция  символа  перемещается  в  конец
 
      найденного оператора:
 
      PROCEDURE USER_FIND_ENDPROCEDURE
 
      LOCAL ENDPROCEDURE_PATTERN, SEARCH_RANGE;
 
      ON_ERROR
 
          IF ERROR = TPU$_STRNOTFOUND
 
             THEN SEARCH_RANGE := 0;
 
          ENDIF;
 
      ENDON_ERROR;
 
      ENDPROCEDURE_PATTERN :=
 
          (LINE_BEGIN & "ENDPROCEDURE") &
 
          (LINE_END ! ANY (";!"));
 
      SEARCH_RANGE := SEARCH (ENDPROCEDURE_PATTERN, FORWARD);
 
      IF SEARCH_RANGE = 0
 
         THEN MESSAGE ("оператора ENDPROCEDURE нет");
 
         ELSE POSITION (END_OF (SEARCH_RANGE));
 
      ENDIF;
 
      ENDPROCEDURE;
 


                                - 93 -
 
                          00152-01 34 04-1
 
 
           5.4. Процедура APPEND_LINE
 
 
           Процедура  APPEND_LINE  перемещает  текущую  строку  в
 
      конец предыдущей строки.
 
           Формат:
 
      APPEND_LINE
 
           Параметры:
 
           Нет.
 
           Описание.
 
           Рекомендуется использовать процедуру  APPEND_LINE  для
 
      удаления ограничителей строки.
 
           Позиция символа в  строке,  которая  была  текущей  до
 
      выполнения процедуры APPEND_LINE, становится текущей  пози-
 
      цией символа после выполнения этой процедуры.
 
           Возвращаемое состояние:
 
           TPU$_NOCURRENTBUF  WARNING - нет позиционирования в
 
      буфере;
 
           TPU$_NOCACHE       ERROR   - нет памяти для выделения
 
      ее под новый кэш.
 
           Примеры:
 
           1. APPEND_LINE;
 
           Эта команда добавляет текущую строку к концу  предыду-
 
      щей строки.
 
           2. В процедуре  USER_DELETE_CHAR  должен  быть  удален
 
      символ, предшествующий курсору.  Если  курсор  находится  в
 
      начале строки, то текущая строка пристыковывается к  преды-
 
      дущей. В этой процедуре предполагается, что окно не сдвину-
 
      то; процедура не будет работать в сдвинутом окне:
 
 
      PROCEDURE USER_DELETE_CHAR
 
      ! Если курсор в начале строки, то добавить эту


                                - 94 -
 
                          00152-01 34 04-1
 
 
      ! строку к предыдущей строке. Иначе, удалить
 
      ! предыдущий символ.
 
         IF CURRENT_COLUMN = 1
 
            THEN   APPEND_LINE;
 
            ELSE   ERASE_CHARACTER (-1);
 
         ENDIF;
 
      ENDPROCEDURE;
 
           Процедуру USER_DELETE_CHAR можно  связать  с  клавишей
 
      DELETE операторOM:
 
           DEFINE_KEY ('USER_DELETE_CHAR', DEL_KEY)
 
 
 
           5.5. Процедура ARB
 
 
           Шаблон, возвращенный процедурой ARB,  будет  подбирать
 
      произвольную последовательность  символов,  начинающуюся  с
 
      текущей позиции символа и имеющую указанную длину.
 
           Формат:
 
      PATTERN := ARB (INTEGER)
 
           Параметры:
 
           INTEGER   - число символов в шаблоне.
 
           Описание.
 
           Процедура ARB может использоваться для поиска шаблонов
 
      фиксированной длины с символами обобщения.
 
           Примеры:
 
           1. PAT1:= ARB (5) ;
 
      Оператор присваивания  создает  шаблон,  который  подбирает
 
      следующие 5 символов, начиная от текущей  позиции  символа.
 
      Эти символы произвольные; для  шаблона,  создаваемого  АRB,
 
      важно лишь их количество.
 
           2. PAT2:= 'J' & ARB(2) ;
 


                                - 95 -
 
                          00152-01 34 04-1
 
 
      Оператор присваивания создает шаблон, который должен подоб-
 
      рать строку, начинающуюся с символа J, после которого может
 
      следовать любая двухсимвольная комбинация. Шаблон PAT2 дол-
 
      жен подобрать такие имена как JIM, JAN, JOE.
 
           3. Процедура USER_REPLASCE_PREFIX заменяет префикс  из
 
      любых 3 символов, за которыми следует  знак  подчеркивания,
 
      на строку "USER_". Предполагается, что для буфера  установ-
 
      лен режим вставки:
 
 
      ! Заменить префикс, состоящий из любых 3 символов,
 
      ! за которыми следует символ подчеркивания, на
 
      ! префикс "USER_" во всем буфере;
 
      PROCEDURE USER_REPLACE_PREFIX
 
      ! Стартуем сначала буфера и в направлении вперед;
 
      POSITION (BEGINNING_OF (SECOND_BUFFER));
 
      ! Шаблон содержит произвольную последовательность
 
      ! из трех символов и подчеркивания;
 
      PAT1:= ARB (3) & '_';
 
      ! Строка которая будет заменять найденную строку;
 
      REPLACEMENT_STR :='USER_';
 
      LOOP
 
          FOUND_RANGE := SEARCH (PAT1, FORWARD);
 
          IF FOUND_RANGE <> 0
 
          THEN
 
              ! Удалить первую строку и заменить ее на новую;
 
              ERASE (FOUND_RANGE);
 
              POSITION (END_OF (FOUND_RANGE));
 
              COPY_TEXT (REPLACEMENT_STR);
 
          ELSE
 
              ! Выход, если не нашли
 


                                - 96 -
 
                          00152-01 34 04-1
 
 
              EXITIF;
 
          ENDIF;
 
      ENDLOOP;
 
      ENDPROCEDURE;
 
 
 
           5.6. Процедура ASCII
 
 
           Процедура ASCII преобразует целое значение в  символь-
 
      ную строку, представляющую это значение.
 
            Формат:
 
      STRING := ASCII (INTEGER)
 
           Параметры:
 
           INTEGER - десятичное значение символа в КОИ-8.
 
           Описание.
 
           Встроенная процедура ASCII возвращает строку длиной 1,
 
      представляющую символ КОИ-8 и соответствующую целому значе-
 
      нию,  которое  указано  параметром.  Для  генерации  строки
 
      используется только младший байт числа.
 
           Примеры:
 
           1. MY_CHARACTER := ASCII (12)
 
      Оператор присваивания размещает значение символа  FORM_FEED
 
      (перевод формата) в переменной MY_CHARACTER. Для  просмотра
 
      представления этого символа в области сообщений на  экране,
 
      нужно ввести команду:
 
      MESSAGE (MY_CHARACTER)
 
           2. MESSAGE (ASCII (80))
 
      Оператор об'единяет две встроенные процедуры и выводит сим-
 
      вол с кодом 80 из набора КОИ-8 в область сообщений; отобра-
 
      жается большая буква Р.
 
           3. Процедура USER_TAB вводит символ табуляции в буфер:
 


                                - 97 -
 
                          00152-01 34 04-1
 
 
      PROCEDURE USER_TAB
 
      COPY_TEXT (ASCII (9));
 
      ENDPROCEDURE;
 
 
 
           5.7. Процедура ATTACH
 
 
           Процедура  ATTACH  отсоединяет  терминал  и  разрешает
 
      переключить управление с текущего процесса на  другой  про-
 
      цесс, предварительно созданный.
 
           Формат:
 
      ATTACH [( INTEGER или STRING )]
 
           Параметры:
 
           INTEGER - идентификатор  процесса,  на  который  будет
 
      переключено терминальное управление.  Необходимо  использо-
 
      вать десятичное число для спецификации идентификатора  про-
 
      цесса (PID);
 
           STRING - строка символов в кавычках или  имя  перемен-
 
      ной,  представляющей  строковую  константу,  или  некоторое
 
      выражение, дающее  строку,  которую  TPU  интерпретирует  в
 
      качестве имени процесса.
 
           Описание.
 
           Для использования встроенной процедуры ATTACH  необхо-
 
      димо предварительно создать некоторый подпроцесс. Если этот
 
      процесс не является частью текущего задания или  вообще  не
 
      существует, то выдается сообщение об ошибке.
 
           Процедура ATTACH приостанавливает текущий процесс  TPU
 
      и переключает  контекст  на  другой  процесс,  указанный  в
 
      качестве параметра. Если параметр для ATTACH не указан,  то
 
      TPU переключает управление на процесс-родитель или процесс-
 
      владелец. Последующая команда  DCL  ATTACH  (или  выход  их
 


                                - 98 -
 
                          00152-01 34 04-1
 
 
      любого процесса, кроме процесса-родителя) продолжит  выпол-
 
      нение прерванного TPU-процесса.
 
           Во всех случаях сначала отсоединяется  терминал.  Если
 
      некоторый TPU-процесс был возобновлен  после  команд  SPAWN
 
      или ATTACH,  то  утилита  заново  присоединяет  терминал  и
 
      обновляет экран.
 
           Возвращаемое состояние:
 
           TPU$_NOPARENT WARNING - нет парного родительского про-
 
      цесса; текущий процесс является процессом  самого  верхнего
 
      уровня.
 
           Примеры:
 
           1. ATTACH;
 
      Команда выполняет присоединение к процессу-родителю.
 
           2. АTTACH (97899);
 
      Команда приводит к присоединению к подпроцессу с  идентифи-
 
      катором процесса (PID), равным 97899.
 
           3. ATTACH ('JONES_2');
 
      Команда  переключает  терминальный  контроль   на   процесс
 
      JONES_2.
 
 
 
           5.8. Процедура BEGINNING_OF
 
 
           Процедура BEGINNING_OF  возвращает  некоторый  маркер,
 
      отмечающий первую позицию в буфере или диапазоне.
 
           Формат:
 
      MARKER := BEGINNING_OF (BUFFER или RANGE )
 
           Параметры:
 
           BUFFER  - буфер, начало которого необходимо отметить;
 
           RANGE   - диапазон, начало которого нужно отметить.
 


                                - 99 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           При использовании маркера, возвращенного процедурой, в
 
      качестве параметра для встроенной процедуры POSITION, теку-
 
      щим символом будет тот, на который указывает маркер.
 
           Примеры:
 
           1. BEG_MAIN := BEGINNING_OF (MAIN_BUFFER);
 
           В операторе присваивания в переменную BEG_MAIN записы-
 
      вается маркер, отмечающий начало главного буфера.
 
           2. POSITION(BEGINNING_OF (MY_RANGE));
 
           Команда использует две встроенные процедуры для  пере-
 
      мещения позиции текущего символа в  начало  MY_RANGE.  Если
 
      диапазон MY_RANGE расположен в буфере, который отображается
 
      на экране, и в нем расположен курсор,  то  позиция  курсора
 
      также переместится в начало MY_RANGE.
 
           3. В процедуре USER_TOP происходит перемещение в нача-
 
      ло текущего буфера. Если курсор уже находится в начале это-
 
      го буфера, то в области сообщений появляется текст "ALREADY
 
      AT TOP":
 
 
      PROCEDURE USER_TOP
 
      IF MARK (NONE) = BEGINNING_OF (CURRENT_BUFFER)
 
         THEN MESSAGE ('ALREADY AT TOP');
 
         ELSE POSITION (BEGINNING_OF (CURRENT_BUFFER));
 
      ENDIF;
 
      ENDPROCEDURE
 
           4. В  процедуре  USER_INCLUDE_FILE   создается   новый
 
      буфер, затем он связывается с  окном  MAIN_WINDOW,  которое
 
      далее отображается на экран. В процедуре происходит переход
 
      в начало буфера, выдается подсказка пользователю  об  имени
 
      файла и чтение этого файла в буфер:
 


                                - 100 -
 
                          00152-01 34 04-1
 
 
      PROCEDURE USER_INCLUDE_FILE
 
      ! Создать буфер;
 
         B1 := CREATE_BUFFER ('SCRATCH BUFFER');
 
      ! Отобразить буфер B1 в главное окно;
 
         MAP (MAIN_WINDOW, B1);
 
      ! Читать заданный файл;
 
         READ_FILE (READ_LINE ('файл для включения:'));
 
      ! Перейти в начало файла
 
         POSITION (BEGINNING_OF (B1));
 
      ENDPROCEDURE
 
 
 
           5.9. Процедура CALL_USER
 
 
           Процедура CALL_USER дает возможность вызова программы,
 
      написанной на другом языке программирования, в рамках  ути-
 
      литы. Параметры этой процедуры посылаются во внешнюю проце-
 
      дуру в том виде, в каком введены; утилита никак не  обраба-
 
      тывает эти параметры.
 
           Формат:
 
      STRING2 := CALL_USER (INTEGER, STRING1)
 
           Параметры:
 
           INTEGER - целое число, пересылаемое в программу, напи-
 
      санную пользователем, по ссылке;
 
           STRING1 - строка, пересылаемая в программу, написанную
 
      пользователем, с помощью дескриптора;
 
           STRING2 - значение, возвращаемое внешней программой.
 
           Описание.
 
           В дополнение к возвращаемому процедурой CALL_USER зна-
 
      чению (STRING2), внешняя программа возвращает  код  состоя-
 
      ния, указывающий  на  успешное  или  неуспешное  завершение
 


                                - 101 -
 
                          00152-01 34 04-1
 
 
      программы. Можно перехватывать этот код состояния в  опера-
 
      торе ON_ERROR. Любой четный код состояния  (младший  бит  в
 
      регистре R0 очищен) будет  запускать  выполнение  оператора
 
      ON_ERROR.
 
           Чтобы  правильно  использовать  встроенную   процедуру
 
      CALL_USER, необходимо проделать следующее:
 
           1) написать программу на другом языке; программа долж-
 
      на быть глобальной подпрограммой с именем TPU$CALLUSER;
 
           2) оттранслировать программу;
 
           3) скомпоновать программу с файлом выбора для создания
 
      разделяемого образа;
 
           4) определить логическое имя TPU$CALLUSER для  отметки
 
      созданной подпрограммы;
 
           5) вызвать TPU;
 
           6) во время сеанса работы с утилитой  вызвать  внешнюю
 
      программу для выполнения ее работы  посредством  встроенной
 
      процедуры CALL_USER с  соответствующими  параметрами.  Если
 
      компоновка проведена правильно и логическое имя  определено
 
      верно, то процедура CALL_USER  будет  пересылать  параметры
 
      соответствующей подпрограмме.
 
           Параметры процедуры CALL_USER являются входными  пара-
 
      метрами для внешней программы; эти параметры являются  фор-
 
      мальными. Утилита никак не обрабатывает параметры, но пере-
 
      дает их внешней программе (процедуре) точно  так,  как  они
 
      были указаны. Необходимо указать оба параметра,  даже  если
 
      это не является необходимостью.
 
           Возвращаемое состояние:
 
           TPU$_BADUSERDESC ERROR - пользовательская подпрограмма
 
      неверно заполняет дексриптор возврата;
 
           TPU$_NOCALLUSER ERROR - не найдена подпрограмма.


                                - 102 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. RET_VALUE :=CALL_USER (6,'ABC');
 
      Оператор  вызывает  программу,  написанную   пользователем.
 
      Перед вызовом TPU создается  логическое  имя  TPU$CALLUSER,
 
      связанное с файлом, содержащим программу, которую необходи-
 
      мо вызвать с  помощью  процедуры  CALL_USER.  Первый  пара-
 
      метр (6) пересылается по ссылке, а второй параметр  ('ABC')
 
      с помощью дексриптора. Если программа пользователя  исполь-
 
      зует любое целое число и любую строку как входные значения,
 
      то она должна обработать целое число 6 и строку  ABC;  если
 
      эта программа может возвращать результат, то он будет пере-
 
      дан в переменную RET_VALUE.
 
           2. В примере  показаны  шаги,  которые  требуются  для
 
      использования встроенной процедуры CALL_USER. Подпрограмма,
 
      которая вызывается для выполнения операций плавающей  ариф-
 
      метики, написана на языке BASIC:
 
           1) программа на языке BASIС:
 
      ! Имя файла: FLOATARITH.BAS
 
      1      SUB TPU$CALLUSER (SOME_INTEGER%, INPUT_STRING$, &
 
                                RETURN_STRING$)
 
      10      ! т.к. эта функция выполняет только арифметику
 
              ! с плавающей точкой, то не проверять
 
              ! SOME_INTEGER%;
 
      20      ! Разбор входной строки, поиск и извлечение
 
              ! операции
 
              COMMA_LOCATION = POS (INPUT_STRING$, ",", 1%)
 
              IF COMMA_LOCATION = 0 THEN GO TO ALL_DONE  END IF
 
              OPERATION$ = SEG$( INPUT_STRING$, 1%, &
 
              COMMA_LOCATION -1%)
 
              ! Поиск и извлечение первого операнда;


                                - 103 -
 
                          00152-01 34 04-1
 
 
              OPERAND1_LOCATION = POS (INPUT_STRING$, ",", &
 
              COMMA_LOCATION +1)
 
              IF OPERAND1_LOCATION = 0 THEN GO TO ALL_DONE END IF
 
              OPERAND1$ = SEG$(INPUT_STRING$, COMMA_LOCATION  &
 
                            + 1%, OPERAND1_LOCATION -1)
 
              ! Поиск и извлечение второго операнда
 
              OPERAND2_LOCATION= POS(INPUT_STRING$, ",", &
 
                                      OPERAND1_LOCATION+1)
 
              IF OPERAND2_LOCATION = 0 THEN
 
                      OPERAND2_LOCATION = LEN(INPUT_STRING$)+1
 
              END IF
 
              OPERAND2$ = SEG$( INPUT_STRING$, &
 
                          OPERAND1_LOCATION + 1%, &
 
                          OPERAND2_LOCATION-1 )
 
              SELECT OPERATION$ ! выполнить операции
 
              CASE "+"
 
                      RESULT$ = SUM$( OPERAND1$, &
 
                                      OPERAND2$ ) !
 
              CASE "-"
 
                      RESULT$ = DIF$( OPERAND1$, &
 
                                       OPERAND2$ ) !
 
              CASE "*"
 
                       RESULT$ = NUM1$( VAL( OPERAND1$ )  &
 
                                      * VAL( OPERAND2$ ) )
 
              CASE "/"
 
                       RESULT$ = NUM1$( VAL( OPERAND1$ )  &
 
                                      / VAL( OPERAND2$ ) )
 
              CASE ELSE
 
                       RESULT$ = "неопределенная операция."
 
              END SELECT


                                - 104 -
 
                          00152-01 34 04-1
 
 
              RETURN_STRING$ = RESULT$
 
      999     ALL_DONE: END SUB   !конец   ;
 
           2) программа FLOATARITH компилируется командой:
 
      $ BASIC/LIST FLOATARITH ;
 
           3) файл выбора, который будет использован  компоновши-
 
      ком при обработке программы на языке BASIC, имеет вид:
 
      !+
 
      !   Файл: FLOATARITH.OPT
 
      !
 
      !   Ключи файла построения FLOATARITH BASIC программы
 
      !   для TPU
 
      !
 
      !-
 
      FLOATARITH.OBJ
 
      UNIVERSAL=TPU$CALLUSER;
 
           4) компоновка программы  (используя  файл  выбора  для
 
      создания разделяемого образа):
 
      $ LINK FLOATARITH/SHARE/OPT/MAP/FULL;
 
           5) определение логического имени TPU$CALLUSER,  указы-
 
      ваемого на выполняемый образ BASIC-программы:
 
      $ DEFINE TPU$CALLUSER DEVICE:[DIRECTORY]FLOATARITH.EXE
 
           6) запуск TPU;
 
           7) создание и трансляция процедуры:
 
      PROCEDURE MY_CALL_USER
 
      LOCAL OUTPUT, INPUT;
 
      INPUT := READ_LINE ('CALL USER >');
 
      OUTPUT := CALL_USER ( 0, INPUT);
 
      MESSAGE (OUTPUT);
 
      ENDPROCEDURE
 
           8) при вызове процедуры MY_CALL_USER  выводится  подс-


                                - 105 -
 
                          00152-01 34 04-1
 
 
      казка о  параметрах,  которые  передаются  в  процедуру  на
 
      BASIC. Порядок параметров следующий: оператор, число,  чис-
 
      ло. Например, если вводится "+,3.33,4.44" после  подсказки,
 
      то результат (7.77) будет отображен в области сообщений.
 
 
 
           5.10. Процедура CHANGE_CASE
 
 
 
           Процедура CHANGE_CASE изменяет  регистр  (верхний  или
 
      нижний) всех символов, которые расположены в некоторой пор-
 
      ции текста в соответствии с используемым ключевым словом.
 
           Формат:
 
      CHANGE_CASE (BUFFER или RANGE или STRING,ключевое_слово)
 
           Параметры:
 
           BUFFER - буфер, в котором изменяется регистр символов;
 
           RANGE - диапазон, в котором  изменяется  регистр  всех
 
      принадлежащих ему символов;
 
           STRING  -  имя  переменной,  представляющей  строковую
 
      константу, или некоторое выражение, дающее строку, в  кото-
 
      рой необходимо изменить регистр всех символов;
 
           Ключевое_слово - это ключевое слово задает регистр,  в
 
      который должны быть переведены указанные символы.  Допусти-
 
      мыми ключевыми словами являются:
 
           LOWER - заданные символы преобразуются в символы  ниж-
 
      него регистра;
 
           UPPER - заданные символы преобразуются в символы верх-
 
      него регистра;
 
           INVERT - заданные символы преобразуются в символы про-
 
      тивоположного регистра. Если эти символы являются символами
 
      верхнего регистра, то они преобразуются в  символы  нижнего
 
      регистра;  если  эти  символы  являются  символами  нижнего


                                - 106 -
 
                          00152-01 34 04-1
 
 
      регистра, то они преобразуются в символы Bерхнего регистра.
 
           Описание.
 
           Процедура CHANGE_CASE  не  возвращает  результат.  Она
 
      изменяет регистр символов там, где они расположены.
 
           Примеры:
 
           1. CHANGE_CASE(CURRENT_BUFFER, UPPER);
 
      команда преобразует все символы текущего буфера  в  символы
 
      верхнего регистра. Употребление этой  команды  в  командной
 
      строке интерфейса, позволяет  увидеть  сразу  результат  ее
 
      работы. Использование команды в качестве  оператора  внутри
 
      процедуры позволяет увидеть результат только после  очеред-
 
      ного обновления экрана.
 
           2. CHANGE_CASE (MY_RANGE, LOWER);
 
      команда преобразует все символы диапазона MY_RANGE в симво-
 
      лы нижнего регистра. Если диапазон MY_RANGE является частью
 
      буфера, отображаемого в окно, то результат  работы  команды
 
      сразу виден на экране.
 
           3. В  процедуре  USER_LOWERCASE_LINE  символы  текущей
 
      строки преобразуются в символы нижнего регистра:
 
      PROCEDURE USER_LOWERCASE_LINE
 
      LOCAL THIS_LINE;
 
      THIS_LINE :=ERASE_LINE;
 
      CHANGE_CASE (THIS_LINE, LOWER);
 
      SPLIT_LINE;
 
      MOVE_VERTICAL (-1);
 
      COPY_TEXT (THIS_LINE);
 
      ENDPROCEDURE
 
           4. В процедуре USER_UPCASE_ITEM символы текущего текс-
 
      тового об'екта преобразуются в символы верхнего регистра:
 


                                - 107 -
 
                          00152-01 34 04-1
 
 
       PROCEDURE USER_UPCASE_ITEM
 
       ON_ERROR
 
       MESSACE ("NO CURRENT ITEM.");
 
       RETURN;
 
       ENDON_ERROR;
 
       DELIMITERS   := " " + ASCII(9);
 
       CURRENT_ITEM := ANCHOR & SCAN (DELIMITERS);
 
       ITEM_RANGE  := SEARCH (CURRENT_ITEM, FORWARD,
 
                      NO_EXACT);
 
       CHANGE_CASE (ITEM_RANGE, UPPER);
 
       ENDPROCEDURE
 
 
 
           5.11. Процедура COMPILE
 
 
           Встроенная процедура COMPILE преобразует  процедуры  и
 
      операторы языка TPU во внутренний, компилированный  формат.
 
      Порциями, пригодными для  компиляции,  могут  быть  строка,
 
      диапазон, буфер. Эта процедура может возвращать тип  данных
 
      PROGRAM (программа).
 
           Формат:
 
      [PROGRAM :=] COMPILE (STRING или RANGE или BUFFER)
 
           Параметры:
 
           STRING - некоторая строка,  содержащая  процедуру  или
 
      оператор, допустимые в языке TPU;
 
           RANGE - некоторый диапазон, содержащий только процеду-
 
      ры или операторы, допустимые в языке TPU;
 
           BUFFER - некоторый буфер, содержащий только  процедуры
 
      или операторы, допустимые в языке TPU.
 


                                - 108 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           Данные, которые возвращает процедура COMPILE в качест-
 
      ве результата своей работы, имеют тип PROGRAM  и  представ-
 
      ляют собой откомпилированную форму допустимых в  языке  TPU
 
      процедур или операторов. Можно присвоить этот  откомпилиро-
 
      ванный код некоторой переменной.  Операторы  и  определения
 
      процедур могут быть  записаны  в  переменной  типа  PROGRAM
 
      (программа), которую возвращает процедура  COMPILE.  Позже,
 
      во время сеанса  работы  с  утилитой,  можно  запустить  на
 
      выполнение откомпилированный код, используя переменную типа
 
      PROGRAM  в  качестве  параметра  для  встроенной  процедуры
 
      EXECUTE.
 
           Процедура COMPILE возвращает переменную  типа  PROGRAM
 
      только в случае, если в процессе  компиляции  сгенерированы
 
      операторы, пригодные для выполнения. Процедура  COMPILE  не
 
      возвратит переменную типа  PROGRAM,  если  сделана  попытка
 
      компилировать следующие об'екты:
 
           1) нулевые строки или буферы;
 
           2) определения процедур, не имеющие выполняемых опера-
 
      торов;
 
           3) программы с синтаксическими ошибками.
 
           Если используется строка в качестве параметра встроен-
 
      ной процедуры COMPILE, то неопределенные переменные и опре-
 
      деления процедур не могут быть частью этой строки.  Неопре-
 
      деленные переменные или  определения  процедур  могут  быть
 
      частью буфера или диапазона, которые используются как пара-
 
      метры для встроенной процедуры COMPILE.
 
           Разрешается    использовать    встроенную    процедуру
 
      SET(INFORMATIONAL,ON) перед компиляцией процедуры  в  инте-
 
      рактивном режиме для просмотра сообщений компилятора. Неко-


                                - 109 -
 
                          00152-01 34 04-1
 
 
      торые интерфейсы редактирования (например, интерфейс эмуля-
 
      тора малой  клавиатуры  EDT)  по  умолчанию  не  отображают
 
      информационные сообщения.
 
           Для проверки результатов  компиляции  может  использо-
 
      ваться следующий оператор в программе:
 
       X :=COMPILE (MY_RANGE);
 
       ! Если программа не пуста, то продолжение
 
       IF X <> 0
 
          THEN
 
               ! Продолжение
 
               !
 
       ENDIF;  ! Завершение.
 
           Если X=0, то программа  не  была  сгенерирована  из-за
 
      ошибок компиляции или из-за того, что не  было  выполняемых
 
      операторов. Оператор "IF X<> 0  THEN"  позволяет  программе
 
      продолжаться.
 
           Так же можно использовать оператор ON_ERROR  для  про-
 
      верки результата компиляции. Этот оператор будет информиро-
 
      вать об успешном конце компиляции; он не сообщает о возмож-
 
      ности   выполнения.   Допускается   использовать   оператор
 
      ON_ERROR только при  компиляции  определений  процедур  без
 
      следующих за ними выполняемых операторов.
 
           Возвращаемые состояния:
 
           TPU$_EXPECTED WARNING - синтаксическая ошибка;
 
           TPU$_COMPILEFAIL ERROR  -  компиляция  прервана  из-за
 
      синтаксических ошибок.
 
           Примеры:
 
           1. DWN:= COMPILE('MOVE_VERTICAL (1)');
 
      команда сопоставляет функцию MOVE_VERTICAL (1) с переменной
 
      DWN; можно использовать эту переменную во встроенной проце-

                  
                                - 110 -
 
                          00152-01 34 04-1
 
 
      дуре EXECUTE, чтобы переместить текущую позицию символа  на
 
      одну строку вниз.
 
           2. USER_PROGRAM :=COMPILE (MAIN_BUFFER);
 
      команда копирует содержимое  главного  буфера.  Если  буфер
 
      содержит выполняемые операторы, то утилита возвращает прог-
 
      рамму, в которой они записаны; если буфер содержит  опреде-
 
      ления процедур, то  утилита  компилирует  эти  процедуры  и
 
      записывает их в таблицу определений процедур  так,  что  их
 
      можно вызвать одним из следующих способов:
 
           1) указать имя процедуры после  соответствующей  подс-
 
      казки интерфейса редактирования;
 
           2) вызвать процедуру внутри другой процедуры.
 
 
 
           5.12. Процедура COPY_TEXT
 
 
 
           Процедура COPY_TEXT копирует указанный текст и  разме-
 
      щает эту копию в текущем буфере.
 
           Формат:
 
      COPY_TEXT (STRING или RANGE или BUFFER)
 
           Параметры:
 
           STRING - строка в кавычках, или имя переменной, предс-
 
      тавляющей строковую константу, или выражение, дающее  стро-
 
      ку, которая представляет текст для копирования;
 
           RANGE - диапазон, содержащий текст, который необходимо
 
      копировать;
 
           BUFFER - буфер, содержащий текст,  который  необходимо
 
      копировать.
 
           Описание.
 
           Если для текущего буфера установлен режим вставки,  то
 
      указанный текст будет вставлен  перед  текущим  символом  в


                                - 111 -
 
                          00152-01 34 04-1
 
 
      текущем буфере; если для текущего буфера  установлен  режим
 
      замены, то указанный текст будет заменять текст, начиная  с
 
      текущей позиции и до конца строки, диапазона или буфера.
 
           Примечание. Не разрешается добавлять буфер или  диапа-
 
      зон к самому себе; попытка добавить  буфер  к  самому  себе
 
      приведет к выдаче сообщения об ошибке; утилита не проверяет
 
      это условие для диапазона.  Например,  употребление  внутри
 
      диапазона, представленного переменной MY_RANGE, оператора:
 
           COPY_TEXT (MY_RANGE)
 
      приводит к бесконечному циклу; для выхода  из  этого  цикла
 
      необходимо нажать клавишу <CTRL/C>.
 
           Возвращаемое состояние:
 
           TPU$_NOCURRENTBUF WARNING  -  нет  позиционирования  в
 
      буфере;
 
           TPU$_NOCACHE ERROR - нет памяти для выделения  ее  под
 
      новый кэш;
 
           TPU$_NOCOPYBUF WARNING -  не  разрешается  копирование
 
      буфера в самого себя.
 
           Примеры:
 
           1. COPY_TEXT ('персей расположен рядом с андромедой');
 
      в режиме вставки команда приводит к тому, что строка  "пер-
 
      сей расположен рядом с андромедой" будет расположена  перед
 
      текущим символом в текущем буфере.
 
           2. COPY_TEXT (ASCII (10));
 
      в режиме замены команда приводит к тому, что символ перево-
 
      да строки (LINE FEED)  заменит  текущий  символ  в  текущем
 
      буфере.
 
           3. Используется интерфейс эмулятора  малой  клавиатуры
 
      EDT; ввOдится команда SHOW (KEYWORDS) после подсказки  "TPU
 
      COMMAND:". После расположения в начале  буфера  SHOW_BUFFER


                                - 112 -
 
                          00152-01 34 04-1
 
 
      выполняется процедура получения списка целых чисел,  предс-
 
      тавляющих ключевые слова языка TPU:
 
 
       PROCEDURE USER_KEYWORD_NUMBERS
 
       XX := 0;
 
       LOOP
 
       EXECUTE ('XX :=' + CURRENT_LINE);
 
       COPY_TEXT (STR (XX) + ' ');
 
       MOVE_VERTICAL (1);
 
       IF MARK (NONE) = END_OF (SHOW_BUFFER)
 
          THEN RETURN
 
       ENDIF;
 
       MOVE_HORIZONTAL (- CURRENT_OFFSET);
 
       ENDLOOP;
 
       ENDPROCEDURE
 
 
 
           5.13. Процедура CREATE_BUFFER
 
 
           Процедура  CREATE_BUFFER  определяет   новое   рабочее
 
      пространство для редактируемого текста. Можно создать  пус-
 
      той буфер или назначить имя входного файла буферу. Эта про-
 
      цедура может возвращать тип данных BUFFER (буфер).
 
           Формат:
 
      [BUFFER :=]  CREATE_BUFFER (STRING1 [,STRING2])
 
           Параметры:
 
           STRING1 - строка в кавычках,или имя переменной, предс-
 
      тавляющей строковую константу, или выражение, дающее  стро-
 
      ку, которая задает имя создаваемого буфера;
 
           STRING2 -  строка  в  кавычках,  или  имя  переменной,
 
      представляющей строковую константу, или  выражение,  дающее
 
      строку, которая представляет спецификацию  входного  файла,


                                - 113 -
 
                          00152-01 34 04-1
 
 
      помещаемого в буфер.
 
           Описание.
 
           Не обязательно всегда сопоставлять создаваемый буфер с
 
      некоторой переменной, но это сопоставление необходимо, если
 
      в дальнейших операциях будут ссылки на  создаваемый  буфер.
 
      Буферная переменная в левой  части  оператора  присваивания
 
      (BUFFER) представляет собой некоторый элемент, который дол-
 
      жен использоваться в случае, когда  нужно  задать  буфер  в
 
      качестве  параметра  встроенной  процедуры.  Например,  для
 
      того, чтобы переместиться в некоторый буфер для  редактиро-
 
      вания, вводится буферная переменная  в  качестве  параметра
 
      процедуры POSITION:
 
      MY_BUFFER_V := CREATE_BUFFER ('MY_BUFFER_N','MY_FILE_N');
 
      POSITION (MY_BUFFER_V);
 
           Имя буфера, указанное первым  параметром  в  процедуре
 
      CREATE_BUFFER, используется утилитой для идентификации это-
 
      го буфера в строке состояния. Можно изменить строку состоя-
 
      ния с помощью процедуры SET(STATUS_LINE,...).
 
           Допускается создание  нескольких  буферов;  они  могут
 
      быть пустыми или содержать текст. Текущим буфером  является
 
      тот, на который воздействуют выполняемые команды  (пока  не
 
      будет указан другой буфер); только один  буфер  может  быть
 
      текущим.
 
           Буфер отображается на экране, если он связан с некото-
 
      рым окном, отображаемым в этот момент на экран. Любой буфер
 
      может быть связан с несколькими окнами; в этом  случае  все
 
      изменения текста будут видимы во всех  окнах,  связанных  с
 
      этим буфером. Для получения списка всех буферов в контексте
 
      редактирования  используется  встроенная   процедура   SHOW
 
      (BUFFERS).


                                - 114 -
 
                          00152-01 34 04-1
 
 
           Для установки атрибутов буферов используются  ключевые
 
      слова (приводятся значения по умолчанию) процедуры SET:
 
           SET (EOB_TEXT, буфер, строка) - концOM  буфера  текста
 
      является [EOB];
 
           SET (FORWARD, буфер) - направление FORWARD (вперед);
 
           SET  (INSERT,  буфер)  -  режим  ввода  текста  INSERT
 
      (вставка);
 
           SET (MARGIN, буфер, целое1, целое2) - левая граница 1,
 
      правая - 80;
 
           SET (MAX_LINES, буфер,  целое)  -  максимальное  число
 
      строк в буфере 0 (т.е. Этот атрибут сброшен);
 
           SET (NO_WRITE, буфер,ключ_слово) - буфер записывается,
 
      только если модифицирован;
 
           SET (OUTPUT_FILE, буфер, строка) - имя выходного файла
 
      совпадает с именем входного файла, но имеет номер версии на
 
      единицу больше, чем максимальный номер версии входного фай-
 
      ла;
 
           SET (PERMANENT, буфер) - буфер может быть удален;
 
           SET (TAB_STOPS, буфер, строка или целое) -  табулятор-
 
      ные остановы на каждой 8 позиции ;
 
           Возвращаемое состояние:
 
           TPU$_DUPBUFNAME WARNING - первый аргумент должен  быть
 
      уникальной строкой.
 
           Примеры:
 
           1. AB := CREATE_BUFFER ('NEW_BUFFER','LOGIN.COM');
 
      команда создает буфер с именем NEW_BUFFER и запоминает ука-
 
      затель на этот буфер в переменной AB. Переменную  AB  можно
 
      использовать для  указания  некоторого  буфера  в  качестве
 
      параметра  для  встроенной  процедуры.  Спецификация  файла
 
      'LOGIN.COM'  указывает   на   входной   файл   для   буфера


                                - 115 -
 
                          00152-01 34 04-1
 
 
      NEW_BUFFER.
 
           2. В процедуре USER_HELP_BUFFER  создается  буфер  для
 
      вспомогательной информации:
 
 
       PROCEDURE USER_HELP_BUFFER
 
          HELP_BUF := CREATE_BUFFER("HELP_BUF");
 
          SET (EOB_TEXT, HELP_BUF, "[END OF HELP]");
 
          SET (NO_WRITE, HELP_BUF);
 
          SET (SYSTEM, HELP_BUF);
 
       ENDPROCEDURE
 
 
 
           5.14. Процедура CREATE_PROCESS
 
 
           Процедура CREATE_PROCESS запускает подпроцесс и сопос-
 
      тавляет с  ним  некоторый  буфер;  можно  задать  начальную
 
      команду, которая будет послана этому подпроцессу.
 
           Формат:
 
      PROCESS := CREATE_PROCESS (буфер,[,строка])
 
           Параметры:
 
           Буфер - буфер, в котором записывается выходная  инфор-
 
      мация подпроцесса;
 
           Строка - строка в кавычках,или имя переменной,  предс-
 
      тавляющей строковую константу, или выражение, дающее  стро-
 
      ку, содержащую первую команду, которую  необходимо  послать
 
      подпроцессу.
 
           Описание.
 
           Разрешено создание нескольких подпроцессов. При завер-
 
      шении  работы  с  утилитой  все  подпроцессы,  созданные  с
 
      помощью процедуры CREATE_PROCESS, удаляются. Если необходи-
 
      мо удалить подпроцесс до выхода из утилиты, то используется
 
      встроенная процедура DELETE с именем  процесса  в  качестве


                                - 116 -
 
                          00152-01 34 04-1
 
 
      параметра или устанавливается в ноль соответствующая  пере-
 
      менная типа PROCESS.
 
           Процедура CREATE_PROCESS создает подпроцессы во  время
 
      сеанса редактирования и всю выходную информацию этих  подп-
 
      роцессов направляет в специальный буфер утилиты. Есть  воз-
 
      можность запускать программу, которая  полностью  берет  на
 
      себя управление экраном из процесса, созданного  с  помощью
 
      процедуры CREATE_PROCESS. Можно также использовать встроен-
 
      ную  процедуру  SPAWN  для  создания  подпроцесса,  который
 
      приостанавливает TPU-процесс и позволяет работать на уровне
 
      команд DCL.
 
           Возврат из любого подпроцесса  происходит  в  утилиту,
 
      если используется встроенная процедура ATTACH с  подпроцес-
 
      сом в качестве параметра.
 
           Возвращаемое состояние:
 
           TPU$_DUPBUFNAME WARNING - первый аргумент должен  быть
 
      уникальной строкой;
 
           TPU$_CREATEFAIL WARNING - нет возможности  активизиро-
 
      вать указанный подпроцесс.
 
           Примеры:
 
           1. MY_MAIL_P   :=    CREATE_PROCESS    (SECOND_BUFFER,
 
      "MAIL");
 
      оператор   присваивания   создает   подпроцесс   и   задает
 
      SECOND_BUFFER в качестве буфера, в котором  должна  записы-
 
      ваться выходная информация этого подпроцесса.  В  операторе
 
      также задается команда DCL MAIL как первая команда, которая
 
      должна быть выполнена в этом подпроцессе.
 
           2. Процедура USER_DCL_PROCESS создает буфер DCL_BUFFER
 
      для размещения  всей  выходной  информации  при  выполнении
 
      команд уровня DCL, выполняющихся в подпроцессе:


                                - 117 -
 
                          00152-01 34 04-1
 
 
       !
 
       !Создание буфера для размещения результата выполнения
 
       !команд "SET NOON" или "DIRECTORY" на уровне DCL
 
       !
 
      PROCEDURE USER_DCL_PROCESS
 
      DCL_BUFFER := CREATE_BUFFER ('DCL_BUFFER');
 
      MAP (MAIN_WINDOW, DCL_BUFFER);
 
      MY_DCL_PROCESS := CREATE_PROCESS (DCL_BUFFER, 'SET NOON');
 
      MESSAGE ('создан подпроцесс DCL ...');
 
      SEND ('DIRECTORY', MY_DCL_PROCESS);
 
      ENDPROCEDURE
 
 
 
           5.15. Процедура CREATE_RANGE
 
 
           Процедура CREATE_RANGE возвращает диапазон, включающий
 
      в себя два маркера и символы между ними;  необходимо  зада-
 
      вать правила отображения символов этого диапазона на экране
 
      (нет  специальных   признаков,   реверсивное   отображение,
 
      рельефные символы, мигающие или подчеркнутые символы).
 
           Формат:
 
      RANGE :=CREATE_RANGE (MARKER1, MARKER2, ключевое_слово )
 
           Параметры:
 
           MARKER1 - позиция символа, с которого начинается  диа-
 
      пазон;
 
           MARKER2 - позиция символа, на котором кончается диапа-
 
      зон;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           NONE - для символов диапазона не  применяются  никакие
 
      специальные признаки (видеоатрибуты);
 
           BOLD  -  символы  диапазона  должны  быть   отображены
 


                                - 118 -
 
                          00152-01 34 04-1
 
 
      рельефно;
 
           BLINK - символы диапазона должны мигать;
 
           REVERSE - символы  диапазона  должны  быть  отображены
 
      негативно, (реверсивное отображение);
 
           UNDERLINE - символы диапазона должны быть подчеркнуты.
 
           Описание.
 
           Встроенная процедура  MARK  создает  маркеры,  которые
 
      ограничивают диапазон.
 
           Процедура CREATE_RANGE  создает  структуру  диапазона,
 
      который ограничен  указанными  процедурой  MARK  маркерами.
 
      Можно создать несколько диапазонов в любом буфере.  Исполь-
 
      зование видеоатрибутов для диапазона дает  возможность  его
 
      просмотра, если только он расположен в буфере, отображаемом
 
      на экран.
 
           Очистка содержимого  некоторого  диапазона  с  помощью
 
      процедуры ERASE не приводит  к  уничтожению  диапазона  как
 
      структуры. Структура диапазона и  любые  его  видеоатрибуты
 
      перемещаются на следующий ближайший  символ.  Для  удаления
 
      структуры  диапазона  используется   встроенная   процедура
 
      DELETE; можно установить переменную, связанную  с  диапазо-
 
      ном, в ноль.
 
           Если конец диапазона  приходится  на  конец  некоторой
 
      строки, то МАRКЕR2 должен быть неотображаемым символом. TPU
 
      не использует видеоатрибуты для непечатных символов.  Одна-
 
      ко, если вставляется новый символ перед  концом  диапазона,
 
      то он будет иметь те же видеоатрибуты,  какие  были  заданы
 
      при создании диапазона.
 
           Возвращаемое состояние:
 
           TPU$_NOTSAMEBUF WARNING - первый и второй маркеры рас-
 
      положены в разных буферах.


                                - 119 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. MY_RANGE     :=     CREATE_RANGE     (FIRST_MARKER,
 
      SECOND_MARKER, BOLD)
 
      Оператор присваивания создает диапазон, начинающийся с мар-
 
      кера FIRST_MARKER и кончающийся на  маркере  SECOND_MARKER.
 
      При отображении диапазона на экране все его  символы  будут
 
      Oтображены рельефно.
 
           2. В процедуре USER_ERASE_TO_EOB  очищается  текстовое
 
      содержимое текущего буфера, начиная с текущего символа и до
 
      конца этого буфера:
 
 
      PROCEDURE USER_ERASE_TO_EOB
 
      LOCAL START_OF_RANGE, HERE_TO_EOB;
 
         START_OF_RANGE := MARK (NONE);
 
         HERE_TO_EOB    := CREATE_RANGE (START_OF_RANGE,
 
                                        END_OF(CURRENT_BUFFER),
 
                                        NONE);
 
         ERASE (HERE_TO_EOB);
 
      ENDPROCEDURE
 
 
 
           5.16. Процедура CREATE_WINDOW
 
 
           Процедура CREATE_WINDOW определяет область экрана тер-
 
      минала, называемую окном. Необходимо  задать  номер  строки
 
      экрана, с которой начинается окно,  длину  окна  и  условия
 
      отображения строки состояния этого окна. Процедура  возвра-
 
      щает в качестве результата своей работы тип  данных  WINDOW
 
      (если это требуется).
 
           Формат:
 
      [WINDOW:=]CREATE_WINDOW (INTEGER1, INTEGER2, ключ_слово)
 


                                - 120 -
 
                          00152-01 34 04-1
 
 
           Параметры:
 
           INTEGER1 - номер строки экрана, с  которой  начинается
 
      окно;
 
           INTEGER2 - количество строк в окне;
 
           Ключ_слово - задает состояние отображения строки  сос-
 
      тояния, которая занимает последнюю строку окна. Допустимыми
 
      ключевыми словами являются:
 
           1) ON - разрешает отображение строки состояния; строка
 
      состояния отображается негативно (по умолчанию) и  содержит
 
      следующую информацию о буфере,  который  в  текущий  момент
 
      отображается в это окно:
 
           - имя буфера, с которым связано это окно;
 
           - имя файла, который связан с этим буфером;
 
           2) OFF - подавляет отображение строки состояния.
 
           Описание.
 
           Процедура CREATE_WINDOW возвращает в качестве  резуль-
 
      тата своей работы тип данных WINDOW (окно). Для использова-
 
      ния созданного окна в качестве параметра для других  проце-
 
      дур необходимо сопоставить  имя  (некоторую  переменную)  с
 
      этим окном.
 
           Разрешается создание нескольких  окон  на  экране,  но
 
      только одно окно может быть текущим. Курсор позиционируется
 
      в текущем окне.
 
           Для того, чтобы сделать окно видимым, необходимо  свя-
 
      зать с ним некоторый буфер и отобразить окно на экран, нап-
 
      ример:
 
      MAP (MAIN_WINDOW, MAIN_BUFFER)
 
           Для установки атрибутов окна можно  использовать  сле-
 
      дующие ключевые слова  процедуры  SET  (значения  атрибутов
 
      приведены принятые по умолчанию):


                                - 121 -
 
                          00152-01 34 04-1
 
 
           1) SET (PAD, WINDOW, ключ_слово) - запрещает  дополне-
 
      ние пробелами справа в строках окна;
 
           2) SET (SCROLLING,  WINDOW,  ключ_слово,  цел1,  цел2,
 
      цел3) - перемещение курсора при прокрутке информации в окне
 
      ограничено сверху первой строкой окна,  а  снизу  -  нижней
 
      строкой окна. Если используемый терминал не  имеет  функции
 
      перемещения регионов, то будет происходить перевывод содер-
 
      жимого окна;
 
           3) SET (STATUS_LINE,  WINDOW,  ключ_слово,  строка)  -
 
      строка состояния может быть  включена  (ON)  или  выключена
 
      (OFF) в соответствии с ключевым словом, которое было задано
 
      в обращении к процедуре CREATE_WINDOW;
 
           4) SET (TEXT, окно, ключ_слово) - отображение  табуля-
 
      ционных остановов пробелами;
 
           5) SET (WIDTH, окно, целое) - ширина окна равна  физи-
 
      ческой ширине экрана терминала при создании окна.
 
           Возвращаемые состояния:
 
      TPU$BADWINDLEN     WARNING - недопустимая длина окна;
 
      TPU$_BADFIRSTLINE  WARNING - недопустимая первая строка
 
                                   для окна.
 
 
           Примеры:
 
           1 NEW_WINDOW:=CREATE_WINDOW(11,10,ON);
 
 
      В этом операторе присваивания создается окно, которое начи-
 
      нается с 11 строки экрана терминала, имеет длину 10 строк и
 
      сопоставлено  с  переменной  NEW_WINDOW.  Строка  состояния
 
      будет отображаться в последней строке окна.  Чтобы  сделать
 
      это окно видимым, необходимо связать существующий  буфер  с
 
      этим окном и отобразить его на экран с помощью команды:
 
      MAP(NEW_WINDOW, BUFFER_VARIABLE)


                                - 122 -
 
                          00152-01 34 04-1
 
 
           2. Процедура USER_MAKE_WINDOW  создает  окно,  которое
 
      связывается с переменной NEW_WINDOW; это окно начинается со
 
      строки номер 1 терминала и имеет 21 строку. Строка  состоя-
 
      ния не отображается.  Табуляционные  остановы  отображаются
 
      как специальные графические символы. Буфер NEW_BUFFER,  для
 
      которого установлено NO_WRITE, связывается  с  этим  окном;
 
      окно отображается на экран:
 
 
 
      PROCEDURE USER_MAKE_WINDOW ;
 
      NEW_WINDOW:=CREATE_WINDOW(I,21,оFF) ;
 
      SET (TEXT,NEW_WINDOW,GRAPHIC_TABS) ;
 
      NEW_BUFFER:=CREATE_BUFFER('USER_BUFFER_NAME');
 
      SET (NO_WRITE,NEW_BUFFER) ;
 
      MAP (NEW_WINDOW,NEW_BUFFER) ;
 
      ENDPROCEDURE
 
 
 
           5.17. Процедура CURRENT_BUFFER
 
 
           Встроенная  процедура  CURRENT_BUFFER  возвращает  имя
 
      буфера, который в настоящий момент является текущим.
 
           Формат:
 
      BUFFER:=CURRENT_BUFFER
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Текущий буфер представляет собой рабочее пространство,
 
      на которое воздействуют команды  утилиты.  Текущая  позиция
 
      символа расположена в текущем буфере;  она  не  обязательно
 
      совпадает с текущим положением курсора.
 


                                - 123 -
 
                          00152-01 34 04-1
 
 
           Возвращаемое состояние:
 
      TPU$_NOCURRENTBUF WARNING - нет позиционирования буфере.
 
 
           Примеры:
 
           1. MY_CUR_BUF:=CURRENT_BUFFER
 
      В операторе присваивания в  переменной  MY_CUR_BUF  запоми-
 
      нается указатель на текущий буфер.
 
           2. SHOW (CURRENT_BUFFER)
 
      Эта команда возвращает указатель в текущий буфер, и исполь-
 
      зует его как параметр для встроенной процедуры SHOW.
 
           3. В  процедуре  USER_TOGGLE_DIRECTION  для   текущего
 
      буфера его направление заменяется на противоположное.
 
      PROCEDURE USER_TOGGLE_DIRECTION
 
      IF CURRENT_DIRECTION = FORWARD
 
         THEN SET (REVERSE, CURRENT_BUFFER);
 
         ELSE SET (FORWARD, CURRENT_BUFFER);
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.18. Процедура CURRENT_CHARACTER
 
 
           Процедура CURRENT_CHARACTER возвращает  строку  длиной
 
      единица (один символ), которая содержит  текущий  символ  в
 
      текущем буфере.
 
           Формат:
 
      STRING:=CURRENT_CHARACTER
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Текущая позиция символа представляEт собой позицию, на
 
      которую (по умолчанию) воздействуют все исполняемые  коман-


                                - 124 -
 
                          00152-01 34 04-1
 
 
      ды. Допускается явно указывать,  что  команды  должны  воз-
 
      действовать на другую позицию.
 
           Если текущая позиция символа расположена в конце стро-
 
      ки, то CURRENT_CHARACTER возвращает  нулевую  строку.  Если
 
      текущая позиция символа  расположена  в  конце  буфера,  то
 
      CURRENT_CHARACTER возвращает нулевую строку и  выдает  пре-
 
      дупреждение.
 
           Возвращаемое состояние:
 
      TPU$_NOCURRENTBUF WARNING - нет позиционирования в буфере;
 
      TPU$_NOEOBSTR     WARNING - позицированние на EOB-маркере.
 
           Примеры:
 
           1. MY_CUR_CHAR:=CURRENT_CHARACTER
 
      в операторе присваивания в переменную  MY_CUR_CHAR  записы-
 
      вается строка, представляющая текущий символ.
 
           2. MESSAGE (CURRENT_CHARACTER)
 
      оператор возвращает строку,  которая  представляет  текущий
 
      символ, и использует эту строку как параметр для  процедуры
 
      MESSAGE.
 
           3. В процедуре USER_DISPLAY_CURRENT_CHARACTER  символ,
 
      расположенный на текущей позиции  курсора,  записывается  в
 
      область сообщений:
 
 
 
      PROCEDURE USER_DISPLAY_CURRENT_CHARACTER
 
            !Эта процедура возвращает символ КОИ-8,
 
            !Расположенный в текущей позиции    
 
          ASCII_CHAR:=CURRENT_CHARACTER;
 
          IF ASCII_CHAR <> ""
 
       THEN MESSAGE ("THE CURRENT CHARACTER IS " + ASCII_CHAR);
 
            ELSE MESSAGE ("THERE IS NO CURRENT CHARACTER");
 
          ENDIF;


                                - 125 -
 
                          00152-01 34 04-1
 
 
      ENDPROCEDURE
 
 
 
           5.19. Процедура CURRENT_COLUMN
 
 
           Процедура CURRENT_COLUMN возвращает целое число,  рав-
 
      ное текущему номеру колонки курсора на экране.
 
           Формат:
 
      INTEGER:=CURRENT_COLUMN
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Текущая колонка - это колонка  на  экране,  в  которой
 
      позиционирован  курсор.  Номера  колонок  изменяются  от  1
 
      (левая граница экрана) до максимального  правого  значения,
 
      которое определяется типом используемого терминала.
 
           Значение,  которое  возвращает  встроенная   процедура
 
      CURRENT_COLUMN, эквивалентно значению,  которое  возвращает
 
      процедура GET_INFO (SCREEN, "CURRENT_COLUMN").
 
           При выполнении CURRENT_COLUMN внутри другой  процедуры
 
      целое число,  которое  возвращается  процедурой,  может  не
 
      соответствовать изменениям в  позиции  курсора,  вызванными
 
      предыдущими операторами этой процедуры; полученное значение
 
      может не быть текущим потому, что TPU не обновляет экран до
 
      тех пор, пока все операторы в процедуре не будут выполнены.
 
           Чтобы позиция курсора отражала истинную позицию редак-
 
      тирования,    необходимо    поместить    оператор    UPDATE
 
      (CURRENT_WINDOW) непосредственно перед  каждым  оператором,
 
      содержащим CURRENT_COLUMN.
 
           Если нецелесообразно задавать  явное  обновление  окна
 
      для получения  текущего  значения  колонки,  то  необходимо
 


                                - 126 -
 
                          00152-01 34 04-1
 
 
      использовать одну из следующих возможностей:
 
           1)     при     свободном     передвижении      курсора
 
      (CURSOR_VERTICAL, CURSOR_HORIZONTAL)  встроенная  процедура
 
      GET_INFO возвращает номер колонки, которую должен  занимать
 
      курсор, если не задано явное обновление экрана;
 
           2)    при    ограниченном     передвижении     курсора
 
      (MOVE_VERTICAL,   MOVE_HORIZONTAL)   встроенная   процедура
 
      GET_INFO (буферная_переменная, "OFFSET_COLUMN")  возвращает
 
      номер колонки, который является текущим смещением в буфере,
 
      отображенном в окно.
 
           Если окно сдвинуто, то CURRENT_COLUMN возвращает теку-
 
      щий номер колонки курсора на экране. Значение, возвращаемое
 
      оператором Х:=GET_INFO (BUFFER, "OFFSET_COLUMN"),  содержит
 
      число колонок, на которое  сдвинуто  окно.  Например,  если
 
      окно сдвинуто на 8 колонок влево, то CURRENT_COLUMN возвра-
 
      щает значение  1,  в  то  время  как  X:=GET_INFO  (BUFFER,
 
      "OFFSET_COLUMN") возвращает значение 9.
 
 
           Примеры:
 
           1. MY_CUR_COL:=CURRENT COLUMN ;
 
      В этом операторе переменной MY_CUR_COL присваивается  номер
 
      колонки, в которой расположен курсор.
 
           2. MESSAGE (STR (CURRENT_COLUMN)) ;
 
      В этом операторе об'единены три встроенные  процедуры  TPU.
 
      Процедура CURRENT_COLUMN возвращает  целое  число,  которое
 
      является номером текущей колонки, процедура STR преобразует
 
      это целое в строку, процедура MESSAGE записывает эту строку
 
      в буфер сообщений.
 
           3. Процедура USER_SPLIT_LINE  делит  любую  строку  на
 
      части в текущей позиции курсора. Если текущей позицией сим-
 


                                - 127 -
 
                          00152-01 34 04-1
 
 
      вола являются колонка 1 и строка 1, то процедура перемещает
 
      экран:
 
 
 
      PROCEDURE USER_SPLIT_LINE
 
      LOCAL OLD_POSITION, NEW_POSITION;
 
         SPLIT_LINE ;
 
         IF (CURRENT_ROW = 1) AND (CURRENT_COLUMN = 1)
 
           THEN
 
              OLD_POSITION:=MARK(NONE) ;
 
              SCROLL (CURRENT_WINDOW, -1) ;
 
              NEW_POSITION:=MARK(NONE) ;
 
              !MAKE SURE WE SCROLLED BEFORE DOING CURSOR_VERTICAL
 
                 IF NEW_POSITION <> OLD_POSITION
 
                    THEN
 
                       CURSOR_VERTICAL (1) ;
 
                 ENDIF ;
 
         ENDIF ;
 
      ENDPROCеDURE
 
 
 
           5.20. Процедура CURRENT_DIRECTION
 
 
           Процедура CURRENT_DIRECTION возвращает ключевое  слово
 
      (FORWARD или REVERSE), которое определяет текущее направле-
 
      ние в текущем буфере.
 
           Формат:
 
      Ключевое_слово:=CURRENT_DIRECTION
 
           Параметры:
 
           Отсутствуют.
 


                                - 128 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           Если возвращено ключевое  слово  FORWARD,  то  текущим
 
      направлением является  направление  к  концу  буфера.  Если
 
      возвращено ключевое слово REVERSE, то текущим  направлением
 
      является направление к началу буфера.
 
           Возвращаемое состояние:
 
      TPU$_NOCURRENTBUF WARNING - нет позицирования в буфере.
 
 
           Примеры:
 
           1. MY_CUR_DIR:=CURRENT_DIRECTION ;
 
      В этом операторе присваивания в переменную MY_CUR_DIR запи-
 
      сывается ключевое слово, определяющее текущее направление в
 
      буфере.
 
           2. Процедура USER_SHOW_DIRECTION записывает сообщение,
 
      определяющее текущее направление  перемещения  символов,  в
 
      буфер сообщений:
 
 
 
      PROCEDURE USER_SHOW_DIRECTION
 
          IF CURRENT_DIRECTION = FORWARD
 
             THEN MY_MESSAGE1:=MESSAGE ("FORWARD") ;
 
             ELSE MY_MESSAGE2:=MESSAGE ("REVERSE") ;
 
          ENDIF ;
 
      ENDPROCEDURE
 
 
 
           5.21. Процедура CURRENT_LINE
 
 
           Встроенная процедура CURRENT_LINE  возвращает  строку,
 
      являющуюся текущей, т.е. содержащую текущую позицию  симво-
 
      ла.
 


                                - 129 -
 
                          00152-01 34 04-1
 
 
           Формат:
 
      STRING:=CURRENT_LINE
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Если текущая строка имеет нулевую длину, то  процедура
 
      CURRENT_LINE возвращает строку длиной 0. Если курсор распо-
 
      ложен в конце буфера,  то  CURRENT_LINE  возвращает  строку
 
      длиной 0 и выдает предупреждение.
 
           Возвращаемое состояние:
 
      TPU$_NOCURRENTBUF WARNING - нет позиционирования в буфере;
 
      TPU$_NOEOBSTR    WARING - позиционирование на EOB-маркере.
 
           Примеры:
 
           1. MY_CUR_LIN:=CURRENT_LINE ;
 
      В этом операторе присваивания в переменную MY_CUR_LIN запи-
 
      сывается строка, которая представляет текущую строку. Теку-
 
      щей строкой является строка в  текущем  буфере,  содержащая
 
      текущую позицию символа.
 
           2. Процедура  USER_RUNOFF_LINE   возвращает   значение
 
      истина, если текущая строка  похожа  на  команду  программы
 
      RUNOFF (начинается с точки, за которой следует символ алфа-
 
      вита, точка с запятой, или восклицательный знак), в против-
 
      ном случае эта процедура возвращает значение ложь. В проце-
 
      дуре предполагается, что курсор был в начале  строки,  а  в
 
      конце работы курсор перемещается в начало строки.
 
      PROCEDURE USER_RUNOFF_LINE
 
      IF LENGTH (CURRENT_LINE) < 2
 
         THEN USER_RUNOFF_LINE:=0 ;
 
         ELSE
 
            IF CURRENT_CHARACTER <> ","


                                - 130 -
 
                          00152-01 34 04-1
 
 
               THEN
 
                  USER_RUNOFF_LINE:=0 ;
 
               ELSE MOVE_HORIZONTAL (1) ;
 
                  IF INDEX
 
      ("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ!;",
 
       CURRENT_CHARACTER) = 0
 
                     THEN USER_RUNOFF_LINE:=0;
 
                     ELSE USER_RUNOFF_LINE:=1;
 
                  ENDIF;
 
                  MOVE_HORIZONTAL (-1);
 
            ENDIF;
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.22. Процедура CURRENT_OFFSET
 
 
           Процедура CURRENT_OFFSET  возвращает  целое  значение,
 
      которое представляет собой смещение текущего символа внутри
 
      текущей строки.
 
           Формат:
 
      INTEGER:=CURRENT_OFFSET
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Текущее смещение указывает на позицию символа в  теку-
 
      щей строке. Самая левая позиция в строке имеет смещение  0,
 
      это смещение увеличивается на единицу для каждого последую-
 
      щего символа (включая символ табуляции) в правом  направле-
 
      нии.
 


                                - 131 -
 
                          00152-01 34 04-1
 
 
           Возвращаемое состояние:
 
      TPU$_NOCURRENTBUF WARNING - нет позиционирования в буфере.
 
 
           Примеры:
 
           1. MY_CUR_OFF:= CURRENT_OFFSET ;
 
      В этом операторе присваивания в переменную MY_CUR_OFF запи-
 
      сывается целое число, которое является  смещением  текущего
 
      символа от начала строки.
 
           2. Процедура USER_DELETE использует CURRENT_OFFSET для
 
      определения текущей позиции  редактирования.  Если  позиция
 
      расположена в  начале  строки,  то  процедура  присоединяет
 
      текущую строку к предыдущей строке; если позиция не в нача-
 
      ле строки, то удаляется предыдущий символ:
 
      PROCEDURE USER_DELETE
 
      IF CURRENT_OFFSET = 0
 
         THEN APPEND_LINE;
 
         ELSE ERASE_CHARACTER (-1);
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.23. Процедура CURRENT_ROW
 
 
           Процедура CURRENT_ROW возвращает целое значение,  рав-
 
      ное номеру строки экрана, в которой расположен курсор.
 
           Формат:
 
      INTEGER:= CURRENT_ROW
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Текущая строка - это строка экрана, в которой располо-
 
      жен курсор. Строки экрана нумеруются от верхней части экра-


                                - 132 -
 
                          00152-01 34 04-1
 
 
      на от единицы до максимального числа строк на данном терми-
 
      нале. Можно получить  значение  текущей  строки,  используя
 
      встроенную процедуру GET_INFO (SCREEN, "CURRENT_ROW").
 
           При выполнении  CURRENT_ROW  внутри  другой  процедуры
 
      возвращенное значение может не отразить все изменения пози-
 
      ции курсора на данный момент. Чтобы позиция курсора отража-
 
      ла истинную позицию  редактирования,  необходимо  поместить
 
      оператор UPDATE (CURRENT_WINDOW) непосредственно перед каж-
 
      дым оператором, содержащим CURRENT_ROW.
 
           Примеры:
 
           1. MY_CUR_ROW:=CURRENT_ROW ;
 
      В этом операторе присваивания в переменную MY_CUR_ROW запи-
 
      сывается номер строки экрана, в которой расположен курсор.
 
           2. Процедуры USER_GO_UP и USER_GO_DOWN вызывают  пере-
 
      мещение курсора вверх или вниз по  экрану.  CURSOR_VERTICAL
 
      пересекает границы окон,  поэтому  необходимо  использовать
 
      встроенную  процедуру  SCROLL,  обеспечивающую  перемещение
 
      внутри любого окна при свободном перемещении  курсора.  Эти
 
      процедуры можно назначить любой клавише, тогда  перемещение
 
      курсора будет вызываться нажатием соответствующей клавиши:
 
      PROCEDURE USER_GO_UP
 
      IF CURRENT_ROW = GET_INFO (CURRENT_WINDOW, "VISIBLE_TOP")
 
         THEN SCROLL (CURRENT_WINDOW, -1) ;
 
         ELSE CURSOR_VERTICAL (-1) ;
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
      PROCEDURE USER_GO_DOWN
 
      IF CURRENT_ROW = GET_INTO (CURRENT_WINDOW,"VISIBLE_BOTTOM")
 
         THEN SCROLL (CURRENT_WINDOW, 1) ;


                                - 133 -
 
                          00152-01 34 04-1
 
 
         ELSE CURSOR_VERTICAL (1) ;
 
      ENDIF ;
 
      ENDPROCEDURE
 
 
 
           5.24. Процедура CURRENT_WINDOW
 
 
           Процедура CURRENT_WINDOW возвращает  окно,  в  котором
 
      расположен курсор (текущее окно).
 
           Формат:
 
 
      WINDOW:=CURRENT_WINDOW
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Текущее окно - это окно, в  которое  в  последний  раз
 
      было позиционирование процедурой POSITION, или окно,  кото-
 
      рое было последним отображено на экран с помощью  процедуры
 
      мар. Позиция курсора на экране задается в  текущем  окне  с
 
      помощью экранных координат  CURRENт_COLUMN  и  CURRENT_ROW.
 
      Текущий буфер не обязательно связан с текущим окном.
 
           Возвращаемое состояние:
 
      TPU$_WINDNOTMAPPED   WARNING - нет окон, отображающих буфер
 
                                     на экран.
 
           Примеры:
 
           1. MY_CUR_WIN :=CURRENT_WINDOW;
 
      В этом операторе присваивания в переменную MY_CUR_WIN запи-
 
      сывается окно, которое содержит курсор.
 
           2. Процедура USER_NEXT_SCREEN определяет длину текуще-
 
      го окна и использует это значение как параметр для встроен-
 
      ной процедуры SCROLL:
 


                                - 134 -
 
                          00152-01 34 04-1
 
 
      PROCEDURE USER_NEXT_SCREEN
 
      LOCAL HOW_MUCH_SCROLL ;
 
      HOW_MUCH_SCROLL:=GET_INFO (CURRENT_WINDOW,"VISIBLE_LENGTH")
 
      SCROLL (CURRENT_WINDOW, HOW_MUCH_SCROLL);
 
      ENDPROCEDURE
 
 
 
           5.25. Процедура CURSOR_HORIZONTAL
 
 
           Процедура CURSOR_HORIZONTAL перемещает позицию курсора
 
      по экрану на заданное количество колонок экрана.
 
           Формат:
 
      CURSOR_HORIZONTAL (INTEGER)
 
           Параметры:
 
           INTEGER - целое значение со  знаком  плюс  или  минус,
 
      которое задает количество экранных колонок для  перемещения
 
      позиции курсора.
 
           Описание.
 
           Положительное целое значение вызывает перемещение кур-
 
      сора вправо. Отрицательное значение перемещает курсор  вле-
 
      во. Курсор не перемещается  за  левую  или  правую  границу
 
      текущего окна. Следовательно, даже если экран имеет  ширину
 
      в 132 колонки, курсор остановится на колонке номер 80, если
 
      текущее окно имеет ширину в 80 колонок.  Редактирование  не
 
      может выполняться вне границ любого окна. Данная  процедура
 
      может использоваться для свободного перемещения  курсора  в
 
      горизонтальном направлении. Свободное  перемещение  курсора
 
      означает, что курсор не привязан к тексту и  может  пересе-
 
      кать все доступные колонки в строке экрана.
 
           При использовании  этой  процедуры  обновление  экрана
 
      происходит в следующих случаях:
 


                                - 135 -
 
                          00152-01 34 04-1
 
 
           1) выполняется любая встроенная  процедура,  модифици-
 
      рующая буфер или  текущую  позицию  символа  внутри  буфера
 
      перед  обращением  к  CURSOR_HORIZONTAL.  Это  обеспечивает
 
      горизонтальное перемещение  курсора  с  правильной  позиции
 
      символа;
 
           2) диспетчер экрана не обновляет экран (исключая  пре-
 
      дыдущий случай) для отражения  горизонтального  перемещения
 
      курсора до тех пор, пока не закончится выполнение  процеду-
 
      ры.
 
           Процедура CURSOR_HORIZONTAL не должна  работать,  если
 
      используется входное устройство,  отличное  от  терминалов,
 
      которые поддерживает TPU.
 
 
           Примеры:
 
           1. CURSOR_HORIZONTAL (1) ;
 
      Эта команда перемещает  позицию  курсора  на  одну  колонку
 
      экрана вправо.
 
           2. Процедура USER_FREE_CURSOR_RIGHT  (LEFT)  обеспечи-
 
      вает свободное перемещение курсора вправо и влево. Эти про-
 
      цедуры могут быть привязаны к клавишам (например, к  клави-
 
      шам со стрелками),  чтобы  перемещение  могло  быть  задано
 
      одним нажатием на клавишу:
 
      PROCEDURE USER_FREE_CURSOR_RIGHT
 
      CURSOR_HORIZONTAL (1) ;
 
      ENDPROCEDURE
 
      PROCEDURE USER_FREE_CURSOR_LEFT
 
      CURSOR_HORIZONTAL (-1) ;
 
      ENDPROCEDURE
 


                                - 136 -
 
                          00152-01 34 04-1
 
 
           5.26. Процедура CURSOR_VERTICAL
 
 
           Процедура CURSOR_VERTICAL перемещает курсор вверх  или
 
      вниз по экрану на указанное число строк экрана.
 
           Формат:
 
      CURSOR_VERTICAL (INTEGER)
 
           Параметры:
 
           INTEGER - целое значение со  знаком  плюс  или  минус,
 
      задающее количество строк перемещения курсора.
 
           Описание.
 
           Положительное целое число вызывает перемещение курсора
 
      вниз. Отрицательное целое число  перемещает  курсор  вверх.
 
      Курсор не может быть перемещен за верхнюю или нижнюю грани-
 
      цу экрана, но может пересекать границу окна. Если на экране
 
      расположено несколько окон,  то  процедура  CURSOR_VERTICAL
 
      может переместить позицию курсора  в  новое  окно,  которое
 
      становиться текущим.
 
           Позиция курсора по колонкам  отстается  неизменной  до
 
      тех пор, пока вертикальное перемещение курсора  не  выведет
 
      его наружу окна, ширина которого меньше предыдущего окна. В
 
      этом случае курсор перемещается в левом направлении до  тех
 
      пор, пока не будет позиционирован внутри более узкого  окна
 
      у его правой границы.
 
           Процедура CURSOR_VERTICAL может быть использована  для
 
      обеспечения свободного перемещения курсора  в  вертикальном
 
      напрAвлении. Свободное перемещение  курсора  означает,  что
 
      курсор не привязан к тексту и может перемещаться по строкам
 
      экрана вверх  или  вниз.  Процедура  CURSOR_VERTICAL  будет
 
      позиционировать курсор только  в  тех  областях  экрана,  в
 
      которых  можно  производить  редактирование;  процедура  не
 


                                - 137 -
 
                          00152-01 34 04-1
 
 
      будет позиционировать курсор, например, в строке  состояния
 
      окна, в области PROMPT_AREA или в области экрана, не являю-
 
      щейся частью окна.
 
           При  использовании  процедуры  CURSOR_VERTICAL  внутри
 
      другой процедуры может произойти обновление экрана:
 
           1)  если  выполняется  встроенная  процедура,  которая
 
      модифицирует буфер или текущую позицию символа внутри буфе-
 
      ра перед обращением к CURSOR_VERTICAL; экран будет обновлен
 
      перед выполнением процедуры CURSOR_VERTICAL,  чтобы  верти-
 
      кальное перемещение курсора началось с  корректной  позиции
 
      символа;
 
           2) диспетчер экрана не будет  обновлять  экран  (кроме
 
      предыдущего случая) для отражения вертикального перемещения
 
      курсора до тех пор, пока процедура не закончит свою  работу
 
      и управление не вернется к диспетчеру экрана.
 
           Встроенная процедура CURSOR_VERTICAL  не  будет  рабо-
 
      тать, если  используется  в  качестве  входного  устройства
 
      видеотерминал, не поддерживаемый TPU.
 
 
           Примеры:
 
           1. CURSOR_VERTICAL (5) ;
 
      Эта команда перемещает позицию курсора на 5 строк  вниз  по
 
      экрану.
 
           2. Процедуры  USER_FREE_CURSOR_UP(DOWN)   обеспечивают
 
      свободное перемещение курсора вверх и вниз по  экрану.  Эти
 
      процедуры могут быть назначены  любым  клавишам  (например,
 
      клавишам со стрелками), чтобы перемещение можно  было  выз-
 
      вать одним нажатием клавиши. В отличие от встроенной проце-
 
      дуры      CURSOR_HORIZONTAL,      встроенная      процедура
 
      CURSOR_VERTICAL пересекает границы окон. Встроенная  проце-
 


                                - 138 -
 
                          00152-01 34 04-1
 
 
      дура SCROLL обеспечивает перемещение курсора внутри  одного
 
      окна:
 
      PROCEDURE USER_FREE_CURSOR_UP
 
      IF GET_INFO(CURRENT_WINDOW, "CURRENT_ROW") =
 
         GET_INFO (CURRENT_WINDOW, "VISIBLE_TOP")
 
         THEN SCROLL (CURRENT_WINDOW, -1) ;
 
         ELSE CURSOR_VERTICAL (-1) ;
 
      ENDIF ;
 
      ENDPROCEDURE ;
 
      PROCEDURE USER_FREE_CURSOR_DOWN
 
      IF GET_INFO (CURENT_WINDOW, "CURRENT_ROW") =
 
         GET_INFO (CURRENT_WINDOW, "VISIBLE_BOTTOM")
 
         THEN SOROLL (CURRENT_WINDOW, 1) ;
 
         ELSE CURSOR_VERTICAL (1) ;
 
      ENDIF ;
 
      ENDPROCEDURE
 
 
 
           5.27. Процедура DEFINE_KEY
 
 
           Процедура DEFINE_KEY связывает  выполняемую  программу
 
      на языке TPU с одной клавишей или с комбинацией клавиш.
 
           Формат:
 
      DEFINE_KEY (STRING1 или BUFFER или RANGE  или  PROGRAM  или
 
      LEARN, ключевое_слово [,STRING2])
 
           Параметры:
 
           STRING1 - строка, определяющая операторы языка TPU,  с
 
      которыми будет связана клавиша;
 
           BUFFER - буфер,  содержащий  операторы  языка  TPU,  с
 
      которыми будет связана клавиша;
 
           RANGE - диапазон, содержащий операторы  языка  TPU,  с
 


                                - 139 -
 
                          00152-01 34 04-1
 
 
      которыми будет связана клавиша;
 
           PROGRAM - выполняемая программа на языке TPU, с  кото-
 
      рой будет связана клавиша;
 
           LEARN  -  обучающая  последовательность,  определяющая
 
      выполняемую программу на языке TPU, с которым будет связана
 
      клавиша;
 
           Ключевое_слово - любое ключевое имя  для  клавиши  или
 
      комбинации клавиш. Полный список ключевых  слов  языка  TPU
 
      можно  просмотреть  с  помощью  встроенной  процедуры  SHOW
 
      (KEYWORDS). Для опрелеления клавиши, не  имеющей  ключевого
 
      имени,   необходимо   использовать   встроенную   процедуру
 
      KEY_NAME, создающую ключевое  имя  для  указанной  клавиши.
 
      Например, KEY_NAME ('A',SHIFT_KEY) создает ключевое имя для
 
      комбинации клавишии PF1 (клавиша регистра в языке TPU, при-
 
      нятая по умолчанию) и символа 'А';
 
           STRING2 - необязательная строка, относящаяся к опреде-
 
      ляемой клавише. Эта строка рассматривается как комментарий,
 
      который  можно  получить,  используя  встроенную  процедуру
 
      LOOKUP_KEY.
 
           Описание.
 
           Встроенная процедура  DEFINE_KEY  вызывает  компиляцию
 
      первого параметра, если он представляет собой строку, буфер
 
      или диапазон. Использование встроенной процедуры DEFINE_KEY
 
      для изменения определения ранее определенной клавишы,  при-
 
      водит к потере предыдущего определения.
 
           Допускается определение  всех  клавиш  на  клавиатурах
 
      терминалов типа VT100 и VT200 (как на основных,  так  и  на
 
      малых), за исключением следующих:
 
           1) клавиша COMPOSE;
 
           2) клавиша ESCAPE;


                                - 140 -
 
                          00152-01 34 04-1
 
 
           3) клавиша SHIFT;
 
           4) клавиши F1 - F5;
 
           5) PF1 - клавиша регистра для редактора по умолчанию.
 
           Определение следующих клавиш и комбинаций клавиш долж-
 
      но выполняться аккурратно и  не  рекомендуется  без  особой
 
      необходимости:
 
           1) CTRL/C, CTRL/O, CTRL/X и  F6  -  перед  выполнением
 
      программы, связанной с этими клавишами,  необходимо  ввести
 
      команду SET TERMINAL/PASTHRU;
 
           2) CTRL/T, CTRL/Y - перед выполнением программы,  свя-
 
      занной с этими клавишами,  необходимо  ввести  команду  SET
 
      TERMINAL/PASTHRU или SET  NOCONTROL  на  уровне  командного
 
      языка DCL;
 
           3) CTRL/S, CTRL/Q - перед выполнением программы,  свя-
 
      занной с этими клавишами,  необходимо  ввести  команду  SET
 
      TERMINAL/NOTTSYNC.
 
           Использование этих специальных команд  установки  сос-
 
      тояния терминала может привести к непредсказуемым результа-
 
      там, если не будут учтены все подразумеваемые  изменения  в
 
      состоянии терминального драйвера.
 
           Возвращаемое состояние:
 
      TPU$_RECURLEARN   WARNING - второй  аргумент является недо-
 
                                  пустимой ссылкой на клавишу;
 
      TPU$_NOTDEFINABLE WARNING - определение клавиши уже исполь-
 
                                  зовалось  как  часть  обучающей
 
                                  последовательности и  его нель-
 
                                  зя  использовать в текущем кон-
 
                                  тексте.
 


                                - 141 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. DEFINE_KEY ('POSITION(MAIN_WINDOW)', CTRL_B_KEY) ;
 
      В операторе с комбинацией клавиш CTRL/B связывается  опера-
 
      тор утилиты POSITION  (MAIN_WINDOW).  Необходимо  заметить,
 
      что этот оператор утилиты заключен в кавычки.
 
           2. DEFINE_KEY (MAIN_BUFFER, KEY_NAME  (PF4,SHIFT_KEY),
 
      "MAINBUF")) ;
 
      Оператор вызывает компиляцию главного  буфера  (содержащего
 
      операторы утилиты). Если в процессе компиляции нет  ошибок,
 
      то TPU связывает полученный выполняемый код  с  комбинацией
 
      клавиши регистра редактора (PF1 по умолчанию) и клавиши PF4
 
      на малой клавиатуре. Последний параметр  в  этом  операторе
 
      ("MAINBUF")  представляет  собой  комментарий  определяемой
 
      комбинации клавиш.
 
           3. DEFINE_KEY('COPY_TEXT("EXTENSIBLE"); KEY_NAME ('Z',
 
      SHIFT_KEY))
 
      Оператор вызывает копирование слова "EXTENSIBLE" в буфер  с
 
      текущей позиции символа по нажатию  комбинации  клавиш  PF1
 
      (клавиша регистра по умолчанию в TPU) и 'Z'.
 
           4. Процедура_USER_DEFINE_KEY    выдает    пользователю
 
      информацию о том, какие операторы утилиты должны быть  при-
 
      вязаны к указанной клавише:
 
      PROCEDURE UBER_DEFINE_KEY
 
      DEF:=READ_LINE ('DEFINITION:') ;
 
      KEY:=READ_LINE ('PRESS KEY TO DEFINE,',1) ;
 
      IF LENGTH (KEY) > 0
 
         THEN KEY:=KEY_NAME(KEY) ;
 
         ELSE KEY:=LAT_KEY ;
 
      ENDIF ;
 
      DEFINE_KEY (DEF,KEY) ;


                                - 142 -
 
                          00152-01 34 04-1
 
 
      ENDPROCEDURE
 
           5. Процедура  USER_CHANGE_MODE  изменяет  режим  ввода
 
      текста с вставки на замену или с замены на вставку, в зави-
 
      симости от текущего режима:
 
      PROCEDURE USER_CHANGE_MODE
 
      !Смена режимов редактирования
 
      IF GET_INFO (CURRENT_BUFFER, "MODE") = OVERSTRIKE
 
         THEN SET (INSERT,CURRENT-BUFFER) ;
 
         ELSE SET (OVERSTRIKE, CURRENT-BUFFER) ;
 
      ENDIF ;
 
      DEFINE_KEY ('USER_CHANGE_MODE', CTRL_A_KEY) ;
 
      ENDPROCEDURE
 
 
 
           5.28. Процедура DELETE
 
 
           Процедура DELETE удаляет структуры языка TPU  из  кон-
 
      текста редактирования. Все связанные с удаляемой структурой
 
      переменные  устанавливаются  в   состояние   неопределенный
 
      (UNSPECIFIED). Если удаляемая структура  имеет  собственные
 
      ресурсы, то они возвращаются редактору.
 
           Формат:
 
      DELETE (BUFFER или MARKER или PROCESS или PROGRAM или RANGE
 
      или WINDOW)
 
           Параметры:
 
           BUFFER - буфер, который необходимо удалить. Любые диа-
 
      пазоны или маркеры этого буфера, любые подпроцессы, связан-
 
      ные с буфером, память  под  управляющую  структуру  буфера,
 
      страницы для запоминания текста, память для диапазонов мар-
 
      керов, связанных с буфером, - все это удаляется. Если буфер
 
      связан с окном, отображаемым на  экран,  то  оно  перестает
 


                                - 143 -
 
                          00152-01 34 04-1
 
 
      отображаться;
 
           MARKER - маркер, который необходимо удалить; удаляется
 
      память под управляющую структуру этого маркера;
 
           PROCESS - процесс, который  необходимо  удалить;  уда-
 
      ляется память под управляющую структуру  этого  процесса  и
 
      сам процесс;
 
           PROGRAM - программа, которую необходимо удалить;  уда-
 
      ляется память под управляющую структуру  этой  программы  и
 
      память, выделенная под программный код;
 
           RANGE - диапазон, который необходимо удалить; удаляет-
 
      ся память под управляющую структуру диапазона; текст диапа-
 
      зона перестает ему принадлежать.  Любой  диапазон  является
 
      всего лишь способом обработки частей текста внутри  некото-
 
      рого буфера. Удаление  диапазона  не  приводит  к  удалению
 
      текста из буфера;
 
           WINDOW - окно, которое необходимо  удалить.  Вместе  с
 
      окном удаляются память под его упавляющую структуру и  про-
 
      токол связанных с ним записей. Если удаляется окно, отобра-
 
      жаемое на экран, то  TPU  отмечает  его  неотображаемым,  а
 
      затем удаляет.
 
           Описание.
 
           Время выполнения встроенной процедуры  DELETE  зависит
 
      от числа переменных, ссылающихся на об'ект удаления, и чис-
 
      ла других элементов, связанных с этим об'ектом.
 
           Т.к. все переменные, на  которые  ссылается  удаляемый
 
      об'ект, должны быть установлены в неопределенное  состояние
 
      (UNSPECIFIED) и все связанные с удаляемым об'ектом элементы
 
      удаляются,  то  использовать  процедуру  DELETE  необходимо
 
      осторожно.
 
           

                                - 144 -
 
                          00152-01 34 04-1
 
 
           Возвращаемое состояние:
 
      TPU$_INVBUFDELETE  WARNING - попытка удалить буфер, устано-
 
                                   вленный как  PERMANENT (посто-
 
                                   янный);
 
      TPU$_$NOCURRENTBUF WARNING - нет позиционирования в буфере.
 
 
           Примеры:
 
           1. DELETE (MAIN_BUFFER) ;
 
      Эта команда удаляет главный  буфер  и  все  выделенные  ему
 
      ресурсы.  После  выполнения  этой  команды   команда   SHOW
 
      (BUFFERS) не будет показывать MAIN_BUFFER в списке  буферов
 
      текущего контекста редактирования.
 
           2. Процедура USER_DELETE_EXTRA  записывает  содержимое
 
      буфера EXTRA_BUF в указанный файл (если не указано имя фай-
 
      ла, то используется файл,  связанный  с  этим  буфером),  а
 
      затем удаляет окно EXTRA_WINDOW и буфер текущего  контекста
 
      редактирования. Предварительно необходимо создать структуры
 
      и добавить их к текущему контексту  редактирования;  только
 
      тогда процедура успешно отработает:
 
      PROCEDURE UBER_DELETE_EXTRA
 
         WRITE_FILE (EXTRA_BUF) ;
 
         DELETE (EXTRA_WINDOW) ;
 
         DELETE (EXTRA_BUF) ;
 
         ADJUST_WINDOW (MAIN_WINDOW, -11, 0) ;
 
      ENDPROCEDURE
 


                                - 145 -
 
                          00152-01 34 04-1
 
 
           5.29. Процедура EDIT
 
 
           Процедура EDIT модифицирует строку  в  соответствии  с
 
      указанными ключевыми словами. Процедура EDIT подобна лекси-
 
      ческой функции F$EDIT командного языка DCL.
 
           Формат:
 
      EDIT (STRING, ключевое_слово1 [,...] [,ключевое слово2])
 
           Параметры:
 
           STRING - строка в кавычках, или имя переменной, предс-
 
      тавляющей строковую константу, или выражение, дающее  стро-
 
      ку, которую необходимо модифицировать;
 
           Ключевое слово1 - одно или несколько следующих  ключе-
 
      вых слов:
 
           1) COLLAPSE - удалит все пробелы и табуляции;
 
           2) COMPRESS - заменит несколько пробелов или табуляций
 
      на один пробел;
 
           3) TRIM - удалит пробелы и табуляции в начале и в кон-
 
      це строки;
 
           4) TRIM_LEADING - удалит пробелы и табуляции в  начале
 
      строки
 
           5) TRIM_TRAILTNG - удалит пробелы и табуляции в  конце
 
      строки;
 
           6) UPPER - преобразует символы нижнего регистра в сим-
 
      волы верхнего регистра;
 
           7) LOWER - преобразует  символы  верхнего  регистра  в
 
      символы нижнего регистра;
 
           8) INVERT - изменит текущий регистр символов, заданных
 
      пользователем; символы верхнего регистра будут преобразова-
 
      ны в символы нижнего регистра, а символы  нижнего  регистра
 
      будут преобразованы в символы верхнего регистра.
 


                                - 146 -
 
                          00152-01 34 04-1
 
 
           При использовании нескольких ключевых слов  типа  TRIM
 
      (TRIM, TRIM_LEADING, TRIM_TRAILING) будут  выполняться  все
 
      связанные с ними операции;
 
           Ключевое_слово2 - одно из двух ключевых слов:
 
           1) ON - разрешает распознавание символов  кавычек  или
 
      апострофов в качестве разделяющих символов (это принято  по
 
      умолчанию);
 
           2) OFF - запрещает распознавание символов кавычек  или
 
      апострофов в качестве разделяющих символов.
 
           Описание.
 
           Строка, указанная в качестве первого параметра,  моди-
 
      фицируется в том месте, где располагается. Встроенная  про-
 
      цедура EDIT не возвращает результата.
 
           По умолчанию, процедура EDIT не модифицирует  текст  в
 
      кавычках, появляющийся внутри строки. Например, команда:
 
      EDIT ('HE SANG "WELL"', LOWER)
 
      не изменит регистр символов  в  слове  WELL.  Строка  будет
 
      иметь следующий вид:
 
      HE SAND "WELL"
 
           Если в указываемой строке есть открывающая кавычка, но
 
      нет    закрывающей,    то    будет     возвращен     статус
 
      TPU$_MISSINGQUOTE. Весь текст, заключенный между  открываю-
 
      щей кавычкой и концом  строки,  будет  рассматриваться  как
 
      заключенная в кавычки часть  строки;  эта  часть  не  будет
 
      модифицироваться.
 
           Можно  запретить  распознавание  символов  кавычек   и
 
      апострофов как разделяющих символов (что принято по умолча-
 
      нию), используя ключевое слово OFF.
 
           Процедура EDIT подобна лексической функции  командного
 
      языка DCL F$EDIТ. Однако следует отметить  следующие  отли-


                                - 147 -
 
                          00152-01 34 04-1
 
 
      чия:
 
           1) EDIT модифицирует символы там, где они расположены,
 
      в то время как F$EDIT возвращает результат;
 
           2) EDIT использует ключевые слова как параметры, в  то
 
      время как F$EDIT требует, чтобы команды редактирования были
 
      заданы как строки.
 
           Возвращаемое состояние:
 
      TPU$_MISSINGQUOTE    ERROR - в  строке символов отсутствует
 
                                   ограничивающая  кавычка.
 
           Примеры:
 
           1. Следующие  операторы  редактируют  строку  'PRODUCT
 
      NAME', изменяя  символы  этой  строки  на  символы  нижнего
 
      регистра, затем отображают отредактированную строку в  окно
 
      для сообщений:
 
      PN:='PRODUCT NAME' ;
 
      EDIT (PN, LOVER) ;
 
      MESSACE (PN) ;
 
           2. В процедуре USER_EDIT_STRING показан  общий  способ
 
      преобразования любой входной строки в  строку  с  символами
 
      нижнего регистра:
 
      PROCEDURE USER_EDIT_ETRING (INPUT_STRING)
 
      IS:=INPUT_STRING ;
 
      EDIT (IS, LOWER) ;
 
      MESSAGE (IS) ;
 
      ENDPROCEDURE
 
      После  компиляции  процедуры  и  появления  соответствующей
 
      подсказки интерфейса редактирования можно ввести:
 
      USER_EDIT_STRING("ZEPHYR")
 
      Тогда слово "ZEPнYR" будет напечатано в  области  сообщений
 
      символами нижнего регистра.


                                - 148 -
 
                          00152-01 34 04-1
 
 
           5.30. Процедура END_OF
 
 
           Процедура END_OF возвращает маркер, который  указывает
 
      на последнюю позицию символа в буфере или диапазоне.
 
           Формат:
 
      MARKER:=END_OF(BUFFER или RANGE)
 
           Параметры:
 
           BUFFER - буфер, в котором необходимо отметить  послед-
 
      нюю символьную позицию;
 
           RANGE - диапазон, в котором необходимо  отметить  пос-
 
      леднюю символьную позицию.
 
           Описание.
 
           Если  используется  маркер,  возвращенный   процедурой
 
      END_OF, как  параметр  встроенной  процедуры  POSITION,  то
 
      текущая символьная позиция станет той, на которую указывает
 
      этот маркер.
 
 
           Примеры:
 
           1. THE_END:=END_OF (CURRENT_BUFFER) ;
 
      в операторе присваивания в переменную THE_END  записывается
 
      указатель на последнюю позицию в текущем буфере.
 
           2. POSITION (END_OF (DELETE_RANGE)) ;
 
      оператор использует две встроенные процедуры для  перемеще-
 
      ния  текущей   символьной   позиции   в   конец   диапазона
 
      DELETE_RANGE. Если диапазон расположен в отображаемом теку-
 
      щем буфере, то курсор переместится в конец этого диапазона.
 
           3. Процедура USER_PASTE подобна  процедуре  EDT$PASTE,
 
      применяемой в секционном файле эмулятора  малой  клавиатуры
 
      EDT:
 
      PROCEDURE USER_PASTE
 
      LOCAL PASTE_TEXT;


                                - 149 -
 
                          00152-01 34 04-1
 
 
      IF (BEGINNIHG_OF (PASTE_BUFFER) <> END_OF (PASTE_BUFFER))
 
        THEN
 
           COPY_TEXT (PASTE_BUFFER);
 
           APPEND_LINE;
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.31. Процедура ERASE
 
 
           Процедура ERASE удаляет содержимое  указанного  буфера
 
      или диапазона.
 
           Формат:
 
      ERASE (RANGE или BUFFER)
 
           Параметры:
 
           RANGE - диапазон, содержимое которого необходимо  уда-
 
      лить;
 
           BUFFER - буфер, содержимое  которого  необходимо  уда-
 
      лить.
 
           Описание.
 
           Процедура ERASE не влияет на текущую позицию  символа.
 
      При очистке буфера его содержимое  теряется,  но  структура
 
      буфера остается частью контекста редактирования  и  текущая
 
      позиция символа остается в  буфере.  Пространство,  которое
 
      занимало содержимое буфера, возвращается в систему и  может
 
      использоваться  вновь.  Остается  только  последняя  строка
 
      буфера.
 
           При очистке  диапазона  его  содержимое  удаляется  из
 
      буфера;  структура  диапазона  остается  частью   контекста
 
      редактирования. Эту структуру можно использовать в  течение
 
      сеанса редактирования для выделения области  текста  внутри
 


                                - 150 -
 
                          00152-01 34 04-1
 
 
      буфера.
 
           Примечание. Текст не принадлежит диапазону, он принад-
 
      лежит буферу. Диапазоны просто дают средство для  манипуля-
 
      ции порциями текста внутри буфера.
 
           Примеры:
 
           1. ERASE (MAIN_BUFFER) ;
 
      команда вызывает удаление содержимого главного буфера.
 
           2. Процедура USER_REMOVE_CRLFE удаляет  пары  символов
 
      "перевод строки" и "возврат каретки":
 
      PROCEDURE USER_REMOVE_CRLFE
 
      ON_ERROR
 
      RETURN
 
      ENDON_ERROR
 
      CRLF:=ASCII(13) + ASCII(10) ;
 
      LOOP
 
      CR_RANGE:=SEARCH (CRLF, FORWARD, EXACT) ;
 
      POSITION (CR_RANGE) ;
 
      ERASE (CR_RANGE) ;
 
      ENDLOOP
 
      ENDPROCEDURE
 
 
 
           5.32. Процедура ERASE_CHARACTER
 
 
           Процедура ERASE_CHARACTER удаляет указанное число сим-
 
      волов и может возвратить строку, содержащую удаленные  сим-
 
      волы.
 
           Формат:
 
      [STRING:=] ERASE_CHARACTER (INTEGER)
 


                                - 151 -
 
                          00152-01 34 04-1
 
 
           Параметры:
 
           INTEGER - целое значение со  знаком  плюс  или  минус,
 
      задает количество удаляемых символов. Если это число  боль-
 
      ше 0, то удаляются символы, начиная от текущего в направле-
 
      нии к концу строки. Если это число меньше 0,  то  удаляются
 
      символы, начиная с предшествующего текущему в направлении к
 
      началу строки.
 
           Описание.
 
           Удаленные символы, возвращаемые  процедурой  в  строке
 
      STRING, располагаются в этой строке в том порядке, в  каком
 
      они были удалены. Операция удаления символов не  пересекает
 
      границ строки.
 
           Примеры:
 
           1. TAKE_OUT_CHARS:=ERASE_CHARACTER (10) ;
 
      В операторе присваивания удаляется текущий символ и следую-
 
      щие за ним 9 символов;  удаляемые  символы  записываются  в
 
      переменную TAKE_OUT_CHARS.
 
           2. PREV_CHARS:=ERASE_CHARACTER (-5) ;
 
      В операторе удаляется 5 символов, предшествующих  текущему;
 
      удаляемые символы записываются в переменной PREV_CHARS.
 
           3. Процедура USER_DELETE_LIKE_EDTEM подобна  процедуре
 
      секционного файла эмулятора малой клавиатуры EDT и  исполь-
 
      зуется для удаления символов:
 
      PROCEDURE USER_DELETE_LIKE_EDTEM
                                  
      UV_DELETED_CHAR:=ERASE_CHARACTER(1) ;
 
      IF UV_DELETED_CHAR = " "
 
         THEN
 
            MOVE_HORIZONTAL(1);
 
            IF MARK (NONE) <> END_OF (CURRENT_BUFFER)
 
               THEN


                                - 152 -
 
                          00152-01 34 04-1
 
 
                  UV_DELETED_CHAR:=ASCII (10) ;
 
                  APPEND_LINE ;
 
               ELSE
 
                  MOVE_HORIZONTAL (-1) ;
 
            ENDIF ;
 
      ENDIF ;
 
      ENDPROCEDURE
 
 
 
           5.33. Процедура ERASE_LINE
 
 
           Процедура ERASE_LINE удаляет текущую  строку  текущего
 
      буфера, она может возвратить строку, содержащую удаленную.
 
           Формат:
 
      STRING:=ERASE_LINE
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Удаляемая строка может быть записана в некоторую  дру-
 
      гую строку. Если удаляемая строка видима на экране, то  она
 
      будет удалена и с экрана, и из буфера.
 
 
           Примеры:
 
           1. ERASE_LINE ;
 
      оператор удаляет текущую строку из текущего буфера.
 
           2. TAKE_OUT_LINE:=ERASE_LINE ;
 
      Команда удаляет текущую строку из текущего буфера и записы-
 
      вает ее в переменную с именем TAKE_OUT_LINE.
 
           4. Процедура USER_DELETE_LINE подобна  процедуре  сек-
 
      ционного файла эмулятора малой клавиатуры EDT и использует-
 
      ся для удаления строк:
 


                                - 153 -
 
                          00152-01 34 04-1
 
 
      PROCEDURE USER_DELETE_LINE   !DELETE LTNE
 
      IF CURRENT_OFFSET = 0
 
         THEN
 
            UV_DELETED_LINE:=ERASE_LINE + ASCII (10) ;
 
         ELSE
 
            UV_DELETED_LINE:=ERASE_CHARACTER
 
                                (LENGTH(CURRENT_LINE))
 
                                + ASCII (10) ;
 
            MOVE_VERTICAL (1) ;
 
            IF MARK (NOVE)<> END_OF (CURRENT_BUFFER)
 
              THEN
 
                 APPEND_LINE
 
              ELSE
 
                 MOVE_HORIZONTAL (-1)
 
            ENDIF ;
 
      ENDIF ;
 
      ENDPROCEDURE
 
 
 
           5.34. Процедура EXECUTE
 
 
           Процедура EXECUTE производит одно из следующих  дейст-
 
      вий:
 
           1) выполняет программы, предварительно  скомпилирован-
 
      ные;
 
           2) компилирует и затем выполняет выполняемые  операто-
 
      ры, которые расположены в буфере, в диапазоне или в строке;
 
           3) вводит заново или  выполняет  обучающую  последова-
 
      тельность.
 


                                - 154 -
 
                          00152-01 34 04-1
 
 
           Формат:
 
      EXECUTE (PROGRAM или BUFFER или RANGE или STRING или LEARN)
 
           Параметры:
 
           PROGRAM - программа, которую необходимо выполнить;
 
           BUFFER - буфер, который необходимо выполнить;
 
           RANGE - диапазон, который необходимо выполнить;
 
           STRING - строка, которую необходимо выполнить;
 
           LEARN - обучающая последовательность, которую  необхо-
 
      димо повторить.
 
           Описание.
 
           Процедура EXECUTE выполняет различные действия в зави-
 
      симости от типа данных параметра.
 
           Если в  качестве  параметра  использована  строка  или
 
      содержимое какого-то буфера или диапазона,  то  они  должны
 
      содержать только допустимые операторы языка утилиты,  иначе
 
      выдастся сообщение об ошибке и никакие действия  не  выпол-
 
      нятся. Строка не может превышать длину в 132 символа.
 
           Процедуры обычно выполняются путем ввода их имен после
 
      соответствующей  подсказки  от   используемого   интерфейса
 
      редактирования или путем вызова одной процедуры из  другой.
 
      Существует  возможность  выполнения  процедур   с   помощью
 
      EXECUTE, если они возвращают допустимый тип данных.
 
           В следующем примере процедура TEST возвращает тип дан-
 
      ных PROGRAM. Если будет  выполняться  буфер  или  диапазон,
 
      содержащий этот код, то TPU будет компилировать и выполнять
 
      процедуру TEST, будет возвращен тип данных  PROGRAM,  затем
 
      программа будет использоваться как параметр для  встроенной
 
      процедуры EXECUTE и строка "авс" будет записана  в  область
 
      сообщений:
 


                                - 155 -
 
                          00152-01 34 04-1
 
 
      PROCEDURE TеST
 
      RETURN COMPILE ('MESSAGE ("ABC")');
 
      ENDPROCEDURE
 
      EXECUTE (TEST)
 
           Возвращаемые состояния:
 
      TPU$_NODEFINITION WARNING - нет определения для клавиши;
 
      TPU$_REPLAYWARNING WARNING - противоречие во время выполне-
 
                                   ния обучающей последовательно-
 
                                   сти; обработка продолжается;
 
      TPU$_REPLAYFAIL    WARNING - противоречие во время выполне-
 
                                   ния  обучающей  последователь-
 
                                   ности; работа Oстанавливается;
 
      TPU$_CONTROLC       ERROR  - выполнение команды прекращено,
 
                                   т.к. введено CTRL/C;
 
      TPU$_EXECUTEFAIL   WARNING - обработка указанного  элемента
 
                                   прекращена, т.к. он   содержит
 
                                   ошибку.
 
           Примеры:
                                                     
           1. EXECUTE (USER_PROGRAM) ;
 
      Команда  выполняет   операторы   в   программе   с   именем
 
      USER_PROGRAM. Если в программе USER_PROGRAM есть  определе-
 
      ния процедур, то они компилируются, но  не  выполняются  до
 
      запуска процедуры (либо путем ввода имени  процедуры  после
 
      подсказки интерфейса редактирования, либо путем вызова этой
 
      процедуры из другой процедуры).
 
           2. EXECUTE (MAIN_BUFFER);
 
      Команда сначала компилирует содержимое главного  буфера,  а
 
      затем выполняет все выполняемые операторы. Если  в  главном
 
      буфере есть текст, отличный от операторов утилиты, то будет
 
      сообщено об ошибке.


                                - 156 -
 
                          00152-01 34 04-1
 
 
           3. Процедура  USER_DO  выводит  подсказку  (запрос)  о
 
      выполняемой команде, а затем выполняет введенную команду:
 
      PROCEDURE USER_DO
 
         COMMAND_STRING:=READ_LINE ("ENTER TPU COMмAND
 
         TO EXECUTE:") ;
 
         EXECUTE (COMмAND_STRING);
 
      ENDPROCEDURE
 
           4. Процедура   USER_TPU    выполняет    команду    при
 
      разрешенном выводе информационных сообщений; после выполне-
 
      ния команды запрещает вывод информационных сообщений. Необ-
 
      ходимо указать фактический параметр  (оператор  языка  TPU)
 
      вместо формального параметра TPU_COMMAND:
 
      PROCEDURE USER_TPU (TPU_COMMAND)
 
      SET (INFORMATIONAL, ON) ;
 
      EXECUTE (TPU_COMMAND) ;
 
      SET (INFORMATIONAL, OFF) ;
 
      ENDPROCEDURE
 
 
 
           5.35. Процедура EXIT
 
 
           Процедура  EXIT  заканчивает  сеанс  редактирования  и
 
      выводит информацию из всех модифицированных буферов в  свя-
 
      занные с ними файлы. TPU запрашивает имена файлов для буфе-
 
      ров, которые были модифицированы, но не имеют соответствую-
 
      щих файлов. Буфера, имеющие атрибут NO_WRITE, не выводятся.
 
           Формат:
 
      EXIT
 
           Параметры:
 
           Отсутствуют.
 


                                - 157 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           Если содержимое буфера не было модифицировано, то ути-
 
      лита не выводит информацию в файл.
 
           Если модифицированный буфер, не имеет связанного с ним
 
      файла (не было задано имя файла в качестве второго парамет-
 
      ра встроенной процедуре CREATE_BUFFER), то утилита запросит
 
      имя файла для записи содержимого  буфера.  Нажатие  клавиши
 
      RETURN без ввода имени файла приводит к потере  содержимого
 
      буфера. Утилита запрашивает о каждом модифицированном буфе-
 
      ре, не имеющем связанного с  ним  файла.  Порядок  запросов
 
      соответствует времени создания буферов.
 
           Если в процессе выхода появляются ошибки,  то  процесс
 
      выхода приостанавливается, и управление передается редакто-
 
      ру.
 
           Возвращаемое состояние:
 
      TPU$_EXITFAIL    WARNING - неуспешное завершение при
 
                                 записи модифицированных
 
                                 буферов.
 
 
 
           5.36. Процедура EXPAND_NAME
 
 
           Встроенная процедура  EXPAND_NAME  возвращает  строку,
 
      содержащую имя или имена переменных, ключевых слов или про-
 
      цедур (как встроенных,  так  и  написанных  пользователем),
 
      начинающихся с указанной строки. TPU осуществляет  поиск  в
 
      своих внутренних таблицах символов, используя входную стро-
 
      ку в качестве начальной подстроки поиска.
 
           Формат:
 
      Строка2:=EXPAND_NAME (строка1, ключевое_слово) .
 


                                - 158 -
 
                          00152-01 34 04-1
 
 
           Параметры:
 
           STRING1 -  строка  в  кавычках,  или  имя  переменной,
 
      представляющей строковую константу, или  некоторое  выраже-
 
      ние, дающее строку, которая  представляет  собой  начальную
 
      подстроку в некотором имени утилиты;
 
           Ключевое_слово - тип имени в языке TPU, которое  необ-
 
      ходимо подобрать. Допустимыми ключевыми словами могут быть:
 
           1) ALL - подбираются все имена;
 
           2) PROCEUDRE - подбираются имена только процедур;
 
           3) KEYWORDSS - подбираются только имена ключевых слов;
 
           4) VARIABLES - подбираются только имена переменных.
 
           Описание.
 
           Если не находится соответствующей пары  для  указанной
 
      подстроки, то возвращается нулевая строка и  выдается  пре-
 
      дупреждающее сообщение (TPU$_NONAMES). Если специфицирован-
 
      ной подстроке соответствует только одно имя в TPU,то  слово
 
      возвращается без разделителей. Если для подстроки  подходят
 
      несколько имен, то все подобранные  имена  выдаются;  слова
 
      возвращаются об'единенной строкой, в которой  каждое  слово
 
      отделяется от другого одним пробелом. В  случае  нескольких
 
      имен       выдается        предупреждающее        сообщение
 
      (TPU$_MULTIPLENAMES).
 
           Возвращаемые состояния:
 
      TPU$_NONAMES WARNING - нет подходящих имен ;
 
      TPU$_MULTIPLENAMES WARNING - подобрано более одного имени .
 
           Пример.
 
           Процедура USER_QUICK_PARSE использует вводимую  строку
 
      как фактический параметр и помещает расширенную форму имени
 
      процедуры, соответствующего этой строке, в области  сообще-
 
      ний. Если начальной  строке  соответствуют  несколько  имен


                                - 159 -
 
                          00152-01 34 04-1
 
 
      процедур или их нет, в область сообщений выводится поясняю-
 
      щий текст:
 
      PROCEDURE USER_QUICK_PARSE (ABBREVIATED_NAME)
 
      ON_ERROR
 
         IF ERROR = TPU$_NONAMES
 
            THEN
 
               MESSAGE ("NO SUCH PROCEDURE.") ;
 
            ELSE
 
               IF ERROR=TPU$_MULTIPLENAMES
 
                  THEN
 
                     MESSAGE ("AMBIGUOUS ABBREVIATION.") ;
 
               ENDIF ;
 
         ENDIF ;
 
         RETURN ;
 
      ENDON_ERROR;
 
      EXPANDED_NAME:=EXPAND_NAME(ABBREVIATED_NAME, PROCEDURES) ;
 
      MESSAGE ("THE PROCEDURE IS " + EXPANDED_NAME + ".") ;
 
      ENDPROCEDURE
 
 
 
           5.37. Процедура FAO
 
 
           Процедура FAO  преобразовывает  управляющую  строку  в
 
      форматированную выходную  с  помощью  программы  системного
 
      обслуживания $FAO.
 
           Формат:
 
      строка2:=FAO(строка1, FAO-параметры)
 
           Параметры:
 
           Строка1 -  строка  в  кавычках,  или  имя  переменной,
 
      представляющей строковую константу, или  некоторое  выраже-
 
      ние, дающее  строку,  состоящую  из  фиксированного  текста
 


                                - 160 -
 
                          00152-01 34 04-1
 
 
      выходной строки и директив FAO.
 
           В упавляющей строке допускается использование  следую-
 
      щих директив программы $FAO:
 
           !AS - вставка строки без изменений;
 
           !OL - преобразование  длинного  слова  в  восьмеричный
 
      формат;
 
           !XL - преобразование длинного слова в  шестнадцатирич-
 
      ный формат;
 
           !ZL - преобразование длинного слова в десятичный  фор-
 
      мат;
 
           !UL - преобразование длинного слова в десятичный  фор-
 
      мат без учета знака числа;
 
           !SL - преобразование длинного слова в десятичный  фор-
 
      мат с соответствующим преобразованием отрицательных чисел;
 
           !/ - Вставка новой строки;
       
           !_ - Вставка табуляции;
 
           !) - Вставка символа "перевод формата";
 
           !! - Вставка восклицательного знака;
 
           !%S - Вставка S, если самое последнее  преобразованное
 
      число не равно 1;
 
           !%T - Вставка текущего времени,  если  указан  нулевой
 
      параметр;
 
           !%D - Вставка текущей  даты  и  времени,  если  указан
 
      нулевой параметр;
 
           FAO_параметры - соответствуют директивам FAO в строке.
 
           Описание.
 
           Процедура FAO возвращает форматированную строку, изго-
 
      товленную в соответствии с правилами программы $FAO. Управ-
 
      ляющая строка контролирует процесс форматирования; необяза-
 
      тельные  аргументы  представляют  собой  значения,  которые


                                - 161 -
 
                          00152-01 34 04-1
 
 
      должны быть заменены в управляющей строке.
 
           Все строки получаются посредством директивы !AS.
 
           Возвращаемое состояние:
 
      TPU$_INVFAOPARAM WARNING - строка или целое не были
 
                                 аргументом.
 
 
           Примеры:
 
           1. DATE_AND_TIME:=FAO("!%D",0) ;
 
 
      В операторе присваивания в переменной DATE_AND_TIME запоми-
 
      наются текущая дата и время.
 
           2. В   процедуре   USER_FAO_CONVERSION    используется
 
      FAO-директива !SL в управляющей строке  для  преобразования
 
      числа, равного переменной COUNT, в строку.  Преобразованная
 
      строка записывается в переменную REPORT и затем выводится в
 
      область сообщений:
 
      PROCEDURE USER_FAO_CONVERSION
 
      COUNT:=57;
 
      REPORT:=FAO ("NUMBER OF FORMS = !SL", COUNT) ;
 
      MESSAGE (REPORT) ;
 
      ENDPROCEDURE
 
           3. Процедура USER_ERROR_MESSAGE форматирует сообщение,
 
      выводимое в область сообщений и содержащее номер  строки  и
 
      номер колонки, в которой появилась ошибка:
 
      PROCEDURE USER_ERROR_MESSAGE (STRNG, LINE, COL)
 
      ERROR_COUNT:=ERROR_COUNT + 1 ;
 
      MESSAGE (FAO ('!AS AT LINE !UL COLUMN !UL', STRNG,
 
               LINE, COL)) ;
 
      ENDPROCEDURE
 


                                - 162 -
 
                          00152-01 34 04-1
 
 
           5.38. Процедура FILE_PARSE
 
 
           Встроенная  процедура  FILE_PARSE  выполняет   работу,
 
      эквивалентную лексической функции F$PARSE командного  языка
 
      DCL, т.е. выполняет грамматический разбор спецификации фай-
 
      ла.
 
           Встроенная  процедура  FILE_PARSE  возвращает  строку,
 
      которая содержит расширенную спецификацию файла или требуе-
 
      мое поле. Если полная спецификация  файла  не  указана,  то
 
      FILE_PARSE дополняет возвращаемую строку, пользуясь  прави-
 
      лами умолчания.
 
           Если  в  процессе  грамматического  разбора  произошли
 
      ошибки, то возвращается нулевая строка.
 
           Формат:
 
      Строка:=FILE_PARSE (строка1 [,строка2 [,строка3 [,
 
              ключевое слово ]]] )
 
           Параметры:
 
           Строка1 -  спецификация  файла,  которая  должна  быть
 
      разобрана;
 
           Строка2 - спецификация файла по умолчанию. Любые  поля
 
      спецификации файла, задаваемые этим параметром, будут пере-
 
      даваться в выходную строку, если в разбираемой  строке  эти
 
      поля пропущены;
 
           Строка3 - связанная спецификация файла. Поля в связан-
 
      ной спецификации файла будут посылаться в выходную  строку,
 
      если они пропущены как в спецификации файла, так и в  пара-
 
      метрах по умолчанию;
 
           Ключевое_слово - поле в спецификации файла; допустимы-
 
      ми являются следующие ключевые слова:
 


                                - 163 -
 
                          00152-01 34 04-1
 
 
      1) NODE - узел;
 
      2) DEVICE - устройство;
 
      3) DIRECTORY - каталог;
 
      4) NAME - имя файла;
 
      5) TYPE - тип файла;
 
      6) VERSION - версия файла.
 
           Описание.
 
           Встроенная процедура FILE_PARSE позволяет  осуществить
 
      грамматический разбор спецификации файла посредством  прог-
 
      раммы $PARSE системы управления данными (СУД-32).
 
           Логические имена и имена  устройств  должны  ограничи-
 
      ваться двоеточием. Если пропущены необязательные  параметры
 
      слева от какого либо параметра, то  необходимо  включить  в
 
      обращение нулевые строки для обозначения места  пропущенных
 
      параметров. Если пропущены имя файла, тип файла  или  номер
 
      версии, то FILE_PARSE обеспечит умолчания сначала из строки
 
      строка2, а затем из строки строка3. Если не обеспечены  эти
 
      умолчания,  то  процедура  возвратит  нулевые  спецификации
 
      соответствующих полей.
 
           Допускается спецификация полей в виде обобщенной  опе-
 
      рации.
 
           Возвращаемое состояние:
 
      TPU$_PARSEFAIL  WARNING - была отмечена ошибка во время
 
                                разбора спецификации файла
 
                                в системе СУД-32.
 
 
           Примеры:
 
      1. SPEC:=FILE_PARSE('PROGRAM.PAS','ABBOTT') ;
 
           Оператор присваивания вызывает СУД-32 для грамматичес-
 
      кого  разбора;   возвращает   полную   спецификацию   файла
 


                                - 164 -
 
                          00152-01 34 04-1
 
 
      PROGRAM.PAS. Второй параметр дает имя каталога,  в  котором
 
      файл может быть найден.
 
           2. Процедура USER_START_JOURNAL начинает  протоколиро-
 
      вание. Она вызывается из процедуры TPU$INIT_PROCEDURE после
 
      того, как файл был прочитан  в  текущий  буфер.  Встроенная
 
      процедура FILEPARSE используется для получения полной  спе-
 
      цификации файла протокола:
 
      PROCEDURE USER_START_JOURNAL
 
      LOCAL DEFAULT_JOURNAL_NAME,
 
      AUX_JOURNAL_NAME ;
 
      IF (GET_INFO (COMMAND_LINE, "JOURNAL") = 1) AND
 
         (GET_INFO (COMMAND_LINE, "READ_ONLY") <> 1)
 
         THEN
 
            AUX_JOURNAL_NAME := GET_INFO (CURRENT_BUFFER,
 
                                "FILE_NAME") ;
 
      IF AUX_JOURNAL_NAME = " "
 
         THEN
 
      AUX_JOURNAL_NAME:=GET_INFO (CURRENT_BUFFER,"OUTPUT_FILE");
 
 
 
            ENDIF;
 
      IF AUX_JOURNAL_NAME = 0
 
         THEN
 
            AUX_JOURNAL_NAME := "";
 
            ENDIF;
 
      IF AUX_JOURNAL_NAME = " "
 
         THEN
 
            DEFAULT_JOURNAL_NAME := "USER.TJL";
 
            ELSE
 
                DEFAULT_JOURNAL_NAME := ".TJL";
 
            ENDIF;


                                - 165 -
 
                          00152-01 34 04-1
 
 
      JOURNAL_FILE := GET_INFO (COMMAND_LINE, "JOURNAL_FILE") ;
 
            JOURNAL_FILE := FILE_PARSE (JOURNAL_FILE,
 
                        DEFAULT_JOURNAL_NAME,AUX_JOURNAL_NAME);
 
            JOURNAL_OPEN (JOURNAL_FILE) ;
 
            ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.39. Процедура FILE_SEARCH
 
 
           Эта встроенная процедура  вызывает  программу  $SEARCH
 
      системы СУД-32 для поиска файла и возвращает полную  специ-
 
      фикацию указанного файла.
 
           Процедура FILE_SEARCH  возвращает  строку,  содержащую
 
      результирующую спецификацию файла. Если файл  не  найден  в
 
      каталоге, то возвращается нулевая строка и выдается сообще-
 
      ние об ошибке.
 
           Формат:
 
      Строка2:=FILE_SEARCH (строка1)
 
           Параметры:
 
           Строка1 - спецификация файла для поиска. Если пропуще-
 
      но имя устройства или имя каталога, то FILE_SEARCH  обеспе-
 
      чит умолчание, пользуясь текущим именем устройства и  теку-
 
      щим каталогом. Процедура не обеспечивает умолчания для име-
 
      ни файла или типа файла.
 
           Описание.
 
           Встроенная процедура FILE_SEARCH позволяет искать фай-
 
      лы в каталоге, используя программу $SEARCH.  Ее  необходимо
 
      использовать несколько раз с одинаковыми параметрами, чтобы
 
      получить все появления имени файла в каталоге.
 


                                - 166 -
 
                          00152-01 34 04-1
 
 
           Возвращаемые состояния:
 
      TPU$_SEARCHFAIL WARNING - файл, заданный строковым аргумен-
 
      том, не найден;
 
      TPU$PARSEFAIL WARNING - была отмечена ошибка во время  раз-
 
      бора спецификации файла в системе СУД-32.
 
           Примеры:
 
           1. FIL:=FILE_SEARCH ('SYS$SYSTEM:*.EXE');
 
      Каждый раз, когда  выполняется  оператор  присваивания,  он
 
      возвращает строку, содержащую  результирующую  спецификацию
 
      файла с расширением EXE в SYS$SYSTEM. т.к. не  задан  номер
 
      версии файла, то возвращается самая последняя версия. Полу-
 
      чение нулевой строки означает, что в  каталоге  больше  нет
 
      файлOв с расширением EXE.
 
           2. Процедура USER_COLLOCT_RNOS размещает каждый файл с
 
      расширением RNO, содержащийся в текущем каталоге,  в  соот-
 
      ветствующий этому файлу буфер. Команда SHOW (BUFFERS)  поз-
 
      воляет получить отображение буферов, созданных этой  проце-
 
      дурой:
 
      PROCEDURE USER_COLLOCT_RNOS
 
      LOCAL FILE_SPEC;
 
      FILE_SPEC := FILE_SEARCH ('');
 
      LOOP
 
        FILE_SPEC := FILE_SEARCH ('*.RNO');
 
        EXITIF FILE_SPEC = "";
 
      CREATE_BUFFER (FILE_PARSE (FILE_SPEC, " ", " ", NAME),
 
                     FILE_SPEC);
 
      ENDLOOP;
 
      ENDPROCEDURE
 
           Оператор присваивания, расположенный  после  оператора
 
      LOCAL, устанавливает переменную  FILE_SPEC  равной  нулевой


                                - 167 -
 
                          00152-01 34 04-1
 
 
      строке. Важно очистить эту переменную  от  любых  значений,
 
      которые могли быть записаны в ней  операциями  FILE_SEARCH,
 
      выполненными ранее.
 
 
 
           5.40. Процедура FILL
 
 
           Встроенная процедура FILL форматирует текст в специфи-
 
      цированном буфере или диапазоне таким образом,  что  строки
 
      этого текста становятся приблизительно одинаковой длины.
 
           Формат:
 
      FILL (буфер или диапазон, строка [,целое1 [, целое2]]).
 
           Параметры:
 
           Буфер A буфер, который необходимо форматировать;
 
           Диапазон - диапазон, который необходимо фоматировать;
 
           Строка - строка символов, которые разрешено  использо-
 
      вать в качестве разделителей слов в  процессе  форматирова-
 
      ния;
 
           Целое1 - значение левого отступа (поля). Это  значение
 
      должно быть в пределах от единицы до значения правого  отс-
 
      тупа (поля);
 
           Целое2 - значение правого отступа (поля). Это значение
 
      не может превышать максимального размера записи в буфере.
 
           Описание.
 
           В процессе  форматирования  текста  утилита  разделяет
 
      строки по последнему  разделителю  перед  правым  отступом.
 
      Следующие символы обычно используются в качестве разделите-
 
      лей: пробел,  горизонатальная  табуляция,  перевод  строки,
 
      вертикальная табуляция, перевод формата и возврат  каретки.
 
      Для форматирования  текстов  программ  дополнительно  можно
 
      задать в  качестве  разделителей  круглые  скобки,  угловые
 


                                - 168 -
 
                          00152-01 34 04-1
 
 
      скобки, кавычки и другие символы (по выбору).
 
           Если разделителем задан символ управления, то  сущест-
 
      вует два способа использовать его для работы с утилитой:
 
           1) использовать встроенную процедуру ASCII с  десятич-
 
      ным  значением  заданного  символа  управления,   например,
 
      COPY_TEXT (ASCII(27)) приводит к тому, что символ  перехода
 
      (ESCAPE) будет введен в текущий буфер;
 
           2) использовать  специальные  функции,  обеспечиваемые
 
      редактором EVE и эмулятором малой клавиатуры EDT для  ввода
 
      символов управления.
 
           TPU исключает пробелы и табуляции в начале и  в  конце
 
      строк текста. Ограничители  строк  заменяются  на  пробелы,
 
      новые ограничители строк (при необходимости) добавляются  к
 
      пробелам. Пробелы в конце строк удаляются.
 
           Если  опущены  необязательные  значения  отступов,  то
 
      используются существующие значения отступов для буфера  (по
 
      умолчанию левый отступ равен 1, правый  отступ  равен  80).
 
      Значения отступов для любого буфера  изменяются  с  помощью
 
      встроенной процедуры SET (MARGINS,...). Оба значения отсту-
 
      па должны быть больше 0).
 
           Возвращаемые состояния:
 
      TPU$_BADMARGINS WARNING - левый отступ должен  быть  меньше
 
      чем правый; оба должны быть больше нуля;
 
      TPU$_NEEDTERMS ERROR - необходимо задать символы для разде-
 
      ления текста.
 
           Примеры:
 
           1. FILE (CURRENT_BUFFER,'');
 
      этот оператор форматирует текст таким образом, что в  теку-
 
      щем буфере строки  будут  иметь  приблизительно  одинаковую
 
      длину; пробел используется как разделитель слов.


                                - 169 -
 
                          00152-01 34 04-1
 
 
           2. FILL (MY_BYFFER, ASCII (13) + ASCII (10), 5, 65) ;
 
      этот оператор  форматирует  буфер  MY_BUFFER,  используя  в
 
      качестве разделителя слов символы перевода строки и возвра-
 
      та каретки; размещает текст с левым отступом, равным  5,  и
 
      правым отступом, равным 65.
 
 
 
           5.41. Процедура GET_INFO
 
 
           Процедура GET_INFO выдает информацию о текущем состоя-
 
      нии контекста редактирования.
 
           Формат:
 
           Возращаемое_значение:=GET_INFO (параметр1, параметр2)
 
           Параметры:
 
           Параметр1 - переменная, представляющая  некоторый  тип
 
      данных в утилите, или ключевое слово. В табл. 7 представле-
 
      ны возвращаемые значения,  когда  в  качестве  параметра  1
 
      используется переменная. В табл. 8  представлены  значения,
 
      возвращаемые процедурой при использовании ключевого слова в
 
      качестве параметра 1;
 
           Параметр2 - строка в кавычках, или имя переменной, или
 
      выражение, дающее одну из строковых констант, приведенных в
 
      табл. 7, 8. Параметр2 задает вид  требуемой  информации  об
 
      элементе, заданном параметром1.
 
           Описание.
 
           В зависимости от требуемого вида информации  процедура
 
      GET_INFO возвращает один из следующих элементов:
 
           1) строка;
 
           2) целое число (значения  истина  и  ложь  возращаются
 
      как 1 и 0 );
 
           3) буфер;
 


                                - 170 -
 
                          00152-01 34 04-1
 
 
           4) окно;
 
           5) диапазон;
 
           6) маркер;
 
           7) процесс;
 
           8) ключевое слово.
 
                                                      Таблица 7
              Выходная информация процедур GET_INFO
                        
                    (параметр1 - переменная)
         
      ---------------------------------------------------------
                 !            !
       Параметр1 !  Параметр2 ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !            !
      Простая    ! "TYPE"     !  Тип данных элемента
                 !            !
      переменная !            !(ключевое слово)
                 !            !
      BUFFER     !"CHARACTER" !  Символ в текущей позиции
                 !            !
                 !"OFFSET"    !  целое число, равное смещению
                 !            !
                 !            !текущей позиции от начала
                 !            !
                 !            !строки
                 !            !
                 !"OFFSET_    !  Целое число, равное номеру
                 !            !
                 !_COLUMN"    !колонки экрана с текущей
                 !            !
                 !            !позиции
                 !            !
                 !"МАP_COUNT" !  Целое число, равное числу окон,
                 !            !
                 !            !отобажающих указанный буфер
                 !            !
                 !"MODIFIED"  !  Целое число (0 или 1), являющее-
                 !            !
                 !            !ся флагом модификации буфера
                 !            !
                 !            !(1 - истина, модифицирован)
                 !            !
                 !"RECORD_    !  Целое число, равное количеству
                 !            !
                 !COUNT"      !строк в буфере
                 !            !
                 !"RECORD_    !  Целое число, равное
                 !            !
                 !SIZE"       !максимальному размеру строки
                 !            !
                 !"NAME"      !  Строка, содержащая имя буфера
                 !            !


                                - 171 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 7
      ---------------------------------------------------------
                 !            !
       Параметр1 !  Параметр2 ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !"FILE_NAME" !  Строка, содержащая имя файла,
                 !            !
                 !            !указанное вторым параметром
                 !            !
                 !            !процедуры CREATE_BUFFER; Ноль,
                 !            !
                 !            !если не было указано
                 !            !
                 !"FIRST_     !  Первый диапазон во внутреннем
                 !            !
                 !RANGE"      !списке диапазонов TPU; Ноль,
                 !            !
                 !            !если не был указан
                 !            !
                 !"NеXT_RANGE"!  Следующий диапазон во
                 !            !
                 !            !внутреннем списке диапазонов
                 !            !
                 !            !TPU; Ноль, если диапазонов
                 !            !
                 !            !более нет
                 !"FIRST_     !
                 !            !
                 !МАRKER"     !  Первый маркер во внутреннем
                 !            !
                 !            !списке маркеров; ноль, если
                 !            !
                 !            !маркеров нет
                 !            !
                 !"NEXT_      !  Следующий маркер во внутреннем
                 !            !
                 !MARKER"     !списке; Ноль , если маркеров
                 !            !
                 !            !более нет
                 !            !
                 !"DIRECTION" !  Ключевое слово FORWARD или
                 !            !
                 !            !REVERSE
                 !            !
                 !"EOB_TEXT"  !  Строка , содержащая текст-
                 !            !
                 !            !признак конца буфера (END_OF_
                 !            !
                 !            !BUFFER)
                 !            !
                 !"LEFT_      !  Целое число, равное текущему
                 !            !
                 !MARGIN"     !левому отступу
                 !            !
                 !"RIGHT_     !  То же правому отступу
                 !            !
                 !MARGIN"     !
                 !            !


                                - 172 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 7
      ---------------------------------------------------------
                 !            !
       Параметр1 !  Параметр2 ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !MAX_LINES"  !  То же максимальному числу строк
                 !            !
                 !            !в буфере
                 !            !
                 !"MODE"      !  Ключевое слово INSERT или
                 !            !
                 !            !OVERSTRIKE
                 !            !
                 !"NO-WRITE"  !  Целое число (ноль или один),
                 !            !
                 !            !флаг вывода модифицированного
                 !            !
                 !            !буфера на диск (1 - истина,
                 !            !
                 !            !буфер должен выводиться)
                 !            !
                 !"OUTPUT_    !  Строка, содержащая имя файла,
                 !            !
                 !FILE"       !использованное при обращении к
                 !            !
                 !            !процедуре SET (OUTPUT_FILE);
                 !            !
                 !            !Ноль, если не задано
                 !            !
                 !"PERMANENT" !  Целое число (0 или 1), флаг
                 !            !
                 !            !постоянного или удаляемого
                 !            !
                 !            !буфера (1 - истина, постоянный)
                 !            !
                 !"SYSTEM"    !  То же системного буфера
                 !            !
                 !            !(1 - истина, системный)
                 !            !
                 !"TAB_STOPS" !  Строка, содержащая значения
                 !            !
                 !            !позиций табуляции, разделенные
                 !            !
                 !            !пробелами и установленные
                 !            !
                 !            !процедурой
                 !            !
                 !            !SET (TAB_STOPS,BUFFER,STRING)
                 !            !
                 !            !  Целое число, равное интервалу
                 !            !
                 !            !табуляции, установленному
                 !            !
                 !            !процедурой
                 !            !
                 !            !SET (TAB_STOPS,BUFFER,INTEGER)
                 !            !
      MARKER     ! "BUFFER"   !  Буфер , содержащий указанный


                                - 173 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 7
      ---------------------------------------------------------
                 !            !
       Параметр1 !  Параметр2 ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !            !
                 !            !маркер
                 !            !
                 !"VIDEO"     !  Ключевое слово, указывающее
                 !            !
                 !            !атрибут отображения маркера
                 !            !
                 !"OFFSET"    !  Целое число, равное смещению
                 !            !
                 !            !маркера от начала строки окна
                 !            !
                 !"OFFSET_    !  То же экрана
                 !            !
                 !_COLUMN"    !
                 !            !
      RANGE      !"BUFFER"    !  Буфер, содержащий указанный
                 !            !
                 !            !диапазон
                 !            !
                 !"VIDEO"     !  Ключевое слово,содержащее
                 !            !
                 !            !атрибуты отображения диапазона
                 !            !
      WINDOW     !"ORIGINAL_  !  Целое число, равное номеру
                 !            !
                 !Т0Р"        !строки экрана, является верхней
                 !            !
                 !            !при создании окна
                 !            !
                 !"ORIGINAL_  !  То же, нижней при создании ок-
                 !            !
                 !_BOTTOM"    !на (включая строку состояния)
                 !            !
                 !"ORIGINAL_  !Целое число, равное длине окна
                 !            !
                 !_LENGTH"    !при его создании (включая
                 !            !
                 !            !строку состояния)
                 !            !
                 !"VISIBLE_   !  Целое число , равное номеру
                 !            !
                 !_TOP"       !строки экрана, являющейся
                 !            !
                 !            !видимой строкой окна (самой
                 !            !
                 !            !верхней
                 !            !
                 !"VISIBLE_   !  То же (самой нижней,
                 !            !
                 !_BOTTOM"    !включая строку состояния)
                 !            !
                 !"VISIBLE_   !  Целое число, равное числу
                 !            !


                                - 174 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 7
      ---------------------------------------------------------
                 !            !
       Параметр1 !  Параметр2 ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !_LENGTH"    !Видимых строк окна (включая
                 !            !
                 !            !строку состояния)
                 !            !
                 !"VISIBLE"   !  Целое число (0 или 1), флаг
                 !            !
                 !            !отображения окна на экран
                 !            !
                 !            !(1 - истина, окно отображается;
                 !            !
                 !            !0 - ложь, окно закрыто другими
                 !            !
                 !            !окнами)
                 !            !
                 !"BUFFER"    !  Буфер, связанный с указанным
                 !            !
                 !            !окном: ноль , если буфера нет
                 !            !
                 !"CURRENT_   !  Целое число, указывающее на
                 !            !
                 !ROW"        !самое последнее положение
                 !            !
                 !            !курсора (строка)
                 !            !
                 !"CURRENT_   !  То же (колонка)
                 !            !
                 !COLUMN"     !
                 !            !
                 !"BEYOND_EOL"!  Целое число (0 или 1), флаг
                 !            !
                 !            !расположения курсора за концом
                 !            !
                 !            !текущей строки
                 !            !
                 !"NEXT"      !  Следующее окно во внутреннем
                 !            !
                 !            !списке окон TPU: ноль, если
                 !            !
                 !            !окно последнее
                 !            !
                 !"PREVIOUS"  !  Предыдущее окно во внутреннем
                 !            !
                 !            !списке окон TPU: ноль, если окно
                 !            !
                 !            !первое
                 !            !
                 !"SHIFT_     !  Целое число, равное числу
                 !            !
                 !_AMOUNT"    !колонок сдвига окна влево
                 !            !
                 !"PAD"       !  Целое число (0 или 1), флаг
                 !            !
                 !            !заполнения окна пробелами


                                - 175 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 7
      ---------------------------------------------------------
                 !            !
       Параметр1 !  Параметр2 ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !            !
                 !            !справа (1 - истина, заполнено)
                 !            !
                 !"SCROLL_    !  Целое число, равное числу строк
                 !            !
                 !_AMOUNT"    !прокрутки в окне
                 !            !
                 !"SCROLL_    !  Целое число, равное смещению
                 !            !
                 !_BOTTOM"    !области "прокрутки" от нижней
                 !            !
                 !            !строки экрана
                 !            !
                 !"SCROLL_TOP"!  То же верхней строки экрана
                 !            !
                 !"STATUS_    !  строка, содержащая текст строки
                 !            !
                 !_LINE"      !состояния; ноль, если текста
                 !            !
                 !            !нет
                 !            !
                 !"STATUS_    !  Ключевое слово NONE, BLINK,
                 !            !
                 !VIDEO"      !BOLD, REVERSE, UNDERLINE, если
                 !            !
                 !            !для строки состояния установлен
                 !            !
                 !            !один атрибут или атрибуты не
                 !            !
                 !            !установлены.
                 !            !
                 !            !Целое число 1, если атрибутов
                 !            !
                 !            !несколько.
                 !            !
                 !            !Целое число 0, если строки
                 !            !
                 !            !состояния нет
                 !            !
                 !"NO_VIDEO_  !  Целое число (0 или 1), флаг
                 !            !
                 !STATUS"     !наличия для строки состояния
                 !            !
                 !            !атрибута NONE
                 !            !
                 !"BLINK_     !  То же BLINK
                 !            !
                 !_STATUS"    !
                 !            !
                 !"BOLD_      !   -"- BOLD
                 !            !
                 !STATUS"     !
                 !            !


                                - 176 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 7
      ---------------------------------------------------------
                 !            !
       Параметр1 !  Параметр2 ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !"REVERSE_   !   -"- REVERSE
                 !            !
                 !_STATUS"    !
                 !            !
                 !"UNDERLINE_ !   -"- UNDERLINE
                 !            !
                 !_STATUS"    !
                 !            !
                 !"TEXT"      !  Ключевое слово указанное в
                 !            !
                 !            !процедуре SET (TEXT, окно,
                 !            !
                 !            !ключевое_слово )
                 !            !
                 !"VIDEO"     !  Ключевое слово NONE, BLINK,
                 !            !
                 !            !BOLD, REVERSE или UNDERLINE,
                 !            !
                 !            !если для окна установлен один
                 !            !
                 !            !атрибут или нет установленных.
                 !            !
                 !            !целое число 1, если
                 !            !
                 !            !атрибутов установлено несколько
                 !            !
                 !"NO_VIDEO"  !  Целое число (0 или 1); флаг
                 !            !
                 !            !наличия для окна атрибута NONE
                 !            !
                 !"BLINK_     !   То же BLINK
                 !            !
                 !_VIDEO"     !
                 !            !
                 !"BOLD_      !   -"- BOLD
                 !            !
                 !_VIDEO"     !
                 !            !
                 !"REVERSE_   !   -"- REVERSE
                 !            !
                 !_VIDEO"     !
                 !            !
                 !"UNDERLINE_ !   -"- UNDERLINE
                 !            !
                 !_VIDEO"     !
                 !            !
                 !"WIDTH"     !  Целое число, равное ширине окна
                 !            !
      PROCESS    !"PTD"       !  Процесс (идентификатор процесса)
                 !            !
 


                                - 177 -
 
                          00152-01 34 04-1
 
 
                                                      Таблица 8
      Выходная информация процедуры GET_INFO           
 
      (параметр1-ключевое слово)
 
      ---------------------------------------------------------
                 !            !
       Параметр1 ! Параметр2  ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !            !
      BUFFER[S]  !"CURRENT"   !  Текущий буфер или 0
                 !            !
                 !"FIRST"     !  Первый буфер из списка буферов;
                 !            !
                 !            !ноль, если нет
                 !            !
                 !"LAST"      !Последний буфер из списка;
                 !            !
                 !            !ноль, если нет
                 !            !
                 !"NEXT"      !  Следующий буфер из списка;
                 !            !
                 !            !ноль, если последнее
                 !            !
                 !"PREVIOUS"  !  Предыдущий буфер из списка;
                 !            !
                 !            !ноль, если первое
                 !            !
      WINDOW[S]  !"то же"     !  То же
                 !            !
      SCREEN     !"CURRENT_   !  Целое число, равное номеру
                 !            !
                 !ROW"        !строки экрана
                 !            !
                 !"CURRENT_   !  То же, колонки экрана
                 !            !
                 !COLUMN"     !
                 !            !
                 !"SCROLL"    !   Целое число (0 или 1), флаг
                 !            !
                 !            !возможности "прокрутка"
                 !            !
                 !"WIDTH"     !  Целое число, равное текущей
                 !            !
                 !            !ширине экрана
                 !            !
                 !"ORIGINAL_  !Целое число, равное физической
                 !            !
                 !WIDTH"      !ширине экрана
                 !            !
                 !"VISIBLE_   !  Целое число, равное длине
                 !            !
                 !_LENGTH"    !страницы терминала
                 !            !
                 !"EIGHTBIT"  !  Целое число (0 или 1), флаг
                 !            !
                 !            !использования терминалом
                 !            !


                                - 178 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 8
      ---------------------------------------------------------
                 !            !
       Параметр1 ! Параметр2  ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !            !Режима восьмибитной кодировки
                 !            !
                 !"EDIT_MODE" !  То же - редактирование
                 !            !
                 !"DEC_CRT"   !  -"- DEC_CRT
                 !            !
                 !"DEC_CRT2"  !  -"- DEC_CRT2
                 !            !
                 !"ANSI_CRT"  !  -"- ANSI_CRT
                 !            !
                 !"VT 100"    !  -"- VT 100
                 !            !
                 !"VT 200     !  -"- VT 200
                 !            !
                 !"VK 100     !  -"- VK100 (GIGI)
                 !            !
                 !"AUTO_      !  -"- автоповтора
                 !            !
                 !REPEAT"     !
                 !            !
                 !"SCREEN_    !  -"- обновления экрана
                 !            !
                 !_UPDATE"    !
                 !            !
                 !"PROMPT_ROW"!  Целое число, равное номеру
                 !            !
                 !            !строки экрана, с которой
                 !            !
                 !            !начинается область подсказки
                 !            !
                 !"PROMPT_    !  Целое число, равное числу строк
                 !            !
                 !_LENGTH"    !в области подсказки
                 !            !
      PROCESS    !"FIRST"     !  Первый процесс из списка;
                 !            !
                 !            !ноль, если нет
                 !            !
                 !"LAST"      !  Последний процесс из списка;
                 !            !
                 !            !Ноль, если нет
                 !            !
                 !"NEXT"      !  Следующий процесс из списка;
                 !            !
                 !            !Ноль, если последний
                 !            !
                 !"PREVIOUS"  !  Предыдущий процесс из списка;
                 !            !
                 !            !Ноль, если первый
                 !            !
      DEBUG      !"LOCAL"     !  Локальная переменная (первая)
                 !            !
                 !            !из предыдущей процедуры; Ноль,


                                - 179 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 8
      ---------------------------------------------------------
                 !            !
       Параметр1 ! Параметр2  ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !            !
                 !            !если переменных нет       
                 !            !
                 !"PARAMETER" !  Первый параметр из предыдущей
                 !            !
                 !            !процедуры; Ноль, если
                 !            !
                 !            !параметров нет
                 !            !
                 ! "NEXT"     !  Следующая переменная или
                 !            !
                 !            !параметр из предыдущей
                 !            !
                 !            !процедуры; ноль, если более нет
                 !            !
                 !"PREVIOUS"  !  Предыдущая переменная или
                 !            !
                 !            !параметр; Ноль, если более нет
                 !            !
      SYSTEM     !"JOURNAL_   !  Строка, содержащая имя
                 !            !
                 !FILE"       !журнального файла
                 !            !
                 !"SECTION_   !  Строка, содержащая имя
                 !            !
                 !_FILE"      !стартового секционного файла
                 !            !
                 !"VERSION"   !  Целое число, номер версии TPU
                 !            !
                 !"UPDATE"    !  То же модификации TPU
                 !            !
                 !"DISPLAY"   !  Целое число (0 или 1), флаг
                 !            !
                 !            !использования поддерживаемого
                 !            !
                 !            !TPU входного устройства
                 !            !
                 !"MESSAGE_   !  Целое число, равное текущему
                 !            !
                 !_FLAGS"     !значению флага сообщений
                 !            !
                 !"TIMED_     !  Строка, содержащая текст,
                 !            !
                 !_MESSAGE"   !отображаемый в области
                 !            !
                 !            !подсказок каждую секунду
                 !            !
                 !"FACILITY_  !  Строка, содержащая текущее
                 !            !
                 !_NAME"      !имя программного средства
                 !            !
                 !"INFORMA-   !  Целое число (0 или 1), флаг
                 !            !


                                - 180 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 8
      ---------------------------------------------------------
                 !            !
       Параметр1 ! Параметр2  ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !-ТIONAL"    !наличия SET (INFORMATIONAL)
                 !            !
                 !"SUCCESS"   !  То же SET (SUCCESS)
                 !            !
                 !"JOURNALING-!  Целое число, равное частоте
                 !            !
                 !FREQUENCY"  !вывода записей в журнальный
                 !            !
                 !            !файл
                 !            !
                 !"BELL"      !  Ключевое слово BROADCAST, если
                 !            !
                 !            !звонок выдается для всеобщих
                 !            !
                 !            !сообщений; Ноль, если SET (BELL)
                 !            !
                 !            !не установлено
                 !            !
      COMMAND_   !"FILE_NAME" !  Строка, содержащая спецификацию
                 !            !
      LINE       !            !имени файла при вызове TPU
                 !            !
                 !"OUTPUT_    !  То же выводного (/OUTPUT)
                 !            !
                 !FILE"       !
                 !            !
                 !"JOURNAL_   !  -"- журнального (/JOURNAL)
                 !            !
                 !_FILE"      !
                 !            !
                 !"COMMAND_   !  -"- командного (/COMMAND)
                 !            !
                 !FILE"       !
                 !            !
                 !"SECTION_   !  -"- секционного (/SECTION)
                 !            !
                 !FILE"       !
                 !            !
                 !"OUTPUT"    !  Целое число (0 или 1), флаг
                 !            !
                 !            !активности файла /OUTPUT
                 !            !
                 !"JOURNAL"   !  то же /JOURNAL
                 !            !
                 !"COMMAND"   !  -"- /COMMAND
                 !            !
                 !"SECTION"   !  -"- /SECTION
                 !            !
                 !"CREATE"    !  -"- /CREATE
                 !            !
                 !"DISPLAY"   !  -"- /DISPLEY
                 !            !
                 !"RECOVER"   ! Целое число (0 или 1) флаг


                                - 181 -
 
                          00152-01 34 04-1
 
 
                                            Продолжение табл. 8
      ---------------------------------------------------------
                 !            !
       Параметр1 ! Параметр2  ! Возвращаемое значение
                 !            !
      ---------------------------------------------------------
                 !            !
                 !            !спецификации файла /RECOVER
                 !            !
                 !"READ_ONLY" !  То же /READ_ONLY
                 !            !
           Примечания:
 
           1. Целое значение (0 или 1) обозначают логическое сос-
 
      тояние об'екта (1 - истина, 0 - ложь);
 
           2. Упорядочивание  окон  во  внутреннем   списке   TPU
 
      прOисходит по значению "ORIGINAL_TOP";
 
           3. Упорядочивание буферов  во  внутреннем  списке  TPU
 
      происходит по времени их создания.
 
           Возращаемое значение:
 
      TPU$_BADREQUEST WARNING-запрос, представленный вторым аргу-
 
      ментом, не соответствует типу данных первого аргумента.
 
           Примеры:
 
           1. MY_BUFFER := GET_INFO (BUFFERS,"CURRENT");
 
      Оператор писваивает переменной MY_BUFFER указатель на теку-
 
      щий буфер.
 
           2. MY_STRING := GET_INFO (CURRENT_BUFFER,"FILE_NAME");
 
      Оператор присваивает переменной MY_STRING имя входного фай-
 
      ла для текущего буфера.
 
           3. IS_BUF_MOD :=  GET_INFO(CURRENT_BUFFER,"MODIFIED");
 
      Оператор присваивает переменной IS_BUF_MOD целый 0  или  1;
 
      Единица означает, что текущий буфер был модифицирован, нуль
 
      означает, что текущий буфер не был модифицирован.
 


                                - 182 -
 
                          00152-01 34 04-1
 
 
           5.42. Процедура HELP_TEXT
 
 
           Встроенная процедура HELP_TEXT вызывает  утилиту  HELP
 
      операционной системы МОС ВП.
 
           Формат:
 
      HELP_TEXT (строка1, строка2, ключевое_слово, буфер)
 
           Параметры:
 
           Строка1 - строка в кавычках или имя переменной, предс-
 
      тавляющей строковую константу, или выражение, дающее  стро-
 
      ку, которая представляет собой спецификацию файла вспомога-
 
      тельной библиотеки;
 
           Строка2 - строка в кавычках, имя переменной, представ-
 
      ляющей строковую константу, или выражение,  дающее  строку,
 
      которая представляет  собой  начальную  библиотечную  тему.
 
      Если эта строка пустая, то будет отображен верхний  уровень
 
      HELP;
 
           Ключевое_слово - ключевое слово, которое устанавливает
 
      режим подсказки для  утилиты  HELP.  Допустимыми  ключевыми
 
      словами являются ON и OFF;
 
           Буфер - буфер, в который должна быть записана  вспомо-
 
      гательная информация.
 
           Описание.
 
           В качестве первого параметра необходимо указать специ-
 
      фикацию файла вспомогательной библиотеки. Если  указывается
 
      только имя файла, то утилита HELP  обеспечит  по  умолчанию
 
      устройство (SYS$HELP:) и тип файла (.HLB).  Если  начальная
 
      тема не указана вторым  параметром,  то  необходимо  ввести
 
      нулевую строку для обозначения места.  Утилита  HELP  будет
 
      отображать верхний уровень подсказки, допустимый  для  ука-
 
      занной библиотеки.
 


                                - 183 -
 
                          00152-01 34 04-1
 
 
           Если для встроенной процедуры  HELP_TEXT  установлено,
 
      ключевое слово ON, а выводимый текст на экране не  умещает-
 
      ся, то появится следующая подсказка:
 
      PRESS RETURN TO CONTINUE ... (нажать <RETURN> для продолже-
 
      ния).
 
           До  вызова  утилиты  HELP  очищается   вспомогательный
 
      буфер. Если вспомогательный буфер, связан с окном,  отобра-
 
      женным на экран, то это окно будет обновляться каждый  раз,
 
      когда TPU выдает подсказку  пользователя  при  вводе.  Если
 
      установлено ключевое слово OFF, то это окно не будет обнов-
 
      ляться процедурой HELP_TEXT.
 
           Если буфер HELP_BUFFER невидим (связанное с  ним  окно
 
      не отображено на экран), тогда и информация от утилиты HELP
 
      не будет видна.
 
           TPU сообщает об ошибке, если вспомогательная библиоте-
 
      ка, заданная строкой1, не найдена, если не найдена строка1,
 
      то появляется фатальная ошибка.
 
           Примеры:
 
           1. HELP_TEхT('TPUHELP','',OFF,HELP_BUFFER);
 
      Команда приводит к записи вспомогательной информации  верх-
 
      него уровня из  SYS$HELP:TPUHELP.HLB  (это  библиотека)  во
 
      вспомогательный буфер. Режим подсказки утилиты HELP  выклю-
 
      чен.
 
           2. HELP_TEXT ('TPUHELP',(READ_LINE('TOPIC:  ')),  OFF,
 
      SECOND_BUFFER);
 
      Команда запрашивает у пользователя тему для  утилиты  HELP.
 
      Информация, которая есть по этой теме в библиотеке TPUHELP,
 
      будет записана в буфер SECOND_BUFFER.
 
           3. Процедура USER_HELP отображает информацию о  режиме
 
      работы утилиты  HELP  в  строке  состояния,  делает  запрос


                                - 184 -
 
                          00152-01 34 04-1
 
 
      пользователю о вводе  и  отображает  буфер  HELP_BUFFER  на
 
      экран:
 
      !+
 
      !INTERACTIVE HELP
 
      !-
 
      PROCEDURE USER_HELP
 
      SET (STATUS_LINE, INTO_WINDOW, UNDERLINE,
 
      'PRESS CTRL/Z TO LEAVE PROMPTS THEN CTRL/F TO RESUME
 
      EDITING'); MAP (INFO_WINDOW, HELP_BUFFER);
 
      HELP_TEXT ('USERHELP', READ_LINE('TOPIC: '),ON,
 
      HELP_BUFFER);
 
      ENDPROCEDURE
 
 
 
           5.43. Процедура INDEX
 
 
           Встроенная процедура INDEX  определяет  местоположение
 
      символа или подстроки внутри указанной строки и  возвращает
 
      координату этого положения.
 
           Формат:
 
      INTEGER := INDEX (строка1,строка2)
 
           Параметры:
 
           Строка1 - строка, внутри которой необходимо найти сим-
 
      вол или подстроку;
 
           Строка2 - символ или подстрока, положение самого лево-
 
      го символа которой небходимо найти в строке строка1.
 
           Описание.
 
           Процедура INDEX находит самое левое  появление  строки
 
      строка2 в строке строка1; возвращается целое число, которое
 
      указывает позицию в строке строка1, начиная с которой  най-
 
      дена строка строка2. Если строка1 не найдена, тогда  возра-
 


                                - 185 -
 
                          00152-01 34 04-1
 
 
      щается ноль. Позиции символов внутри строки  строка1  нуме-
 
      руеются слева от 1.
 
           Примеры:
 
           1. LOC := INDEX('1234567','67');
 
      Оператор присваивания записывает целое значение 6  в  пере-
 
      менную  LOC,  т.к.  подстрока  '67'  расположена  в  строке
 
      '1234567' в позиции 6.
 
           2. Процедура USER_IS_CHARACTER  использует  встроенную
 
      процедуру INDEX и возращает значение 'истина', если  данный
 
      элемент представляет  собой  алфавитно-цифровой  символ,  и
 
      'ложь', в противном случае. Предполагается, что  параметром
 
      для этой процедуры должен быть символ:
 
      PROCEDURE USER_IS_CHARACTER (C)
 
      LOCAL SYMBOL_CHARACTERS;
 
      SYMBOL_CHARACTERS := "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
 
      IF INDEX (SYMBOL_CHARACTERS, C) > 0
 
            THEN RETURN 1;
 
            THEN RETURN 0;
 
            ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.44. Процедура INT
 
 
           Встроенная процедура INT преобразует строку,  содержа-
 
      щую символы цифр, в целое число.
 
           Формат:
 
      INTEGER:=INT (строка)
 
           Параметры:
 
           Строка - строка, которая состоит из цифровых символов.
 


                                - 186 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           Данную встроенную  процедуру  можно  использовать  для
 
      записи целого значения цифровых символов в переменную.  Имя
 
      полученой переменной можно затем использовать в  операциях,
 
      которые требуют целый тип данных.
 
           Возвращается значение 0 , если есть нецифровые  симво-
 
      лы.
 
           Примеры:
 
           1. USER_INT := INT ("12345") ;
 
      Оператор присваивания преобразует строку  "12345"  в  целое
 
      значение и запоминает его в переменной USER_INT .
 
           2. Процедура USER_PROMPT_NUMBER используется  команда-
 
      ми, которые запрашивают от пользователя  целые  числа.  Эта
 
      процедура возвращает значение истина, если подсказка  отра-
 
      ботала или  не  потребовалась;  ложь  в  противном  случае.
 
      Результат возвращается через выходной параметр:
 
      !
 
      !PARAMETЕRS:
 
      !
 
      !NEW_NUMBER        NEW INTEGER VALUE-OUTPUT
 
      !PROMPT_STRING     TEXT OF PROMPT-INPUT
 
      !NO_VALUE_MESSAGE  MESSAGE PRINTED IF USER PRESSES
 
      !                  RETURN TO сUT OUT OF THE COMMAND - INPUT
 
      PROCEDURE USER_PROMPT_NUMBER (NEW_NUMBER, PROMPT_STRING,
 
                                    NO_VALUE_MESSAGE)
 
      !STRING READ AFTER PROMPT
 
      LOCAL READ_LINE_STRING;
 
       READ_LINE_STRING := READ_LINE (PROMPT_STRING);
 
      EDIT (READ_LINE_STRING, TRIM);
 
      IF READ_LINE_STRING = ""


                                - 187 -
 
                          00152-01 34 04-1
 
 
         THEN
 
            MESSAGE (NO_VALUE_MESSAGE);
 
            NEW_NUMBER := 0;
 
            RETURN(0)
 
         ELSE
 
            TRANSLATE (READ_LINE_STRING, "1", "I");
 
            NEW_NUMBER := INT (READ_LINE_STRING);
 
            IF (NEW_NUMBER = 0) AND (READ_LINE_STRING <> "0")
 
               THEN
 
        MESSAGE (FAO ("DON'T UNDERSTAND !AS", READ_LINE_STRING));
 
                  RETURN (0);
 
               ELSE
 
                  RETURN (1);
 
            ENDIF;
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.45. Процедура JOURNAL_CLOSE
 
 
           Процедура JOURNAL_CLOSE закрывает открытый файл прото-
 
      кола (если он существует во время сеанса работы)  и  сохра-
 
      няет его.
 
           Формат:
 
      JOURNAL_CLOSE
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           После  выполнения  процедуры   JOURNAL_CLOSE   утилита
 
      перестает протоколировать текущий сеанс до тех пор, пока не
 
      будет выполнена процедура JOURNAL_OPEN; В этом случае  ути-
 


                                - 188 -
 
                          00152-01 34 04-1
 
 
      лита открывает новый файл протокола сеанса редактирования.
 
           Возвращаемое состояние:
 
      TPU$_NOJOURNAL WARNING - этот сеанс работы не  протоколиро-
 
      вался.
 
           Пример.
 
      JOURNAL_CLOSE ;
 
      Команда закрывает журнальный файл , если он существовал  во
 
      время сеанса редактирования.
 
 
 
           5.46. Процедура JOURNAL_OPEN
 
 
           Процедура JOURNAL_OPEN открывет файл журнала  и  начи-
 
      нает протоколировать сеанс редактирования, выполняя  запись
 
      каждой нажатой клавиши и введеной команды.
 
           Формат:
 
      JOURNAL_OPEN (строка)
 
           Параметры:
 
           Строка - имя журнального файла,  который  должен  быть
 
      создан для протоколирования сеанса редактирования.
 
           Описание.
 
           ТPU записывает нажатые в течение сеанса редактирования
 
      клавиши в буфер и сохраняет содержимое этого буфера в  жур-
 
      нальном файле. По умолчанию сохранение буфера происходит по
 
      мере его заполнения (500 байтов новой информации).  Сущест-
 
      вует возможность сделать так,  что  буфер  протокола  будет
 
      записываться в журнальный  файл  чаще;  достаточно  указать
 
      число "целое" (меньшее 500) для  встроенной  процедуры  SET
 
      (JOURNALING, целое).
 


                                - 189 -
 
                          00152-01 34 04-1
 
 
           Возвращаемое состояние:
 
      ТPU$_BADJOUFILE ERROR - противоречие  заканчивает  операцию
 
      восстановления.
 
 
           Примеры:
 
           1. JOURNAL_OPEN ('TEST_FIL') ;
 
      Оператор приводит к открытию  журнального  файла  с  именем
 
      TEST.FIL. TPU использует текущее устройство  и  каталог  по
 
      умолчанию для получения полной спецификации файла.
 
           2. Процедура USER_START_JOURNAL начинает  протоколиро-
 
      вание. Она вызывается из процедуры TPU$INIT_PROCEDURE после
 
      считывания файла в текущий буфер:
 
      PROCEDURE USER_START_JOURNAL
 
      !Имя файла протокола по умолчанию
 
      LOCAL DEFAULT_JOURNAL_NAME,
 
      !Вспомогательное имя протокола, извлеченное из имени файла
 
      IF (GET_INFO (COMMAND_LINE, "JOURNAL") = 1) AND
 
      (GET_INFO (COMMAND_LINE, "READ_ONLY") <> 1) THEN
 
         AUX_JOURNAL_NAME:=GET_INFO (CURRENT_BUFFER,"FILE_NAME");
 
         IF AUX_JOURNAL_NAME = "" THEN
 
      AUX_JOURNAL_NAME:=GET_INFO (CURRENT_BUFFER, "OUTPUT_FILE");
 
         ENDIF;
 
         IF AUX_JOURNAL_NAME = 0 THEN
 
            DEFAULT_JOURNAL_NAME := "";
 
         ENDIF;
 
         IF AUX_JOURNAL_NAME = "" THEN
 
            DEFAULT_JOURNAL_NAME := "USER.TJL";
 
         ELSE
 
            DEFAULT_JOURNAL_NAME := ".TJL";
 
         ENDIF;
 


                                - 190 -
 
                          00152-01 34 04-1
 
 
         JOURNAL_FILE := GET_INFO (COMMAND_LINE, "JOURNAL_FILE");
 
      JOURNAL_FILE:=FILE_PARSE(JOURNAL_FILE,DEFAULT_JOURNAL_NAME,
 
                             AUX_JOURNAL_NAME);
 
         JOURNAL_OPEN (JOURNAL_FILE);
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.47. Процедура кеY_NAME
 
 
           Встроенная прроцедура KEY_NAME возращает ключевое сло-
 
      во утилиты, соответствующее указанной клавише или  комбина-
 
      ции клавиш.
 
           Формат:
 
      Ключевое_слово_2 := KEY_NAME (строка  или  ключевое_слово_1
 
                          [, SHIFT_KEY])
 
           Параметры:
 
           Строка - строка, представляющая собой значение клавиши
 
      на основной клавиатуре;
 
           Ключевое_слово_1  -  ключевое  слово,   представляющее
 
      собой ключевое имя для клавиши;
 
           SHIFT_KEY - параметр, указывающий,  что  возвращаемому
 
      ключевому слову предшествует  одно  или  несколько  нажатий
 
      клавиш регистра. SHIFT_KEY относится к клавише  регистра  в
 
      TPU (РF1 по умолчанию), а не к клавише  SHIFT  на  основной
 
      клавиатуре.
 
           Описание.
 
           Процедура   KEY_NAME   испOльзуется    с    процедурой
 
      DEFINE_KEY при необходимости связать выполняемый код с кла-
 
      вишей или комбинацией клавиш, для которых в языке  TPU  нет
 
      ключевых имен. KEY_NAME используется для создания некоторо-
 


                                - 191 -
 
                          00152-01 34 04-1
 
 
      го ключевого слова, которое запоминается в TPU как  некото-
 
      рое ключевое имя.
 
           Отдельные клавиши клавиатуры,  используемые  KEY_NAME,
 
      чувствительны к регистру символов. Когда используется  нео-
 
      бязательный параметр  SHIFT_KEY  со  встроенной  процедурой
 
      KEY_NAME, то такие клавиши становятся  нечувствительными  к
 
      регистру символов.
 
           Возращаемые состояния:
 
      TPU$_MUSTBEONE WARNING - строка должна быть длиной 1;
 
      TPU$_NOTDEFINABLE WARNING - второй аргумент является  недо-
 
      пустимой ссылкой на клавишу.
 
           Примеры:
 
           1. KEY := KEY_NAME ('Z') ;
 
      Оператор присваивания создает ключевое имя KEY1 для клавиши
 
      Z на основной клавиатуре.
 
           2. KEY2 := KEY_NAME (KP5, SHIFT_KEY) ;
 
      Процедура KEY_NAME используется для создания ключевого име-
 
      ни комбинации клавиш.
 
           3. KEY3 := KEY_NAME (ASCII (10));
 
      Оператор присваивания создает ключевое имя KEY3 для символа
 
      перевода строки.
 
           4. В примере показана часть процедуры , которая  опре-
 
      деляет клавиши для интерфейса редактирования типа EDT:
 
      !
 
      ! Процедура определения клавиш эмулятора EDT
 
      !
 
      PROCEDURE USER_DEFINE_EDTKEY
 
      !BIND THE EDT FIND NEXT FUNCTION TO PF3
 
      DEFINE_KEY ('EDT$SEARCH_NEXT', PF3);
 
      ENDPROCEDURE


                                - 192 -
 
                          00152-01 34 04-1
 
 
           5.48. Процедура LAST_KEY
 
 
           Встроенная процедура LAST_KEY возвращает ключевое сло-
 
      во языка TPU для последнего введеного символа (нажатой кла-
 
      виши).
 
           Формат:
 
      Ключевое_слово := LAST_KEY
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           При создании  обучающей  последовательности  процедура
 
      LAST_KEY возвращает последнюю клавишу, введенную в  обучаю-
 
      щую последовательность ( а не клавишу , которая была нажата
 
      для вызова обучающей последовательности).
 
           Если утилита вызывается с  квалификатором  /NODISPLAY,
 
      то процедура LAST_KEY будет  взвращать  значение  ноль,  за
 
      исключением ситуации, когда оператор LAST_KEY  предшествует
 
      оператору READ_LINE; в этом случае LAST_KEY предусматривает
 
      возврат  ключевого  имени  последней  клавиши,  прочитанной
 
      READ_LINE (CTRL/Z или RETURN).
 
           Примеры:
 
           1. KEYZ := LAST_KEY ;
 
      Оператор присваивания записывает  ключевое  имя  последнего
 
      введенного символа (клавиши ) в переменную с именем KEYZ.
 
           2. Процедура USER_DEFINE_KEY запрашивает ввод у  поль-
 
      зователя для определения клавиш:
 
      PROCEDURE USER_DEFINE_KEY
 
      DEF := READ_LINE ('DEFINITION:');
 
      KEY := READ_LINE ('PRESS KEY TO DEFINE.', 1);
 
      IF LENGTH (KEY) > 0
 


                                - 193 -
 
                          00152-01 34 04-1
 
 
         THEN KEY := KEY_NAME (KEY);
 
         ELSE KEY := LAST_KEY;
 
      ENDIF;
 
      DEFINE_KEY (DEF, KEY);
 
      ENDPROCEDURE
 
 
 
           5.49. Процедуры LEARN_BEGIN и LEARN_END
 
 
           Встроенные процедуры LEARN_BEGIN и  LEARN_END  запоми-
 
      нают все клавиши, нажатые  между  клавишами  LEARN_BEGIN  и
 
      LEARN_END . LEARN_BEGIN начинает сохранение  (режим  обуче-
 
      ния) клавиш. LEARN_END  останавливает  "режим  обучения"  и
 
      возвращает обучающую последовательность, состоящую из  всех
 
      нажатых клавиш.
 
           Формат:
 
      LEARN_BEGIN (ключевое_слово);
 
      <последовательность нажатий клавиш>;
 
      LEARN := LEARN_END
 
           Параметры:
 
           Ключевое_слово - задает ввод  для  любой  из  процедур
 
      READ_LINE, READ_KEY или READ_CHAR, которые являются  частью
 
      обучающей последовательности. Допустимы следующие  ключевые
 
      слова:
 
           EXACT - заставляет TPU использовать ввод, который имел
 
      место для каждой процедуры READ_LINE,  READ_KEY  или  READ_
 
      _CHAR, когда эта обучающая последовательность была создана,
 
      как ввод для этих встроенных процедур, когда обучающая пос-
 
      ледовательность вызывается заново;
 
           NO_EXACT - заставляет TPU  выдавать  подсказку  каждый
 
      раз, когда осуществляется новый ввод в READ_LINE,  READ_KEY
 


                                - 194 -
 
                          00152-01 34 04-1
 
 
      или READ_CHAR при повторном вводе внутри обучающей последо-
 
      вательности.
 
           Описание.
 
           Разрешается использовать имя переменной, которой прис-
 
      воено значение обучающей последовательности,  как  параметр
 
      встроенной процедуры EXECUTE для повторного ввода обучающей
 
      последовательности. Можно также использовать имя этой пере-
 
      менной как параметр  встроенной  процедуры  DEFINE_KEY  для
 
      привязки этой последовательности к некоторой  клавише  так,
 
      что  обучающая  последовательность  будет  выполняться  при
 
      нажатии клавиши.
 
           Обучающая  последовательность  отличается  от   других
 
      программ в языке TPU тем, что создается из нажатия  клавиш,
 
      а не из операторов языка. Создание обучающей последователь-
 
      ности происходит во время ввода текста и выполнения команды
 
      TPU . Обучающие последовательности делают  легким  набор  и
 
      выполнение набора команд утилиты, поэтому удобны для созда-
 
      ния "временных" программ. Обучающие последовательности мож-
 
      но использовать в течение сеанса редактирования, в  котором
 
      они были созданы.
 
           Обучающие последовательности являются отличным средст-
 
      вом для сохранения серий  редактирующих  операций,  которые
 
      приходится выполнять многократно в  течение  одного  сеанса
 
      редактирования.
 
           Утилитой  предоставляется  возможность  по  сохранению
 
      обучающих последовательностей от сеанса к сеансу так, чтобы
 
      их можно было использовать в другом сеансе  редактирования.
 
      Для сохранения обучающей последовательности необходимо наз-
 
      начить  ее  некоторой  клавише,а  перед  окончанием  сеанса
 
      редактирования использовать встроенную процедуру  SAVE  для


                                - 195 -
 
                          00152-01 34 04-1
 
 
      сохранения текущего секционного  файла;  новые  определения
 
      теущего сеанса будут добавлены в секционный файл.
 
           Примечание. В обучающей последовательности не рекомен-
 
      дуется  использовать  встроенные  процедуры,   возвращающие
 
      сообщения типа WARNING или ERROR; обучающая  последователь-
 
      ность не останавливается при обнаружении ошибок.
 
           Возвращаемые состояния:
 
      TPU$_NOTLEARNING   WARNING   -   до   LEARN_END   не   было
 
      LEARN_BEGIN;
 
      TPU$_ONELEARN WARNING - уже работает  обучающая  последова-
 
      тельность.
 
 
 
           5.50. Процедура LENGTH
 
 
           Процедура LENGTH возвращает  целое  значение,  которое
 
      является числом символьных позиций в строке или в  диапазо-
 
      не.
 
           Формат:
 
      Целое := LENGTH (строка или диапазон)
 
           Параметры:
 
           Строка - строка, чью длину необходимо определить;
 
           Диапазон - диапазон, чью длину необходимо  определить;
 
      ограничители строк не включаются  в  количество  символьных
 
      позиций.
 
           Примеры:
 
           1. STR_LEN := LENGTH ('дон кихот') ;
 
      Оператор присваивания записывает число  символов  в  строке
 
      "дон кихот" в переменную STR_LEN. В данном примере это чис-
 
      ло равно 9.
 
           2. USER_HOW_LONG := LENGTH (MY_RANGE) ;
 


                                - 196 -
 
                          00152-01 34 04-1
 
 
      Оператор присваивания записывает число символьных позиций в
 
      диапазоне MY_RANGE (исключая ограничители строк) в перемен-
 
      ную USER_HOW_LONG.
 
           3.Процедура USER_MARK размещает  маркер  без  указания
 
      видеоатрибутов в  текущую  позицию.  Маркер  связывается  с
 
      переменной, которая начинается с USER_MARK_AND и  кончается
 
      строкой, пересылаемой  как  параметр.  Процедура  USER_MARK
 
      выводит сообщение в область сообщений,  проверяя  MARK_NAME
 
      входного параметра:
 
      PROCEDURE USER_MARK (MARK_PARAMETER)
 
      LOCAL MARK_NAME;
 
      ON_ERROR
 
      MESSAGE (FAO ("CANNOT USE! AS - имя маркера", MARK_NAME));
 
      RETURN;
 
      ENDON_ERROR;
 
      IF LENGTH (MARK_PARAMETER) > 122
 
      THEN
 
          MARK_NAME := SUBSTR (MARK_NAME, 1, 122);
 
      ELSE
 
          MARK_NAME := MARK_PARAMETER;
 
      ENDIF;
 
      EXECUTE ("USER_MARK_" + MARK_NAME +" := MARK(NONE)");
 
      MESSAGE (FAO("CURRENT POSITION MARKED AS !AS", MARK_NAME));
 
      ENDPROCEDURE
 


                                - 197 -
 
                          00152-01 34 04-1
 
 
           5.51. Процедура LINE_BEGIN
 
 
           Процедура LINE_BEGIN возвращает шаблон, который  соот-
 
      ветствует условию "начало-строки".
 
           Формат:
 
      Шаблон := LINE_BEGIN
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Процедура LINE_BEGIN является одной из встроенных про-
 
      цедур TPU, которые  позволяют  осуществлять  поиск  сложных
 
      строк путем создания шаблонов, соответствующих определенным
 
      условиям. Например, для определения вхождения восклицатель-
 
      ного знака (!) первым символом в строке, необходимо исполь-
 
      зовать встроенную процедуру LINE_BEGIN, создающую шаблон:
 
      PAT1 := LINE_BEGIN & '!' ;
 
           Когда используется  встроенная  процедура  SEARCH,  TO
 
      шаблоны, построенные с помощью  LINE_BEGIN,  не  перемещают
 
      текущую позицию символа в начало строки в том случае, когда
 
      пара для шаблона  подобрана  в  начале  строки.  Необходимо
 
      использовать встроенную процедуру POSITION для  перемещения
 
      текущей позиции символа в начало диапазона,  который  соот-
 
      ветствует шаблону.
 
           Примеры:
 
           1. PAT1 := LINE_BEGIN ;
 
      Оператор присваивания  запоминает  условие,  относящееся  к
 
      началу строки, в переменной PAT1.
 
           2. Пример процедуры:
 
      PROCEDURE USER_REMOVE_DSRLINES
 
      LOCAL S1, PAT1;
 


                                - 198 -
 
                          00152-01 34 04-1
 
 
      PAT1 := LINE_BEGIN & '.';
 
      LOOP
 
         S1 := SEARCH (PAT1, FORWARD);
 
         EXITIF S1 = 0;
 
         POSITION (S1);
 
         ERASE_LINE;
 
      ENDLOOP
 
      ENDPROCEDURE
 
      Процедура удаляет все команды программы DOC из файла  путем
 
      поиска шаблонов, которые имеют точку (.) в начале строки, и
 
      удаления найденных строк.
 
 
 
           5.52. Процедура LINE_END
 
 
           Процедура LINE_END возвращает  шаблон,  который  соот-
 
      ветствует условию "конец-строки".
 
           Формат:
 
      Шаблон := LINE_END
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Условие "конец-строки" соответствует самому последнему
 
      справа символу в любой строке.
 
           Когда используется  встроенная  процедура  SEARCH,  то
 
      LINE_END не перемещает текущую  позицию  символа  в  начало
 
      следующей строки в том случае, когда найдена пара для усло-
 
      вия "конец-строки". Необходимо использовать встроенную про-
 
      цедуру POSITION для перемещения текущей позиции  символа  в
 
      начало диапазона, который соответствует шаблону.
 


                                - 199 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. PAT1 := LINE_END ;
 
      Оператор присваивания  запоминает  условие,  относящееся  к
 
      концу строки, в переменной с именем PAT1.
 
           2. Пример процедуры:
 
      PROCEDURE USER_END_OF_LINE
 
      EOL_PATTERN := LINE_END;
 
      EOL_RANGE := SEARCH (EOL_PATTERN, FORWARD);
 
      IF EOL_RANGE <> 0
 
         THEN POSITION (EOL_RANGE);
 
         ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.53. Процедура LOOKUP_KEY
 
 
           Процедура LOOKUP_KEY возвращает  выполняемый  код  или
 
      комментарий, который связан с указанной клавишей. Этот  код
 
      может быть возвращен как некоторая программа или  обучающая
 
      последовательность. Комментарий возвращается как строка.
 
           Формат:
 
      Программа или обучающая последовательность  или  целое  или
 
      строка := LOOKUP_KEY (ключевое_слово_1, ключевое_слово_2)
         
           Параметры:
 
           Ключевое_слово_1 - ключевое имя TPU  для  клавиши  или
 
      комбинации клавиш;
 
           Ключевое_слово_2 - указывает элемент, который связан с
 
      рассматриваемой  клавишей.  Допустимыми  ключевыми  словами
 
      являются PROGRAM и COMMENT:
 
           PROGRAM - указывает, что программа или обучающая  пос-
 
      ледовательность должны быть возвращены, если клавиша  опре-
 


                                - 200 -
 
                          00152-01 34 04-1
 
 
      делена. Если клавиша не определена, то TPU возвращает целый
 
      ноль;
 
           COMMENT - специфицирует, что строка комментария, кото-
 
      рая  была  задана  при  определении   клавиши   с   помощью
 
      DEFINE_KEY, должна быть возвращена. Если не был задан  ком-
 
      ментарий, то возвращается нулевая строка.
 
           Описание.
 
           Встроенная процедура LOOKUP_KEY может возвратить прог-
 
      рамму, обучающую последовательность, строку или целое число
 
      ноль (ноль означает, что клавиша не имеет определения).
 
           Процедура LOOKUP_KEY полезна, когда используются  вре-
 
      менные определения клавиш в течение сеанса редактирования и
 
      необходимо проверить уже существующие определения клавиш.
 
           Возвращаемые состояния:
 
      TPU$_NOTDEFINABLE WARNING -  второй  аргумент  не  является
 
      действующим обращением к клавише;
 
      TPU$_NODEFINITION WARNING - нет определения для этой клави-
 
      ши.
 
           Примеры:
 
           1. PROGRAMM := LOOKUP_KEY (KEY1, PROGRAM) ;
 
      оператор присваивания возвращает выполняемый  код,  который
 
      связан с клавишей KEY1. Второй аргумент  -  ключевое  слово
 
      PROGRAM - указывает, что в качестве результата должна  быть
 
      возвращена либо программа,  либо  обучающая  последователь-
 
      ность, т.е. возвращается тип данных PROGRAM или LEARN.
 
           2. Процедура USER_COMMENT отображает в области сообще-
 
      ния комментарий, который задан во время определения  клавиш
 
      для последней введенной клавиши:
 
      PROCEDUURE USER COMMENT
 
      MESSAGE (LOOKUP_KEY (LAST_KEY, COMMENT));


                                - 201 -
 
                          00152-01 34 04-1
 
 
      ENDPROCEDURE
 
 
 
           5.54. Процедура MAP
 
 
           Процедура MAP связывает буфер с  окном  и  делает  это
 
      окно видимым на экране. Перед использованием процедуры  мар
 
      необходимо создать буфер и окно, которые затем используются
 
      как параметры.
 
           Формат:
 
      MAP (окно, буфер)
 
           Параметры:
 
           Окно - окно, которое необходимо отобразить на экран;
 
           Буфер - буфер, который необходимо связать с отображае-
 
      мым окном.
 
           Описание.
 
           Окно и  буфер,  указанные  как  параметры,  становятся
 
      новым текущим окном и буфером соответственно. Позиция  кур-
 
      сора на экране будет той же самой, что и текущая символьная
 
      позиция в буфере.
 
           Процедура MAP  может  привести  к  тому,  отображенные
 
      ранее окна, могут быть частично или полностью закрыты новым
 
      окном.
 
           Если мар приводит к тому, что новое окно накладывается
 
      на существующее и разделяет (сегментирует) его на две  час-
 
      ти, то только верхняя часть  сегментированного  окна  будет
 
      оставаться видимой и будет обновляться. Нижняя  часть  сег-
 
      ментированного окна будет очищена при следующем  обновлении
 
      экрана. Если  наложенное  окно  удаляется,  то  весь  экран
 
      обновляется так, что сегментированное окно приобретает свои
 
      начальные размеры и местоположение на экране.
 


                                - 202 -
 
                          00152-01 34 04-1
 
 
           Необходимо заметить, что выполнение мар внутри  другой
 
      процедуры не приводит к обновлению экрана до тех пор,  пока
 
      вызывающая (внешняя) процедура не закончит свою работу и не
 
      возвратит управление диспетчеру экрана;  перевывод  окон  и
 
      очистка строк не будут иметь место до тех пор, пока  управ-
 
      ление не будет возвращено диспетчеру экрана. Если необходи-
 
      мо, чтобы экран обновлялся в процессе работы внешней проце-
 
      дуры, нужно сразу запустить обновление окна путем вставки в
 
      текст процедуры оператора UPDATE.
 
           Возвращаемое состояние:
 
      TPU$_MAXMAPPEDBUF WARNING - отображение буфера в окно огра-
 
      ничено.
 
           Примеры:
 
           1. MAP (MAIN_WINDOW, MAIN_BUFFER) ;
 
      Команда связывает главный буфер с главным окном  и  отобра-
 
      жает главное окно на экран. Главный буфер и окно необходимо
 
      создать с помощью процедур CREATE_BUFFER и CREATE_WINDOW, а
 
      затем использовать их в качестве параметров для мар.
 
           2. Процедура USER_MESSAGE_WINDOW создает буфер и  окно
 
      для сообщений. Она связывает буфер  с  окном  и  отображает
 
      окно на экран:
 
      PROCEDURE USER_MESSAGE_WINDOW
 
         MESSAGE_BUFFER := CREATE_BUFFER ("MESSAGE")  ;
 
         SET (EOB_TEXT, MESSAGE_BUFFER, "");
 
         SET (NO_WRITE, MESSAGE_BUFFER);
 
         SET (SYSTEM, MESSAGE_BUFFER);
 
         MESSAGE_WINDOW := CREATE_WINDOW (23, 2, OFF);
 
         SET (VIDEO, MESSAGE_WINDOW, NONE);
 
         MAP (MESSAGE_WINDOW, MESSAGE_BUFFER);
 
      ENDPROCEDURE


                                - 203 -
 
                          00152-01 34 04-1
 
 
           5.55. Процедура MARK
 
 
           Процедура  MARK  возвращает  маркер,   соответствующий
 
      текущей позиции символа в текущем буфере. Необходимо указы-
 
      вать, каким образом маркер должен быть отображен на экране,
 
      используя для этого ключевые слова.
 
           Формат:
 
      Маркер := MARK(ключевое_слово)
 
           Параметры:
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) NONE - для маркера не применяются видеоатрибуты;
 
           2) BOLD - маркер должен быть выделен;
 
           3) BLINK - маркер должен мигать;
 
           4) REVERSE - маркер должен быть отображен реверсивно
 
                        (негативно);
 
           5)UNDERLINE - маркер должен быть подчеркнут.
 
           Описание.
 
           Встроенная процедура MARK может быть использована  для
 
      установления указателей  места.  При  выполнении  процедуры
 
      MARK маркер связывается с символом,  который  указывает  на
 
      текущее местоположение. Если символ, связанный с  маркером,
 
      удаляется, то маркер перемещается на  ближайшую  символьную
 
      позицию. Если символ, связанный с маркером,  передвигается,
 
      то также перемещается и маркер. Ближайшая  позиция  символа
 
      определяется следующим способом:
 
           1) если существует позиция символа  в  той  же  строке
 
      справа, то маркер перемещается на эту  позицию,  даже  если
 
      она расположена в конце строки;
 
           2) если строка, в которой расположен маркер,  удаляет-
 
      ся, то маркер перемещается на первую  позицию  в  следующей
 


                                - 204 -
 
                          00152-01 34 04-1
 
 
      строке.
 
           Можно переместиться на одну колонку  после  последнего
 
      символа в строке и разместить  маркер  там.  Однако  видеть
 
      видеоатрибуты маркера будет невозможно  до  тех  пор,  пока
 
      маркер не будет перемещен в другое место на экране.
 
           Если маркер, расположенный в конце строки, использует-
 
      ся как часть диапазона, то он  будет  включен  в  диапазон,
 
      даже если не расположен на символе.
 
           Примеры:
 
           1. USER_MARK := MARK(NONE) ;
 
      Оператор присваивания размещает маркер на  текущей  позиции
 
      символа. Для этого маркера видеоатрибуты не заданы.
 
           2. USER_MARK_UNDER := MARK(UNDERLINE) ;
 
      Оператор присваивания размещает маркер в строке и  колонке,
 
      которые соответствуют текущEй позиции символа. Символ, свя-
 
      занный с маркером, будет подчеркнут.
 
           3. MY_MARK := MARK(UNDERLINE) ;
 
           MY_MARK := MARK (BLINK);
 
      Операторы присваивания размещают маркер в строке и колонке,
 
      которые соответствуют текущей позиции символа. Символ, свя-
 
      занный с маркером, подчеркивается и мерцает.
 
           4. Процедура USER_PASTE  маркирует  временную  позицию
 
      символа, затем переходит к буферу  для  склеек,  и  создает
 
      диапазон из содержимого этого буфера; переходит на TEMP_POS
 
      и вставляет текст из буфера  склеек  начиная  с  отмеченной
 
      позиции:
 
      PROCEDURE USER_PASTE
 
      TEMP_POS := MARK (NONE);
 
      POSITION (END_OF (PASTE_BUFFER));
 
      MOVE_HORIZONTAL (-2);


                                - 205 -
 
                          00152-01 34 04-1
 
 
      PASTE_TEXT := CREATE_RANGE (BEGINNING_OF (PASTE_BUFFER),
 
      MARK (NONE), NONE);
 
      POSITION (TEMP_POS);
 
      COPY_TEXT (PASTE_TEXT);
 
      ENDPROCEDURE
 
 
 
           5.56. Процедура MATCH
 
 
           Процедура MATCH возвращает  шаблон,  который  подходит
 
      для указываемой последовательности символов, начинающейся с
 
      текущей позиции символа.
 
           Формат:
 
      Шаблон := MATCH (строка)
 
           Параметры:
 
           Строка - строка в кавычках или имя переменной,  предс-
 
      тавляющей  строковую  константу  (набор  символов,  которые
 
      должны быть частью окончательного шаблона).
 
           Описание.
 
           Строка, используемая для подбора шаблона  в  процедуре
 
      MATCH, должна содержать все символы, указанные  параметром.
 
      Возвращаемый процедурой MATCH шаблон не пересекает  границы
 
      записей (строк).
 
           Примеры:
 
           1. PAT1 := MATCH('ABC') ;
 
      Оператор присваивания запоминает  в  PAT1  шаблон,  который
 
      будет подбирать строку  символов,  начинающуюся  с  текущей
 
      позиции символа и включающую символы "ABC".
 
           2. Процедура USER_DOUBLE_PARENS находит  текст  внутри
 
      двойных скобок. Она перемещает текущую  позицию  символа  в
 
      начало этого текста, если он существует:
 


                                - 206 -
 
                          00152-01 34 04-1
 
 
      PROCEDURE USER_DOUBLE_PARENS
 
         PAREN_TEXT := '(('&MATCH ('))')
 
         FOUND_RANGE := SEARCH (PAREN_TEXT, FORWARD, NO_EXACT);
 
         IF FOUND_RANGE = 0  !NO MATCH
 
      THEN MESSAGE  ('NO MATCH FOUND.');
 
      ELSE POSITION (FOUND_RANGE);
 
      ENDIF
 
      ENDPROCEDURE
 
 
 
           5.57. Процедура MESSAGE
 
 
           Процедура MESSAGE вставляет символы  указанной  строки
 
      или диапазона в буфер сообщений,  если  он  существует  (по
 
      умолчанию используется  буфер  с  именем  MESSAGE_BUFFER.).
 
      Если нет буфера, то сообщение выводится по  текущему  месту
 
      на устройстве SYS$OUTPUT (обычно это терминал).
 
           Формат:
 
      MESSAGE (строка или диапазон)
 
           Параметры:
 
           Строка - строка в кавычках, или переменная,  представ-
 
      ляющая текст, который необходимо включить в  буфер  сообще-
 
      ния;
 
           Диапазон - диапазон, содержащий текст, который необхо-
 
      димо включить в буфер сообщения.
 
           Описание.
 
           Задачей   этой    процедуры    является    обеспечение
 
      пользователя, который пишет свой интерфейс  редактирования,
 
      средством отображения  сообщений,  согласующимся  с  языком
 
      TPU. Если существует буфер  сообщений,  с  которым  связано
 
      отображенное на экран окно, то указанная строка или  диапа-
 


                                - 207 -
 
                          00152-01 34 04-1
 
 
      зон немедленно появляются в окне сообщений на экране.
 
           Если буфер сообщений не связан с отображенным на экран
 
      окном, то сообщения будут записаны в буфер, но не  появятся
 
      на экране.
 
           Примеры:
 
           1. MESSAGE ('привет') ;
 
      команда запишет текст "привет" в область сообщений.
 
           2. В процедуре USER_ON_EOL определяется, находится  ли
 
      курсор в конце строки; посылается сообщение в область сооб-
 
      щений о положении курсора:
 
      PROCEDURE USER_ON_EOL
 
      !Проверка на конец строки,
 
      MOVE_HORIZONTAL (1);
 
      IF CURRENT_OFFSET = 0  !тогда мы в конце строки
 
         THEN
 
            !Возвращает истину
 
            MESSAGE ("CURSOR AT еND OF LINE");
 
         ELSE
 
            !Возвращает ложь
 
            MESSAGE ("CURSOR IS NOT AT THE END OF LINE");
 
      ENDIF;
 
      MOVE_HORIZONTAL (-1);     !сдвиг назад
 
      ENDPROCEDURE
 
 
 
           5.58. Процедура MOVE_HORIZONTAL
 
 
           Процедура MOVE_HORIZONTAL изменяет  текущее  положение
 
      символа в текущем буфере на заданное число символов.
 


                                - 208 -
 
                          00152-01 34 04-1
 
 
           Формат:
 
      MOVE_HORIZONTAL (целое)
 
           Параметры:
 
           Целое - целое  значение  со  знаком  плюс  или  минус,
 
      задающее число символов, на  которое  должно  переместиться
 
      текущее положение символа. Положительное значение  приводит
 
      к перемещению в направлении к концу  буфера.  Отрицательное
 
      целое значение приводит к перемещению в направлении к нача-
 
      лу буфера.
 
           Описание.
 
           Горизонтальное перемещение позиции символа привязано к
 
      тексту. Процедура MOVE_HORIZONTAL пересекает границы  строк
 
      при перемещении текущей позиции символа.
 
           Настройка символьной позиции,  выполняемая  процедурой
 
      MOVE_HORIZONTAL, невидима на экране до тех пор, пока  пози-
 
      ция курсора и текущая позиция символа не совпадут  (текущий
 
      буфер должен быть  связан  с  окном,  которое  в  настоящий
 
      момент отображено на экран). При совпадении  позиций  экран
 
      (если необходимо)  прокручивается  так,  что  установленная
 
      символьная позиция, располагается внутри пределов перемеще-
 
      ния, установленных для отображаемого окна.
 
           Попытка переместиться за начало или за  конец  буфера.
 
      Приводит к сообщению об ошибке.
 
           Возвращаемые состояния:
 
      TPU$_NOCURRENTBUF WARNING - нет позиционирования в буфере;
 
      TPU$_ENDOFBUF WARNING  -  попытка  переместиться  за  конец
 
      буфера;
 
      TPU$_BEGOFBUF WARNING -  попытка  переместиться  за  начало
 
      буфера.
 


                                - 209 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. MOVE_HORIZONTAL (+5) ;
 
      Команда перемещает текущую позицию символа  на  5  символов
 
      вправо в текущем буфере.
 
           2. Процедура USER_MOVE_BY_LINES перемещает текст  сек-
 
      циями по 8 строк и использует процедуру MOVE_HORIZONTAL для
 
      перемещения текущей позиции символа в начало строки:
 
      PROCEDURE USER_MOVE_BY_LINES
 
      IF CURRENT_DIRECTION =FORWARD
 
         THEN
 
            MOVE_VERTICAL (8)
 
         ELSE
 
            MOVE_VERTICAL(-8)
 
      ENDIF;
 
      MOVE_HORIZONTAL (-CURRENT_OFFSET);
 
      ENDPROCEDURE
 
 
 
           5.59. Процедура MOVE_TEXT
 
 
           Процедура MOVE_TEXT перемещает указанный текст и  раз-
 
      мещает его перед текущей позицией символа в текущем буфере.
 
      Перемещаемый текст удаляется со своего  начального  положе-
 
      ния.
 
           Формат:
 
      MOVE_TEXT (строка или диапазон или буфер)
 
           Параметры:
 
           Строка - строка в кавычках или имя переменной,  предс-
 
      тавляющей строковую константу, или выражение, дающее строку
 
      текста, который необходимо переместить;
 
           Диапазон - диапазон, содержащий текст, который необхо-
 


                                - 210 -
 
                          00152-01 34 04-1
 
 
      димо переместить;
 
           Буфер - буфер с текстом, который  необходимо  перемес-
 
      тить.
 
           Описание.
 
           Если для текущего  буфера  установлен  режим  вставки,
 
      указанный текст будет вставлен  перед  текущей  позицией  в
 
      текущем буфере. Если для буфера отменен режим  вставки,  то
 
      указанный текст  будет  заменять  существующий,  начиная  с
 
      текущей позиции и до исчерпания длины строки, диапазона или
 
      буфера.
 
           Маркеры и диапазоны не перемещаются вместе с  текстом.
 
      Если текст, с которым связан маркер или  диапазон,  переме-
 
      щается, то структура маркера и диапазона с их  видеоатрибу-
 
      тами перемещается на следующий ближайший символ. Чтобы уда-
 
      лить структуру маркера или диапазона, необходимо  использо-
 
      вать встроенную процедуру DELETE или установить в ноль свя-
 
      занную с ними переменную.
 
           Процедура MOVE_TEXT подобна процедуре COPY_TEXT; одна-
 
      ко, процедура MOVE_TEXT удаляет текст в его начальном поло-
 
      жении, в то время как процедура COPY_TEXT делает копию это-
 
      го текста в новом месте.
 
           Возвращаемое состояние:
 
      TPU$_NOCACHE - ERROR - нет памяти под новый кэш;
 
           Примеры:
 
           1. MOVE_TEXT (MAIN_BUFFER) ;
 
      В режиме вставки команда приведет к перемещению  текста  из
 
      буфера MAIN_BUFFER в текущий  буфер  и  вставке  его  перед
 
      текущей  позицией;  этот  текст  будет  удален  из   буфера
 
      MAIN_BUFFER.
 
           2. Процедура USER_MOVE_TEXT разместит текст из рабоче-


                                - 211 -
 
                          00152-01 34 04-1
 
 
      го буфера перед текущей  позицией  символа  в  буфере  MAIN
 
      (главном). Текст удаляется из рабочего буфера:
 
      PROCEDURE USER_MOVE_TEXT
 
      LOCAL THIN_MODE;
 
      !Сохранить режим ввода символов в текущем буфере в
 
      !переменной с именем THIS_MODE;
 
          THIS_MODE := GET_INFO (CURRENT_BUFFER, "MODO");
 
      !Установить для текущего буфера режим вставки символов
 
          SET (INSERT, CURRENT_BUFFER);
 
      !Переместить текст из сборного буфера в текущий буфер;
 
          MOVE_TEXT (SCRATCH_BUFFER);
 
      !Восстановить режим ввода символов для текущего буфера
 
          SET (THIN_MODE, CURRENT_BUFFER);
 
      ENDPROCEDURE
 
 
 
           5.60. Процедура MOVE_VERTICAL
 
 
           Встроенная процедура MOVE_VERTICAL перемещает  текущую
 
      позицию символа в текущем буфере на указанное число строк.
 
           Формат:
 
      MOVE_VERTICAL (целое)
 
           Параметры:
 
           Целое - целое  значение  со  знаком  плюс  или  минус,
 
      задающее число строк, на  которое  должна  быть  перемещена
 
      текущая позиция. Положительное значение приводит к  переме-
 
      щению в направлении к концу  буфера.  Отрицательное  значе-
 
      ние - к началу буфера.
 
           Описание.
 
           Перемещение,  выполняемое  процедурой   MOVE_VERTICAL,
 
      привязано к тексту. TPU пытается сохранить то же самое сим-
 


                                - 212 -
 
                          00152-01 34 04-1
 
 
      вольное смещение относительно начала строки, что и до  вер-
 
      тикального перемещения. Однако, если в строках есть табуля-
 
      ции, то новая символьная позиция не  будет  соответствовать
 
      старой.
 
           Регулировка    символьной     позиции,     выполняемая
 
      MOVE_VERTICAL, не отражается на экране  до  тех  пор,  пока
 
      позиция курсора и текущая символьная  позиция  не  совпадут
 
      (текущий буфер должен быть связан с окном, отображенным  на
 
      экран). Если позиции одинаковые, то  выполняется  прокрутка
 
      экрана (если это необходимо), символьная позиция,  установ-
 
      ленная с помощью MOVE_VERTICAL, становится видимой.
 
           Попытка пересечь начало или конец  буфера  приводит  к
 
      выдаче предупреждения.
 
           Возвращаемые состояния:
 
      TPU$_BEGOFBUF WARNING - попытка пересечь начало буфера;
 
      TPU$_ENDOFBUF WARNING - попытка пересечь конец буфера;
 
      TPU$_NOCURRENTBUF WARNING - нет позиционирования в буфере.
 
           Примеры:
 
           1. MOVE_VERTICAL (+5) ;
 
      Команда перемещает текущую позицию в текущем  буфере  на  5
 
      строк вертикально по направлению к концу буфера.
 
           2. Процедура USER_MOVE_8_LINES перемещает  текст  пор-
 
      циями по 8 строк:
 
 
      PROCEDURE USER_MOVE_8_LINES
 
      IF CURRENT_DIRECTION = FORWARD
 
         THEN
 
            MOVE_VERTICAL (8)
 
         ELSE
 
            MOVE_VERTICAL (-8)
 


                                - 213 -
 
                          00152-01 34 04-1
 
 
      ENDIF;
 
      MOVE_HORIZONTAL (-CURRENT_OFFSET);
 
      ENDPROCEDURE
 
 
 
           5.61. Процедура NOTANY
 
 
           Процедура  NOTANY  возвращает  шаблон,  совпадающий  с
 
      любым отдельным символом, не входящим в  строку,  указанную
 
      параметром.
 
           Формат:
 
      Шаблон := NOTANY (строка)
 
           Параметры:
 
           Строка - строка в кавычках или имя переменной,  предс-
 
      тавляющей строковую константу.
 
           Описание.
 
           Когда используется  встроенная  процедура  SEARCH,  то
 
      шаблон, возвращенный процедурой NOTANY, будет  приводить  к
 
      успешному подбору, если ни один символ из этого шаблона  не
 
      найден в рассматриваемом тексте.
 
           Шаблон,  возвращенный  процедурой  NOTANY,   подбирает
 
      отдельный символ.  Этот  результат  отличен  от  результата
 
      работы процедуры SCAN, которая возвращает шаблон  из  самой
 
      длинной строки символов, не содержащей символы из указанной
 
      строки.
 
           Примеры:
 
           1. PAT1 := NOTANY ('ABC') ;
 
      Оператор присваивания создает шаблон, подбирающий в области
 
      поиска первый символ, не равный А,В,С.  Этот  подбор  будет
 
      неудачным, если будет найден символ либо А, либо В, либо С.
 
           2. Процедура USER_SEARCH_FOR_NONALPHA стартует с теку-
 


                                - 214 -
 
                          00152-01 34 04-1
 
 
      щего положения и ищет первый символ, не являющийся алфавит-
 
      ным    символом    верхнего    регистра;    в    переменной
 
      NON_ALPNHA_RANGE запоминается символ,  подходящий  под  это
 
      условие:
 
      PROCEDURE USER_SEARCH_FOR_NONALPHA
 
      NON_ALPHA_PATTERN := NOTANY ('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
 
      NON_ALPHA_RANGE := SEARCH (NON_ALFA_PATTERN, FORWARD, NO_
 
      EXACT);
 
      IF (NON_ALPHA_RANGE = 0)
 
         THEN
 
            USER_SEARCH_FOR_FIRET_NONALPHA := 0;
 
         ELSE
 
            USER_SEARCH_FOR_FIRST_NONALPHA := BEGINNING_OF
 
                                           (NON_ALPHA_RANGE);
 
      ENDIF;
 
      ENDPROCEDURE
 
      !Значением этой процедуры является либо маркер, отмечающий
 
      !следующий неалфавитный символ или целый 0, если не найден
 
      !неалфавитный символ.
 
 
 
           5.62. Процедура POSITION
 
 
           Процедура POSITION  устанавливает  текущую  символьную
 
      позицию в контексте редактирования. Разрешено  позициониро-
 
      вать в диапазоне, маркере, буфере или окне.
 
           Формат:
 
           POSITION (буфер или MAркер или диапазон или окно)
 
           Параметры:
 
           Буфер - буфер, в котором необходимо разместить текущую
 
      позицию символа; она становится последней позицией (по вре-
 


                                - 215 -
 
                          00152-01 34 04-1
 
 
      мени) в этом буфере;
 
           Маркер - маркер, с которым необходимо связать  текущую
 
      позицию символа;
 
           Диапазон - диапазон, в котором  необходимо  разместить
 
      текущую позицию символа; она устанавливается в начало этого
 
      диапазона;
 
           Окно - отображаемое на экране окно, в котором  необхо-
 
      димо разместить текущую позицию символа.  Текущей  позицией
 
      символа становятся строка и столбец на экране, которые были
 
      текущими в последний раз в этом окне.
 
           Описание.
 
           Позиционирование в некотором окне приводит к тому, что
 
      буфер, связанный с этим окном, становится текущим буфером.
 
           Позиционирование в буфере, в диапазоне или маркере  не
 
      всегда приводит к перемещению позиции курсора. TPU не изме-
 
      няет позицию курсора, если он расположен в окне,  связанном
 
      с заданным или  подразумеваемым  буфером.  Если  необходимо
 
      видеть процесс редактирования, то  необходимо  позициониро-
 
      ваться в окне, а не в буфере.
 
           Попытка позиционироваться в  неотображаемом  в  данный
 
      момент окне приводит к выдаче предупреждающего сообщения.
 
           Возвращаемые состояния:
 
      TPU$_WINDNOTMAPPED WARNING - окно не отображено на экран;
 
      TPU$_WINDNOTVIS WARNING - окно  полностью  закрыто  другими
 
      окнами.
 
 
           Примеры:
 
           1. POSITION (MESSAGE_WINDOW) ;
 
      Команда перемещает текущую позицию символа в окно для сооб-
 
      щений. Позиция в этом окне будет  будет  совпадать  с  той,
 


                                - 216 -
 
                          00152-01 34 04-1
 
 
      которая была последней в предыдущий раз.
 
           2. USER_MARK := MARK (NONE) ;
 
           POSITION (USER_MARK) ;
 
      Оператор делает текущей позицией символа  позицию  маркера,
 
      который связан с переменной USER_MARK.
 
           3. Процедура  USER_CHANGE_WINDOWS  перемещает  текущую
 
      позицию символа между двумя окнами (здесь неявно изменяется
 
      текущий буфер):
 
      PROCEDURE USER_CHANGE_WINDOWS
 
         IF CURRENT_WINDOW = MAIN_WINDOW
 
            THEN POSITION (EXTRA_WINDOW);
 
            ELSE POSITIоN (MAIN_WINDOW);
 
         ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.63. Процедура QUIT
 
 
           Процедура QUIT осуществляет  выход  из  редактора  без
 
      записи в файл.
 
           Формат:
 
      QUIT
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Если    буфера,    для    которых    не    установлено
 
      SET(NO_WRITE,...) были модифицированы, TPU сообщает об этом
 
      и запрашивает подтверждение выхода из редактора. Необходимо
 
      ввести Y (ES) для выхода без записи модифицированных  буфе-
 
      ров; ввести N (0) для сохранения модификаций и  возврата  в
 
      редактор.
 


                                - 217 -
 
                          00152-01 34 04-1
 
 
           Специальное использование  процедуры  QUIT  состоит  в
 
      том, что она применяется в конце секционного файла,  компи-
 
      лируемого в первый раз.
 
           Возвращаемое состояние:
 
      TPU$_CANCELQUIT WARNING - 'NO' ответ был получен  на  подс-
 
      казку '...CONтINUE QUITTING'.
 
           Примеры:
 
           1. QUIT
 
      Команда осуществляет выход из редактора. Если есть  модифи-
 
      цированные буфера, то будет выдана следующая подсказка:
 
      BUFFER MODIFICаTIONS WILL NOT BE SAVED,  CONTINUE  QUITTING
 
      (Y OR N)?;
 
      Необходимо ввести Y (ES) для выхода без сохранения  модифи-
 
      каций; ввести N (0) для возврата в редактор.
 
           2. Пример содержит операторы, подобные расположенным в
 
      последней части файла EDTSECINI. TPU  для  эмулятора  малой
 
      клавиатуры EDT. Оператор SAVE  создает  секционный  файл  в
 
      двоичном формате. Оператор QUIT приводит к  выходу  из  TPU
 
      без каких-то изменений в файле EDTSECINI.TPU:
 
      POSITION (MAIN_WINDOW);
 
      TPU$LOCAL_INIT;
 
      EDT$DEFINE_KEYS;  !BIND KEYS
 
      SAVE ('SYS$LIBRARY:EDTSECINI.GBL');
 
      QUIT;
 
           3. Процедура USER_QUIT отключает отображение успешного
 
      сообщения "EDITOR SUCCESSFULLY QUITTеD  ",  при  выходе  из
 
      интерфейса редактирования  с  помощью  команды  (процедуры)
 
      QUIT.
 
      PROCEDURE USER_QUIT
 
      SET (SUCCESS, OFF);


                                - 218 -
 
                          00152-01 34 04-1
 
 
      QUIT;
 
      SET (SUCCES, ON);
 
      ENDPROCEDURE
 
 
 
           5.64. Процедура READ_CHAR
 
 
           Процедура READ_CHAR запоминает очередной  введенный  с
 
      клавиатуры символ в строковой переменной.
 
           Формат:
 
      Строка := READ_CHAR
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Символ,  прочитанный  READ_CHAR,  не  отображается  на
 
      экран; позиция курсора не меняется.
 
           Процедура       READ_CHAR       не        обрабатывает
 
      ESCAPE-последовательности. Если процедура языка TPU исполь-
 
      зует READ_CHAR  для  чтения  ESCAPE-последовательности,  то
 
      только  часть  этой  последовательности  будет   прочитана.
 
      Оставшаяся часть ESCAPE-последовательности будет интепрети-
 
      роваться как текстовые символы. Если управление возвратится
 
      к TPU или выполнится  процедура  READ_KEY  (READ_LINE),  TO
 
      результаты могут быть непредсказуемыми.
 
           Примеры:
 
           1. NEW_CHAR := READ_CHAR ;
 
      Оператор присваивания запоминает следующий введенный символ
 
      с клавиатуры в строке NEW_CHAR.
 
           2. Процедура USER_QUOTE вводит символ с  клавиатуры  в
 
      текущий   буфер.   Если    нажата    клавиша,    посылающая
 
      ESCAPE-последовательность, то она будет добавлена в  буфер,
 


                                - 219 -
 
                          00152-01 34 04-1
 
 
      как если бы она была нормальным текстом:
 
      PROCEDURE USER_QUOTE
 
      COPY_TEXT (READ_CHAR);
 
      ENDPROCEDURE
 
 
 
           5.65. Процедура READ_FILE
 
 
           Процедура READ_FILE читает файл и добавляет его содер-
 
      жимое перед текущей строкой в текущем буфере. Эта процедура
 
      может возвратить строку, содержащую спецификацию  прочитан-
 
      ного файла.
 
           Формат:
 
      [строка :=] READ_FILE (строка1)
 
           Параметры:
 
           Строка1 -  строка  в  кавычках,  или  имя  переменной,
 
      представляющей строковую константу, или  выражение,  дающее
 
      строку, которая представляет собой имя файла, который необ-
 
      ходимо прочитать и включить в текущий буфер.
 
           Описание.
 
           При выполнении процедуры READ_FILE  выводится  сообще-
 
      ние, указывающее количество прочитанных записей (строк).
 
           Возвращаемые состояния:
 
      TPU$_NOCURRENTBUF WARNING - нет позиционирования в буфере;
 
      TPU$_CONTROLC ERROR - выполнение прервано по CTRL/C;
 
      TPU$_NOCACHE ERROR - нет памяти под новый кэш.
 
           Примеры:
 
           1. READ_FILE ('LOGIN.COM') ;
 
      Оператор читает файл LOGIN.COM и добавляет его  к  текущему
 
      буферу.
 
           2. Процедура USER_TWO_WINDOWS создает второй  буфер  и
 


                                - 220 -
 
                          00152-01 34 04-1
 
 
      второе окно, отображаемое на экран.  Эта  процедура  выдает
 
      также подсказку пользователю о имени  файла  для  включения
 
      его в буфер и определяет для  редактора  комбинацию  клавиш
 
      SHIFT_KEY (РF1 по умолчанию) и клавиши, с  помощью  которой
 
      происходит переход во второе окно:
 
      PROCEDURE USER_TWO_WINDOWS
 
      W2 := CREATE_WINDOW (1,10,ON);
 
      B2 := CREATE_BUFFER ('BUF2');
 
      MAP (W2,B2);
 
      READ_FILE (READ_LINE ('ENTER FILE NAME FOR 2ND WINDOW:'));
 
      POSITION (BEGINNING_OF (B2));
 
      DEFINE_KEY ('POSITION (W2)', KEY_NAME ("W", SHIFT_KEY));
 
      ENDPROCEDURE
 
 
 
           5.66. Процедура READ_KEY
 
 
           Процедура ожидает нажатия некоторой  клавиши;  возвра-
 
      щает ключевое слово нажатой клавиши.
 
           Формат:
 
      Ключевое_слово := READ_KEY
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Для   ввода   ESCAPE-последовательности,    необходимо
 
      использовать процедуру READ_KEY, а не процедуру  READ_CHAR;
 
      READ_KEY необходимо использовать при вводе символов  управ-
 
      ления  и  любых  других  нетекстовых  символов.   Процедура
 
      READ_KEY обрабатывает клавишу SHIFT_KEY (РF1 по умолчанию).
 
      Клавиша, прочитанная READ_KEY, не  отображается  на  экране
 
      терминала.
 


                                - 221 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. MY_KEY := READ_KEY ;
 
      Оператор присваивания читает следующую введенную  (нажатую)
 
      клавишу и запоминает соответствующее ей  ключевое  слово  в
 
      переменной MY_KEY.
 
           2. Процедура USER_GET_SHIFTKEY устанавливает SHIFT_KEY
 
      как последнюю (т.е. текущую) клавишу,  считывает  следующую
 
      клавишу и возвращает ключевое  ее  имя.  TPU  не  сохраняет
 
      SHIFT_KEY  от  сеанса  к   сеансу;   встроенная   процедура
 
      DEFINE_KEY с переменной KEY_TO_SHIFT используется для  сох-
 
      ранения SHIFT_KEY для последующего сеанса:
 
      PROCEDURE USER_GET_SHIFTKEY
 
      !KEYWORD FOR KEY PRESSED ATTER SHIFT KEY
 
      LOCAL KEY_TO_SHIFT;
 
      SET (SHIFT_KEY, LAST_KEY);
 
      KEY_TO_SHIFT := KEY_NAME (READ_KEY, SHIFT_KEY);
 
      RETURN (KEY_TO_SHIFT);
 
      ENDPROCEDURE
 
 
 
           5.67. Процедура READ_LINE
 
 
           Процедура READ_LINE отображает текст,  определенный  в
 
      качестве подсказки о вводе, и читает информацию,  введенную
 
      в ответ на эту подсказку. Можно при желании указать  макси-
 
      мальное количество символов, которое можно считать.  Проце-
 
      дура READ_LINE возвращает строку с информацией, введенной в
 
      ответ на подсказку.
 
           Формат:
 
      Строка2 := READ_LINE [(строка1 [,целое])]
 


                                - 222 -
 
                          00152-01 34 04-1
 
 
           Параметры:
 
           Строка1 -  строка  в  кавычках,  или  имя  переменной,
 
      представляющей строковую константу, или  выражение,  дающее
 
      строку текста, используемого в качестве  запроса  на  ввод.
 
      Этот параметр является необязательным;
 
           Целое - целое значение, задающее число символов, кото-
 
      рые должны быть введены в ответ на подсказку.  Максимальное
 
      значение этого числа равно 132, оно  соответствует  размеру
 
      локального буфера, который устанавливается TPU. Этот  пара-
 
      метр является необязательным.
 
           Описание.
 
           По умолчанию,  текст  подсказки  выводится  в  область
 
      PROMPT_АREA на экране. Эта область устанавливается встроен-
 
      ной  процедурой   SET   (PROMPT_AREA,...).   Если   область
 
      PROMPT_AREA не определена, то текст подсказки будет выведен
 
      по текущему положению на устройстве SYS$OUTPUT (обычно  это
 
      терминал).
 
           Если READ_LINE заканчивается из-за того, что  исчерпан
 
      лимит символов, заданный вторым  параметром,  то  последний
 
      прочитанный символ становится последней клавишей.
 
           Если TPU вызвана с квалификатором  /NODISPLAY,  то  не
 
      используются  терминальные  функции  отображения  экрана  и
 
      определения клавиш. Встроенная процедура READ_LINE вызывает
 
      процедуру LIB$GET/INPUT для выдачи подсказки на SYS$INPUT и
 
      приема ответа пользователя. Чтение, выполняемое таким  спо-
 
      собом, не закончится, если превышено указанное вторым пара-
 
      метром ([целое]) число. Однако, строка строка2 будет содер-
 
      жать число символов,  заданное  этим  целым  параметром,  и
 
      LAST_KEY будет содержать значение последней клавиши.
 
           Исключениями являются: если чтение ограничено  CTRL/Z,


                                - 223 -
 
                          00152-01 34 04-1
 
 
      TO LAST_KEY будет иметь значение CTRL/Z; если чтение  огра-
 
      ничено клавишей возврата каретки до достижения ограничения,
 
      указанного целым числом, LAST_KEY содержит значение RETURN.
 
           Примеры:
 
           1. MY_PROMPT  :=   READ_LINE   ('введите   определение
 
      клавиши:',1) ;
 
      Оператор присваивания отображает текст "введите определение
 
      клавиши" в области; PROMPT_AREА и запоминает первый  символ
 
      ответа пользователя в переменной MY_PROMPT.
 
           2. Процедура USER_TEST_LASTKEY запрашивает  ввод  трех
 
      символов и запоминает их в переменной  MY_INPUT;  проверяет
 
      последний введенный символ:
 
      PROCEDURE USER_TEST_LASTKEY
 
      LOCAL MY_KEY, IK;
 
      MY_INPUT := READ_LINE ('ENTER 3 CHARACTERS:', 3);
 
      !Нажмите клавишы 'ABC'      
 
      MY_KEY := LAST_KEY;
 
      IF MY_KEY = KEY_NAME('C')
 
         THEN
 
            МЕSSAGе ("O KEY") ELSE MESSAGE ('ERROR') ENDIF;
 
      ENDPROCEDURE
 
           3. Процедура используется для ввода целых чисел в раз-
 
      личных командах. Эта процедура возвращает значение  истина,
 
      если подсказка выводилась или не была нужна; в другом  слу-
 
      чае возвращается ложь. Возвращаемое значение передается как
 
      выходной параметр.
 
      !
 
      !PARAMETERS:
 
      !
 
      !OLD_NUMBER OLD INTEGER VALUE - INPUT


                                - 224 -
 
                          00152-01 34 04-1
 
 
      !NEW_NUMBER NEW INTEGER VALUE - OUTPUT
 
      !PROMT_STRING TEXT OF PROMPT - INPUT
 
      !NO_VALUE_MESSAGE MESSAGE PRINTED IF USER HITS RETURN TO
 
      !GET OUT OF THE COMMAND - INPUT
 
      PROCEDURE USER_PROMPT_NUMBER (OLD_NUMBER, NEW_NUMBER,
 
                                    PROMPT_STRING, NO_VALUE_
 
                                    MESSAGE)
 
      !STRING READ AFTER PROMPT
 
      LOCAL READ_LINE_STRING;
 
      NEW_NUMBER := OLD_NUMBER;
 
      IF OLD_NUMBER < 0
 
         THEN
 
            READ_LINE_STRING := READ_LINE (PROMPT_STRING);
 
            EDIT (READ_LINE_STRING, TRIM);
 
            IF READ_LINE_STRING = "
 
               THEN
 
                  MESSAGE (NO_VALUE_MESSAGE);
 
                  NEW_NUMBER := 0;
 
                  RETURN (0);
 
               ELSE
 
                  TRANSLATE (READ_LINE_STRING, "1", "1");
 
                  NEW_NUMBER := INT (READ_LINE_STRING);
 
             IF (NEW_NUMBER = 0) AND (READ_LINE_STRING <> "0" ));
 
                     THEN
 
        MESSAGE (FAO ("DON'T UNDERSTAND !AS", READ_LINE_STRING));
 
                        RETURN (0);
 
                     ELSE
 
                        RETURN (1);
 
                  ENDIF;
 
             ENDIF;


                                - 225 -
 
                          00152-01 34 04-1
 
 
          ELSE
 
             RETURN (1);
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.68. Процедура REFRESH
 
 
           Процедура  REFRESH  заново  выводит  (обновляет)  весь
 
      экран. Она удаляет посторонние символы, попавшие  на  экран
 
      из-за сбоев в линии связи и располагает текст на  экране  в
 
      соответствии с последним состоянием контекста  редактирова-
 
      ния.
 
           Формат:
 
      REFRESH
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           REFRESH вызывает  перевывод  каждой  строки  в  каждом
 
      окне, отображенном на экран; область  подсказок  очищается.
 
      Эта процедура сразу изменяет содержимое экрана.  Даже  если
 
      REFRESH издается внутри  процедуры,  то  обновление  экрана
 
      произойдет немедленно; полного окончания работы  процедуры,
 
      запустившей REFRESH, не ожидается.
 
           TPU выдает  ESCAPE-последовательности  для  выполнения
 
      следующих действий:
 
           1) установки региона прокрутки;
 
           2) установки малой клавиатуры в прикладной режим;
 
           3) установки видеоатрибутов в известное состояние;
 
           4) очистки экрана DEC_CRT;
 
           5) переустановки наборов графических символов.
 


                                - 226 -
 
                          00152-01 34 04-1
 
 
           REFRESH  перевыводит  весь  экран;  процедура   UPDATE
 
      обновляет только одно окно.
 
           Примеры:
 
           1. REFRESH
 
      Команда заставляет диспетчер экрана перевывести весь экран,
 
      чтобы он отражал текущее внутреннее состояние редактора.
 
           Процедура  USER_REPAINT  удаляет   содержимое   буфера
 
      MESSAGE_BUFFER и затем заново выводит весь экран:
 
      PROCEDURE USER_REPAINT
 
         ERASE (MESSAGE_BUFFER);
 
         REFRESH;
 
      ENDPROCEDURE
 
 
 
           5.69. Процедура REMAIN
 
 
           Процедура REMAIN возвращает шаблон, который будет под-
 
      бирать строку, начинающуюся с текущей  позиции  символа  до
 
      конца текущей строки.
 
           Формат:
 
      Шаблон := REMAIN
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Возвращаемый шаблон не пересекает границы строк.
 
 
           Примеры:
 
           1. PAT1 := LINE_BEGIN '!' REMAIN ;
 
      Оператор присваивания запоминает в переменной PAT1  шаблон,
 
      который будет подбирать все строки, имеющие восклицательный
 
      знак в начале строки.
 
           2. Процедура USER_MOVE_SKIP_COMMENT перемещает к концу


                                - 227 -
 
                          00152-01 34 04-1
 
 
      буфера курсор и останавливает  его  на  первой  строке,  не
 
      имеющей комментария:
 
      PROCEDURE USER_MOVE_SKIP_COMMENTS
 
      ON_ERROR
 
      !Этот оператор заставляет остановить наше вертикальное
 
      !перемещение как только потерпит неудачу поиск комментария
 
      !в текущей строке
 
           RETURN
 
      ENDON_ERROR
 
      !Вставить в начало первой строки
 
      MOVE_HORIZONTAL(-CURRENT_OFFSET);
 
      !Символ комментария должен быть в начале строки
 
      COMMENT_PATTERN := ANCHOR & '1' & REMAIN;
 
      MOVE_VERTICAL (1);
 
      LOOP
 
         COMMENT_RANGE := SEARCH (COMMENT_PATTERN, FORWARD);
 
         MOVE_VERTICAL (1);
 
      ENDLOOP;
 
      ENDPROCEDURE
 
 
 
           5.70. Процедура SAVE
 
 
           Процедура SAVE записывает в двоичном виде определенные
 
      к настоящему моменту процедуры,  переменные  и  определения
 
      клавиш в указанный секционный файл.
 
           Формат:
 
      SAVE (строка)
 
           Параметры:
 
           Строка - строка в кавычках, или имя переменной, предс-
 
      тавляющей строковую константу, или выражение, дающее допус-
 


                                - 228 -
 
                          00152-01 34 04-1
 
 
      тимую спецификацию файла в  операционной  системе  МОС  ВП;
 
      необходимо обеспечить полную  спецификацию  файла,  включая
 
      имя устройства и каталог.
 
           Описание.
 
           Процедура SAVE используется  для  создания  секционных
 
      файлов в языке TPU  и  добавления  в  них  информации.  При
 
      добавлении в существующий секционный файл  создается  новый
 
      файл, содержащий все элементы старого секционного  файла  и
 
      новые элементы, полученные во время текущего сеанса  редак-
 
      тирования. Секционные файлы позволяют быстрее включиться  в
 
      работу, т.к. содержат следующие элементы в двоичном виде:
 
           1)       все        откомпилированные        операторы
 
      PROCEDURE...ENDPROCEDURE;
 
           2) все переменные, которые были  созданы  (сохраняются
 
      только имена переменных, а не их содержимое);
 
           3) все определения клавиш, которые связывают оператор,
 
      процедуру, программу  или  обучающую  последовательность  с
 
      некоторой клавишей (также записываются комментарии,  добав-
 
      ленные к определениям клавиш).
 
           Использование встроенной процедуры SAVE во время сеан-
 
      са редактирования для  добавки  элементов  к  существующему
 
      секционному файлу не приводит к сохранению элементов, уста-
 
      новленных интерактивно с помощью процедуры  SET  (например,
 
      отступы для буферов, клавиша регистра для редактора, отлич-
 
      ная от PF1).
 
           Необходимо использовать полную  спецификацию  файла  в
 
      качестве строкового параметра для  SAVE.  Если  не  указана
 
      полная спецификация, то  будет  использовано  устройство  и
 
      каталог, связанные  с  квалификатором  /SECTION.  Если  для
 
      вызова  TPU  явно   использовалось   /SECTION   =   полная_


                                - 229 -
 
                          00152-01 34 04-1
 
 
      спецификация_файла, указанное устройство  и  каталог  будут
 
      использованы. Если не была задана полная спецификация файла
 
      для /SECTION, или в явном виде не использовалась  /SECTION,
 
      TO будут  использованы  устройство  и  каталог,  отмеченные
 
      логическим именем TPUSECINI (по умолчанию  -  SYS$LIBRARY).
 
      Если при вызове в явном виде  используется  /NOSECTION,  TO
 
      будут использованы текущее устройство и каталог. По умолча-
 
      нию тип файла - GBL.
 
           Возвращаемое состояние:
 
      TPU$_SAVEERROR ERROR - секционный  файл  не  будет  создан,
 
      т.к. были ошибки в контексте.
 
           Пример.
 
      SAVE ('SYS$LOGIN:MYSECTION.GBL') ;
 
           Команда добавит все определения процедур,  определения
 
      клавиш и переменных, имеющие место во время сеанса редакти-
 
      рования, к секционному файлу, с которым была вызвана  прог-
 
      рамма    TPU.    Указанный    новый    секционный     файл,
 
      SYS$LOGIN:MYSECTION.GBL, будет содержать начальные элементы
 
      старого секционного файла в момент инициализации и элементы
 
      сеанса редактирования.
 
           Для вызова TPU с новым  секционным  файлом  необходимо
 
      ввести команду на уровне командного языка DCL:
 
      EDIT/TPU/SECTION=SYS$LOGIN:MYSECTION
 
 
 
           5.71. Процедура SCAN
 
 
           Процедура SCAN возвращает  шаблон,  который  подбирает
 
      самую длинную строку, не содержащую символов,  указанных  в
 
      строке, заданной параметром.
 


                                - 230 -
 
                          00152-01 34 04-1
 
 
           Формат:
 
      Шаблон := SCAN (строка)
 
           Параметры:
 
           Строка - строка в кавычках, или имя переменной, предс-
 
      тавляющей строковую константу, которая содержит запрещенные
 
      для подбора символы.
 
           Описание.
 
           Возвращаемый шаблон не будет пересекать границы  запи-
 
      сей (строк). Шаблон начинается с текущей позиции символа  и
 
      распространяется до конца текущей  строки  или  до  встречи
 
      одного из запрещенных символов.
 
           Примеры:
 
           1. PAT1 := SCAN('ABC') ;
 
      Оператор присваивания запоминает в переменной PAT1  шаблон,
 
      который будет подбирать самую длинную строку  символов,  не
 
      содержащую А,В и С.
 
           2. Процедура  USER_FIND_PARENS  идентифицирует  текст,
 
      заключенный в скобки, в пределах одной строки. Она  переме-
 
      щает текущую позицию символа в начало этого текста, если он
 
      найден:
 
      PROCEDURA USER_FIND_PARENS
 
         PAREN_TEXT := ANY ('(')&SCAN(')');
 
         FOUND_RANGE := SEARCH (PAREN_TEXT, FORWARD, NO_EXACT);
 
         IF FOUND_RANGE = 0
 
            THEN MESSAGE ('NO PARENTHESES FOUND');
 
            ELSE POSITION (FOUND_RANGE);
 
         ENDIF
 
      ENDPROCEDURE
 


                                - 231 -
 
                          00152-01 34 04-1
 
 
           5.72. Процедура SCANL
 
 
           Процедура SCANL возвращает шаблон,  который  подбирает
 
      самую длинную строку, не содержащую символов,  указанных  в
 
      строке, заданной  параметром.  Процедура  SCANL  пересекает
 
      границы записей (строк).
 
           Формат:
 
      Шаблон := SCANL (строка)
 
           Параметры:
 
           Строка - строка в кавычках, или имя переменной, предс-
 
      тавляющей строковую константу, которая содержит запрещенные
 
      для подбора символы.
 
           Описание.
 
           Процедура SCANL подобна процедуре SCAN; однако,  SCANL
 
      распространяет шаблон за конец строки. Шаблон  SCANL  начи-
 
      нается с текущей позиции символа и продолжается до тех пор,
 
      пока будет найден один из запрещенных символов,  или  будет
 
      достигнуто начало буфера (в направлении REVERSE), или будет
 
      достигнут конец буфера (в направлении FORWARD).
 
           Примеры:
 
           1. PAT1 := SCANL ('ABс');
 
      Оператор присваивания запоминает в PAT1 самую длинную стро-
 
      ку, начинающуюся с текущей позиции символа и не  содержащую
 
      А, В или С.
 
           2. Процедура USER_FIND_PARENS идентифицирует  текст  в
 
      кавычках, если он существует, и размещает  текущую  позицию
 
      символа на начало диапазона FOUND_RANGE:
 
      PROCEDURE USER_FIND_PARENS
 
         PAREN_TEXT  := ANY('(')&SCANL ('(');
 
         FOUND_RANGE  := SEARCH (PAREN_TEXT, FORWARD, NO_EXACT);
 


                                - 232 -
 
                          00152-01 34 04-1
 
 
         IF FOUND_RANGE = 0
 
            THEN MESSAGE ('NO PARENTHESES FOUND.');
 
            ELSE POSITION (FOUND_RANGE);
 
         ENDIF
 
      ENDPROCEDURE
 
 
 
           5.73. Процедура SCROLL
 
 
           Встроенная процедура SCROLL перемещает строки текста в
 
      буфере вверх или вниз на экране на указанное  число  строк.
 
      Курсор не перемещается и остается на той же  самой  относи-
 
      тельной позиции экрана. Новая  текущая  символьная  позиция
 
      будет отличаться от предыдущей символьной позиции  (которая
 
      была текущей до обращения к команде SCROLL).
 
           Формат:
 
      SCROLL (окно[,целое)
 
           Параметры:
 
           Окно - окно, связанное с буфером, текст которого необ-
 
      ходимо просмотреть (прокрутить);
 
           Целое - целое значение со знаком плюс или минус, кото-
 
      рое задает количество строк, на которое необходимо перемес-
 
      тить текст. Положительное значение приводит  к  перемещению
 
      вверх от нижней части экрана к верхней. Отрицательное  зна-
 
      чение задает перемещение текста в окне вниз от верхней час-
 
      ти экрана к нижней. Нулевое значение не приводит к  переме-
 
      щению. Параметр целое не является обязательным.
 
           Описание.
 
           Если опущен параметр целое, то текст будет перемещать-
 
      ся непрерывно до тех пор, пока не будет достигнута  граница
 
      буфера или нажата какая-либо клавиша. Если текущее  направ-
 


                                - 233 -
 
                          00152-01 34 04-1
 
 
      ление для буфера FORWARD, то текст будет  прокручиваться  к
 
      концу буфера. Если текущее направление для буфера  REVERSE,
 
      то текст будет прокручиваться к началу буфера. Нажатие кла-
 
      виши, с которой связана последовательность команд, приведет
 
      к выполнению этой последовательности после завершения прок-
 
      рутки текста.
 
           Прокручивать текст возможно  только  в  видимом  окне.
 
      Если окно в текущий момент невидимо  на  экране,  вырабаты-
 
      вается сообщение об ошибке.
 
           Процедура SCROLL начинает сразу прокручивать текст  на
 
      экране; не ожидается завершение внешней процедуры, если она
 
      есть, а сразу обрабатывается функция прокрутки.
 
           Процедура SCROLL не будет работать  в  следующих  слу-
 
      чаях:
 
           1) если сброшен флаг обновления экрана с помощью  зап-
 
      роса SET (SCREEN_UPDATE, OFF);
 
           2)  если  при  вызове  TPU  использован   квалификатор
 
      /NODISLPAY.
 
           3) если указанное окно не отображено на экране.
 
           После завершения прокрутки текущая символьная  позиция
 
      (запись и смещение) устанавливается так, чтобы соответство-
 
      вать позиции курсора (строка на экране и  колонка);  курсор
 
      может быть размещен справа от последнего  символа  в  новой
 
      текущей записи. В этом случае  любая  встроенная  процедура
 
      TPU, требующая смещения записи  (например,  CURRENT_OFFSET,
 
      MOVE_HORIZONTAL, MOVE_VERTICAL, MARK, т.д.) будет дополнять
 
      запись до позиции курсора пробелами.
 
           Если используемый экран не имеет аппаратной  поддержки
 
      перемещения регионов, то окно перевыводится заново для каж-
 
      дого требуемого смещения.  Обращение  SCROLL  (MY_WINDOW,3)


                                - 234 -
 
                          00152-01 34 04-1
 
 
      перевыводит окно три раза.
 
           Возвращаемые состояния:
 
      TPU$_WINDNOTMAPPED WARNING - попытка прокрутки неотображае-
 
      мого окна;
 
      TPU$_CONTROLC ERROR - нажата <CTRL/C> для остановки переме-
 
      щения текста.
 
           Примеры:
 
           1. SCROLL(MAIN_WINDOW, +10) ;
 
      Команда перемещает текст буфера,  отображаемого  в  главное
 
      окно, на 10 строк вверх.
 
           2. SCROLL (MY_WINDOW) ;
 
      Команда прокручивает текст  буфера,  отображаемого  в  окно
 
      MY_WINDOW, в установленном для данного  буфера  направлении
 
      до достижении границ буфера.
 
           3. Процедура USER_SCROLL_BUFFER  прокручивает  главный
 
      буфер до тех пор, пока пользователь  не  нажмет  какую-либо
 
      клавишу:
 
      PROCEDURE USER_SCROLL_BUFFER
 
      MESSAGE ("PRESS ANY KEY TO STOP SCROLLING...");
 
      SCROLL (MAIN_WINDOW);
 
      DUМMY_KEY := READ_KEY
 
      ENDPROCEDURE
 
 
 
           5.74. Процедура SEARCH
 
 
           Встроенная процедура SEARCH ищет определенное  сочета-
 
      ние символов и возвращает диапазон, который содержит подоб-
 
      ранные символы в текущем буфере.
 


                                - 235 -
 
                          00152-01 34 04-1
 
 
           Формат:
 
      Диапазон  :=  SEARCH(строка  или  шаблон,  ключевое_словO-1
 
      [,ключевое_слово-2])
 
           Параметры:
 
           Строка - строка, которую необходимо подобрать;
 
           Шаблон - шаблон, который неоходимо подобрать;
 
           Ключевое_слово_1 - одно из следующих ключевых слов:
 
           1) FORWARD - задает поиск в направлении FORWARD  (впе-
 
      ред);
 
           2)  REVERSE  -  задает  поиск  в  напрAвлении  REVERSE
 
      (назад);
 
           Ключевое_слово_2 - одно  из  следующих  необязательных
 
      ключевых слов (по умолчанию принимается NO_EXACT):
 
           1) EXACT - указывает,  что  при  поиске  символов  они
 
      должны быть точно в том же регистре  (верхний,  нижний  или
 
      смешанный регистр), что и символы, указанные в строке или в
 
      шаблоне, который использован в качестве первого параметра;
 
           2) NO_EXACT - указывает, что при поиске  символов  они
 
      должны быть не обязательно в том точно регистре, что и сим-
 
      волы, указанные в строке или шаблоне, который использован в
 
      качестве первого параметра.
 
           Описание.
 
           Успешный поиск вызывает возврат в качестве  результата
 
      диапазона, который содержит символы текущего буфера, совпа-
 
      дающие с символами, указанными в строке или  шаблоне.  Если
 
      поиск неудачен, то возвращается 0 и выдается  сообщение  об
 
      ошибке.
 
           Если необходимо переместить текущую позицию символа  в
 
      начало диапазона, который выдан процедурой SEARCH, то нужно
 
      использовать встроенную процедуру POSITION для  перемещения


                                - 236 -
 
                          00152-01 34 04-1
 
 
      курсора.
 
           Для поиска  сложных  символьных  сочетаний  необходимо
 
      использовать шаблон, а не строку.
 
           По умолчанию процедура SEARCH использует прямой  режим
 
      поиска.
 
           Возвращаемое состояние:
 
      TPU$STRNOTFOUND WARNING - неудачный поиск строки или шабло-
 
      на.
 
           Примеры:
 
           1. USER_RANGE :=  SEARCH  ('отражение  MOНET',FORWARD,
 
      NO_EXACT);
 
      в буфере выполняется поиск строки "отражение монет".
 
           2. Процедура USER_FIND_CHAR ищет  слово  "CHAPTER",  в
 
      начале строки. Если она находит его, то происходит позицио-
 
      нирование в начало этой строки. Если не находит, соответст-
 
      вующее сообщение будет записано в буфер сообщений:
 
 
      PROCEDURE USER_FIND_CHAP
 
         CHAP :=LINE_BEGIN & 'CHAPTER';
 
         FOUND_RANGE  := SEARCH (CHAP, FORWARD, NO_EXACT);
 
         IF FOUND_RANGE = 0
 
            THEN MESSAGE ('CHAPTER NOT FOUND');
 
            ELSE POSITION (FOUND_RANGE);
 
         ENDIF
 
      ENDPROCEDURE
 


                                - 237 -
 
                          00152-01 34 04-1
 
 
           5.75. Процедура SELECT
 
 
           Процедура SELECT возвращает маркер для текущей позиции
 
      символа в текущем буфере. Необходимо указать, как этот мар-
 
      кер должен быть отображен  на  экране  (без  видеоэффектов,
 
      реверсивно, выделено, миганием или подчеркиванием).
 
           Маркер, возвращаемый процедурой SELECT, задает  первую
 
      символьную позицию в  выбранном  диапазоне.  Видеоатрибуты,
 
      указанные для этого маркера, будут применены для всех  сим-
 
      волов в выбранном диапазоне. Информация о выбранном  диапа-
 
      зоне   приведена   в    описании    встроенной    процедуры
 
      SELECT_RANGE.
 
           Формат:
 
      Маркер := SELECT (ключевое_слово)
 
           Параметры:
 
           Ключевое_слово - указывает способ отображения маркера,
 
      возвращаемого процедурой, на экране.  Необходимо  использо-
 
      вать одно из следующих ключевых слов:
 
           1) NONE - для маркера не применяются видеоатрибуты;
 
           2) BOLD - маркер должен быть выделен;
 
           3) BLINK - маркер отображается с мерцанием;
 
           4) REVERSE - маркер должен быть  отображен  реверсивно
 
      (негативно);
 
           5) UNDERLINE - маркер должен быть подчеркнут.
 
           Описание.
 
           Процедура SELECT возвращает выбранный маркер, устанав-
 
      ливающий  начало  выбранного  диапазона.  Выбранный  маркер
 
      позиционируется на текущей символьной  позиции.  (выбранный
 
      маркер  в  действительности  расположен  между  символьными
 
      позициями, а не на символьной позиции). Выбранный  диапазон
 


                                - 238 -
 
                          00152-01 34 04-1
 
 
      включает все символы между  выбранным  маркером  и  текущей
 
      позицией.
 
           Только один выбранный маркер на буфер может быть акти-
 
      вен в любое время. Если буфер  связан  с  более  чем  одним
 
      видимым окном, то выбранный диапазон будет отображен только
 
      в одном окне (в текущем или в самом последнем).
 
           Если буфер, в котором выбирается текст, связан с теку-
 
      щим окном, перемещение с выбранного маркера на другую пози-
 
      цию символа в том же буфере приводит к включению символов в
 
      выбранный диапазон;  видеоатрибуты,  указанные  при  выборе
 
      маркера, будут применены ко всем символам  диапазона.  Сим-
 
      вол, на котором размещается курсор, в диапазон не входит.
 
           Если удаляется текущий символ, то маркер  перемещается
 
      на ближайшую символьную позицию, которая определяется  сле-
 
      дующим способом:
 
           1) если есть в той же строке символьная позиция  спра-
 
      ва, то маркер, перемещается на эту позицию, даже если она в
 
      конце строки;
 
           2) если удаляется строка, в которой  локализован  мар-
 
      кер, то маркер перемещается  на  первую  позицию  следующей
 
      строки.
 
           Если при позицировании на выбранном маркере выполняет-
 
      ся вставка текста, то маркер перемещается на первый  символ
 
      введенного текста. Можно переместиться на одну колонку пос-
 
      ле последнего символа в строке  (если  разрешено  свободное
 
      перемещение курсора, то можно  переместиться  на  несколько
 
      символов за последний символ в строке). Однако,  если  выб-
 
      ранный маркер установлен за последний символ в  строке,  то
 
      для маркера не будут применяться видеоатрибуты.
 


                                - 239 -
 
                          00152-01 34 04-1
 
 
           Возвращаемое состояние:
 
      TPU$_ONESELECT WARNING - выбор уже активизирован.
 
           Примеры:
 
           1. SELECT_MARK := SELECT(NONE) ;
 
      Оператор присваивания размещает маркер на  текущей  позиции
 
      символа. По ключевому слову NONE для  выбранного  диапазона
 
      не применяются видеоэффекты;  выбранный  диапазон  содержит
 
      маркер в своем начале.
 
           2. SELECT_MARK_UNDER := SELECT (UNDERLINE) ;
 
      Оператор присваивания размещает маркер на текущей  символь-
 
      ной позиции. Все символы, включенные в выбранный  диапазон,
 
      будут подчеркнуты.
 
           3. Процедура USER_START_SELECT создает выделенный мар-
 
      кер, который используется как  начало  выбранного  региона.
 
      После перемещения курсора выбранные символы будут выделены.
 
      Для того, чтобы выключить выбор символов, необходимо  уста-
 
      новить в ноль переменную USER_V_BEGINNING_OF_SELECT:
 
      !+
 
      !BOLD SELECT TEXT
 
      !-
 
      PROCEDURE USER_START_SELECT
 
         USER_V_BEGINNING_OF_SELECT := SELECT(BOLD);
 
      ENDPROCEDURE
 
 
 
           5.76. Процедура SELECT_RANGE
 
 
           Процедура SELECT_RANGE возвращает диапазон, содержащий
 
      все  символы  между  маркером,   установленным   процедурой
 
      SELECT, и текущей позицией символа. Процедура  SELECT_RANGE
 
      не включает последний символ в выбранный диапазон.
 


                                - 240 -
 
                          00152-01 34 04-1
 
 
           Формат:
 
      Диапазон:= SELECT_RANGE
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Если выбран текст в направлении FORWARD  (вперед),  то
 
      диапазон содержит маркированный символ и все символы вплоть
 
      до текущего символа, но его не включает. Если выбран  текст
 
      в направлении REVERSE (назад) от маркера, то диапазон вклю-
 
      чает текущий символ и все символы вплоть до  маркированного
 
      символа, но самого его не включает.
 
           Процедура SELECT_RANGE используется в сочетании с про-
 
      цедурой SELECT и позволяет  отмечать  части  текста,  чтобы
 
      рассматривать их как единое целое.
 
           Процедура выбора части текста состоит в следующем:
 
           1) используется встроенная процедура SELECT для разме-
 
      щения маркера в начало выбираемого текста, например, М1  :=
 
      SELECT (NONE);
 
           2) отмечаются символы, которые необходимо  включить  в
 
      выбранный регион, перемещением курсора по символам;
 
           3) когда весь текст выбран, создается диапазон,  кото-
 
      рый содержит выбранный текст, например R1 := SELECT_RANGE;
 
           4) останавливается выбор символов установкой  маркера,
 
      который помечает начало диапазона, в ноль (M1 := 0).
 
           Возвращаемые состояния:
 
      TPU$_NOSELECT WARNING - процесс выбора не активен;
 
      TPU$_SELRANGEZERO WARNING - диапазон не содержит  выбранных
 
      символов.
 


                                - 241 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. SELECT_1 := SELECT_RANGE;
 
      Оператор присваивания разместит  диапазон  самых  последних
 
      выбранных символов в переменной SELECT_1.
 
           2. Процедура  USER_SELECT  демонстрирует  многократное
 
      использование процедуры SELECT_RANGE в одной процедуре:
 
      PROCEDURE USER_SELECT
 
      !Начинается выбор региона
 
         USER_SELECT_POSITION := SELECT(REVERSE);
 
         MESSAGE ("SELECTION STARTED.");
 
         MOVE_VERTICAL (5);SR1 := SELECT_RANGE;
 
      !Перемещаемся на 5 строк и создаем выбранный регион
 
         MOVE_VERTICAL (5);
 
         SR2:=SELECT_RANGE;
 
      !Останавливает выбор, устанавливая выбранный маркер в ноль
 
      USER_ SELECT_POSITION := 0;
 
      ENDPROCEDURE
 
 
 
           5.77. Процедура SEND
 
 
           Процедура SEND посылает данные в подпроцесс.
 
           Формат:
 
      SEND (буфер или диапазон или строка, процесс)
 
           Параметры:
 
           Буфер - буфер, содержимое которого необходимо  послать
 
      в подпроцесс;
 
           Диапазон - диапазон,  содержимое  которого  необходимо
 
      послать в подпроцесс;
 
           Строка - строка, которую необходимо послать в  подпро-
 
      цесс;
 


                                - 242 -
 
                          00152-01 34 04-1
 
 
           Процесс - процесс, которому необходимо послать данные.
 
           Описание.
 
           Весь вывод из подпроцесса должен быть записан в буфер,
 
      связанный с подпроцессом на момент его создания. Работа  по
 
      редактированию останавливается до тех пор, пока процесс  не
 
      ответит на послание.
 
           Если буфер или диапазон содержат  информацию,  которая
 
      должна быть передана в подпроцесс, то она будет пересылать-
 
      ся построчно отдельными записями.
 
           Возвращаемые состояния:
 
      TPU$_NOPROCESS WARNING - процесс, которому необходимо  пос-
 
      лать информацию, не существует;
 
      TPU$_SENDFAIL WARNING -  нет  возможности  послать  ввод  в
 
      подпроцесс;
 
      TPU$_NOSENDBUF WARNING - вводной буфер  является  в  то  же
 
      время и выводным буфером;
 
      TPU_CONTROLS ERROR - выполнение посланной команды прекраще-
 
      но по нажатию CTRL/C.
 
           Примеры:
 
           1. SEND ('DIRECTORY', USER_PROCESS);
 
      Команда SEND посылает команду DIRECTORY DCL в подпроцесс  с
 
      именем USER_PROCESS; подпроцесс должен быть создан ранее  с
 
      помощью встроенной процедуры  CREATE_PROCESS,  чтобы  вывод
 
      можно было запомнить в связанном с ним буфере.
 
           2. Процедура MAIL_SUBP использует встроенную процедуру
 
      SEND для пересылки команды (вводится процедурой  READ_LINE)
 
      в подпроцесс, в котором работает  утилита  MAIL  командного
 
      языка DCL:
 
      PROCEDURE MAIL_SUBP
 
      !Создать буфер и окно для работы подпроцесса


                                - 243 -
 
                          00152-01 34 04-1
 
 
       V_MAIL_BUFFER:=CREATE_BUFFER ("MAIL_BUFFER");
 
       V_MAIL_WINDOW:=CREATE_WINDOW (1,22,ON);
 
      !Отобразить окно на экран
 
       UNMAР (MAIN_WINDOW);
 
       MAP (V_MAIL_WINDOW, V_MAIL_BUFFER);
 
      !Создать подпроцесс и сделать "MAIL" первой командой
 
       P1:=CREATE_PROCESS (V_MAIL_BUFFER,"MAIL");
 
      !Позиционируем в подпроцесс и вводим (READ_LINE)
 
      !следующую команду
 
       POSITION (V_MAIL_WINDOW);
 
       V1:=READ_LINE ("MAIL_SUBP>", 20);
 
       SEND (U1, P1);
 
      ENDPROCEDURE
 
 
 
           5.78. Процедура SEND_EOF
 
 
           Процедура  SEND_EOF  использует  возможность   MAILBOX
 
      DRIVER для посылки сообщения о конце файла (IO$_WRITEOF).
 
           Формат:
 
      SEND_EOF (процесс)
 
           Параметры:
 
           Процесс - процесс, которому необходимо послать сообще-
 
      ние о конце файла.
 
           Описание.
 
           Сообщение о конце файла вызывает завершение чтения  из
 
      подпроцесса со статусом SS$_ENDOFFILE.
 
           Возвращаемые состояния:
 
      TPU$_SENDFAIL WARNING -  нет  возможности  послать  ввод  в
 
      подпроцесс;
 
      TPU$_NOPROCESS WARNING - нет подпроцесса, которому  послано
 


                                - 244 -
 
                          00152-01 34 04-1
 
 
      сообщение.
 
           Пример.
 
      SEND_EOF (SUB_PROC1);
 
      Команда посылает сообщение о конце  файла  в  подпроцесс  с
 
      именем SUB_PROC1.
 
 
 
           5.79. Процедура SET
 
 
           Процедура SET позволяет установить или  изменить  тре-
 
      буемые характеристики сеанса работы с  утилитой.  Процедура
 
      SET требует задания в качестве первого параметра  ключевого
 
      слова, указывающего устанавливаемую характеристику: устано-
 
      вить режим ввода  текста,  задать  текст  для  отображения,
 
      задать направление в буфере, состояние буфера и т.д.
 
           Формат:
 
      SET (ключевоE_слово, параметр [,...])
 
           Параметры:
 
           Ключевое_слово - одно из следующих ключевых слов, ука-
 
      зывающих необходимую характеристику:
 
           1) AUTO_REPEAT   - повторение кода клавиши;
 
           2) BELL          - управление звуковым сигналом;
 
           3) DEBUG         - использование режима отладки;
 
           4) EOB_TEXT      - определение текста "конец буфера";
 
           5) FACILITY_NAME - задание имени средства;
 
           6) FORWARD       - выбор направления "вперед";
 
           7) INFORMATIONAL - задание инфомационных сообщений;
 
           8) INSERT        - выбор режима "вставка текста";
 
           9) JOURNALING    - частота вывода в журнальный файл;
 
           10) MARGINS      - установка границ буфера;
 
           11) MAX_LINES    - установка предельного числа строк
 


                                - 245 -
 
                          00152-01 34 04-1
 
 
      буфера;
 
           12) MESSAGE_FLAGS- установка флагов сообщений;
 
           13) NO_WRITE     - запрет записи буфера в файл;
 
           14) OUTPUT_FILE  - определение файла для записи
 
      буфера;
 
           15) OVERSTRIKE   - выбор режима без вставки;
 
           16) PAD          - дополнение строк пробелами справа;
 
           17) PERMANENT    - определение неудаляемого буфера;
 
           18) PROMT_AREA   - определение области подсказки;
 
           19) REVERSE      - выбор направления "обратное";
 
           20) SCREEN_UPDATE- выбор режима обновления экрана;
 
           21) SCROLLING    - управление прокруткой информации;
 
           22) SHIFт_KEY    - назначение клавиши "регистр";
 
           23) STATUS_LINE  - определение строки состояния;
 
           24) SUCCESS      - успешное завершение;
 
           25) SYSTEM       - системный буфер;
 
           26) TAB_STOPS    - установка табуляций;
 
           27) TEXT         - режим отображения текста;
 
           28) TIMER        - определение сообщения по времени;
 
           29) VIDEO        - установка видеоатрибутов;
 
           30) WIDTH        - определение ширины окна;
 
           Параметр [,...] - число параметров, которые следуют за
 
      первым параметром; изменяется в зависимости от используемо-
 
      го ключевого слова.
 


                                - 246 -
 
                          00152-01 34 04-1
 
 
           5.79.1. Процедура SET (AUTO_REPEAT,...)
 
 
           Формат:
 
      SET (AUTO_REPEAT, ключевое_слово).
 
           Параметры:
 
           AUTO_REPEAT -  ключевое  слово,  определяющее  процесс
 
      повторения кода, связанного с нажатой клавишей.
 
           Ключевое слово - одно из следующих ключевых слов:
 
           1) ON - символ, заданный нажатием клавиши, генерирует-
 
      ся до тех пор, пока клавиша нажата;
 
           2) OFF - задает отдельное нажатие на клавишу для  каж-
 
      дого генерируемого символа.
 
           Описание.
 
           Утилита посылает ESCAPE-последовательность на терминал
 
      для установки или сброса AUTO_REPEAT.
 
           Характеристики AUTO_REPEAT (авто-повтор) влияют на все
 
      клавиши на клавиатурах терминалов типа VT100,  за  исключе-
 
      нием:
 
           1) SET_UP;
 
           2) ESC;
 
           3) NO SCROLL;
 
           4) TAB;
 
           5) RETURN;
 
           6) CTRL/*, где * - любая клавиша.
 
           Характеристика AUTO_REPEAT (авто-повтор) влияет на все
 
      клавиши на клавиатурах терминалов типа VT200,  за  исключе-
 
      нием:
 
           1) F1, F2, F3, F5;
 
           2) RETURN.
 


                                - 247 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1.SET (AUTO_REPEAT, OFF);
 
      Оператор выключает автоповтор.
 
           2. Процедура USER_SLOW_DOWN_ARROW показывает, как вык-
 
      лючить и включить авто-повтор  для  замедления  перемещения
 
      курсора:
 
      PROCEDURE USER_SLOW_DOWN_ARROW
 
       SET (AUTO_REPEAT, OFF);
 
       MOVE_VERTICAL (1);
 
       SET (AUTO_REPEAT, ON);
 
      ENDPROCEDURE
 
      PROCEDURE USER_SLOW_UP_ARROW
 
       SER (AUTO_REPEAT,OFF);
 
       MOVE_VERTICAL (-1);
 
       SET (AUTO_REPEAT, ON);
 
      ENDPROCEDURE
 
 
 
           5.79.2. Процедура SET (BELL,...)
 
 
           Формат:
 
      SET (BELL, ключевое_слово_1, ключевое_слово_2)
 
           Параметры:
 
           BELL -управление подачей звукового сигнала терминалом;
 
           Ключевое_слово_1 - одно из следующих ключевых слов:
 
           1) ALL -указывает, что ключевое_слово_2 (ON  или  OFF)
 
      применяется ко всем сообщениям;
 
           2) BROADCAST - указывает, что ключевое_слово_2  приме-
 
      няется только для BROADCAST (широковещательных) сообщений;
 
           Ключевое_слово_2 - одно из двух ключевых слов:
 
           1) ON - приводит к тому, что терминал  будет  подавать
 


                                - 248 -
 
                          00152-01 34 04-1
 
 
      звуковой сигнал при записи в окно сообщений;
 
           2) OFF - выключает подачу сигнала терминалом.
 
           Описание.
 
           Утилита приводит к выдаче звукового сигнала при записи
 
      сообщения в окно сообщений независимо от наличия  в  тексте
 
      сообщения кода "звуковой сигнал" (BELL).  Символ  "звуковой
 
      сигнал" в тексте сообщения не интерпретируется; он  отобра-
 
      жается как неотображаемый символ управления.
 
           Команда SET TERMINAL/NOBROADCAST DCL запрещает посылку
 
      общих сообщений на терминал; команда SET BROADCAST DCL поз-
 
      воляет разрешать  или  запрещать  определенные  типы  общих
 
      сообщений. По умолчанию подача звукового  сигнала  отменена
 
      (OFF).
 
           Примеры:
 
           1. SET (BELL, BROADCAST, ON)
 
      Оператор разрешает подачу сигнала, когда  широковещательное
 
      (общее) сообщение записывается в окно сообщений.
 
           2. Процедура   USER_RING_BELL   использует   процедуру
 
      SET(BELL,ALL,ON) для разрешения звукового сигнала при полу-
 
      чении сообщения, указанного  вторым  параметром;  SET(BELL,
 
      BROADCAST, ON) используется для разрешения звукового сигна-
 
      ла при передаче широковещательных сообщений:
 
 
 
      PROCEDURE USER_RING_BELL (MSG.STRING)
 
       SET (ВELL,ALL,ON);
 
       MESSAGE (MSG_STRING);
 
       SET (BELL,ALL,OFF);
 
       SET (BELL, BROADCAST, ON);
 
      ENDPROCEDURE
 


                                - 249 -
 
                          00152-01 34 04-1
 
 
           5.79.3. Процедура SET (DEBUG,...)
 
 
           Формат:
 
      SET (DEBUG, ключ_1, [,строка или ключ_2]
 
           Параметры:
 
           DEBUG - указывает на подключение программы-отладчика;
 
           Ключ_1 - одно из трех ключевых слов:
 
           1) ON - вызывает отладчик  пошаговой  отладки.  Всякий
 
      раз, когда изменяется номер строки в программе  языка  TPU,
 
      вызывается отладчик;
 
           2) OFF - запрещает пошаговое выполнение для отладки;
 
           3) PROGRAM -указывает программу, которая  должна  быть
 
      использована для локализации ошибок;
 
           Строка - имя процедуры или программы. Если имя  проце-
 
      дуры следует за ключевым словом ON, то отладчик  вызывается
 
      при каждом обращении к этой процедуре. Если  имя  процедуры
 
      следует за ключевым словом OFF, то отладчик  удаляет  точку
 
      останова, которая была установлена в этой  процедуре.  Если
 
      программа следует за ключевым словом PROGRAM, то она должна
 
      быть использована как пользовательский отладчик;
 
           Ключ_2 - это ключевое слово может быть указано, если в
 
      качестве ключ_1 использовано OFF. Оператор SET (DEBUG, OFF,
 
      ALL) удаляет все точки останова.
 
           Возвращаемые состояния:
 
      TPU$_NOCURRENTBUF WARNING - нет текущего буфера;
 
      TPU$_NONAMES WARNING - нет подходящего имени.
 
           Примеры:
 
           1. SET (DEBUG, ON, "USER_REMOVE");
 
      Оператор приводит к тому, что отладчик активизируется  вся-
 
      кий раз, когда вызывается процедура USER_REMOVE.
 


                                - 250 -
 
                          00152-01 34 04-1
 
 
           2. SET (DEBUG, PROGRAM, "USER_DEBUGGER");
 
      Оператор  вызывает  пользовательскую  программу  с   именем
 
      USER_DEBUGGER.
 
 
 
           5.79.4. Процедура SET (EOB_TEXT,...)
 
 
           Формат:
 
      SET (EOB_TEXT, буфер, строка)
 
           Параметры:
 
           EOB_TEXT - определение текста, отображаемого  в  конце
 
      буфера; этот текст не становится частью файла, создаваемого
 
      при сохранении буфера;
 
           Буфер - буфер, содержащий текст, используемый для кон-
 
      ца буфера;
 
           Строка - сам текст, высвечиваемый для индикации  конца
 
      буфера. По умолчанию текст конца буфера - [EOB].
 
 
 
      Пример.
 
      SET (EOB_TEXT, MAIN_BUF, "[END OF MAIN EDIT BUF]");
 
           Оператор приводит к тому, что текст [END OF MAIN  EDIT
 
      BUF] будет  отображен  как  текст  конца  буфера  в  буфере
 
      MAIN_BUF.
 
 
 
           5.79.5. Процедура SET (FACILITY_NAME,...)
 
 
           Формат:
 
      SET (FACILITY_NAME, строка)
 
           Параметры:
 
           FACILITY_NAME - определение имени средства,  представ-
 
      ляющей первый элемент в любом сообщении, генерируемом  ути-
 
      литой;


                                - 251 -
 
                          00152-01 34 04-1
 
 
           STRING -строка,  указанная  как  имя  возможности  для
 
      сообщений. Максимальная длина этого имени равна  10  симво-
 
      лам.
 
           Возвращаемое состояние:
 
      TPU$FACTOOLONG WARNING -  специфицированное  имя  превысило
 
      максимальный размер.
 
           Пример.
 
      SET (FACILITY_NAME, "NEW_EDITOR");
 
           Оператор приводит к тому, что NEW_EDITOR будет исполь-
 
      зовано как имя возможности в сообщениях.
 
 
 
           5.79.6. Процедура SET (FORWARD,...)
 
 
           Формат:
 
      SET (FORWARD, буфер)
 
           Параметры:
 
           FORWARD - ключевое слово, определяющее  направление  в
 
      буфере; означает переход  по  направлению  к  концу  буфера
 
      (вперед);
 
           Буфер - буфер, в котором необходимо установить направ-
 
      ление.  По  умолчанию  в  буфере  установлено   направление
 
      FORWARD.
 
           Пример.
 
      SET (FORWARD, MY_BUFFER);
 
           Оператор вызывает установку направления к концу буфера
 
      MY_BUFFER.
 


                                - 252 -
 
                          00152-01 34 04-1
 
 
           5.79.7. Процедура SET (INFORMATIONAL,...)
 
 
           Формат:
 
      SET (INFORMATIONAL, ключевое_слово)
 
           Параметры:
 
           INFORMATIONAL - определяет способ вывода  информацион-
 
      ных сообщений утилиты;
 
           Ключевое_слово - одно из двух ключевых слов:
 
           1) ON - вызывает запись информационных сообщений;
 
           2) OFF - подавляет отображение информационных  сообще-
 
      ний.
 
           Описание.
 
           Если при вызове утилиты  указан  секционный  файл  (по
 
      умолчанию  или   с   помощью   квалификатора   /SECTION   =
 
      спецификация_файла), то  информационные  сообщения  отобра-
 
      жаться не будут. Разрешить запись информационных  сообщений
 
      можно с помощью процедуры SET (INFORMATIONAL, ON).
 
           Если  при  вызове  утилиты  использован   квалификатор
 
      /NOSECTION, то по умолчанию информационные сообщения  запи-
 
      сываются.
 
 
 
           5.79.8. Процедура SET (INSERT,...)
 
 
           Формат:
 
      SET (INSERT, буфер)
 
           Параметры:
 
           INSERT - ключевое слово,  определяющее  режим  вставки
 
      текста; символы, добавляемые к буферу, располагаются  перед
 
      текущей позицией символа;
 
           Буфер -  буфер,  для  которого  необходимо  установить
 
      режим ввода текста. По умолчанию, режим  вставки  текста  -


                                - 253 -
 
                          00152-01 34 04-1
 
 
      INSERT (вставка).
 
           Пример.
 
      SET (INSERT, MY_BUFFER);
 
           Оператор приводит к тому,  что  добавляемые  к  буферу
 
      символы вставляются перед текущей позицией курсора.
 
 
 
           5.79.9. Процедура SET (JOURNALING,...)
 
 
           Формат:
 
      SET (JOURNALING, целое)
 
           Параметры:
 
           JOURNALING - ключевое слово, указывающее на  доступ  к
 
      файлу протокола;
 
           Целое - целое число, указывающее частоту вывода  запи-
 
      сей в файл протокола. Значения этого  целого  числа  должны
 
      лежать в интервале от 1 до 10.
 
           Описание.
 
           В утилите определен буфер размером 500 байт,  предназ-
 
      наченный для протоколирования нажатых клавиш. Если протоко-
 
      лирование включено, то  при  заполнении  буфера  происходит
 
      запись его содержимого в файл протокола. Встроенная  проце-
 
      дура SET (JOURNALING) позволяет управлять  частотой  вывода
 
      записей в файл протокола.
 
           Значение целого, равное 1, вызывает запись  информации
 
      о приблизительно 10 нажатых клавишах. Значение 10  вызывает
 
      вывод записи о приблизительно 125 каждый раз нажатых клави-
 
      шах. Если вводится текст, а  не  процедуры,  привязанные  к
 
      клавишам, то число включаемых в запись клавиш будет больше;
 
      для значения 1 будет выводиться  запись  размером  в  30-35
 
      символов, для значения 10 будет выводиться запись приблизи-
 


                                - 254 -
 
                          00152-01 34 04-1
 
 
      тельно в 400 символов.
 
           Возвращаемые состояния:
 
      TPU$_MINVALUE WARNING - аргумент меньше минимально допусти-
 
      мого;
 
      TPU$_MAXVALUE WARNING - аргумент больше максимально  допус-
 
      тимого.
 
           Пример.
 
      SET (JOURNALING, 1);
 
           Оператор заставляет выводить информацию в файл  прото-
 
      кола с наибольшей допустимой частотой.
 
 
 
           5.79.10. Процедура SET (MARGINS,...)
 
 
           Формат:
 
      SET (MARGINS, буфер, целое1, целое2)
 
           Параметры:
 
           MARGINS - ключевое слово, определяющее границы  (левый
 
      и правый отступы) буфера;
 
           Буфер - буфер, границы которого устанавливаются;
 
           Целое1 - колонка,  по  которой  устанавливается  левый
 
      отступ;
 
           Целое2 - колонка, по  которой  устанавливается  правый
 
      отступ.
 
           Описание.
 
           Встроенная процедура SET (MARGINS) позволяет  изменить
 
      левый и правый отступы для любого буфера. Эти отступы полу-
 
      чают значения 1 (левый) и 80 (правый) при  создании  буфера
 
      встроенной процедурой CREATE_BUFFER.  Встроенная  процедура
 
      FILL использует эти отступы при заполнении буфера текстом.
 
           Процедура SET (MARGINS) управляет установкой  отступов
 


                                - 255 -
 
                          00152-01 34 04-1
 
 
      для буфера, если даже ширина терминала или окна установлены
 
      в другое значение.
 
           Значение левого отступа должно быть от 1  до  значения
 
      правого отступа. Значение правого отступа должно быть мень-
 
      ше, чем максимальный  размер  записи  в  буфере.  Процедура
 
      GET_INFO (буфер,"RECORD_SIZE") предназначена для  получения
 
      максимального размера записи буфера.
 
           Если необходимо  использовать  установленные  значения
 
      отступов для какого-то буфера в процедуре, написанной поль-
 
      зователем, то получить эти значения можно с помощью  проце-
 
      дуры   GET_INFO   (буфер,   "LEFT_MARGIN")    и    GET_INFO
 
      (буфер,"RIGHT_MARGIN").
 
           Возвращаемое состояние:
 
      TPU$BADMARGINS WARNING - левое  число  должно  быть  меньше
 
      правого, и оба должны быть больше нуля.
 
           Примеры:
 
           1. SET (MARGINS, MY_BUFFER, 1,132);
 
      оператор вызывает изменение отступов для буфера,  представ-
 
      ленного переменной MY_BUFFER. Левый отступ становится  рав-
 
      ным 1, а правый - 132.
 
           2. SET (MARGINS, CURRENT_BUFFER, 10, 70);
 
      Оператор изменяет отступы в текущем буфере так,  что  левый
 
      отступ становится равным 10, а правый 70.
 
 
 
           5.79.11. Процедура SET (MAX_LINES,...)
 
 
           Формат:
 
      SET (MAX_LINES, буфер, целое)
 


                                - 256 -
 
                          00152-01 34 04-1
 
 
           Параметры:
 
           MAX_LINES - ключевое слово, определяющее  максимальное
 
      число строк, которое может иметь буфер;
 
           Буфер - буфер, для которого устанавливается максималь-
 
      но домустимое число строк;
 
           Целое - максимальное число строк в буфере.
 
           Описание.
 
           Превышение максимального числа строк в буфере приводит
 
      к удалению строк от начала буфера,  обеспечивая  место  для
 
      новых строк.
 
           Если задано нулевое значение целого,  то  эта  возмож-
 
      ность отключается и утилита не будет проверять максимальное
 
      число строк. По умолчанию максимальное число строк равно  0
 
      (т.е. проверка на превышение буфера выключена).
 
           Возвращаемое состояние:
 
      TPU$_MINVALUE WARNING - аргумент меньше минимально допусти-
 
      мого.
 
           Пример.
 
      SET (MAX_LINES, MESSAGE_BUFFER, 20);
 
           Оператор приводит к тому, что максимальное число строк
 
      в буфере MеSSAGE_BUFFER становится равным 20. Будут  сохра-
 
      няться только самые последние сообщения.
 
 
 
           5.79.12. Процедура SET (MESSAGE_FLAGS,...)
 
 
           Формат:
 
      SET (MESSAGE_FLAGS, целое)
 
           Параметры:
 
           MESSAGE_FLAGS - ключевое слово, определяющее установку
 
      флагов сообщений в процедуре $PUTMSG системного сервиса;
 


                                - 257 -
 
                          00152-01 34 04-1
 
 
           Целое - значение, задающее коды  сообщений  в  $PUTMSG
 
      согласно табл. 9
 
           Описание.
 
           Если  явно  флаги  сообщений  не  устанавливаются,  то
 
      используются флаги, установленные по умолчанию. Флаги сооб-
 
      щений могут быть также  установлены  на  уровне  командного
 
      языка DCL командой SET MESSAGE.
 
 
                                                      Таблица 9
 
                 Коды сообщений для $PUTMSG
 
      ---------------------------------------------------------
 
          !        !
 
      Бит !Значение!      Назначение
 
          !        !
 
      ---------------------------------------------------------
 
      0   ! 1      !Включает текст сообщения
 
          ! 0      !Не включает текст сообщения
 
      1   ! 1      !Включает идентификатор сообщения
 
          ! 0      !Не включает идентификатор собщения
 
      2   ! 1      !Включает индикатор уровня серьезности
 
          ! 0      !Не включает индикатор уровня серьезности
 
      3   ! 1      !Включает имя средства
 
          ! 0      !Не включает имя средства
 
 
           Возвращаемое состояние:
 
      TPU$_FLAGTRUNC WARNING - значения  флага  сообщений  должны
 
      быть меньше или равны 15.
 
           Примеры:
 
           1. SET (MESSAGE_FLAGS, 2);
 
      Оператор приводит к включению только идентификатора сообще-
                     
      ния языка TPU. Целое число 2 выставляет бит 1.


                                - 258 -
 
                          00152-01 34 04-1
 
 
           2. SET (MESSAGE_FLAGS, 5);
 
      Оператор приводит к включению в сообщения языка TPU  текста
 
      сообщения (бит 0 установлен) и индикатора уровня серьезнос-
 
      ти (бит 2 установлен).
 
 
 
           5.79.13. Процедура SET (NO_WRITE,...)
 
 
           Формат:
 
      SET (NO_WRITE, буфер, [Kлючевое_слово])
 
           Параметры:
 
           NO_WRITE - ключевое слово, определяющее запрет  созда-
 
      ния файла для содержимого буфера при выходе из утилиты;
 
           Буфер - буфер, чье содержимое не должно быть  записано
 
      при выходе из TPU;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) ON - буфер с указанным именем не будет записываться
 
      в файл при выходе из утилиты;
 
           2) OFF - изменить состояние запрета записи  буфера  на
 
      состояние по умолчанию; модифицированный буфер будет  запи-
 
      сываться при выходе из TPU (только модифицированный).
 
           Примеры:
 
           1. SET (NO_WRITE, MY_BUFFER);
 
      Оператор приводит к запрету сохранения буфера  MY_BUFFER  в
 
      файле при выходе из утилиты.
 
           2. SET (NO_WRITE, MY_BUFFER, OFF);
 
      Оператор изменяет для буфера  MY_BUFFER  состояние  запрета
 
      записи на принятое по умолчанию.
 


                                - 259 -
 
                          00152-01 34 04-1
 
 
           5.79.14. Процедура SET (OUTPUT_FILE,...)
 
 
           Формат:
 
      SET (OUTPUT_FILE, буфер, строка)
 
           Параметры:
 
           OUTPUT_FILE -ключевое слово, определяющее спецификацию
 
      файла для сохранения содержимого буфера при выходе из  ути-
 
      литы;
 
           Буфер - буфер, содержимое которого должно быть записа-
 
      но в указанный файл;
 
           Строка -  строка,  представляющая  собой  спецификацию
 
      файла, в который должна быть произведена запись.
 
           Описание.
 
           Если буфер, для которого указана спецификация выходно-
 
      го файла, не был модифицирован, то сохраняться он не будет.
 
      Если для буфера установлено NO_WRITE, то его сохранение  не
 
      будет выполнено даже в случае модификации.
 
           По умолчанию спецификация выходного  файла  отличается
 
      от спецификации входного файла номером  версии  (образуется
 
      новая версия, превышающая на единицу наибольшую из  сущест-
 
      вующих).
 
           Пример.
 
      SET (OUTPUT_FILE, PASTE_BUFFER, 'NEWFILE.TXT')
 
 
 
           5.79.15. Процедура SET (OVERSTRIKE,...)
 
 
           Формат:
 
      SET (OVERSTRIKE, буфер)
 


                                - 260 -
 
                          00152-01 34 04-1
 
 
           Параметры:
 
           OVERSTRIKE -ключевое слово, определяющее режим  замены
 
      текста; символы, добавляемые к  буферу,  заменяют  символы,
 
      находящиеся в буфере, начиная с текущей позиции символа;
 
           Буфер -  буфер,  для  которого  устанавливается  режим
 
      замены текста. По умолчанию режим  ввода  текста  -  INSERT
 
      (вставка).
 
           Пример.
 
      SET (OVERSTRIKE, MY_BUFFER)
 
           Оператор устанавливает режим замены текста для  буфера
 
      MY_BUFFER.
 
 
 
           5.79.16. Процедура SET (PAD,...)
 
 
           Формат:
 
      SET (PAD, окно, ключевое_слово)
 
           Параметры:
 
           PAD - ключевое слово,  определяющее  дополнение  строк
 
      экрана пробелами справа вместо того, чтобы оканчивать вывод
 
      при достижении конца записи.  Окно,  для  которого  указаны
 
      видеоатрибуты изображения, будет иметь форму  прямоугольни-
 
      ка;
 
           Окно - окно, строки которого дополняются пробелами;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) ON - вызывает отображение пробелов после последнего
 
      символа в записи так, что  строки  экрана  раздвигаются  до
 
      правой границы окна. Если в буфере недостаточно  строк  для
 
      заполнения ими всего окна, то утилита отображает  в  остав-
 
      шейся части окна строки, содержащие одни пробелы  (в  соот-
 
      ветствии с видеоатрибутами, установленными для этого окна);
 


                                - 261 -
 
                          00152-01 34 04-1
 
 
           2) OFF - вызывает остановку отображения символов строк
 
      у последнего символа в каждой записи. Если для  этого  окна
 
      применяются видеоатрибуты, то у окна на экране  наблюдается
 
      зазубренный правый край.
 
           Описание.
 
           По умолчанию утилита заканчивает строку на экране пос-
 
      ле достижения конца записи. Отсутствие наполнения пробелами
 
      экрана увеличивает производительность  при  редактировании.
 
      Изменить ситуацию, заданную по умолчанию, помогает процеду-
 
      ра SET (PAD,...). Записи в самом буфере не дополняются про-
 
      белами, это происходит только  при  отображении  строк.  По
 
      умолчанию дополнение строк пробелами справа запрещено.
 
           Пример.
 
      SET (PAD, SECOND_WINDOW, ON);  SET  (VIDEO,  SECOND_WINDOW,
 
      REVERSE);
 
           Первый  оператор  приводит  к   дополнению   строк   в
 
      SECOND_WINDOW. Второй оператор вызывает реверсивное отобра-
 
      жение этого окна.
 
 
 
           5.79.17. Процедура SET (PERMANENT,...)
 
 
           Формат:
 
      SET (PERMANENT, буфер)
 
           Параметры:
 
           PERMANENT - ключевое слово, означающее запрет удаления
 
      буфера;
 
           Буфер - буфер,  для  которого  устанавливается  запрет
 
      удаления.
 


                                - 262 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           Использование SET (PERMANENT, буфер) делает буфер пос-
 
      тоянным; возможность  сделать  буфер  удаляемым  в  течение
 
      сеанса отсутствует. По умолчанию буфер может  быть  удален,
 
      т.е. он не является постоянным.
 
           Пример.
 
      SET (PERMANENT, MASTER_BUFFER);
 
           Оператор определяет буфер MASTER_BUFFER постоянным.
 
 
 
           5.79.18. Процедура SET (PROMPT_AREA,...)
 
 
           Формат:
 
      SET (PROMPT_AREA, целое1, целое2, ключевое_слово).
 
           Параметры:
 
           PROMPT_AREA - ключевое слово, определяющее область  на
 
      экране для отображения подсказок,  генерируемых  встроенной
 
      процедурой READ_LINE;
 
           Целое1 - номер строки  экрана,  с  которой  начинается
 
      область PROMPT_AREA;
 
           Целое2 - число экранных строк в области PROMPT_AREA;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) NONE  -  для  символов  в  области  PROMPT_AREA  не
 
      используются видеоатрибуты;
 
           2) BOLD - символы в области PROMPT_AREA будут  выделе-
 
      ны;
 
           3) BLINK - символы в области PROMPT_AREA  отображаются
 
      мерцанием;
 
           4) REVERSE - символы в области PROMPT_AREA будут отоб-
 
      ражены реверсивно (негативно);
 
           5) UNDERLINE - символы  в  области  PROMPT_AREA  будут
 


                                - 263 -
 
                          00152-01 34 04-1
 
 
      подчеркнуты.
 
           Описание.
 
           Если область подсказки накладывается на строку отобра-
 
      женного на экран окна, то эта строка очищается при выполне-
 
      нии встроенной процедуры READ_LINE; после завершения проце-
 
      дуры строка будет восстановлена. Если область подсказки  не
 
      накладывается на другие окна, то в ней  отображаются  подс-
 
      казка, генерируемая  процедурой  READ_LINE,  и  вводимая  в
 
      ответ на нее информация.
 
           Если область подсказки состоит из нескольких  строк  и
 
      терминал имеет аппаратную поддержку  прокрутки  текста,  то
 
      первая подсказка  появляется  в  последней  строке  области
 
      подсказки; появление новых подсказок  приводит  к  смещению
 
      предыдущих вверх. Если в области не хватает строк для текс-
 
      та новой подсказки, то самая верхняя пропадает.
 
           Если терминал  не  поддерживает  аппаратную  прокрутку
 
      текста, то подсказки отображаются с первой  строки  области
 
      подсказки и далее вниз до конца области; области  подсказки
 
      и далее вниз до конца  области;  после  заполнения  области
 
      новые подсказки отображаются опять с первой строки.
 
           Пример.
 
      SET (PROMPT_AREA, 24, 1, REVERSE);
 
           Оператор об'являет область подсказки, начинающуюся  со
 
      строки 24; область состоит из одной строки  и  отображается
 
      реверсивно (негативно).
 


                                - 264 -
 
                          00152-01 34 04-1
 
 
           5.79.19. Процедура SET (REVERSE,...)
 
 
           Формат:
 
      SET (REVERSE, буфер)
 
           Параметры:
 
           REVERSE - ключевое слово, определяющее  обратное  нап-
 
      равление просмотра буфера (к началу буфера);
 
           Буфер - буфер, для которого необходимо установить нап-
 
      раление. По умолчанию для  буфера  установлено  направление
 
      FORWARD.
 
           Пример.
 
      SET (REVERSE, MY_BUFFER);
 
           Оператор устанавливает для буфера MY_BUFFER  направле-
 
      ние к его началу.
 
 
 
           5.79.20. Процедура SET (SCREEN_UPDATE,...)
 
 
           Формат:
 
      SET (SCREEN_UPDATE, ключевое_слово)
 
           Параметры:
 
           SCREEN_UPDATE - ключевое слово,  определяющее  возмож-
 
      ность ссылки на экран символьной информации и кодовых  пос-
 
      ледовательностей для управления курсором; на экране отобра-
 
      жается текущее внутреннее состояние буфера . Этой  функцией
 
      управляет диспетчер экрана;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) ON - заставляет диспетчер экрана посылать символы и
 
      коды управления курсором для обновления экрана;
 
           2) OFF - заставляет диспетчер экрана воздерживаться от
 
      обновления экрана до выдачи SET (SCREEN_UPDATE,ON).
 


                                - 265 -
 
                          00152-01 34 04-1
 
 
           Пример.
 
      SET (SCREEN_UPDATE, OFF);
 
           Оператор  выключает  немедленное  обновление   экрана.
 
      Интерфейс редактирования использует этот оператор для  зап-
 
      рещения отображения на экране промежуточных шагов.
 
 
 
           5.79.21. Процедура SET (SCROLLING,...)
 
 
           Формат:
 
      SET  (SCROLLING,  окно,  ключевое_слово,  целое1,   целое2,
 
      целое3).
 
           Параметры:
 
           SCROLLING - ключевое слово, определяющее порядок пере-
 
      мещения (прокрутки) существующих строк в окне для  размеще-
 
      ния вновь поступающих строк. В процессе прокрутки  информа-
 
      ции в окне позиция курсора остается в исходной колонке,  но
 
      строка экрана, в которой находится курсор, может  изменить-
 
      ся;
 
           Окно -  окно,  для  которого  устанавливается  порядок
 
      прокрутки;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) ON - разрешает прокрутку текста в окне;
 
           2) OFF - запрещает прокрутку текста в окне. Когда пот-
 
      ребуется прокрутка, то будет перевыводиться весь экран;
 
           Целое1 - смещение от верхней строки  окна;  определяет
 
      верхний ограничитель области, в которой курсор может  пере-
 
      мещаться для отображения текущей символьной  позиции.  Если
 
      курсор перейдет эту строку экрана, то строки в  окне  будут
 
      перемещены вниз  так,  что  курсор  вновь  окажется  внутри
 
      области  свободного  перемещения.  Если  достигнуто  начало
 


                                - 266 -
 
                          00152-01 34 04-1
 
 
      буфера, то прокрутки текста не будет;
 
           Целое2 - смещение от нижней  строки  окна;  определяет
 
      нижний ограничитель области, в которой курсор может свобод-
 
      но перемещаться для отображения  текущей  позиции  символа.
 
      Если курсор перейдет ниже этой строки,  то  строки  в  окне
 
      будут перемещены вверх так, что курсор вновь окажется внут-
 
      ри области свободного  перемещения.  Если  будет  достигнут
 
      конец буфера, то прокрутки текста не будет;
 
           Целое3 - количество строк сверху (снизу) области прок-
 
      рутки, на которое смещается курсор после прокрутки текста в
 
      окне.
 
           Описание.
 
           Встроенная процедура SET(SCROLLING)  используется  для
 
      изменения порядка прокрутки текста  в  окне.  По  умолчанию
 
      установлено SET(SCROLLING, WINDOW, ON, 0, 0, 0).
 
           Возвращаемое состояние:
 
      TPU$_BADVALUE - аргументы вне допустимых пределов.
 
           Примеры:
 
           1. SET (SCROLLING, NEW_WINDOW, ON, 0, 0,2);
 
      Оператор задает режим прокрутки для  окна  NEW_WINDOW;  при
 
      достижении курсором верхнего или нижнего  края  окна  соот-
 
      ветствующие строки удаляются из окна, освобождая место  для
 
      новых строк. Курсор позиционируется на строке со  смещением
 
      в 2 строки снизу (сверху)  окна  всякий  раз,  когда  будет
 
      иметь место прокрутка.
 
           2. SET (SCROLLING, NEW_WINDOW, ON, 0, 0, 20);
 
      Если окно NEW_WINDOW содержит 21 строку, то команда вызовет
 
      следующую прокрутку: когда курсор достигает либо  верхнего,
 
      либо нижнего края окна, строки выталкиваются из окна, чтобы
 
      освободить место для новых строк. Курсор  будет  расположен


                                - 267 -
 
                          00152-01 34 04-1
 
 
      сверху в окне, если прокручивается текст в направлении впе-
 
      ред, и снизу в окне,  если  прокрутка  идет  в  направлении
 
      назад. Команда вызывает полную  замену  имеющегося  в  окне
 
      текста на новый при каждой выдаче информации.
 
 
 
           5.79.22. Процедура SET (SHIFT_KEY,...)
 
 
           Формат:
 
      SET (SHIFT_KEY, ключевое_слово)
 
           Параметры:
 
           SHIFT_KEY  -  ключевое  слово,  определяющее   клавишу
 
      регистра в языке TPU (по умолчанию - PF1);
 
           Ключевое_слово -  ключевое  имя  определяемой  клавиши
 
      языка TPU.
 
           Описание.
 
           Клавиша регистра в языке TPU подобна  клавише  GOLD  в
 
      EDT; позволяет назначить две команды  одной  клавише:  одна
 
      выполняется простым нажатием клавивиши, другая  -  нажатием
 
      клавиши регистра, а затем нужной клавиши. Клавиша регистра,
 
      установленная   с   помощью   встроенной   процедуры    SET
 
      (SHIFT_KEY,...), остается в работе только во время текущего
 
      сеанса.
 
           В любое время может быть активна только  одна  клавиша
 
      регистра. Клавишей SHIFT_KEY в языке TPU может  быть  любая
 
      клавиша, кроме следующих:
 
           1) SHIFT;
 
           2) ESC;
 
           3) SCROLL - на клавиатуре терминала типа VT100;
 
           4) F1, F5 - на клавиатуре терминала типа VT200;
 
           5) COMPOSE - на клавиатуре терминала типа VT200.
 


                                - 268 -
 
                          00152-01 34 04-1
 
 
           По умолчанию, клавишей регистра в языке  TPU  является
 
      PF1. Если необходимо использовать PF1 для других целей,  то
 
      нужно использовать SET (SHIFT_KEY,...) для определения дру-
 
      гой клавиши регистра.
 
           Отмена клавиши регистра  в  интерфейсе  редактирования
 
      достигается командой:
 
      SET (SHIFT_KEY, KEY_NAME (PF1, SHIFT_KEY))
 
           Пример.
 
      SET (SHIFT_KEY, PF4);
 
           Оператор определяет клавишу PF4  на  малой  клавиатуре
 
      как клавишу регистра.
 
 
 
           5.79.23. Процедура SET (STATUS_LINE,...)
 
 
           Формат:
 
      SET (STATUS_LINE, окно, ключевое_слово, строка)
 
           Параметры:
 
           STATUS_LINE - ключевое_слово, определяющее строку сос-
 
      тояния в любом окне; используется для отображения  обычного
 
      текста или для отображения информации о состоянии окна;
 
           Окно - окно, в котором модифицируется  строка  состоя-
 
      ния;
 
           Ключевое_слово - задает видеоатрибуты строки состояния
 
      STATUS_LINE; используется одно из следующих ключевых слов:
 
           1) NONE - видеоатрибуты не применяются;
 
           2) BOLD - символы должны быть выделены;
 
           3) BLINK - символы должны отображаться с мерцанием;
 
           4) REVERSE - символы должны быть отображены
 
      реверсивно;
 
           5) UNDERLINE -символы должны быть подчеркнуты;
 


                                - 269 -
 
                          00152-01 34 04-1
 
 
           Строка - строка в кавычках, или имя переменной, предс-
 
      тавляющей строковую константу, или выражение, дающее строку
 
      текста,  который  будет  отображен   в   строке   состояния
 
      STATUS_LINE.  Для  удаления  строки  состояния   необходимо
 
      использовать нулевую строку ('') в качестве параметра стро-
 
      ка.
 
           Описание.
 
           Строка состояния для окна  может  быть  установлена  в
 
      момент его  создания.  Встроенная  процедура  CREATE_WINDOW
 
      требует задания ключевого слова ON, если  строка  состояния
 
      используется для отображения информации о  состоянии  окна;
 
      OFF, если строка  состояния  используется  для  отображения
 
      обычного текста. Если указано ключевое слово ON, то  строка
 
      состояния (по умолчанию) отображается реверсивно (REVERSE);
 
      она содержит имя отображаемого буфера и имя файла,  связан-
 
      ного с этим буфером.
 
           Если   окно,   указанное   как   параметр    процедуры
 
      SET(STATUS_LINE,...),  имеет  строку  состояния,  то  новые
 
      атрибуты будут добавляться к видеоатрибутам уже  существую-
 
      щей строки  состояния;  ключевое  слово  NONE  удаляет  все
 
      видеоатрибуты.  Строка,  указанная  последним   параметром,
 
      заменяет текст в уже существующей строке состояния.
 
           Если в окне не было строки  состояния,  то  встроенная
 
      процедура SET (STATUS_LINE,...) установит строку  состояния
 
      в последней видимой строке окна. Эта строка будет содержать
 
      текст и иметь указанные видеоатрибуты. Добавка строки  сос-
 
      тояния уменьшает количество отображаемых строк  в  окне  на
 
      единицу.
 


                                - 270 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. SET (STATUS_LINE, MY_WIND, REVERSE, "MAIN, A.TXT");
 
      оператор приводит к тому, что  строка  состояния  для  окна
 
      MY_WIND будет отображена реверсивно вместе с буфером MAIN и
 
      файлом A.TXT.
 
           2. SET (STATUS_LINE, MY_WINDOW, NONE,"");
 
      строка состояния удаляется из  окна,  т.к.  задана  нулевая
 
      строка в качестве последнего параметра.
 
 
 
           5.79.24. Процедура SET (SUCCESS,...)
 
 
           Формат:
 
      SET (SUCCESS, ключевое_слово)
 
           Параметры:
 
           SUCCESS - ключевое слово,  определяющее  сообщение  об
 
      успешно выполненных операциях;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) ON - вызывает вывод сообщений об успешном  заверше-
 
      нии;
 
           2) OFF - подавляет отображение  сообщений  об  успешно
 
      выполненных операциях.
 
           Описание.
 
           По умолчанию сообщения об успешных  завершениях  поме-
 
      щаются в буфер сообщений. Если необходимо подавить  отобра-
 
      жение этих сообщений, используется SET (SUCCESS, OFF).
 


                                - 271 -
 
                          00152-01 34 04-1
 
 
           5.79.25. Процедура SET (SYSTEM,...)
 
 
           Формат:
 
      SET (SYSTEM, буфер)
 
           Параметры:
 
           SYSTEM - ключевое слово,  определяющее  статус  буфера
 
      (системный).
 
           Буфер - буфер, устанавливаемый как системный.
 
           Описание.
 
           Буфер, установленный однажды как системный, не может в
 
      дальнейшем   переустанавливаться   пользовательским.    Эта
 
      встроенная процедура позволяет отличать служебные  (систем-
 
      ные) буфера от пользовательских.
 
           По умолчанию буфер устанавливается как  пользовательс-
 
      кий.
 
           Пример.
 
           SET (SYSTEM, MESSAGE_BUFFER);
 
      Оператор устанавливает буфер MESSAGE_BUFFER системным.
 
 
 
           5.79.26. Процедура SET (TAB_STOPS,...)
 
 
           Формат:
 
      SET (TAB_STOPS, буфер, строка или целое)
 
           Параметры:
 
           TAB_STOPS -  ключевое  слово,  определяющее  установку
 
      табуляторных остановов (табуляций);
 
           Буфер - буфер, для которого устанавливаются табуляции;
 
           Строка - строка чисел, разделенных  пробелами,  указы-
 
      вающих  позиции  табуляций.  Минимальное  значение  позиции
 
      табуляции равно 1, максимальное - 65535. Максимальное число
 
      табуляций, задаваемое в строке, равно 100; значения позиций


                                - 272 -
 
                          00152-01 34 04-1
 
 
      табуляций в строке  перечисляются  в  возрастающем  порядке
 
      ("3 6 9 12");
 
           Целое - число, задающее  интервал  между  табуляциями.
 
      Например, если целое равно 4, то остановы табуляций будут в
 
      каждой 4 колонке. Минимальное значение числа равно 1,  мак-
 
      симальное 65535.
 
           Описание.
 
           По умолчанию, табуляции установлены на каждом  восьмом
 
      символе. Встроенная  процедура  SET  (TAB_STOPS)  позволяет
 
      изменить эти табуляции на другие, имеющие конкретные значе-
 
      ния колонок, или другой интервал между табуляциями, который
 
      равен 8.
 
           На  терминалах  или  печатающих  устройствах,  имеющих
 
      табуляции на позициях, отличных от установленных с  помощью
 
      этой процедуры, файлы будут выглядеть не так, как они  выг-
 
      лядят при работе с TPU; процедура не  влияет  на  аппаратно
 
      установленные табуляции терминала.
 
           Возвращаемое состояние:
 
      TPU_INVTABSPEC WARNING - плохой третий аргумент.
 
           Примеры:
 
           1. SET (TAB_STOPS, CURRENT_BUFFER, 4);
 
      оператор  устанавливает   интервал   табуляции   в   буфере
 
      CURRENT_BUFFER через четыре позиции от первой.
 
           2. SET (TAB_STOPS, CURRENT_BUFFER, "4 8 12 16 ");
 
      оператор устанавливает табуляции в текущем буфере на  пози-
 
      ции 4, 8, 12, 16.
 


                                - 273 -
 
                          00152-01 34 04-1
 
 
           5.79.27. Процедура SET (TEXT,...)
 
 
           Формат:
 
      SET (TEXT, окно, ключевое_слово).
 
           Параметры:
 
           TEXT - ключевое слово, определяющее способ отображения
 
      текста в окне;
 
           Окно - окно, для которого устанавливается режим  отоб-
 
      ражения текста;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) BLANK_TABS - отображает табуляции пробелами;  уста-
 
      навливается по умолчанию;
 
           2) GRаPHIC_TABS - отображает табуляции как специальные
 
      графические символы; каждая табуляция становится явно  вид-
 
      на;
 
           3) NO_TRANSLATE - приводит к тому, что каждый  символ,
 
      который читается с клавиатуры, должен быть послан на  экран
 
      прямо, без каких-либо преобразований.  Это  ключевое  слово
 
      необходимо использовать осторожно, т.к. оно может  привести
 
      к непредсказуемым результатам.
 
 
 
           5.79.28. Процедура SET (TIMER,...)
 
 
           Формат:
 
      SET(TIMER, ключевое_слово, строка)
 
           Параметры:
 
           ТIMER - ключевое слово, определяющее вывод сообщений в
 
      область подсказок с интервалом в одну секунду;
 
           Ключевое_слово - одно из двух ключевых слов:
 
           1) ON - разрешает вывод указанного сообщения в область
 
      подсказок;


                                - 274 -
 
                          00152-01 34 04-1
 
 
           2) OFF - запрещает отображение сообщений с  интервалом
 
      в область подсказок;
 
           Строка - строка в кавычках, или имя переменной, предс-
 
      тавляющей строковую константу, или выражение, дающее строку
 
      для отображения в области сообщений (подсказок). Максималь-
 
      ная длина сообщений равна 15  символам.  Сообщение  отобра-
 
      жается в последних позициях области подсказок.
 
           Описание.
 
           Сообщение выводится с интервалом в одну секунду  неза-
 
      висимо от выполнения действий по редактированию;  автомати-
 
      чески удаляется, освобождая место для других сообщений.
 
 
 
           5.79.29. ПPоцедура SET (VIDEO,...)
 
 
           Формат:
 
      SET (VIDEO, окно, ключевое_слово)
 
           Параметры:
 
           VIDEO -  ключевое  слово,  определяющее  видеоатрибуты
 
      окна;
 
           Окно - окно, для которого устанавливаются видеоатрибу-
 
      ты;
 
           Ключевое_слово - одно из следующих ключевых слов:
 
           1) NONE - видеоатрибуты в окне не применяются;
 
           2) BOLD - символы в окне выделяются;
 
           3) BLINK - символы в окне изображаются с мерцанием;
 
           4) REVERSE - символы в  окне  должны  быть  отображены
 
      реверсивно;
 
           5) UNDERLINE - символы в окне должны быть подчеркнуты.
 


                                - 275 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           Устанавливаемые вновь  видеоатрибуты  об'единяются  по
 
      действию с существующими. Для отмены одного  (или  несколь-
 
      ких) видеоатрибутA необходимо отменить все (ключевое  слово
 
      NONE), а затем установить нужные.
 
           Процедура (VIDEO,...) не оказывает влияния  на  строку
 
      состояния окна. Необходимый видеоатрибут для строки состоя-
 
      ния   устанавливается   с   помощью   встроенных   процедур
 
      CREATE_WINDOW или SET(STATUS_LINE,...).
 
           По умолчанию видеоатрибуты окна  не  установлены.  Это
 
      состояние  обеспечивает  наиболее  эффективное   управление
 
      экраном.
 
           Пример.
 
      SET (VIDEO, CURRENT_WINDOW, REVERSE);
 
      SET (VIDEO, CURRENT_WINDOW, UNDERLINE);
 
           Операторы  SET  устанавливают  негативное  отображение
 
      текущего окна с подчеркиванием.
 
 
 
           5.79.30. Процедура SET (WIDTH,...)
 
 
           Формат:
 
      SET (WIDTH, окно, целое)
 
           Параметры:
 
           WIDTH - ключевое слово, определяющее ширину окна;
 
           Окно - окно, для которого устанавливается ширина;
 
           Целое - значение, которое устанавливает ширину окна.
 
           Описание.
 
           Размер экрана изменяется до 132 позиций в строке, если
 
      при  ширине  экрана  80  позиций  задано   целое,   большеE
 
      вOсьмидесяти.
 


                                - 276 -
 
                          00152-01 34 04-1
 
 
           Размер окна в 132 позиции уменьшается до 80, если ука-
 
      зано целое, меньше восьмидесяти и  все  другие  окна  имеют
 
      ширину окна не более 8о.
 
           Если при отображении текста превышается  ширина  окна,
 
      то в самой правой колонке  будет  виден  ромб,  указывающий
 
      наличие невидимого на экране текста
 
           По умолчанию ширина окна равна физической ширине  тер-
 
      минала в момент создания окна.
 
           Возвращаемое состояние:
 
      TPU$_BADVALUE ERROR - аргумент вне допустимых границ.
 
           Пример.
 
      SET (WIDTH,CURRENT_WINDOW, 132);
 
           Оператор  устанавливает  ширину  текущего  окна,  рав-
 
      ную 132.
 
 
 
           5.80. Процедура SHIFT
 
 
           Встроенная  процедура  SHIFT  изменяет   относительную
 
      позицию текста,  отображеного  в  каком-либо  окне  экрана.
 
      Текст в окне сдвигается вправо или влево. Такой сдвиг  при-
 
      меним для любого буфера, связанного с указанным окном. Про-
 
      цедура возвращает результат типа целое.
 
           Формат:
 
      [целое2:=] SHIFT (окно, целое1)
 
           Параметры:
 
           Окно - окно экрана, в котором выполняется сдвиг;
 
           Целое1 - целое число со знаком плюс или минус,  указы-
 
      вающее количество  колонок,  на  которые  будет  произведен
 
      сдвиг. Положительное целое значение  вызывает  сдвиг  влево
 
      так, что станет виден текст за правой границей окна.
 


                                - 277 -
 
                          00152-01 34 04-1
 
 
           Отрицательное целое число вызывает сдвиг  вправо  так,
 
      что будет виден текст за левой границей окна.  Если  первый
 
      символ текста находится в первой колонке, то  сдвиг  вправо
 
      не выполняется.
 
           Описание.
 
           Встроенная процедура SHIFT используется, если текст  в
 
      окне ушел за правый отступ (отмеченный ромбовидным символом
 
      в самой правой колонке) и его необходимо сдвинуть влево.
 
           Команды SHIFT накапливают результат;  процедура  SHIFT
 
      возвращает  целое  число  (целое2),  указывающее  суммарный
 
      сдвиг влево.
 
           Процедура SHIFT вызывает перевывод  содержимого  окна.
 
      Ее выполнение внутри другой процедуры не приводит к  обнов-
 
      лению экрана до тех пор, пока внешняя процедура не закончит
 
      работу. Если необходимо обновлять экран до завершения прог-
 
      раммы, то используется непосредственное его обновление про-
 
      цедурой UPDATE.
 
           Примеры:
 
           1. SHIFT (USER_WINDOW, +5);
 
      Оператор вызывает сдвиг на 5 колонок влево текста, располо-
 
      женого в окне USER_WINDOW.
 
           2.SHIFT (CURRENT_WINDOW, -5);
 
      оператор вызывает сдвиг текста в текущем окне на 5  колонок
 
      вправо.
 


                                - 278 -
 
                          00152-01 34 04-1
 
 
           5.81. Процедура SHOW
 
 
           Встроенная  процедура  SHOW  отображает  информацию  о
 
      типах данных и текущих значениях  атрибутов,  заданных  для
 
      отдельных типов данных.
 
           Формат:
 
      SHOW (ключевое_слово или тип_данных)
 
           Параметры:
 
           Ключевое_слово - одно из следющих ключевых слов:
 
           1) BUFFER[S] - отображает информацию O  всех  буферах,
 
      доступных редактору;
 
           2) KEYWORDS - отображает все  элементы  из  внутренней
 
      таблицы ключевых слов;
 
           3) PROCEDURE - отображает имена всех определенных про-
 
      цедур;
 
           4) SCREEN - отображает информацию о терминале;
 
           5) SUMMARY -  отображает  статистику  о  TPU,  включая
 
      текущий номер версии;
 
           6) VARIABLES  -  отображает  имена  всех  определенных
 
      переменных;
 
           7) WINDOW[S] - отображает  информацию  о  всех  окнах,
 
      доступных редактору;
 
           Тип_данных - имя переменной, которой назначен один  из
 
      следующих трех типов данных:
 
           1) буфер (буфер) - отображает  информацию  о  буферной
 
      переменной;
 
           2) окно (окно) - отображает  информацию  о  переменной
 
      типа окно;
 
           3) строка (строка) - отображает информацию о строковой
 
      переменной.
 


                                - 279 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           Переменная  SHOW_BUFFER  проверяется  на  соответствие
 
      буферу; переменная INFO_WINDOW проверяется на  соответствие
 
      окну. Если эти два элемента существуют в момент обращения к
 
      встроенной процедуре  SHOW,  то  сформированная  информация
 
      записывается в буфер SHOW_BUFFER и отображается  в  окне  с
 
      именем INFO_WINDOW.
 
           Интерфейс редактирования  должен  создать  в  процессе
 
      инициализации буфер  с  именем  SHOW_BUFFER,  без  которого
 
      встроенная процедура SHOW будет работать неверно.
 
           Встроенная процедура отображает  окно  INFO_WINDOW  на
 
      экран; любой интерфейс должен предусмотреть механизм, кото-
 
      рый прекращал бы отображение окна INFO_WINDOW  и  возвращал
 
      пользователя в текущую  позицию.  Текущий  текст  в  буфере
 
      перед выдачей новой информации удаляется.
 
           Возращаемое состояние:
 
      TPU$_NOSHOWBUF  WARNING   -   должен   существовать   буфер
 
      SHOW_BUFFER, в  который  будет  записываться  затребованная
 
      информация.
 
           Примеры:
 
           1.SHOW (PROCEDURE);
 
      Оператор отображает на экране все встроенные процедуры ути-
 
      литы,  процедуры,  написанные  пользователем,  доступные  в
 
      интерфейсе редактирования.
 
           2.SHOW (SUMMARY);
 
      В том случае, когда утилита вызывается с  эмулятором  малой
 
      клавиатуры EDT и с пользовательским командным файлом,  дан-
 
      ный оператор генерирует следующее изображение:
 
 
 
      TPU VERSION V1 UPDATE O


                                - 280 -
 
                          00152-01 34 04-1
 
 
      JOURNAL FILE: WORK$:[USER]CHAP4.FIL:2
 
      SECTION FILE: SYS$SYSROOT:[SYSLIB]EDTSECINI_GBL;3
 
      TIMER MESSAGE: EXECUTING
 
      5 SYSTEM BUFFERS AND 3 USER BUFFERS
 
      67 CALLS TO LIB$GET_VM, 12 CALLS TO LIB$FREE_VM,78O984
 
      BYTES STILL ALLOCATED.
 
           3.SHOW (CURRENT_BUFFER);
 
      При использовании по умолчанию интерфейса  эмулятора  малой
 
      клавиатуры EDT данный оператор отображает следующую  инфор-
 
      мацию о текущем буфере:
 
 
 
      буфер: MAIN_BUFFER
 
      NAME: MAIN  MAPPED TO 1 WINDOW
 
      INPUT FILE: WORK$:[USER] TEXT.FIL;8
 
      OUTPUT FILE:
 
      CONTAINS 1O612 LINES MAX_LINES:4294967295 мAXIMUM LINE
 
      SIZE:984 CHARACTERS
 
      LEFT MARGIN:1 RIGHT MARGIN:8O TABS EVERY 8 COLUMNS
 
      SYSTEM MODIFIED FORWARD INSERT
 
 
 
           5.82. Процедура SPAN
 
 
           Встроенная процедура SPAN возвращает шаблон для подбо-
 
      ра самой длинной строки символов, содержащей только указан-
 
      ные символы.
 
           Формат:
 
      шаблон:=SPAN (строка)
 
           Параметры:
 
           Строка - строка в кавычках или имя переменной,  предс-
 
      таляющей строковую константу, содержащую символы для  вклю-
 


                                - 281 -
 
                          00152-01 34 04-1
 
 
      чения в шаблон.
 
           Описание.
 
           Процедура SPAN начинает работу с текущей позиции  сим-
 
      вола и продолжает до тех пор, пока не будет найден  символ,
 
      не включенный в строку-параметр,  или  не  будет  достигнут
 
      конец строки. Процедура SPAN не пересекает границы  записей
 
      (строк).
 
           Примеры:
 
           1.PAT1:=SPAN ('O123456789');
 
      оператор присваивания создает шаблон, который будет  подби-
 
      рать самую длинную последовательность цифр, начинающуюся  с
 
      текущей позиции символа.
 
           2.процедура USER_REMOVE_XYZ удаляет все строки,  кото-
 
      рые содержат Х,Y или Z:
 
      PROCEDURE USER_REMOVE_XYZ
 
      PAT1=:SPAN('XYZ');
 
      LOOP
 
      S1:=SEARCH (PAT1,FORWARD);
 
      EXITIF S1=0;
 
      POSITION(S1);
 
      ERASE_LINE;
 
      ENDLOOP;
 
      ENDPROCEDURE
 
 
 
           5.83. Процедура SPANL
 
 
           Встроенная процедура SPANL возвращает шаблон для  под-
 
      бора самой длинной строки, содержащей  только  те  символы,
 
      которые появляются в строке, указанной параметром.
 


                                - 282 -
 
                          00152-01 34 04-1
 
 
           Формат:
 
      Шаблон:=SPANL(строка)
 
           Параметры:
 
           Строка - строка в кавычках или имя переменной,  предс-
 
      тавляющей строковую константу с символом  для  включения  в
 
      шаблон.
 
           Описание.
 
           Процедура SPANL подобна процедуре SPAN, но  она  расс-
 
      матривает условие конца строки как  продолжение  подбора  и
 
      распространяет шаблон за конец строки. Процедура продолжает
 
      поиск шаблона до тех пор, пока не найдет символ, не  встре-
 
      чающийся в строке-параметре, или пока не  сложится  условие
 
      конца поиска (достижение начала  буфера,  если  направление
 
      поиска REVERSE, или достижение конца буфера, если направле-
 
      ние поиска FORWARD.
 
           Примеры:
 
           1. PAT1:=SPANL ('');
 
      оператор присваивания записывает в переменную PAT1  шаблон,
 
      который будет подбирать  самую  длинную  последовательность
 
      символов пробела, начинающуюся с текущей позиции символа  и
 
      продолжающуюся до выполнения условия конца поиска.
 
           2. PAT2:=SPANL ('O123456789');
 
      Оператор присваивания записывает в переменную PAT2  шаблон,
 
      который будет подбирать  самую  длинную  последовательность
 
      цифр, начинающуюся с текущей позиции символа  и  продолжаю-
 
      щуюся до выполнения условия конца поиска.
 
           3. PAT3:=SPANL ('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
 
      Оператор присваивания записывает в переменную PAT3  шаблон,
 
      который будет подбирать последовательность (самую  длинную)
 
      символов алфавита, указанных в строке-параметре. Если  этот


                                - 283 -
 
                          00152-01 34 04-1
 
 
      шаблон используется вместе с встроенной процедурой  SEARCH,
 
      то поиск начнется с текущей позиции символа и будет продол-
 
      жаться до выполнения  условия  конца  поиска.  Если  указан
 
      EXACT-поиск (точный поиск), то для успешного подбора симво-
 
      ла они должны быть символами верхнего регистра.
 
 
 
           5.84. Процедура SPAWN
 
 
           Встроеная процедура SPAWN отсоединяет терминал и затем
 
      создает некоторый подпроцесс МОС ВП.
 
           Формат:
 
      SPAWN [(строка)]
 
           Праметры:
 
           Строка - командная строка для выполнения  в  контексте
 
      подпроцесса, который создан с помощью этой встроенной  про-
 
      цедуры.
 
           Описание.
 
           Процедура SPAWN приостанавливает процесс  редактирова-
 
      ния и порождает подпроцесс МОС  ВП;  особенно  полезна  для
 
      работающих программ и утилит, которые берут на себя  управ-
 
      ление экраном полностью (эти программы не могут работать  в
 
      подпроцессах,  созданных  с  помощью  встроенной  процедуры
 
      CREATE_PROCESS).
 
           После завершения работы подпроцесса, созданного проце-
 
      дурой SPAWN, возврат в утилиту возможен по командам  ATTACH
 
      или LOGOUT; команда ATTACH делает приостановленный  подпро-
 
      цесс  доступным  для  дальнейшего  использования;   команда
 
      LOGOUT уничтожает его.
 


                                - 284 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. SPAWN;
 
      Команда порождает  подпроцесс  МОС  ВП  и  приостанавливает
 
      TPU-процесс. После завершения работы  в  новом  подпроцессе
 
      необходимо продолжить  сеанс  работы  с  утилитой  командой
 
      ATTACH или завершить процесс командой LOGOUT.
 
           2. SPAWN ('DIRECTORY');
 
      Команда порождает  подпроцесс  МОС  ВП,  который  выполняет
 
      команду  DIRECTORY  языка  DCL.  После  выполнения  команды
 
      DIRECTORY прерванная работа с утилитой будет продолжена.
 
 
 
           5.85. Процедура SPLIT_LINE
 
 
           Встроенная  процедура  SPLIT_LINE  разбивает   текущую
 
      строку в текущей символьной позиции и создает две строки.
 
           Формат:
 
      SPLIT_LINE
 
           Параметры:
 
           Отсутствуют.
 
           Описание.
 
           Использование процедуры SPLIT_LINE  оставляет  текущую
 
      позицию на том же символе; этот  символ  становится  первым
 
      символом в новой строке, которая  вставляется  сразу  после
 
      бывшей текущей строки.
 
           Относительная  экранная  позиция  расщепленной  строки
 
      может измениться.
 
           Возращаемые состояния:
 
      TPU$_NOCURRENTBUF WARNING - нет позиционирования в буфере;
 
      TPU$_NOCACHE ERROR - нет памяти под новый кэш.
 


                                - 285 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1.SPLIT_LINE;
 
      Команда расщепляет текущую строку  по  текущему  символу  и
 
      делает новую строку.
 
           2. Процедура  USER_SPLIT_LINE  расщепляет  строку   по
 
      текущему символу. Если текущая позиция символа  расположена
 
      в первой колонке и в первой строке, то эта процедура  вызы-
 
      вает прокрутку экрана:.
 
 
 
      PROCEDURE USER_SPLIT_LINE
 
      LOCAL OLD_POSITION, NEW_POSITION;
 
      SPLIT_LINE;
 
      IF ((CURRENT_ROW=1)AND (CURRENT_COLUMN=1)
 
      THEN
 
      OLD_POSITION:=MARK (NONE);
 
      SCROLL(CURRENT_WINDOW,-1);
 
      NEW_POSITION:=MARK (NONE);
 
      IF NEW_POSITION <> OLD_POSITION
 
      THEN
 
      CURSOR_VERTICAL (1);
 
      ENDIF:
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.86. Процедура STR
 
 
           Встроенная процедура STR  преобразует  целое  число  в
 
      строку.
 


                                - 286 -
 
                          00152-01 34 04-1
 
 
           Формат:
 
      Строка:=STR(целое)
 
           Параметры:
 
           Целое - целое значение, которое необходимо  преобразо-
 
      вать в строку.
 
           Описание.
 
           Встроенная процедура STR используется для  запоминания
 
      символьного представления целого числа в некоторой перемен-
 
      ной; имя такой переменной можно использовать  в  операциях,
 
      которые требуют строкового типа данных.
 
 
 
           5.87. Процедура SUBSTR
 
 
           Встроенная процедура  SUBSTR  возвращает  подстроку  в
 
      некотором диапазоне или строке.
 
           Формат:
 
      Строка2:=SUBSTR (строка1 или диапазон, целое1, целое2)
 
           Параметры:
 
           Строка1 - строка, содержащая подстроку;
 
           Диапазон - диапазон, содержащий подстроку;
 
           Целое1 - позиция символа, с которого начинается подст-
 
      рока номер первой позиции равен 1;
 
           Целое2 - число символов, заключенных в подстроку.
 
           Описание.
 
           Необходимо указывать  позицию,  с  которой  начинается
 
      подстрока  и  длину  подстроки.  Если  значение  переменной
 
      целое2 больше, чем число символов в подстроке, то в строка2
 
      будет возвращено  реальное  число  символов.  Сообщение  об
 
      ошибке не выдается.
 


                                - 287 -
 
                          00152-01 34 04-1
 
 
           Примеры:
 
           1. FILE_TYPE:=SUBSTR('LOGIN.COM',7,3);
 
      Оператор присваивания возвращает строку "COM" в  переменную
 
      FILE_TYPE. Эта подстрока начинается  с  седьмой  символьной
 
      позиции ("с") и содержит 3 символа  ("COM").  Если  указать
 
      число 7 в переменной целое2, то  переменная  FILE_TYPE  все
 
      равно будет содержать "сом"; сообщения об ошибке не будет.
 
           2.Процедура USER_INITIAL_CAP переводит  первый  символ
 
      любой строки в верхний регистр.  Эта  процедура  игнорирует
 
      знаки пунктуации в начале строки; строки внутри кавычек или
 
      внутри скобок (TEST) могут быть обработаны:
 
      !
 
      !Параметры:
 
      !
 
      !МY_STRING - строка для увеличения
 
      PROCEDURE USER_INITIAL_CAP (MY_STRING)
 
      LOCAL
 
      INITIAL_LETTER,
 
      INITIAL_INDEX,
 
      MY_STRING_LеNGTH,
 
      REST_OF_STRING;
 
      INITIAL_INDEX:=1;
 
      MY_STRING_LENGTH:=LENGTH (MY_STRING);
 
      NOT_ALPHABETIC:=
 
      "!C*S%()[]()_+/\:;""'<,>.?/";
 
      LOOP
 
      INITIAL_LETTER:=SUBSTR (MY_STRING,1,INITIAL_INDEX);
 
      EXITIF INITIAL_INDEX=MY_STRING_LENGTH;
 
      EXITIF INDEX (NOT_ALPHABETIC,
 
      SUBSTR(MY_STRING,INITIAL_INDEX,1))=O;


                                - 288 -
 
                          00152-01 34 04-1
 
 
      INITIAL_INDEX:=INITIAL_INDEX+1;
 
      ENDLOOP;
 
      TEST_OF_STRING:=SUBSTR (MY_STRING,INITIAL_INDEX+1,
 
                             MY_STRING_LENGTH);
 
      CHANGE_CASE (INITIAL_LETTER, UPPER);
 
      CHANGE_CASE (REST_OF_LETTER+REST_OF_STRING);
 
      MESSAGE (MY_STRING);
 
      ENDPROCEDURE
 
 
 
           5.88. Процедура TRANSLATE
 
 
           Встроенная процедура TRANSLATE вызывает RTL- процедуру
 
      STR$TRANSLATE, которая требует трех  параметров.  Некоторые
 
      из символов первого параметра заменяются символами из  вто-
 
      рого параметра. Третий параметр определяет символы  первого
 
      параметра для замены.
 
           Формат:
 
      TRANSLATE  (строка1  или  диапазон  или   буфер,   строка2,
 
      строка3)
 
           Параметры:
 
           Строка1 - один  или  несколько  символов  этой  строки
 
      будут заменены символами из строки замены (строка2);
 
           Диапазон - один или несколько символов этого диапазона
 
      будут заменены символами из строки замены (строка2);
 
           Буфер - один или несколько символов этого буфера будут
 
      заменены символами из строки замены (строка2);
 
           Строка2 - строка, содержащая символы для замены симво-
 
      лов в первом параметре;
 
           Строка3 - строка, определяющая порядок замены.  Символ
 
      в первом параметре с индексом в строке3 будет заменен стро-
 


                                - 289 -
 
                          00152-01 34 04-1
 
 
      кой строка2.
 
           Описание.
 
           Если строка замены  (строка2)  короче,  чем  указатель
 
      (строка3), и подобранные позиции символа больше, чем  пози-
 
      ции в строке замены, то символом замены станет пробел.
 
           Примеры:
 
           1.Процедура USER_TRANS_TEXT заменяет текст,  указанный
 
      переменной TEXT_TO_TRANSLATE,  в  соотвествии  с  правилом:
 
      буква "А" будет преобразована в "N"; буква "В" будет преоб-
 
      разована в "О" и т.д.:
 
      !+
 
      !-
 
      PROCEDURE USER_TRANS_TEXT (TEXT_TO_TRANSLATE)
 
      TRANSLATE (TEXT_TO_TRANSLATE,
 
       'NOPQRSTUVWXYZABCDEFGHIJKLM
 
       'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
      ENDPROCEDURE   ! конец процедуры
 
           2.процедура USER_STRIP_EIGHTH очищает восьмой бит кода
 
      всех символов в текущем буфере:
 
      PROCEDURЕ USER_STRIP_EIGHTH
 
      LOCAL I,        !счетчик циклов
 
         SEVEN,       !КОИ-8(O) КОИ-8(127) преобразуем в
 
         EIGHT;       !КОИ-8(123) КОИ-8(255) -"-
 
      !Начальные строки замены строки
 
      SEVEN:="";
 
      EIGHT:="";
 
      I:=0;
 
      LOOP
 
      SEVEN:=SEVEN+ASCII (I);
 
      EIGHT:=EIGHT+ASCII (I+123);


                                - 290 -
 
                          00152-01 34 04-1
 
 
      I:=I+1;
 
      EXITIF I=123;
 
      ENDLOOP;
 
      TRANSLATE (CURRENT_BUFFER,SEVEN,EIGHT);
 
      ENDPROCEDURE
 
 
 
           5.89. Процедура UNDEFINE_KEY
 
 
           Процедура UNDEFINE_KEY удаляет у заданной  клавиши  ее
 
      текущее определение.
 
           Формат:
 
      UNDEFINE_KEY (ключевое_слово)
 
           Параметры:
 
           Ключевое_слово - имя клавиши  или  комбинации  клавиш,
 
      разрешенное для определения в языке TPU.
 
           Описание.
 
           После использования встроенной процедуры  UNDEFINE_KEY
 
      указанная клавиша или комбинация клавиш теряет свое опреде-
 
      ление, утилита не сохраняет предыдущие определения,  сопос-
 
      тавленные с этой клавишей.
 
           Возращаемые состояния:
 
      TPU$_NODEFINITION WARNING - у этой клавиши нет определения;
 
      TPU$_NOTDEFINABLE WARNING -  второй  аргумент  не  является
 
      допустимой ссылкой на клавишу.
 
           Примеры:
 
           1.UNDEFINE_KEY (CTR_Z_KEY);
 
      Команда удаляет связь между  клавишной  комбинацией  CTRL/Z
 
      кодом, который она до этого исполняла.
 
           2.Процедура USE_CLEAR_KEY делает любую клавишу неопре-
 
      деленной. Процедуры, подобные этой, могут быть использованы
 


                                - 291 -
 
                          00152-01 34 04-1
 
 
      для инициализации малой клавиатуры:
 
      !
 
      !Параметры:
 
      ! WHICH_KEY-ключевое слово для сброса
 
      PROCEDURE USER_CLEAR_KEY (WHICH_KEY);
 
      IF (LOOKUP_KEY(WHICH_KEY, PROGRAM <> 0)
 
      THEN
 
      UNDEFINE_KEY(WHICH_KEY);
 
      ELSE
 
      MESSAGE ("KEY NOT DEFINED");
 
      ENDIF;
 
      ENDPROCEDURE
 
 
 
           5.90. Процедура UNMAP
 
 
           Процедура UNMAP отменяет связь между окном и буфером и
 
      удаляет окно с экрана.
 
           Формат:
 
      UNMAP (окно)
 
           Параметры:
 
           Окно - окно, которое необходимо удалить с экрана.
 
           Описание.
 
           Попытка прекратить отображение текущего окна  приводит
 
      к перемещению курсора в  другое  окно,  которое  становится
 
      новым текущим окном; буфер, связанный с этим  окном  стано-
 
      вится текущим буфером.
 
           Пространство экрана, занятое  отмененным  окном,  либо
 
      очищается, либо предоставляется ранее закрытым окнам,
 
           Окно, отображение которого прекращено, не удаляется из
 
      внутреннего списка доступных окон. Для повторного отображе-
 


                                - 292 -
 
                          00152-01 34 04-1
 
 
      ния его на экране необходимо использовать встроенную проце-
 
      дуру мар; недопустимо создавать это окно  вновь.  Процедура
 
      UNMAP не оказывает влияния на существование буфера, связан-
 
      ного с отмененным окном.
 
           Возращаемое состояние:
 
      TPU$_WINDNOTMAPPED WARNING - нет отображаемого в окно буфе-
 
      ра.
 
           Примеры:
 
           1.UNMAP (MAIN_WINDOW);
 
      Команда удаляет главное окно с экрана и отменяет его  связь
 
      с отображаемым буфером.
 
           2.Процедура USER_ONE_WINDOW_TO_TWO прекращает  отобра-
 
      жение текущего окна и размещает на  его  место  два  новых.
 
      Если отменяемое окно имеет  строку  состояния,  то  она  не
 
      включается в область экрана, разделяемую новыми окнами. Это
 
      происходит   потому,   что   процедура   GET_INFO    (окно,
 
      'VISIBLE_BOTTOM') не принимает во внимание  наличие  строки
 
      состояния:
 
      PROCEDURE USER_ONE_WINDOW_TO_TWO
 
      LOCAL
 
      WIND_LENGTH,
 
      WIND_HALF,
 
      FIRST_LINE,
 
      LAST_LINE;
 
      CUR_WIND:=CURRENT_WINDOW;
 
      IF (CUR_WIND<>O)
 
      THEN
 
      FIRST_LINE:=GET_INFO (CUR_WIND,'VISIBLE_TOP');
 
      LAST_LINE:=GET_INFO (CUR_WIND,'VISIBLE_BOTTOM');
 
      WIND_BUF:=GET_INFO (CUR_WIND, 'BUFFER');


                                - 293 -
 
                          00152-01 34 04-1
 
 
      ELSE
 
      FIRST_LINE:=1;
 
      LAST_LINE:=GET_INFO (SCREEN, VISIBLE_LENGTH');
 
      WIND_BUF:=CREATE_BUFFER ('EMPTY BUFFER');
 
      ENDIF;
 
      WIND_LENGTH:=(LAST_LINE-FIRST_LINE)+1;
 
      WIND_HALF:=WIND_LENGTH/2;
 
      NEW_WINDOW_1:=CREATE_WINDOW (FIRST_LINE,WIND_HALF,OFF);
 
      SET(VIDEO,NEW_WINDOW_1,UNDERLINE);
 
      NEW_WINDOW_2:=CREATE_WINDOW (WIND_HALF+1,
 
                                  LAST_LINE_WIND_HALF,OFF));
 
      MAP (NEW_WINDOW_1,WIND_BUF);
 
       MAP (NEW_WINDOW_2, WIND_BUF);
 
      ENDPROCEDURE
 
 
 
           5.91. Процедура UPDATE
 
 
           Процедура UPDATE заставляет диспетчер экрана  привести
 
      в соответствие внешнее состояние окна внутреннему состоянию
 
      буфера, связанного с этим окном , т.е. обновляет содержимое
 
      окна.
 
           Формат:
 
      UPDATE (окно)
 
           Параметры:
 
           Окно - окно, которое необходимо обновить; окно  должно
 
      быть отображено на экран.
 
           Описание.
 
           Диспетчер экрана обновляет экран после каждой  нажатой
 
      клавиши; если клавиша связана с процедурой, то  выполняемые
 
      ею изменения в буфере будут с запозданием  отображаться  на
 
 

                                - 294 -
 
                          00152-01 34 04-1
 
 
      экране. Если необходимо, чтобы экран отражал все  изменения
 
      до окончания работы процедуры, в ней используется немедлен-
 
      ное обновление экрана с помощью UPDATE.
 
           Возвращаемое состояние:
 
      TPU$_WINDNOTMAPPED WARNING - невозможно обновить  неотобра-
 
      женное на экран окно.
 
           Пример.
 
      UPDATE (NEW_WINDOW);
 
           Команда  заставляет  диспетчер  экрана  обновить  окно
 
      NEW_WINDOW и отобразить внутреннее состояние  связанного  с
 
      ним буфера.
 
 
 
           5.92. Процедура WRITE_FILE
 
 
           Встроенная процедура WRITE_FILE  записывает  данные  в
 
      указанный файл.
 
           Формат:
 
      [Строка2:=] WRITE_FILE (буфер или диапазон [,строка1])
 
           Параметры:
 
           Буфер - буфер, содержимое которого необходимо записать
 
      в файл;
 
           Диапазон - диапазон,  содержимое  которого  необходимо
 
      записать в файл.
 
           Строка1 -  строка  в  кавычках,  или  имя  переменной,
 
      представляющей строковую константу, или  выражение,  дающее
 
      строку, содержащую спецификацию  файла,  в  который  должна
 
      быть записана информация. Если задана неполная спецификация
 
      файла, то запись данных происходит в  текущем  каталоге  на
 
      текущем устройстве.
  

                                - 295 -
 
                          00152-01 34 04-1
 
 
           Описание.
 
           Утилита записывает сообщение в  буфер  MESSAGE_BUFFER,
 
      указывающее количество записей, выведенных во внешний файл.
 
           Если указана строка для результата строка2, то  проце-
 
      дура WRITE_FILE возвращает строку, содержащую  спецификацию
 
      файла, в который была произведена запись.
 
           Утилита использует флаг, помечающий буфер как  модифи-
 
      цированный или немодифицированный. После записи  данных  во
 
      внешний файл из буфера флаг модификации этого  буфера  очи-
 
      щается.
 
           Возвращаемое состояние:
 
      TPU$_CONTROLC ERROR-выполнение было прекращено после  ввода
 
      CTRL/C.
 
           Примеры:
 
           1.WRITE_FILE (PASTE_BUFFER, 'MYFILE.TXT');
 
      Оператор записывает содержимое буфера PASTE_BUFFER в файл с
 
      именем MYFILE.TXT.
 
           2.MY_FILE:=WRITE_FILE(SELECT_RANGE, 'MYFILE.TXT');
 
      Оператор присваивания размещает имя файла, в которой  запи-
 
      сан диапазон SELECT_RANGE, в переменую MY_FILE.
 
           3.процедура  USER_WRITE_FILE   записывает   содержимое
 
      буфера с именем EXTRA_BUF в некоторый файл (т.к. не указано
 
      имя файла, то используется имя  файла,  связанного  с  этим
 
      буфером). Процедура  удаляет  окно  и  буфер  из  контекста
 
      редактирования:
 
 
 
      PROCEDURE USER_WRITE_FILE;
 
      WRITE_FILE(EXTRA_BUF);
 
      DELETE (EXTRA_WINDOW);
 
      DELETE (EXTRA_BUF);


                                - 296 -
 
                          00152-01 34 04-1
 
 
      ADJUST_WINDOW (MAIN_WINDOW,-11,O);
 
      ENDPROCEDURE
 
 
 
  

                              - 297K -

                        2б.00152-01 34 04-1

    ----------------------------------------------------------- 
    I              Лист  регистрации изменений                I 
    ----------------------------------------------------------- 
    I Номера листов (страниц)IВсего I       IВходящийI    I   I 
    I------------------------IлистовI    N  I    N   I    IДа-I 
    I   IИз- IЗа- I   IАнну- I(стра-I       Iсопрово-IПодпIта I 
    IИзмIме- Iме- IНо-Iлиро- Iниц) вIдокуменIдительноI    I   I 
    I   Iнен-Iнен-IвыхIванныхIдокум.I   та  Iго докумI    I   I 
    I   Iных Iных I   I      I      I       I и дата I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I 
    ----------------------------------------------------------- 
 
                                                        
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!