Back to index

glibc  2.9
Functions
iconv.c File Reference
#include <stddef.h>
#include <errno.h>
#include <iconv.h>
#include <gconv_int.h>
#include <assert.h>

Go to the source code of this file.

Functions

size_t iconv (iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)

Function Documentation

size_t iconv ( iconv_t  cd,
char **  inbuf,
size_t inbytesleft,
char **  outbuf,
size_t outbytesleft 
)

Definition at line 32 of file iconv.c.

{
  __gconv_t gcd = (__gconv_t) cd;
  char *outstart = outbuf ? *outbuf : NULL;
  size_t irreversible;
  int result;

  if (__builtin_expect (inbuf == NULL || *inbuf == NULL, 0))
    {
      if (outbuf == NULL || *outbuf == NULL)
       result = __gconv (gcd, NULL, NULL, NULL, NULL, &irreversible);
      else
       result = __gconv (gcd, NULL, NULL, (unsigned char **) outbuf,
                       (unsigned char *) (outstart + *outbytesleft),
                       &irreversible);
    }
  else
    {
      const char *instart = *inbuf;

      result = __gconv (gcd, (const unsigned char **) inbuf,
                     (const unsigned char *)  (*inbuf + *inbytesleft),
                     (unsigned char **) outbuf,
                     (unsigned char *) (*outbuf + *outbytesleft),
                     &irreversible);

      *inbytesleft -= *inbuf - instart;
    }
  if (outstart != NULL)
    *outbytesleft -= *outbuf - outstart;

  switch (__builtin_expect (result, __GCONV_OK))
    {
    case __GCONV_ILLEGAL_DESCRIPTOR:
      __set_errno (EBADF);
      irreversible = (size_t) -1L;
      break;

    case __GCONV_ILLEGAL_INPUT:
      __set_errno (EILSEQ);
      irreversible = (size_t) -1L;
      break;

    case __GCONV_FULL_OUTPUT:
      __set_errno (E2BIG);
      irreversible = (size_t) -1L;
      break;

    case __GCONV_INCOMPLETE_INPUT:
      __set_errno (EINVAL);
      irreversible = (size_t) -1L;
      break;

    case __GCONV_EMPTY_INPUT:
    case __GCONV_OK:
      /* Nothing.  */
      break;

    default:
      assert (!"Nothing like this should happen");
    }

  return irreversible;
}

Here is the call graph for this function:

Here is the caller graph for this function: