mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-27 06:34:11 +00:00
7829ec3adb
This makes it possible to use the parser to read in certain fields, but skip over others. The read-only is for cexpr parsing of the read-only fields.
107 lines
2.2 KiB
R
107 lines
2.2 KiB
R
#include <string.h>
|
|
#include <PropertyList.h>
|
|
|
|
#include "vkfieldarray.h"
|
|
#include "vkfieldauto.h"
|
|
#include "vkfieldcustom.h"
|
|
#include "vkfielddata.h"
|
|
#include "vkfielddef.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 "readonly":
|
|
return [[[ReadOnlyField 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
|