int main(int argc, char **argv, char **env) { financial_info fininfo; amort_sched amortsched; set_default(&fininfo); fininfo.prec = 2; fininfo.npp = 360; fininfo.ir = 8.25; fininfo.pv = 345725.0; (void)fi_calc_payment(&fininfo); printf("With npp == %u\n ir == %.*f\n pv == %.*f\n", fininfo.npp, fininfo.prec, fininfo.ir, fininfo.prec, fininfo.pv); printf("------------>Compute pmt: -2597.32\n"); prt_status(&fininfo, stdout); fi_calc_interest(&fininfo); printf("\n------------>Compute ir\n"); prt_status(&fininfo, stdout); fi_calc_num_payments(&fininfo); printf("\n------------>Compute npp\n"); prt_status(&fininfo, stdout); fi_calc_future_value(&fininfo); printf("\n------------>Compute fv\n"); prt_status(&fininfo, stdout); set_default(&fininfo); fininfo.npp = 360; fininfo.ir = 8.25; fininfo.pv = 345725.0; fi_calc_payment(&fininfo); printf("\n\n Reset financial variables and compute amortization schedules.\n"); printf("First Schedule - ignore delay in first payment and\noutput annual summary\n"); amortsched.n = fininfo.npp; amortsched.nint = fininfo.ir; amortsched.pv = fininfo.pv; amortsched.pmt = fininfo.pmt; amortsched.fv = fininfo.fv; amortsched.CF = fininfo.CF; amortsched.PF = fininfo.PF; amortsched.disc = fininfo.disc; amortsched.bep = fininfo.bep; amortsched.prec = fininfo.prec; amortsched.year_E = 1999; amortsched.month_E = 6; amortsched.day_E = 15; amortsched.year_I = 1999; amortsched.month_I = 8; amortsched.day_I = 1; amortsched.fixed_pmt = -400; (void)Amortization_init(&amortsched); amortsched.option = 3; amortsched.summary = 'y'; (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); printf("\n\nSecond Schedule - ignore delay in first payment and\noutput schedule for each payment\n"); amortsched.summary = 'p'; (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); printf("\n\nThird Schedule - ignore delay in first payment and\noutput variable advanced prepayment schedule\n"); amortsched.summary = 'a'; (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); printf("\n\nFourth Schedule - ignore delay in first payment and\noutput fixed prepayment schedule\n"); amortsched.summary = 'f'; (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); printf("\n\nFifth Schedule - use new payments due to delay and\noutput annual summary\n"); amortsched.option = 5; amortsched.summary = 'y'; (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); printf("\n\nSixth Schedule - use new payments due to delay and\noutput periodic payment schedule\n"); amortsched.option = 5; amortsched.summary = 'p'; (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); printf("\n\nSeventh Schedule - use new payments due to delay and\noutput variable prepayment schedule\n"); amortsched.option = 5; amortsched.summary = 'a'; (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); printf("\n\nEighth Schedule - use new payments due to delay and\noutput fixed prepayment schedule\n"); amortsched.option = 5; amortsched.summary = 'f'; (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); Amortization_free(&amortsched); } /* main */
int main(int argc, char **argv, char **env) { char buffer[200], *errp; size_t sbuf; size_t retcnt; var_store value; var_store_ptr value_list; numeric_ptr nval; unsigned compute, jj, yrE, monthE, dayE, yrI, monthI, dayI; struct tm *times_E, *times_I; void *parse_env; amort_sched amortsched; financial_info fininfo; /* check dynamic storage allocation */ /* mtrace(); */ set_default(&fininfo); set_fin_vars(); parse_env = init_parser(predefined_fin_vars, '.', ',', trans_numeric, numeric_ops, negate_numeric, free_numeric); npp = fininfo.npp; ir = fininfo.ir; pv = fininfo.pv; pmt = fininfo.pmt; fv = fininfo.fv; CF = fininfo.CF; PF = fininfo.PF; disc = fininfo.disc; bep = fininfo.bep; fininfo.prec = prec; printf("Single Letter Commands:\na -- amortization schedule\nc -- compute financial variable\nd -- delete variable\ns -- output financial variable status\nq -- quit\nv -- list defined variables\n"); for (;;) { printf("<>"); retcnt = strlen(fgets(buffer, 190, stdin)); if ( (retcnt == 2) && (strchr(sl_commands, buffer[0]) != NULL) ) { if ( buffer[0] == 'q' ) break; amortsched.prec = fininfo.prec; switch ( buffer[0] ) { case 'a': if ( amortsched.Eff_Date_jdn && amortsched.Init_Date_jdn ) { printf("Current Effective year: %u\nCurrent Effective month: %u\nCurrent Effective day: %u\nCurrent Initial year: %u\nCurrent Initial month: %u\nCurrent Initial day %u\n", amortsched.year_E, amortsched.month_E, amortsched.day_E, amortsched.year_I, amortsched.month_I, amortsched.day_I); printf("Change dates ? (y/n) "); fgets(buffer, 190, stdin); } else { buffer[0] = 'y'; } /* endif */ if ( buffer[0] == 'y' ) { printf("Enter Effective Date - year: "); fgets(buffer, 190, stdin); if ( (errp = parse_string(&value, buffer, parse_env)) == NULL ) { nval = (numeric_ptr)(value.value); switch ( nval->type ) { case INT_TYPE: amortsched.year_E = nval->value.int_value; break; case DBL_TYPE: amortsched.year_E = (unsigned)(nval->value.dbl_value); break; } /* endswitch */ if ( !value.variable_name ) free_numeric(value.value); } else { parse_error(get_parse_error(parse_env), buffer, errp); } /* endif */ printf("Enter Effective Date - month: "); fgets(buffer, 190, stdin); if ( (errp = parse_string(&value, buffer, parse_env)) == NULL ) { nval = (numeric_ptr)(value.value); switch ( nval->type ) { case INT_TYPE: amortsched.month_E = nval->value.int_value; break; case DBL_TYPE: amortsched.month_E = (unsigned)(nval->value.dbl_value); break; } /* endswitch */ if ( !value.variable_name ) free_numeric(value.value); } else { parse_error(get_parse_error(parse_env), buffer, errp); } /* endif */ printf("Enter Effective Date - day: "); fgets(buffer, 190, stdin); if ( (errp = parse_string(&value, buffer, parse_env)) == NULL ) { nval = (numeric_ptr)(value.value); switch ( nval->type ) { case INT_TYPE: amortsched.day_E = nval->value.int_value; break; case DBL_TYPE: amortsched.day_E = (unsigned)(nval->value.dbl_value); break; } /* endswitch */ if ( !value.variable_name ) free_numeric(value.value); } else { parse_error(get_parse_error(parse_env), buffer, errp); } /* endif */ printf("Enter Initial Payment Date - year: "); fgets(buffer, 190, stdin); if ( (errp = parse_string(&value, buffer, parse_env)) == NULL ) { nval = (numeric_ptr)(value.value); switch ( nval->type ) { case INT_TYPE: amortsched.year_I = nval->value.int_value; break; case DBL_TYPE: amortsched.year_I = (unsigned)(nval->value.dbl_value); break; } /* endswitch */ if ( !value.variable_name ) free_numeric(value.value); } else { parse_error(get_parse_error(parse_env), buffer, errp); } /* endif */ printf("Enter Initial Payment Date - month: "); fgets(buffer, 190, stdin); if ( (errp = parse_string(&value, buffer, parse_env)) == NULL ) { nval = (numeric_ptr)(value.value); switch ( nval->type ) { case INT_TYPE: amortsched.month_I = nval->value.int_value; break; case DBL_TYPE: amortsched.month_I = (unsigned)(nval->value.dbl_value); break; } /* endswitch */ if ( !value.variable_name ) free_numeric(value.value); } else { parse_error(get_parse_error(parse_env), buffer, errp); } /* endif */ printf("Enter Initial Payment Date - day: "); fgets(buffer, 190, stdin); if ( (errp = parse_string(&value, buffer, parse_env)) == NULL ) { nval = (numeric_ptr)(value.value); switch ( nval->type ) { case INT_TYPE: amortsched.day_I = nval->value.int_value; break; case DBL_TYPE: amortsched.day_I = (unsigned)(nval->value.dbl_value); break; } /* endswitch */ if ( !value.variable_name ) free_numeric(value.value); } else { parse_error(get_parse_error(parse_env), buffer, errp); } /* endif */ } /* endif */ amortsched.n = npp; amortsched.nint = ir; amortsched.pv = pv; amortsched.pmt = pmt; amortsched.fv = fv; amortsched.CF = CF; amortsched.PF = PF; amortsched.disc = disc; amortsched.bep = bep; Amortization_init(&amortsched); amort_opt(&amortsched, parse_env); (void)Amortization_Schedule(&amortsched); prt_amortization_schedule(&amortsched, stdout); Amortization_free(&amortsched); break; case 'c': printf("Compute:\nn - 1\ni - 2\npv - 3\npmt - 4\nfv - 5\n1, 2, 3, 4 or 5: "); retcnt = strlen(fgets(buffer, 190, stdin)); compute = buffer[0] - '0'; switch ( compute-- ) { case 0: /* all values specified nothing to compute */ break; case 1: /* compute number of periods, npp */ printf("Computing numbor of periods\n"); npp = fi_calc_num_payments(&fininfo); printf("Number of Periods: %u\n", npp); nval = (numeric_ptr)(predefined_fin_vars[compute].value); nval->value.int_value = npp; break; case 2: /* compute interest, ir */ printf("Computing interest rate\n"); ir = fi_calc_interest(&fininfo); printf("Nominal Interest Rate: %.*f\n", prec, ir); nval = (numeric_ptr)(predefined_fin_vars[compute].value); nval->value.dbl_value = ir; break; case 3: /* compute present value, pv */ printf("Computing Present Value\n"); pv = fi_calc_present_value(&fininfo); printf("Present Value: %.*f\n", prec, pv); nval = (numeric_ptr)(predefined_fin_vars[compute].value); nval->value.dbl_value = pv; break; case 4: /* compute periodic payment, pmt */ printf("Computing periodic payment\n"); pmt = fi_calc_payment(&fininfo); printf("Periodic Payment: %.*f\n", prec, pmt); nval = (numeric_ptr)(predefined_fin_vars[compute].value); nval->value.dbl_value = pmt; break; case 5: /* compute future value, fv */ printf("Computing Future Value\n"); fv = fi_calc_future_value(&fininfo); printf("Future Value: %.*f\n", prec, fv); nval = (numeric_ptr)(predefined_fin_vars[compute].value); nval->value.dbl_value = fv; break; default: /* whoops */ break; } /* endswitch */ break; case 'd': printf("Enter name of variable to delete: "); retcnt = strlen(fgets(buffer, 190, stdin)); buffer[retcnt - 1] = EOS; if ( !delete_var(buffer, parse_env) ) { printf("Unable to delete specified variable\n"); } /* endif */ break; case 's': prt_status(&fininfo, stdout); break; case 'v': for ( value_list = parser_get_vars(parse_env) ; value_list ; value_list = value_list->next_var ) { printf("%s: ", value_list->variable_name); nval = (numeric_ptr)(value_list->value); switch ( nval->type ) { case INT_TYPE: printf("%i\n", nval->value.int_value); break; case DBL_TYPE: printf("%.*f\n", prec, nval->value.dbl_value); break; } /* endswitch */ } /* endfor */ break; } /* endswitch */ } else if ( retcnt > 1 ) { buffer[retcnt - 1] = EOS; if ( (errp = parse_string(&value, buffer, parse_env)) == NULL ) { if ( value.variable_name ) printf("Variable: %s\n", value.variable_name); nval = (numeric_ptr)(value.value); switch ( nval->type ) { case INT_TYPE: printf("Evaluated Value: %i\n", nval->value.int_value); break; case DBL_TYPE: printf("Evaluated Value: %.*f\n", prec, nval->value.dbl_value); break; } /* endswitch */ if ( !value.variable_name ) free_numeric(value.value); chk_vars(predefined_fin_vars, fin_vars, fin_type, PREDEFINED_FIN_VARS); fininfo.npp = npp; fininfo.ir = ir; fininfo.pv = pv; fininfo.pmt = pmt; fininfo.fv = fv; fininfo.CF = CF; fininfo.PF = PF; fininfo.disc = disc; fininfo.bep = bep; } else { parse_error(get_parse_error(parse_env), buffer, errp); } /* endif */ } /* endif */ } /* endfor */ exit_parser(parse_env); unset_fin_vars(); } /* main */