quakeforge/libs/video/renderer/vulkan/vkgen/vkfielddef.r
Bill Currie 4adb7dfbd1 [vkgen] Support custom parsers for .parse blocks
This let me keep clearValue's simple default rgba float interpretation,
but also have full control over access to the float32, int32 and uint32
fields.
2023-06-29 18:41:18 +09:00

123 lines
2.7 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 data: %d\n",
self, line);
return self;
}
-writeParse
{
fprintf (output_file, "%@ undefined record type parse: %d\n", self, line);
return self;
}
-writeField
{
fprintf (output_file, "%@ undefined record type field: %d\n", self, 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