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; }
RSPrivate UCalendar *__RSCalendarCreateUCalendar(RSStringRef calendarID, RSTimeZoneRef tz) { const char *cstr = RSStringGetCStringPtr(calendarID, RSStringEncodingASCII); if (nil == cstr) { //if (RSStringGetCString(localeID, buffer, BUFFER_SIZE, RSStringEncodingASCII)) cstr = buffer; } if (nil == cstr) { return nil; } UChar ubuffer[BUFFER_SIZE]; RSStringRef tznam = RSTimeZoneGetName(tz); RSIndex cnt = RSStringGetLength(tznam); if (BUFFER_SIZE < cnt) cnt = BUFFER_SIZE; RSStringGetCharacters(tznam, RSMakeRange(0, cnt), (UniChar *)ubuffer); UErrorCode status = U_ZERO_ERROR; UCalendar *cal = ucal_open(ubuffer, (RSBit32)cnt, cstr, UCAL_DEFAULT, &status); return cal; }
RSExport RSDateRef RSDateCreateWithString(RSAllocatorRef allocator, RSStringRef value) { const int dateLength = 20; RSDateRef _v = nil; //%04d-%02d-%02dT%02d:%02d:%02dZ //4 +1 +2 +1 +2 +1 +2 +1 +2 +1 +2 +1 //%04d - %02d - %02d T %02d : %02d : %02d Z //5,3,3,3,3,3 = 20 if (dateLength == RSStringGetLength(value)) { UniChar ptr[6] = {0}; ptr[0] = RSStringGetCharacterAtIndex(value, 5 - 1); //- ptr[1] = RSStringGetCharacterAtIndex(value, 8 - 1); //- ptr[2] = RSStringGetCharacterAtIndex(value, 11 - 1);//T ptr[3] = RSStringGetCharacterAtIndex(value, 14 - 1);//: ptr[4] = RSStringGetCharacterAtIndex(value, 17 - 1);//: ptr[5] = RSStringGetCharacterAtIndex(value, 20 - 1);//Z if ((ptr[0] == ptr[1]) && (ptr[1] == '-') && (ptr[2] == 'T') && (ptr[3] == ptr[4]) && (ptr[4] == ':') && (ptr[5] == 'Z')) { #if 0 UTF8Char year[5] = {0}; UTF8Char month[3] = {0}; UTF8Char day[3] = {0}; UTF8Char hour[3] = {0}; UTF8Char minute[3] = {0}; UTF8Char second[3] = {0}; RSStringGetUTF8Characters(value, RSMakeRange(0, 4), year); RSStringGetUTF8Characters(value, RSMakeRange(5, 2), month); RSStringGetUTF8Characters(value, RSMakeRange(8, 2), day); RSStringGetUTF8Characters(value, RSMakeRange(11, 2), hour); RSStringGetUTF8Characters(value, RSMakeRange(14, 2), minute); RSStringGetUTF8Characters(value, RSMakeRange(17, 2), second); RSGregorianDate gd = {0}; gd.year = atoi((const char*)year); gd.month= atoi((const char*)month); gd.day = atoi((const char*)day); gd.hour = atoi((const char*)hour); gd.minute = atoi((const char*)minute); gd.second = atoi((const char*)second); #else RSGregorianDate gd = {0}; UniChar payload[4] = {0}; RSIndex tmp = 0; RSStringGetCharacters(value, RSMakeRange(0, 4), payload); if (!__unichar2i(payload, 4, &tmp)) return nil; gd.year = (RSBitU32)tmp; memset(payload, 0, sizeof(payload)); RSStringGetCharacters(value, RSMakeRange(5, 2), payload); if (!__unichar2i(payload, 2, &tmp)) return nil; gd.month = (RSBitU8)tmp; if (__dateCheckRange(gd.month, 1, 12) == NO) return nil; RSStringGetCharacters(value, RSMakeRange(8, 2), payload); if (!__unichar2i(payload, 2, &tmp)) return nil; gd.day = (RSBitU8)tmp; int maxm = 0; switch (gd.month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: maxm = 31; break; case 2: maxm = 28; break; default: maxm = 30; break; } if ((gd.year % 400 == 0) || ((gd.year % 100 != 0) && (gd.year % 4 == 0))) { maxm++; } if (maxm > 32) HALTWithError(RSInvalidArgumentException, "maxm > 32"); if (__dateCheckRange(gd.day, 1, maxm) == NO) return nil; RSStringGetCharacters(value, RSMakeRange(11, 2), payload); if (!__unichar2i(payload, 2, &tmp)) return nil; gd.hour = (RSBitU8)tmp; if (__dateCheckRange(gd.day, 0, 59) == NO) return nil; RSStringGetCharacters(value, RSMakeRange(14, 2), payload); if (!__unichar2i(payload, 2, &tmp)) return nil; gd.minute = (RSBitU8)tmp; if (__dateCheckRange(gd.day, 0, 59) == NO) return nil; RSStringGetCharacters(value, RSMakeRange(17, 2), payload); if (!__unichar2i(payload, 2, &tmp)) return nil; gd.second = (RSBitU8)tmp; if (__dateCheckRange(gd.day, 0, 59) == NO) return nil; #endif _v = RSDateCreate(allocator, RSGregorianDateGetAbsoluteTime(gd, RSTimeZoneCopySystem())); } } return _v; }