4 * Copyright 1993 Yngvi Sigurjonsson (yngvi@hafro.is)
5 * Copyright 1996 Marcus Meissner
19 # define iswalnum(c) isalnum(c)
20 # define iswalpha(c) isalpha(c)
21 # define iswupper(c) isupper(c)
22 # define iswlower(c) islower(c)
23 #endif /* HAVE_WCTYPE_H */
30 #include "wine/winbase16.h"
31 #include "wine/winuser16.h"
36 #include "stackframe.h"
38 #include "debugtools.h"
40 DEFAULT_DEBUG_CHANNEL(resource
);
42 extern const WORD OLE2NLS_CT_CType3_LUT
[]; /* FIXME: does not belong here */
44 /* Funny to divide them between user and kernel. */
46 /***********************************************************************
47 * IsCharAlpha (USER.433)
49 BOOL16 WINAPI
IsCharAlpha16(CHAR ch
)
51 return isalpha(ch
); /* This is probably not right for NLS */
54 /***********************************************************************
55 * IsCharAlphaNumeric (USER.434)
57 BOOL16 WINAPI
IsCharAlphaNumeric16(CHAR ch
)
62 /***********************************************************************
63 * IsCharUpper (USER.435)
65 BOOL16 WINAPI
IsCharUpper16(CHAR ch
)
70 /***********************************************************************
71 * IsCharLower (USER.436)
73 BOOL16 WINAPI
IsCharLower16(CHAR ch
)
78 /***********************************************************************
79 * AnsiUpper16 (USER.431)
81 SEGPTR WINAPI
AnsiUpper16( SEGPTR strOrChar
)
83 /* I am not sure if the locale stuff works with toupper, but then again
84 I am not sure if the Linux libc locale stuffs works at all */
86 /* uppercase only one char if strOrChar < 0x10000 */
87 if (HIWORD(strOrChar
))
90 for (s
= PTR_SEG_TO_LIN(strOrChar
); *s
; s
++) *s
= toupper(*s
);
93 else return toupper((char)strOrChar
);
97 /***********************************************************************
98 * AnsiUpperBuff16 (USER.437)
100 UINT16 WINAPI
AnsiUpperBuff16( LPSTR str
, UINT16 len
)
102 UINT count
= len
? len
: 65536;
103 for (; count
; count
--, str
++) *str
= toupper(*str
);
107 /***********************************************************************
108 * AnsiLower16 (USER.432)
110 SEGPTR WINAPI
AnsiLower16( SEGPTR strOrChar
)
112 /* I am not sure if the locale stuff works with toupper, but then again
113 I am not sure if the Linux libc locale stuffs works at all */
115 /* lowercase only one char if strOrChar < 0x10000 */
116 if (HIWORD(strOrChar
))
119 for (s
= PTR_SEG_TO_LIN( strOrChar
); *s
; s
++) *s
= tolower( *s
);
122 else return tolower((char)strOrChar
);
126 /***********************************************************************
127 * AnsiLowerBuff16 (USER.438)
129 UINT16 WINAPI
AnsiLowerBuff16( LPSTR str
, UINT16 len
)
131 UINT count
= len
? len
: 65536;
132 for (; count
; count
--, str
++) *str
= tolower(*str
);
137 /***********************************************************************
138 * AnsiNext16 (USER.472)
140 SEGPTR WINAPI
AnsiNext16(SEGPTR current
)
142 return (*(char *)PTR_SEG_TO_LIN(current
)) ? current
+ 1 : current
;
146 /***********************************************************************
147 * AnsiPrev16 (USER.473)
149 SEGPTR WINAPI
AnsiPrev16( SEGPTR start
, SEGPTR current
)
151 return (current
== start
) ? start
: current
- 1;
155 /***********************************************************************
156 * CharNextA (USER32.29)
158 LPSTR WINAPI
CharNextA( LPCSTR ptr
)
160 if (!*ptr
) return (LPSTR
)ptr
;
161 if (IsDBCSLeadByte( *ptr
) && (*(ptr
+1) != 0) ) return (LPSTR
)(ptr
+ 2);
162 return (LPSTR
)(ptr
+ 1);
166 /***********************************************************************
167 * CharNextExA (USER32.30)
169 LPSTR WINAPI
CharNextExA( WORD codepage
, LPCSTR ptr
, DWORD flags
)
171 if (!*ptr
) return (LPSTR
)ptr
;
172 if (IsDBCSLeadByteEx( codepage
, *ptr
) && (*(ptr
+1) != 0) ) return (LPSTR
)(ptr
+ 2);
173 return (LPSTR
)(ptr
+ 1);
177 /***********************************************************************
178 * CharNextExW (USER32.31)
180 LPWSTR WINAPI
CharNextExW(WORD codepage
,LPCWSTR x
,DWORD flags
)
182 /* FIXME: add DBCS / codepage stuff */
183 if (*x
) return (LPWSTR
)(x
+1);
184 else return (LPWSTR
)x
;
187 /***********************************************************************
188 * CharNextW (USER32.32)
190 LPWSTR WINAPI
CharNextW(LPCWSTR x
)
192 if (*x
) return (LPWSTR
)(x
+1);
193 else return (LPWSTR
)x
;
196 /***********************************************************************
197 * CharPrevA (USER32.33)
199 LPSTR WINAPI
CharPrevA( LPCSTR start
, LPCSTR ptr
)
201 while (*start
&& (start
< ptr
))
203 LPCSTR next
= CharNextA( start
);
204 if (next
>= ptr
) break;
211 /***********************************************************************
212 * CharPrevExA (USER32.34)
214 LPSTR WINAPI
CharPrevExA( WORD codepage
, LPCSTR start
, LPCSTR ptr
, DWORD flags
)
216 while (*start
&& (start
< ptr
))
218 LPCSTR next
= CharNextExA( codepage
, start
, flags
);
219 if (next
> ptr
) break;
226 /***********************************************************************
227 * CharPrevExW (USER32.35)
229 LPWSTR WINAPI
CharPrevExW(WORD codepage
,LPCWSTR start
,LPCWSTR x
,DWORD flags
)
231 /* FIXME: add DBCS / codepage stuff */
232 if (x
>start
) return (LPWSTR
)(x
-1);
233 else return (LPWSTR
)x
;
236 /***********************************************************************
237 * CharPrevW (USER32.36)
239 LPWSTR WINAPI
CharPrevW(LPCWSTR start
,LPCWSTR x
)
241 if (x
>start
) return (LPWSTR
)(x
-1);
242 else return (LPWSTR
)x
;
245 /***********************************************************************
246 * CharLowerA (USER32.25)
247 * FIXME: handle current locale
249 LPSTR WINAPI
CharLowerA(LPSTR x
)
263 else return (LPSTR
)tolower((char)(int)x
);
266 /***********************************************************************
267 * CharLowerBuffA (USER32.26)
268 * FIXME: handle current locale
270 DWORD WINAPI
CharLowerBuffA(LPSTR x
,DWORD buflen
)
274 if (!x
) return 0; /* YES */
275 while (*x
&& (buflen
--))
284 /***********************************************************************
285 * CharLowerBuffW (USER32.27)
286 * FIXME: handle current locale
288 DWORD WINAPI
CharLowerBuffW(LPWSTR x
,DWORD buflen
)
292 if (!x
) return 0; /* YES */
293 while (*x
&& (buflen
--))
295 *x
=NTDLL_towlower(*x
);
302 /***********************************************************************
303 * CharLowerW (USER32.28)
304 * FIXME: handle current locale
306 LPWSTR WINAPI
CharLowerW(LPWSTR x
)
313 *s
=NTDLL_towlower(*s
);
318 else return (LPWSTR
)((UINT
)NTDLL_towlower(LOWORD(x
)));
321 /***********************************************************************
322 * CharUpperA (USER32.41)
323 * FIXME: handle current locale
325 LPSTR WINAPI
CharUpperA(LPSTR x
)
337 return (LPSTR
)toupper((char)(int)x
);
340 /***********************************************************************
341 * CharUpperBuffA (USER32.42)
342 * FIXME: handle current locale
344 DWORD WINAPI
CharUpperBuffA(LPSTR x
,DWORD buflen
)
348 if (!x
) return 0; /* YES */
349 while (*x
&& (buflen
--))
358 /***********************************************************************
359 * CharUpperBuffW (USER32.43)
360 * FIXME: handle current locale
362 DWORD WINAPI
CharUpperBuffW(LPWSTR x
,DWORD buflen
)
366 if (!x
) return 0; /* YES */
367 while (*x
&& (buflen
--))
369 *x
=NTDLL_towupper(*x
);
376 /***********************************************************************
377 * CharUpperW (USER32.44)
378 * FIXME: handle current locale
380 LPWSTR WINAPI
CharUpperW(LPWSTR x
)
387 *s
=NTDLL_towupper(*s
);
392 else return (LPWSTR
)((UINT
)NTDLL_towupper(LOWORD(x
)));
395 /***********************************************************************
396 * IsCharAlphaA (USER32.331)
397 * FIXME: handle current locale
399 BOOL WINAPI
IsCharAlphaA(CHAR x
)
401 return (OLE2NLS_CT_CType3_LUT
[(unsigned char)x
] & C3_ALPHA
);
404 /***********************************************************************
405 * IsCharAlphaNumericA (USER32.332)
406 * FIXME: handle current locale
408 BOOL WINAPI
IsCharAlphaNumericA(CHAR x
)
410 return IsCharAlphaA(x
) || isdigit(x
) ;
413 /***********************************************************************
414 * IsCharAlphaNumericW (USER32.333)
415 * FIXME: handle current locale
417 BOOL WINAPI
IsCharAlphaNumericW(WCHAR x
)
422 /***********************************************************************
423 * IsCharAlphaW (USER32.334)
424 * FIXME: handle current locale
426 BOOL WINAPI
IsCharAlphaW(WCHAR x
)
431 /***********************************************************************
432 * IsCharLowerA (USER32.335)
433 * FIXME: handle current locale
435 BOOL WINAPI
IsCharLowerA(CHAR x
)
440 /***********************************************************************
441 * IsCharLowerW (USER32.336)
442 * FIXME: handle current locale
444 BOOL WINAPI
IsCharLowerW(WCHAR x
)
449 /***********************************************************************
450 * IsCharUpperA (USER32.337)
451 * FIXME: handle current locale
453 BOOL WINAPI
IsCharUpperA(CHAR x
)
458 /***********************************************************************
459 * IsCharUpperW (USER32.338)
460 * FIXME: handle current locale
462 BOOL WINAPI
IsCharUpperW(WCHAR x
)
467 /***********************************************************************
468 * FormatMessage16 (USER.606)
470 DWORD WINAPI
FormatMessage16(
472 SEGPTR lpSource
, /*not always a valid pointer*/
475 LPSTR lpBuffer
, /* *((HLOCAL16*)) for FORMAT_MESSAGE_ALLOCATE_BUFFER*/
477 LPDWORD args
/* va_list *args */
480 /* This implementation is completely dependant on the format of the va_list on x86 CPUs */
484 DWORD width
= dwFlags
& FORMAT_MESSAGE_MAX_WIDTH_MASK
;
486 LPSTR allocstring
= NULL
;
488 TRACE("(0x%lx,%lx,%d,0x%x,%p,%d,%p)\n",
489 dwFlags
,lpSource
,dwMessageId
,dwLanguageId
,lpBuffer
,nSize
,args
);
491 FIXME("line wrapping not supported.\n");
493 if (dwFlags
& FORMAT_MESSAGE_FROM_STRING
)
494 from
= HEAP_strdupA( GetProcessHeap(), 0, PTR_SEG_TO_LIN(lpSource
));
495 if (dwFlags
& FORMAT_MESSAGE_FROM_SYSTEM
) {
496 from
= HeapAlloc( GetProcessHeap(),0,200 );
497 sprintf(from
,"Systemmessage, messageid = 0x%08x\n",dwMessageId
);
499 if (dwFlags
& FORMAT_MESSAGE_FROM_HMODULE
) {
501 HINSTANCE16 hinst16
= ((HMODULE
)lpSource
& 0xffff);
503 dwMessageId
&= 0xFFFF;
504 bufsize
=LoadString16(hinst16
,dwMessageId
,NULL
,0);
506 from
= HeapAlloc( GetProcessHeap(), 0, bufsize
+1);
507 LoadString16(hinst16
,dwMessageId
,from
,bufsize
+1);
510 target
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 100);
514 #define ADD_TO_T(c) \
516 if (t-target == talloced) {\
517 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\
518 t = target+talloced;\
527 char *fmtstr
,*sprintfbuf
,*x
,*lastf
;
538 case '1':case '2':case '3':case '4':case '5':
539 case '6':case '7':case '8':case '9':
542 case '0':case '1':case '2':case '3':
543 case '4':case '5':case '6':case '7':
546 insertnr
=insertnr
*10+*f
-'0';
555 if (NULL
!=(x
=strchr(f
,'!'))) {
557 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
)+2);
558 sprintf(fmtstr
,"%%%s",f
);
561 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
));
562 sprintf(fmtstr
,"%%%s",f
);
563 f
+=strlen(f
); /*at \0*/
569 fmtstr
=HEAP_strdupA(GetProcessHeap(),0,"%s");
571 argliststart
=args
+insertnr
-1;
572 if (fmtstr
[strlen(fmtstr
)-1]=='s')
573 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,
574 strlen(PTR_SEG_TO_LIN(argliststart
[0]))+1);
576 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,100);
578 /* CMF - This makes a BIG assumption about va_list */
579 wvsprintf16(sprintfbuf
, fmtstr
, (va_list) argliststart
);
584 HeapFree(GetProcessHeap(),0,sprintfbuf
);
586 /* NULL args - copy formatstr
589 while ((lastf
<f
)&&(*lastf
)) {
593 HeapFree(GetProcessHeap(),0,fmtstr
);
595 case '0': /* Just stop processing format string */
599 case 'n': /* 16 bit version just outputs 'n' */
604 } else { /* '\n' or '\r' gets mapped to "\r\n" */
605 if(*f
== '\n' || *f
== '\r') {
608 if(*f
++ == '\r' && *f
== '\n')
617 talloced
= strlen(target
)+1;
618 if (nSize
&& talloced
<nSize
) {
619 target
= (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,target
,nSize
);
621 TRACE("-- %s\n",debugstr_a(target
));
622 if (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) {
623 /* nSize is the MINIMUM size */
624 *((HLOCAL16
*)lpBuffer
)= LocalAlloc16(LPTR
,talloced
);
625 allocstring
=PTR_SEG_OFF_TO_LIN(CURRENT_DS
,*((HLOCAL16
*)lpBuffer
));
626 memcpy( allocstring
,target
,talloced
);
628 lstrcpynA(lpBuffer
,target
,nSize
);
629 HeapFree(GetProcessHeap(),0,target
);
630 if (from
) HeapFree(GetProcessHeap(),0,from
);
631 return (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) ?
636 #endif /* __i386__ */
640 /***********************************************************************
641 * FormatMessageA (KERNEL32.138)
642 * FIXME: missing wrap,FROM_SYSTEM message-loading,
644 DWORD WINAPI
FormatMessageA(
651 LPDWORD args
/* va_list *args */
654 /* This implementation is completely dependant on the format of the va_list on x86 CPUs */
658 DWORD width
= dwFlags
& FORMAT_MESSAGE_MAX_WIDTH_MASK
;
661 TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n",
662 dwFlags
,lpSource
,dwMessageId
,dwLanguageId
,lpBuffer
,nSize
,args
);
664 FIXME("line wrapping not supported.\n");
666 if (dwFlags
& FORMAT_MESSAGE_FROM_STRING
)
667 from
= HEAP_strdupA( GetProcessHeap(), 0, (LPSTR
)lpSource
);
668 if (dwFlags
& FORMAT_MESSAGE_FROM_SYSTEM
) {
669 from
= HeapAlloc( GetProcessHeap(),0,200 );
670 sprintf(from
,"Systemmessage, messageid = 0x%08lx\n",dwMessageId
);
672 if (dwFlags
& FORMAT_MESSAGE_FROM_HMODULE
) {
675 dwMessageId
&= 0xFFFF;
676 bufsize
=LoadMessageA((HMODULE
)lpSource
,dwMessageId
,dwLanguageId
,NULL
,100);
678 from
= HeapAlloc( GetProcessHeap(), 0, bufsize
+ 1 );
679 LoadMessageA((HMODULE
)lpSource
,dwMessageId
,dwLanguageId
,from
,bufsize
+1);
682 target
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 100);
686 #define ADD_TO_T(c) \
688 if (t-target == talloced) {\
689 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\
690 t = target+talloced;\
699 char *fmtstr
,*sprintfbuf
,*x
,*lastf
;
710 case '1':case '2':case '3':case '4':case '5':
711 case '6':case '7':case '8':case '9':
714 case '0':case '1':case '2':case '3':
715 case '4':case '5':case '6':case '7':
718 insertnr
=insertnr
*10+*f
-'0';
727 if (NULL
!=(x
=strchr(f
,'!'))) {
729 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
)+2);
730 sprintf(fmtstr
,"%%%s",f
);
733 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
));
734 sprintf(fmtstr
,"%%%s",f
);
735 f
+=strlen(f
); /*at \0*/
741 fmtstr
=HEAP_strdupA(GetProcessHeap(),0,"%s");
743 if (dwFlags
& FORMAT_MESSAGE_ARGUMENT_ARRAY
)
744 argliststart
=args
+insertnr
-1;
746 argliststart
=(*(DWORD
**)args
)+insertnr
-1;
748 if (fmtstr
[strlen(fmtstr
)-1]=='s' && argliststart
[0])
749 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,strlen((LPSTR
)argliststart
[0])+1);
751 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,100);
753 /* CMF - This makes a BIG assumption about va_list */
754 wvsprintfA(sprintfbuf
, fmtstr
, (va_list) argliststart
);
759 HeapFree(GetProcessHeap(),0,sprintfbuf
);
761 /* NULL args - copy formatstr
764 while ((lastf
<f
)&&(*lastf
)) {
768 HeapFree(GetProcessHeap(),0,fmtstr
);
783 } else { /* '\n' or '\r' gets mapped to "\r\n" */
784 if(*f
== '\n' || *f
== '\r') {
787 if(*f
++ == '\r' && *f
== '\n')
796 talloced
= strlen(target
)+1;
797 if (nSize
&& talloced
<nSize
) {
798 target
= (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,target
,nSize
);
800 TRACE("-- %s\n",debugstr_a(target
));
801 if (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) {
802 /* nSize is the MINIMUM size */
803 *((LPVOID
*)lpBuffer
) = (LPVOID
)LocalAlloc(GMEM_ZEROINIT
,talloced
);
804 memcpy(*(LPSTR
*)lpBuffer
,target
,talloced
);
806 lstrcpynA(lpBuffer
,target
,nSize
);
808 HeapFree(GetProcessHeap(),0,target
);
809 if (from
) HeapFree(GetProcessHeap(),0,from
);
810 return (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) ?
811 strlen(*(LPSTR
*)lpBuffer
):
815 #endif /* __i386__ */
820 /***********************************************************************
821 * FormatMessageW (KERNEL32.138)
823 DWORD WINAPI
FormatMessageW(
830 LPDWORD args
/* va_list *args */
833 /* This implementation is completely dependant on the format of the va_list on x86 CPUs */
837 DWORD width
= dwFlags
& FORMAT_MESSAGE_MAX_WIDTH_MASK
;
840 TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n",
841 dwFlags
,lpSource
,dwMessageId
,dwLanguageId
,lpBuffer
,nSize
,args
);
843 FIXME("line wrapping not supported.\n");
845 if (dwFlags
& FORMAT_MESSAGE_FROM_STRING
)
846 from
= HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR
)lpSource
);
847 if (dwFlags
& FORMAT_MESSAGE_FROM_SYSTEM
) {
848 /* gather information from system message tables ... */
849 from
= HeapAlloc( GetProcessHeap(),0,200 );
850 sprintf(from
,"Systemmessage, messageid = 0x%08lx\n",dwMessageId
);
852 if (dwFlags
& FORMAT_MESSAGE_FROM_HMODULE
) {
855 dwMessageId
&= 0xFFFF;
856 bufsize
=LoadMessageA((HMODULE
)lpSource
,dwMessageId
,dwLanguageId
,NULL
,100);
859 from
= HeapAlloc( GetProcessHeap(), 0, bufsize
+ 1 );
860 LoadMessageA((HMODULE
)lpSource
,dwMessageId
,dwLanguageId
,from
,bufsize
+1);
863 target
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 100 );
867 #define ADD_TO_T(c) \
869 if (t-target == talloced) {\
870 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\
871 t = target+talloced;\
880 char *fmtstr
,*sprintfbuf
,*x
;
890 case '1':case '2':case '3':case '4':case '5':
891 case '6':case '7':case '8':case '9':
894 case '0':case '1':case '2':case '3':
895 case '4':case '5':case '6':case '7':
898 insertnr
=insertnr
*10+*f
-'0';
907 if (NULL
!=(x
=strchr(f
,'!')))
910 fmtstr
=HeapAlloc( GetProcessHeap(), 0, strlen(f
)+2);
911 sprintf(fmtstr
,"%%%s",f
);
914 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
));
915 sprintf(fmtstr
,"%%%s",f
);
916 f
+=strlen(f
); /*at \0*/
922 fmtstr
=HEAP_strdupA( GetProcessHeap(),0,"%s");
923 if (dwFlags
& FORMAT_MESSAGE_ARGUMENT_ARRAY
)
924 argliststart
=args
+insertnr
-1;
926 argliststart
=(*(DWORD
**)args
)+insertnr
-1;
928 if (fmtstr
[strlen(fmtstr
)-1]=='s' && argliststart
[0]) {
931 xarr
[0]=(DWORD
)HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR
)(*(argliststart
+0)));
932 /* possible invalid pointers */
933 xarr
[1]=*(argliststart
+1);
934 xarr
[2]=*(argliststart
+2);
935 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,lstrlenW((LPWSTR
)argliststart
[0])*2+1);
937 /* CMF - This makes a BIG assumption about va_list */
938 vsprintf(sprintfbuf
, fmtstr
, (va_list) xarr
);
940 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,100);
942 /* CMF - This makes a BIG assumption about va_list */
943 wvsprintfA(sprintfbuf
, fmtstr
, (va_list) argliststart
);
949 HeapFree(GetProcessHeap(),0,sprintfbuf
);
950 HeapFree(GetProcessHeap(),0,fmtstr
);
965 } else { /* '\n' or '\r' gets mapped to "\r\n" */
966 if(*f
== '\n' || *f
== '\r') {
969 if(*f
++ == '\r' && *f
== '\n')
978 talloced
= strlen(target
)+1;
979 if (nSize
&& talloced
<nSize
)
980 target
= (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,target
,nSize
);
981 if (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) {
982 /* nSize is the MINIMUM size */
983 *((LPVOID
*)lpBuffer
) = (LPVOID
)LocalAlloc(GMEM_ZEROINIT
,talloced
*2+2);
984 lstrcpynAtoW(*(LPWSTR
*)lpBuffer
,target
,talloced
);
986 lstrcpynAtoW(lpBuffer
,target
,nSize
);
987 HeapFree(GetProcessHeap(),0,target
);
988 if (from
) HeapFree(GetProcessHeap(),0,from
);
989 return (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) ?
990 lstrlenW(*(LPWSTR
*)lpBuffer
):
994 #endif /* __i386__ */