1 /*************************************************************************** 2 * ------------------- 3 * create : Sat Jun 17 20:14:13 2000 4 * copyright: (C) 2000 by Terry D. Boldt 5 * email : tboldt@attglobal.net 6 * ------------------- 7 ***************************************************************************/ 8 /*************************************************************************** 9 * * 10 * This program is free software; you can redistribute it and/or modify * 11 * it under the terms of the GNU General Public License as published by * 12 * the Free Software Foundation; either version 2 of the License, or * 13 * (at your option) any later version. * 14 * * 15 ***************************************************************************/ 16 /*************************************************************************** 17 * Global Financial Variables 18 * Sat Jun 17 20:14:13 2000 19 * 20 ***************************************************************************/ 21 22 #ifndef FINVAR_H 23 #define FINVAR_H 24 25 #if !defined( EOS ) 26 #define EOS '\x000' 27 #endif 28 29 #if !defined( TRUE ) 30 #define TRUE (1) 31 #endif 32 33 #if !defined( FALSE ) 34 #define FALSE (0) 35 #endif 36 37 #define INT_TYPE '\x001' 38 #define DBL_TYPE '\x002' 39 40 typedef enum 41 { 42 PARSER_NO_ERROR = 0, 43 UNBALANCED_PARENS, 44 STACK_OVERFLOW, 45 STACK_UNDERFLOW, 46 UNDEFINED_CHARACTER, 47 NOT_A_VARIABLE, 48 NOT_A_FUNC, 49 PARSER_OUT_OF_MEMORY, 50 NUMERIC_ERROR, 51 EXPRESSION_ERROR, 52 PARSER_NUM_ERRORS 53 } 54 ParseError; 55 56 #define UNUSED_VAR '\x000' 57 #define USED_VAR '\x001' 58 #define ASSIGNED_TO '\x002' 59 60 #define ADD_OP '+' 61 #define SUB_OP '-' 62 #define DIV_OP '/' 63 #define MUL_OP '*' 64 #define ASN_OP '=' 65 66 /* The following structure is used by the expression parser to store 67 * named and temporary variables. */ 68 69 /* structure used for storing variables - used by expression parser/evaluator 70 */ 71 typedef struct var_store *var_store_ptr; 72 73 /* the type of entity contained in the var_store */ 74 typedef enum 75 { 76 VST_NUMERIC = 0, 77 VST_STRING 78 } VarStoreType; 79 80 typedef struct var_store 81 { 82 char *variable_name; /* variable name if variable, NULL otherwise */ 83 char use_flag; /* flag if variable has been assigned to */ 84 char assign_flag; /* flag if variable is used */ 85 VarStoreType type; 86 void *value; /* pointer to implementation defined numeric value */ 87 var_store_ptr next_var; /* pointer to next variable in linked list */ 88 } 89 var_store; 90 91 92 /* The following structure is used for the numeric operations 93 * involving double float and integer arithmetic */ 94 95 /* structure used for storing numeric values - used by routines which 96 * evaluate arithmetic operators '+', '-', '/', '*' */ 97 typedef struct numeric *numeric_ptr; 98 typedef struct numeric 99 { 100 char type; /* designates type of value */ 101 union 102 { 103 long int int_value; /* long integer value */ 104 double dbl_value; /* double value */ 105 } 106 value; 107 } 108 numeric; 109 110 /* The following structures are used by the amortization functions for 111 * storing amortization schedule information */ 112 113 /* structure used by amortization routines for storing annual summary 114 information */ 115 typedef struct yearly_summary *yearly_summary_ptr; 116 typedef struct yearly_summary 117 { 118 unsigned year; 119 double interest; 120 double end_balance; 121 } 122 yearly_summary; 123 124 /* structure used by amortization routines for storing information on 125 a single payment */ 126 typedef struct sched_pmt *sched_pmt_ptr; 127 typedef struct sched_pmt 128 { 129 unsigned period_num; 130 double interest; 131 double principal; 132 double advanced_pmt; 133 double total_pmt; 134 double balance; 135 } 136 sched_pmt; 137 138 /* structure used by amortization routines for storing information on 139 * payments for a single year */ 140 typedef struct amort_sched_yr *amort_sched_yr_ptr; 141 typedef struct amort_sched_yr 142 { 143 unsigned year; 144 unsigned num_periods; 145 sched_pmt_ptr payments; 146 double interest_pd; 147 double principal_pd; 148 double yr_end_balance; 149 double total_interest_pd; 150 double final_pmt; 151 amort_sched_yr_ptr next_yr; 152 } 153 amort_sched_yr; 154 155 /* structure used by amortization routines for passing and storing 156 * information on a particular amortization transaction */ 157 typedef struct amort_sched *amort_sched_ptr; 158 typedef struct amort_sched 159 { 160 /* following information set by function calling amortization 161 functions */ 162 unsigned n; /* number of periods */ 163 double nint; /* nominal interest rate */ 164 double pv; /* present value */ 165 double pmt; /* periodic payment */ 166 double fv; /* future value */ 167 unsigned CF; /* compounding frequency */ 168 unsigned PF; /* payment frequency */ 169 unsigned disc; /* discrete/continuous compounding flag */ 170 unsigned bep; /* beginning/end of period payment flag */ 171 unsigned prec; /* roundoff precision */ 172 unsigned year_E; /* Effective date - year */ 173 unsigned month_E; /* Effective date - month */ 174 unsigned day_E; /* Effective date - day of month */ 175 unsigned year_I; /* Initial payment date - year */ 176 unsigned month_I; /* Initial payment date - month */ 177 unsigned day_I; /* Initial payment date - day of month */ 178 179 /* following information set by calling function to indicate which 180 * schedule to compute and which type of schedule */ 181 unsigned option; /* option flag from 1 to 6 inclusive */ 182 char summary; /* summary flag == 'y', 'p', 'a' or 'f' */ 183 184 /* following information set by amortization functions */ 185 double eint; /* effective interest rate */ 186 double bp; /* float value of bep */ 187 double total_interest; /* total interest paid */ 188 unsigned total_periods; /* total numer of periods in schedule */ 189 unsigned long yr_pmt; /* number of payments in first year */ 190 double final_pmt_opt_1; /* final payment option 1 */ 191 double final_pmt_opt_2; /* final payment option 2 */ 192 double final_pmt_opt_3; /* final payment option 3 */ 193 double final_pmt_opt_4; /* final payment option 4 */ 194 double final_pmt_opt_5; /* final payment option 5 */ 195 double final_pmt_opt_6; /* final payment option 6 */ 196 double final_pmt; /* final payment */ 197 double pve; /* pv adjusted for delayed initial payment */ 198 double new_pmt; /* pmt adjusted for delayed initial payment */ 199 double cpmt; /* constant payment to principal */ 200 double cpmt1; /* constant payment to principal, 1st case */ 201 double cpmt2; /* constant payment to principal, 2cd case */ 202 double delayed_int; /* interest due to delayed initial payment */ 203 double fixed_pmt; /* fixed prepayment amount for amortization */ 204 unsigned new_n; /* new number of periods to amortize due to 205 delayed initial payment */ 206 unsigned fv_case; /* fv case flag */ 207 unsigned long Eff_Date_jdn; 208 unsigned yday_E; 209 unsigned long Init_Date_jdn; 210 unsigned yday_I; 211 union 212 { 213 amort_sched_yr_ptr first_yr; 214 yearly_summary_ptr summary; 215 } 216 schedule; 217 } 218 amort_sched; 219 220 /* The following structure is used to hold all of the financial 221 * variables used by the financial calculator */ 222 223 /* structure used by financial computation routines to store financial 224 variables */ 225 typedef struct financial_info *fi_ptr; 226 typedef struct financial_info 227 { 228 double ir; /* interest rate */ 229 double pv; /* present value */ 230 double pmt; /* periodic payment */ 231 double fv; /* future value */ 232 233 unsigned npp; /* number of payment periods */ 234 unsigned CF; /* Compounding frequency */ 235 unsigned PF; /* payment frequency */ 236 unsigned bep; /* beginning/end of period payment flag */ 237 /* TRUE == beginning of period */ 238 /* FALSE == end of period */ 239 unsigned disc; /* discrete/continuous compounding flag */ 240 /* TRUE == discrete compounding */ 241 /* FALSE == continuous compounding */ 242 243 /* precision of roundoff for pv, pmt and fv. 244 * i, Interest not rounded 245 * n, number of periods rounded to integer value, implicit value of zero, 0 246 * 247 * 2 for US Dollars 248 */ 249 unsigned prec; 250 } 251 financial_info; 252 253 typedef struct parser_env *parser_env_ptr; 254 255 #endif 256