home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
350.lha
/
IRA
/
ira.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-04
|
11KB
|
571 lines
/*
* IRA : IRA Calculator
*
* Version 2
*
* by Joel Swank 9-26-89
*
*/
/********* INCLUDES ************************ */
#include <exec/types.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <stdio.h>
#include <ctype.h>
#include "fio.h"
#include "limits.h"
/* Data in helpwin.h */
extern struct IntuiText prfailtxt ;
extern struct IntuiText badfiletxt ;
extern struct IntuiText fiofailtxt ;
extern struct IntuiText winfailtxt ;
extern struct IntuiText messagetxt ;
extern struct IntuiText infailtxt ;
extern struct IntuiText infailtxt2 ;
extern struct IntuiText oktxt ;
extern struct IntuiText cantxt ;
extern struct IntuiText retrytxt ;
extern struct NewWindow NewWindowStructureHelp;
extern struct NewWindow NewWindowStructure3;
extern char message_buff[];
/* Data in doargs.c */
extern char filename[];
/* Defines for setting/clearing GADGDISABLED flag */
#define OffGad(gad) (gad).Flags = gad.Flags | GADGDISABLED
#define OnGad(gad) (gad).Flags = gad.Flags & ~(GADGDISABLED)
#define OffMenu(item) (item).Flags = item.Flags & ~(CHECKED)
#define OnMenu(item) (item).Flags = item.Flags | CHECKED
extern struct IntuitionBase *IntuitionBase ;
extern struct GfxBase *GfxBase ;
extern struct DosLibrary *DosBase ;
struct ViewPort vP;
struct Window *wG = NULL;
struct Window *wF = NULL;
struct RastPort *rpG;
struct IntuiMessage *message; /* the message from the IDCMP */
struct Window *OpenWindow();
void *OpenLibrary();
struct IntuiMessage *GetMsg();
struct MenuItem *ItemAddress();
struct FileIOSupport *FIOSupp = NULL; /* fileio support stuff */
struct FileIOSupport *GetFileIOSupport();
struct FileLock *Lock();
char save_title[] = "Select File to SAVE";
char load_title[] = "Select File to LOAD";
/* get the PowerWindows 2.0 code */
#include "ira.h"
/* internal data areas */
char balancemsg[] = "Invalid Balance";
char interestmsg[] = "Invalid Interest";
char depositmsg[] = "Invalid Deposit";
char yearsmsg[] = "Invalid Years";
char header[] = "IRA Calculator";
/* The input data */
double apr = 0.0; /* Anual percentage rate (-a) */
double bb = 0.0; /* Beginning balance (-b) */
double ad = 0.0; /* Annual Deposit (-d) */
long yrs = 0; /* Years till retirement (-y) */
/* The Answer */
double ne = 0.0; /* final total */
char *name;
int batch = 0; /* flag for a batch (CLI) execution */
double atof();
long atol();
main(argc,argv)
int argc;
char *argv[];
{
UWORD code;
ULONG class;
APTR object;
FILE *fp;
/* Open the libraries */
IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", 0L);
if (IntuitionBase == NULL)
{
done(11);
}
GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L);
if (GfxBase == NULL)
{
done(10);
}
DosBase = (struct DosLibrary *)OpenLibrary("dos.library", 0);
if (DosBase == NULL)
{
done(16);
}
/* Get the arguments */
filename[0] = '\0';
if (argc == 0) getWBargs();
else getCLIargs(argc,argv);
if (batch)
{
calc_it();
done(0);
}
wG = OpenWindow(&NewWindowStructure1); /* open main window */
if ( wG == NULL )
{
done(12);
}
rpG = wG->RPort; /* get a rastport pointer for the window */
PrintIText(rpG,&IntuiTextList1,0L,0L); /* write window text */
SetMenuStrip(wG,&MenuList1); /* attach my Menu */
if (filename[0] != '\0')
{
while ((fp = fopen(filename,"r")) == NULL)
{
infailtxt2.IText = (UBYTE *) filename;
if (AutoRequest(wG,&infailtxt,&retrytxt,&cantxt,
0L,0L,reqlen(filename),75L)) continue;
}
if (fp != NULL) {
read_file(fp);
fclose(fp);
}
}
/* Wait for some User interaction */
while(1)
{
WaitPort(wG->UserPort);
while( (message = (struct IntuiMessage *)
GetMsg(wG->UserPort) ) != NULL)
{
code = message->Code; /* MENUNUM */
object = message->IAddress; /* Gadget */
class = message->Class; /* IDCMP Flags */
ReplyMsg(message); /* Free the sender */
switch (class)
{
case CLOSEWINDOW :
done(0); /* close gadget clicked */
case GADGETUP:
if (object == (APTR) &CalcGad)
{
calc_it();
break;
}
/* add more gadget checks here */
break;
case MENUPICK: /* menu selection made */
/* I get a NULL message whenever the user brings
up the menu but doesn't select anything */
if (code != MENUNULL) do_pick((USHORT)code);
break;
}
}
}
}
/*
* Cleanup and exit
*/
done(how)
int how;
{
if (FIOSupp) ReleaseFileIO(FIOSupp);
if (wG) ClearMenuStrip(wG);
if (wG) CloseWindow(wG);
if (DosBase) CloseLibrary(DosBase);
if (GfxBase != NULL) CloseLibrary(GfxBase);
if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
exit(how);
/* exit codes
* 0 User requested
* 10 graphics lib open fail
* 11 intuition lib open fail
* 12 main window open fail
* 13 _abort() called
* 14 Bad CLI args
* 16 Dos lib open fail
*/
}
/*
* do_pick : handle chain of menu selections
*/
do_pick(menunum)
USHORT menunum;
{
struct MenuItem *item, *ItemAddress();
while (menunum != MENUNULL)
{
switch(MENUNUM(menunum))
{
case 0: /* Project Menu */
switch(ITEMNUM(menunum))
{
case 0: /* Load */
do_load();
break;
case 1: /* Save */
do_save();
break;
case 2: /* Print */
do_print();
break;
case 4: /* About */
about();
break;
case 3: /* Help */
help();
break;
case 5: /* Quit */
done(0);
}
break;
default: /* What's this garbage ? */
menunum = MENUNULL;
} /* end switch MENUNUM */
/* Get chain to next selection. NextSelect contains another item
when the user makes multiple menu selections */
item = ItemAddress(&MenuList1,(long) menunum);
menunum = item->NextSelect;
}
}
/*
* Validate input and calculate new balance
*/
calc_it()
/*
* Adapted from:
*
* ira.c : Calculate Nest-Egg at retirement from the
* following input:
*
* Beginning Balance
* Anual percentage rate
* Annual deposit
* Years till retirement
*
* By Joel Swank 8/18/89
*/
{
long i;
double xapr;
if (!batch) if (!get_values()) return;
xapr = 1.0 + apr/100.0;
ne = bb;
for (i=0; i<yrs; i++)
{
ne += ad;
ne *= xapr;
}
if (batch) {
printf("For Beginning balance = $%-12.2f\n",bb);
printf("Annual percentage Rate = %2.2f%%\n",apr);
printf("Annual deposit = $%-12.2f\n",ad);
printf("Nest-Egg after %ld years is $%-12.2f\n",yrs,ne);
} else {
bb = ne;
put_values();
}
}
/*
* Get input data from string requesters
*/
get_values()
{
int i;
i = get_float(BalanceGadSIBuff,&bb) ;
if ( !i || bb < MINBB)
{
messagetxt.IText = (UBYTE *) balancemsg;
AutoRequest(wG,&messagetxt,0L,&oktxt,0L,0L,300L,75L);
return FALSE;
}
i = get_float(InterestGadSIBuff,&apr);
if ( !i || apr < MINAPR || apr > MAXAPR)
{
messagetxt.IText = (UBYTE *) interestmsg;
AutoRequest(wG,&messagetxt,0L,&oktxt,0L,0L,300L,75L);
return FALSE;
}
i = get_float(DepositGadSIBuff,&ad);
if ( !i || ad < MINAD )
{
messagetxt.IText = (UBYTE *) depositmsg;
AutoRequest(wG,&messagetxt,0L,&oktxt,0L,0L,300L,75L);
return FALSE;
}
yrs = YearsGadSInfo.LongInt;
if (yrs < MINYRS)
{
messagetxt.IText = (UBYTE *) yearsmsg;
AutoRequest(wG,&messagetxt,0L,&oktxt,0L,0L,300L,75L);
return FALSE;
}
return TRUE;
}
/*
* Get a floating point number from an ASCII string.
* Return TRUE for good number, FALSE for bad.
*/
get_float(string,val)
char *string;
double *val;
{
int i;
i = sscanf(string,"%E",val);
if (i == 1) return TRUE;
else return FALSE;
}
/*
* Put values back into their string requesters
*/
put_values()
{
YearsGadSInfo.LongInt = yrs;
sprintf(YearsGadSIBuff,"%d",YearsGadSInfo.LongInt);
if (bb >= 1000000.0) sprintf(BalanceGadSIBuff,"%.6e",bb);
else sprintf(BalanceGadSIBuff,"%.2f",bb);
sprintf(InterestGadSIBuff,"%.3f",apr);
sprintf(DepositGadSIBuff,"%.2f",ad);
if (wG) redraw_scr();
}
/*
* Redraw Window
*/
redraw_scr()
{
RemoveGList(wG,&GadgetList1,-1L); /* remove all gadgets */
SetAPen(rpG,0L); /* clear the window */
RectFill(rpG,2L,11L,(long)(wG->Width-3),(long)(wG->Height-2));
AddGList(wG,&GadgetList1,0L,-1L,NULL); /* put back gadgets */
RefreshGList(&GadgetList1,wG,NULL,-1L); /* redraw the gadgets */
PrintIText(rpG,&IntuiTextList1,0L,0L); /* write window text */
SetAPen(rpG,1L); /* set draw color */
}
/*
* Print the data
*/
do_print()
{
int i;
FILE *fp;
if (!get_values()) return;
while ((fp = fopen("PRT:","w")) == NULL)
{
if (AutoRequest(wG,&prfailtxt,&retrytxt,&cantxt,
0L,0L,300L,75L)) continue;
return;
}
fprintf(fp,"%s\n",header);
fprintf(fp,"Balance = $%-20.2f\n",bb);
fprintf(fp,"Annual percentage Rate = %2.3f%%\n",apr);
fprintf(fp,"Annual deposit = $%-20.2f\n",ad);
fprintf(fp,"Years = $%d\n",yrs);
fclose(fp);
}
/*
* Load data from an ASCII file
*/
do_load()
{
FILE *fp;
select_file(0);
if (filename[0] == '\0') return;
while ((fp = fopen(filename,"r")) == NULL)
{
infailtxt2.IText = (UBYTE *) filename;
if (AutoRequest(wG,&infailtxt,&retrytxt,&cantxt,
0L,0L,reqlen(filename),75L)) continue;
return;
}
read_file(fp);
fclose(fp);
}
/*
* Read in data from open file
*/
read_file(fp)
FILE *fp;
{
int i;
i = fscanf(fp," %20F, %7F, %20F, %d",&bb,&apr,&ad,&yrs);
if (i != 4 || apr > MAXAPR || bb < MINBB || ad < MINAD)
{
infailtxt2.IText = (UBYTE *) filename;
AutoRequest(wG,&badfiletxt,0L,&oktxt,0L,0L,reqlen(filename),75L);
return(FALSE);
}
put_values();
}
/*
* Save the current data in an ASCII file
*/
do_save()
{
FILE *fp;
int i;
if (!get_values()) return;
select_file(1);
if (filename[0] == '\0') return;
while ((fp = fopen(filename,"w")) == NULL)
{
infailtxt2.IText = (UBYTE *) filename;
if (AutoRequest(wG,&infailtxt,&retrytxt,&cantxt,
0L,0L,reqlen(filename),75L)) continue;
return;
}
AddFileIOName(FIOSupp,filename); /* tell FIO about new file */
fprintf(fp,"%.2f,%.3f,%.2f,%d",bb,apr,ad,yrs);
fprintf(fp,"\n");
fclose(fp);
}
/*
* Select a file
*/
select_file(io)
int io;
{
struct Window *OpenWindow(), *wF = NULL;
struct FileLock *lock = NULL;
ClearMenuStrip(wG);
if (NULL == FIOSupp)
if (NULL == (FIOSupp = GetFileIOSupport()))
{
AutoRequest(wG,&fiofailtxt,0L,&cantxt,0L,0L,300L,75L) ;
SetMenuStrip(wG,&MenuList1); /* re-attach my Menu */
return;
}
/* set up title for file requester */
if (io == 0) FIOSupp->ReqTitle = (UBYTE *) load_title;
else FIOSupp->ReqTitle = (UBYTE *) save_title;
wF = OpenWindow(&NewWindowStructure3); /* open the window */
if ( wF == NULL )
{
AutoRequest(wG,&winfailtxt,0L,&oktxt,0L,0L,300L,75L);
SetMenuStrip(wG,&MenuList1); /* re-attach my Menu */
return;
}
filename[0] = '\0';
if (GetFileIOName(FIOSupp,wF))
BuildFileIOPathname(FIOSupp,filename);
if (wF) CloseWindow(wF);
if (lock) UnLock(lock);
SetMenuStrip(wG,&MenuList1); /* attach my Menu */
}
/*
* Calculate size of requester needed for given filename
*/
reqlen(filename)
char *filename;
{
int r;
r = TextLength(rpG,filename,strlen(filename))+50;
if (r < 300) r = 300;
if (r > 640) r = 640;
return (r) ;
}
#ifdef AZTEC_C
_abort()
{
done(13);
}
#endif