OpenSolaris_b135/cmd/geniconvtbl/samples/eucJP_to_ISO-2022-JP.src


// 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
//
// ident	"%Z%%M%	%I%	%E% SMI"

//
// eucJP to SJIS
//


#include <sys/errno.h>
#define	SS2	0x008e
#define	SS3	0x008f

eucJP%SJIS {
	operation init {
		cs = 0;
		offset = 0;
	};

	direction {

		condition {
			cs == 2;
		} operation {
			output = input[0];
			cs = 0;
			discard;
		};

		condition {
			cs == 1;
		} operation {
			var_input = input[0] & 0x7f;
			var_input = var_input + offset; 
			if (var_input >= 0x7f) {
				var_input = var_input + 0x01; 
			}
			output = var_input;
			cs = 0;
			discard;
		};

		condition { 
			between 0x00 ... 0x7f ;
		} operation {
			if ( outputsize < 1 ) {
				error E2BIG;
			}
			output = input[0];
			discard;
		};

		condition {
			between SS2 ... SS2 ;
		} operation {
			// Note this, in the .c file check is made
			// against ileft > 0 ,  but it's since the
			// ileft is already decremented.

			if ( inputsize > 1 ) {
				if ( ( input[1] >= 0xa1 ) && ( input[1] <= 0xfe )) {
					if (outputsize < 1 ) {
						error E2BIG;
					}
					cs = 2;
				} else {
					error EILSEQ;
				}
			} else {
				error EINVAL;
			}
		};

		condition {
			between 0xa1 ... 0xfe;
		} operation {
			if ( inputsize > 1 ) {
				if ( ( input[1]   >= 0xa1 ) && (  input[1]  <= 0xfe)) {
					if ( outputsize < 2 ) {
						error E2BIG;
					}

					cs = 1;
					var_input = input[0] & 0x7f;
					if ( var_input & 0x01) {
						offset = 0x1f;
					} else {
						offset = 0x7d;
					}
					var_input = ((var_input - 0x21 ) >> 1) + 0x81;
					if ( var_input > 0x9f ) {
						var_input = var_input + 0x40;
					}
					output = var_input;
					discard;

				} else {
					error EINVAL;
				}
			} else {
				error EILSEQ;
			}
		};

		true operation {
			error EILSEQ;
		};
	};
	
}