* Source/NSTimeZone (NSInternalAbbrevDict): Remove class

(+abbreviationDictionary): Implement from new one-to-one plist.
* NStimeZones/NSTimeZone.tar: Added abbreviations.plist. Regenerated.
* Testing/nstimezone.m: New tests.

* Source/Additions/GNUmakefile: Remove duplicate Unicode.m.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@20476 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Adam Fedor 2004-12-21 23:20:32 +00:00
parent df88dff290
commit 4ea16407af
5 changed files with 75 additions and 125 deletions

View file

@ -1,7 +1,16 @@
2004-12-21 Adam Fedor <fedor@gnu.org>
* Source/NSTimeZone (NSInternalAbbrevDict): Remove class
(+abbreviationDictionary): Implement from new one-to-one plist.
* NStimeZones/NSTimeZone.tar: Added abbreviations.plist. Regenerated.
* Testing/nstimezone.m: New tests.
* Source/Additions/GNUmakefile: Remove duplicate Unicode.m.
2004-12-21 David Wetzel <dave@turbocat.de> 2004-12-21 David Wetzel <dave@turbocat.de>
* Source/Additions/GNUmakefile * Source/Additions/GNUmakefile:
added Additions_OBJC_FILES += Unicode.m on apple Added Additions_OBJC_FILES += Unicode.m on apple
2004-12-18 David Wetzel <dave@turbocat.de> 2004-12-18 David Wetzel <dave@turbocat.de>

Binary file not shown.

View file

@ -45,8 +45,6 @@ Additions_OBJC_FILES += GSNextRuntime.m
endif endif
ifneq ($(FOUNDATION_LIB), gnu) ifneq ($(FOUNDATION_LIB), gnu)
Additions_OBJC_FILES += GSCompatibility.m Additions_OBJC_FILES += GSCompatibility.m
else
Additions_OBJC_FILES += Unicode.m
endif endif
Additions_OBJC_FILES += Unicode.m Additions_OBJC_FILES += Unicode.m

View file

@ -122,11 +122,14 @@
Expected in Resources directory for library bundle. */ Expected in Resources directory for library bundle. */
#define TIME_ZONE_DIR @"NSTimeZones" #define TIME_ZONE_DIR @"NSTimeZones"
/* Location of time zone abbreviation dictionary. It is a text file /* Name of time zone abbreviation (plist) dictionary. */
#define ABBREV_DICT @"abbreviations"
/* Name of time zone abbreviation map. It is a text file
with each line comprised of the abbreviation, a whitespace, and the with each line comprised of the abbreviation, a whitespace, and the
name. Neither the abbreviation nor the name can contain name. Neither the abbreviation nor the name can contain
whitespace, and each line must not be longer than 80 characters. */ whitespace, and each line must not be longer than 80 characters. */
#define ABBREV_DICT @"abbreviations" #define ABBREV_MAP @"abbreviations"
/* File holding regions grouped by latitude. It is a text file with /* File holding regions grouped by latitude. It is a text file with
each line comprised of the latitude region, whitespace, and the each line comprised of the latitude region, whitespace, and the
@ -218,8 +221,10 @@ static NSTimeZone *systemTimeZone = nil;
name. */ name. */
static NSMutableDictionary *zoneDictionary; static NSMutableDictionary *zoneDictionary;
/* Fake one-to-one abbreviation to time zone name dictionary. */ /* one-to-one abbreviation to time zone name dictionary. */
static NSDictionary *fake_abbrev_dict; static NSMutableDictionary *abbreviationDictionary = nil;
/* one-to-many abbreviation to time zone name dictionary. */
static NSMutableDictionary *abbreviationMap = nil;
/* Lock for creating time zones. */ /* Lock for creating time zones. */
static NSRecursiveLock *zone_mutex = nil; static NSRecursiveLock *zone_mutex = nil;
@ -253,30 +258,17 @@ decode (const void *ptr)
} }
/* Return path to a TimeZone directory file */ /* Return path to a TimeZone directory file */
static NSString *_time_zone_path(NSString *subpath) static NSString *_time_zone_path(NSString *subpath, NSString *type)
{ {
NSBundle *gbundle; NSBundle *gbundle;
if (type == nil)
type = @"";
gbundle = [NSBundle bundleForLibrary: @"gnustep-base"]; gbundle = [NSBundle bundleForLibrary: @"gnustep-base"];
return [gbundle pathForResource: subpath return [gbundle pathForResource: subpath
ofType: @"" ofType: type
inDirectory: TIME_ZONE_DIR]; inDirectory: TIME_ZONE_DIR];
} }
/* Object enumerator for NSInternalAbbrevDict. */
@interface NSInternalAbbrevDictObjectEnumerator : NSEnumerator
{
NSEnumerator *dict_enum;
}
- (id) initWithDict: (NSDictionary*)aDict;
@end
/* Front end that actually uses [NSTimeZone abbrebiationMap]. */
@interface NSInternalAbbrevDict : NSDictionary
@end
@interface GSPlaceholderTimeZone : NSTimeZone @interface GSPlaceholderTimeZone : NSTimeZone
@end @end
@ -318,74 +310,9 @@ static NSString *_time_zone_path(NSString *subpath)
/* Private methods for obtaining resource file names. */ /* Private methods for obtaining resource file names. */
@interface NSTimeZone (Private) @interface NSTimeZone (Private)
+ (NSString*) getAbbreviationFile;
+ (NSString*) getRegionsFile;
+ (NSString*) getTimeZoneFile: (NSString*)name; + (NSString*) getTimeZoneFile: (NSString*)name;
@end @end
@implementation NSInternalAbbrevDictObjectEnumerator
- (void) dealloc
{
RELEASE(dict_enum);
}
- (id) initWithDict: (NSDictionary*)aDict
{
dict_enum = RETAIN([aDict objectEnumerator]);
return self;
}
- (id) nextObject
{
id object;
object = [dict_enum nextObject];
if (object != nil)
return [object objectAtIndex: 0];
else
return nil;
}
@end
@implementation NSInternalAbbrevDict
+ (id) allocWithZone: (NSZone*)zone
{
return NSAllocateObject(self, 0, zone);
}
- (id) init
{
return self;
}
- (unsigned) count
{
return [[NSTimeZone abbreviationMap] count];
}
- (NSEnumerator*) keyEnumerator
{
return [[NSTimeZone abbreviationMap] keyEnumerator];
}
- (NSEnumerator*) objectEnumerator
{
return AUTORELEASE([[NSInternalAbbrevDictObjectEnumerator alloc]
initWithDict: [NSTimeZone abbreviationMap]]);
}
- (id) objectForKey: (NSString*)key
{
return [[[NSTimeZone abbreviationMap] objectForKey: key] objectAtIndex: 0];
}
@end
@implementation GSPlaceholderTimeZone @implementation GSPlaceholderTimeZone
@ -937,53 +864,71 @@ static NSMapTable *absolutes = 0;
@implementation NSTimeZone @implementation NSTimeZone
/** /**
* DEPRECATED. * Returns a dictionary containing time zone abbreviations and their
* corresponding time zone names. More than one time zone may be associated
* with a single abbreviation. In this case, the dictionary contains only
* one (usually the most common) time zone name for the abbreviation.
*/ */
+ (NSDictionary*) abbreviationDictionary + (NSDictionary*) abbreviationDictionary
{ {
return fake_abbrev_dict; NSString *path;
if (abbreviationDictionary != nil)
return abbreviationDictionary;
path = _time_zone_path (ABBREV_DICT, @"plist");
if (path == NULL)
{
[NSException
raise: NSInternalInconsistencyException
format: @"Failed to open time zone abbreviation dictionary."];
}
abbreviationDictionary =
[[NSString stringWithContentsOfFile: path] propertyList];
abbreviationDictionary =
[abbreviationDictionary makeImmutableCopyOnFail: NO];
return abbreviationDictionary;
} }
/** /**
* Returns an abbreviation to time zone map which is quite large. * Returns a dictionary that maps abbreviations to the array
* containing all the time zone names that use the abbreviation.
*/ */
+ (NSDictionary*) abbreviationMap + (NSDictionary*) abbreviationMap
{ {
static NSMutableDictionary *abbreviationDictionary = nil;
FILE *file; // For the file containing the abbreviation dictionary FILE *file; // For the file containing the abbreviation dictionary
char abbrev[80], name[80]; char abbrev[80], name[80];
NSString *fileName; NSString *path;
/* Instead of creating the abbreviation dictionary when the class is /* Instead of creating the abbreviation dictionary when the class is
initialized, we create it when we first need it, since the initialized, we create it when we first need it, since the
dictionary can be potentially very large, considering that it's dictionary can be potentially very large, considering that it's
almost never used. */ almost never used. */
if (abbreviationDictionary != nil) if (abbreviationMap != nil)
return abbreviationDictionary; return abbreviationMap;
/* Read dictionary from file. */ /* Read dictionary from file. */
abbreviationDictionary = [[NSMutableDictionary alloc] init]; abbreviationMap = [[NSMutableDictionary alloc] init];
fileName = [NSTimeZone getAbbreviationFile]; path = _time_zone_path (ABBREV_MAP, nil);
#if defined(__WIN32__) #if defined(__WIN32__)
file = fopen([fileName fileSystemRepresentation], "rb"); file = fopen([path fileSystemRepresentation], "rb");
#else #else
file = fopen([fileName fileSystemRepresentation], "r"); file = fopen([path fileSystemRepresentation], "r");
#endif #endif
if (file == NULL) if (file == NULL)
[NSException [NSException
raise: NSInternalInconsistencyException raise: NSInternalInconsistencyException
format: @"Failed to open time zone abbreviation dictionary."]; format: @"Failed to open time zone abbreviation map."];
while (fscanf(file, "%79s %79s", abbrev, name) == 2) while (fscanf(file, "%79s %79s", abbrev, name) == 2)
{ {
id a, the_name, the_abbrev; id a, the_name, the_abbrev;
the_name = [NSString stringWithCString: name]; the_name = [NSString stringWithCString: name];
the_abbrev = [NSString stringWithCString: abbrev]; the_abbrev = [NSString stringWithCString: abbrev];
a = [abbreviationDictionary objectForKey: the_abbrev]; a = [abbreviationMap objectForKey: the_abbrev];
if (a == nil) if (a == nil)
{ {
a = AUTORELEASE([NSMutableArray new]); a = AUTORELEASE([NSMutableArray new]);
[abbreviationDictionary setObject: a forKey: the_abbrev]; [abbreviationMap setObject: a forKey: the_abbrev];
} }
[a addObject: the_name]; [a addObject: the_name];
} }
@ -993,17 +938,17 @@ static NSMapTable *absolutes = 0;
{ {
id array; id array;
id the_abbrev = [systemTimeZone abbreviation]; id the_abbrev = [systemTimeZone abbreviation];
array = [abbreviationDictionary objectForKey: the_abbrev]; array = [abbreviationMap objectForKey: the_abbrev];
if (array == nil) if (array == nil)
{ {
array = AUTORELEASE([NSMutableArray new]); array = AUTORELEASE([NSMutableArray new]);
[abbreviationDictionary setObject: array forKey: the_abbrev]; [abbreviationMap setObject: array forKey: the_abbrev];
} }
if ([array containsObject: [systemTimeZone timeZoneName]] == NO) if ([array containsObject: [systemTimeZone timeZoneName]] == NO)
[array addObject: [systemTimeZone timeZoneName]]; [array addObject: [systemTimeZone timeZoneName]];
} }
return abbreviationDictionary; return abbreviationMap;
} }
/** /**
@ -1137,7 +1082,6 @@ static NSMapTable *absolutes = 0;
localTimeZone = [[NSLocalTimeZone alloc] init]; localTimeZone = [[NSLocalTimeZone alloc] init];
fake_abbrev_dict = [[NSInternalAbbrevDict alloc] init];
zone_mutex = [GSLazyRecursiveLock new]; zone_mutex = [GSLazyRecursiveLock new];
} }
} }
@ -1233,7 +1177,7 @@ static NSMapTable *absolutes = 0;
*/ */
if (localZoneString == nil) if (localZoneString == nil)
{ {
NSString *f = _time_zone_path(LOCAL_TIME_FILE); NSString *f = _time_zone_path(LOCAL_TIME_FILE, nil);
if (f != nil) if (f != nil)
{ {
localZoneString = [NSString stringWithContentsOfFile: f]; localZoneString = [NSString stringWithContentsOfFile: f];
@ -1384,7 +1328,7 @@ static NSMapTable *absolutes = 0;
for (i = 0; i < 24; i++) for (i = 0; i < 24; i++)
temp_array[i] = [NSMutableArray array]; temp_array[i] = [NSMutableArray array];
fileName = [NSTimeZoneClass getRegionsFile]; fileName = _time_zone_path (REGIONS_FILE, nil);
#if defined(__WIN32__) #if defined(__WIN32__)
file = fopen([fileName fileSystemRepresentation], "rb"); file = fopen([fileName fileSystemRepresentation], "rb");
#else #else
@ -1711,19 +1655,6 @@ static NSMapTable *absolutes = 0;
@implementation NSTimeZone (Private) @implementation NSTimeZone (Private)
+ (NSString*) getAbbreviationFile
{
return _time_zone_path (ABBREV_DICT);
}
/**
* Returns the path to the Regions file.
*/
+ (NSString*) getRegionsFile
{
return _time_zone_path (REGIONS_FILE);
}
/** /**
* Returns the path to the named zone info file. * Returns the path to the named zone info file.
*/ */
@ -1737,7 +1668,7 @@ static NSMapTable *absolutes = 0;
[tzdir stringByAppendingPathComponent: name]] == NO) [tzdir stringByAppendingPathComponent: name]] == NO)
dir = nil; dir = nil;
if (dir == nil) if (dir == nil)
dir= _time_zone_path (ZONES_DIR); dir= _time_zone_path (ZONES_DIR, nil);
return [dir stringByAppendingPathComponent: name]; return [dir stringByAppendingPathComponent: name];
} }

View file

@ -6,11 +6,14 @@
#include <Foundation/NSDate.h> #include <Foundation/NSDate.h>
#include <Foundation/NSDictionary.h> #include <Foundation/NSDictionary.h>
#include <Foundation/NSTimeZone.h> #include <Foundation/NSTimeZone.h>
#include <Foundation/NSCalendarDate.h>
int int
main () main ()
{ {
NSTimeZone *system; NSTimeZone *system;
NSTimeZone *other;
NSCalendarDate *date;
CREATE_AUTORELEASE_POOL(pool); CREATE_AUTORELEASE_POOL(pool);
GSPrintf(stdout, @"System time zone\n"); GSPrintf(stdout, @"System time zone\n");
@ -20,9 +23,18 @@ main ()
GSPrintf(stdout, @"Local time zone:\n %@\n\n", GSPrintf(stdout, @"Local time zone:\n %@\n\n",
[[NSTimeZone localTimeZone] description]); [[NSTimeZone localTimeZone] description]);
GSPrintf(stdout, @"Time zones for PST:\n %@\n", GSPrintf(stdout, @"Time zone for PST (from dict):\n %@\n",
[[NSTimeZone abbreviationDictionary] objectForKey: @"PST"]);
GSPrintf(stdout, @"Time zones for PST (from map):\n %@\n",
[[[NSTimeZone abbreviationMap] objectForKey: @"PST"] description]); [[[NSTimeZone abbreviationMap] objectForKey: @"PST"] description]);
other = [NSTimeZone timeZoneWithAbbreviation: @"CEST"];
GSPrintf(stdout, @"Time zone for CEST:\n %@\n", other);
date = [[NSCalendarDate alloc] initWithString:@"09/04/2003 17:58:45 CEST"
calendarFormat:@"%m/%d/%Y %H:%M:%S %Z"];
GSPrintf(stdout, @"Date in CEST:\n %@\n", date);
RELEASE(pool); RELEASE(pool);
return 0; return 0;