int getBookMove(Position *pos) { tableEntry *t; int i; i = HASHKEY(pos->hash); t = &transpositionTable[i]; if (t->hash == pos->hash && t->bookMove) { //the opening book doesn't contain information like en-passant //and castling rights, so we must provide it int move; int p, sq0, sq1, cap, prom; int sd; sd = 6 * (pos->ply % 2); move = t->bookMove; sq0 = FROM(move); sq1 = TO(move); p = pos->squares[sq0]; cap = pos->squares[sq1]; if ((p == WP || p == BP) && cap == EMPTY && sq1%8 != sq0%8) { //en passant cap = BP - sd; } prom = PROM(move); return MOV(sq0, sq1, cap, prom, pos->castle, pos->enpas); } return 0; }
tChyba ROZHODNI() { int analyza2; int analyza; int analyza1; TItem *pt; //ROZHODNI->DTYPE if((analyza = DTYPE()) == S_BEZ_CHYB) { token = getNextToken(); if(token.stav == s_lex_error) { return S_LEXIKALNI_CHYBA; } return S_BEZ_CHYB; } //ROZHODNI->PROM VESTAV EXPR else { //volani funkce na vestavene funkce analyza2 = VESTAV(); if(analyza2 != S_BEZ_CHYB && analyza2 != S_EPS) { return analyza2; } //pokud je epsilon pokracujeme dal if(analyza2 == S_BEZ_CHYB) { return S_BEZ_CHYB; } if((porovnani = malloc(strlen(token.data)+1)) == NULL) { return S_INTERNI_CHYBA; } //ulozeni hodnoty token.data do globalni promenne porovnani strcpy(porovnani, token.data); pt = htSearch(ptrhtGlobal, token.data); //kontrola jestli id je v tabulce globalni if(pt != NULL && pt->druh == ID_FUNCTION) { //pokud ano a je to funkce vola se prom analyza1 = PROM(); if(analyza1 != S_BEZ_CHYB) { return analyza1; } free(porovnani); return S_BEZ_CHYB; } else {//jinak se vola precedencni analyza2 = precedencniSA(); if(analyza2 != S_BEZ_CHYB) { return analyza2; } //instrukce pro prirazeni, tmp1 je vysledek precedencni, tmp3 cilove id generateInstruction( OC_PRIRAZENI, searchFrames(neterminal.polozkaTS.key, ptrhtLocal, ptrhtGlobal), NULL, searchFrames(id, ptrhtLocal, ptrhtGlobal) ); return S_BEZ_CHYB; } } }