// 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
// 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;
};
};
}