#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <iconv.h>
#include <langinfo.h>
#include <strings.h>
#include <libintl.h>
#include <sys/isa_defs.h>
#include <netsmb/smb_lib.h>
#include <netsmb/mchain.h>
#include "charsets.h"
static unsigned
xtoi(char u)
{
if (isdigit(u))
return (u - '0');
else if (islower(u))
return (10 + u - 'a');
else if (isupper(u))
return (10 + u - 'A');
return (16);
}
char *
unpercent(char *component)
{
char c, *s;
unsigned hi, lo;
if (component == NULL)
return (component);
for (s = component; (c = *s) != 0; s++) {
if (c != '%')
continue;
if ((hi = xtoi(s[1])) > 15 || (lo = xtoi(s[2])) > 15)
continue;
s[0] = hi*16 + lo;
memmove(s+1, s+3, strlen(s+3) + 1);
}
return (component);
}
#ifdef NOTPORTED
static CFStringEncoding
get_windows_encoding_equivalent( void )
{
CFStringEncoding encoding;
uint32_t index,region;
seteuid(eff_uid);
__CFStringGetInstallationEncodingAndRegion(&index,®ion);
seteuid(real_uid);
switch ( index )
{
case kCFStringEncodingMacRoman:
if (region)
encoding = kCFStringEncodingDOSLatin1;
else
encoding = kCFStringEncodingDOSLatinUS;
break;
case kCFStringEncodingMacJapanese:
encoding = kCFStringEncodingDOSJapanese;
break;
case kCFStringEncodingMacChineseTrad:
encoding = kCFStringEncodingDOSChineseTrad;
break;
case kCFStringEncodingMacKorean:
encoding = kCFStringEncodingDOSKorean;
break;
case kCFStringEncodingMacArabic:
encoding = kCFStringEncodingDOSArabic;
break;
case kCFStringEncodingMacHebrew:
encoding = kCFStringEncodingDOSHebrew;
break;
case kCFStringEncodingMacGreek:
encoding = kCFStringEncodingDOSGreek;
break;
case kCFStringEncodingMacCyrillic:
encoding = kCFStringEncodingDOSCyrillic;
break;
case kCFStringEncodingMacThai:
encoding = kCFStringEncodingDOSThai;
break;
case kCFStringEncodingMacChineseSimp:
encoding = kCFStringEncodingDOSChineseSimplif;
break;
case kCFStringEncodingMacCentralEurRoman:
encoding = kCFStringEncodingDOSLatin2;
break;
case kCFStringEncodingMacTurkish:
encoding = kCFStringEncodingDOSTurkish;
break;
case kCFStringEncodingMacCroatian:
encoding = kCFStringEncodingDOSLatin2;
break;
case kCFStringEncodingMacIcelandic:
encoding = kCFStringEncodingDOSIcelandic;
break;
case kCFStringEncodingMacRomanian:
encoding = kCFStringEncodingDOSLatin2;
break;
case kCFStringEncodingMacFarsi:
encoding = kCFStringEncodingDOSArabic;
break;
case kCFStringEncodingMacUkrainian:
encoding = kCFStringEncodingDOSCyrillic;
break;
default:
encoding = kCFStringEncodingDOSLatin1;
break;
}
return encoding;
}
#endif
char *
convert_wincs_to_utf8(const char *windows_string)
{
#ifdef NOTPORTED
CFStringRef s;
CFIndex maxlen;
char *result;
s = CFStringCreateWithCString(NULL, windows_string,
get_windows_encoding_equivalent());
if (s == NULL) {
smb_error("CFStringCreateWithCString for Windows code page failed on \"%s\" ", -1,
windows_string);
s = CFStringCreateWithCString(NULL, windows_string,
kCFStringEncodingMacRoman);
if (s == NULL) {
smb_error("CFStringCreateWithCString for Windows code page failed on \"%s\" with kCFStringEncodingMacRoman - skipping",
-1, windows_string);
return NULL;
}
}
maxlen = CFStringGetMaximumSizeForEncoding(CFStringGetLength(s),
kCFStringEncodingUTF8) + 1;
result = malloc(maxlen);
if (result == NULL) {
smb_error("Couldn't allocate buffer for UTF-8 string for \"%s\" - skipping", -1,
windows_string);
CFRelease(s);
return NULL;
}
if (!CFStringGetCString(s, result, maxlen, kCFStringEncodingUTF8)) {
smb_error("CFStringGetCString for UTF-8 failed on \"%s\" - skipping",
-1, windows_string);
CFRelease(s);
return NULL;
}
CFRelease(s);
return result;
#else
return (strdup((char*)windows_string));
#endif
}
char *
convert_utf8_to_wincs(const char *utf8_string)
{
#ifdef NOTPORTED
CFStringRef s;
CFIndex maxlen;
char *result;
s = CFStringCreateWithCString(NULL, utf8_string,
kCFStringEncodingUTF8);
if (s == NULL) {
smb_error("CFStringCreateWithCString for UTF-8 failed on \"%s\"", -1,
utf8_string);
return NULL;
}
maxlen = CFStringGetMaximumSizeForEncoding(CFStringGetLength(s),
get_windows_encoding_equivalent()) + 1;
result = malloc(maxlen);
if (result == NULL) {
smb_error("Couldn't allocate buffer for Windows code page string for \"%s\" - skipping", -1,
utf8_string);
CFRelease(s);
return NULL;
}
if (!CFStringGetCString(s, result, maxlen,
get_windows_encoding_equivalent())) {
smb_error("CFStringGetCString for Windows code page failed on \"%s\" - skipping",
-1, utf8_string);
CFRelease(s);
return NULL;
}
CFRelease(s);
return result;
#else
return (strdup((char*)utf8_string));
#endif
}