196 lines
5.5 KiB
C
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;
|
|
} |