1 /* putchr.c */
2 /*****************************************************************************
3 �ԣ�������У�������أԣ�
4
5 �Υ饤��Хåե�������
6 *****************************************************************************/
7
8 #include "xtr.h"
9
10 /****************************************************************************/
11 /* �饤��Хåե��ؤν��� */
12 /****************************** PutChr **************************************/
13
14 static int kanjiflag;
15 static int kikocnt;
16 static int kksize;
17
18 void
PutChr(unsigned c)19 PutChr(unsigned c)
20 {
21 int x0 = x;
22
23 switch (c) {
24 case '\f':
25 case '\r':
26 case '\v':
27 if (mada_start_of_line) {
28 if (c == '\f')
29 WritePage();
30 else
31 Write1(c);
32 } else {
33 nonewlineflag = ON;
34 WriteLine();
35 if (c == '\f')
36 WritePage();
37 else
38 Write1(c);
39 }
40 InitParag();
41 break;
42 case '\n':
43 WriteLine();
44 InitParag();
45 break;
46 case '\t':
47 if (tabtospmode) {
48 /* ���ֳִ֤dz���ڤ�ʤ�����ǥ�Ȥ��դ����Ƥ�ɽ�ʤɤ�
49 �ѷ����ʤ��褦�� bindent ����ˤ��Ƥ��뤳�Ȥ���� */
50 PutChrN(skmode ? alttabsp : SP, /* sk+ �ʤ����̤ʥ��ڡ������Ѵ� */
51 itabstop - ((x< bindent? x : x - bindent) % itabstop));
52 } else if (x >= MAXWIDTH) {
53 /* ���֤��Ѵ����ʤ��⡼�ɤǡ��饤��Хåե����⤦���äѤ��ʤ� */
54 PutChr1('\t');
55 } else {
56 /* ���֤��Ѵ����ʤ��⡼�ɤʤ顤���ֳִ֤dz���ڤ�ʤ�����ǥ�Ȥ�
57 �դ������ɽ�ʤɤ��ѷ�����Τϻ������ʤ� */
58 *lbv[x] = '\t';
59 for (x++; x % itabstop; x++)
60 lbv[x] = lbv[x0];
61 lbv[x] = lbv[x0] + 1;
62 }
63 break;
64 default:
65 PutChr1(c);
66 break;
67 }
68 }
69
70
71
72 void
PutChr1(unsigned c)73 PutChr1(unsigned c)
74 {
75 register int x0 = x;
76 register int w;
77 static int burasageflag = OFF;
78
79 if (anktohwmode && !nocntrlmode && Is1B(c))
80 c = ANKtoHW(c);
81
82 if (Is1B(c)) {
83 if (kanjiflag) {
84 kikocnt++;
85 kanjiflag = OFF;
86 }
87 w = 1;
88 } else {
89 if (!kanjiflag) {
90 kikocnt++;
91 kanjiflag = ON;
92 }
93 w = (IsHW(c) ? 1 : 2);
94 }
95 if (wexpmodeno != 0) {
96 if ((c_wide || c_qexpand) && !madaindentflag)
97 /* �ܳѻ�����ǡ�����ǥ����ʬ�Ǥʤ��ʤ� */
98 w *= 2; /* ���ܤ����ˤ��� */
99 if (c_half && !madaindentflag && w >= 2)
100 /* Ⱦ�ѻ�����ǡ�����ǥ����ʬ�Ǥʤ��ʤ� */
101 w /= 2; /* �����������ˤ��� */
102 }
103 while (++x < x0 + w)
104 lbv[x] = lbv[x0];
105 lbv[x] = lbv[x0] + SetMoji(c, lbv[x0]);
106
107 if (wexpmodeno == 1 || wexpmodeno == 2) {
108 /* ���ߡ����ڡ����Dz������ɤ��Ȥ���⡼�ɤξ�� */
109 if (w == 4) {
110 *lbv[x]++ = SP;
111 *lbv[x]++ = SP;
112 } else if (w == 2 && IsHan(c)) {
113 *lbv[x]++ = SP;
114 }
115 }
116 if (wlmode &&
117 ((wlrem = wlimit - (lbv[x] - lbuf + kikocnt * kksize)) < 0)) {
118 Wrap(x0);
119 burasageflag = OFF;
120 } else if (wrapmode) {
121 if (x > width) {
122 if (!oidasimode && !kxmode && !burasageflag && x0 <= width &&
123 (IsHSpace(c) || Member(c, gtkinsoku)
124 && !Member(c, gtkinsoku2))) {
125 /* ���ξ�� width ��ۤ��Ƥ⤹���˹Ԥ��ޤ�ʤ� */
126 burasageflag = ON;
127 } else {
128 Wrap(x0);
129 burasageflag = OFF;
130 }
131 } else {
132 burasageflag = OFF;
133 }
134 } else if (x > MAXWIDTH) {
135 nonewlineflag = ON;
136 WriteLine();
137 lineoverflag = ON;
138 }
139 }
140
141
142
143
144 void
InitLine(void)145 InitLine(void)
146 {
147 lbv[x = 0] = lbuf;
148
149 kanjiflag = OFF;
150 kikocnt = 0;
151 kksize = wkmode ? kikosize : c_kicode ? c_kicode->rpllen : 0;
152 wlrem = wlimit;
153
154 }
155
156
157
158 void
AdjKIKO(const uchar * s,int n)159 AdjKIKO(const uchar *s, int n)
160 /* Wrap ���ɤ��Ф���ʸ�����KI/KO ������ƥ������������� */
161 {
162 if (nokanjimode)
163 return;
164
165 while (n > 0) {
166 if (iskanji(*s)) {
167 if (!kanjiflag) {
168 kanjiflag = ON;
169 kikocnt++;
170 }
171 s += 2;
172 n -= 2;
173 } else {
174 if (kanjiflag) {
175 kanjiflag = OFF;
176 kikocnt++;
177 }
178 s++;
179 n--;
180 }
181 }
182 }
183
184
185 void
PutChrN(unsigned c,int n)186 PutChrN(unsigned c, int n)
187 {
188 if (szmode && IsHanSp(c)) {
189 PutChrN(ZENSP, n / 2); /* ���ѥ��ڡ������Ѵ� */
190 n %= 2; /* �����ʤ餢�ޤ꣱ */
191 }
192 while (--n >= 0)
193 PutChr(c);
194 }
195
196
197 void
DelSpaces(void)198 DelSpaces(void)
199 {
200 int i;
201 unsigned c;
202
203 for ( ;
204 x > 0 && (i = PrevCol(x), c = Moji(lbv[i]), IsHSpace(c))
205 /* ���楳���ɤ������ޤ�Ƥ��ʤ��� */
206 && !IsAttribCol(i);
207 x = i);
208 }
209
210
211 void
PutStr(const uchar * str)212 PutStr(const uchar *str)
213 {
214 unsigned c;
215
216 while ((c = RdMoji(str)) != '\0') {
217 PutChr(c);
218 }
219 }
220
221
222 void
PutStrN(const uchar * str,int n)223 PutStrN(const uchar *str, int n)
224 {
225 const uchar *p = str;
226
227 while (p - str < n) {
228 PutChr(RdMoji(p));
229 }
230 }
231
232
233 void
PutCntrl(def_t * cntrl)234 PutCntrl(def_t *cntrl)
235 {
236 if (nocntrlmode)
237 return;
238
239 if (cntrl && ExtractCntrl(cntrl, 0)) {
240 memcpy(lbv[x], cbuf, clength);
241 lbv[x] += clength;
242 }
243 }
244
245
246 void
PutCntrl1(const uchar * p,int len)247 PutCntrl1(const uchar *p, int len)
248 {
249 if (nocntrlmode)
250 return;
251
252 memcpy(lbv[x], p, len);
253 lbv[x] += len;
254 }
255
256
257 void
ReputCntrl(def_t * cntrl)258 ReputCntrl(def_t *cntrl)
259 /* cntrl ����Ϥ������Ȥǰ��˲������Ƥ��ޤä�ʸ������������ */
260 {
261 if (nocntrlmode)
262 return;
263 if (cntrl && ExtractReputCntrl(cntrl)) {
264 memcpy(lbv[x], cbuf, clength);
265 lbv[x] += clength;
266 }
267 }
268
269
270 void
PutResetCntrl(def_t * cntrl,def_t * rescntrl)271 PutResetCntrl(def_t *cntrl, def_t *rescntrl)
272 {
273 if (nocntrlmode)
274 return;
275
276 ExtractResetCntrl(cntrl, rescntrl);
277 memcpy(lbv[x], cbuf, clength);
278 lbv[x] += clength;
279 }
280
281
282 int
PrevCol(int col)283 PrevCol(int col)
284 /* ����ʸ���η���֤��֤� */
285 {
286 for (--col; col > 0 && lbv[col] == lbv[col - 1]; --col);
287 return col;
288 }
289
290
291 int
NextCol(int col)292 NextCol(int col)
293 /* ����ʸ���η���֤��֤� */
294 {
295 for (col++; col < x && lbv[col] == lbv[col - 1]; col++);
296 return col;
297 }
298
299
300 int
IsAttribCol(int col)301 IsAttribCol(int col)
302 /* ʸ�������դ��η夫Ĵ�٤� */
303 {
304 uchar *p = lbv[col];
305
306 assert(col >= 0 && col < x);
307
308 return SkipMoji(p) < lbv[NextCol(col)];
309 }
310
311 /*
312 * Local variables:
313 * mode: c
314 * c-indent-level: 4
315 * c-continued-statement-offset: 4
316 * c-brace-offset: -4
317 * c-argdecl-indent: 4
318 * c-label-offset: -4
319 * tab-width: 4
320 * tab-stop-list: (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80)
321 * End:
322 */
323