1
2// Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3// Use is subject to license terms.
4//
5// CDDL HEADER START
6//
7// The contents of this file are subject to the terms of the
8// Common Development and Distribution License, Version 1.0 only
9// (the "License").  You may not use this file except in compliance
10// with the License.
11//
12// You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
13// or http://www.opensolaris.org/os/licensing.
14// See the License for the specific language governing permissions
15// and limitations under the License.
16//
17// When distributing Covered Code, include this CDDL HEADER in each
18// file and include the License file at usr/src/OPENSOLARIS.LICENSE.
19// If applicable, add the following below this CDDL HEADER, with the
20// fields enclosed by brackets "[]" replaced with your own identifying
21// information: Portions Copyright [yyyy] [name of copyright owner]
22//
23// CDDL HEADER END
24//
25// ident	"%Z%%M%	%I%	%E% SMI"
26
27//
28// eucJP to SJIS
29//
30
31
32#include <sys/errno.h>
33#define	SS2	0x008e
34#define	SS3	0x008f
35
36eucJP%SJIS {
37	operation init {
38		cs = 0;
39		offset = 0;
40	};
41
42	direction {
43
44		condition {
45			cs == 2;
46		} operation {
47			output = input[0];
48			cs = 0;
49			discard;
50		};
51
52		condition {
53			cs == 1;
54		} operation {
55			var_input = input[0] & 0x7f;
56			var_input = var_input + offset;
57			if (var_input >= 0x7f) {
58				var_input = var_input + 0x01;
59			}
60			output = var_input;
61			cs = 0;
62			discard;
63		};
64
65		condition {
66			between 0x00 ... 0x7f ;
67		} operation {
68			if ( outputsize < 1 ) {
69				error E2BIG;
70			}
71			output = input[0];
72			discard;
73		};
74
75		condition {
76			between SS2 ... SS2 ;
77		} operation {
78			// Note this, in the .c file check is made
79			// against ileft > 0 ,  but it's since the
80			// ileft is already decremented.
81
82			if ( inputsize > 1 ) {
83				if ( ( input[1] >= 0xa1 ) && ( input[1] <= 0xfe )) {
84					if (outputsize < 1 ) {
85						error E2BIG;
86					}
87					cs = 2;
88				} else {
89					error EILSEQ;
90				}
91			} else {
92				error EINVAL;
93			}
94		};
95
96		condition {
97			between 0xa1 ... 0xfe;
98		} operation {
99			if ( inputsize > 1 ) {
100				if ( ( input[1]   >= 0xa1 ) && (  input[1]  <= 0xfe)) {
101					if ( outputsize < 2 ) {
102						error E2BIG;
103					}
104
105					cs = 1;
106					var_input = input[0] & 0x7f;
107					if ( var_input & 0x01) {
108						offset = 0x1f;
109					} else {
110						offset = 0x7d;
111					}
112					var_input = ((var_input - 0x21 ) >> 1) + 0x81;
113					if ( var_input > 0x9f ) {
114						var_input = var_input + 0x40;
115					}
116					output = var_input;
117					discard;
118
119				} else {
120					error EINVAL;
121				}
122			} else {
123				error EILSEQ;
124			}
125		};
126
127		true operation {
128			error EILSEQ;
129		};
130	};
131
132}
133