//spoji dva retazce a vrati novy string * concat( string* s1, string* s2) { string * newstr = strNewFromConstChar(strGetStr(s1)); strAppendString(newstr, s2); return newstr; }
void interpret(TA_Item **ta_table, tBTSUzolPtr root) { if((*ta_table)==NULL) //prazdny program, nemame co resit, koncime { return; } int end= (*ta_table)[0].end; size_t operation; tBTSUzolPtr op1, op2, result, pom; op1=NULL; op2=NULL; result=NULL; pom=NULL; int *jump_array=NULL; find_labels(ta_table, &jump_array); for(int position=0; position<end; position++) { ta_Get(ta_table, &operation, &op1, &op2, &result, position); switch(operation) { /******************aritmeticke operace**********************/ case I_ADD: if(result==NULL) { break; } if((op1->data.typ==tDouble) && (op2->data.typ==tDouble)) { result->data.value.d = (op1->data.value.d) + (op2->data.value.d); result->data.typ=tDouble; } else if((op1->data.typ==tString) && (op2->data.typ==tString)) { string text1, text2; text1.data = op1->data.value.s; text2.data = op2->data.value.s; result->data.value.s = strAppendString(&text1, &text2); } else { error = ESEM; ta_Destroy(ta_table); return; } break; case I_SUB: if(result==NULL) { break; } if((op1->data.typ==tDouble) && (op2->data.typ==tDouble)) { result->data.value.d= op1->data.value.d - op2->data.value.d; result->data.typ=tDouble; } else { error = ESEM; ta_Destroy(ta_table); return; } break; case I_MUL: if(result==NULL) { break; } if((op1->data.typ==tDouble) && (op2->data.typ==tDouble)) { result->data.value.d= op1->data.value.d * op2->data.value.d; result->data.typ=tDouble; } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; case I_DIV: if(result==NULL) { break; } if((op1->data.typ==tDouble) && (op2->data.typ==tDouble)) { if(op2->data.value.d==0.0) { error = EINT; ta_Destroy(ta_table); return; } result->data.value.d= op1->data.value.d / op2->data.value.d; result->data.typ=tDouble; } else { error = ESEM; ta_Destroy(ta_table); return; } break; case I_ASSIGN: if(result==NULL) { break; } if(op1->data.typ==tBool) { result->data.value.b=op1->data.value.b; result->data.typ=tBool; } else if(op1->data.typ==tDouble) { result->data.value.d=op1->data.value.d; result->data.typ=tDouble; } else if(op1->data.typ==tString) { result->data.value.s = op1->data.value.s; result->data.typ=tString; } else if(op1->data.typ==tNil) { result->data.typ=tNil; result->data.value.b=false; } else { error = ESEM; ta_Destroy(ta_table); return; } break; case I_POW: if(result==NULL) { break; } if((op1->data.typ==tDouble) && (op2->data.typ==tDouble)) { result->data.value.d= pow(op1->data.value.d, op2->data.value.d); result->data.typ=tDouble; } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; /****************porovnani**********************/ case I_EQUAL: if(result==NULL) { break; } if(op1->data.typ==tDouble) { if(op2->data.typ!=tDouble) { result->data.value.b=false; result->data.typ=tBool; } else { if(op2->data.value.d==op1->data.value.d) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if(op1->data.typ==tBool) { if(op2->data.typ!=tBool) { result->data.value.b=false; result->data.typ=tBool; } else { if(op2->data.value.b==op1->data.value.b) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if (op1->data.typ==tString && op2->data.typ==tString) { if(strcmp(op1->data.value.s,op2->data.value.s)==0) { result->data.value.b=true; result->data.typ = tBool; } else { result->data.value.b=false; result->data.typ = tBool; } } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; case I_NEQUAL: if(result==NULL) { break; } if(op1->data.typ==tDouble) { if(op2->data.typ!=tDouble) { result->data.value.b=true; result->data.typ=tBool; } else { if(op1->data.value.d!=op2->data.value.d) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } if(op1->data.typ==tBool) { if(op2->data.typ!=tBool) { result->data.value.b=true; result->data.typ=tBool; } else { if(op1->data.value.b!=op2->data.value.b) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if (op1->data.typ==tString && op2->data.typ==tString) { if(strcmp(op1->data.value.s,op2->data.value.s)!=0) { result->data.value.b=true; result->data.typ = tBool; } else { result->data.value.b=false; result->data.typ = tBool; } } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; case I_ELESS: if(result==NULL) { break; } if(op1->data.typ==tDouble) { if(op2->data.typ!=tDouble) { result->data.value.b=false; result->data.typ=tBool; } else { if(op1->data.value.d<=op2->data.value.d) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if(op1->data.typ==tBool) { if(op2->data.typ!=tBool) { result->data.value.b=false; result->data.typ=tBool; } else { if(op2->data.value.b==op1->data.value.b) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if (op1->data.typ==tString && op2->data.typ==tString) { if(strcmp(op1->data.value.s,op2->data.value.s)<=0) { result->data.value.b=true; result->data.typ = tBool; } else { result->data.value.b=false; result->data.typ = tBool; } } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; case I_LESS: if(result==NULL) { break; } if(op1->data.typ==tDouble) { if(op2->data.typ!=tDouble) { result->data.value.b=false; result->data.typ=tBool; } else { if(op1->data.value.d<op2->data.value.d) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if (op1->data.typ==tString && op2->data.typ==tString) { if(strcmp(op1->data.value.s,op2->data.value.s)<0) { result->data.typ = tBool; result->data.value.b=true; } else { result->data.typ = tBool; result->data.value.b=false; } } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; case I_EMORE: if(result==NULL) { break; } if(op1->data.typ==tDouble) { if(op2->data.typ!=tDouble) { result->data.value.b=false; result->data.typ=tBool; } else { if(op1->data.value.d>=op2->data.value.d) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if(op1->data.typ==tBool) { if(op2->data.typ!=tBool) { result->data.value.b=false; result->data.typ=tBool; } else { if(op2->data.value.b==op1->data.value.b) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if (op1->data.typ==tString && op2->data.typ==tString) { if(strcmp(op1->data.value.s,op2->data.value.s)>=0) { result->data.value.b=true; result->data.typ = tBool; } else { result->data.value.b=false; result->data.typ = tBool; } } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; case I_MORE: if(result==NULL) { break; } if(op1->data.typ==tDouble) { if(op2->data.typ!=tDouble) { result->data.value.b=false; result->data.typ=tBool; } else { if(op1->data.value.d > op2->data.value.d) { result->data.value.b=true; result->data.typ=tBool; } else { result->data.value.b=false; result->data.typ=tBool; } } } else if (op1->data.typ==tString && op2->data.typ==tString) { if(strcmp(op1->data.value.s,op2->data.value.s)>0) { result->data.value.b=true; result->data.typ = tBool; } else { result->data.value.b=false; result->data.typ = tBool; } } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; /**********vestavene fce*************/ case I_READ: if(op1==NULL) { break; } if(op1->data.typ==tDouble) { if(result==NULL) { return; } string text; strCreate(&text); int orez=op1->data.value.d; int ch_znak = 0; while(orez>0) { ch_znak=getchar(); if(result!=NULL) { strAppendChar(&text, (char) ch_znak); } (orez)--; } result->data.value.s=text.data; result->data.typ = tString; } else if (op1->data.typ==tString) { int prepinac=-1; if(strcmp(op1->data.value.s,"*n")==0) { prepinac=1; } else if(strcmp(op1->data.value.s,"*l")==0) { prepinac=2; } else if(strcmp(op1->data.value.s,"*a")==0) { prepinac=3; } else { error = ESEM; } string text; strCreate(&text); int znak=0; int ret = 0; // pouze overeni scanf switch(prepinac) { case -1: return; break; case 1: if(result!=NULL) { ret = scanf("%lf",&(result->data.value.d)); if(ret != 1) { error = EINT; return; } result->data.typ=tDouble; } break; case 2: while(1) { { char ch_znak=0; znak=getchar(); if((znak==10) || (znak==13)) { break; } ch_znak=znak; strAppendChar(&text, ch_znak); } } if(result!=NULL) { result->data.value.s = text.data; result->data.typ=tString; } break; case 3: while(1) { { if((znak=getchar())==EOF) { break; } char ch_znak=0; ch_znak=znak; strAppendChar(&text, ch_znak); } } if(result!=NULL) { result->data.value.s=text.data; result->data.typ=tString; } } } else { error = ESEM; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; case I_WRITE: if(op1==NULL) { break; } if(op1->data.typ==tDouble) { printf("%g", op1->data.value.d); } else if(op1->data.typ==tString) { char *retezec=op1->data.value.s; if(retezec==NULL) { break; } for(int i=0; retezec[i]!='\0' ; i++) { if( retezec[i]=='\\' ) { if( retezec[i+1]=='n' ) { printf("\n"); i++; } else if( retezec[i+1]=='t' ) { printf("\t"); i++; } else if( retezec[i+1]=='\\' ) { printf("\\"); i++; } else if( retezec[i+1]=='\"' ) { printf("\""); i++; } else if( isdigit(retezec[i+1]) && isdigit(retezec[i+2]) && isdigit(retezec[i+3]) ) { int ascii= atoi(&retezec[i+1]); putchar(ascii); i=i+3; } } else { putchar(retezec[i]); } } } else { error = EINT; ta_Destroy(ta_table); destroy_labels(jump_array); return; } break; case I_SORT: if(op1==NULL) { break; } pom=prep_quickSort(op1); if(result!=NULL) { if(pom->data.typ==tString) { result->data.value.s=pom->data.value.s; result->data.typ=tString; } else if(pom->data.typ==tNil) { result->data.typ=tNil; } } break; case I_SUBS: pom=built_substr(op1, op2, result); position++; ta_Get(ta_table, &operation, &op1, &op2, &result, position); if(result!=NULL) { if(pom->data.typ==tString) { result->data.value.s=pom->data.value.s; result->data.typ=tString; } else if(pom->data.typ==tNil) { result->data.typ=tNil; } } break; case I_FIND: pom=find(op1,op2); if(pom->data.typ==tString) { result->data.value.s=pom->data.value.s; result->data.typ=tString; } else if(pom->data.typ==tNil) { result->data.typ=tNil; } else if(pom->data.typ==tBool) { result->data.value.b=pom->data.value.b; result->data.typ=tBool; } else if(pom->data.typ==tDouble) { result->data.value.d=pom->data.value.d; result->data.typ=tDouble; } break; case I_TYPE: pom=built_type(op1); if(result!=NULL) { result->data.value.s=pom->data.value.s; result->data.typ=tString; } break; /********************* jumpy a labely ****************************/ case I_LABEL: break; case I_TJUMP: if((op1->data.typ==tBool) && (op1->data.value.b==true)) { position=jump_array[(*ta_table)[position].jump]; } else if((op1->data.typ==tDouble) && (op1->data.value.d!=0)) { position=jump_array[(*ta_table)[position].jump]; } break; case I_FJUMP: if((op1->data.typ==tBool) && (op1->data.value.b==false)) { position=jump_array[(*ta_table)[position].jump]; } else if((op1->data.typ==tDouble) && (op1->data.value.d==0)) { position=jump_array[(*ta_table)[position].jump]; } break; case I_JUMP: position=jump_array[(*ta_table)[position].jump]; break; case I_FCEJUMP: pole_back[index_pb]=(position); index_pb++; if((index_pb%9)==0) /*naalokovat jinak*/ { pole_back=advRealloc( pole_back, index_pb*sizeof(int)+ALL_MORE); } position=jump_array[(*ta_table)[position].jump]; break; case I_GOTO: index_pb--; if(index_pb<0) { return; } else { position=pole_back[index_pb]; } break; } } destroy_labels(jump_array); }