quakeforge/ruamoko/lib/PropertyList.r
Bill Currie 7d4c1d79b1 [plist] Use reference counts for items
This makes it much easier to share items between property lists (eg,
targets and the main entity list in cl_light).
2023-03-13 11:26:13 +09:00

274 lines
4.1 KiB
R

#include <PropertyList.h>
@implementation PLItem
+ (PLItem *) newDictionary
{
return [PLDictionary new];
}
+ (PLItem *) newArray
{
return [PLArray new];
}
+ (PLItem *) newData:(void*) data size:(int) len
{
return [PLData new:data size:len];
}
+ (PLItem *) newString:(string) str
{
return [PLString new:str];
}
+ itemClass:(plitem_t *) item
{
local string classname = nil;
local id class;
if (!item)
return nil;
switch (PL_Type (item)) {
case QFDictionary:
classname = "PLDictionary";
break;
case QFArray:
classname = "PLArray";
break;
case QFBinary:
classname = "PLData";
break;
case QFString:
classname = "PLString";
break;
default:
return nil;
}
class = obj_lookup_class (classname);
return [[class alloc] initWithItem: item];
}
+ (PLItem *) fromString:(string) str
{
return [[PLItem itemClass: PL_GetPropertyList (str)] autorelease];
}
+ (PLItem *) fromFile:(QFile) file
{
return [[PLItem itemClass: PL_GetFromFile (file)] autorelease];
}
- initWithItem:(plitem_t *) item
{
if (!(self = [super init]))
return self;
PL_Retain (item);
self.item = item;
return self;
}
- (void) dealloc
{
PL_Release (item);
[super dealloc];
}
- (plitem_t *) item
{
return item;
}
- (string) write
{
return PL_WritePropertyList (item);
}
- (pltype_t) type
{
return PL_Type (item);
}
- (int) line
{
return PL_Line (item);
}
- (int) count
{
if ([self class] == [PLDictionary class]) {
return PL_D_NumKeys (item);
} else {
return PL_A_NumObjects (item);
}
}
- (int) numKeys
{
return PL_D_NumKeys (item);
}
- (PLItem *) getObjectForKey:(string) key
{
return [[PLItem itemClass: PL_ObjectForKey (item, key)] autorelease];
}
- (PLItem *) allKeys
{
return [[PLItem itemClass: PL_D_AllKeys (item)] autorelease];
}
- (string) keyAtIndex:(int) index
{
return PL_KeyAtIndex (item, index);
}
- addKey:(string) key value:(PLItem *) value
{
PL_D_AddObject (item, key, value.item);
return self;
}
- (int) numObjects
{
return PL_A_NumObjects (item);
}
- (PLItem *) getObjectAtIndex:(int) index
{
return [[PLItem itemClass: PL_ObjectAtIndex (item, index)] autorelease];
}
- addObject:(PLItem *) object
{
PL_A_AddObject (item, object.item);
return self;
}
- insertObject:(PLItem *) object atIndex:(int) index
{
PL_A_InsertObjectAtIndex (item, object.item, index);
return self;
}
- (string) string
{
return PL_String (item);
}
@end
@implementation PLDictionary
+ (PLDictionary *) new
{
return [[PLDictionary alloc] initWithItem: PL_NewDictionary ()];
}
+ (PLItem *) fromString:(string) str
{
return [[PLItem itemClass: PL_GetDictionary (str)] autorelease];
}
+ (PLItem *) fromFile:(QFile) file
{
return [[PLItem itemClass: PL_GetDictionaryFromFile (file)] autorelease];
}
- (int) count
{
return PL_D_NumKeys (item);
}
- (int) numKeys
{
return PL_D_NumKeys (item);
}
- (PLItem *) getObjectForKey:(string) key
{
return [[PLItem itemClass: PL_ObjectForKey (item, key)] autorelease];
}
- (PLItem *) allKeys
{
return [[PLItem itemClass: PL_D_AllKeys (item)] autorelease];
}
- addKey:(string) key value:(PLItem *) value
{
PL_D_AddObject (item, key, value.item);
return self;
}
@end
@implementation PLArray
+ (PLArray *) new
{
return [[PLArray alloc] initWithItem: PL_NewArray ()];
}
+ (PLItem *) fromString:(string) str
{
return [[PLItem itemClass: PL_GetArray (str)] autorelease];
}
+ (PLItem *) fromFile:(QFile) file
{
return [[PLItem itemClass: PL_GetArrayFromFile (file)] autorelease];
}
- (int) count
{
return PL_A_NumObjects (item);
}
- (int) numObjects
{
return PL_A_NumObjects (item);
}
- (PLItem *) getObjectAtIndex:(int) index
{
return [[PLItem itemClass: PL_ObjectAtIndex (item, index)] autorelease];
}
- addObject:(PLItem *) object
{
PL_A_AddObject (item, object.item);
return self;
}
- insertObject:(PLItem *) object atIndex:(int) index
{
PL_A_InsertObjectAtIndex (item, object.item, index);
return self;
}
@end
@implementation PLData
+ (PLData *) new:(void*) data size:(int) len
{
return [[PLData alloc] initWithItem: PL_NewData (data, len)];
}
@end
@implementation PLString
+ (PLString *) new: (string) str
{
return [[PLString alloc] initWithItem: PL_NewString (str)];
}
- (string) string
{
return PL_String (item);
}
@end