usaa20/sk4/program.c
2021-01-09 21:03:10 +01:00

241 lines
6.8 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
typedef enum {
INK, DEK,//Enum je pouzity ,
BREK, GLEK,//polia 2 rozmerne atd
PUK, KUK,
LP, RP,
TUK, FUK
}inst;
char dtape[30000] = {0};//hlava dh
inst ptape[30000] = {0};//hlava ph
size_t validRP[15000]={0};
inst* loops[2][15000] = {{0},{0}};//adresy zatvoriek
size_t loopscount=0;//v globalnych premennych su ulozene udaje z pasky
char* dhead = dtape;//smerniky
inst* phead = ptape;
void run_tukafuk(const char* code) {
char current_char;
bool running = false;
size_t i;
//bolo pozadovane zistit, kdd su skoky a teda som ich ulozil
//(tie adresy skokov)
for (i = 0; code[i] != 0; i++){
current_char = code[i];
size_t j;
size_t loop;
switch(current_char){
case 'T':
if(code[i+1]=='U')
if(code[i+2]=='K'){
*phead = TUK;
phead++;
i+=2;
}
break;
case 'I':
if(code[i+1]=='N')
if(code[i+2]=='K'){
*phead = INK;
phead++;
i+=2;
}
break;
case 'D':
if(code[i+1]=='E')
if(code[i+2]=='K'){
*phead = DEK;
phead++;
i+=2;
}
break;
case 'B':
if(code[i+1]=='R')
if(code[i+2]=='E')
if(code[i+3] =='K'){
*phead = BREK;
phead++;
i+=3;
}
break;
case 'G':
if(code[i+1]=='L')
if(code[i+2]=='E')
if(code[i+3] =='K'){
*phead = GLEK;
phead++;
i+=3;
}
break;
case 'P':
if(code[i+1]=='U')
if(code[i+2]=='K'){
*phead = PUK;
phead++;
i+=2;
}
break;
case 'K':
if(code[i+1]=='U')
if(code[i+2]=='K'){
*phead = KUK;
phead++;
i+=2;
}
break;
case 'F':
if(code[i+1]=='U')
if(code[i+2]=='K'){
*phead = FUK;
phead++;
i+=2;
}
break;
case ']':
for(size_t k=0;k<loopscount;k++){
if(validRP[k]==i){
*phead = RP;
loops[1][k]=phead;
phead++;
}
}
break;
case '[':
j = i;
loop = 1;
while (loop > 0){//aby J nepreslo von.
current_char = code[++j];//
if (current_char==0){
break;
}
if (current_char == ']'){
loop--;
} else if (current_char == '['){
loop++;
}
}
if(loop==0){
*phead = LP;
loops[0][loopscount] = phead;
validRP[loopscount++] = j;
phead++;
}
break;
}
}
phead = ptape;
for (i = 0; i<30000; i++){
if(running){
switch(*phead){
case INK:
//printf("Ink..%c",*dhead);
(*dhead)++;
//printf("->%c\n",*dhead);
break;
case DEK:
//printf("Dek..%c",*dhead);
(*dhead)--;
//printf("->%c\n",*dhead);
break;
case BREK:
dhead++;
break;
case GLEK:
dhead--;
break;
case PUK:
//printf("Puk\n");
putchar(*dhead);
//printf("\nPukEnd\n");
break;
case KUK:
printf("Zadaj vstup:\n");
*dhead=getchar();
while(getchar()!='\n'){}
//printf("Kukol %c\n",*dhead);
break;
case FUK:
running=false;
break;
case LP:
if(*dhead==0){
for(int j=0;j<loopscount;j++){
if(loops[0][j]==phead){
phead=loops[1][j];
break;
}
}
}
break;
case RP:
if(*dhead!=0){
for(int j=0;j<loopscount;j++){
if(loops[1][j]==phead){
phead=loops[0][j];
break;
}
}
}
}
if(!running)
break;
}
else{
if(*phead==TUK)
running=true;
}
phead++;
}
printf(" \n");
}
int main() {
char buff[30000];
FILE *fp;
fp = fopen("kod.txt","r");
//memset(buff,0,sizeof(buff));
size_t fr = fread(buff,1,30000,fp);
buff[fr]=0;
//printf("buffer:\n %s\n",buff);
run_tukafuk(buff);
fclose(fp);
/*printf("Programova Paska: \n");
for(inst *ptr=ptape;ptr<=phead;ptr++){
switch (*ptr){
case TUK:printf("TUK ");
break;
case INK:printf("INK ");
break;
case DEK:printf("DEK ");
break;
case BREK:printf("BREK ");
break;
case GLEK:printf("GLEK ");
break;
case PUK:printf("PUK ");
break;
case KUK:printf("KUK ");
break;
case FUK:printf("FUK ");
break;
case LP:printf("LP ");
break;
case RP:printf("RP ");
break;
default:printf("NULL ");
break;
}
}
*/
return 0;
}