program Tehtava63(input, output);

{---------------------------------------------------------------
Komennot ovat:
     V  "vie varastoon", komentorivillä on V-kirjaimen lisäksi
        varastoon lisättävien tuotteiden lukumäärä kokonaislukuna,
     O  "ota varastosta", rivillä on myös otettavien lukumäärä
        (jos varastossa ei ole pyydettyä määrää, annetaan mitä 
         voidaan ja ilmoitetaan tuotten loppumisesta; ohjelman 
         suoritus ei silti pääty, voihan jo seuraava komento olla V),
     T  "tulosta varastotilanne",
     L  "lopeta ohjelman suoritus".

  LAAJENNETAAN VÄHÄN:
     H tai ?  "anna apua", ts. 'helppi'
     ' '      "tyhjä komento" 

  SALLITAAN MYÖS PIENET KIRJAIMET KOMENTOINA

  Kokonaisluvut luetaan turvallisesti tehtävän 6.4
  välineellä, etumerkki kuitenkin estetty
------------------------------------------------------------------}

  var varasto: integer;
      komento: char;
      loppuu: boolean;

procedure LuePosInteger(var OK: boolean; var arvo: integer);
  var merkki: char;
begin
  OK := false;
  arvo := 0;
  if not eof then
    begin
      read(merkki);
      while (merkki = ' ') and not eof do
        read(merkki);
      if merkki in ['0'..'9'] then
        begin
          OK := true;
          repeat
            arvo := 10*arvo + (ord(merkki)-ord('0'));
            read(merkki)
          until not(merkki in ['0'..'9']);
        end;
    end;
end;

procedure Vienti;
  var maara: integer;
      kunnossa: boolean;
begin
  repeat
    LuePosInteger(kunnossa, maara);
    if not kunnossa then
      begin 
        readln;
        writeln('Lisättävä määrä väärin, syötä se uudelleen!');
      end;
  until kunnossa;
  writeln('Lisätään varastoon ', maara:1, ' tuotetta.');
  varasto := varasto + maara;
end {Vienti};

procedure Otto;
  var maara: integer;
      kunnossa: boolean;
 begin
   repeat
     LuePosInteger(kunnossa, maara);
     if not kunnossa then
       begin 
         readln;
         writeln('Otettava määrä väärin, syötä se uudelleen!');
       end;
   until kunnossa;
   if maara <= varasto then 
     begin
       writeln('Otetaan varastosta ', maara:1, ' tuotetta.');
       varasto := varasto - maara;
     end
   else
     begin
       writeln('Varastossa ei ole tarpeeksi!');
       writeln('Otetaan varastosta vain ', varasto:1, ' tuotetta.');
       varasto := 0;
     end;
end {Otto};

procedure Tilanne;
begin
  readln;
  writeln('Varastossa on ', varasto:1, ' tuotetta.');
end {Tilanne};

procedure Loppu;
begin 
  readln;
  writeln('Varastoon jäi ',varasto:1, ' tuotetta.');
  writeln('Näkemiin!');  {myöhemmin tallennet. tiedostoon!}
  loppuu := true;
end {Loppu};

procedure Apua;
begin 
  readln;
  writeln;
  writeln('Komennot ovat: V määrä, O määrä, T, L ja H');
  writeln('               V m      lisää varastoon  m tuotetta');
  writeln('               O m      ottaa varastosta m tuotetta');
  writeln('               T        tulostaa varastotilanteen');
  writeln('               L        lopettaa ohjelman');
  writeln('               H ja ?   tulostaa tämän ohjeen');
  writeln('               (myös pienet kirjaimet kelpaavat)');
  writeln;
end {Apua};

procedure Alkutoimet;
begin
  writeln;
  writeln('Varastokirjanpito-ohjelma');
  writeln('*************************');
  writeln;
  writeln('Komennolla H (tai h tai ?) saat apua.');
  writeln;
  varasto := 0;   {myöhemmin luetaan tiedostosta!}
end {Alkutoimet};

function Oikein(kom: char): boolean;
begin
  if kom in [' ','V','v','O','o','T','t','L','l','H','h','?'] then 
    Oikein := true
  else
    begin
      writeln('         ^--- Virheellinen komento! ');
      Apua;
      Oikein := false
    end;      
end {Oikein};


begin
  Alkutoimet;
  loppuu := false;
  repeat 
    write('varasto> ');
    read(komento);
    if Oikein(komento) then
      case komento of
        'V', 'v'    : Vienti;
        'O', 'o'    : Otto;
        'T', 't'    : Tilanne;
        'L', 'l'    : Loppu;
        'H','h','?' : Apua;
        ' '         : {tyhjä komento!};
      end {case};
  until loppuu;
end.

