| /* |
| * Unicode string management |
| * |
| * Copyright 1996 Martin von Loewis |
| * |
| * Conversion between Unicode and ISO-8859-1 is inherently lossy, |
| * so the conversion code should be called only if it does not matter |
| * |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <ctype.h> |
| #include "string32.h" |
| #include "xmalloc.h" |
| |
| int STRING32_UniLen(LPWSTR s) |
| { |
| int i; |
| for(i=0;*s;s++) |
| i++; |
| return i; |
| } |
| |
| void STRING32_UniToAnsi(LPSTR dest,LPCWSTR src) |
| { |
| static int have_warned=0; |
| while(*src) |
| { |
| if(*src>255 && !have_warned) |
| { |
| fprintf(stderr,"Cannot deal with non-ANSI characters\n"); |
| have_warned=1; |
| } |
| *dest++=*src++; |
| } |
| /* copy the terminator */ |
| *dest = *src; |
| } |
| |
| void STRING32_AnsiToUni(LPWSTR dest,LPCSTR src) |
| { |
| while(*src) |
| *dest++=*src++; |
| *dest = *src; |
| } |
| |
| LPSTR STRING32_DupUniToAnsi(LPCWSTR src) |
| { |
| LPSTR dest=xmalloc(STRING32_UniLen(src)+1); |
| STRING32_UniToAnsi(dest,src); |
| return dest; |
| } |
| |
| LPWSTR STRING32_DupAnsiToUni(LPCSTR src) |
| { |
| LPWSTR dest=xmalloc(2*strlen(src)+2); |
| STRING32_AnsiToUni(dest,src); |
| return dest; |
| } |
| |
| DWORD STRING32_lstrlenW(LPCWSTR str) |
| { |
| int len; |
| for(len=0;*str;str++) |
| len++; |
| return len; |
| } |
| |
| /* not an API function */ |
| |
| WCHAR STRING32_tolowerW(WCHAR c) |
| { |
| /* FIXME: Unicode */ |
| return tolower(c); |
| } |
| |
| int STRING32_lstrcmpniW(LPCWSTR a,LPCWSTR b,DWORD len) |
| { |
| while(len--) |
| { |
| WCHAR c1,c2; |
| c1 = STRING32_tolowerW(*a); |
| c2 = STRING32_tolowerW(*b); |
| if(c1<c2)return -1; |
| if(c1>c2)return 1; |
| if(c1==0 && c2==0)return 0; |
| if(c1==0)return -1; |
| if(c2==0)return 1; |
| a++; |
| b++; |
| } |
| return 0; |
| } |