CFStringDefaultEncoding.h [plain text]
#include <CoreFoundation/CFBase.h>
#if defined(__MACH__)
#include <stdlib.h>
#include <fcntl.h>
#include <pwd.h>
#include <sys/param.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#if defined(__cplusplus)
extern "C" {
#endif
#define __kCFUserEncodingEnvVariableName ("__CF_USER_TEXT_ENCODING")
#define __kCFMaxDefaultEncodingFileLength (24)
#define __kCFUserEncodingFileName ("/.CFUserTextEncoding")
CF_INLINE void __CFStringGetUserDefaultEncoding(UInt32 *oScriptValue, UInt32 *oRegionValue) {
char *stringValue;
char buffer[__kCFMaxDefaultEncodingFileLength];
int uid = getuid();
if ((stringValue = getenv(__kCFUserEncodingEnvVariableName)) != NULL) {
if ((uid == strtol(stringValue, &stringValue, 0)) && (':' == *stringValue)) {
++stringValue;
} else {
stringValue = NULL;
}
}
if ((stringValue == NULL) && ((uid > 0) || getenv("HOME"))) {
struct passwd *passwdp;
if ((passwdp = getpwuid((uid_t)uid))) {
char filename[MAXPATHLEN + 1];
int fd;
strcpy(filename, passwdp->pw_dir);
strcat(filename, __kCFUserEncodingFileName);
if ((fd = open(filename, O_RDONLY, 0)) == -1) {
snprintf(filename, sizeof(filename), "%s=0x%X:0:0", __kCFUserEncodingEnvVariableName, uid);
putenv(filename);
} else {
int readSize;
readSize = read(fd, buffer, __kCFMaxDefaultEncodingFileLength - 1);
buffer[(readSize < 0 ? 0 : readSize)] = '\0';
close(fd);
stringValue = buffer;
snprintf(filename, sizeof(filename), "%s=0x%X:%s", __kCFUserEncodingEnvVariableName, uid, buffer);
putenv(filename);
}
}
}
if (stringValue) {
*oScriptValue = strtol(stringValue, &stringValue, 0);
if (*stringValue == ':') {
if (oRegionValue) *oRegionValue = strtol(++stringValue, NULL, 0);
return;
}
}
*oScriptValue = 0; if (oRegionValue) *oRegionValue = 0; }
CF_INLINE uint32_t __CFStringGetInstallationRegion() {
char *stringValue = NULL;
char buffer[__kCFMaxDefaultEncodingFileLength];
struct passwd *passwdp;
if ((passwdp = getpwuid((uid_t)0))) {
char filename[MAXPATHLEN + 1];
int fd;
strcpy(filename, passwdp->pw_dir);
strcat(filename, __kCFUserEncodingFileName);
if ((fd = open(filename, O_RDONLY, 0)) != -1) {
int readSize;
readSize = read(fd, buffer, __kCFMaxDefaultEncodingFileLength - 1);
buffer[(readSize < 0 ? 0 : readSize)] = '\0';
close(fd);
stringValue = buffer;
}
}
if (stringValue) {
(void)strtol(stringValue, &stringValue, 0);
if (*stringValue == ':') return strtol(++stringValue, NULL, 0);
}
return 0; }
CF_INLINE void __CFStringGetInstallationEncodingAndRegion(uint32_t *encoding, uint32_t *region) {
char *stringValue = NULL;
char buffer[__kCFMaxDefaultEncodingFileLength];
struct passwd *passwdp;
*encoding = 0; *region = 0;
if ((passwdp = getpwuid((uid_t)0))) {
char filename[MAXPATHLEN + 1];
int fd;
strcpy(filename, passwdp->pw_dir);
strcat(filename, __kCFUserEncodingFileName);
if ((fd = open(filename, O_RDONLY, 0)) != -1) {
int readSize;
readSize = read(fd, buffer, __kCFMaxDefaultEncodingFileLength - 1);
buffer[(readSize < 0 ? 0 : readSize)] = '\0';
close(fd);
stringValue = buffer;
}
}
if (stringValue) {
*encoding = strtol(stringValue, &stringValue, 0);
if (*stringValue == ':') *region = strtol(++stringValue, NULL, 0);
}
}
CF_INLINE void __CFStringSaveUserDefaultEncoding(UInt32 iScriptValue, UInt32 iRegionValue) {
struct passwd *passwdp;
if ((passwdp = getpwuid(getuid()))) {
char filename[MAXPATHLEN + 1];
int fd;
strcpy(filename, passwdp->pw_dir);
strcat(filename, __kCFUserEncodingFileName);
(void)unlink(filename);
if ((fd = open(filename, O_WRONLY|O_CREAT, 0400)) != -1) {
char buffer[__kCFMaxDefaultEncodingFileLength];
unsigned int writeSize;
writeSize = snprintf(buffer, __kCFMaxDefaultEncodingFileLength, "0x%X:0x%X", (unsigned int)iScriptValue, (unsigned int)iRegionValue);
(void)write(fd, buffer, (writeSize > __kCFMaxDefaultEncodingFileLength ? __kCFMaxDefaultEncodingFileLength : writeSize));
close(fd);
}
}
}
#if defined(__cplusplus)
}
#endif
#endif