Cache ': перехоплення поточного пристрою h2>
Євген Каратаєв p>
Ця
замітка описує програмний перехоплення введення-виведення поточного пристрою в
Cache '. Незручність стандартних пристроїв mumps, а точніше певного їх
поведінки полягає в тому, що якщо виконується програмний код, який здійснює
ввід-вивід через нього, то цей процес стороннім кодом некерований інакше як
установкою можливих опцій пристрою. У той час як в деяких випадках дуже
потрібно мати можливість виконати так званий успадкований (legacy) код,
який оперує поточним пристроєм, але при цьому в самих операціях
вводу-виводу провести додаткові дії. p>
Ситуація
приблизно аналогічна вводу-висновку в сішном стилі і в стилі C + +, коли в першій
випадку ми можемо відкрити файл і передати його коду, а в другому випадку ми можемо
створити об'єкт вводу-виводу і перевизначити для нього операції читання - записи.
p>
Для
перехоплення операцій вводу-виводу поточного пристрою потрібно p>
Зробити
окрему рутину, в якій прописати функції, які викликаються при операціях
вводу-виводу. p>
Вказати
поточному пристрою цю рутину як мнемонічний в команді use p>
Увімкнути
перенаправлення для поточного пристрою p>
В
функціях перевизначаються операції вводу-виводу можна використовувати штатний
поведінка поточного пристрою якщо відключити перенаправлення і при виході з
обробника знову його включити. p>
Рутина-перехоплювач
повинна реалізувати на свій розсуд мітки p>
rstr (len, to) p>
Читання з опціональним зазначенням
заданої довжини і таймауту p>
rchr (to) p>
Читання номера символу p>
wstr (expr) p>
Запис рядка W expr p>
wchr (expr) p>
Запис символу W * expr p>
wtab (expr) p>
Запис пропуску W? expr p>
wnl p>
Переклад рядка W! p>
wff p>
Очищення екрану W # p>
Шаблон
рутини приблизно такий: p>
rstr (len, to)
p>
D
$ ZU (82,12,0) p>
if $ D (len) & & $ D (to) d p>
. ; Перехоплення p>
. R data # len: to p>
e i $ D (len) d p>
. ; Перехоплення p>
. R data # len p>
e i $ D (to) d p>
. ; Перехоплення p>
. R data: to p>
e d p>
.
; Перехоплення p>
.
R data p>
D
$ ZU (82,12,1) p>
;
перехоплення p>
Q $ G (data) p>
rchr (to) p>
D $ ZU (82,12,0) p>
i $ d (to) p>
. ; Перехоплення p>
. R * data: to p>
. ; Перехоплення p>
e d p>
.
; Перехоплення p>
.
R * data p>
.
; Перехоплення p>
D
$ ZU (82,12,1) p>
; перехоплення p>
Q data p>
// W expr p>
wstr (expr) p>
D $ ZU (82,12,0) p>
; перехоплення p>
W expr p>
D $ ZU (82,12,1) p>
Q p>
// W * expr p>
wchr (expr) p>
D $ ZU (82,12,0) p>
; перехоплення p>
W * expr p>
D $ ZU (82,12,1) p>
Q p>
// W? expr p>
wtab (expr) p>
D $ ZU (82,12,0) p>
; перехоплення p>
W? expr p>
D $ ZU (82,12,1) p>
Q p>
// W! p>
wnl p>
D $ ZU (82,12,0) p>
; перехоплення p>
W!
p>
D $ ZU (82,12,1) p>
Q p>
// W # p>
wff p>
D $ ZU (82,12,0) p>
;
перехоплення p>
W
# P>
D
$ ZU (82,12,1) p>
Q
p>
Після
чого можна користуватися, вказуючи прехватчік: p>
u
dev:: "^ ІМЯРУТІНИ"; вказуємо яку мнемоніки використовувати p>
D
$ ZU (82,12,1); реально включаємо прапор використання p>
d
normal (); що буде писати в поточний
девайс p>
D
$ ZU (82,12,0); перед закриттям девайса повертаємо прапорець p>
c
dev p>
Крім
програмного призначення перехоплення для обробки виводу успадкованих коду
можна використовувати також і інші можливості: спулера, запис-читання зовнішніх
файлів, Взаємодія між процесами. p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://karataev.nm.ru/
p>