/*
 * Calculator.c          projekt pro kurs C v Amiga Review
 */

/* potęebné hlaviçkové soubory */
#include <stdio.h>
#include <string.h>

/* definice booleovského typu i s hodnotami;
 * standardnë je definován v <exec/types.h> */
typedef short           BOOL;
#define TRUE            1
#define FALSE           0

/* definice pouůívaných symbolű */
#define MAX_DELKA             1000
#define ZNAME_OPERATORY       "+-"

/* globální ęetëzec identifikující program a jeho verzi */
#define VERZE_KALKULACKY "Kalkulaçka 1.00 (5. 9. 1995)"
char *VERSION = "\0$VER: "VERZE_KALKULACKY;



/* funkce, která projde ęetëzec s výrazem a urçí jeho hodnotu */
/* je-li výraz chybný, vrátí FALSE;
 * v opaçném pęípadë vrací TRUE a
 * výsledek uloůí do promënné vysledek */
BOOL ProjdiRetezec(char *vyraz, double *vysledek)
{
/* pomocné reálné promënné pro vyhodnocní výrazu */
     double vysl = 0, operand;
/* operator bude obsahovat znaçku posledního operátoru;
 * zatím umíme jen '+', '-' */
     char operator = '+';
/* booleovská promënná - máme jiů skonçit? */
     BOOL end = FALSE;

     while (!end)
     {
/* mëlo následovat çíslo (pęípadnë pęedcházené mezerami apod.)
 * pęeçteme jej; */
	  if (0 >= sscanf(vyraz, "%lg", &operand))
/* nenásledovalo çíslo, ale nëco jiného = chyba ve výrazu */
	  {
	       printf("Chyba v zadaném výrazu!\n");
	       return(FALSE);
	  }
/* nalezneme dalîí operátor v ęetëzci */
	  vyraz = strpbrk(vyraz, ZNAME_OPERATORY);

/* pokud odçítáme, vynásobíme operand -1 a pęiçteme */
/* zatím nic jiného neů sçítání a odçítání neumíme */
	  if (operator == '-') operand *= -1;
	  vysl += operand;

	  if (vyraz == NULL)
/* nebyl nalezen ůádný dalîí operátor = konec výrazu */
	       end = TRUE;
	  else
/* v opaçném pęípadë si nový operátor zapamatujeme */
/* a posuneme se na dalîí znak - znak za operátorem */
	  {    operator = *vyraz;
	       vyraz++;
	  }
     }
/* vyhodnotili jsme úspeînë výraz -->
 * vrátíme výsledek volající funkci */
     *vysledek = vysl;
     return(TRUE);
}

/* hlavní funkce programu = vstupní bod */
int main(int argc, char *argv[])
/* argc udává poçet argumentű = ęetëzcű v pęíkazové ęádce */
/* argv pęedstavuje pole ęetëzcű = slov v pęíkazové ęádce */
/* návratová hodnota je chybový kód vrácený AmigaDOSu */
{
/* promënná na výsledek výpoçtu */
     double vysledek;
/* pomocna celoçíselná promënná */
     int i;
/* pole znakű = ęetëzec; na poçátku je prázdný */
/* samotné jméno 'vyraz' pak reprezentuje adresu pole = ęetëzce */
     char vyraz[MAX_DELKA] = "";

/* zatím neumíme startovat z Workbenche */
     if (argc == 0) return(20);
/* a poůadujeme, aby byl zadán výraz k vyhodnocení */
     if (argc == 1)
     {    printf("Nebyly zadány ůádné argumety!\n");
	  printf("Není co poçítat...\n");
	  return(5);
     }

/* vîechny parametry spojíme do jednoho ęetezce */
/* testujeme, zda je v poli vyraz dost místa;
 * pokud je jiů zaplnëno, pęeruîíme pęipojování */
     for(i = 1; i < argc; i++)
	  if (strlen(vyraz) + strlen(argv[i]) + 1 < MAX_DELKA)
	       strcat(vyraz, argv[i]);
	  else break;
/* ve vyraz je nyní celý výraz urçený ke spoçtení --> */
/* spoçteme a vytiskneme zadaný výraz a výsledek výpoçtu */
     if (ProjdiRetezec(vyraz, &vysledek))
	  printf("Výsledek:\n%s = %G\n", vyraz, vysledek);

/* vîe probëhlo korektnë */
     return(0);
}

