OpenSolaris_b135/cmd/geniconvtbl/samples/ISO-2022-JP_to_eucJP.src

// ident	"%Z%%M%	%I%	%E% SMI"
// Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
// Use is subject to license terms.
//
// CDDL HEADER START
//
// The contents of this file are subject to the terms of the
// Common Development and Distribution License, Version 1.0 only
// (the "License").  You may not use this file except in compliance
// with the License.
//
// You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
// or http://www.opensolaris.org/os/licensing.
// See the License for the specific language governing permissions
// and limitations under the License.
//
// When distributing Covered Code, include this CDDL HEADER in each
// file and include the License file at usr/src/OPENSOLARIS.LICENSE.
// If applicable, add the following below this CDDL HEADER, with the
// fields enclosed by brackets "[]" replaced with your own identifying
// information: Portions Copyright [yyyy] [name of copyright owner]
//
// CDDL HEADER END
//

//
// ISO-2022-JP to eucJP
//

#include <sys/errno.h>

ISO-2022-JP%eucJP {
	operation init {
		cs = 0;
	};

	operation reset {
		if (cs != 0) {
			// Emit state reset sequence, ESC ( J, for
			// ISO-2022-JP.
			output = 0x1b284a;
		}
		operation init;
	};

	direction {
		condition {		// JIS X 0201 Latin (ASCII)
			between	0x00...0x7f;
		} operation {
			if (cs != 0) {
				// We will emit four bytes.
				if (outputsize <= 3) {
					error E2BIG;
				}
				// Emit state reset sequence, ESC ( J.
				output = 0x1b284a;
				cs = 0;
			} else {
				if (outputsize <= 0) {
					error E2BIG;
				}
			}
			output = input[0];

			// Move input buffer pointer one byte.
			discard;
		};

		condition {		// JIS X 0208
			between	0xa1a1...0xfefe;
		} operation {
			if (cs != 1) {
				if (outputsize <= 4) {
					error E2BIG;
				}
				// Emit JIS X 0208 sequence, ESC $ B.
				output = 0x1b2442;
				cs = 1;
			} else {
				if (outputsize <= 1) {
					error E2BIG;
				}
			}
			output = (input[0] & 0x7f);
			output = (input[1] & 0x7f);

			// Move input buffer pointer two bytes.
			discard 2;
		};

		condition {		// JIS X 0201 Kana
			between	0x8ea1...0x8edf;
		} operation {
			if (cs != 2) {
				if (outputsize <= 3) {
					error E2BIG;
				}
				// Emit JIS X 0201 Kana sequence,
				// ESC ( I.
				output = 0x1b2849;
				cs = 2;
			} else {
				if (outputsize <= 0) {
					error E2BIG;
				}
			}
			output = (input[1] & 127);

			// Move input buffer pointer two bytes.
			discard 2;
		};

		condition {		// JIS X 0212
			between	0x8fa1a1...0x8ffefe;
		} operation {
			if (cs != 3) {
				if (outputsize <= 5) {
					error E2BIG;
				}
				// Emit JIS X 0212 sequence, ESC $ ( D.
				output = 0x1b242844;
				cs = 3;
			} else {
				if (outputsize <= 1) {
					error E2BIG;
				}
			}
			output = (input[1] & 127);
			output = (input[2] & 127);
			discard 3;
		};
	
		true	operation {	// error
			error EILSEQ;
		};
	};
}