// fil:            parameters.cc
// beskrivning:    lab 1 i C+C++
// senast ändrad:  980114 Tor-Åke Fransson MD4

#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

void position(double reals[], int &pos);
void sequence(double reals[], double treshold, int &pos, int &length);
int
read_array(double reals[]);
void ctrlc_exit(int); // så att man hinner se output från programmet.

int
main(int argc, char *argv[])
{
  double *reals;
  int pos, length;
  double treshold;
  char svar[2];
 
  // -h ger hjälp
 
  if (strncmp(argv[argc-1], "-h", 2) == 0)
    {
      cout << "Usage : " << argv[0] << " position | sequence"<<endl;
      ctrlc_exit(-1);
    }
 
  // om vi inte fick kommandoradsargument frågar vi vad vi skall göra

  if (argc < 2)
    {
      cout << "position (p) eller sekvens (s) ? ";
      cin >> svar; // kan ge skyddsfel
      argv[1] = new char(4);
      switch (svar[0])
         {
         case 'p':
           strcpy(argv[1], "pos");
           break;
         case 's':
           strcpy(argv[1], "seq");
           break;
         default:
           cout << "Felaktig inmatning\n";
           ctrlc_exit(-1);
         }
    }

  if (strncmp(argv[1], "pos", 3) == 0)
    {
      //    allokera lite minne för reals. Detta måste göras här,
      //    annars kommer pekaren att peka på fel adress!
      //    ekvivalent med malloc(sizeof(double))
      reals = new double[1];
      read_array(reals);
      position(reals, pos);
      cout << "Position: " << pos << endl;
      ctrlc_exit(1);
    }

  if (strncmp(argv[1], "seq", 3) == 0)
    {
      reals = new double[1];
      read_array(reals);
      cout << "ange tröskelvärde: ";
      cin >> treshold;
      sequence(reals, treshold, pos, length);
      cout << "Position: " << pos << " Längd: " << length << endl;
      ctrlc_exit(1);
    }

  cout << "Usage : " << argv[0] << " position | sequence"<<endl;
  ctrlc_exit(-1); // reached only in case of error
}

// read_array läser in flyttal i vektorn reals

int
read_array(double reals[])
{
  int index = 0;
  cout << "Ange ett antal värden, avsluta med 0"<<endl;
  while (1)
    {
    cin >> reals[index];
    if (reals[index] == 0)
      break;
    index++;
    // allokera minne för nästa double. Innehållet i reals ändras inte.
    // Besvärligt och långsamt, men jag vägrar använda en temporär vektor
    realloc((void *) reals, (sizeof(double) * (index + 1)));
    }
  return (index); // så många tal har vi läst in
}

// position finner det största talet i en vektor. Den förutsätter att
// sista elementet i vektorn reals är 0

void position(double reals[], int &pos)
{
  int index = 0;
  double biggest;

  while (reals[index] != 0)
    {
      if (reals[index] > biggest)
         {
           biggest = reals[index];
           pos = index + 1; // element 0 är element ett
         }
      index++;
    }
  return;
}

// finner den längsta sekvensen över ett tröskelvärde. Sista elementet i
// reals måste vara 0.

void sequence(double reals[], double treshold, int &pos,int &length)
{
  int templength = 0, startpos = 0, index = 0;
  pos = length = 0;
  while (reals[index] != 0)
    {
      if (reals[index] < treshold || reals[index+1] == 0)
         {
           templength = index - startpos;
           if (templength > length)
             {
               length=templength;
               pos = startpos + 1; // element 0 är element ett
             }
           startpos = ++index;
         }
      else
         {
           index++;
         }
    }
}

void ctrlc_exit(int val)
  // vänta 30 sekunder, och dö sedan

  cout << endl;
  cout << "Tryck ctrl-c, koppla ifrån terminalen, eller vänta 30 sekunder så avslutas programmet automatiskt";
  fflush(stdout);
  sleep(30);
  exit(val);
}

// end program