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