ReactOS  0.4.15-dev-2700-g4b4ffa9
wcs.c File Reference
#include <precomp.h>
#include <assert.h>
#include <internal/wine/msvcrt.h>
#include "wine/unicode.h"
Include dependency graph for wcs.c:

Go to the source code of this file.

Functions

wchar_t *CDECL _wcsdup (const wchar_t *str)
 
INT CDECL _wcsicoll (const wchar_t *str1, const wchar_t *str2)
 
wchar_t *CDECL _wcsnset (wchar_t *str, wchar_t c, size_t n)
 
wchar_t *CDECL _wcsrev (wchar_t *str)
 
wchar_t *CDECL _wcsset (wchar_t *str, wchar_t c)
 
INT CDECL _wcsupr_s (wchar_t *str, size_t n)
 
double CDECL wcstod (const wchar_t *lpszStr, wchar_t **end)
 
int CDECL wcscoll (const wchar_t *str1, const wchar_t *str2)
 
wchar_t *CDECL wcspbrk (const wchar_t *str, const wchar_t *accept)
 
INT CDECL wctomb (char *dst, wchar_t ch)
 
static size_t CDECL wcsrtombs_l (char *mbstr, const wchar_t **wcstr, size_t count, _locale_t locale)
 
size_t CDECL _wcstombs_l (char *mbstr, const wchar_t *wcstr, size_t count, _locale_t locale)
 
size_t CDECL wcstombs (char *mbstr, const wchar_t *wcstr, size_t count)
 
INT CDECL wcscpy_s (wchar_t *wcDest, size_t numElement, const wchar_t *wcSrc)
 
INT CDECL wcsncpy_s (wchar_t *wcDest, size_t numElement, const wchar_t *wcSrc, size_t count)
 
INT CDECL wcscat_s (wchar_t *dst, size_t elem, const wchar_t *src)
 
INT CDECL wcsncat_s (wchar_t *dst, size_t elem, const wchar_t *src, size_t count)
 

Function Documentation

◆ _wcsdup()

wchar_t* CDECL _wcsdup ( const wchar_t str)

Definition at line 53 of file wcs.c.

54 {
55  wchar_t* ret = NULL;
56  if (str)
57  {
58  size_t size = (strlenW(str) + 1) * sizeof(wchar_t);
59  ret = malloc( size );
60  if (ret) memcpy( ret, str, size );
61  }
62  return ret;
63 }
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
const WCHAR * str
GLsizeiptr size
Definition: glext.h:5919
int ret
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define NULL
Definition: types.h:112
#define malloc
Definition: debug_ros.c:4

◆ _wcsicoll()

INT CDECL _wcsicoll ( const wchar_t str1,
const wchar_t str2 
)

Definition at line 67 of file wcs.c.

68 {
69  /* FIXME: handle collates */
70  return strcmpiW( str1, str2 );
71 }
#define strcmpiW(s1, s2)
Definition: unicode.h:39

◆ _wcsnset()

wchar_t* CDECL _wcsnset ( wchar_t str,
wchar_t  c,
size_t  n 
)

Definition at line 77 of file wcs.c.

78 {
79  wchar_t* ret = str;
80  while ((n-- > 0) && *str) *str++ = c;
81  return ret;
82 }
GLdouble n
Definition: glext.h:7729
const WCHAR * str
int ret
#define c
Definition: ke_i.h:80

◆ _wcsrev()

wchar_t* CDECL _wcsrev ( wchar_t str)

Definition at line 87 of file wcs.c.

88 {
89  wchar_t* ret = str;
90  wchar_t* end = str + strlenW(str) - 1;
91  while (end > str)
92  {
93  wchar_t t = *end;
94  *end-- = *str;
95  *str++ = t;
96  }
97  return ret;
98 }
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
GLdouble GLdouble t
Definition: gl.h:2047
const WCHAR * str
GLuint GLuint end
Definition: gl.h:1545
int ret

◆ _wcsset()

wchar_t* CDECL _wcsset ( wchar_t str,
wchar_t  c 
)

Definition at line 104 of file wcs.c.

105 {
106  wchar_t* ret = str;
107  while (*str) *str++ = c;
108  return ret;
109 }
const WCHAR * str
int ret
#define c
Definition: ke_i.h:80

◆ _wcstombs_l()

size_t CDECL _wcstombs_l ( char mbstr,
const wchar_t wcstr,
size_t  count,
_locale_t  locale 
)

Definition at line 328 of file wcs.c.

329 {
330  return wcsrtombs_l(mbstr, &wcstr, count, locale);
331 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
static size_t CDECL wcsrtombs_l(char *mbstr, const wchar_t **wcstr, size_t count, _locale_t locale)
Definition: wcs.c:260
Definition: _locale.h:75

◆ _wcsupr_s()

INT CDECL _wcsupr_s ( wchar_t str,
size_t  n 
)

Definition at line 115 of file wcs.c.

116 {
117  wchar_t* ptr = str;
118 
119  if (!str || !n)
120  {
121  if (str) *str = '\0';
123  return EINVAL;
124  }
125 
126  while (n--)
127  {
128  if (!*ptr) return 0;
129  *ptr = toupperW(*ptr);
130  ptr++;
131  }
132 
133  /* MSDN claims that the function should return and set errno to
134  * ERANGE, which doesn't seem to be true based on the tests. */
135  *str = '\0';
137  return EINVAL;
138 }
errno_t __cdecl _set_errno(_In_ int _Value)
Definition: arc.h:39
GLdouble n
Definition: glext.h:7729
static PVOID ptr
Definition: dispmode.c:27
const WCHAR * str
WINE_UNICODE_INLINE WCHAR toupperW(WCHAR ch)
Definition: unicode.h:141

◆ wcscat_s()

INT CDECL wcscat_s ( wchar_t dst,
size_t  elem,
const wchar_t src 
)

Definition at line 406 of file wcs.c.

407 {
408  wchar_t* ptr = dst;
409 
410  if (!dst || elem == 0) return EINVAL;
411  if (!src)
412  {
413  dst[0] = '\0';
414  return EINVAL;
415  }
416 
417  /* seek to end of dst string (or elem if no end of string is found */
418  while (ptr < dst + elem && *ptr != '\0') ptr++;
419  while (ptr < dst + elem)
420  {
421  if ((*ptr++ = *src++) == '\0') return 0;
422  }
423  /* not enough space */
424  dst[0] = '\0';
425  return ERANGE;
426 }
Definition: arc.h:39
static size_t elem
Definition: string.c:68
static PVOID ptr
Definition: dispmode.c:27
#define ERANGE
Definition: acclib.h:92
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340

◆ wcscoll()

int CDECL wcscoll ( const wchar_t str1,
const wchar_t str2 
)

Definition at line 216 of file wcs.c.

217 {
218  /* FIXME: handle collates */
219  return strcmpW( str1, str2 );
220 }
WINE_UNICODE_INLINE int strcmpW(const WCHAR *str1, const WCHAR *str2)
Definition: unicode.h:229

◆ wcscpy_s()

INT CDECL wcscpy_s ( wchar_t wcDest,
size_t  numElement,
const wchar_t wcSrc 
)

Definition at line 345 of file wcs.c.

346 {
347  size_t size = 0;
348 
349  if(!wcDest || !numElement)
350  return EINVAL;
351 
352  wcDest[0] = 0;
353 
354  if(!wcSrc)
355  {
356  return EINVAL;
357  }
358 
359  size = strlenW(wcSrc) + 1;
360 
361  if(size > numElement)
362  {
363  return ERANGE;
364  }
365 
366  memcpy( wcDest, wcSrc, size*sizeof(WCHAR) );
367 
368  return 0;
369 }
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
Definition: arc.h:39
static const unsigned char *static size_t const wchar_t * wcSrc
Definition: string.c:66
GLsizeiptr size
Definition: glext.h:5919
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define ERANGE
Definition: acclib.h:92
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878

◆ wcsncat_s()

INT CDECL wcsncat_s ( wchar_t dst,
size_t  elem,
const wchar_t src,
size_t  count 
)

Definition at line 432 of file wcs.c.

434 {
435  size_t srclen;
436  wchar_t dststart;
437  INT ret = 0;
438 
439  if (!MSVCRT_CHECK_PMT(dst != NULL) || !MSVCRT_CHECK_PMT(elem > 0))
440  {
441 #ifndef _LIBCNT_
443 #endif
444  return EINVAL;
445  }
446  if (!MSVCRT_CHECK_PMT(src != NULL || count == 0))
447  return EINVAL;
448  if (count == 0)
449  return 0;
450 
451  for (dststart = 0; dststart < elem; dststart++)
452  {
453  if (dst[dststart] == '\0')
454  break;
455  }
456  if (dststart == elem)
457  {
458  MSVCRT_INVALID_PMT("dst[elem] is not NULL terminated\n", EINVAL);
459  return EINVAL;
460  }
461 
462  if (count == _TRUNCATE)
463  {
464  srclen = strlenW(src);
465  if (srclen >= (elem - dststart))
466  {
467  srclen = elem - dststart - 1;
468  ret = STRUNCATE;
469  }
470  }
471  else
472  srclen = min(strlenW(src), count);
473  if (srclen < (elem - dststart))
474  {
475  memcpy(&dst[dststart], src, srclen*sizeof(wchar_t));
476  dst[dststart+srclen] = '\0';
477  return ret;
478  }
479  MSVCRT_INVALID_PMT("dst[elem] is too small", ERANGE);
480  dst[0] = '\0';
481  return ERANGE;
482 }
errno_t __cdecl _set_errno(_In_ int _Value)
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
Definition: arc.h:39
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define STRUNCATE
Definition: errno.h:110
int32_t INT
Definition: typedefs.h:58
static size_t elem
Definition: string.c:68
#define MSVCRT_INVALID_PMT(x)
Definition: mbstowcs_s.c:25
#define _TRUNCATE
Definition: crtdefs.h:245
static DWORD LPDWORD LPCSTR DWORD srclen
Definition: directory.c:51
#define ERANGE
Definition: acclib.h:92
int ret
#define MSVCRT_CHECK_PMT(x)
Definition: mbstowcs_s.c:26
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
#define min(a, b)
Definition: monoChain.cc:55
#define NULL
Definition: types.h:112

◆ wcsncpy_s()

INT CDECL wcsncpy_s ( wchar_t wcDest,
size_t  numElement,
const wchar_t wcSrc,
size_t  count 
)

Definition at line 374 of file wcs.c.

376 {
377  size_t size = 0;
378 
379  if (!wcDest || !numElement)
380  return EINVAL;
381 
382  wcDest[0] = 0;
383 
384  if (!wcSrc)
385  {
386  return EINVAL;
387  }
388 
389  size = min(strlenW(wcSrc), count);
390 
391  if (size >= numElement)
392  {
393  return ERANGE;
394  }
395 
396  memcpy( wcDest, wcSrc, size*sizeof(WCHAR) );
397  wcDest[size] = '\0';
398 
399  return 0;
400 }
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
Definition: arc.h:39
GLuint GLuint GLsizei count
Definition: gl.h:1545
static const unsigned char *static size_t const wchar_t * wcSrc
Definition: string.c:66
GLsizeiptr size
Definition: glext.h:5919
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define ERANGE
Definition: acclib.h:92
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define min(a, b)
Definition: monoChain.cc:55

◆ wcspbrk()

wchar_t* CDECL wcspbrk ( const wchar_t str,
const wchar_t accept 
)

Definition at line 225 of file wcs.c.

226 {
227  const wchar_t* p;
228  while (*str)
229  {
230  for (p = accept; *p; p++) if (*p == *str) return (wchar_t*)str;
231  str++;
232  }
233  return NULL;
234 }
const WCHAR * str
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
#define NULL
Definition: types.h:112
GLfloat GLfloat p
Definition: glext.h:8902

◆ wcsrtombs_l()

static size_t CDECL wcsrtombs_l ( char mbstr,
const wchar_t **  wcstr,
size_t  count,
_locale_t  locale 
)
static

Definition at line 260 of file wcs.c.

262 {
264  size_t tmp = 0;
265  BOOL used_default;
266 
267  if(!locale)
268  locinfo = get_locinfo();
269  else
270  locinfo = ((MSVCRT__locale_t)locale)->locinfo;
271 
272  if(!locinfo->lc_codepage) {
273  size_t i;
274 
275  if(!mbstr)
276  return strlenW(*wcstr);
277 
278  for(i=0; i<count; i++) {
279  if((*wcstr)[i] > 255) {
281  return -1;
282  }
283 
284  mbstr[i] = (*wcstr)[i];
285  if(!(*wcstr)[i]) break;
286  }
287  return i;
288  }
289 
290  if(!mbstr) {
292  *wcstr, -1, NULL, 0, NULL, &used_default);
293  if(!tmp || used_default) {
295  return -1;
296  }
297  return tmp-1;
298  }
299 
300  while(**wcstr) {
301  char buf[3];
302  size_t i, size;
303 
305  *wcstr, 1, buf, 3, NULL, &used_default);
306  if(!size || used_default) {
308  return -1;
309  }
310  if(tmp+size > count)
311  return tmp;
312 
313  for(i=0; i<size; i++)
314  mbstr[tmp++] = buf[i];
315  (*wcstr)++;
316  }
317 
318  if(tmp < count) {
319  mbstr[tmp] = '\0';
320  *wcstr = NULL;
321  }
322  return tmp;
323 }
errno_t __cdecl _set_errno(_In_ int _Value)
#define EILSEQ
Definition: errno.h:97
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
struct MSVCRT_localeinfo_struct * MSVCRT__locale_t
#define WideCharToMultiByte
Definition: compat.h:111
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
Definition: _locale.h:75
unsigned int BOOL
Definition: ntddk_ex.h:94
#define get_locinfo()
Definition: winesup.h:25
GLsizeiptr size
Definition: glext.h:5919
#define WC_NO_BEST_FIT_CHARS
Definition: unicode.h:46
else locinfo
Definition: scanf.h:159
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112

Referenced by _wcstombs_l(), and wcstombs().

◆ wcstod()

double CDECL wcstod ( const wchar_t lpszStr,
wchar_t **  end 
)

Definition at line 143 of file wcs.c.

144 {
145  const wchar_t* str = lpszStr;
146  int negative = 0;
147  double ret = 0, divisor = 10.0;
148 
149  TRACE("(%s,%p) semi-stub\n", debugstr_w(lpszStr), end);
150 
151  /* FIXME:
152  * - Should set errno on failure
153  * - Should fail on overflow
154  * - Need to check which input formats are allowed
155  */
156  while (isspaceW(*str))
157  str++;
158 
159  if (*str == '-')
160  {
161  negative = 1;
162  str++;
163  }
164 
165  while (isdigitW(*str))
166  {
167  ret = ret * 10.0 + (*str - '0');
168  str++;
169  }
170  if (*str == '.')
171  str++;
172  while (isdigitW(*str))
173  {
174  ret = ret + (*str - '0') / divisor;
175  divisor *= 10;
176  str++;
177  }
178 
179  if (*str == 'E' || *str == 'e' || *str == 'D' || *str == 'd')
180  {
181  int negativeExponent = 0;
182  int exponent = 0;
183  if (*(++str) == '-')
184  {
185  negativeExponent = 1;
186  str++;
187  }
188  while (isdigitW(*str))
189  {
190  exponent = exponent * 10 + (*str - '0');
191  str++;
192  }
193  if (exponent != 0)
194  {
195  if (negativeExponent)
196  ret = ret / pow(10.0, exponent);
197  else
198  ret = ret * pow(10.0, exponent);
199  }
200  }
201 
202  if (negative)
203  ret = -ret;
204 
205  if (end)
206  *end = (wchar_t*)str;
207 
208  TRACE("returning %g\n", ret);
209  return ret;
210 }
WINE_UNICODE_INLINE int isspaceW(WCHAR wc)
Definition: unicode.h:165
float pow(float __x, int __y)
Definition: _cmath.h:458
#define debugstr_w
Definition: kernel32.h:32
const WCHAR * str
#define TRACE(s)
Definition: solgame.cpp:4
GLuint GLuint end
Definition: gl.h:1545
int ret
GLuint divisor
Definition: glext.h:6313
WINE_UNICODE_INLINE int isdigitW(WCHAR wc)
Definition: unicode.h:170

◆ wcstombs()

size_t CDECL wcstombs ( char mbstr,
const wchar_t wcstr,
size_t  count 
)

Definition at line 336 of file wcs.c.

337 {
338  return wcsrtombs_l(mbstr, &wcstr, count, NULL);
339 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
static size_t CDECL wcsrtombs_l(char *mbstr, const wchar_t **wcstr, size_t count, _locale_t locale)
Definition: wcs.c:260
#define NULL
Definition: types.h:112

◆ wctomb()

INT CDECL wctomb ( char dst,
wchar_t  ch 
)

Definition at line 244 of file wcs.c.

245 {
246  BOOL error;
247  INT size;
248 
249  size = WideCharToMultiByte(get_locinfo()->lc_codepage, 0, &ch, 1, dst, dst ? 6 : 0, NULL, &error);
250  if(!size || error) {
251  *_errno() = EINVAL;
252  return EOF;
253  }
254  return size;
255 }
#define WideCharToMultiByte
Definition: compat.h:111
#define error(str)
Definition: mkdosfs.c:1605
Definition: arc.h:39
int32_t INT
Definition: typedefs.h:58
unsigned int BOOL
Definition: ntddk_ex.h:94
#define get_locinfo()
Definition: winesup.h:25
GLsizeiptr size
Definition: glext.h:5919
_CRTIMP int *__cdecl _errno(void)
Definition: errno.c:19
GLenum GLenum dst
Definition: glext.h:6340
#define NULL
Definition: types.h:112
#define EOF
Definition: stdio.h:24