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