4 * Copyright 1993 Yngvi Sigurjonsson (yngvi@hafro.is)
5 * Copyright 1996 Marcus Meissner
18 # define iswalnum(c) isalnum(c)
19 # define iswalpha(c) isalpha(c)
20 # define iswupper(c) isupper(c)
21 # define iswlower(c) islower(c)
22 #endif /* HAVE_WCTYPE_H */
24 #include "wine/winbase16.h"
25 #include "wine/winuser16.h"
32 #include "stackframe.h"
34 #include "debugtools.h"
36 DEFAULT_DEBUG_CHANNEL(resource
)
38 extern const WORD OLE2NLS_CT_CType3_LUT
[]; /* FIXME: does not belong here */
41 /* Funny to divide them between user and kernel. */
43 /* be careful: always use functions from wctype.h if character > 255 */
46 * Unicode case conversion routines ... these should be used where
47 * toupper/tolower are used for ASCII.
50 /* FIXME: should probably get rid of wctype.h altogether */
53 WCHAR
towupper(WCHAR code
)
55 const WCHAR
* ptr
= uprtable
[HIBYTE(code
)];
56 return ptr
? ptr
[LOBYTE(code
)] : code
;
59 WCHAR
towlower(WCHAR code
)
61 const WCHAR
* ptr
= lwrtable
[HIBYTE(code
)];
62 return ptr
? ptr
[LOBYTE(code
)] : code
;
64 #endif /* HAVE_WCTYPE_H */
66 /***********************************************************************
67 * IsCharAlpha (USER.433)
69 BOOL16 WINAPI
IsCharAlpha16(CHAR ch
)
71 return isalpha(ch
); /* This is probably not right for NLS */
74 /***********************************************************************
75 * IsCharAlphanumeric (USER.434)
77 BOOL16 WINAPI
IsCharAlphaNumeric16(CHAR ch
)
82 /***********************************************************************
83 * IsCharUpper (USER.435)
85 BOOL16 WINAPI
IsCharUpper16(CHAR ch
)
90 /***********************************************************************
91 * IsCharLower (USER.436)
93 BOOL16 WINAPI
IsCharLower16(CHAR ch
)
98 /***********************************************************************
99 * AnsiUpper16 (USER.431)
101 SEGPTR WINAPI
AnsiUpper16( SEGPTR strOrChar
)
103 /* I am not sure if the locale stuff works with toupper, but then again
104 I am not sure if the Linux libc locale stuffs works at all */
106 /* uppercase only one char if strOrChar < 0x10000 */
107 if (HIWORD(strOrChar
))
110 for (s
= PTR_SEG_TO_LIN(strOrChar
); *s
; s
++) *s
= toupper(*s
);
113 else return toupper((char)strOrChar
);
117 /***********************************************************************
118 * AnsiUpperBuff16 (USER.437)
120 UINT16 WINAPI
AnsiUpperBuff16( LPSTR str
, UINT16 len
)
122 UINT count
= len
? len
: 65536;
123 for (; count
; count
--, str
++) *str
= toupper(*str
);
127 /***********************************************************************
128 * AnsiLower16 (USER.432)
130 SEGPTR WINAPI
AnsiLower16( SEGPTR strOrChar
)
132 /* I am not sure if the locale stuff works with toupper, but then again
133 I am not sure if the Linux libc locale stuffs works at all */
135 /* lowercase only one char if strOrChar < 0x10000 */
136 if (HIWORD(strOrChar
))
139 for (s
= PTR_SEG_TO_LIN( strOrChar
); *s
; s
++) *s
= tolower( *s
);
142 else return tolower((char)strOrChar
);
146 /***********************************************************************
147 * AnsiLowerBuff16 (USER.438)
149 UINT16 WINAPI
AnsiLowerBuff16( LPSTR str
, UINT16 len
)
151 UINT count
= len
? len
: 65536;
152 for (; count
; count
--, str
++) *str
= tolower(*str
);
157 /***********************************************************************
158 * AnsiNext16 (USER.472)
160 SEGPTR WINAPI
AnsiNext16(SEGPTR current
)
162 return (*(char *)PTR_SEG_TO_LIN(current
)) ? current
+ 1 : current
;
166 /***********************************************************************
167 * AnsiPrev16 (USER.473)
169 SEGPTR WINAPI
AnsiPrev16( SEGPTR start
, SEGPTR current
)
171 return (current
== start
) ? start
: current
- 1;
175 /***********************************************************************
176 * CharNext32A (USER32.29)
178 LPSTR WINAPI
CharNextA( LPCSTR ptr
)
180 if (!*ptr
) return (LPSTR
)ptr
;
181 if (IsDBCSLeadByte( *ptr
)) return (LPSTR
)(ptr
+ 2);
182 return (LPSTR
)(ptr
+ 1);
186 /***********************************************************************
187 * CharNextEx32A (USER32.30)
189 LPSTR WINAPI
CharNextExA( WORD codepage
, LPCSTR ptr
, DWORD flags
)
191 if (!*ptr
) return (LPSTR
)ptr
;
192 if (IsDBCSLeadByteEx( codepage
, *ptr
)) return (LPSTR
)(ptr
+ 2);
193 return (LPSTR
)(ptr
+ 1);
197 /***********************************************************************
198 * CharNextExW (USER32.31)
200 LPWSTR WINAPI
CharNextExW(WORD codepage
,LPCWSTR x
,DWORD flags
)
202 /* FIXME: add DBCS / codepage stuff */
203 if (*x
) return (LPWSTR
)(x
+1);
204 else return (LPWSTR
)x
;
207 /***********************************************************************
208 * CharNextW (USER32.32)
210 LPWSTR WINAPI
CharNextW(LPCWSTR x
)
212 if (*x
) return (LPWSTR
)(x
+1);
213 else return (LPWSTR
)x
;
216 /***********************************************************************
217 * CharPrev32A (USER32.33)
219 LPSTR WINAPI
CharPrevA( LPCSTR start
, LPCSTR ptr
)
221 while (*start
&& (start
< ptr
))
223 LPCSTR next
= CharNextA( start
);
224 if (next
>= ptr
) break;
231 /***********************************************************************
232 * CharPrevEx32A (USER32.34)
234 LPSTR WINAPI
CharPrevExA( WORD codepage
, LPCSTR start
, LPCSTR ptr
, DWORD flags
)
236 while (*start
&& (start
< ptr
))
238 LPCSTR next
= CharNextExA( codepage
, start
, flags
);
239 if (next
> ptr
) break;
246 /***********************************************************************
247 * CharPrevExW (USER32.35)
249 LPWSTR WINAPI
CharPrevExW(WORD codepage
,LPCWSTR start
,LPCWSTR x
,DWORD flags
)
251 /* FIXME: add DBCS / codepage stuff */
252 if (x
>start
) return (LPWSTR
)(x
-1);
253 else return (LPWSTR
)x
;
256 /***********************************************************************
257 * CharPrevW (USER32.36)
259 LPWSTR WINAPI
CharPrevW(LPCWSTR start
,LPCWSTR x
)
261 if (x
>start
) return (LPWSTR
)(x
-1);
262 else return (LPWSTR
)x
;
265 /***********************************************************************
266 * CharLowerA (USER32.25)
267 * FIXME: handle current locale
269 LPSTR WINAPI
CharLowerA(LPSTR x
)
283 else return (LPSTR
)tolower((char)(int)x
);
286 /***********************************************************************
287 * CharLowerBuffA (USER32.26)
288 * FIXME: handle current locale
290 DWORD WINAPI
CharLowerBuffA(LPSTR x
,DWORD buflen
)
294 if (!x
) return 0; /* YES */
295 while (*x
&& (buflen
--))
304 /***********************************************************************
305 * CharLowerBuffW (USER32.27)
306 * FIXME: handle current locale
308 DWORD WINAPI
CharLowerBuffW(LPWSTR x
,DWORD buflen
)
312 if (!x
) return 0; /* YES */
313 while (*x
&& (buflen
--))
322 /***********************************************************************
323 * CharLowerW (USER32.28)
324 * FIXME: handle current locale
326 LPWSTR WINAPI
CharLowerW(LPWSTR x
)
338 else return (LPWSTR
)((UINT
)towlower(LOWORD(x
)));
341 /***********************************************************************
342 * CharUpper32A (USER32.41)
343 * FIXME: handle current locale
345 LPSTR WINAPI
CharUpperA(LPSTR x
)
357 return (LPSTR
)toupper((char)(int)x
);
360 /***********************************************************************
361 * CharUpperBuffA (USER32.42)
362 * FIXME: handle current locale
364 DWORD WINAPI
CharUpperBuffA(LPSTR x
,DWORD buflen
)
368 if (!x
) return 0; /* YES */
369 while (*x
&& (buflen
--))
378 /***********************************************************************
379 * CharUpperBuffW (USER32.43)
380 * FIXME: handle current locale
382 DWORD WINAPI
CharUpperBuffW(LPWSTR x
,DWORD buflen
)
386 if (!x
) return 0; /* YES */
387 while (*x
&& (buflen
--))
396 /***********************************************************************
397 * CharUpperW (USER32.44)
398 * FIXME: handle current locale
400 LPWSTR WINAPI
CharUpperW(LPWSTR x
)
412 else return (LPWSTR
)((UINT
)towupper(LOWORD(x
)));
415 /***********************************************************************
416 * IsCharAlphaA (USER32.331)
417 * FIXME: handle current locale
419 BOOL WINAPI
IsCharAlphaA(CHAR x
)
421 return (OLE2NLS_CT_CType3_LUT
[(unsigned char)x
] & C3_ALPHA
);
424 /***********************************************************************
425 * IsCharAlphaNumericA (USER32.332)
426 * FIXME: handle current locale
428 BOOL WINAPI
IsCharAlphaNumericA(CHAR x
)
430 return IsCharAlphaA(x
) || isdigit(x
) ;
433 /***********************************************************************
434 * IsCharAlphaNumericW (USER32.333)
435 * FIXME: handle current locale
437 BOOL WINAPI
IsCharAlphaNumericW(WCHAR x
)
442 /***********************************************************************
443 * IsCharAlphaW (USER32.334)
444 * FIXME: handle current locale
446 BOOL WINAPI
IsCharAlphaW(WCHAR x
)
451 /***********************************************************************
452 * IsCharLower32A (USER32.335)
453 * FIXME: handle current locale
455 BOOL WINAPI
IsCharLowerA(CHAR x
)
460 /***********************************************************************
461 * IsCharLower32W (USER32.336)
462 * FIXME: handle current locale
464 BOOL WINAPI
IsCharLowerW(WCHAR x
)
469 /***********************************************************************
470 * IsCharUpper32A (USER32.337)
471 * FIXME: handle current locale
473 BOOL WINAPI
IsCharUpperA(CHAR x
)
478 /***********************************************************************
479 * IsCharUpper32W (USER32.338)
480 * FIXME: handle current locale
482 BOOL WINAPI
IsCharUpperW(WCHAR x
)
487 /***********************************************************************
488 * FormatMessage16 (USER.606)
490 DWORD WINAPI
FormatMessage16(
492 SEGPTR lpSource
, /*not always a valid pointer*/
495 LPSTR lpBuffer
, /* *((HLOCAL16*)) for FORMAT_MESSAGE_ALLOCATE_BUFFER*/
497 LPDWORD args
/* va_list *args */
500 /* This implementation is completely dependant on the format of the va_list on x86 CPUs */
504 DWORD width
= dwFlags
& FORMAT_MESSAGE_MAX_WIDTH_MASK
;
506 LPSTR allocstring
= NULL
;
508 TRACE("(0x%lx,%lx,%d,0x%x,%p,%d,%p)\n",
509 dwFlags
,lpSource
,dwMessageId
,dwLanguageId
,lpBuffer
,nSize
,args
);
511 FIXME("line wrapping not supported.\n");
513 if (dwFlags
& FORMAT_MESSAGE_FROM_STRING
)
514 from
= HEAP_strdupA( GetProcessHeap(), 0, PTR_SEG_TO_LIN(lpSource
));
515 if (dwFlags
& FORMAT_MESSAGE_FROM_SYSTEM
) {
516 from
= HeapAlloc( GetProcessHeap(),0,200 );
517 sprintf(from
,"Systemmessage, messageid = 0x%08x\n",dwMessageId
);
519 if (dwFlags
& FORMAT_MESSAGE_FROM_HMODULE
) {
521 HINSTANCE16 hinst16
= ((HMODULE
)lpSource
& 0xffff);
523 dwMessageId
&= 0xFFFF;
524 bufsize
=LoadString16(hinst16
,dwMessageId
,NULL
,0);
526 from
= HeapAlloc( GetProcessHeap(), 0, bufsize
+1);
527 LoadString16(hinst16
,dwMessageId
,from
,bufsize
+1);
530 target
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 100);
534 #define ADD_TO_T(c) \
536 if (t-target == talloced) {\
537 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\
538 t = target+talloced;\
547 char *fmtstr
,*sprintfbuf
,*x
,*lastf
;
558 case '1':case '2':case '3':case '4':case '5':
559 case '6':case '7':case '8':case '9':
562 case '0':case '1':case '2':case '3':
563 case '4':case '5':case '6':case '7':
566 insertnr
=insertnr
*10+*f
-'0';
575 if (NULL
!=(x
=strchr(f
,'!'))) {
577 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
)+2);
578 sprintf(fmtstr
,"%%%s",f
);
581 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
));
582 sprintf(fmtstr
,"%%%s",f
);
583 f
+=strlen(f
); /*at \0*/
589 fmtstr
=HEAP_strdupA(GetProcessHeap(),0,"%s");
591 argliststart
=args
+insertnr
-1;
592 if (fmtstr
[strlen(fmtstr
)-1]=='s')
593 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,
594 strlen(PTR_SEG_TO_LIN(argliststart
[0]))+1);
596 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,100);
598 /* CMF - This makes a BIG assumption about va_list */
599 wvsprintf16(sprintfbuf
, fmtstr
, (va_list) argliststart
);
604 HeapFree(GetProcessHeap(),0,sprintfbuf
);
606 /* NULL args - copy formatstr
609 while ((lastf
<f
)&&(*lastf
)) {
613 HeapFree(GetProcessHeap(),0,fmtstr
);
615 case '0': /* Just stop processing format string */
619 case 'n': /* 16 bit version just outputs 'n' */
624 } else { /* '\n' or '\r' gets mapped to "\r\n" */
625 if(*f
== '\n' || *f
== '\r') {
628 if(*f
++ == '\r' && *f
== '\n')
637 talloced
= strlen(target
)+1;
638 if (nSize
&& talloced
<nSize
) {
639 target
= (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,target
,nSize
);
641 TRACE("-- %s\n",debugstr_a(target
));
642 if (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) {
643 /* nSize is the MINIMUM size */
644 *((HLOCAL16
*)lpBuffer
)= LocalAlloc16(LPTR
,talloced
);
645 allocstring
=PTR_SEG_OFF_TO_LIN(CURRENT_DS
,*((HLOCAL16
*)lpBuffer
));
646 memcpy( allocstring
,target
,talloced
);
648 strncpy(lpBuffer
,target
,nSize
);
649 HeapFree(GetProcessHeap(),0,target
);
650 if (from
) HeapFree(GetProcessHeap(),0,from
);
651 return (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) ?
656 #endif /* __i386__ */
660 /***********************************************************************
661 * FormatMessageA (KERNEL32.138)
662 * FIXME: missing wrap,FROM_SYSTEM message-loading,
664 DWORD WINAPI
FormatMessageA(
671 LPDWORD args
/* va_list *args */
674 /* This implementation is completely dependant on the format of the va_list on x86 CPUs */
678 DWORD width
= dwFlags
& FORMAT_MESSAGE_MAX_WIDTH_MASK
;
681 TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n",
682 dwFlags
,lpSource
,dwMessageId
,dwLanguageId
,lpBuffer
,nSize
,args
);
684 FIXME("line wrapping not supported.\n");
686 if (dwFlags
& FORMAT_MESSAGE_FROM_STRING
)
687 from
= HEAP_strdupA( GetProcessHeap(), 0, (LPSTR
)lpSource
);
688 if (dwFlags
& FORMAT_MESSAGE_FROM_SYSTEM
) {
689 from
= HeapAlloc( GetProcessHeap(),0,200 );
690 sprintf(from
,"Systemmessage, messageid = 0x%08lx\n",dwMessageId
);
692 if (dwFlags
& FORMAT_MESSAGE_FROM_HMODULE
) {
695 dwMessageId
&= 0xFFFF;
696 bufsize
=LoadMessageA((HMODULE
)lpSource
,dwMessageId
,dwLanguageId
,NULL
,100);
698 from
= HeapAlloc( GetProcessHeap(), 0, bufsize
+ 1 );
699 LoadMessageA((HMODULE
)lpSource
,dwMessageId
,dwLanguageId
,from
,bufsize
+1);
702 target
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 100);
706 #define ADD_TO_T(c) \
708 if (t-target == talloced) {\
709 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\
710 t = target+talloced;\
719 char *fmtstr
,*sprintfbuf
,*x
,*lastf
;
730 case '1':case '2':case '3':case '4':case '5':
731 case '6':case '7':case '8':case '9':
734 case '0':case '1':case '2':case '3':
735 case '4':case '5':case '6':case '7':
738 insertnr
=insertnr
*10+*f
-'0';
747 if (NULL
!=(x
=strchr(f
,'!'))) {
749 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
)+2);
750 sprintf(fmtstr
,"%%%s",f
);
753 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
));
754 sprintf(fmtstr
,"%%%s",f
);
755 f
+=strlen(f
); /*at \0*/
761 fmtstr
=HEAP_strdupA(GetProcessHeap(),0,"%s");
763 if (dwFlags
& FORMAT_MESSAGE_ARGUMENT_ARRAY
)
764 argliststart
=args
+insertnr
-1;
766 argliststart
=(*(DWORD
**)args
)+insertnr
-1;
768 if (fmtstr
[strlen(fmtstr
)-1]=='s' && argliststart
[0])
769 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,strlen((LPSTR
)argliststart
[0])+1);
771 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,100);
773 /* CMF - This makes a BIG assumption about va_list */
774 wvsprintfA(sprintfbuf
, fmtstr
, (va_list) argliststart
);
779 HeapFree(GetProcessHeap(),0,sprintfbuf
);
781 /* NULL args - copy formatstr
784 while ((lastf
<f
)&&(*lastf
)) {
788 HeapFree(GetProcessHeap(),0,fmtstr
);
803 } else { /* '\n' or '\r' gets mapped to "\r\n" */
804 if(*f
== '\n' || *f
== '\r') {
807 if(*f
++ == '\r' && *f
== '\n')
816 talloced
= strlen(target
)+1;
817 if (nSize
&& talloced
<nSize
) {
818 target
= (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,target
,nSize
);
820 TRACE("-- %s\n",debugstr_a(target
));
821 if (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) {
822 /* nSize is the MINIMUM size */
823 *((LPVOID
*)lpBuffer
) = (LPVOID
)LocalAlloc(GMEM_ZEROINIT
,talloced
);
824 memcpy(*(LPSTR
*)lpBuffer
,target
,talloced
);
826 strncpy(lpBuffer
,target
,nSize
);
827 HeapFree(GetProcessHeap(),0,target
);
828 if (from
) HeapFree(GetProcessHeap(),0,from
);
829 return (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) ?
830 strlen(*(LPSTR
*)lpBuffer
):
834 #endif /* __i386__ */
839 /***********************************************************************
840 * FormatMessageW (KERNEL32.138)
842 DWORD WINAPI
FormatMessageW(
849 LPDWORD args
/* va_list *args */
852 /* This implementation is completely dependant on the format of the va_list on x86 CPUs */
856 DWORD width
= dwFlags
& FORMAT_MESSAGE_MAX_WIDTH_MASK
;
859 TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n",
860 dwFlags
,lpSource
,dwMessageId
,dwLanguageId
,lpBuffer
,nSize
,args
);
862 FIXME("line wrapping not supported.\n");
864 if (dwFlags
& FORMAT_MESSAGE_FROM_STRING
)
865 from
= HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR
)lpSource
);
866 if (dwFlags
& FORMAT_MESSAGE_FROM_SYSTEM
) {
867 /* gather information from system message tables ... */
868 from
= HeapAlloc( GetProcessHeap(),0,200 );
869 sprintf(from
,"Systemmessage, messageid = 0x%08lx\n",dwMessageId
);
871 if (dwFlags
& FORMAT_MESSAGE_FROM_HMODULE
) {
874 dwMessageId
&= 0xFFFF;
875 bufsize
=LoadMessageA((HMODULE
)lpSource
,dwMessageId
,dwLanguageId
,NULL
,100);
878 from
= HeapAlloc( GetProcessHeap(), 0, bufsize
+ 1 );
879 LoadMessageA((HMODULE
)lpSource
,dwMessageId
,dwLanguageId
,from
,bufsize
+1);
882 target
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 100 );
886 #define ADD_TO_T(c) \
888 if (t-target == talloced) {\
889 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\
890 t = target+talloced;\
899 char *fmtstr
,*sprintfbuf
,*x
;
909 case '1':case '2':case '3':case '4':case '5':
910 case '6':case '7':case '8':case '9':
913 case '0':case '1':case '2':case '3':
914 case '4':case '5':case '6':case '7':
917 insertnr
=insertnr
*10+*f
-'0';
926 if (NULL
!=(x
=strchr(f
,'!')))
929 fmtstr
=HeapAlloc( GetProcessHeap(), 0, strlen(f
)+2);
930 sprintf(fmtstr
,"%%%s",f
);
933 fmtstr
=HeapAlloc(GetProcessHeap(),0,strlen(f
));
934 sprintf(fmtstr
,"%%%s",f
);
935 f
+=strlen(f
); /*at \0*/
941 fmtstr
=HEAP_strdupA( GetProcessHeap(),0,"%s");
942 if (dwFlags
& FORMAT_MESSAGE_ARGUMENT_ARRAY
)
943 argliststart
=args
+insertnr
-1;
945 argliststart
=(*(DWORD
**)args
)+insertnr
-1;
947 if (fmtstr
[strlen(fmtstr
)-1]=='s' && argliststart
[0]) {
950 xarr
[0]=(DWORD
)HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR
)(*(argliststart
+0)));
951 /* possible invalid pointers */
952 xarr
[1]=*(argliststart
+1);
953 xarr
[2]=*(argliststart
+2);
954 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,lstrlenW((LPWSTR
)argliststart
[0])*2+1);
956 /* CMF - This makes a BIG assumption about va_list */
957 vsprintf(sprintfbuf
, fmtstr
, (va_list) xarr
);
959 sprintfbuf
=HeapAlloc(GetProcessHeap(),0,100);
961 /* CMF - This makes a BIG assumption about va_list */
962 wvsprintfA(sprintfbuf
, fmtstr
, (va_list) argliststart
);
968 HeapFree(GetProcessHeap(),0,sprintfbuf
);
969 HeapFree(GetProcessHeap(),0,fmtstr
);
984 } else { /* '\n' or '\r' gets mapped to "\r\n" */
985 if(*f
== '\n' || *f
== '\r') {
988 if(*f
++ == '\r' && *f
== '\n')
997 talloced
= strlen(target
)+1;
998 if (nSize
&& talloced
<nSize
)
999 target
= (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,target
,nSize
);
1000 if (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) {
1001 /* nSize is the MINIMUM size */
1002 *((LPVOID
*)lpBuffer
) = (LPVOID
)LocalAlloc(GMEM_ZEROINIT
,talloced
*2+2);
1003 lstrcpynAtoW(*(LPWSTR
*)lpBuffer
,target
,talloced
);
1005 lstrcpynAtoW(lpBuffer
,target
,nSize
);
1006 HeapFree(GetProcessHeap(),0,target
);
1007 if (from
) HeapFree(GetProcessHeap(),0,from
);
1008 return (dwFlags
& FORMAT_MESSAGE_ALLOCATE_BUFFER
) ?
1009 lstrlenW(*(LPWSTR
*)lpBuffer
):
1013 #endif /* __i386__ */