/*

   Programm :  Konto.c   Grafische Kontoübersicht

   Autor    :  Martin Bock
               Maximilianstraße 19
               6730 Neustadt/Weinstraße

   Compiler :  Aztek 3.4b / cc Konto.c -s +l / ln Konto.o -lc32

   Dieses Programm darf frei kopiert und genutzt werden, solange diese Kom-
   mentarzeilen erhalten bleiben. Änderungen dürfen zum persönlichen Gebrauch
   gemacht, aber nicht an Dritte weitergegeben werden. Sollte jemand Unter-
   routinen oder Programmteile in seine eigenen Programme übernehmen wollen,
   habe ich dagegen nichts einzuwenden, und die oben angegebenen Einschrän-
   kungen gelten dann nicht mehr.

   Sollte ich feststellen, daß sich jemand nicht an diese Abmachung hält,
   das heißt MEINE Ideen als die seinen ausgibt, werde ich in Zukunft meine
   Quellenprogramme für mich behalten.

*/
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <stdio.h>

struct NewScreen SCR=
  {
  0,0,640,256,3,0,1,HIRES,
  CUSTOMSCREEN,NULL,"Konto",NULL,NULL
  };

struct NewWindow WIN=
  {
  0,11,640,245,0,1,
  CLOSEWINDOW,
  ACTIVATE|WINDOWCLOSE|GIMMEZEROZERO,
  NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN
  };

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;

struct Screen *scr;
struct Window *win;
struct ViewPort *vp;
struct RastPort *rp;
struct IntuiMessage *msg;

USHORT cols[]=
  {
  0x000,0xfff,0xf00,0x060,0xc92,0xfff,0x000,0x606
  };
USHORT cold[]=
  {
  0x000,0xfff,0xf00,0x0f0,0xf80,0x000,0xfff,0x0ff
  };

char mon[5];
int saldo,vor,uw,ow,w,ya,ye,y,x,a,null,breite=5;
int fback=6,fgitter=3,fnull=7,fplus=5,fminus=2,fbetrag=4,fmonat=4;

FILE *fp=0;

main(argc,argv)

int argc;
char *argv[];
  {
  int ende,class;
  char modus;

  modus='s';
  if(argc>1)
    if(*argv[1]=='d')
      modus='d';
    else
      ClearMem("Nur s=Schirm oder d=Drucker als Parameter erlaubt",20);

  fp=fopen("saldo","r");
  if(!fp) ClearMem("Fehler beim Öffnen von Datei SALDO",20);
  vor=wert();
  uw=wert();
  ow=wert();
  if(ow-uw!=1000000)
    ClearMem("Unterer Wert minus Oberer Wert ungleich 10000 DM",20);
  fclose(fp); fp=0;

  IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0);
  if(!IntuitionBase) ClearMem("intuition.library",20);
  GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0);
  if(!GfxBase) ClearMem("graphics.library",20);
  scr=(struct Screen *)OpenScreen(&SCR);
  if(!scr) ClearMem("Screen",20);
  vp=&scr->ViewPort;
  WIN.Screen=scr;
  win=(struct Window *)OpenWindow(&WIN);
  if(!win) ClearMem("Window",20);
  rp=win->RPort;
  if(modus=='s')
    LoadRGB4(vp,(struct ColorMap *)cols,8);
  else
    LoadRGB4(vp,(struct ColorMap *)cold,8);
  SetAPen(rp,fback);
  RectFill(rp,0,0,640,245);

  DrawGitter();

  x=44; saldo=vor;
  RechnePunkt();
  Move(rp,x,y); x+=breite;
  fp=fopen("werte","r");
  if(!fp) ClearMem("Fehler beim Öffnen von Datei WERTE",20);
  do
    {
    w=wert();
    if(mon[0]!='§')
      if(w==0)
        DrawMonat();
      else
        {
        saldo+=w;
        RechnePunkt();
        Draw(rp,x,y); x+=breite;
        }
    }
  while(mon[0]!='§');
  fclose(fp); fp=0;

  RechneSaldo();

  ende=0;
  do
    {
    while(msg=(struct IntuiMessage *)GetMsg(win->UserPort))
      {
      class=msg->Class;
      ReplyMsg(msg);
      if(class==CLOSEWINDOW) ende=1;
      }
    }
  while(!ende);

  ClearMem("",0);
  }

int wert()
  {
  char c,wm,wv;
  int ende,i,ww[2],wwp,wwpx;

  wm=' '; wv='+'; ww[0]=0; ww[1]=0; wwp=0; wwpx=0;
  ende=0;

  do
    {
    c=getc(fp);
    if(feof(fp))
      {
      wm='#';
      mon[0]='§';
      ende=1;
      }
    else
      {
      if(c=='#')
        {
        wm=c;
        for(i=0;i<5;i++)
          mon[i]=getc(fp);
        }
      else
        {
        if(c=='\n')
          ende=1;
        else
          {
          if((c=='+')||(c=='-'))
            wv=c;
          if(c=='.')
            {
            wwp++;
            if(wwp>1)
              ClearMem("Formatfehler, zu viele Dezimalpunkte",20);
            }
          if((c>='0')&&(c<='9'))
            {
            ww[wwp]=ww[wwp]*10+c-'0';
            if(wwp==1)
              {
              wwpx++;
              if(wwpx>2)
                ClearMem("Formatfehler, zu viele Nachkommastellen",20);
              }
            }
          }
        }
      }
    }
  while(!ende);

  if(wwp==1)
    if(wwpx==1)
      ww[1]*=10;
  if(wm=='#')
    return(0);
  else
    {
    i=ww[0]*100+ww[1];
    if(wv=='-')
      i=-i;
    return(i);
    }
  }

DrawGitter()
  {
  ya=18; ye=218;
  null=ya+(ow/5000);
  SetAPen(rp,fgitter);
  for(y=null;y>=ya;y-=10)
    {
    Move(rp,40,y);
    Draw(rp,640,y);
    }
  for(y=null;y<=ye;y+=10)
    {
    Move(rp,40,y);
    Draw(rp,640,y);
    }
  SetAPen(rp,fnull);
  Move(rp,0,null);
  Draw(rp,640,null);

  for(a=uw;a<=ow;a+=100000)
    {
    y=ye-((a-uw)/5000);
    if(a!=0) zahl(a);
    }
  }

DrawMonat()
  {
  int a,sx,sy;

  sx=x; sy=y;
  x-=9; y=ya-9;
  SetAPen(rp,fmonat);
  for(a=0;a<5;a++)
    zeichen(mon[a]);
  x=sx; y=sy;
  SetAPen(rp,fgitter);
  Move(rp,x,ya-5);
  Draw(rp,x,ye);
  Move(rp,x-breite,y);
  }

RechnePunkt()
  {
  y=ye-((saldo-uw)/5000);
  if(saldo<0) SetAPen(rp,fminus); else SetAPen(rp,fplus);
  }

RechneSaldo()
  {
  int sv,sh;
  static char buffer[40];

  sv=saldo/100;
  if(saldo<0) saldo=-saldo;
  sh=saldo%100;
  sprintf(buffer,"          Saldo: %7ld,%02ld DM\0",sv,sh);
  SetWindowTitles(win,&buffer,NULL);
  }

zahl(a)

int a;
  {
  char buffer[10];

  x=4;
  SetAPen(rp,fbetrag);
  if(a<0)
    {
    zeichen('-');
    a=-a;
    }
  else
    zeichen('+');
  sprintf(buffer,"%7ld",a);
  for(a=0;a<5;a++)
    zeichen(buffer[a]);
  }

zeichen(c)

char c;
  {
  switch(c)
    {
    case '-': Move(rp,x-2,y); Draw(rp,x+2,y); break;
    case '+': Move(rp,x-2,y); Draw(rp,x+2,y);
              Move(rp,x,y-1); Draw(rp,x,y+1); break;
    case '.': Move(rp,x-1,y+2); Draw(rp,x,y+2); break;
    case '/': Move(rp,x-2,y+2); Draw(rp,x+2,y-2); break;
    case '0': Move(rp,x-2,y-2); Draw(rp,x+2,y-2); Draw(rp,x+2,y+2);
              Draw(rp,x-2,y+2); Draw(rp,x-2,y-2); break;
    case '1': Move(rp,x,y-2); Draw(rp,x,y+2); break;
    case '2': Move(rp,x-2,y-2); Draw(rp,x+2,y-2); Draw(rp,x+2,y);
              Draw(rp,x-2,y); Draw(rp,x-2,y+2); Draw(rp,x+2,y+2); break;
    case '3': Move(rp,x-2,y-2); Draw(rp,x+2,y-2); Draw(rp,x+2,y+2);
              Draw(rp,x-2,y+2); Move(rp,x,y); Draw(rp,x-2,y); break;
    case '4': Move(rp,x-2,y-2); Draw(rp,x-2,y); Draw(rp,x+2,y);
              Move(rp,x+1,y-1); Draw(rp,x+1,y+2); break;
    case '5': Move(rp,x+2,y-2); Draw(rp,x-2,y-2); Draw(rp,x-2,y);
              Draw(rp,x+2,y); Draw(rp,x+2,y+2); Draw(rp,x-2,y+2); break;
    case '6': Move(rp,x+2,y-2); Draw(rp,x-2,y-2); Draw(rp,x-2,y+2);
              Draw(rp,x+2,y+2); Draw(rp,x+2,y); Draw(rp,x-2,y); break;
    case '7': Move(rp,x-2,y-2); Draw(rp,x+2,y-2); Draw(rp,x,y+2); break;
    case '8': Move(rp,x-2,y-2); Draw(rp,x+2,y-2); Draw(rp,x+2,y+2);
              Draw(rp,x-2,y+2); Draw(rp,x-2,y-2);
              Move(rp,x-2,y); Draw(rp,x+2,y); break;
    case '9': Move(rp,x-2,y+2); Draw(rp,x+2,y+2); Draw(rp,x+2,y-2);
              Draw(rp,x-2,y-2); Draw(rp,x-2,y); Draw(rp,x+2,y); break;
    }
  x+=6;
  }

ClearMem(text,error)

char *text;
int error;
  {
  if(fp) fclose(fp);
  if(win) CloseWindow(win);
  if(scr) CloseScreen(scr);
  if(error)
    {
    printf("Fehler: %s\n",text);
    exit(error);
    }
  }
