Files
c-prime/source/variable.c
2025-11-17 10:28:09 +01:00

220 lines
4.5 KiB
C

#include "variable.h"
struct variable * variabe_new() {
struct variable * variableInstance = malloc( sizeof( struct variable ) );
return variableInstance;
}
// split on whitespace and on *
// int *name
// int* name
// int * name;
// const int *name
// depends on classesArray
void variable_getVariablesByArgumentParts( struct array * argumentParts, struct array * variables, struct array * classesArray ) {
int count = array_length( argumentParts );
int exists = -1;
char * className = "";
for ( int i = 0; i < count; ++i )
{
char * symbol = array_get( argumentParts, i );
//printf("add argument to variable. %s\n\n", symbol);
int symbolIsClass = class_findClassByClassNameExists( allClasses, symbol );
if( symbolIsClass == 1 ) {
exists = 1;
className = symbol;
}
}
if( exists == 1 ) {
char * argumentName = array_get( argumentParts, array_length( argumentParts ) - 1 );
struct variable * variableInstance = malloc( sizeof( struct variable ) );
variableInstance->variableName = argumentName;
variableInstance->datatype = className;
//printf("\n\n\n add argument as variable: variable->variableName %s variableInstance->datatype %s\n\n\n", variableInstance->variableName, variableInstance->datatype);
variableInstance->isPointer = variable_isPointer( argumentParts );
array_add( variables, variableInstance );
}
}
struct variable * variable_getByName( struct array * variables, char * name ) {
int count = array_length( variables );
//printf("variable count %i %s \n", count, name );
//for (int i = 0; i < count; ++i)
//{
for (int i = count - 1; i >= 0; --i)
{
struct variable * currentVariable = ( struct variable * ) array_get( variables, i );
//printf("get variable by name %s %s\n", currentVariable->variableName, name);
if ( strcmp( currentVariable->variableName, name ) == 0 ) {
return currentVariable;
}
}
//printf("error: Variable not found;\n");
struct variable * emptyVariable = malloc( sizeof( struct variable ) * 10 );
emptyVariable->datatype = "this_variable_is_missing";
//printf("\n\nvariable not found: %s \n", name);
return emptyVariable;
}
void variable_extractFromDeclaration( lexer * currentLexer, int currentKey, int i, char * body, struct array * variables ) {
int previouskey = lexer_getKey( currentLexer, i - 1 );
char * variableDeclaration = text_removeWhiteSpaces( text_slice( body, previouskey + 1, currentKey - 1 ) );
char * previousToken = lexer_getToken( currentLexer, i - 1 );
//printf(" variable: %s\n", variableDeclaration );
if( strcmp( previousToken, ";" ) == 0 || strcmp( previousToken, "{" ) == 0 || strcmp( previousToken, "}" ) == 0 ) {
struct array * variableDeclarationParts = text_split( variableDeclaration, " \t" );
if( array_length( variableDeclarationParts ) == 1 ) {
// this is an global var without an datatype in the declaration
return;
}
char * datatype = tools_findDatatype( variableDeclarationParts );
//printf(" datatype: %s\n", datatype);
char * variableName = array_get( variableDeclarationParts, array_length( variableDeclarationParts ) - 1 );
//printf(" variableName: %s\n", variableName);
if( variableDeclaration == NULL ) {
printf("Error variable not found: %s\n", text_copy( variableDeclaration ) );
return;
}
int isPointer = variable_isPointer( variableDeclarationParts );
struct variable * variableInstance = malloc( sizeof( struct variable ) );
variableInstance->variableName = variableName;
variableInstance->datatype = datatype;
variableInstance->isPointer = isPointer;
array_add( variables, variableInstance );
if( variableInstance->variableName == NULL ) {
printf("Error, this datatype does not exist.");
}
printf("\n\n");
} else {
//printf(" This is not a variable bacause previousToken = %s\n\n", previousToken);
}
}
int variable_isPointer( struct array * propertyParts ) {
int isPointer = -1;
int propertyPartsLength = array_length( propertyParts );
for ( int j = 0; j < propertyPartsLength; ++j ) //propertyPartsLength-1
{
char * part = (char *) array_get( propertyParts, j );
if( strcmp( part, "const" ) == 0 ) {
//printf("qualifier: %s\n", part);
} else if( strcmp( part, "volatile" ) == 0 ) {
//printf("qualifier: %s\n", part);
} else if( strcmp( part, "*" ) == 0 ) {
isPointer = 1;
} else {
//printf("datatype: %s\n", part);
//propertyInstance->datatype = part;
}
}
return isPointer;
}