int optimize_tokens (token *tokens, int t) { int i, z, k; token tokens_tmp[500]; /*Drop all lines before last '* 0'*/ for (i = 0, z = -1; i < t; ++i) { if (tokens[i].operation == t_mul && tokens[i].type == literal && tokens[i].data.value == 0) { z = i; break; } } /*Drop '+ 0', '- 0', '* 1', '/ 1' tokens*/ for (i = z + 1, k = 0; i < t; ++i) { //and start after the last '* 0' if (!(tokens[i].type == literal && ( (tokens[i].data.value == 0 && (tokens[i].operation == t_plus || tokens[i].operation == t_min)) || (tokens[i].data.value == 1 && (tokens[i].operation == t_mul || tokens[i].operation == t_div)) ) )) { tokens_tmp[k++] = tokens[i]; } } t = k; // update tokens counter /*update tokens array*/ for (i = 0; i < t; ++i) { tokens[i] = tokens_tmp[i]; } /*Convert divs and muls with powers of two to shifts*/ for (i = 0; i < t; ++i) { if (tokens[i].type == literal && tokens[i].operation == t_mul && is_power_of_2(tokens[i].data.value)) { tokens[i].operation = t_shl; tokens[i].data.value = shift_times(tokens[i].data.value); } else if (tokens[i].type == literal && tokens[i].operation == t_div && is_power_of_2(tokens[i].data.value)) { tokens[i].operation = t_shr; tokens[i].data.value = shift_times(tokens[i].data.value); } } return t; }
void ShiftTimesDialog::buttonClicked(QAbstractButton* button) { int amount; if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole){ amount = ui.timeEdit->time().hour() * 3600 + ui.timeEdit->time().minute() * 60; if (ui.backwards->isChecked()) amount *= -1; if (amount != 0) { // DANGER, DANGER - this could get our dive_table unsorted... shift_times(amount); sort_table(&dive_table); mark_divelist_changed(TRUE); mainWindow()->dive_list()->rememberSelection(); mainWindow()->refreshDisplay(); mainWindow()->dive_list()->restoreSelection(); } } }