/
unittype.m
131 lines (104 loc) · 3.19 KB
/
unittype.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//
// unittype.m
// aem
//
#import "unittype.h"
/**********************************************************************/
// default unit types
typedef struct {
NSString *name;
DescType code;
} AEMDefaultUnitTypeDef;
static AEMDefaultUnitTypeDef defaultUnitTypes[] = {
{@"centimeters", 'cmtr'},
{@"meters", 'metr'},
{@"kilometers", 'kmtr'},
{@"inches", 'inch'},
{@"feet", 'feet'},
{@"yards", 'yard'},
{@"miles", 'mile'},
{@"square meters", 'sqrm'},
{@"square kilometers", 'sqkm'},
{@"square feet", 'sqft'},
{@"square yards", 'sqyd'},
{@"square miles", 'sqmi'},
{@"cubic centimeters", 'ccmt'},
{@"cubic meters", 'cmet'},
{@"cubic inches", 'cuin'},
{@"cubic feet", 'cfet'},
{@"cubic yards", 'cyrd'},
{@"liters", 'litr'},
{@"quarts", 'qrts'},
{@"gallons", 'galn'},
{@"grams", 'gram'},
{@"kilograms", 'kgrm'},
{@"ounces", 'ozs '},
{@"pounds", 'lbs '},
{@"degrees Celsius", 'degc'},
{@"degrees Fahrenheit", 'degf'},
{@"degrees Kelvin", 'degk'},
{nil, 0}
};
/**********************************************************************/
// Unit type definition
@implementation AEMUnitTypeDefinition
+ (id)definitionWithName:(NSString *)name_ code:(DescType)code_ {
return [[[[self class] alloc] initWithName: name_ code: code_] autorelease];
}
- (id)initWithName:(NSString *)name_ code:(DescType)code_ {
self = [super init];
if (!self) return self;
name = [name_ retain];
code = code_;
return self;
}
- (void)dealloc {
[name release];
[super dealloc];
}
- (NSString *)name {
return name;
}
- (DescType)code {
return code;
}
/*
* The default implementation packs and unpacks the descriptor's data
* handle as a double. Override these methods to support other formats.
*/
- (NSAppleEventDescriptor *)pack:(ASUnits *)obj {
double float64 = [obj doubleValue];
return [NSAppleEventDescriptor descriptorWithDescriptorType: code
bytes: &float64
length: sizeof(float64)];
}
- (ASUnits *)unpack:(NSAppleEventDescriptor *)desc {
double float64;
[[desc data] getBytes: &float64 length: sizeof(float64)];
return [ASUnits unitsWithDouble: float64 type: name];
}
@end
/**********************************************************************/
void AEMGetDefaultUnitTypeDefinitions(NSDictionary **definitionsByName,
NSDictionary **definitionsByCode) {
static NSMutableDictionary *defaultDefinitionsByName, *defaultDefinitionsByCode;
NSString *name;
DescType code;
AEMUnitTypeDefinition *definition;
int i = 0;
if (!defaultDefinitionsByName) {
defaultDefinitionsByName = [[NSMutableDictionary alloc] init];
defaultDefinitionsByCode = [[NSMutableDictionary alloc] init];
do {
name = defaultUnitTypes[i].name;
code = defaultUnitTypes[i].code;
definition = [[AEMUnitTypeDefinition alloc] initWithName: name code: code];
[defaultDefinitionsByName setObject: definition forKey: name];
[defaultDefinitionsByCode setObject: definition forKey: [NSNumber numberWithUnsignedInt: code]];
[definition release];
i++;
} while (defaultUnitTypes[i].name);
}
*definitionsByName = [NSMutableDictionary dictionaryWithDictionary: defaultDefinitionsByName];
*definitionsByCode = [NSMutableDictionary dictionaryWithDictionary: defaultDefinitionsByCode];
}