112 lines
2.3 KiB
C
112 lines
2.3 KiB
C
|
|
#include "function.h"
|
|
|
|
|
|
|
|
struct functionLayout * function_getFunctionByName( struct array * functions, char * functionName ) {
|
|
|
|
int count = array_length( functions );
|
|
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
struct functionLayout * currentFunction = array_get( functions, i );
|
|
|
|
if( strcmp( currentFunction->name, functionName ) == 0 ) {
|
|
|
|
return currentFunction;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
char * function_getReturnTypeBySymbol( char * functionName, int * leftSideIsPointer ) {
|
|
|
|
struct functionLayout * currentFunction = function_getFunctionByName( allFunctions, functionName );
|
|
|
|
if( currentFunction != NULL ) {
|
|
|
|
struct array * functionDeclarationParts = text_split( currentFunction->declarationText, " \t" );
|
|
|
|
*leftSideIsPointer = variable_isPointer( functionDeclarationParts );
|
|
|
|
return array_get( functionDeclarationParts, 0 );
|
|
|
|
} else {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void cloneMethodToFunction( struct method * currentMethod, struct array * functions, char * newName ) {
|
|
|
|
struct text * newMethodDecleration = text_new( "" );
|
|
|
|
text_append( newMethodDecleration, currentMethod->returnType );
|
|
|
|
text_append( newMethodDecleration, " " );
|
|
|
|
text_append( newMethodDecleration, newName);
|
|
|
|
|
|
struct array * arguments = array_new();
|
|
|
|
int argumentCount = array_length( currentMethod->arguments );
|
|
|
|
for ( int k = 1; k < argumentCount; ++k )
|
|
{
|
|
|
|
char * currentArgument = array_get( currentMethod->arguments, k );
|
|
|
|
array_add( arguments, currentArgument );
|
|
|
|
}
|
|
|
|
|
|
struct functionLayout * functionInstance = malloc( sizeof( struct functionLayout ) );
|
|
|
|
functionInstance->name = newName;
|
|
|
|
functionInstance->declarationText = newMethodDecleration->value;
|
|
|
|
functionInstance->bodyOriginal = currentMethod->bodyOriginal;
|
|
|
|
functionInstance->variables = array_new();
|
|
|
|
functionInstance->body = method_parse( currentMethod->bodyOriginal, functionInstance->variables, functions );//;
|
|
|
|
functionInstance->arguments = arguments;
|
|
|
|
functionInstance->lineNumber = -1;
|
|
|
|
|
|
array_add( functions, functionInstance );
|
|
|
|
}
|
|
|
|
|
|
int functionExists( struct array * functions, char * functionName ) {
|
|
|
|
int count = array_length( functions );
|
|
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
|
|
struct functionLayout * currentFunction = array_get( functions, i );
|
|
|
|
if( strcmp( currentFunction->name, functionName ) == 0 ) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
} |