quakeforge/libs/video/renderer/vulkan/vkgen/vkfielddef.r
Bill Currie 3498d8b2ae [vkgen] Add support for labeled array elements
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.
2023-02-14 15:22:09 +09:00

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