#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
char* varname;
char* value;
} var;
var* variables;
int var_cnt = 0;
int putvar( char* varname, char* value )
{
int i;
strupr( varname );
/* Suche Speicherplätze und fülle mit neuen Wert,
falls schon vorhanden */
for( i = 0; i < var_cnt; i++ )
{
if( strcmp( variables[i].varname, varname ) == 0 )
{
if( variables[i].value != (char*) NULL )
free( variables[i].value );
variables[i].value = strdup( value );
return 0;
}
}
/* Neue Variable anlegen */
if( var_cnt == 0 )
variables = (var*)malloc( sizeof( var ) );
else
variables = (var*)realloc( (var*) variables,
(var_cnt + 1) * sizeof( var ) );
variables[ var_cnt ].varname = strdup( varname );
variables[ var_cnt ].value = strdup( value );
var_cnt++;
}
char* getvar( char* varname )
{
int i;
strupr( varname );
/* Suche Speicherplätze und gebe Wert zurück */
for( i = 0; i < var_cnt; i++ )
{
if( strcmp( variables[i].varname, varname ) == 0 )
{
return variables[i].value;
}
}
return "";
}
char* getnexttoken( char** line )
{
char* start;
while( **line == '\t' || **line == ' ' )
(*line)++;
start = *line;
do
{
(*line)++;
}
while( **line != ' ' && **line != '\n' );
**line = '\0';
(*line)++;
return start;
}
char* getargument( char* line )
{
char* arg;
static char str [ 80 + 1 ];
arg = getnexttoken( &line );
strupr( arg );
/* Argument ermitteln und verarbeiten */
if( strcmp( arg, "INPUT" ) == 0 )
{
gets( str );
return str;
}
else if( strcmp( arg, "VALUE" ) == 0 )
return getvar( getnexttoken( &line ) );
else if( strcmp( arg, "TEXT" ) == 0 )
return line;
else
return "";
}
int execute( char* line )
{
char* statement;
char* var;
char value [ 80 + 1 ];
int calcvalue = 0;
statement = getnexttoken( &line );
strupr( statement );
/* Anweisungen verarbeiten */
if( strcmp( statement, "PRINT" ) == 0 )
printf("%s", getargument( line ) );
else if( strcmp( statement, "STORE" ) == 0 )
{
var = getnexttoken( &line );
putvar( var , getargument( line ) );
}
else if( strcmp( statement, "CLS" ) == 0 )
system("cls");
else if( strcmp( statement, "NEWLINE" ) == 0 )
printf("\n");
else if( strcmp( statement, "ADD" ) == 0 || strcmp( statement, "SUBSTRACT") == 0 ||
strcmp( statement, "DIVIDE") == 0 || strcmp( statement, "MULTIPLY") == 0 )
{
var = getnexttoken( &line );
if( strcmp( statement, "ADD" ) == 0 )
calcvalue = atoi( getvar( var ) ) + atoi( getargument( line ) );
else if( strcmp( statement, "SUBSTRACT" ) == 0 )
calcvalue = atoi( getvar( var ) ) - atoi( getargument( line ) );
else if( strcmp( statement, "DIVIDE" ) == 0 )
calcvalue = atoi( getvar( var ) ) / atoi( getargument( line ) );
else
calcvalue = atoi( getvar( var ) ) * atoi( getargument( line ) );
sprintf(value, "%d", calcvalue );
putvar( var, value );
}
else
{
return -1;
}
return 0;
}
int main( int argc, char** argv )
{
FILE* source = (FILE*)NULL;
char line [ 1024 + 1 ];
if( argc < 2 )
{
printf("Verwendung:\t\tLITERAL <dateiname>\n");
return -1;
}
source = fopen( argv[1], "rt" );
if( source != (FILE*) NULL )
{
while( fgets( line, 1024, source ) != (char*)NULL )
{
line[ strlen( line ) - 1 ] = '\0';
if( execute( line ) < 0 )
break;
}
fclose( source );
}
else
{
printf("Fehler: Datei nicht gefunden.");
return -1;
}
return 0;
}
cls print text Geben Sie bitte einen Wert ein: store wert1 input print text Geben Sie bitte einen weiteren Wert ein: store wert2 input multiply wert1 value wert2 print text Das Ergebnis der Berechnung lautet: print value wert1 newline
Geben Sie bitte einen Wert ein: 5 Geben Sie bitte einen weiteren Wert ein: 4 Das Ergebnis der Berechnung lautet: 20
Copyright © 2025