Release 940420
[wine] / misc / lstr.c
1 static char Copyright[] = "Copyright  Yngvi Sigurjonsson (yngvi@hafro.is), 1993";
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <ctype.h>
7 #include <sys/types.h>
8 #include <fcntl.h>
9 #include <unistd.h>
10
11 #include "prototypes.h"
12 #include "regfunc.h"
13 #include "windows.h"
14
15
16   /* Funny to divide them between user and kernel. */
17
18 /* KERNEL.89 */
19 LPSTR lstrcat(LPSTR target,LPCSTR source)
20 {
21   fprintf(stderr,"lstrcat(%s,%s)\n",target,source);
22   return strcat(target,source);
23 }
24
25 /* USER.430 */
26 INT lstrcmp(LPCSTR str1,LPCSTR str2)
27 {
28   return strcmp(str1,str2);
29 }
30
31 /* USER.471 */
32 INT lstrcmpi(LPCSTR str1,LPCSTR str2)
33 {
34   int i;
35   i=0;
36   while((toupper(str1[i])==toupper(str2[i]))&&(str1[i]!=0))
37     i++;
38   return toupper(str1[i])-toupper(str2[i]);
39 }
40
41 /* KERNEL.88 */
42 LPSTR lstrcpy(LPSTR target,LPCSTR source)
43 {
44   return strcpy(target,source);
45 }
46
47 /* KERNEL.353 */
48 LPSTR lstrcpyn(LPSTR target,LPCSTR source,int n)
49 {
50   return strncpy(target,source,n);
51 }
52
53 /* KERNEL.90 */
54 INT lstrlen(LPCSTR str)
55 {
56   return strlen(str);
57 }
58
59 /* AnsiUpper USER.431 */
60 char FAR* AnsiUpper(char FAR* strOrChar)
61 {
62   /* I am not sure if the locale stuff works with toupper, but then again 
63      I am not sure if the Linux libc locale stuffs works at all */
64   if((int)strOrChar<256)
65     return (char FAR*) toupper((int)strOrChar);
66   else {
67     int i;
68     for(i=0;(i<65536)&&strOrChar[i];i++)
69       strOrChar[i]=toupper(strOrChar[i]);
70     return strOrChar;   
71   }
72 }
73
74 /* AnsiLower USER.432 */
75 char FAR* AnsiLower(char FAR* strOrChar)
76 {
77   /* I am not sure if the locale stuff works with tolower, but then again 
78      I am not sure if the Linux libc locale stuffs works at all */
79   if((int)strOrChar<256)
80     return (char FAR*)tolower((int)strOrChar);
81   else {
82     int i;
83     for(i=0;(i<65536)&&strOrChar[i];i++)
84       strOrChar[i]=tolower(strOrChar[i]);
85     return strOrChar;   
86   }
87 }
88
89 /* AnsiUpperBuff USER.437 */
90 UINT AnsiUpperBuff(LPSTR str,UINT len)
91 {
92   int i;
93   len=(len==0)?65536:len;
94
95   for(i=0;i<len;i++)
96     str[i]=toupper(str[i]);
97   return i;     
98 }
99
100 /* AnsiLowerBuff USER.438 */
101 UINT AnsiLowerBuff(LPSTR str,UINT len)
102 {
103   int i;
104   len=(len==0)?65536:len;
105   i=0;
106
107   for(i=0;i<len;i++)
108     str[i]=tolower(str[i]);
109  
110   return i;     
111 }
112
113 /* AnsiNext USER.472 */
114 LPSTR AnsiNext(LPSTR current)
115 {
116   return (*current)?current+1:current;
117 }
118
119 /* AnsiPrev USER.473 */
120 char FAR*  AnsiPrev(/*const*/ char FAR* start,char FAR* current)
121 {
122   return (current==start)?start:current-1;
123 }
124
125 /* IsCharAlpha USER 433 */
126 BOOL IsCharAlpha(char ch)
127 {
128   return isalpha(ch);   /* This is probably not right for NLS */
129 }
130 /* IsCharAlphanumeric USER 434 */
131 BOOL IsCharAlphanumeric(char ch)
132 {
133   return (ch<'0')?0:(ch<'9');
134 }
135
136 /* IsCharUpper USER 435 */
137 BOOL IsCharUpper(char ch)
138 {
139   return isupper(ch);
140 }
141
142 /* IsCharUpper USER 436 */
143 BOOL IsCharLower(char ch)
144 {
145   return islower(ch);
146 }
147
148 static char Oem2Ansi[256];
149 static char Ansi2Oem[256];
150
151 void InitOemAnsiTranslations(void)
152 {
153   static int inited=0; /* should called called in some init function*/
154   int transfile,i;
155   if(inited) return;
156   if(transfile=open("oem2ansi.trl",O_RDONLY)){
157     read(transfile,Oem2Ansi,256);
158     close(transfile);
159   }
160   else {  /* sets up passive translations if it does not find the file */
161     for(i=0;i<256;i++)  /* Needs some fixing */
162       Oem2Ansi[i]=i;  
163   }
164   if(transfile=open("ansi2oem.trl",O_RDONLY)){
165     read(transfile,Ansi2Oem,256);
166     close(transfile);
167   }
168   else {  /* sets up passive translations if it does not find the file */
169     for(i=0;i<256;i++)  /* Needs some fixing */
170       Ansi2Oem[i]=i;  
171   }
172   inited=1;
173 }
174
175 /* AnsiToOem Keyboard.5 */
176 INT AnsiToOem(LPSTR lpAnsiStr, LPSTR lpOemStr)   /* why is this int ??? */
177 {
178   InitOemAnsiTranslations(); /* should called called in some init function*/
179   while(*lpAnsiStr){
180     *lpOemStr++=Ansi2Oem[*lpAnsiStr++];
181   }
182   return -1;
183 }
184
185 /* OemToAnsi Keyboard.6 */
186 BOOL OemToAnsi(LPSTR lpOemStr, LPSTR lpAnsiStr)   /* why is this BOOL ???? */
187 {
188   InitOemAnsiTranslations(); /* should called called in some init function*/
189   while(*lpOemStr){
190     *lpAnsiStr++=Oem2Ansi[*lpOemStr++];
191   }
192   return -1;
193 }
194
195 /* AnsiToOemBuff Keyboard.134 */
196 void AnsiToOemBuff(LPSTR lpAnsiStr, LPSTR lpOemStr, INT nLength)
197 {
198   int i;
199   InitOemAnsiTranslations(); /* should called called in some init function*/
200   for(i=0;i<nLength;i++)
201     lpOemStr[i]=Ansi2Oem[lpAnsiStr[i]];  
202 }
203
204 /* OemToAnsi Keyboard.135 */
205 void OemToAnsiBuff(LPSTR lpOemStr, LPSTR lpAnsiStr, INT nLength)
206 {
207   int i;
208   InitOemAnsiTranslations(); /* should called called in some init function*/
209   for(i=0;i<nLength;i++)
210     lpAnsiStr[i]=Oem2Ansi[lpOemStr[i]];
211 }