Support for nonstandard baud rate in SetCommState.
[wine] / dlls / msvcrt / string.c
1 /*
2  * MSVCRT string functions
3  *
4  * Copyright 1996,1998 Marcus Meissner
5  * Copyright 1996 Jukka Iivonen
6  * Copyright 1997,2000 Uwe Bonnes
7  * Copyright 2000 Jon Griffiths
8  */
9
10 #include "msvcrt.h"
11 #include "msvcrt/stdlib.h"
12 #include "msvcrt/string.h"
13
14 #include "wine/debug.h"
15
16 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
17
18 /* INTERNAL: MSVCRT_malloc() based strndup */
19 char* msvcrt_strndup(const char* buf, unsigned int size)
20 {
21   char* ret;
22   unsigned int len = strlen(buf), max_len;
23
24   max_len = size <= len? size : len + 1;
25
26   ret = MSVCRT_malloc(max_len);
27   if (ret)
28   {
29     memcpy(ret,buf,max_len);
30     ret[max_len] = 0;
31   }
32   return ret;
33 }
34
35 /*********************************************************************
36  *              _strdec (MSVCRT.@)
37  */
38 char* _strdec(const char* str1, const char* str2)
39 {
40   /* Hmm. While the docs suggest that the following should work... */
41   /*  return (str2<=str1?0:str2-1); */
42   /* ...Version 2.50.4170 (NT) from win98 constantly decrements! */
43   str1 = str1; /* remove warning */
44   return (char *)str2-1;
45 }
46
47 /*********************************************************************
48  *              _mbsdup (MSVCRT.@)
49  *              _strdup (MSVCRT.@)
50  */
51 char* _strdup(const char* str)
52 {
53     char * ret = MSVCRT_malloc(strlen(str)+1);
54     if (ret) strcpy( ret, str );
55     return ret;
56 }
57
58 /*********************************************************************
59  *              _strinc (MSVCRT.@)
60  */
61 char* _strinc(const char* str)
62 {
63   return (char*)str+1;
64 }
65
66 /*********************************************************************
67  *              _strnextc (MSVCRT.@)
68  */
69 unsigned int _strnextc(const char* str)
70 {
71   return (unsigned int)*str;
72 }
73
74 /*********************************************************************
75  *              _strninc (MSVCRT.@)
76  *
77  * Return a pointer to the 'n'th character in a string
78  */
79 char* _strninc(char* str, unsigned int n)
80 {
81   return str + n;
82 }
83
84 /*********************************************************************
85  *              _strnset (MSVCRT.@)
86  */
87 char* _strnset(char* str, int value, unsigned int len)
88 {
89   if (len > 0 && str)
90     while (*str && len--)
91       *str++ = value;
92   return str;
93 }
94
95 /*********************************************************************
96  *              _strrev (MSVCRT.@)
97  */
98 char* _strrev(char* str)
99 {
100   char * p1;
101   char * p2;
102
103   if (str && *str)
104     for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
105     {
106       *p1 ^= *p2;
107       *p2 ^= *p1;
108       *p1 ^= *p2;
109     }
110
111   return str;
112 }
113
114 /*********************************************************************
115  *              _strset (MSVCRT.@)
116  */
117 char* _strset(char* str, int value)
118 {
119   char *ptr = str;
120   while (*ptr)
121     *ptr++ = value;
122
123   return str;
124 }
125
126 /*********************************************************************
127  *              _strncnt (MSVCRT.@)
128  */
129 unsigned int _strncnt(char* str, unsigned int max)
130 {
131   unsigned int len = strlen(str);
132   return (len > max? max : len);
133 }
134
135 /*********************************************************************
136  *              _strspnp (MSVCRT.@)
137  */
138 char* _strspnp(char* str1, char* str2)
139 {
140   str1 += strspn(str1,str2);
141   return *str1? str1 : 0;
142 }
143
144 /*********************************************************************
145  *              _swab (MSVCRT.@)
146  */
147 void _swab(char* src, char* dst, int len)
148 {
149   if (len > 1)
150   {
151     len = (unsigned)len >> 1;
152
153     while (len--) {
154       *dst++ = src[1];
155       *dst++ = *src++;
156       src++;
157     }
158   }
159 }