update for HEAD-2003021201
[reactos.git] / lib / kernel32 / nls / wctomb.c
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3                     Addition copyrights might be specified in LGPL.c
4  * PROJECT:         ReactOS system libraries
5  * FILE:            lib/kernel32/nls/wctomb.c
6  * PURPOSE:         National language support functions
7  * PROGRAMMER:      Boudewijn ( ariadne@xs4all.nl)
8  * UPDATE HISTORY:  Modified from Onno Hovers wfc. ( 08/02/99 )
9  *                  
10  */
11
12 /*
13  * nls/wctomb.c
14  * Copyright (c) 1996, Onno Hovers, All rights reserved
15  */
16  
17 #include <windows.h>
18
19 #include <kernel32/nls.h>
20 #include <kernel32/thread.h>
21 #include <wchar.h>
22
23 #define NDEBUG
24 #include <kernel32/kernel32.h>
25
26 extern PLOCALE  __TebLocale;
27
28 #define GetTebLocale() __TebLocale
29  
30 INT 
31 STDCALL
32 WideCharToMultiByte(UINT cpid, DWORD flags, LPCWSTR src, int srclen,
33                         LPSTR dest, int destlen, LPCSTR pdefchar,
34                         LPBOOL pdefused )
35 {
36    PCODEPAGE pcodepage = __CPFirst;
37    BOOL      defused=FALSE;   
38    INT       copylen;
39    INT       retlen;  
40    CHAR      ***utoa;
41    CHAR      defchar='?';   
42    CHAR      d;
43    WCHAR     c;  
44   
45    DPRINT("WideCharToMultiByte()\n");
46     
47    /* get codepage */
48    switch(cpid)
49    {
50       case CP_ACP:   pcodepage=GetTebLocale()->OemCodePage;  break;
51       case CP_OEMCP: pcodepage=GetTebLocale()->AnsiCodePage; break;
52       case CP_MACCP: pcodepage=&__CP10000;   break;
53       default:
54          pcodepage=__CPFirst;
55          while((pcodepage)&&(pcodepage->Id!=cpid))
56             pcodepage=pcodepage->Next;
57    } 
58    if(pcodepage==NULL)
59       { SetLastError(ERROR_INVALID_PARAMETER); return 0; }
60       
61    /* get conversion table */
62    utoa=pcodepage->FromUnicode;
63    
64    /* get default char */   
65    if(pdefchar)
66       defchar=*pdefchar;
67    else
68       defchar=pcodepage->Info->DefaultChar[0];
69    
70    
71    if(destlen!=0)
72    {
73       /* how long are we ?? */   
74       if(srclen==0)
75          srclen=wcslen(src);
76       
77       copylen=min(srclen,destlen);
78       retlen=copylen;
79       
80       /* XXX: maybe some inline assembly to speed things up, here ??? */
81       while(copylen>0)
82       {
83          c=*src;
84                  
85          d=utoa[c>>10][(c>>5)&0x1F][(c)&0x1F];
86          if((!d)&&(c))
87          {
88             d=defchar;
89             defused=TRUE;
90          }
91          *dest=d;
92          src++;
93          dest++;
94          copylen--;       
95       }
96    }
97    else
98    {
99       /* XXXX: composites etc. */
100       retlen = wcslen(src);
101    }
102    return retlen;
103 }