SWIstring.c
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:9k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /* SWIstring, locale independant conversions */
  2. /****************License************************************************
  3.  * Vocalocity OpenVXI
  4.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *  
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  19.  * registered trademarks of Vocalocity, Inc. 
  20.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  21.  * by Vocalocity.
  22.  ***********************************************************************/
  23. /* -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  24.  */
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <limits.h>
  29. #include <SWIstring.h>
  30. #include "misc_string.h"
  31. #define INVALID_IUC_16BIT(C) 
  32.    (C >= 0xD800 && C <= 0xDBFF) || 
  33.    (C == 0xFFFE || C == 0xFFFF)
  34. #define INVALID_IUC_32BIT(C) 
  35.    (C & 0xFFFF0000) || INVALID_IUC_16BIT(C)
  36. /*  SWIisvalid_unicode tests that the given wchar string
  37.  *    - does not contain high surrogates (D800 to DBFF)
  38.  *    - does not contain non-characters (FFFE and FFFF)
  39.  *    - the top 16-bit of 32-bit wchar are 0
  40.  */
  41. int SWIisvalid_unicode(const wchar_t *wstr)
  42. {
  43.   int i, len = wcslen(wstr);
  44. #if defined(_linux_) && defined(__GNUC__)
  45.     for (i = 0; i < len; i++, wstr++) {
  46.       if ( INVALID_IUC_32BIT(*wstr) )
  47.         return 0;
  48.     }
  49. #elif defined (_win32_)
  50.     for (i = 0; i < len; i++, wstr++) {
  51.       if ( INVALID_IUC_16BIT(*wstr) )
  52.         return 0;
  53.     }
  54. #else
  55.   if (sizeof(wchar_t) == 4) {
  56.     for (i = 0; i < len; i++, wstr++) {
  57.       if ( INVALID_IUC_32BIT(*wstr) )
  58.         return 0;
  59.     }
  60.   }
  61.   else {
  62.     for (i = 0; i < len; i++, wstr++) {
  63.       if ( INVALID_IUC_16BIT(*wstr) )
  64.         return 0;
  65.     }
  66.   }
  67. #endif
  68.   return 1;
  69. }
  70. /*  SWIisascii() function tests that the given wchar string
  71.  *  contains only ASCII characters, which are any character
  72.  *  with a value less than than or equal to 0x7F.
  73.  */
  74. int SWIisascii(const wchar_t *wstr)
  75. {
  76.   int i, len = wcslen(wstr);
  77.   for (i = 0; i < len; i++) {
  78.     if (*wstr++ > 0x7F)
  79.       return 0;
  80.   }
  81.   return 1;
  82. }
  83. /*  SWIislatin1() function tests that the given wchar string
  84.  *  contains only LATIN-1 characters, which are any character
  85.  *  with a value less than than or equal to 0xFF.
  86.  */
  87. int SWIislatin1(const wchar_t *wstr)
  88. {
  89.   int i, len = wcslen(wstr);
  90.   for (i = 0; i < len; i++) {
  91.     if (*wstr++ > 0xFF)
  92.       return 0;
  93.   }
  94.   return 1;
  95. }
  96.   /* FIXME?  lots of error checking here - strlen, ascii;
  97.    *  should we be less risk conscious but more efficient?
  98.    */
  99. double SWIwcstod( const wchar_t *wstr)
  100. {
  101.   int i;
  102.   char tmpbuf[SWIchar_MAXSTRLEN];
  103.   char *str;
  104.   double dval;
  105.   int len = wcslen(wstr);
  106.   str = BUFMALLOC2(tmpbuf, SWIchar_MAXSTRLEN, len+1);
  107.   if (!str)
  108.     return 0.0;
  109.   for (i = 0; i < len; i++) {
  110.     if (*wstr > 0x7F)  /* is it ascii at least? */
  111.       return 0.0;
  112.     str[i] = (char) *wstr++;
  113.   }
  114.   str[i] = '';
  115.   
  116.   dval =  SWIatof(str);
  117.   BUFFREE(tmpbuf, str);
  118.   return dval;
  119. }
  120.   /* FIXME?  lots of error checking here - strlen, ascii;
  121.    *  should we be less risk conscious but more efficient?
  122.    */
  123. float SWIwcstof( const wchar_t *wstr)
  124. {
  125.   int i;
  126.   char tmpbuf[SWIchar_MAXSTRLEN];
  127.   char *str;
  128.   float fval;
  129.   int len = wcslen(wstr);
  130.   str = BUFMALLOC2(tmpbuf, SWIchar_MAXSTRLEN, len+1);
  131.   if (!str)
  132.     return 0.0;
  133.   for (i = 0; i < len; i++) {
  134.     if (*wstr > 0x7F)  /* is it ascii at least? */
  135.       return 0.0;
  136.     str[i] = (char) *wstr++;
  137.   }
  138.   str[i] = '';
  139.   
  140.   fval =  SWIatofloat(str);
  141.   BUFFREE(tmpbuf, str);
  142.   return fval;
  143. }
  144.   /* FIXME?  lots of error checking here - strlen, ascii;
  145.    *  should we be less risk conscious but more efficient?
  146.    */
  147. SWIcharResult SWIwtof( const wchar_t *wstr, float *fval)
  148. {
  149.   int i;
  150.   char tmpbuf[SWIchar_MAXSTRLEN];
  151.   char *str;
  152.   int len = wcslen(wstr);
  153.   str = BUFMALLOC2(tmpbuf, SWIchar_MAXSTRLEN, len+1);
  154.   if (!str)
  155.     return SWIchar_BUFFER_OVERFLOW;
  156.   for (i = 0; i < len; i++) {
  157.     if (*wstr > 0x7F)  /* is it ascii at least? */
  158.       return SWIchar_INVALID_INPUT;
  159.     str[i] = (char) *wstr++;
  160.   }
  161.   str[i] = '';
  162.   
  163.   *fval =  SWIatofloat(str);
  164.   BUFFREE(tmpbuf, str);
  165.   return SWIchar_SUCCESS;
  166. }
  167. /* Converts char-based string to wchar-based string
  168.  * - len is size of wstr
  169.  * - returns SWIchar_BUFFER_OVERFLOW if len(str)>=len
  170.  */
  171. SWIcharResult SWIstrtowcs(const char *str, wchar_t *wstr, int len)
  172. {
  173.   int l;
  174.   int i;
  175.   l = strlen(str);
  176.   if (l >= len) {
  177.     return SWIchar_BUFFER_OVERFLOW;
  178.   }
  179.   for (i = 0; i < l + 1; i++) {
  180.     wstr[i] = (char)str[i];  // the high bit is not a sign bit //
  181.   }
  182.   return SWIchar_SUCCESS;
  183. }
  184. /* Converts wchar-based string to char-based string.
  185.  * - when there is conversion loss, returns SWIchar_CONVERSION_LOSS
  186.  *   and each loss-affected char is 277 (upside-down question mark)
  187.  * - len is size of str
  188.  * - returns SWIchar_BUFFER_OVERFLOW if len(wstr)>=len
  189. */
  190. SWIcharResult SWIwcstostr(const wchar_t *wstr, char *str, int len)
  191. {
  192.   int l;
  193.   int i;
  194.   SWIcharResult rc = SWIchar_SUCCESS;
  195.   l = wcslen(wstr);
  196.   if (l > len) {
  197.     return SWIchar_BUFFER_OVERFLOW;
  198.   }
  199.   for (i = 0; i < l + 1; i++) {
  200.     str[i] = (char) wstr[i];
  201.     if (((char)str[i]) != wstr[i]) {
  202.       rc = SWIchar_CONVERSION_LOSS;
  203.       str[i] = '277';
  204.     }
  205.   }
  206.   return rc;
  207. }
  208. SWIcharResult SWIitowcs(int i, wchar_t *wstr, int len)
  209. {
  210.   char buf[SWIchar_MAXSTRLEN];
  211.   char *pend = buf+SWIchar_MAXSTRLEN;
  212.   char *pbuf = pend;
  213.   int sign = 1;
  214.   if ( i < 0 ) {
  215.     if ( i == INT_MIN ) {
  216.       return SWIchar_INVALID_INPUT;
  217.     }
  218.     i = -i;
  219.     sign = -1;
  220.   }
  221.   while(i) {
  222.     int ch = i%10;
  223.     i/=10;
  224.     *--pbuf = (char)ch+'0';
  225.   }
  226.   if (pbuf == pend)
  227.     *--pbuf = '0';
  228.   if ( sign == -1 ) {
  229.     *--pbuf = '-';
  230.   }
  231.   if ( pend-pbuf > len ) {
  232.     return SWIchar_BUFFER_OVERFLOW;
  233.   }
  234.   while (pbuf < pend) {
  235.     *wstr++ = (wchar_t) *pbuf++;
  236.   }
  237.   *wstr = '';
  238.   return SWIchar_SUCCESS;
  239. }
  240.   /* The function stops reading the input string at the first character that it 
  241.    * cannot recognize as part of a number. This character may be the null character 
  242.    * (L'') terminating the string.
  243.    * Returns SWIchar_INVALID_INPUT if string is empty, or
  244.    *  does not start with [sign]digit
  245.    */
  246. SWIcharResult SWIwcstoi(const wchar_t *wstr, int *pi)
  247. {
  248.   int value = 0;
  249.   int sign = 1;
  250.   const wchar_t *start;
  251.   while ( SWIchar_isspace(*wstr) && *wstr != '' ) wstr++;
  252.   if ( *wstr == '-' ) {
  253.     sign = -1;
  254.     wstr++;
  255.   }
  256.   else if ( *wstr == '+' ) {
  257.     wstr++;
  258.   }
  259.   start = wstr;
  260.   while( *wstr ) {
  261.     if ( *wstr < '0' || *wstr > '9' ) {
  262.       break;
  263.     }
  264.     value = 10*value + *wstr++ - '0';
  265.   }
  266.   if (start == wstr)  /*  no digits in the string */
  267.     return SWIchar_INVALID_INPUT;
  268.   if ( sign == -1 ) value = -value;
  269.   *pi = value;
  270.   return SWIchar_SUCCESS;
  271. }
  272. int SWIwtoi(const wchar_t *wstr)
  273. {
  274.   int val;
  275.   SWIcharResult rc = SWIwcstoi( wstr, &val );
  276.   if (rc != SWIchar_SUCCESS)
  277.     return 0;
  278.   return val;
  279. }
  280. int SWIwcsstrcmp(const wchar_t *w, const char *str)
  281. {
  282.   while (*w && *str && *w == *str) {w++;str++;}
  283.   return *w - *str;
  284. }
  285. #ifndef _win32_
  286. wchar_t *SWIwcstok(wchar_t *wcs, const wchar_t *delim,
  287.       wchar_t **ptr)
  288. {
  289. #ifndef __GNUC__
  290.   return wcstok_r(wcs,delim,ptr);
  291. #else
  292.   return wcstok(wcs,delim,ptr);
  293. #endif
  294. }
  295. char *SWIstrtok(char *str, const char *delim, char **ptr)
  296. {
  297. #ifndef __GNUC__
  298.   return strtok_r(str,delim,ptr);
  299. #else
  300.   return strtok(str,delim);
  301. #endif
  302. }
  303. #elif (_win32_)
  304. wchar_t *SWIwcstok(wchar_t *wcs, const wchar_t *delim,
  305.       wchar_t **ptr)
  306. {
  307.   *ptr = NULL;
  308.   return wcstok(wcs, delim);
  309. }
  310. char *SWIstrtok(char *str, const char *delim,
  311.       char **ptr)
  312. {
  313.   *ptr = NULL;
  314.   return strtok(str, delim);
  315. }
  316. #endif