Use _CALL_DL_FCT to call function from dynamically loaded object.
[kopensolaris-gnu/glibc.git] / iconv / skeleton.c
index cc090af..19e737a 100644 (file)
@@ -82,6 +82,7 @@
 #define __need_size_t
 #define __need_NULL
 #include <stddef.h>
+#include <elf/ldsodefs.h>
 
 
 /* The direction objects.  */
@@ -90,7 +91,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
@@ -218,22 +219,22 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
          if (status == GCONV_OK)
 #endif
            /* Give the modules below the same chance.  */
-           status = (*fct) (next_step, next_data, NULL, NULL, written, 1);
+           status = _CALL_DL_FCT (fct, (next_step, next_data, NULL, NULL,
+                                        written, 1));
        }
     }
   else
     {
-      /* This variable is used to count the number of characters we
-         actually converted.  */
-      size_t converted = 0;
-      size_t last_converted;
-
       /* We preserve the initial values of the pointer variables.  */
       const char *inptr = *inbuf;
       char *outbuf = data->outbuf;
       char *outend = data->outbufend;
       char *outptr;
 
+      /* This variable is used to count the number of characters we
+        actually converted.  */
+      size_t converted = 0;
+
 #ifdef PREPARE_LOOP
       PREPARE_LOOP
 #endif
@@ -245,8 +246,6 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
          /* The outbuf buffer is empty.  */
          outptr = outbuf;
 
-         /* Save the state.  */
-         last_converted = converted;
 #ifdef SAVE_RESET_STATE
          SAVE_RESET_STATE (1);
 #endif
@@ -274,6 +273,10 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
            {
              /* Store information about how many bytes are available.  */
              data->outbuf = outbuf;
+
+             /* Remember how many characters we converted.  */
+             *written += converted;
+
              break;
            }
 
@@ -283,8 +286,8 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
              const char *outerr = data->outbuf;
              int result;
 
-             result = (*fct) (next_step, next_data, &outerr, outbuf,
-                              written, 0);
+             result = _CALL_DL_FCT (fct, (next_step, next_data, &outerr,
+                                          outbuf, written, 0));
 
              if (result != GCONV_EMPTY_INPUT)
                {
@@ -302,7 +305,6 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
                      outbuf = outptr;
 
                      /* Reset the state.  */
-                     converted = last_converted;
 # ifdef SAVE_RESET_STATE
                      SAVE_RESET_STATE (0);
 # endif
@@ -343,12 +345,12 @@ FUNCTION_NAME (struct gconv_step *step, struct gconv_step_data *data,
        }
       while (status == GCONV_OK);
 
-      /* Remember how many characters we converted.  */
-      *written += converted;
-
 #ifdef END_LOOP
       END_LOOP
 #endif
+
+      /* We finished one use of this step.  */
+      ++data->invocation_counter;
     }
 
   return status;