Annotation of embedaddon/php/ext/mbstring/libmbfl/filters/mbfilter_jis.c, revision 1.1.1.2
1.1 misho 1: /*
2: * "streamable kanji code filter and converter"
3: * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
4: *
5: * LICENSE NOTICES
6: *
7: * This file is part of "streamable kanji code filter and converter",
8: * which is distributed under the terms of GNU Lesser General Public
9: * License (version 2) as published by the Free Software Foundation.
10: *
11: * This software is distributed in the hope that it will be useful,
12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: * GNU Lesser General Public License for more details.
15: *
16: * You should have received a copy of the GNU Lesser General Public
17: * License along with "streamable kanji code filter and converter";
18: * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
19: * Suite 330, Boston, MA 02111-1307 USA
20: *
21: * The author of this file:
22: *
23: */
24: /*
25: * The source code included in this files was separated from mbfilter_ja.c
26: * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
27: *
28: */
29:
30: #ifdef HAVE_CONFIG_H
31: #include "config.h"
32: #endif
33:
34: #include "mbfilter.h"
35: #include "mbfilter_jis.h"
36:
37: #include "unicode_table_cp932_ext.h"
38: #include "unicode_table_jis.h"
39:
40: static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter);
41: static int mbfl_filt_ident_2022jp(int c, mbfl_identify_filter *filter);
42:
43: const mbfl_encoding mbfl_encoding_jis = {
44: mbfl_no_encoding_jis,
45: "JIS",
46: "ISO-2022-JP",
47: NULL,
48: NULL,
1.1.1.2 ! misho 49: MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_SHFTCODE | MBFL_ENCTYPE_GL_UNSAFE
1.1 misho 50: };
51:
52: const mbfl_encoding mbfl_encoding_2022jp = {
53: mbfl_no_encoding_2022jp,
54: "ISO-2022-JP",
55: "ISO-2022-JP",
56: NULL,
57: NULL,
1.1.1.2 ! misho 58: MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_SHFTCODE | MBFL_ENCTYPE_GL_UNSAFE
1.1 misho 59: };
60:
61: const struct mbfl_identify_vtbl vtbl_identify_jis = {
62: mbfl_no_encoding_jis,
63: mbfl_filt_ident_common_ctor,
64: mbfl_filt_ident_common_dtor,
65: mbfl_filt_ident_jis
66: };
67:
68: const struct mbfl_identify_vtbl vtbl_identify_2022jp = {
69: mbfl_no_encoding_2022jp,
70: mbfl_filt_ident_common_ctor,
71: mbfl_filt_ident_common_dtor,
72: mbfl_filt_ident_2022jp
73: };
74:
75: const struct mbfl_convert_vtbl vtbl_jis_wchar = {
76: mbfl_no_encoding_jis,
77: mbfl_no_encoding_wchar,
78: mbfl_filt_conv_common_ctor,
79: mbfl_filt_conv_common_dtor,
80: mbfl_filt_conv_jis_wchar,
81: mbfl_filt_conv_common_flush
82: };
83:
84: const struct mbfl_convert_vtbl vtbl_wchar_jis = {
85: mbfl_no_encoding_wchar,
86: mbfl_no_encoding_jis,
87: mbfl_filt_conv_common_ctor,
88: mbfl_filt_conv_common_dtor,
89: mbfl_filt_conv_wchar_jis,
90: mbfl_filt_conv_any_jis_flush
91: };
92:
93: const struct mbfl_convert_vtbl vtbl_2022jp_wchar = {
94: mbfl_no_encoding_2022jp,
95: mbfl_no_encoding_wchar,
96: mbfl_filt_conv_common_ctor,
97: mbfl_filt_conv_common_dtor,
98: mbfl_filt_conv_jis_wchar,
99: mbfl_filt_conv_common_flush
100: };
101:
102: const struct mbfl_convert_vtbl vtbl_wchar_2022jp = {
103: mbfl_no_encoding_wchar,
104: mbfl_no_encoding_2022jp,
105: mbfl_filt_conv_common_ctor,
106: mbfl_filt_conv_common_dtor,
107: mbfl_filt_conv_wchar_2022jp,
108: mbfl_filt_conv_any_jis_flush
109: };
110:
111: #define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
112:
113: /*
114: * JIS => wchar
115: */
116: int
117: mbfl_filt_conv_jis_wchar(int c, mbfl_convert_filter *filter)
118: {
119: int c1, s, w;
120:
121: retry:
122: switch (filter->status & 0xf) {
123: /* case 0x00: ASCII */
124: /* case 0x10: X 0201 latin */
125: /* case 0x20: X 0201 kana */
126: /* case 0x80: X 0208 */
127: /* case 0x90: X 0212 */
128: case 0:
129: if (c == 0x1b) {
130: filter->status += 2;
131: } else if (c == 0x0e) { /* "kana in" */
132: filter->status = 0x20;
133: } else if (c == 0x0f) { /* "kana out" */
134: filter->status = 0;
135: } else if (filter->status == 0x10 && c == 0x5c) { /* YEN SIGN */
136: CK((*filter->output_function)(0xa5, filter->data));
137: } else if (filter->status == 0x10 && c == 0x7e) { /* OVER LINE */
138: CK((*filter->output_function)(0x203e, filter->data));
139: } else if (filter->status == 0x20 && c > 0x20 && c < 0x60) { /* kana */
140: CK((*filter->output_function)(0xff40 + c, filter->data));
141: } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) { /* kanji first char */
142: filter->cache = c;
143: filter->status += 1;
144: } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
145: CK((*filter->output_function)(c, filter->data));
146: } else if (c > 0xa0 && c < 0xe0) { /* GR kana */
147: CK((*filter->output_function)(0xfec0 + c, filter->data));
148: } else {
149: w = c & MBFL_WCSGROUP_MASK;
150: w |= MBFL_WCSGROUP_THROUGH;
151: CK((*filter->output_function)(w, filter->data));
152: }
153: break;
154:
155: /* case 0x81: X 0208 second char */
156: /* case 0x91: X 0212 second char */
157: case 1:
158: filter->status &= ~0xf;
159: c1 = filter->cache;
160: if (c > 0x20 && c < 0x7f) {
161: s = (c1 - 0x21)*94 + c - 0x21;
162: if (filter->status == 0x80) {
163: if (s >= 0 && s < jisx0208_ucs_table_size) {
164: w = jisx0208_ucs_table[s];
165: } else {
166: w = 0;
167: }
168: if (w <= 0) {
169: w = (c1 << 8) | c;
170: w &= MBFL_WCSPLANE_MASK;
171: w |= MBFL_WCSPLANE_JIS0208;
172: }
173: } else {
174: if (s >= 0 && s < jisx0212_ucs_table_size) {
175: w = jisx0212_ucs_table[s];
176: } else {
177: w = 0;
178: }
179: if (w <= 0) {
180: w = (c1 << 8) | c;
181: w &= MBFL_WCSPLANE_MASK;
182: w |= MBFL_WCSPLANE_JIS0212;
183: }
184: }
185: CK((*filter->output_function)(w, filter->data));
186: } else if (c == 0x1b) {
187: filter->status += 2;
188: } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
189: CK((*filter->output_function)(c, filter->data));
190: } else {
191: w = (c1 << 8) | c;
192: w &= MBFL_WCSGROUP_MASK;
193: w |= MBFL_WCSGROUP_THROUGH;
194: CK((*filter->output_function)(w, filter->data));
195: }
196: break;
197:
198: /* ESC */
199: /* case 0x02: */
200: /* case 0x12: */
201: /* case 0x22: */
202: /* case 0x82: */
203: /* case 0x92: */
204: case 2:
205: if (c == 0x24) { /* '$' */
206: filter->status++;
207: } else if (c == 0x28) { /* '(' */
208: filter->status += 3;
209: } else {
210: filter->status &= ~0xf;
211: CK((*filter->output_function)(0x1b, filter->data));
212: goto retry;
213: }
214: break;
215:
216: /* ESC $ */
217: /* case 0x03: */
218: /* case 0x13: */
219: /* case 0x23: */
220: /* case 0x83: */
221: /* case 0x93: */
222: case 3:
223: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
224: filter->status = 0x80;
225: } else if (c == 0x28) { /* '(' */
226: filter->status++;
227: } else {
228: filter->status &= ~0xf;
229: CK((*filter->output_function)(0x1b, filter->data));
230: CK((*filter->output_function)(0x24, filter->data));
231: goto retry;
232: }
233: break;
234:
235: /* ESC $ ( */
236: /* case 0x04: */
237: /* case 0x14: */
238: /* case 0x24: */
239: /* case 0x84: */
240: /* case 0x94: */
241: case 4:
242: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
243: filter->status = 0x80;
244: } else if (c == 0x44) { /* 'D' */
245: filter->status = 0x90;
246: } else {
247: filter->status &= ~0xf;
248: CK((*filter->output_function)(0x1b, filter->data));
249: CK((*filter->output_function)(0x24, filter->data));
250: CK((*filter->output_function)(0x28, filter->data));
251: goto retry;
252: }
253: break;
254:
255: /* ESC ( */
256: /* case 0x05: */
257: /* case 0x15: */
258: /* case 0x25: */
259: /* case 0x85: */
260: /* case 0x95: */
261: case 5:
262: if (c == 0x42 || c == 0x48) { /* 'B' or 'H' */
263: filter->status = 0;
264: } else if (c == 0x4a) { /* 'J' */
265: filter->status = 0x10;
266: } else if (c == 0x49) { /* 'I' */
267: filter->status = 0x20;
268: } else {
269: filter->status &= ~0xf;
270: CK((*filter->output_function)(0x1b, filter->data));
271: CK((*filter->output_function)(0x28, filter->data));
272: goto retry;
273: }
274: break;
275:
276: default:
277: filter->status = 0;
278: break;
279: }
280:
281: return c;
282: }
283:
284: /*
285: * wchar => JIS
286: */
287: int
288: mbfl_filt_conv_wchar_jis(int c, mbfl_convert_filter *filter)
289: {
290: int c1, s;
291:
292: s = 0;
293: if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
294: s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
295: } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
296: s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
297: } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) {
298: s = ucs_i_jis_table[c - ucs_i_jis_table_min];
299: } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) {
300: s = ucs_r_jis_table[c - ucs_r_jis_table_min];
301: }
302: if (s <= 0) {
303: c1 = c & ~MBFL_WCSPLANE_MASK;
304: if (c1 == MBFL_WCSPLANE_JIS0208) {
305: s = c & MBFL_WCSPLANE_MASK;
306: } else if (c1 == MBFL_WCSPLANE_JIS0212) {
307: s = c & MBFL_WCSPLANE_MASK;
308: s |= 0x8080;
309: } else if (c == 0xa5) { /* YEN SIGN */
310: s = 0x1005c;
311: } else if (c == 0x203e) { /* OVER LINE */
312: s = 0x1007e;
313: } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
314: s = 0x2140;
315: } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
316: s = 0x2141;
317: } else if (c == 0x2225) { /* PARALLEL TO */
318: s = 0x2142;
319: } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
320: s = 0x215d;
321: } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */
322: s = 0x2171;
323: } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */
324: s = 0x2172;
325: } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
326: s = 0x224c;
327: }
328: if (c == 0) {
329: s = 0;
330: } else if (s <= 0) {
331: s = -1;
332: }
333: }
334: if (s >= 0) {
335: if (s < 0x80) { /* ASCII */
336: if ((filter->status & 0xff00) != 0) {
337: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
338: CK((*filter->output_function)(0x28, filter->data)); /* '(' */
339: CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
340: }
341: filter->status = 0;
342: CK((*filter->output_function)(s, filter->data));
343: } else if (s < 0x100) { /* kana */
344: if ((filter->status & 0xff00) != 0x100) {
345: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
346: CK((*filter->output_function)(0x28, filter->data)); /* '(' */
347: CK((*filter->output_function)(0x49, filter->data)); /* 'I' */
348: }
349: filter->status = 0x100;
350: CK((*filter->output_function)(s & 0x7f, filter->data));
351: } else if (s < 0x8080) { /* X 0208 */
352: if ((filter->status & 0xff00) != 0x200) {
353: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
354: CK((*filter->output_function)(0x24, filter->data)); /* '$' */
355: CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
356: }
357: filter->status = 0x200;
358: CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
359: CK((*filter->output_function)(s & 0x7f, filter->data));
360: } else if (s < 0x10000) { /* X 0212 */
361: if ((filter->status & 0xff00) != 0x300) {
362: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
363: CK((*filter->output_function)(0x24, filter->data)); /* '$' */
364: CK((*filter->output_function)(0x28, filter->data)); /* '(' */
365: CK((*filter->output_function)(0x44, filter->data)); /* 'D' */
366: }
367: filter->status = 0x300;
368: CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
369: CK((*filter->output_function)(s & 0x7f, filter->data));
370: } else { /* X 0201 latin */
371: if ((filter->status & 0xff00) != 0x400) {
372: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
373: CK((*filter->output_function)(0x28, filter->data)); /* '(' */
374: CK((*filter->output_function)(0x4a, filter->data)); /* 'J' */
375: }
376: filter->status = 0x400;
377: CK((*filter->output_function)(s & 0x7f, filter->data));
378: }
379: } else {
380: if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
381: CK(mbfl_filt_conv_illegal_output(c, filter));
382: }
383: }
384:
385: return c;
386: }
387:
388:
389: /*
390: * wchar => ISO-2022-JP
391: */
392: int
393: mbfl_filt_conv_wchar_2022jp(int c, mbfl_convert_filter *filter)
394: {
395: int s;
396:
397: s = 0;
398: if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
399: s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
400: } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
401: s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
402: } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) {
403: s = ucs_i_jis_table[c - ucs_i_jis_table_min];
404: } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) {
405: s = ucs_r_jis_table[c - ucs_r_jis_table_min];
406: }
407: if (s <= 0) {
408: if (c == 0xa5) { /* YEN SIGN */
409: s = 0x1005c;
410: } else if (c == 0x203e) { /* OVER LINE */
411: s = 0x1007e;
412: } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
413: s = 0x2140;
414: } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
415: s = 0x2141;
416: } else if (c == 0x2225) { /* PARALLEL TO */
417: s = 0x2142;
418: } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
419: s = 0x215d;
420: } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */
421: s = 0x2171;
422: } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */
423: s = 0x2172;
424: } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
425: s = 0x224c;
426: }
427: if (c == 0) {
428: s = 0;
429: } else if (s <= 0) {
430: s = -1;
431: }
432: } else if ((s >= 0x80 && s < 0x2121) || (s > 0x8080)) {
433: s = -1;
434: }
435: if (s >= 0) {
436: if (s < 0x80) { /* ASCII */
437: if ((filter->status & 0xff00) != 0) {
438: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
439: CK((*filter->output_function)(0x28, filter->data)); /* '(' */
440: CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
441: }
442: filter->status = 0;
443: CK((*filter->output_function)(s, filter->data));
444: } else if (s < 0x10000) { /* X 0208 */
445: if ((filter->status & 0xff00) != 0x200) {
446: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
447: CK((*filter->output_function)(0x24, filter->data)); /* '$' */
448: CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
449: }
450: filter->status = 0x200;
451: CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
452: CK((*filter->output_function)(s & 0x7f, filter->data));
453: } else { /* X 0201 latin */
454: if ((filter->status & 0xff00) != 0x400) {
455: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
456: CK((*filter->output_function)(0x28, filter->data)); /* '(' */
457: CK((*filter->output_function)(0x4a, filter->data)); /* 'J' */
458: }
459: filter->status = 0x400;
460: CK((*filter->output_function)(s & 0x7f, filter->data));
461: }
462: } else {
463: if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
464: CK(mbfl_filt_conv_illegal_output(c, filter));
465: }
466: }
467:
468: return c;
469: }
470:
471: int
472: mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter)
473: {
474: /* back to latin */
475: if ((filter->status & 0xff00) != 0) {
476: CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
477: CK((*filter->output_function)(0x28, filter->data)); /* '(' */
478: CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
479: }
480: filter->status &= 0xff;
481:
482: if (filter->flush_function != NULL) {
483: return (*filter->flush_function)(filter->data);
484: }
485:
486: return 0;
487: }
488:
489: static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter)
490: {
491: retry:
492: switch (filter->status & 0xf) {
493: /* case 0x00: ASCII */
494: /* case 0x10: X 0201 latin */
495: /* case 0x20: X 0201 kana */
496: /* case 0x80: X 0208 */
497: /* case 0x90: X 0212 */
498: case 0:
499: if (c == 0x1b) {
500: filter->status += 2;
501: } else if (c == 0x0e) { /* "kana in" */
502: filter->status = 0x20;
503: } else if (c == 0x0f) { /* "kana out" */
504: filter->status = 0;
505: } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) { /* kanji first char */
506: filter->status += 1;
507: } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
508: ;
509: } else {
510: filter->flag = 1; /* bad */
511: }
512: break;
513:
514: /* case 0x81: X 0208 second char */
515: /* case 0x91: X 0212 second char */
516: case 1:
517: filter->status &= ~0xf;
518: if (c == 0x1b) {
519: goto retry;
520: } else if (c < 0x21 || c > 0x7e) { /* bad */
521: filter->flag = 1;
522: }
523: break;
524:
525: /* ESC */
526: case 2:
527: if (c == 0x24) { /* '$' */
528: filter->status++;
529: } else if (c == 0x28) { /* '(' */
530: filter->status += 3;
531: } else {
532: filter->flag = 1; /* bad */
533: filter->status &= ~0xf;
534: goto retry;
535: }
536: break;
537:
538: /* ESC $ */
539: case 3:
540: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
541: filter->status = 0x80;
542: } else if (c == 0x28) { /* '(' */
543: filter->status++;
544: } else {
545: filter->flag = 1; /* bad */
546: filter->status &= ~0xf;
547: goto retry;
548: }
549: break;
550:
551: /* ESC $ ( */
552: case 4:
553: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
554: filter->status = 0x80;
555: } else if (c == 0x44) { /* 'D' */
556: filter->status = 0x90;
557: } else {
558: filter->flag = 1; /* bad */
559: filter->status &= ~0xf;
560: goto retry;
561: }
562: break;
563:
564: /* ESC ( */
565: case 5:
566: if (c == 0x42 || c == 0x48) { /* 'B' or 'H' */
567: filter->status = 0;
568: } else if (c == 0x4a) { /* 'J' */
569: filter->status = 0x10;
570: } else if (c == 0x49) { /* 'I' */
571: filter->status = 0x20;
572: } else {
573: filter->flag = 1; /* bad */
574: filter->status &= ~0xf;
575: goto retry;
576: }
577: break;
578:
579: default:
580: filter->status = 0;
581: break;
582: }
583:
584: return c;
585: }
586:
587: static int mbfl_filt_ident_2022jp(int c, mbfl_identify_filter *filter)
588: {
589: retry:
590: switch (filter->status & 0xf) {
591: /* case 0x00: ASCII */
592: /* case 0x10: X 0201 latin */
593: /* case 0x80: X 0208 */
594: case 0:
595: if (c == 0x1b) {
596: filter->status += 2;
597: } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
598: filter->status += 1;
599: } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
600: ;
601: } else {
602: filter->flag = 1; /* bad */
603: }
604: break;
605:
606: /* case 0x81: X 0208 second char */
607: case 1:
608: if (c == 0x1b) {
609: filter->status++;
610: } else {
611: filter->status &= ~0xf;
612: if (c < 0x21 || c > 0x7e) { /* bad */
613: filter->flag = 1;
614: }
615: }
616: break;
617:
618: /* ESC */
619: case 2:
620: if (c == 0x24) { /* '$' */
621: filter->status++;
622: } else if (c == 0x28) { /* '(' */
623: filter->status += 3;
624: } else {
625: filter->flag = 1; /* bad */
626: filter->status &= ~0xf;
627: goto retry;
628: }
629: break;
630:
631: /* ESC $ */
632: case 3:
633: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
634: filter->status = 0x80;
635: } else {
636: filter->flag = 1; /* bad */
637: filter->status &= ~0xf;
638: goto retry;
639: }
640: break;
641:
642: /* ESC ( */
643: case 5:
644: if (c == 0x42) { /* 'B' */
645: filter->status = 0;
646: } else if (c == 0x4a) { /* 'J' */
647: filter->status = 0x10;
648: } else {
649: filter->flag = 1; /* bad */
650: filter->status &= ~0xf;
651: goto retry;
652: }
653: break;
654:
655: default:
656: filter->status = 0;
657: break;
658: }
659:
660: return c;
661: }
662:
663:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>