OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [sys/] [linux/] [iconv/] [iconv.c] - Blame information for rev 148

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/* Convert characters in input buffer using conversion descriptor to
2
   output buffer.
3
   Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
4
   This file is part of the GNU C Library.
5
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
6
 
7
   The GNU C Library is free software; you can redistribute it and/or
8
   modify it under the terms of the GNU Lesser General Public
9
   License as published by the Free Software Foundation; either
10
   version 2.1 of the License, or (at your option) any later version.
11
 
12
   The GNU C Library is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
   Lesser General Public License for more details.
16
 
17
   You should have received a copy of the GNU Lesser General Public
18
   License along with the GNU C Library; if not, write to the Free
19
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20
   02111-1307 USA.  */
21
 
22
#include <stddef.h> /* for NULL */
23
#include <errno.h>
24
#include <iconv.h>
25
 
26
#include <gconv_int.h>
27
 
28
#include <assert.h>
29
 
30
 
31
size_t
32
iconv (iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf,
33
       size_t *outbytesleft)
34
{
35
  __gconv_t gcd = (__gconv_t) cd;
36
  char *outstart = outbuf ? *outbuf : NULL;
37
  size_t irreversible;
38
  int result;
39
 
40
  if (__builtin_expect (inbuf == NULL || *inbuf == NULL, 0))
41
    {
42
      if (outbuf == NULL || *outbuf == NULL)
43
        result = __gconv (gcd, NULL, NULL, NULL, NULL, &irreversible);
44
      else
45
        result = __gconv (gcd, NULL, NULL, (unsigned char **) outbuf,
46
                          (unsigned char *) (outstart + *outbytesleft),
47
                          &irreversible);
48
    }
49
  else
50
    {
51
      const char *instart = *inbuf;
52
 
53
      result = __gconv (gcd, (const unsigned char **) inbuf,
54
                        (const unsigned char *)  (*inbuf + *inbytesleft),
55
                        (unsigned char **) outbuf,
56
                        (unsigned char *) (*outbuf + *outbytesleft),
57
                        &irreversible);
58
 
59
      *inbytesleft -= *inbuf - instart;
60
    }
61
  if (outstart != NULL)
62
    *outbytesleft -= *outbuf - outstart;
63
 
64
  switch (__builtin_expect (result, __GCONV_OK))
65
    {
66
    case __GCONV_ILLEGAL_DESCRIPTOR:
67
      __set_errno (EBADF);
68
      irreversible = (size_t) -1L;
69
      break;
70
 
71
    case __GCONV_ILLEGAL_INPUT:
72
      __set_errno (EILSEQ);
73
      irreversible = (size_t) -1L;
74
      break;
75
 
76
    case __GCONV_FULL_OUTPUT:
77
      __set_errno (E2BIG);
78
      irreversible = (size_t) -1L;
79
      break;
80
 
81
    case __GCONV_INCOMPLETE_INPUT:
82
      __set_errno (EINVAL);
83
      irreversible = (size_t) -1L;
84
      break;
85
 
86
    case __GCONV_EMPTY_INPUT:
87
    case __GCONV_OK:
88
      /* Nothing.  */
89
      break;
90
 
91
    default:
92
      assert (!"Nothing like this should happen");
93
    }
94
 
95
  return irreversible;
96
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.