usaa20/sk4/program.c
2021-01-09 11:23:46 +01:00

196 lines
5.5 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
typedef enum {
INK, DEK,
BREK, GLEK,
PUK, KUK,
LP, RP,
TUK, FUK
}inst;
char dtape[30000] = {0};//hlava dh
inst ptape[30000] = {0};//hlava ph
size_t loops[2][15000] = {{0},{0}};
size_t loopscount=0;
char* dhead = dtape;
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(loops[1][k]==i){
*phead = RP;
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;
phead++;
loops[0][loopscount] = i;
loops[1][loopscount++] = j;
}
break;
}
/*if (current_char == 'INK') {//>
++ptr;
} else if (current_char == 'DEK') {//<
--ptr;
} else if (current_char == 'BREK') {// +
++*ptr;
} else if (current_char == 'GLEK') {// -
--*ptr;
} else if (current_char == 'PUK' ) {// .
putchar(*ptr);
} else if (current_char == 'KUK') {// ,
*ptr = getchar();
} else if (current_char == '[') {//start loop
continue;
} else if (current_char == ']' && *ptr) {stop loop
loop = 1;
while (loop > 0) {
current_char = input[--i];
if (current_char == '[') {
loop--;
} else if (current_char == ']') {
loop++;
}
*/
}
}
int main() {
char buff[30000];
FILE *fp;
fp = fopen("kod.txt","r");
memset(buff,0,sizeof(buff));
printf("buffer:\n %s\n",buff);
fread(buff,1,30000,fp);
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;
}
}
printf("\n");
return 0;
}