|
|
1.1 root 1: #include <X/mit-copyright.h>
2:
3: /* Copyright 1985 by the Massachusetts Institute of Technology */
4: /*
5: * Parse and unparse ANSI sequences.
6: */
7: #include <stdio.h>
8: #include <X/Xlib.h>
9: #include "ptyx.h"
10:
11: parseseq(c, ap, tek)
12: register int c;
13: register ANSI *ap;
14: {
15: /*
16: * Start up sequence if this is a sequence introducer.
17: */
18: if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC) {
19: ap->a_type = c;
20: ap->a_pintro = 0;
21: ap->a_final = 0;
22: ap->a_inters = 0;
23: ap->a_nparam = 0;
24: ap->a_nastyf = 0;
25: return (-1);
26: }
27: /*
28: * Just pass the character through if not in a sequence.
29: */
30: if (ap->a_type == 0)
31: return (c);
32: /*
33: * Abort on C1 control, cancel or random communication error.
34: */
35: if ((c>=0x80 && c<=0x9F)) {
36: ap->a_type = 0;
37: ap->a_pintro = 0;
38: ap->a_final = 0;
39: return (c);
40: }
41: /*
42: * C0 control characters are passed through in the middle,
43: * except for a couple of special ones in Tek mode.
44: */
45: if (c<0x20 || c==DEL || c==RDEL) {
46: if (tek
47: && ap->a_pintro==0
48: && ap->a_final==0
49: && ap->a_inters==0
50: && ap->a_nparam==0
51: && ap->a_nastyf==0) {
52: if (ap->a_type==ESC && (c==FF || c==SUB || c==INQ))
53: goto finalchar;
54: if (ap->a_type==CSI && c==US)
55: goto finalchar;
56: }
57: if (c==CAN || c==SUB) {
58: ap->a_type = 0;
59: ap->a_pintro = 0;
60: ap->a_final = 0;
61: }
62: return (c);
63: }
64: c &= 0x7F;
65: /*
66: * Intermediate characters.
67: */
68: if (c>=0x20 && c<=0x2F) {
69: ap->a_inters <<= 8;
70: ap->a_inters |= c;
71: return (-1);
72: }
73: /*
74: * Parameter character in DCS, CSI, et al.
75: */
76: if (ap->a_type!=ESC && c>=0x30 && c<=0x3F) {
77: if (ap->a_inters != 0)
78: ap->a_nastyf = 1;
79: /*
80: * Only "?" and "<" are legal at Digital.
81: */
82: if (c >= 0x3C) {
83: if (ap->a_pintro != 0 || ap->a_nparam != 0)
84: ap->a_nastyf = 1;
85: ap->a_pintro = c;
86: return (-1);
87: }
88: /*
89: * set the default flag and init param value to 0
90: * if we haven't seen any param's yet.
91: */
92: if (ap->a_nparam == 0) {
93: ap->a_dflt[ap->a_nparam] = 1;
94: ap->a_param[ap->a_nparam++] = 0;
95: }
96: /*
97: * ";" or ":", only the ";" is legal at Digital.
98: */
99: if (c >= 0x3A) {
100: if (c != 0x3B || ap->a_nparam >= NPARAM)
101: ap->a_nastyf = 1;
102: else {
103: ap->a_dflt[ap->a_nparam] = 1;
104: ap->a_param[ap->a_nparam++] = 0;
105: }
106: return (-1);
107: }
108: /*
109: * Part of a numeric parameter.
110: * Clear the default flag for this param.
111: */
112: ap->a_dflt[ap->a_nparam-1] = 0;
113: ap->a_param[ap->a_nparam-1] *= 10;
114: ap->a_param[ap->a_nparam-1] += c - 0x30;
115: return (-1);
116: }
117: /*
118: * C1 control in its 7 bit ESC Fe representation.
119: */
120: if (ap->a_type==ESC && ap->a_inters==0 && c>=0x40 && c<=0x5F) {
121: c += 0x40;
122: /*
123: * May need to start up a new sequence.
124: */
125: if (c!=DCS && c!=CSI && c!=OSC && c!=PM && c!=APC) {
126: ap->a_type = 0;
127: ap->a_pintro = 0;
128: ap->a_final = 0;
129: return (c);
130: }
131: ap->a_type = c;
132: ap->a_pintro = 0;
133: ap->a_final = 0;
134: ap->a_nastyf = 0;
135: return (-1);
136: }
137: /*
138: * Final character in sequence.
139: */
140: finalchar:
141: ap->a_final = c;
142: return (ap->a_type);
143: }
144:
145: unparseseq(ap, tx8flag, fd)
146: register ANSI *ap;
147: {
148: register int c;
149: register int i;
150: register int inters;
151:
152: c = ap->a_type;
153: if (c>=0x80 && c<=0x9F && tx8flag==0) {
154: unparseputc(ESC, fd);
155: c -= 0x40;
156: }
157: unparseputc(c, fd);
158: c = ap->a_type;
159: if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC) {
160: if (ap->a_pintro != 0)
161: unparseputc(ap->a_pintro, fd);
162: for (i=0; i<ap->a_nparam; ++i) {
163: if (i != 0)
164: unparseputc(';', fd);
165: if (ap->a_param[i] != 0)
166: unparseputn(ap->a_param[i], fd);
167: }
168: inters = ap->a_inters;
169: for (i=3; i>=0; --i)
170: c = (inters >> (8*i)) & 0xff;
171: if (c != 0)
172: unparseputc(c, fd);
173: unparseputc(ap->a_final, fd);
174: }
175: }
176:
177: unparseputn(n, fd)
178: unsigned int n;
179: {
180: unsigned int q;
181:
182: q = n/10;
183: if (q != 0)
184: unparseputn(q, fd);
185: unparseputc((n%10) + '0', fd);
186: }
187:
188: unparseputc(c, fd)
189: {
190: char buf[1];
191:
192: buf[0] = c;
193: if (write(fd, buf, 1) != 1)
194: Panic("unparseputc: error writing character\n", 0);
195: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.