root/ext/xmlrpc/libxmlrpc/encodings.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. convert
  2. utf8_encode
  3. utf8_decode

   1 /*
   2   This file is part of libXMLRPC - a C library for xml-encoded function calls.
   3 
   4   Author: Dan Libby (dan@libby.com)
   5   Epinions.com may be contacted at feedback@epinions-inc.com
   6 */
   7 
   8 /*
   9   Copyright 2000 Epinions, Inc.
  10 
  11   Subject to the following 3 conditions, Epinions, Inc.  permits you, free
  12   of charge, to (a) use, copy, distribute, modify, perform and display this
  13   software and associated documentation files (the "Software"), and (b)
  14   permit others to whom the Software is furnished to do so as well.
  15 
  16   1) The above copyright notice and this permission notice shall be included
  17   without modification in all copies or substantial portions of the
  18   Software.
  19 
  20   2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF
  21   ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY
  22   IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR
  23   PURPOSE OR NONINFRINGEMENT.
  24 
  25   3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
  26   SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
  27   OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING
  28   NEGLIGENCE), EVEN IF EPINIONS, INC.  IS AWARE OF THE POSSIBILITY OF SUCH
  29   DAMAGES.
  30 
  31 */
  32 
  33 #ifdef HAVE_CONFIG_H
  34 #include "config.h"
  35 #endif
  36 
  37 #ifndef PHP_WIN32
  38 #include <php_config.h>
  39 #else
  40 #include <config.w32.h>
  41 #include <stdlib.h>
  42 #endif
  43 
  44 static const char rcsid[] = "#(@) $Id$";
  45 
  46 #include <errno.h>
  47 #include <string.h>
  48 
  49 #ifdef HAVE_GICONV_H
  50 #include <giconv.h>
  51 #else
  52 #include <iconv.h>
  53 #endif
  54 
  55 #include "encodings.h"
  56 
  57 #ifndef ICONV_CSNMAXLEN
  58 #define ICONV_CSNMAXLEN 64
  59 #endif
  60 
  61 static char* convert(const char* src, int src_len, int *new_len, const char* from_enc, const char* to_enc) {
  62    char* outbuf = 0;
  63 
  64    if(src && src_len && from_enc && to_enc) {
  65       size_t outlenleft = src_len;
  66       size_t inlenleft = src_len;
  67       int outlen = src_len;
  68       iconv_t ic;
  69       char* out_ptr = 0;
  70 
  71       if(strlen(to_enc) >= ICONV_CSNMAXLEN || strlen(from_enc) >= ICONV_CSNMAXLEN) {
  72          return NULL;
  73       }
  74       ic = iconv_open(to_enc, from_enc);
  75       if(ic != (iconv_t)-1) {
  76          size_t st;
  77          outbuf = (char*)malloc(outlen + 1);
  78 
  79          if(outbuf) {
  80             out_ptr = (char*)outbuf;
  81             while(inlenleft) {
  82                st = iconv(ic, (char**)&src, &inlenleft, &out_ptr, &outlenleft);
  83                if(st == -1) {
  84                   if(errno == E2BIG) {
  85                      int diff = out_ptr - outbuf;
  86                      outlen += inlenleft;
  87                      outlenleft += inlenleft;
  88                      outbuf = (char*)realloc(outbuf, outlen + 1);
  89                      if(!outbuf) {
  90                         break;
  91                      }
  92                      out_ptr = outbuf + diff;
  93                   }
  94                   else {
  95                      free(outbuf);
  96                      outbuf = 0;
  97                      break;
  98                   }
  99                }
 100             }
 101          }
 102          iconv_close(ic);
 103       }
 104       outlen -= outlenleft;
 105 
 106       if(new_len) {
 107          *new_len = outbuf ? outlen : 0;
 108       }
 109       if(outbuf) {
 110          outbuf[outlen] = 0;
 111       }
 112    }
 113    return outbuf;
 114 }
 115 
 116 /* returns a new string that must be freed */
 117 char* utf8_encode(const char *s, int len, int *newlen, const char* encoding)
 118 {
 119    return convert(s, len, newlen, encoding, "UTF-8");
 120 }
 121 
 122 /* returns a new string, possibly decoded */
 123 char* utf8_decode(const char *s, int len, int *newlen, const char* encoding)
 124 {
 125    return convert(s, len, newlen, "UTF-8", encoding);
 126 }
 127 

/* [<][>][^][v][top][bottom][index][help] */