about summary refs log tree commit diff
path: root/iconv
diff options
context:
space:
mode:
Diffstat (limited to 'iconv')
-rw-r--r--iconv/loop.c12
-rw-r--r--iconv/skeleton.c27
2 files changed, 34 insertions, 5 deletions
diff --git a/iconv/loop.c b/iconv/loop.c
index e1c1ab6e49..f8188873dc 100644
--- a/iconv/loop.c
+++ b/iconv/loop.c
@@ -43,6 +43,8 @@
 
      BODY		this is supposed to expand to the body of the loop.
 			The user must provide this.
+
+     EXTRA_LOOP_DECLS	Extra arguments passed from converion loop call.
 */
 
 #include <gconv.h>
@@ -106,11 +108,18 @@
 #endif
 
 
+/* If no arguments have to passed to the loop function define the macro
+   as empty.  */
+#ifndef EXTRA_LOOP_DECLS
+# define EXTRA_LOOP_DECLS
+#endif
+
+
 /* The function returns the status, as defined in gconv.h.  */
 static inline int
 LOOPFCT (const unsigned char **inptrp, const unsigned char *inend,
 	 unsigned char **outptrp, unsigned char *outend, mbstate_t *state,
-	 void *data, size_t *converted)
+	 void *data, size_t *converted EXTRA_LOOP_DECLS)
 {
   int result = GCONV_OK;
   const unsigned char *inptr = *inptrp;
@@ -222,3 +231,4 @@ LOOPFCT (const unsigned char **inptrp, const unsigned char *inend,
 #undef COUNT_CONVERTED
 #undef BODY
 #undef LOOPFCT
+#undef EXTRA_LOOP_DECLS
diff --git a/iconv/skeleton.c b/iconv/skeleton.c
index 36cc33c9be..8421941a1e 100644
--- a/iconv/skeleton.c
+++ b/iconv/skeleton.c
@@ -67,6 +67,12 @@
 			to cover only those characters up to the error.
 
      FUNCTION_NAME	if not set the conversion function is named `gconv'.
+
+     PREPARE_LOOP	optional code preparing the conversion loop.  Can
+			contain variable definitions.
+
+     EXTRA_LOOP_ARGS	optional macro specifying extra arguments passed
+			to loop function.
  */
 
 #include <assert.h>
@@ -161,6 +167,13 @@ gconv_init (struct gconv_step *step)
 #endif
 
 
+/* If no arguments have to passed to the loop function define the macro
+   as empty.  */
+#ifndef EXTRA_LOOP_ARGS
+# define EXTRA_LOOP_ARGS
+#endif
+
+
 /* This is the actual conversion function.  */
 #ifndef FUNCTION_NAME
 # define FUNCTION_NAME	gconv
@@ -210,6 +223,10 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
       char *outend = data->outbufend;
       char *outptr;
 
+#ifdef PREPARE_LOOP
+      PREPARE_LOOP
+#endif
+
       do
 	{
 	  /* Remember the start value for this round.  */
@@ -229,14 +246,16 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
 				(const unsigned char *) inbufend,
 				(unsigned char **) &outbuf,
 				(unsigned char *) outend,
-				data->statep, step->data, &converted);
+				data->statep, step->data, &converted
+				EXTRA_LOOP_ARGS);
 	  else
 	    /* Run the conversion loop.  */
 	    status = TO_LOOP ((const unsigned char **) inbuf,
 			      (const unsigned char *) inbufend,
 			      (unsigned char **) &outbuf,
 			      (unsigned char *) outend,
-			      data->statep, step->data, &converted);
+			      data->statep, step->data, &converted
+			      EXTRA_LOOP_ARGS);
 
 	  /* If this is the last step leave the loop, there is nothgin
              we can do.  */
@@ -284,7 +303,7 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
 					     (unsigned char **) &outbuf,
 					     (unsigned char *) outerr,
 					     data->statep, step->data,
-					     &converted);
+					     &converted EXTRA_LOOP_ARGS);
 		      else
 			/* Run the conversion loop.  */
 			nstatus = TO_LOOP ((const unsigned char **) inbuf,
@@ -292,7 +311,7 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
 					   (unsigned char **) &outbuf,
 					   (unsigned char *) outerr,
 					   data->statep, step->data,
-					   &converted);
+					   &converted EXTRA_LOOP_ARGS);
 
 		      /* We must run out of output buffer space in this
 			 rerun.  */