home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / dirs / mortcalc_385.lzh / MortCalc / MCalc25.lzh / mc26.c next >
C/C++ Source or Header  |  1990-08-26  |  21KB  |  794 lines

  1. /*MortCalc.c  v2.5 - Michel Laliberté, août 1990 
  2. .KEY source/a             
  3. cc +L +fi<source>.c       
  4. ln <source>.o -lma32 -lc32
  5. /*
  6. #include <stdio.h>
  7. #include <math.h>
  8. #include <exec/types.h>
  9. #include <exec/io.h>
  10. #include <exec/memory.h>
  11. #include <libraries/dos.h>
  12. #include <intuition/intuition.h>
  13. #include <workbench/workbench.h>
  14. #include <workbench/startup.h>
  15. #include <workbench/icon.h>
  16. #include <libraries/dosextens.h>
  17. #include <functions.h>
  18. */
  19. #define  U_ARGS(a) ()
  20. #include "mc26.h"
  21.  
  22. extern struct WBStartup *WBenchMsg;
  23. struct IntuitionBase *IntuitionBase;
  24. struct GfxBase *GfxBase;
  25. struct IconBase *IconBase;
  26. struct Window *OpenWindow();
  27.  
  28. double     peryear[13], compound[13], value[8];
  29. char     valstr[22][33], entree[25], tab[25], tab1[25];
  30. double     principal, r1, rate, payment, balance, months, years, an, mo, val;
  31. int        indice, cal, site, NextArg, yrs, mts, mois, indsel;
  32. BOOL    suff, zero, print, capital, go, msg, mx, can, fr, screen, quit_flag;
  33. APTR     obj0;
  34.  
  35. struct     DiskObject *diskobj;
  36. char     **findtools U_ARGS((char *,BPTR));
  37.  
  38. main(argc, argv)            /* départ - initialisation des valeurs */
  39.  
  40. int argc;
  41. char *argv[];
  42. {
  43.     int     count, i;
  44.     struct     WBArg *wbarg;
  45.     char     **toolptr,*name,lookup[4];
  46.  
  47.     peryear[1]  = 12; peryear[2]  = 6;  peryear[3]  = 4;
  48.     peryear[4]  = 3;  peryear[6]  = 2;  peryear[12] = 1;
  49.     compound[1]  = 1; compound[2]  = 2; compound[3]  = 3;
  50.     compound[4]  = 4; compound[6]  = 6; compound[12] = 12;
  51.     value[0] = 1; value[1] = 10000; value[2] = 10; value[3] = 120;
  52.     value[4] = 0; value[5] = 132.15; value[6] = 5858.09;
  53.     
  54.     cal  = 5; site = 1;     /* valeurs de démarrage par défaut */
  55.     indice = 5;strcpy(entree,Gadget15SIBuff); obj0 = (APTR)&Gadget11;
  56.  
  57.     if (argv[1][0] == '?')    /* tableau d'aide - CLI */
  58.     {
  59.         printf("\nMortCalc v2.5 - M. Laliberté, August 1990\n\n");
  60.         printf("USAGE:    %s [-c -f -s] \n\n", argv[0]);
  61.         printf("          %s ? : help screen\n",argv[0]);
  62.         printf("Options:\n");
  63.         printf("   -c  : Compounded semiannually (Canada)      \n");
  64.         printf("         (default: USA, compounded monthly)    \n");        
  65.         printf("   -f  : en français (default: English)\n");
  66.         printf("   -s  : display raw data to std output (CLI)\n\n");
  67.         exit(0);
  68.     }
  69.     else if (argc)            /* options du CLI */
  70.     {
  71.         for (NextArg=1; NextArg <argc; NextArg++)
  72.         {
  73.             if (*argv[NextArg] == '-')        
  74.             {
  75.                 switch (argv[NextArg][1])
  76.                 {
  77.                     case 'c':
  78.                         site = 6;
  79.                         can = TRUE;
  80.                         break;
  81.                     case 'f':
  82.                         fr = TRUE;
  83.                         break;
  84.                     case 's':
  85.                         screen = TRUE;
  86.                         break;
  87.                 }
  88.             }
  89.         } 
  90.     }
  91.     IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L);
  92.     if (IntuitionBase == NULL)
  93.     {
  94.         printf("Can't open intuition!\n");
  95.         cleanup();
  96.     }
  97.     GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L);
  98.     if (GfxBase == NULL)
  99.     {    
  100.         printf("Can't open graphics!\n");
  101.         cleanup();
  102.     }
  103.     IconBase = (struct IconBase *)OpenLibrary("icon.library",0L);
  104.     if ((IconBase) == NULL ) 
  105.     {
  106.         printf("Can't open icon!\n");
  107.         cleanup();
  108.     }
  109.     if (argc)            /* lancé du CLI */
  110.         toolptr = findtools(argv[0],
  111.             ((struct Process *)FindTask(NULL))->pr_CurrentDir);
  112.     else                /* lancé du Workbench */
  113.     {                     /* lecture du ToolType de l'icône */
  114.         wbarg = &(WBenchMsg->sm_ArgList[WBenchMsg->sm_NumArgs-1]);
  115.         toolptr = findtools(wbarg->wa_Name,wbarg->wa_Lock);    
  116.         strcpy(lookup,"ARG1");
  117.         count = 0;
  118.         for (i=0; i < 4; i++)
  119.         {
  120.             if ((name=FindToolType(toolptr,lookup)) != NULL) 
  121.             {
  122.                 if      (!strcmp (name,"CAN")) can = TRUE;
  123.                 else if (!strcmp (name,"FR"))  fr  = TRUE;
  124.             }
  125.             lookup[3]++;
  126.         }
  127.     }
  128.     if(can)  /* option CANADA */
  129.     {
  130.         Gadget6.Flags = SELECTED;
  131.         Gadget9.Flags = NULL;
  132.         value[6] = 5724.04;
  133.         value[5] = 131.03; site = 6;
  134.         strcpy(Gadget15SIBuff,"$ 131.03     ");
  135.         strcpy(Gadget16SIBuff,"$ 5724.04   ");
  136.         strcpy(Gadget10SIBuff, "6  ");
  137.     }
  138.     if(fr)            /* option FRANCAIS */
  139.     {
  140.         strcpy (valstr[2], "Taux ");
  141.         strcpy (valstr[3], "Période ");
  142.         strcpy (valstr[4], "Solde   ");
  143.         strcpy (valstr[5], "Paiement ");
  144.         strcpy (valstr[6], "Entrer une valeur positive");
  145.         strcpy (valstr[7], "Impossible! Paiement trop bas");
  146.         strcpy (valstr[8], "Solde nul! Paiement trop élevé");
  147.         strcpy (valstr[10], " ans");
  148.         strcpy (valstr[12], "Capitalisé sur %d mois");
  149.         strcpy (valstr[13], "calculé");
  150.         strcpy (valstr[14], "selectionné");
  151.         strcpy (valstr[17], "");
  152.         strcpy (valstr[18], "S.V.P. ouvrir l'imprimante");
  153.         strcpy (valstr[19], "Fin de l'impression");    
  154.         strcpy (valstr[20], "Intérêts  ");
  155.         strcpy (valstr[21], "Intérêts supérieurs au paiement!");
  156.         strcpy(Gadget13SIBuff," 10 ans 0 mo.");
  157.         strcpy(Gadget17SIBuff,"Bienvenue! Paiement sélectionné");
  158.         IText10.IText = (UBYTE *)"Intérêts";
  159.         IText11.IText = (UBYTE *)"Calculateur d'hypothèques v2.5  »**«  M. Laliberté, août 1990";
  160.         IText12.IText = (UBYTE *)"MESSAGE:";
  161.         IText15.IText = (UBYTE *)"Capitalisé sur";
  162.         IText16.IText = (UBYTE *)"mois";
  163.         IText17.IText = (UBYTE *)"Taper Amiga(droite)-X pour vider une boîte";
  164.         IText17.LeftEdge = 66;
  165.         IText8.IText  = (UBYTE *)"Taux";
  166.         IText7.IText  = (UBYTE *)"Période";
  167.         IText6.IText  = (UBYTE *)"Solde";
  168.         IText6.LeftEdge = 13;
  169.         IText5.IText  = (UBYTE *)"Paiement";
  170.         IText3.IText  = (UBYTE *)"Calcul";
  171.         IText3.LeftEdge = 20;
  172.         IText2.IText  = (UBYTE *)"Imprimante";
  173.         IText2.LeftEdge = 10;
  174.     }
  175.     else            /* option ANGLAIS par défaut */
  176.     {
  177.         strcpy (valstr[2], "Rate ");
  178.         strcpy (valstr[3], "Period  ");
  179.         strcpy (valstr[4], "Balance ");
  180.         strcpy (valstr[5], "Payment  ");
  181.         strcpy (valstr[6], "Enter a positive value");
  182.         strcpy (valstr[7], "No way! Payment too low");
  183.         strcpy (valstr[8], "No balance! Payment too high");
  184.         strcpy (valstr[10], " yrs");
  185.         strcpy (valstr[12], "Compounded over %d months");
  186.         strcpy (valstr[13], "computed");
  187.         strcpy (valstr[14], "selected");
  188.         strcpy (valstr[17], "All entries refreshed");
  189.         strcpy (valstr[18], "Print selected - Open printer");
  190.         strcpy (valstr[19], "Close printer selected");    
  191.         strcpy (valstr[20], "Interest  ");
  192.         strcpy (valstr[21], "Interest exceeds payment!");
  193.     }
  194.     strcpy (valstr[0], "\0");
  195.     strcpy (valstr[1], "Principal ");
  196.     strcpy (valstr[9], " %  ");
  197.     strcpy (valstr[11], " mo.");
  198.     strcpy (valstr[15], "U.S.A. ");
  199.     strcpy (valstr[16], "Canada ");
  200.     
  201.     OpenAll();            /* ouvre fenêtre MortCalc */
  202.     cleanup();            /* sortie */
  203. }
  204.  
  205. char **findtools(name,lock)   /* Pour la lecture du Tool Type */
  206. char *name;
  207. BPTR lock;
  208. {
  209.     BPTR olddir;
  210.     char **tools = NULL;
  211.  
  212.     if(lock == NULL) return (NULL);
  213.     olddir = (BPTR)CurrentDir(lock);
  214.     if((diskobj=GetDiskObject(name)) != NULL)
  215.     tools=diskobj->do_ToolTypes;
  216.     /* CurrentDir(olddir); */
  217.     return(tools);
  218. }
  219.  
  220. PrintStr(Window)    /* Envoie les valeurs au CLI et à l'imprimante */
  221. APTR  Window;
  222. {
  223.     FILE     *printer;    
  224.     int i;
  225.     if (screen)
  226.     {
  227.         printf(valstr[12],site); printf("\n");    
  228.         printf("%s= $%lf \n",valstr[1],value[1]);
  229.         printf("%s     =  %lf%s\n",valstr[2],value[2],valstr[9]);
  230.         printf("%s  =  %lf%s\n",valstr[3],value[3],valstr[11]);
  231.         printf("%s  = $%lf \n",valstr[4],value[4]);
  232.         printf("%s = $%lf \n",valstr[5],value[5]);
  233.         printf("%s= $%lf \n\n",valstr[20],value[6]);
  234.     }
  235.     if (print)        /* à l'imprimante */
  236.     {
  237.         printer = fopen("prt:", "w");
  238.         if (printer == NULL)
  239.         {
  240.             DisplayBeep(NULL);
  241.             sprintf(Gadget17SIBuff,"%s",valstr[6]);
  242.             RefreshGList(&Gadget17,Window,NULL,1);
  243.         }
  244.         fprintf(printer,"\t\t");
  245.         fprintf(printer,valstr[12],site);fprintf(printer,"\n");    
  246.         mts = (int) (value[3]+0.02); yrs = mts/12; mois = (int) (value[3]-yrs*12);
  247.         fprintf(printer,"\t\t%s= $%9.2lf \n",valstr[1],value[1]);
  248.         fprintf(printer,"\t\t%s     =  %3.3lf%s\n",valstr[2],value[2],valstr[9]);
  249.         fprintf(printer,"\t\t%s  =  %d%s %d%s\n",valstr[3],yrs,valstr[10],mois,valstr[11]);
  250.         fprintf(printer,"\t\t%s  = $%9.2lf \n",valstr[4],value[4]);
  251.         fprintf(printer,"\t\t%s = $%9.2lf \n",valstr[5],value[5]);
  252.         fprintf(printer,"\t\t%s= $%9.2lf \n",valstr[20],value[6]);
  253.         fprintf(printer, "\n\n\n\n\n\n");
  254.         fclose(printer);
  255.     }
  256. }
  257.  
  258. fprin()        /* calcul PRINCIPAL */
  259. {
  260.     value[1] = (balance+payment*(pow(r1, months)-1)/rate)/pow(r1,months);
  261. }
  262.  
  263. fintr()        /* calcul TAUX d'intérêt */
  264. {
  265.     double r0, r2, r9, p0, p2, p9;
  266.     int flop;
  267.     
  268.     r0 = 0; r1 = exp(75/months);
  269.     if (r1>2) r1 = 2;
  270.     rate = r1 - 1; r9 = rate*100;
  271.     p0 = balance + payment*months - principal;
  272.     p9 = (balance+payment*(pow(r1,months)-1)/rate)/pow(r1,months)-principal;
  273.     if (p0 <0 || p9>0) r2 = 0;
  274.     else
  275.     {
  276.         flop = 0;
  277.             while (abs(r9 - r0) > 0.001)
  278.         {
  279.             flop = 1 - flop;
  280.             if (flop >0)  r2 = (r0 + r9)/2;
  281.             else
  282.             {
  283.                 r2 = r0 - p0*(r9 - r0)/(p9 - p0);
  284.             }
  285.             r1 = pow((1 + r2/100/peryear[site]), (1/compound[site]));
  286.             rate = r1 - 1;
  287.             p2 = (balance+payment*(pow(r1, months)-1)/rate)/pow(r1, months)-principal;
  288.             if(p2 >0 )
  289.             {
  290.                 r0 = r2; p0 = p2;
  291.             }
  292.             else
  293.             {
  294.                 r9 = r2; p9 = p2;
  295.             }
  296.         }
  297.     }
  298.     value[2] = r2;
  299. }
  300.  
  301. fper()        /* calcul PERIODE d'amortissement */
  302. {
  303.     value[3] = log((payment-rate*balance)/(payment-rate*principal))/log(r1);
  304. }
  305.  
  306. fbal()        /* calcul SOLDE */
  307. {
  308.     value[4] = principal*pow(r1,months) - payment*(pow(r1,months) - 1)/rate;    
  309. }
  310.  
  311. fpay()        /* calcul PAIEMENT */
  312. {
  313.     value[5] = rate*(principal*pow(r1, months)-balance)/(pow(r1,months)-1);
  314. }
  315.  
  316. finterests()    /* calcul INTERETS */
  317. {
  318.     /* value[6] = principal*value[2]/1200; */
  319.     value[6] = value[3]*value[5]- (value[1] - value[4]);
  320. }
  321.  
  322. parse(string)    /* conversion des entiers du tampon PERIODE */
  323. char *string;
  324. {    
  325.     int     combien, q, p;
  326.     char     ch;
  327.     double     an, mo;
  328.     an = mo = 0;
  329.     combien = strlen(string);
  330.      q = 0; p= 0; ch = '0';
  331.      while (q < combien && (string[q] < '0' || string[q] > '9'))     
  332.     {
  333.         q++;
  334.     }
  335.      while (q < combien && ch > '/' && ch < ':') 
  336.     {
  337.         ch = string[q]; tab[p] = ch; q++; p++;
  338.     }
  339.     tab[p] = '\0';
  340.     an = atoi(tab);
  341.     if (q == combien || q > combien) 
  342.     {
  343.         value[3] = an*12;
  344.         return;
  345.     }
  346.     while (q < combien && (string[q] < '0' || string[q] > '9'))     
  347.     {
  348.         q++;
  349.     }
  350.     p= 0; ch = '0'; 
  351.     while (q < combien && ch > '/' && ch < ':') 
  352.     {
  353.         ch = string[q];    tab[p] = ch; q++; p++;
  354.     }
  355.     tab[p] = '\0';
  356.     mo = atoi(tab);
  357.     value[3] = an*12 + mo;
  358. }
  359.  
  360. parsef(string,ind)    /* conversion des flottants des autres tampons */
  361. char *string;
  362. int ind;
  363. {
  364.     double atof();
  365.     int     combien, q, p;
  366.     char     ch;
  367.     combien = strlen(string);
  368.      q = 0; p= 0; ch = '0';
  369.      while (q < combien && (string[q] < '0' || string[q] > '9'))     
  370.     {
  371.         q++;
  372.     }
  373.      while (q < combien && ((ch > '/' && ch < ':') || ch == ',' || ch == '.')) 
  374.     {    
  375.         if (string[q] == ',') q++;
  376.         tab[p] = string[q];ch = string[q]; q++; p++;
  377.     }
  378.     tab[p] = '\0';
  379.     value[ind] = atof(tab);
  380. }
  381.  
  382. VOID ChangeGadgetState(Win, Gad, State)  /* gadgets mutuel. exclusifs */
  383. register struct Window *Win;
  384. register struct Gadget *Gad;
  385. register BOOL State;
  386. {
  387.     register USHORT GadPos;
  388.  
  389.     GadPos = RemoveGadget(Win, Gad);
  390.     RefreshGList(Gad, Win, NULL, 1);
  391.  
  392.     if( State )
  393.         if( !(Gad->Flags & SELECTED) )
  394.             Gad->Flags |= SELECTED;
  395.     if( !State )
  396.         if (Gad->Flags & SELECTED)
  397.             Gad->Flags ^= SELECTED;
  398.  
  399.     AddGadget(Win, Gad, GadPos);
  400.     RefreshGList(Gad, Win, NULL, 1);
  401.  
  402.     return;
  403. }
  404.  
  405. FEntree(win)    /* entrer le contenu des boîtes de valeurs */
  406. APTR win;
  407. {
  408.     int ind;
  409.     site = atoi(Gadget10SIBuff);
  410.     strcpy(entree,Gadget11SIBuff); ind = 1; 
  411.     parsef (entree,ind); Check(win,ind);
  412.     strcpy(entree,Gadget12SIBuff); ind = 2;
  413.     parsef (entree,ind); Check(win,ind);
  414.     strcpy(entree,Gadget13SIBuff); ind = 3;
  415.     parse (entree); Check(win,ind);
  416.     strcpy(entree,Gadget14SIBuff); ind = 4;
  417.     parsef (entree,ind); Check(win,ind);
  418.     strcpy(entree,Gadget15SIBuff); ind = 5;
  419.     parsef (entree,ind); Check(win,ind);
  420. }
  421.  
  422. Check(win,ind)            /* zéro = erreur */
  423. APTR win;
  424. int ind;
  425. {
  426.     APTR gadg;
  427.     if ((value[ind] <= 0) && ( ind != 4) && (ind != cal))
  428.     {    
  429.         DisplayBeep(NULL);   
  430.         sprintf(Gadget17SIBuff,"%s",valstr[6]);
  431.         RefreshGList(&Gadget17,win,NULL,1);
  432.         value[ind] = 0;
  433.         switch (ind)
  434.         {
  435.             case 1:    gadg = (APTR)&Gadget11; break;
  436.             case 2:    gadg = (APTR)&Gadget12; break;
  437.             case 3:    gadg = (APTR)&Gadget13; break;
  438.             case 4:    gadg = (APTR)&Gadget14; break;
  439.             case 5:    gadg = (APTR)&Gadget15; break;
  440.             case 6:    gadg = (APTR)&Gadget16; break;
  441.         }
  442.         zero = 1;
  443.         FUpdate(win, gadg, ind);
  444.         ActivateGadget(gadg,win,NULL);
  445.     }
  446. }
  447.  
  448. FUpdate(win, gadg, ind)        /* mise à jour d'une boîte de valeurs*/
  449. APTR win;
  450. APTR gadg;
  451. int ind;
  452. {
  453.     USHORT GadPos;
  454.     GadPos = RemoveGadget(win, gadg);
  455.     RefreshGList(gadg,win,NULL,1);
  456.     switch (ind)
  457.     {
  458.         case 0:
  459.             sprintf(Gadget10SIBuff,"%d",site); break;
  460.         case 1:
  461.             sprintf(Gadget11SIBuff,"$ %-9.2lf",value[1]); break;
  462.         case 2:
  463.             sprintf(Gadget12SIBuff," %3.3lf%s",value[2],valstr[9]); break;
  464.         case 3:
  465.             sprintf(Gadget13SIBuff," %d%s %d%s",yrs,valstr[10],mois,valstr[11]);
  466.             break;
  467.         case 4:
  468.             sprintf(Gadget14SIBuff,"$ %-9.2lf",value[4]); break;
  469.         case 5:
  470.             sprintf(Gadget15SIBuff,"$ %-9.2lf",value[5]); break;
  471.         case 6:
  472.             sprintf(Gadget16SIBuff,"$ %-9.2lf",value[6]); break;
  473.     }
  474.     AddGadget(win, gadg, GadPos);
  475.     RefreshGList(gadg,win,NULL,1);
  476. }
  477.  
  478. Refresh(win)         /* rafraîchissement */
  479. APTR win;
  480. {
  481.     APTR gadg;
  482.     sprintf(Gadget11SIBuff,"$ %-9.2lf",value[1]);
  483.     sprintf(Gadget12SIBuff," %-3.3lf%s",value[2],valstr[9]);
  484.     mts = (int) value[3]; yrs = mts/12; mois = (int) (value[3]-yrs*12);
  485.     sprintf(Gadget13SIBuff," %d%s %d%s",yrs,valstr[10],mois,valstr[11]);
  486.     sprintf(Gadget15SIBuff,"$ %-9.2lf",value[5]);
  487.     sprintf(Gadget14SIBuff,"$ %-9.2lf",value[4]);
  488.     sprintf(Gadget16SIBuff,"$ %-9.2lf",value[6]);
  489.     RefreshGList(&Gadget11,win,NULL,-1);
  490. }
  491.  
  492. FMessage(str,win)    /* message de confirmation */
  493. char *str;
  494. APTR win;
  495. {
  496.     strcpy(valstr[0],"\0");
  497.     strcat(valstr[0],str);
  498.     strcat(valstr[0],valstr[13]);
  499.     sprintf(Gadget17SIBuff,"%s",valstr[0]);
  500.     RefreshGList(&Gadget17,win,NULL,1);
  501. }
  502.  
  503. cleanup()            /* sortie */
  504. {
  505.     if(diskobj)
  506.     {
  507.         FreeDiskObject(diskobj);
  508.         diskobj = NULL;
  509.     }
  510.     if (GfxBase != NULL) CloseLibrary(GfxBase);
  511.     if (IconBase != NULL) CloseLibrary(IconBase);
  512.     if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
  513.     exit(0);
  514. }
  515.  
  516. OpenAll()        /* ouvre fenêtre et boucle principale */
  517. {
  518.     UWORD code;
  519.     ULONG class;
  520.     APTR PrevGadg;
  521.     APTR gadg;
  522.     APTR object;
  523.     USHORT GadPos;
  524.  
  525.     struct Window *wG;    /* we fetch the RastPort pointer from here */
  526.     struct RastPort *rpG;
  527.     struct IntuiMessage *message;    /* the message the IDCMP sends us */
  528.     void HandleEvent();
  529.  
  530.     
  531.     wG = OpenWindow(&NewWindowStructure1);    /* open the window */
  532.     if ( wG == NULL )
  533.     {
  534.         printf ("Can't open window!\n");
  535.         cleanup();
  536.     }
  537.     rpG = wG->RPort;    /* get a rastport pointer for the window */
  538.     PrintIText(rpG,&IntuiTextList1,0L,0L);    /* Print the text if any */
  539.     Gadget17.NextGadget = NULL;    /* valeurs par défaut et */
  540.     Gadget11.GadgetRender = NULL;  /* accéleration du rafraîchissement */
  541.     Gadget12.GadgetRender = NULL;
  542.     Gadget13.GadgetRender = NULL;
  543.     Gadget14.GadgetRender = NULL;
  544.     Gadget15.GadgetRender = NULL;
  545.     Gadget16.GadgetRender = NULL;
  546.     Gadget17.GadgetRender = NULL;
  547.     ActivateGadget(&Gadget11,wG,NULL);
  548.     PrevGadg = (APTR)&Gadget5;
  549.     do
  550.     {
  551.         WaitPort(wG->UserPort);
  552.         while( (message = (struct IntuiMessage *)
  553.                                 GetMsg(wG->UserPort) ) != NULL)
  554.         {
  555.             code = message->Code;  /* MENUNUM */
  556.             object = message->IAddress;  /* Gadget */
  557.             class = message->Class;
  558.             ReplyMsg(message);
  559.             if ( class == CLOSEWINDOW )
  560.             {
  561.                 quit_flag = TRUE;
  562.             }
  563.             if ( class == GADGETUP)
  564.             {                 
  565.                 HandleEvent(object,wG); /* lit les gadgets */
  566.                 if (capital)  /* capitalisation CANADA, USA ou autre */
  567.                 {
  568.                     FUpdate(wG, &Gadget10, 0);
  569.                     if (site == 1)
  570.                     {
  571.                         ChangeGadgetState(wG, (APTR)&Gadget6, FALSE);
  572.                         ChangeGadgetState(wG, (APTR)&Gadget9, TRUE);
  573.                     }
  574.                     else if (site == 6)
  575.                     {
  576.                         ChangeGadgetState(wG, (APTR)&Gadget9, FALSE);
  577.                         ChangeGadgetState(wG, (APTR)&Gadget6, TRUE);
  578.                     }
  579.                     else 
  580.                     {
  581.                         ChangeGadgetState(wG, (APTR)&Gadget6, FALSE);
  582.                         ChangeGadgetState(wG, (APTR)&Gadget9, FALSE);
  583.                     }
  584.                     capital = 0;
  585.                 }
  586.                 if (mx)        /* ouvre et ferme gadgets mut. exclusifs */
  587.                 {    
  588.                     ChangeGadgetState(wG, PrevGadg, FALSE);
  589.                     ChangeGadgetState(wG, object, TRUE);
  590.                     PrevGadg = object;
  591.                     mx = 0;
  592.                 }
  593.                 if (msg)    /* message de sélection */
  594.                 {
  595.                     strcpy(valstr[0],"\0");
  596.                     strcat(valstr[0],valstr[indsel]);
  597.                     if (!suff) strcat(valstr[0],valstr[14]);
  598.                     sprintf(Gadget17SIBuff,"%s",valstr[0]);
  599.                     RefreshGList(&Gadget17,wG,NULL,1);
  600.                     msg = 0; suff = 0;
  601.                     ActivateGadget(obj0,wG,NULL);
  602.                 }
  603.                 if (go)        /* calcul lancé */
  604.                 {    
  605.                     r1 = pow((value[2]/100/peryear[site] +1 ),(1/compound[site]));
  606.                     rate     =     r1-1; go = 0;
  607.                     principal = value[1]; months  = value[3];
  608.                     balance =     value[4]; payment = value[5];
  609.                     
  610.                     switch(cal)            /* sélection du calcul */
  611.                     {    
  612.                         case 1:         /* PRINCIPAL */
  613.                             fprin();
  614.                             finterests(); 
  615.                             FUpdate(wG, &Gadget16, 6);
  616.                             FMessage(valstr[1],wG);
  617.                             principal = value[1];
  618.                             FUpdate(wG, &Gadget11, 1);
  619.                             ActivateGadget(&Gadget11,wG,NULL);
  620.                             break;
  621.                         case 2:            /* TAUX */
  622.                             fintr();
  623.                             if (value[2] <= 0 ) 
  624.                             {
  625.                                 DisplayBeep(NULL);
  626.                                 sprintf(Gadget17SIBuff,"%s",valstr[7]);
  627.                                 RefreshGList(&Gadget17,wG,NULL,1);
  628.                                 value[2] = 0;
  629.                                 FUpdate(wG,&Gadget12,2);
  630.                                 ActivateGadget(&Gadget12,wG,NULL);
  631.                                 continue;
  632.                             }
  633.                             FMessage(valstr[2],wG);
  634.                             finterests(); 
  635.                             FUpdate(wG, &Gadget16, 6);
  636.                             r1 = pow((value[2]/100/peryear[site] +1 ),(1/compound[site]));
  637.                             rate =    r1-1; value[7] = value[5]; fpay();
  638.                             if ((value[7] - 0.01) > value[5])
  639.                             {    
  640.                                 DisplayBeep(NULL);
  641.                                 sprintf(Gadget17SIBuff,"%s",valstr[21]);
  642.                                 RefreshGList(&Gadget17,wG,NULL,1);
  643.                                 value[2] = 0;
  644.                                 FUpdate(wG,&Gadget12,2);
  645.                                 ActivateGadget(&Gadget12,wG,NULL);
  646.                                 continue;
  647.                             } 
  648.                             value[5] = value[7];
  649.                             FUpdate(wG, &Gadget12, 2);
  650.                             ActivateGadget(&Gadget12,wG,NULL);
  651.                             break;
  652.                         case 3:            /* PERIODE */
  653.                             fper();
  654.                             if (value[3] < .001 || value[3] > 9999) 
  655.                             {
  656.                                 DisplayBeep(NULL);
  657.                                 sprintf(Gadget17SIBuff,"%s",valstr[7]);
  658.                                 RefreshGList(&Gadget17,wG,NULL,1);
  659.                                 value[3] = 0; mts = 0; yrs = 0; mois = 0;
  660.                                 FUpdate(wG,&Gadget13,3);
  661.                                 ActivateGadget(&Gadget13,wG,NULL);
  662.                                 continue;
  663.                             }
  664.                             mts = (int) (value[3]+ 0.02); yrs = mts/    12; mois = (int) (value[3]-yrs*12);
  665.                             FMessage(valstr[3],wG);
  666.                             finterests(); 
  667.                             FUpdate(wG, &Gadget16, 6);
  668.                             FUpdate(wG, &Gadget13, 3);
  669.                             ActivateGadget(&Gadget13,wG,NULL);
  670.                             break;
  671.                         case 4:                /* SOLDE */
  672.                             fbal();
  673.                             if (value[4] < 0 )
  674.                             {
  675.                                 DisplayBeep(NULL);
  676.                                 sprintf(Gadget17SIBuff,"%s",valstr[8]);
  677.                                 RefreshGList(&Gadget17,wG,NULL,1);
  678.                                 value[4] = 0;
  679.                                 FUpdate(wG,&Gadget14,4);
  680.                                 ActivateGadget(&Gadget14,wG,NULL);
  681.                                 continue;    
  682.                             }
  683.                             FMessage(valstr[4],wG);
  684.                             finterests(); 
  685.                             FUpdate(wG, &Gadget16, 6);
  686.                             FUpdate(wG, &Gadget14, 4);
  687.                             ActivateGadget(&Gadget14,wG,NULL);
  688.                             break;
  689.                         case 5:                /* PAIEMENT */
  690.                             fpay();
  691.                             if (value[5] <= 0 ) 
  692.                             {
  693.                                 DisplayBeep(NULL);
  694.                                 sprintf(Gadget17SIBuff,"%s",valstr[7]);
  695.                                 RefreshGList(&Gadget17,wG,NULL,1);
  696.                                 value[5] = 0;
  697.                                 FUpdate(wG,&Gadget15,5);
  698.                                 ActivateGadget(&Gadget15,wG,NULL);
  699.                                 continue;
  700.                             }
  701.                             FMessage(valstr[5],wG);
  702.                             finterests(); 
  703.                             FUpdate(wG, &Gadget16, 6);
  704.                             FUpdate(wG, &Gadget15, 5);
  705.                             ActivateGadget(&Gadget15,wG,NULL);
  706.                             break;
  707.                     }
  708.                     PrintStr(wG);
  709.                 }
  710.             }
  711.         }
  712.     } while (quit_flag == FALSE);
  713.  
  714.     CloseWindow(wG);        /* on ferme */
  715. }
  716.  
  717. void HandleEvent(object,win)    /* lecture des gadgets */
  718. APTR object;
  719. APTR win;
  720. {
  721.     if (object == (APTR)&Gadget1)      /* bouton PRINCIPAL */
  722.     {
  723.         cal = 1; mx = 1; msg = 1; indsel = 1; 
  724.     }
  725.     else if (object == (APTR)&Gadget2) /* bouton TAUX */
  726.     {
  727.         cal = 2; mx = 1; msg = 1; indsel = 2;
  728.     }        
  729.     else if (object == (APTR)&Gadget3) /* bouton PERIODE */
  730.     {
  731.         cal = 3; mx = 1; msg = 1; indsel = 3;
  732.     }    
  733.     else if (object == (APTR)&Gadget4) /* bouton SOLDE */
  734.     {
  735.         cal = 4; mx = 1; msg = 1; indsel = 4;
  736.     }    
  737.     else if (object == (APTR)&Gadget5) /* bouton PAIEMENT */
  738.     {
  739.         cal = 5; mx = 1; msg = 1; indsel = 5;
  740.     }    
  741.     else if (object == (APTR)&Gadget6) /* bouton CANADA */
  742.     {
  743.         site = 6; capital = 1; go = 1; 
  744.     }    
  745.     else if (object == (APTR)&Gadget7) /* bouton IMPRIMER */
  746.     {
  747.         if (print == 1)
  748.         {    
  749.             print = 0; msg = 1;  indsel = 19;
  750.         }
  751.         else
  752.         {
  753.             print = 1; msg = 1;  indsel = 18;
  754.         }
  755.         suff = 1;
  756.     }    
  757.     else if (object == &Gadget8) /* bouton CALCULER */
  758.     {    
  759.         FEntree(win); Refresh(win); 
  760.         if (!zero) go = 1;
  761.         else zero = 0;
  762.     }    
  763.     else if (object == (APTR)&Gadget9) /* bouton USA */
  764.     {
  765.         site = 1; capital = 1; go = 1;
  766.     }    
  767.     else if (object == (APTR)&Gadget10) /* boîte Capitalisé ... */
  768.     {    
  769.         site = atoi(Gadget10SIBuff);
  770.          capital = 1; go = 1;
  771.     }    
  772.     else if (object == &Gadget11) /* boîte PRINCIPAL */
  773.     {
  774.         obj0 = (APTR)object; ActivateGadget(&Gadget12,win,NULL);
  775.     }    
  776.     else if (object == &Gadget12) /* boîte TAUX */
  777.     {
  778.         obj0 = (APTR)object; ActivateGadget(&Gadget13,win,NULL);
  779.     }    
  780.     else if (object == &Gadget13) /* boîte PERIODE */
  781.     {    
  782.         obj0 = (APTR)object; ActivateGadget(&Gadget14,win,NULL);
  783.     }    
  784.     else if (object == &Gadget14) /* boîte SOLDE */
  785.     {
  786.         obj0 = (APTR)object; ActivateGadget(&Gadget15,win,NULL);
  787.     }    
  788.     else if (object == &Gadget15) /* boîte PAIEMENT */
  789.     {    
  790.         obj0 = (APTR)object; 
  791.         ActivateGadget(&Gadget11,win,NULL);
  792.     }    
  793. }
  794.