mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-12-01 00:21:50 +00:00
3498d8b2ae
This treats dictionary items as arrays ordered by key creation (ie, the order of the key/value pairs in the dictionary is preserved). The label is written to the specified field when parsing the struct. Both actual arrays and single element "arrays" are supported.
116 lines
2.6 KiB
R
116 lines
2.6 KiB
R
#include <string.h>
|
|
#include <PropertyList.h>
|
|
|
|
#include "vkfieldarray.h"
|
|
#include "vkfieldauto.h"
|
|
#include "vkfieldcustom.h"
|
|
#include "vkfielddata.h"
|
|
#include "vkfielddef.h"
|
|
#include "vkfieldignore.h"
|
|
#include "vkfieldlabeledarray.h"
|
|
#include "vkfieldlabeledsingle.h"
|
|
#include "vkfieldreadonly.h"
|
|
#include "vkfieldsingle.h"
|
|
#include "vkfieldstring.h"
|
|
#include "vkstruct.h"
|
|
|
|
@implementation FieldDef
|
|
|
|
+fielddef:(PLItem *)item struct:(Struct *)strct field:(string)fname
|
|
{
|
|
string record = [item string];
|
|
PLItem *type_desc = [item getObjectForKey:"type"];
|
|
|
|
if (!item) {
|
|
record = "auto";
|
|
}
|
|
if (!record) {
|
|
if (item && !type_desc) {
|
|
return nil;
|
|
}
|
|
record = [type_desc string];
|
|
if (!record) {
|
|
record = [[type_desc getObjectAtIndex:0] string];
|
|
}
|
|
}
|
|
switch (record) {
|
|
case "auto":
|
|
return [[[AutoField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "custom":
|
|
return [[[CustomField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "string":
|
|
return [[[StringField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "data":
|
|
return [[[DataField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "single":
|
|
return [[[SingleField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "array":
|
|
return [[[ArrayField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "labeledarray":
|
|
return [[[LabeledArrayField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "labeledsingle":
|
|
return [[[LabeledSingleField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "readonly":
|
|
return [[[ReadOnlyField alloc] init:item struct:strct field:fname] autorelease];
|
|
case "ignore":
|
|
return [[[IgnoreField alloc] init:item struct:strct field:fname] autorelease];
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
-init:(PLItem *)item struct:(Struct *)strct field:(string)fname
|
|
{
|
|
self = [super init];
|
|
if (!self) {
|
|
return self;
|
|
}
|
|
|
|
line = [item line];
|
|
struct_name = str_hold ([strct outname]);
|
|
field_name = str_hold (fname);
|
|
return self;
|
|
}
|
|
|
|
-fromField:(qfot_var_t *)field struct:(Struct *)strct
|
|
{
|
|
return self;
|
|
}
|
|
|
|
-(void)dealloc
|
|
{
|
|
str_free (struct_name);
|
|
str_free (field_name);
|
|
[super dealloc];
|
|
}
|
|
|
|
-writeParseData
|
|
{
|
|
fprintf (output_file, "undefined record type parse: %d\n", line);
|
|
return self;
|
|
}
|
|
|
|
-writeField
|
|
{
|
|
fprintf (output_file, "undefined record type field: %d\n", line);
|
|
return self;
|
|
}
|
|
|
|
-writeSymbol
|
|
{
|
|
fprintf (output_file,
|
|
"\t{\"%s\", 0/*FIXME*/, (void *) field_offset (%s, %s)},\n",
|
|
field_name, struct_name, value_field);
|
|
return self;
|
|
}
|
|
|
|
-(string) name
|
|
{
|
|
return field_name;
|
|
}
|
|
|
|
-(int) searchType
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
@end
|