141 lines
2.8 KiB
C
141 lines
2.8 KiB
C
|
|
#include "template.h"
|
|
|
|
|
|
struct template * template_new() {
|
|
|
|
struct template * templateInstance = malloc( sizeof( struct template ) );
|
|
|
|
templateInstance->instances = array_new();
|
|
|
|
return templateInstance;
|
|
|
|
}
|
|
|
|
|
|
void template_add_arguments( struct template * currentTemplate, char * argumentText ) {
|
|
|
|
printf("add arguments to template\n\n\n");
|
|
|
|
currentTemplate->arguments = text_split( argumentText, "," );
|
|
|
|
}
|
|
|
|
bool template_validateArguments( struct template * currentTemplate, char * argumentText ) {
|
|
|
|
array * argumentsArray = text_split( argumentText, "," );
|
|
|
|
if( array_length( argumentsArray ) == array_length( currentTemplate->arguments ) ) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bool template_addArgumentValue( struct class * classInstance, char * templateArguments ) {
|
|
|
|
templateArguments = text_regexReplaceAll( templateArguments, "struct ", "struct ", "" );
|
|
|
|
if( !template_validateArguments( classInstance->template, templateArguments ) ) {
|
|
|
|
printf("Error: Invalid template arguments. %s \n\n", templateArguments);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if( !template_instanceExists( classInstance->template, templateArguments ) ) {
|
|
|
|
printf("Adding template instance. \n\n");
|
|
|
|
template_addInstance( classInstance->template, templateArguments );
|
|
|
|
template_instanceExists( classInstance->template, templateArguments );
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
char * template_extractTemplateName( struct template * currentTemplate, char * argumentText ) {
|
|
|
|
array * argumentsArray = text_split( argumentText, "," );
|
|
|
|
if( array_length( argumentsArray ) > 0 ) {
|
|
|
|
return array_get( argumentsArray, 0 );
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
bool template_instanceExists( struct template * currentTemplate, char * argumentText ) {
|
|
|
|
array * argumentsValueArray = text_split( argumentText, "," );
|
|
|
|
array * intances = currentTemplate->instances;
|
|
|
|
int count = array_length( intances );
|
|
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
|
|
struct templateInstance * currentTemplateInstance = array_get( intances, i );
|
|
|
|
array * templateArgumentValues = currentTemplateInstance->argumentValues;
|
|
|
|
int propertyCount = array_length( templateArgumentValues );
|
|
|
|
bool allPropertiesMatch = true;
|
|
|
|
for (int j = 0; j < propertyCount; ++j )
|
|
{
|
|
|
|
char * currentArgumentValue = array_get( templateArgumentValues, j );
|
|
|
|
char * ArgumentValue = array_get( argumentsValueArray, j );
|
|
|
|
if( strcmp( currentArgumentValue, ArgumentValue ) != 0 ) {
|
|
|
|
allPropertiesMatch = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( allPropertiesMatch ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
void template_addInstance( struct template * currentTemplate, char * argumentText ) {
|
|
|
|
|
|
struct templateInstance * newInstance = templateInstance_new();
|
|
|
|
newInstance->argumentValues = text_split( argumentText, "," );
|
|
|
|
array_add( currentTemplate->instances, newInstance );
|
|
|
|
|
|
}
|
|
|
|
//templateInstance_new
|