/* Conversion module for ISO-2022-JP.
Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <gconv.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "jis0201.h"
#include "jis0208.h"
#include "jis0212.h"
#include "gb2312.h"
#include "ksc5601.h"
struct gap
{
uint16_t start;
uint16_t end;
int32_t idx;
};
#include "iso8859-7jp.h"
/* This makes obvious what everybody knows: 0x1b is the Esc character. */
#define ESC 0x1b
/* We provide our own initialization and destructor function. */
#define DEFINE_INIT 0
#define DEFINE_FINI 0
/* Definitions used in the body of the `gconv' function. */
#define FROM_LOOP from_iso2022jp_loop
#define TO_LOOP to_iso2022jp_loop
#define MIN_NEEDED_FROM 1
#define MAX_NEEDED_FROM 4
#define MIN_NEEDED_TO 4
#define MAX_NEEDED_TO 4
#define FROM_DIRECTION (dir == from_iso2022jp)
#define PREPARE_LOOP \
enum direction dir = ((struct iso2022jp_data *) step->data)->dir; \
enum variant var = ((struct iso2022jp_data *) step->data)->var; \
int save_set; \
int *setp = &data->statep->count;
#define EXTRA_LOOP_ARGS , var, setp
/* Direction of the transformation. */
enum direction
{
illegal_dir,
to_iso2022jp,
from_iso2022jp
};
/* We handle ISO-2022-jp and ISO-2022-JP-2 here. */
enum variant
{
illegal_var,
iso2022jp,
iso2022jp2
};
struct iso2022jp_data
{
enum direction dir;
enum variant var;
};
/* The COUNT element of the state keeps track of the currently selected
character set. The possible values are: */
enum
{
ASCII_set = 0,
JISX0208_1978_set,
JISX0208_1983_set,
JISX0201_Roman_set,
JISX0201_Kana_set,
GB2312_set,
KSC5601_set,
JISX0212_set,
ISO88591_set,
ISO88597_set
};
int
gconv_init (struct gconv_step *step)
{
/* Determine which direction. */
struct iso2022jp_data *new_data;
enum direction dir = illegal_dir;
enum variant var = illegal_var;
int result;
if (__strcasecmp (step->from_name, "ISO-2022-JP//") == 0)
{
dir = from_iso2022jp;
var = iso2022jp;
}
else if (__strcasecmp (step->to_name, "ISO-2022-JP//") == 0)
{
dir = to_iso2022jp;
var = iso2022jp;
}
else if (__strcasecmp (step->from_name, "ISO-2022-JP-2//") == 0)
{
dir = from_iso2022jp;
var = iso2022jp2;
}
else if (__strcasecmp (step->to_name, "ISO-2022-JP-2//") == 0)