summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--iconv/gconv.h9
-rw-r--r--iconv/gconv_open.c6
-rw-r--r--iconv/skeleton.c5
-rw-r--r--iconvdata/Makefile4
-rw-r--r--iconvdata/iso-2022-jp.c2
-rw-r--r--iconvdata/iso-2022-kr.c13
-rw-r--r--iconvdata/iso646.c2
8 files changed, 51 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index e264b026e5..89f46257a4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+1998-05-15 21:07 Ulrich Drepper <drepper@cygnus.com>
+
+ * iconv/gconv.h (gconv_step_data): Add new fields invocation_counter
+ and internal_use.
+ * iconv/gconv_open.c (__gconv_open): Initialize invocation_counter
+ and internal_use.
+ * iconv/skeleton.c: Increment invocation_counter.
+ * iconvdata/iso-2022-kr.c: When used in iconv() emit designator
+ sequence first.
+
+ * iconv/skeleton.c (FROM_DIRECTION): Completely embrace expression.
+ * iconvdata/iso-2022-jp.c: Likewise.
+ * iconvdata/iso646.c: Likewise.
+
+ * iconvdata/Makefile: Correct rpath definition for ISO-2022-KR.
+
1998-05-15 Ulrich Drepper <drepper@cygnus.com>
* iconv/gconv_db.c (derivation_lookup): Use __tfind correctly.
diff --git a/iconv/gconv.h b/iconv/gconv.h
index b359c92c62..1e19c9650a 100644
--- a/iconv/gconv.h
+++ b/iconv/gconv.h
@@ -100,8 +100,17 @@ struct gconv_step_data
char *outbuf; /* Output buffer for this step. */
char *outbufend; /* Address of first byte after the output buffer. */
+ /* Is this the last module in the chain. */
int is_last;
+ /* Counter for number of invocations of the module function for this
+ desriptor. */
+ int invocation_counter;
+
+ /* Flag whether this is an internal use of the module (in the mb*towc*
+ and wc*tomb* functions) or regular with iconv(3). */
+ int internal_use;
+
mbstate_t *statep;
mbstate_t __state; /* This element should not be used directly by
any module; always use STATEP! */
diff --git a/iconv/gconv_open.c b/iconv/gconv_open.c
index d7e0191cca..fb5f88b9a3 100644
--- a/iconv/gconv_open.c
+++ b/iconv/gconv_open.c
@@ -65,6 +65,12 @@ __gconv_open (const char *toset, const char *fromset, gconv_t *handle)
buffer. */
data[cnt].is_last = cnt == nsteps - 1;
+ /* Reset the counter. */
+ data[cnt].invocation_counter = 0;
+
+ /* It's a regular use. */
+ data[cnt].internal_use = 0;
+
/* We use the `mbstate_t' member in DATA. */
data[cnt].statep = &data[cnt].__state;
diff --git a/iconv/skeleton.c b/iconv/skeleton.c
index f0445f1408..418247f769 100644
--- a/iconv/skeleton.c
+++ b/iconv/skeleton.c
@@ -90,7 +90,7 @@ static int from_object;
static int to_object;
# ifndef FROM_DIRECTION
-# define FROM_DIRECTION step->data == &from_object
+# define FROM_DIRECTION (step->data == &from_object)
# endif
#else
# ifndef FROM_DIRECTION
@@ -346,6 +346,9 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
#ifdef END_LOOP
END_LOOP
#endif
+
+ /* We finished one use of this step. */
+ ++data->invocation_counter;
}
return status;
diff --git a/iconvdata/Makefile b/iconvdata/Makefile
index 8d5ace82aa..f438b3d49e 100644
--- a/iconvdata/Makefile
+++ b/iconvdata/Makefile
@@ -165,8 +165,8 @@ $(objpfx)EUC-TW.so: $(objpfx)libCNS.so
LDFLAGS-ISO-2022-JP.so = -Wl,-rpath,$(gconvdir)
$(objpfx)ISO-2022-JP.so: $(objpfx)libJIS.so $(objpfx)libGB.so \
$(objpfx)libCNS.so $(objpfx)libKSC.so
-LDFLAGS-ISO-2022-JP.so = -Wl,-rpath,$(gconvdir)
-$(objpfx)ISO-2022-JP.so: $(objpfx)libKSC.so
+LDFLAGS-ISO-2022-KR.so = -Wl,-rpath,$(gconvdir)
+$(objpfx)ISO-2022-KR.so: $(objpfx)libKSC.so
LDFLAGS-libJIS.so = -Wl,-soname,$(@F)
LDFLAGS-libKSC.so = -Wl,-soname,$(@F)
diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c
index 2c0f701dfb..900c733552 100644
--- a/iconvdata/iso-2022-jp.c
+++ b/iconvdata/iso-2022-jp.c
@@ -50,7 +50,7 @@ struct gap
#define MAX_NEEDED_FROM 4
#define MIN_NEEDED_TO 4
#define MAX_NEEDED_TO 4
-#define FROM_DIRECTION dir == from_iso2022jp
+#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; \
diff --git a/iconvdata/iso-2022-kr.c b/iconvdata/iso-2022-kr.c
index 69a1f5f89f..cb02cc9bf2 100644
--- a/iconvdata/iso-2022-kr.c
+++ b/iconvdata/iso-2022-kr.c
@@ -44,7 +44,18 @@
#define MAX_NEEDED_TO 4
#define PREPARE_LOOP \
int save_set; \
- int set = data->statep->count;
+ int set = data->statep->count; \
+ if (!FROM_DIRECTION && !data->internal_use && data->invocation_counter == 0)\
+ { \
+ /* Emit the designator sequence. */ \
+ if (outptr + 4 > outend) \
+ return GCONV_FULL_OUTPUT; \
+ \
+ *outptr++ = '\x1b'; \
+ *outptr++ = '\x24'; \
+ *outptr++ = '\x29'; \
+ *outptr++ = '\x43'; \
+ }
#define EXTRA_LOOP_ARGS , set
diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c
index 29a452d112..af1479a347 100644
--- a/iconvdata/iso646.c
+++ b/iconvdata/iso646.c
@@ -42,7 +42,7 @@
#define DEFINE_FINI 0
#define MIN_NEEDED_FROM 1
#define MIN_NEEDED_TO 4
-#define FROM_DIRECTION dir == from_iso646
+#define FROM_DIRECTION (dir == from_iso646)
#define PREPARE_LOOP \
enum direction dir = ((struct iso646_data *) step->data)->dir; \
enum variant var = ((struct iso646_data *) step->data)->var;