Fix the VarXxxFromCy conversions.
[wine] / dlls / kernel / string.c
1 /*
2  * Kernel string functions
3  */
4
5 #include <ctype.h>
6 #include <string.h>
7
8 #include "winbase.h"
9 #include "wine/winbase16.h"
10
11
12 static INT WINAPI (*pLoadStringA)(HINSTANCE, UINT, LPSTR, INT);
13 static INT WINAPI (*pwvsprintfA)(LPSTR, LPCSTR, va_list);
14
15 /***********************************************************************
16  * Helper for k32 family functions
17  */
18 static void *user32_proc_address(const char *proc_name)
19 {
20     static HMODULE hUser32;
21
22     if(!hUser32) hUser32 = LoadLibraryA("user32.dll");
23     return GetProcAddress(hUser32, proc_name);
24 }
25
26
27 /***********************************************************************
28  *              KERNEL_lstrcmp16 (KERNEL.87)
29  */
30 INT16 WINAPI KERNEL_lstrcmp16( LPCSTR str1, LPCSTR str2 )
31 {
32     return (INT16)strcmp( str1, str2 );
33 }
34
35
36 /***********************************************************************
37  *              k32CharToOemBuffA   (KERNEL32.@)
38  */
39 BOOL WINAPI k32CharToOemBuffA(LPCSTR s, LPSTR d, DWORD len)
40 {
41     WCHAR *bufW;
42
43     if ((bufW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
44     {
45         MultiByteToWideChar( CP_ACP, 0, s, len, bufW, len );
46         WideCharToMultiByte( CP_OEMCP, 0, bufW, len, d, len, NULL, NULL );
47         HeapFree( GetProcessHeap(), 0, bufW );
48     }
49     return TRUE;
50 }
51
52
53 /***********************************************************************
54  *              k32CharToOemA   (KERNEL32.@)
55  */
56 BOOL WINAPI k32CharToOemA(LPCSTR s, LPSTR d)
57 {
58     if (!s || !d) return TRUE;
59     return k32CharToOemBuffA( s, d, strlen(s) + 1 );
60 }
61
62
63 /***********************************************************************
64  *              k32OemToCharBuffA   (KERNEL32.@)
65  */
66 BOOL WINAPI k32OemToCharBuffA(LPCSTR s, LPSTR d, DWORD len)
67 {
68     WCHAR *bufW;
69
70     if ((bufW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
71     {
72         MultiByteToWideChar( CP_OEMCP, 0, s, len, bufW, len );
73         WideCharToMultiByte( CP_ACP, 0, bufW, len, d, len, NULL, NULL );
74         HeapFree( GetProcessHeap(), 0, bufW );
75     }
76     return TRUE;
77 }
78
79
80 /***********************************************************************
81  *              k32OemToCharA   (KERNEL32.@)
82  */
83 BOOL WINAPI k32OemToCharA(LPCSTR s, LPSTR d)
84 {
85     return k32OemToCharBuffA( s, d, strlen(s) + 1 );
86 }
87
88
89 /**********************************************************************
90  *              k32LoadStringA   (KERNEL32.@)
91  */
92 INT WINAPI k32LoadStringA(HINSTANCE instance, UINT resource_id,
93                           LPSTR buffer, INT buflen)
94 {
95     if(!pLoadStringA) pLoadStringA = user32_proc_address("LoadStringA");
96     return pLoadStringA(instance, resource_id, buffer, buflen);
97 }
98
99
100 /***********************************************************************
101  *              k32wvsprintfA   (KERNEL32.@)
102  */
103 INT WINAPI k32wvsprintfA(LPSTR buffer, LPCSTR spec, va_list args)
104 {
105     if(!pwvsprintfA) pwvsprintfA = user32_proc_address("wvsprintfA");
106     return (*pwvsprintfA)(buffer, spec, args);
107 }
108
109
110 /***********************************************************************
111  *              k32wsprintfA   (KERNEL32.@)
112  */
113 INT WINAPIV k32wsprintfA(LPSTR buffer, LPCSTR spec, ...)
114 {
115     va_list args;
116     INT res;
117
118     va_start(args, spec);
119     res = k32wvsprintfA(buffer, spec, args);
120     va_end(args);
121     return res;
122 }
123
124
125 /***************************************************************************
126  *
127  * Win 2.x string functions now moved to USER
128  *
129  * We rather want to implement them here instead of doing Callouts
130  */
131
132 /***********************************************************************
133  *              KERNEL_AnsiNext16 (KERNEL.77)
134  */
135 SEGPTR WINAPI KERNEL_AnsiNext16(SEGPTR current)
136 {
137     return (*(char *)MapSL(current)) ? current + 1 : current;
138 }
139
140 /***********************************************************************
141  *              KERNEL_AnsiPrev16(KERNEL.78)
142  */
143 SEGPTR WINAPI KERNEL_AnsiPrev16( SEGPTR start, SEGPTR current )
144 {
145     return (current==start)?start:current-1;
146 }
147
148 /***********************************************************************
149  *              KERNEL_AnsiUpper16 (KERNEL.79)
150  */
151 SEGPTR WINAPI KERNEL_AnsiUpper16( SEGPTR strOrChar )
152 {
153     /* uppercase only one char if strOrChar < 0x10000 */
154     if (HIWORD(strOrChar))
155     {
156         char *s = MapSL(strOrChar);
157         while (*s)
158         {
159             *s = toupper(*s);
160             s++;
161         }
162         return strOrChar;
163     }
164     else return toupper((char)strOrChar);
165 }
166
167 /***********************************************************************
168  *              KERNEL_AnsiLower16 (KERNEL.80)
169  */
170 SEGPTR WINAPI KERNEL_AnsiLower16( SEGPTR strOrChar )
171 {
172     /* lowercase only one char if strOrChar < 0x10000 */
173     if (HIWORD(strOrChar))
174     {
175         char *s = MapSL(strOrChar);
176         while (*s)
177         {
178             *s = tolower(*s);
179             s++;
180         }
181         return strOrChar;
182     }
183     else return tolower((char)strOrChar);
184 }