ole32: Add a NULL pointer check in CoDisconnectObject.
[wine] / dlls / kernel32 / string.c
1 /*
2  * Kernel string functions
3  *
4  * Copyright 1993 Yngvi Sigurjonsson
5  * Copyright 1996 Alexandre Julliard
6  * Copyright 2001 Dmitry Timoshkov for CodeWeavers
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22
23 #include "config.h"
24 #include "wine/port.h"
25
26 #include <ctype.h>
27 #include <stdarg.h>
28 #include <string.h>
29
30 #define WINE_NO_INLINE_STRING
31 #include "windef.h"
32 #include "winbase.h"
33 #include "wine/unicode.h"
34 #include "wine/exception.h"
35
36
37 /***********************************************************************
38  *           lstrcatA   (KERNEL32.@)
39  *           lstrcat    (KERNEL32.@)
40  */
41 LPSTR WINAPI lstrcatA( LPSTR dst, LPCSTR src )
42 {
43     __TRY
44     {
45         strcat( dst, src );
46     }
47     __EXCEPT_PAGE_FAULT
48     {
49         SetLastError( ERROR_INVALID_PARAMETER );
50         return NULL;
51     }
52     __ENDTRY
53     return dst;
54 }
55
56
57 /***********************************************************************
58  *           lstrcatW   (KERNEL32.@)
59  */
60 LPWSTR WINAPI lstrcatW( LPWSTR dst, LPCWSTR src )
61 {
62     __TRY
63     {
64         strcatW( dst, src );
65     }
66     __EXCEPT_PAGE_FAULT
67     {
68         SetLastError( ERROR_INVALID_PARAMETER );
69         return NULL;
70     }
71     __ENDTRY
72     return dst;
73 }
74
75
76 /***********************************************************************
77  *           lstrcpyA   (KERNEL32.@)
78  *           lstrcpy    (KERNEL32.@)
79  */
80 LPSTR WINAPI lstrcpyA( LPSTR dst, LPCSTR src )
81 {
82     __TRY
83     {
84         /* this is how Windows does it */
85         memmove( dst, src, strlen(src)+1 );
86     }
87     __EXCEPT_PAGE_FAULT
88     {
89         SetLastError( ERROR_INVALID_PARAMETER );
90         return NULL;
91     }
92     __ENDTRY
93     return dst;
94 }
95
96
97 /***********************************************************************
98  *           lstrcpyW   (KERNEL32.@)
99  */
100 LPWSTR WINAPI lstrcpyW( LPWSTR dst, LPCWSTR src )
101 {
102     __TRY
103     {
104         strcpyW( dst, src );
105     }
106     __EXCEPT_PAGE_FAULT
107     {
108         SetLastError( ERROR_INVALID_PARAMETER );
109         return NULL;
110     }
111     __ENDTRY
112     return dst;
113 }
114
115
116 /***********************************************************************
117  *           lstrcpynA   (KERNEL32.@)
118  *           lstrcpyn    (KERNEL32.@)
119  *
120  * Note: this function differs from the UNIX strncpy, it _always_ writes
121  * a terminating \0.
122  *
123  * Note: n is an INT but Windows treats it as unsigned, and will happily
124  * copy a gazillion chars if n is negative.
125  */
126 LPSTR WINAPI lstrcpynA( LPSTR dst, LPCSTR src, INT n )
127 {
128     __TRY
129     {
130         LPSTR d = dst;
131         LPCSTR s = src;
132         UINT count = n;
133
134         while ((count > 1) && *s)
135         {
136             count--;
137             *d++ = *s++;
138         }
139         if (count) *d = 0;
140     }
141     __EXCEPT_PAGE_FAULT
142     {
143         SetLastError( ERROR_INVALID_PARAMETER );
144         return 0;
145     }
146     __ENDTRY
147     return dst;
148 }
149
150
151 /***********************************************************************
152  *           lstrcpynW   (KERNEL32.@)
153  *
154  * Note: this function differs from the UNIX strncpy, it _always_ writes
155  * a terminating \0
156  *
157  * Note: n is an INT but Windows treats it as unsigned, and will happily
158  * copy a gazillion chars if n is negative.
159  */
160 LPWSTR WINAPI lstrcpynW( LPWSTR dst, LPCWSTR src, INT n )
161 {
162     __TRY
163     {
164         LPWSTR d = dst;
165         LPCWSTR s = src;
166         UINT count = n;
167
168         while ((count > 1) && *s)
169         {
170             count--;
171             *d++ = *s++;
172         }
173         if (count) *d = 0;
174     }
175     __EXCEPT_PAGE_FAULT
176     {
177         SetLastError( ERROR_INVALID_PARAMETER );
178         return 0;
179     }
180     __ENDTRY
181     return dst;
182 }
183
184
185 /***********************************************************************
186  *           lstrlenA   (KERNEL32.@)
187  *           lstrlen    (KERNEL32.@)
188  */
189 INT WINAPI lstrlenA( LPCSTR str )
190 {
191     INT ret;
192     __TRY
193     {
194         ret = strlen(str);
195     }
196     __EXCEPT_PAGE_FAULT
197     {
198         SetLastError( ERROR_INVALID_PARAMETER );
199         return 0;
200     }
201     __ENDTRY
202     return ret;
203 }
204
205
206 /***********************************************************************
207  *           lstrlenW   (KERNEL32.@)
208  */
209 INT WINAPI lstrlenW( LPCWSTR str )
210 {
211     INT ret;
212     __TRY
213     {
214         ret = strlenW(str);
215     }
216     __EXCEPT_PAGE_FAULT
217     {
218         SetLastError( ERROR_INVALID_PARAMETER );
219         return 0;
220     }
221     __ENDTRY
222     return ret;
223 }