aboutsummaryrefslogtreecommitdiff
path: root/iconv
diff options
context:
space:
mode:
Diffstat (limited to 'iconv')
-rw-r--r--iconv/gconv.h9
-rw-r--r--iconv/gconv_open.c6
-rw-r--r--iconv/skeleton.c5
3 files changed, 19 insertions, 1 deletions
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;