/* lukukasittely.c 020598 SJ */
/* Ohjelma ottaa syötteenään kokonaislukuja, tekee
   niille halutut operaatiot ja tulostaa tulokset.
   Operaatiot ovat + - * / vakiotermillä, operaatiot
   annetaan komentorivillä, esim +7 /2 lisää 7 ja
   vähentää 2. Huomaa, että * operaatio tulee antaa
   unixissa '*42', jottei kuori yritä lavennusta.
   Muut kuin em operaattoreilla alkavat parametrit
   tulkitaan ensin syötetiedoston nimeksi ja sitten
   tulostiedoston nimeksi. Jollei näitä anneta,
   käytetäan stdin:iä ja stdout:ia. Esim
   lukukasittely syote.dat *2 +1 tulos.dat */

#include <stdio.h>
#define MAXOP 20

int main(int argc, char *argv[])
{
  int i, opmaara = 0, uusiluku;
  FILE *syote = NULL, *tuloste = NULL;
  char c;

  int vakiot[MAXOP];
  char operaatiot[MAXOP];

  /* luetaan komentoriviparametrit */
  for (i = 1; i < argc; i++) {
	  
	  /* Jos eka kirjain on + - * / , otetaan
		 talteen operaatio ja perässä oleva vakio */
	  c = *argv[i];
	  if (c == '+' || c == '-' || c == '*'
		  || c == '/') {
		  operaatiot[opmaara] = c;
		  sscanf(argv[i]+1, "%d", &vakiot[opmaara]);
		  opmaara++;
	  }

	  /* Jollei syötettä vielä avattu, avataan */
	  else if (!syote) 
		  syote = fopen(argv[i], "r");

	  /* Jollei tulostetta vielä avattu, avataan */
	  else if (!tuloste)
		  tuloste = fopen(argv[i], "w");

	  else
		  fprintf(stderr, "Tuntematon parametri!\n");

  } /* for */

  /* jollei syötettä vielä avattu, stdin */
  if (!syote)
	  syote = stdin;

  /* jollei tulostetiedostoa vielä avattu, stdout */
  if (!tuloste)
	  tuloste = stdout;

  /* luetaan kunnes syöte loppu */
  fscanf(syote, "%d", &uusiluku);
  while (!feof(syote)) {
	  /* käydään operaatiot läpi */
	  for(i = 0; i < opmaara; i++) {
		  switch (operaatiot[i]) {
			  case '+':
				  uusiluku += vakiot[i];
				  break;
			  case '-':
				  uusiluku -= vakiot[i];
				  break;
			  case '*':
				  uusiluku *= vakiot[i];
				  break;
			  case '/':
				  uusiluku /= vakiot[i];
				  break;
		  }
	  }

	  fprintf(tuloste, "%d\n", uusiluku);

	  /* luetaan seuraava */
	  fscanf(syote, "%d", &uusiluku);
  } /* while */

  fclose(syote);
  fclose(tuloste);
  exit(0);
} /* main() */
