static gboolean check_edit_amount (GtkWidget *dialog, GtkWidget *amount, gnc_numeric *min, gnc_numeric *max, const char * error_message) { if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (amount))) { if (error_message) gnc_error_dialog (dialog, "%s", error_message); return TRUE; } /* We've got a valid-looking number; check mix/max */ if (min || max) { gnc_numeric val = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount)); if ((min && gnc_numeric_compare (*min, val) > 0) || (max && gnc_numeric_compare (val, *max) > 0)) { if (error_message) gnc_error_dialog (dialog, "%s", error_message); return TRUE; } } return FALSE; }
/* Determine whether the value can be calculated. If it can, return * NULL. Otherwise, return a string describing the reason and the offending * entry in error_item. */ static const char * can_calc_value(FinCalcDialog *fcd, FinCalcValue value, int *error_item) { const char *missing = _("This program can only calculate one value at a time. " "You must enter values for all but one quantity."); const char *bad_exp = _("GnuCash cannot determine the value in one of the fields. " "You must enter a valid expression."); const char *string; gnc_numeric nvalue; unsigned int i; if (fcd == NULL) return NULL; /* Check for missing values */ for (i = 0; i < NUM_FIN_CALC_VALUES; i++) if (i != value) { string = gtk_entry_get_text(GTK_ENTRY(fcd->amounts[i])); if ((string == NULL) || (*string == '\0')) { *error_item = i; return missing; } if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (fcd->amounts[i]))) { *error_item = i; return bad_exp; } } /* Check for zero interest */ switch (value) { case PAYMENT_PERIODS: case PRESENT_VALUE: case PERIODIC_PAYMENT: case FUTURE_VALUE: nvalue = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (fcd->amounts[INTEREST_RATE])); if (gnc_numeric_zero_p (nvalue)) { *error_item = INTEREST_RATE; return _("The interest rate cannot be zero."); } break; default: break; } /* Check for zero payment periods */ switch (value) { case INTEREST_RATE: case PRESENT_VALUE: case PERIODIC_PAYMENT: case FUTURE_VALUE: nvalue = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT(fcd->amounts[PAYMENT_PERIODS])); if (gnc_numeric_zero_p (nvalue)) { *error_item = PAYMENT_PERIODS; return _("The number of payments cannot be zero."); } if (gnc_numeric_negative_p (nvalue)) { *error_item = PAYMENT_PERIODS; return _("The number of payments cannot be negative."); } break; default: break; } return NULL; }