start working on text representation and constants
This commit is contained in:
96
src/value.c
Normal file
96
src/value.c
Normal file
@@ -0,0 +1,96 @@
|
||||
#include "value.h"
|
||||
|
||||
uint32_t globalValueIncrementer = 0;
|
||||
|
||||
char* getIncrementedName(void) {
|
||||
char* buffer = malloc(32);
|
||||
if (buffer == NULL) return buffer;
|
||||
|
||||
snprintf(buffer, 32, "%%%d", globalValueIncrementer);
|
||||
|
||||
globalValueIncrementer++;
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
GravityValue gravityNewValue(const char* name, GravityType type) {
|
||||
GravityValue newValue = malloc(sizeof(struct GravityOpaqueValue));
|
||||
if (newValue == NULL) return newValue;
|
||||
|
||||
newValue->kind = GravityLocalValueKind;
|
||||
newValue->type = type;
|
||||
|
||||
if (name == NULL) {
|
||||
name = getIncrementedName();
|
||||
} else {
|
||||
name = strdup(name);
|
||||
}
|
||||
|
||||
newValue->name = name;
|
||||
|
||||
return newValue;
|
||||
}
|
||||
|
||||
GravityValue gravityTypeToTypeValue(GravityType type) {
|
||||
GravityType valueType = gravityCreateType();
|
||||
valueType->typeKind = GravityTypeTypeKind;
|
||||
valueType->typeData = type;
|
||||
|
||||
GravityValue newValue = gravityNewValue(NULL, valueType);
|
||||
if (newValue == NULL) return newValue;
|
||||
|
||||
return newValue;
|
||||
}
|
||||
|
||||
char* gravityValueToCStr(GravityValue value) {
|
||||
switch (value->kind) {
|
||||
case GravityLocalValueKind:
|
||||
|
||||
return strdup(value->name);
|
||||
|
||||
case GravityConstantValueKind: {
|
||||
StringBuffer buff;
|
||||
initStringBuff(&buff);
|
||||
|
||||
switch (value->type->typeKind) {
|
||||
case GravityIntTypeKind: {
|
||||
sbAppend(&buff, "%ld", value->constant.intValue);
|
||||
break;
|
||||
}
|
||||
|
||||
case GravityTypeTypeKind: {
|
||||
sbAppend(&buff, "%s", gravityTypeToCStr(value->type->typeData));
|
||||
break;
|
||||
}
|
||||
|
||||
default: assert(false);
|
||||
}
|
||||
|
||||
return buff.data;
|
||||
}
|
||||
|
||||
default: assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
GravityValue gravityNewConstant(GravityType type) {
|
||||
GravityValue newValue = malloc(sizeof(struct GravityOpaqueValue));
|
||||
if (newValue == NULL) return newValue;
|
||||
|
||||
newValue->kind = GravityConstantValueKind;
|
||||
newValue->type = type;
|
||||
newValue->name = NULL;
|
||||
|
||||
return newValue;
|
||||
}
|
||||
|
||||
GravityValue newIntConstant(GravityType intType, int64_t value) {
|
||||
assert(intType->typeKind == GravityIntTypeKind);
|
||||
|
||||
GravityValue newValue = gravityNewConstant(intType);
|
||||
if (newValue == NULL) return newValue;
|
||||
|
||||
newValue->constant.intValue = value;
|
||||
|
||||
return newValue;
|
||||
}
|
||||
Reference in New Issue
Block a user