/* $VER: DiaPoem V2.2 (03 Jan 1994) */

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

#define __USE_SYSBASE

#include <proto/exec.h>
#include <proto/timer.h>
#include <proto/dos.h>

#define RandInt(lo,hi) (int)\
   ((lo)+((((long)((hi)-(lo)+1)*(long)(rand()&0x7fff))>>15) & 0x7fff))

#define MINOSVER 37

#define VERSION_NAG \
        "\t\nYou have neglected your responsibility to upgrade\n"\
        "\tyour system software to version 2.04 or greater!\n\n"

#define HEADER \
        "\x1b[1m[1;36mDIAPOEM V2.2\x1b[0m -- Strange Poem Generator\n"\
        "Written by Janne Saarme 1993/1994\n\n"\
        "Enter -> NewPoem / Stop DiaPoem -> Q or q and Enter.\n\n"

#define USAGE \
        "Usage: Poem <Words path and name>\n"\
        "Option -p: One poem without headers (for Dialog logout file).\n\n"

#define ERROR \
        "Error: Can not find WORDS. Check path and name.\n\n"

void tulostus(void);
void sulkemiset(void);

long n=0, adj, sub, ver, adv, obj;

char *adjektiivi[256], *substantiivi[256], *verbi[256], *adverbi[256], *objekti[256], buf[256], t, buf2;

char *copystring(char *s)
   {
   char *p;

   if(!(p=malloc(strlen(s)+1))) sulkemiset();
   s[strlen(s)-1] ='\0';
   
   return strcpy(p, s);
   }

BPTR console, f1;

void main(int argc, char **argv)
{
if(console=Open("*", MODE_OLDFILE))
   
if(((struct Library *)SysBase)->lib_Version<MINOSVER ||
   DOSBase->dl_lib.lib_Version<MINOSVER) {
     Write(console, VERSION_NAG, sizeof(VERSION_NAG));
     if(console) Close(console);
     exit(0);
     }

if((argc>1)&&(argv[1][0]=='?')) {
   Write(console, HEADER, sizeof(HEADER)-1);
   Write(console, USAGE, sizeof(USAGE)-1);
   sulkemiset();
   }

if(!(f1=Open(argv[1], MODE_OLDFILE))) {
   Write(console, ERROR, sizeof(ERROR)-1);
   sulkemiset();
   }

   while(FGets(f1, buf, 256)) {
      n++;
      adjektiivi[n]   = copystring(buf);
      substantiivi[n] = copystring(FGets(f1, buf, 256));
      verbi[n]        = copystring(FGets(f1, buf, 256));
      adverbi[n]      = copystring(FGets(f1, buf, 256));
      objekti[n]      = copystring(FGets(f1, buf, 256));
      } 
      
srand((long)time(NULL));

if(!strcmp(argv[2],"-p")) { 
   tulostus();
   if(CheckSignal(SIGBREAKF_CTRL_C)) sulkemiset();
   sulkemiset();
   }
  
   else
   
   {   
   
   Write(console, HEADER, sizeof(HEADER)-1);
   tulostus();

      while(1)
        {
        Write(console, "> ", 2);
        Read(console, &t, 1);

        if(CheckSignal(SIGBREAKF_CTRL_C)) sulkemiset();
        
        if(t!='\n') do Read(console, &buf2, 1); while(buf2!='\n'); 

          switch(t)
             {
             case 'q':
             sulkemiset();
             break; 
                          
             case 'Q':
             sulkemiset();
             break;
           
             case '\n':
             tulostus();
             break;
             }
         } 
   }
}

void tulostus()
  {
   adj = RandInt(1, n); 
   sub = RandInt(1, n);
   ver = RandInt(1, n); 
   adv = RandInt(1, n); 
   obj = RandInt(1, n);

   if(CheckSignal(SIGBREAKF_CTRL_C)) sulkemiset();
   
   Printf("%s %s %s %s %s\n", adjektiivi[adj], substantiivi[sub], verbi[ver], adverbi[adv], objekti[obj]); 
}

void sulkemiset()
  {
  if (f1)      Close(f1); 
  if (console) Close(console);
  exit(0);
}

