BOOL __RSFileManagerContentsDirectory(RSFileManagerRef fmg, RSStringRef path, __autorelease RSErrorRef* error, __RSFileManagerContentsContext* context, BOOL shouldRecursion) { DIR *db; char filename[2*RSMaxPathSize] = {0}; struct dirent *p = nil; memcpy(filename, RSStringGetCStringPtr(path, RSStringEncodingMacRoman), RSStringGetLength(path)); db = opendir(filename); if (db == nil) { if (error) { RSDictionaryRef userInfo = RSDictionaryCreate(RSAllocatorSystemDefault, (const void**)RSErrorTargetKey, (const void**)&path, 1, RSDictionaryRSTypeContext); *error = RSErrorCreate(RSAllocatorSystemDefault, RSErrorDomainRSCoreFoundation, kErrExisting, userInfo); RSRelease(userInfo); RSAutorelease(*error); } return NO; } memset(filename, 0, 2*RSMaxPathSize); RSStringRef _fileNameStr = nil; RSStringRef _dirPath = nil; BOOL success = NO; while ((p = readdir(db))) { if((strcmp(p->d_name, ".") == 0) || (strcmp(p->d_name, "..") == 0)) continue; if (RSStringGetLength(path) > 0) { if (RSStringGetCStringPtr(path, RSStringEncodingMacRoman)[RSStringGetLength(path) - 1] == '/') sprintf(filename,"%s%s", RSStringGetCStringPtr(path, RSStringEncodingMacRoman), p->d_name); else sprintf(filename,"%s/%s", RSStringGetCStringPtr(path, RSStringEncodingMacRoman), p->d_name); } else sprintf(filename,"%s/%s", RSStringGetCStringPtr(path, RSStringEncodingUTF8), p->d_name); _fileNameStr = RSStringCreateWithCString(RSAllocatorSystemDefault, p->d_name, RSStringEncodingMacRoman); __RSFileManagerContentContextAddContent(context, _fileNameStr); if (p->d_type & DT_DIR && shouldRecursion) { _dirPath = RSStringCreateWithCString(RSAllocatorSystemDefault, filename, RSStringEncodingMacRoman); #if !__RSFileManagerContentsContextDoNotUseRSArray __RSFileManagerContentContextUpdateDirStack(context, _fileNameStr); #endif success = __RSFileManagerContentsDirectory(fmg, _dirPath, error, context, shouldRecursion); #if !__RSFileManagerContentsContextDoNotUseRSArray __RSFileManagerContentContextUpdateDirStack(context, nil); #endif RSRelease(_dirPath); _dirPath = nil; if (success == NO) return success; } RSRelease(_fileNameStr); _fileNameStr = nil; } closedir(db); return YES; }
RSInline void __RSDictionaryAddEnvWithCString(RSMutableDictionaryRef dict, const char *key) { const char *value = __RSGetEnvironment(key); if (dict && key && value) { RSStringRef k = RSStringCreateWithCString(RSAllocatorSystemDefault, key, RSStringEncodingUTF8); RSStringRef v = RSStringCreateWithCString(RSAllocatorSystemDefault, value, RSStringEncodingUTF8); RSDictionarySetValue(dict, k, v); RSRelease(k); RSRelease(v); } }
static RSTypeRef __RSErrorRSCoreFoundationCallBack(RSErrorRef err, RSStringRef key) { if (!RSEqual(key, RSErrorDescriptionKey) && !RSEqual(key, RSErrorLocalizedFailureReasonKey)) return nil; RSStringRef errStr = nil; struct __RSErrorPrivateFormatTable cFormat = __RSErrorDomainRSCoreFoundationGetCStringWithCode(RSErrorGetCode(err)); if (cFormat.argsCnt) { RSStringRef format = RSStringCreateWithCString(RSAllocatorSystemDefault, cFormat.format, RSStringEncodingUTF8); RSArrayRef objects = RSDictionaryGetValue(__RSErrorGetUserInfo(err), RSErrorTargetKey); RSTypeRef object[3] = {nil}; RSIndex minCnt = 0; if (objects) { minCnt = min(cFormat.argsCnt, RSArrayGetCount(objects)); switch (minCnt) { case 1: object[0] = RSArrayObjectAtIndex(objects, 0); errStr = RSStringCreateWithFormat(RSAllocatorSystemDefault, format, object[0]); break; case 2: object[0] = RSArrayObjectAtIndex(objects, 0); object[1] = RSArrayObjectAtIndex(objects, 1); errStr = RSStringCreateWithFormat(RSAllocatorSystemDefault, format, object[0], object[1]); break; case 3: object[0] = RSArrayObjectAtIndex(objects, 0); object[1] = RSArrayObjectAtIndex(objects, 1); object[2] = RSArrayObjectAtIndex(objects, 2); errStr = RSStringCreateWithFormat(RSAllocatorSystemDefault, format, object[0], object[1], object[2]); break; default: HALTWithError(RSInvalidArgumentException, "the formate is too long to support"); break; } } for (RSIndex idx = 0; idx < minCnt; idx++) { RSRelease(object[idx]); } RSRelease(format); } else { errStr = RSStringCreateWithCString(RSAllocatorSystemDefault, cFormat.format, RSStringEncodingUTF8); } return errStr; }
RSInline RSTypeRef ___RSProcessInfoCreateUpdate(RSStringRef key) { RSUInteger size = 0; RSCBuffer ckey = nil; RSTypeRef value = nil; if (!key || key == (RSStringRef)RSNil) return nil; if (kSuccess == ____RSProcessInfoUpdate(ckey = RSStringGetCStringPtr(key, RSStringEncodingMacRoman), nil, &size)) { void *buf = RSAllocatorAllocate(RSAllocatorSystemDefault, size); if (kSuccess == ____RSProcessInfoUpdate(ckey, buf, &size)) { if (!RSStringHasSuffix(key, RSSTR("size"))) value = RSStringCreateWithCString(RSAllocatorSystemDefault, buf, RSStringEncodingUTF8); else { if (size == sizeof(unsigned long long)) value = RSStringCreateWithFormat(RSAllocatorSystemDefault, RSSTR("%lld"), *(unsigned long long*)buf); else if (size == sizeof(unsigned long)) value = RSStringCreateWithFormat(RSAllocatorSystemDefault, RSSTR("%ld"), *(unsigned long*)buf); else if (size == sizeof(double)) value = RSStringCreateWithFormat(RSAllocatorSystemDefault, RSSTR("%f"), *(float*)buf); } } RSAllocatorDeallocate(RSAllocatorSystemDefault, buf); } return value; }
static RSTypeRef __RSErrorMachCallBack(RSErrorRef err, RSStringRef key) { if (RSEqual(key, RSErrorDescriptionKey)) { const char *errStr = mach_error_string((mach_error_t)RSErrorGetCode(err)); if (errStr && strlen(errStr)) return RSStringCreateWithCString(RSAllocatorSystemDefault, errStr, RSStringEncodingUTF8); } return nil; }
/* typedef RSTypeRef (*RSErrorUserInfoKeyCallBack)(RSErrorRef err, RSStringRef key) */ static RSTypeRef __RSErrorPOSIXCallBack(RSErrorRef err, RSStringRef key) { if (!RSEqual(key, RSErrorDescriptionKey) && !RSEqual(key, RSErrorLocalizedFailureReasonKey)) return nil; const char *errStr = strerror((int)RSErrorGetCode(err)); if (errStr && strlen(errStr)) return RSStringCreateWithCString(RSAllocatorSystemDefault, errStr, RSStringEncodingUTF8); #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED /*RSBundle*/ #endif return nil; }
RSInline RSStringRef __RSProcessInfoGetProgramName(RSProcessInfoRef processInfo) { RSStringRef name = __RSProcessInfoObjectForKey(processInfo, __RSProcessInfoProgramName); if (name) return name; name = RSStringCreateWithCString(RSAllocatorSystemDefault, getprogname(), RSStringEncodingUTF8); if (name) { __RSRuntimeSetInstanceSpecial(name, YES); __RSProcessInfoSetObjectForKey(processInfo, __RSProcessInfoProgramName, name); } return name; }
static RSArrayRef __RSTimeZoneKnownNamesArrayCreate() { RSMutableArrayRef array = RSArrayCreateMutable(RSAllocatorSystemDefault, __RSPrivateTimeZoneNameCount); for (RSIndex idx = 0; idx < __RSPrivateTimeZoneNameCount; idx++) { RSStringRef name = RSStringCreateWithCString(RSAllocatorSystemDefault, __RSPrivateTimeZoneInfo[idx].timeZoneName, RSStringEncodingUTF8); RSArrayAddObject(array, name); RSRelease(name); } // RSArraySort(array, RSOrderedDescending, (RSComparatorFunction)RSStringCompare, nil); return array; }
RSExport RSTimeZoneRef RSTimeZoneCopySystem() { RSTimeZoneLockSystem; if (likely(__RSTimeZoneSystem)) { RSTimeZoneUnlockSystem; return __RSTimeZoneSystem; } RSTimeZoneUnlockSystem; RSTimeZoneRef result = nil; RSCBuffer tzenv = __RSRuntimeGetEnvironment("TZFILE"); if (unlikely(tzenv)) { RSStringRef name = RSStringCreateWithCString(RSAllocatorSystemDefault, tzenv, RSStringEncodingASCII); result = RSTimeZoneCreateWithName(RSAllocatorSystemDefault, name); RSRelease(name); RSTimeZoneLockSystem; if (likely(__RSTimeZoneSystem == nil)) { __RSTimeZoneSystem = result; __RSRuntimeSetInstanceSpecial(__RSTimeZoneSystem, YES); } RSTimeZoneUnlockSystem; return result; } tzenv = __RSRuntimeGetEnvironment("TZ"); if (unlikely(tzenv)) { RSStringRef name = RSStringCreateWithCString(RSAllocatorSystemDefault, tzenv, RSStringEncodingASCII); result = RSTimeZoneCreateWithName(RSAllocatorSystemDefault, name); RSRelease(name); RSTimeZoneLockSystem; if (likely(__RSTimeZoneSystem == nil)) { __RSTimeZoneSystem = result; __RSRuntimeSetInstanceSpecial(__RSTimeZoneSystem, YES); } RSTimeZoneUnlockSystem; return result; } char linkbuf[RSMaxPathSize]; size_t ret = readlink(TZZONELINK, linkbuf, sizeof(linkbuf)); if (likely(0 < ret)) { RSStringRef name = nil; linkbuf[ret] = '\0'; if (strncmp(linkbuf, TZZONEINFO, sizeof(TZZONEINFO) - 1) == 0) { //linkbuf[strlen(linkbuf) - sizeof(TZZONEINFO) + 1] = 0; name = RSStringCreateWithCString(RSAllocatorSystemDefault, linkbuf + sizeof(TZZONEINFO) - 1, RSStringEncodingUTF8); } else { name = RSStringCreateWithCString(RSAllocatorSystemDefault, linkbuf, RSStringEncodingUTF8);//RSStringCreateWithBytes(RSAllocatorSystemDefault, (uint8_t *)linkbuf, strlen(linkbuf), RSStringEncodingUTF8, NO); } result = RSTimeZoneCreateWithName(RSAllocatorSystemDefault, name); RSRelease(name); if (result) { RSTimeZoneLockSystem; if (likely(__RSTimeZoneSystem == nil)) { __RSTimeZoneSystem = result; __RSRuntimeSetInstanceSpecial(__RSTimeZoneSystem, YES); } RSTimeZoneUnlockSystem; } return result; } return result; }