aboutsummaryrefslogtreecommitdiff
path: root/iconvdata
diff options
context:
space:
mode:
Diffstat (limited to 'iconvdata')
-rw-r--r--iconvdata/Makefile12
-rw-r--r--iconvdata/gap.pl6
-rw-r--r--iconvdata/iso-2022-jp.c2
-rw-r--r--iconvdata/iso-2022-kr.c71
4 files changed, 51 insertions, 40 deletions
diff --git a/iconvdata/Makefile b/iconvdata/Makefile
index 276ae88..2b44ec1 100644
--- a/iconvdata/Makefile
+++ b/iconvdata/Makefile
@@ -250,12 +250,12 @@ $(make-target-directory)
( echo "static const uint32_t to_ucs4[256] = {"; \
sed -e '/^[^[:space:]]*[[:space:]]*.x00/d' -e 's/^[^[:space:]]*[[:space:]]*.x\(..\)[[:space:]]*<U\(....\)>.*/ [0x\1] = 0x\2,/p' -e d $^ | sort -u; \
echo "};"; \
- echo "static struct gap from_idx[] = {"; \
- sed -e '/^[^[:space:]]*[[:space:]]*.x00/d' -e 's/^[^[:space:]]*[[:space:]]*.x\(..\)[[:space:]]*<U\(....\)>.*/0x\2 0x\1/p' -e d $^ | sort -u | $(PERL) gap.pl; \
+ echo "static const struct gap from_idx[] = {"; \
+ sed -e 's/^[^[:space:]]*[[:space:]]*.x\(..\)[[:space:]]*<U\(....\)>.*/0x\2 0x\1/p' -e d $^ | sort -u | $(PERL) gap.pl; \
echo " { start: 0xffff, end: 0xffff, idx: 0 }"; \
echo "};"; \
echo "static const char from_ucs4[] = {"; \
- sed -e '/^[^[:space:]]*[[:space:]]*.x00/d' -e 's/^[^[:space:]]*[[:space:]]*.x\(..\)[[:space:]]*<U\(....\)>.*/0x\2 0x\1/p' -e d $^ | sort -u | $(PERL) gaptab.pl; \
+ sed -e 's/^[^[:space:]]*[[:space:]]*.x\(..\)[[:space:]]*<U\(....\)>.*/0x\2 0x\1/p' -e d $^ | sort -u | $(PERL) gaptab.pl; \
echo "};" ) > $@.new && rm -f $@ && mv $@.new $@
endef
@@ -358,12 +358,12 @@ $(objpfx)iso8859-7jp.h: ../localedata/charmaps/ISO-8859-7 Makefile
( echo "static const uint32_t iso88597_to_ucs4[96] = {"; \
sed -e '/^[^[:space:]]*[[:space:]]*.x00/d' -e 's/^[^[:space:]]*[[:space:]]*.x\([A-F].\)[[:space:]]*<U\(....\)>.*/ [0x\1 - 0xA0] = 0x\2,/p' -e d $^ | sort -u; \
echo "};"; \
- echo "static struct gap from_idx[] = {"; \
- sed -e '/^[^[:space:]]*[[:space:]]*.x00/d' -e 's/^[^[:space:]]*[[:space:]]*.x\([A-F].\)[[:space:]]*<U\(....\)>.*/0x\2 0x\1/p' -e d $^ | sort -u | $(PERL) gap.pl; \
+ echo "static const struct gap from_idx[] = {"; \
+ sed -e 's/^[^[:space:]]*[[:space:]]*.x\([A-F].\)[[:space:]]*<U\(....\)>.*/0x\2 0x\1/p' -e d $^ | sort -u | $(PERL) gap.pl; \
echo " { start: 0xffff, end: 0xffff, idx: 0 }"; \
echo "};"; \
echo "static const char iso88597_from_ucs4[] = {"; \
- sed -e '/^[^[:space:]]*[[:space:]]*.x00/d' -e 's/^[^[:space:]]*[[:space:]]*.x\([A-F].\)[[:space:]]*<U\(....\)>.*/0x\2 0x\1/p' -e d $^ | sort -u | $(PERL) gaptab.pl; \
+ sed -e 's/^[^[:space:]]*[[:space:]]*.x\([A-F].\)[[:space:]]*<U\(....\)>.*/0x\2 0x\1/p' -e d $^ | sort -u | $(PERL) gaptab.pl; \
echo "};" ) > $@.new && rm -f $@ && mv $@.new $@
diff --git a/iconvdata/gap.pl b/iconvdata/gap.pl
index 8d595e3..2a06adc 100644
--- a/iconvdata/gap.pl
+++ b/iconvdata/gap.pl
@@ -5,12 +5,12 @@ while (<>) {
if ($u - $last > 6) {
if ($last != 0) {
printf (" { start: 0x%04x, end: 0x%04x, idx: %5d },\n",
- $first, $last, $idx - $first);
- $idx += $last - $first + 1;
+ $first, $last, $idx);
+ $idx -= $u - $last - 1;
}
$first=$u;
}
$last=$u;
}
printf (" { start: 0x%04x, end: 0x%04x, idx: %5d },\n",
- $first, $last, $idx - $first);
+ $first, $last, $idx);
diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c
index 9ca648c..2c0f701 100644
--- a/iconvdata/iso-2022-jp.c
+++ b/iconvdata/iso-2022-jp.c
@@ -54,7 +54,7 @@ struct gap
#define PREPARE_LOOP \
enum direction dir = ((struct iso2022jp_data *) step->data)->dir; \
enum variant var = ((struct iso2022jp_data *) step->data)->var; \
- int save_state; \
+ int save_set; \
int set = data->statep->count;
#define END_LOOP \
data->statep->count = set;
diff --git a/iconvdata/iso-2022-kr.c b/iconvdata/iso-2022-kr.c
index 16e656a..69a1f5f 100644
--- a/iconvdata/iso-2022-kr.c
+++ b/iconvdata/iso-2022-kr.c
@@ -23,11 +23,17 @@
#include <string.h>
#include "ksc5601.h"
+#include <assert.h>
+
/* This makes obvious what everybody knows: 0x1b is the Esc character. */
+#define ESC 0x1b
+
+/* The shift sequences for this charset (we it does not use ESC). */
#define SI 0x0f
#define SO 0x0e
/* Definitions used in the body of the `gconv' function. */
+#define CHARSET_NAME "ISO-2022-KR//"
#define DEFINE_INIT 1
#define DEFINE_FINI 1
#define FROM_LOOP from_iso2022kr_loop
@@ -37,8 +43,10 @@
#define MIN_NEEDED_TO 4
#define MAX_NEEDED_TO 4
#define PREPARE_LOOP \
- int save_set;
+ int save_set; \
int set = data->statep->count;
+#define EXTRA_LOOP_ARGS , set
+
/* The COUNT element of the state keeps track of the currently selected
character set. The possible values are: */
@@ -58,7 +66,7 @@ enum
if (step->data == &from_object) \
/* It's easy, we don't have to emit anything, we just reset the \
state for the input. */ \
- set = 0; \
+ data->statep->count = 0; \
else \
{ \
char *outbuf = data->outbuf; \
@@ -73,7 +81,7 @@ enum
/* Write out the shift sequence. */ \
*outbuf++ = SO; \
data->outbuf = outbuf; \
- set = 0; \
+ data->statep->count = 0; \
} \
} \
}
@@ -221,43 +229,46 @@ enum
later and now simply use a fixed order in which we test for \
availability */ \
\
- if (ch <= 0x7f) \
- { \
- /* We must encode using ASCII. First write out the \
- escape sequence. */ \
- *outptr++ = SO; \
- set = ASCII_set; \
- \
- if (NEED_LENGTH_TEST && outptr == outend) \
- { \
- result = GCONV_FULL_OUTPUT; \
- break; \
- } \
- \
- *outptr++ = ch; \
- } \
- else \
- { \
- written = ucs4_to_ksc5601 (ch, buf, 2); \
- if (written != UNKNOWN_10646_CHAR) \
+ if (ch <= 0x7f) \
{ \
- /* We use KSC 5601. */ \
- *outptr++ = SI; \
- set = KSC5601_set; \
+ /* We must encode using ASCII. First write out the \
+ escape sequence. */ \
+ *outptr++ = SO; \
+ set = ASCII_set; \
\
- if (NEED_LENGTH_TEST && outptr + 2 > outend) \
+ if (NEED_LENGTH_TEST && outptr == outend) \
{ \
result = GCONV_FULL_OUTPUT; \
break; \
} \
\
- *outptr++ = buf[0]; \
- *outptr++ = buf[1]; \
+ *outptr++ = ch; \
} \
else \
{ \
- result = GCONV_ILLEGAL_INPUT; \
- break; \
+ char buf[2]; \
+ \
+ written = ucs4_to_ksc5601 (ch, buf, 2); \
+ if (written != UNKNOWN_10646_CHAR) \
+ { \
+ /* We use KSC 5601. */ \
+ *outptr++ = SI; \
+ set = KSC5601_set; \
+ \
+ if (NEED_LENGTH_TEST && outptr + 2 > outend) \
+ { \
+ result = GCONV_FULL_OUTPUT; \
+ break; \
+ } \
+ \
+ *outptr++ = buf[0]; \
+ *outptr++ = buf[1]; \
+ } \
+ else \
+ { \
+ result = GCONV_ILLEGAL_INPUT; \
+ break; \
+ } \
} \
} \
} \