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