|
|
1.1 root 1: -- VTPM: decode NDQ PDU
2:
3: -- $Header: /f/osi/vt/RCS/rcv_text.py,v 7.0 89/11/23 22:31:37 mrose Rel $
4: --
5: --
6: -- $Log: rcv_text.py,v $
7: -- Revision 7.0 89/11/23 22:31:37 mrose
8: -- Release 6.0
9: --
10:
11: --
12: -- NOTICE
13: --
14: -- Acquisition, use, and distribution of this module and related
15: -- materials are subject to the restrictions of a license agreement.
16: -- Consult the Preface in the User's Manual for the full terms of
17: -- this agreement.
18: --
19: --
20:
21:
22: NDQPDU DEFINITIONS ::=
23:
24: %{
25: #include <stdio.h>
26: #include "sector1.h"
27:
28: void adios ();
29:
30: #undef PEPYPARM
31: #define PEPYPARM int *
32:
33: #undef PEPYTEST
34:
35: static int echo_sw;
36: static char *do_name;
37: extern TEXT_UPDATE *ndq_queue;
38:
39: #ifdef PEPYTEST
40:
41: TEXT_UPDATE ud;
42:
43: rcv_text(pe)
44: PE pe;
45: {
46:
47: ud.echo_sw = ud.type_sw = -1;
48: ud.updates.do_list.do_name = "\0";
49: ud.updates.do_list.do_type = -1;
50: ud.updates.do_list.do_cmd.text_ud.text_count = 0;
51:
52: if(unbuild_NDQPDU_NDQpdu(pe,1,NULLIP,NULLVP,&ud) == NOTOK)
53: return;
54:
55: (void)printf("Echo = %d; Type = %d; D.O. Name = %s; D. O. Update Type = %d\n", ud.echo_sw,ud.type_sw,ud.updates.do_list.do_name, ud.updates.do_list.do_type);
56: if(ud.updates.do_list.do_cmd.text_ud.text_count)
57: (void)printf("Text = %s\n",ud.updates.do_list.do_cmd.text_ud.text_ptr);
58: }
59:
60: #endif
61:
62:
63: #define bitstr2int(arg,val,cnt) \
64: { \
65: char *cp; \
66: \
67: cp = bitstr2strb (arg, &cnt); \
68: val = strb2int (cp, cnt); \
69: free (cp); \
70: }
71:
72: %}
73:
74: BEGIN
75:
76: SECTIONS none unbuild none
77:
78: NDQpdu ::= CHOICE
79:
80: {
81: ndqpdu [6] IMPLICIT NDQcontent [[p (PEPYPARM)0]]
82: }
83:
84: NDQcontent ::= SEQUENCE OF VTsdi [[p (PEPYPARM)0]]
85:
86: VTsdi ::= CHOICE
87: {
88: echoNow [0] IMPLICIT SEQUENCE OF ObjectUpdate [[p (PEPYPARM)0]]
89: %{echo_sw = ECHO_ON;%},
90: notEchoNow [1] IMPLICIT SEQUENCE OF ObjectUpdate [[p (PEPYPARM)0]]
91: %{echo_sw = ECHO_OFF;%}
92: }
93:
94: ObjectUpdate ::= CHOICE
95: {
96: display [0] IMPLICIT SEQUENCE
97: {
98: dOname PrintableString
99: [[s do_name]],
100:
101: SEQUENCE OF DOupdate [[p (PEPYPARM)0]]
102: },
103: control [1] IMPLICIT COupdate [[p (PEPYPARM)0]]
104: }
105:
106: DOupdate
107: %{
108: TEXT_UPDATE *arg = (TEXT_UPDATE *)parm;
109: %}
110: ::= CHOICE
111: %{
112: if( !(arg = (TEXT_UPDATE *)malloc(sizeof(TEXT_UPDATE)) ))
113: adios (NULLCP, "out of memory");
114: arg->echo_sw = echo_sw;
115: arg->type_sw = DISPLAY_OBJ;
116: arg->updates.do_list.do_name = do_name;
117: %}
118: {
119: nextXarray [0] IMPLICIT NULL
120: %{arg->updates.do_list.do_type = 0;
121: (void) enq(&ndq_queue,arg);%},
122: nextYarray [1] IMPLICIT NULL
123: %{arg->updates.do_list.do_type = 1;
124: (void) enq(&ndq_queue,arg);%},
125: ptr-relative [2] IMPLICIT ExplicitPointer
126: [[p (PEPYPARM)&(arg->updates.do_list.do_cmd.ptr_rel)]]
127: %{arg->updates.do_list.do_type = 2;
128: (void) enq(&ndq_queue,arg);%},
129: ptr-absolute [3] IMPLICIT Pointer
130: [[p (PEPYPARM)&(arg->updates.do_list.do_cmd.ptr_abs)]]
131: %{arg->updates.do_list.do_type = 3;
132: (void) enq(&ndq_queue,arg);%},
133: text [4] IMPLICIT OCTETSTRING
134: [[o arg->updates.do_list.do_cmd.text_ud.text_ptr $ arg->updates.do_list.do_cmd.text_ud.text_count]]
135: %{arg->updates.do_list.do_type = 4;
136: (void) enq(&ndq_queue,arg);%},
137:
138: repeatText [5] IMPLICIT SEQUENCE {
139: finishAddress Pointer
140: [[p (PEPYPARM)parm]],
141:
142: OCTETSTRING
143: [[o arg->updates.do_list.do_cmd.rpt_seq.text $ arg->updates.do_list.do_cmd.rpt_seq.text_count]]
144: }
145: %{arg->updates.do_list.do_type = 5;
146: (void) enq(&ndq_queue,arg);%},
147: writeAttr [6] IMPLICIT SEQUENCE {
148: AttrId [[p (PEPYPARM)&(arg->updates.do_list.do_cmd.wrt_attrib)]],
149: AttrExtent [[p (PEPYPARM)&(arg->updates.do_list.do_cmd.wrt_attrib)]]
150: }
151: %{arg->updates.do_list.do_type = 6;
152: (void) enq(&ndq_queue,arg);%},
153: erase [7] IMPLICIT SEQUENCE {
154: startErase Pointer [[p (PEPYPARM)&(arg->updates.do_list.do_cmd.erase.start_erase)]],
155: endErase Pointer [[p (PEPYPARM)&(arg->updates.do_list.do_cmd.erase.end_erase)]],
156: eraseAttr BOOLEAN
157: [[b arg->updates.do_list.do_cmd.erase.erase_attr]]
158: }
159: %{arg->updates.do_list.do_type = 7;
160: (void) enq(&ndq_queue,arg);%},
161: previousXarray [8] IMPLICIT NULL
162: %{arg->updates.do_list.do_type = 8;
163: (void) enq(&ndq_queue,arg);%},
164: previousYarray [9] IMPLICIT NULL
165: %{arg->updates.do_list.do_type = 9;
166: (void) enq(&ndq_queue,arg);%}
167: }
168:
169: COupdate
170: %{
171: TEXT_UPDATE *arg = (TEXT_UPDATE *)parm;
172: %}
173: ::= SEQUENCE
174: %{
175: if( !(arg = (TEXT_UPDATE *)malloc(sizeof(TEXT_UPDATE)) ))
176: adios (NULLCP, "out of memory");
177: arg->echo_sw = echo_sw;
178: arg->type_sw = CTRL_OBJ;
179: %}
180: {
181: coName PrintableString
182: [[s arg->updates.co_list.co_name]],
183:
184: objectUpdate CHOICE {
185: characterUpdate [0] IMPLICIT PrintableString
186: [[s arg->updates.co_list.co_cmd.char_update]]
187: %{arg->updates.co_list.co_type = 0;
188: (void) enq(&ndq_queue,arg);%},
189:
190: booleanUpdate [1] IMPLICIT SEQUENCE {
191: values [0] IMPLICIT BITSTRING
192: [[x arg->updates.co_list.co_cmd.bool_update.value $ arg->updates.co_list.co_cmd.bool_update.val_count]],
193:
194: mask [1] IMPLICIT BITSTRING
195: [[x arg->updates.co_list.co_cmd.bool_update.mask $ arg->updates.co_list.co_cmd.bool_update.mask_count]]
196: }
197: %{arg->updates.co_list.co_type = 1;
198: (void) enq(&ndq_queue,arg);%},
199:
200: symbolicUpdate [2] IMPLICIT INTEGER
201: [[i arg->updates.co_list.co_cmd.sym_update]]
202: %{arg->updates.co_list.co_type = 2;
203: (void) enq(&ndq_queue,arg);%},
204:
205: integerUpdate [3] IMPLICIT INTEGER
206: [[i arg->updates.co_list.co_cmd.int_update]]
207: %{arg->updates.co_list.co_type = 3;
208: (void) enq(&ndq_queue,arg);%},
209:
210: bitStringUpdate [4] IMPLICIT BITSTRING
211: %{ bitstr2int ($$,
212: arg->updates.co_list.co_cmd.bit_update.bitstring,
213: arg->updates.co_list.co_cmd.bit_update.bitcount);
214: arg->updates.co_list.co_type = 4;
215: (void) enq(&ndq_queue,arg);%}
216: }
217: }
218:
219: ExplicitPointer
220: %{
221: EX_POINTER *arg = (EX_POINTER *)parm;
222: %}
223: ::= SEQUENCE
224: %{ arg->x_true = 0;
225: arg->y_true = 0;
226: arg->z_true = 0;
227: %}
228: {
229: x [0] IMPLICIT INTEGER
230: [[i arg->x_value]]
231: %{arg->x_true = 1;%}
232: OPTIONAL,
233:
234: y [1] IMPLICIT INTEGER
235: [[i arg->y_value]]
236: %{arg->y_true = 1;%}
237: OPTIONAL,
238:
239: z [2] IMPLICIT INTEGER
240: [[i arg->z_value]]
241: %{arg->z_true = 1;%}
242: OPTIONAL
243: }
244:
245: Pointer
246: %{
247: POINTER *arg = (POINTER *)parm;
248: %}
249: ::= CHOICE {
250: current [0] IMPLICIT NULL
251: %{arg->ptr_type = 0;%},
252: start [1] IMPLICIT NULL
253: %{arg->ptr_type = 1;%},
254: startY [2] IMPLICIT NULL
255: %{arg->ptr_type = 2;%},
256: startX [3] IMPLICIT NULL
257: %{arg->ptr_type = 3;%},
258: end [4] IMPLICIT NULL
259: %{arg->ptr_type = 4;%},
260: endY [5] IMPLICIT NULL
261: %{arg->ptr_type = 5;%},
262: endX [6] IMPLICIT NULL
263: %{arg->ptr_type = 6;%},
264: coords [7] IMPLICIT ExplicitPointer [[p (PEPYPARM)&(arg->e_ptr)]]
265: %{arg->ptr_type = 7;%}
266: }
267:
268: AttrId
269: %{
270: ATTRIB *arg = (ATTRIB *)parm;
271: %}
272: ::= CHOICE {
273: graphCharRep [0] IMPLICIT INTEGER
274: [[i arg->attr_val]]
275: %{arg->attr_id = 0;%},
276:
277: foreColor [1] IMPLICIT INTEGER
278: [[i arg->attr_val]]
279: %{arg->attr_id = 1;%},
280:
281: backColor [2] IMPLICIT INTEGER
282: [[i arg->attr_val]]
283: %{arg->attr_id = 2;%},
284:
285: emphasis [3] IMPLICIT INTEGER
286: [[i arg->attr_val]]
287: %{arg->attr_id = 3;%},
288:
289: font [4] IMPLICIT INTEGER
290: [[i arg->attr_val]]
291: %{arg->attr_id = 4;%}
292: }
293:
294: AttrExtent
295: %{
296: ATTRIB *arg = (ATTRIB *)parm;
297: %}
298: ::= CHOICE {
299: global [0] IMPLICIT NULL
300: %{arg->attr_ext = 0;%},
301: addrExtent [1] IMPLICIT SEQUENCE {
302: beginning Pointer [[p (PEPYPARM)&(arg->beg_p)]],
303: ending Pointer [[p (PEPYPARM)&(arg->end_p)]]
304: }
305: %{arg->attr_ext = 1;%},
306: modalExtent [2] IMPLICIT NULL
307: %{arg->attr_ext = 2;%}
308: }
309:
310: END
311:
312: %{
313:
314: /*
315: * deq take something out of a fifo queue (a la knuth)
316: * elements are circularly linked
317: * q head points to last entry in queue
318: */
319:
320: TEXT_UPDATE *
321: deq( qhp )
322: register TEXT_UPDATE **qhp;
323: {
324: register TEXT_UPDATE *elem;
325:
326:
327: if( (elem = (*qhp)) != 0 )
328: {
329: elem = elem->ndq_elem;
330: (*qhp)->ndq_elem = elem->ndq_elem;
331: if( elem == elem->ndq_elem )
332: (*qhp) = 0;
333: }
334:
335: return( elem );
336: }
337:
338: /*
339: * enq enter something in a queue
340: * queue format is same as deq above
341: */
342:
343: enq( qhp,elem )
344: register TEXT_UPDATE **qhp;
345: register TEXT_UPDATE *elem;
346: {
347: register TEXT_UPDATE *liq;
348:
349: if( (liq = (*qhp)) == 0 )
350: (*qhp) = elem;
351: elem->ndq_elem = (*qhp)->ndq_elem;
352: (*qhp)->ndq_elem = elem;
353: (*qhp) = elem;
354:
355: return ( (int) liq ); /* last-in-queue zero, says queue was empty */
356: }
357:
358: /*
359: * fiq get the first in queue - no delinking
360: * return zero if nothing in queue
361: */
362:
363: TEXT_UPDATE *
364: fiq( qhp )
365: register TEXT_UPDATE **qhp;
366: {
367: register TEXT_UPDATE *e;
368:
369: if( (e = *qhp) != 0 ) /* something in queue */
370: e = e->ndq_elem; /* get first in queue */
371:
372: return( e ); /* return that value */
373: }
374: %}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.