1/* getchr.c */
2/*****************************************************************************
3					�s�������@�o�����������������@�w�s�q
4
5							�m�e�L�X�g���́n
6*****************************************************************************/
7
8#include "xtr.h"
9
10#ifdef UNIX
11#define is_kanji(c) ismbuchar(c)
12#define is_kanji2(c) ismblchar(c)
13#else
14#define is_kanji(c) iskanji(c)
15#define is_kanji2(c) iskanji2(c)
16#endif
17#define SBufErr()			FError(f_SBufErr)
18#define IBufErr()			FError(f_IBufErr)
19static uchar f_SBufErr[] = "Source buffer over";
20static uchar f_IBufErr[] = "Input buffer over";
21
22
23/****************************************************************************/
24/*							�e�L�X�g����									*/
25/***************************** GetChr ***************************************/
26
27unsigned
28GetChr(void)
29/*  �ꕶ���ǂ� */
30{
31	int c1, c2;
32
33	if (sbufp == SBUFBTM) {
34#ifdef UNIX
35		if (inmtextflag || (c1 = getc(ifp)) == EOF)
36		  return EOF2;
37
38#ifndef __human68k__
39		if (!binarymode && c1 == '\r')
40			if ((c2 = getc(ifp)) == '\n')
41				c1 = c2;
42			else
43				ungetc(c2, ifp);
44#endif
45#else /* !UNIX */
46		if (inmtextflag || (c1 = getc(ifp)) == EOF ||
47						   c1 == EOFCHAR && !binarymode)
48			return (EOF2);
49#endif /* !UNIX */
50		if (is_kanji(c1) && !nokanjimode) {
51			if ((c2 = getc(ifp)) == EOF)
52				return (c1);
53			else if (is_kanji2(c2))
54#ifdef UNIX
55				return (*MB2S)(c1, c2);
56#else
57				return (MkMoji(c1, c2));
58#endif
59			else {
60				if (c2 == '\n') {
61					nlcount++;
62				}
63				UngetChr(c2);
64				return (c1);
65			}
66		} else {
67			if (c1 == '\n')
68				nlcount++;
69			return (c1);
70		}
71	} else {
72		assert(sbufp < SBUFBTM);
73		c1 = *sbufp++;
74		if (iskanji(c1) && !nokanjimode && sbufp < SBUFBTM) {
75			c2 = *sbufp++;
76			if (iskanji2(c2))
77				return (MkMoji(c1, c2));
78			else {
79				UngetChr(c2);
80				return (c1);
81			}
82		} else {
83			return (c1);
84		}
85	}
86}
87
88
89void
90UngetChr(unsigned c)
91/* �P�����߂� */
92{
93	if (c == EOF2)
94		return;
95
96	if (sbufp <= sbuf)
97		SBufErr();
98
99	if (Is1B(c)) {
100		*--sbufp = c;
101	} else {
102		*--sbufp = Moji_2(c);
103		if (sbufp <= sbuf)
104			SBufErr();
105
106		*--sbufp = Moji_1(c);
107	}
108}
109
110
111void
112UngetN(const uchar *str, int n)
113/* ������ str �� n �o�C�g��߂� */
114{
115	if (sbufp - n < sbuf)
116		SBufErr();
117
118	sbufp -= n;
119	memcpy(sbufp, str, n);
120
121#if MSDOS || WINNT || __human68k__
122	/* �}�N���Ŗ������[�v�ɂ��������Ă� ^C �Œ��f�ł���悤�� */
123	(void)kbhit();
124#endif
125}
126
127
128static int lookflag = OFF;
129
130unsigned
131LookChr(void)
132/* �ꕶ����ǂ݂��� */
133{
134	unsigned c;
135
136	if (!lookflag) {
137		lookflag = ON;
138		ibufp = ibuf;
139	}
140	if ((c = GetChr()) != EOF2)
141		ibufp += SetMoji(c, ibufp);
142	return (c);
143}
144
145
146
147void
148UnlookChrs(void)
149/* ��ǂ݂�������߂� */
150{
151	UngetN(ibuf, ibufp - ibuf);
152	ibufp = ibuf;
153	lookflag = OFF;
154}
155
156
157
158int
159GetStr(int n, int gmode)
160/* ���o�C�g�܂ŁA�������A�Ōオ�X�y�[�X�E�^�u�Ȃ炳��ɔ�����������s�܂�
161 * �ǂ�� ibuf �Ɋi�[�A���ۂɓǂ��o�C�g����Ԃ��B
162 */
163{
164	unsigned c = 0;
165
166	for (ibufp = ibuf;
167			(ibufp - ibuf < n || (gmode & G_WILD)) && (c = GetChr()) != EOF2;
168			) {
169		ibufp += SetMoji(c, ibufp);
170		if (c == '\n' && (!(gmode & G_OVERNL) || ibufp - ibuf > n))
171			break;
172	}
173
174	if (IsHSpace(c)) {
175		while ((c = GetChr()) != EOF2
176			   && (ibufp += SetMoji(c, ibufp), IsHSpace(c)) );
177	}
178
179	if (ibufp >= ibuf + IBUFSIZE)
180		IBufErr();
181
182	*ibufp = '\0';
183	return ibufp - ibuf;
184}
185
186
187void
188UngetStrN(int n)
189/* ���o�C�g�߂� */
190{
191	assert(ibufp - n >= ibuf);
192	UngetN(ibufp - n, n);
193}
194
195
196
197void
198GetSkipSpace(void)
199/* ��ǂ݂��ăX�y�[�X���Ƃ΂� */
200{
201	unsigned c;
202
203	while (c = GetChr(), IsHSpace(c));
204
205	UngetChr(c);
206}
207
208
209int
210GetLine(void)
211/* ���s�܂œǂ�ʼn��s���܂� ibuf �Ɋi�[����B
212 * �ǂݍ�����������Ԃ��B
213 * cont_enable_flag ���^�̏ꍇ�͌p���s���”\�Ƃ���B
214 * �i���s�̑O�̕����� '\\' �������Ȃ玟�̍s���ǂށj
215 */
216{
217	unsigned c = 0;
218	ibufp = ibuf;
219
220	while (c != '\n' && (c = GetChr()) != EOF2) {
221		if (ibufp >= ibuf + IBUFSIZE - 2)
222			IBufErr();
223
224		ibufp += SetMoji(c, ibufp);
225	}
226	*ibufp = '\0';
227	return ibufp - ibuf;
228}
229
230
231void
232ILineNoCount(void)
233{
234	if (sbufp == SBUFBTM) {
235		/* �\�[�X�e�L�X�g�o�b�t�@����Ȃ� */
236		ilineno = nlcount + 1;	/* ���͍s�ԍ������s���ɂ��킹�� */
237	} else if (!inmtextflag) {
238		ilineno++;		/* ���͍s�ԍ����J�E���g */
239	}
240}
241
242/*
243 * Local variables:
244 * mode: c
245 * c-indent-level: 4
246 * c-continued-statement-offset: 4
247 * c-brace-offset: -4
248 * c-argdecl-indent: 4
249 * c-label-offset: -4
250 * tab-width: 4
251 * tab-stop-list: (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80)
252 * End:
253 */
254