/* Init.c - Amiga specific initialization routines                     */
/* Copyright (c) 1990 by J.K. Lindsey                                  */
/* Additions to XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney     */
/* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz    */
/* You may give out copies of this software; for conditions see the    */
/* file COPYING included with this distribution.                       */

#include <proto/intuition.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <workbench/startup.h>
#include <exec/memory.h>
#include <stdlib.h>
#include <string.h>
#include "autil2.h"

#define V 33
extern struct IntuitionBase *IntuitionBase;
extern struct MathBase *MathBase;
extern struct MathTransBase *MathTransBase;
extern struct GfxBase *GfxBase;
struct DosBase *DosBase;
struct IconBase *IconBase;

openlibs(){
   IntuitionBase=0; MathBase=0; MathTransBase=0; GfxBase=0;
   IconBase=0; DosBase=0;
   if(!(DosBase=(struct DosBase *)OpenLibrary("dos.library",V)))return(1);
   if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary(
   "intuition.library",V)))return(1);
   if(!(IconBase=(struct IconBase *)OpenLibrary("icon.library",V)))return(1);
   if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",V)))return(1);
   if(!(MathBase=(struct MathBase *)OpenLibrary("mathffp.library",V)))return(1);
   if(!(MathTransBase=(struct MathTransBase *)OpenLibrary(
   "mathtrans.library",V)))return(1);
   return(0);}
void closelibs(){
   if(MathTransBase)CloseLibrary((struct Library *)MathTransBase);
   if(MathBase)CloseLibrary((struct Library *)MathBase); 
   if(GfxBase)CloseLibrary((struct Library *)GfxBase);
   if(IconBase)CloseLibrary((struct Library *)IconBase);
   if(IntuitionBase)CloseLibrary((struct Library *)IntuitionBase);
   if(DosBase)CloseLibrary((struct Library *)DosBase);}

extern struct WBStartup *WBenchMsg;
int FindRoot(BPTR,char []);
void SplitName(char []); 

FindStart(argc,argv,start,project,defdir)
int *argc;
unsigned char *argv[];
char start[],project[],defdir[];{
   BPTR lock,plock;
   short Cli;
   int i;
   struct WBArg *arg;
   char buffer[80];
   if(*argc){
      Cli=1;
      plock=Lock(argv[0],ACCESS_READ);
      lock=ParentDir(plock);
      UnLock(plock);
      SplitName(argv[0]);}
   else {
      Cli=0;
      *argc=WBenchMsg->sm_NumArgs;
      arg=WBenchMsg->sm_ArgList;
      lock=arg->wa_Lock;
      for(i=0;i<*argc;i++,arg++){
         if(!(argv[i]=malloc(strlen(arg->wa_Name)+1)))return(1);
         strcpy(argv[i],arg->wa_Name);
         if(i==1)CurrentDir(arg->wa_Lock);}}
   if(!Cli&&(*argc>1))start[0]=0;
   else if(FindRoot(lock,start))return(0);
   if(Cli)UnLock(lock);
   strcat(start,argv[0]);
   if((*argc)>1){
      if(Cli){
         for(i=1;i<*argc;i++)if(argv[i][0]!='-'){
            if(lock=Lock(argv[i],ACCESS_READ)){
               plock=ParentDir(lock);
               UnLock(lock);
               strcpy(buffer,argv[i]);
               SplitName(buffer);
               if(FindRoot(plock,defdir))return(1);
               UnLock(plock);
               strcpy(project,defdir);
               strcat(project,buffer);}
            break;}}
      else {
         strcpy(project,argv[1]);
         defdir[0]=0;}}
   if(*argc==1)defdir[0]=project[0]=0;
   return(0);}

static FindRoot(lock,dir)
BPTR lock;
char dir[];{
   struct FileInfoBlock *FInfo;
   BPTR plock;
   short i;
   char temp[50];
   temp[0]=0;
   if(!(FInfo=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),
   MEMF_PUBLIC)))return(1);
   i=0;
   while(plock=ParentDir(lock)){
      Examine(lock,FInfo);
      if(i)UnLock(lock);
      else i=1;
      lock=plock;
      strcpy(dir,FInfo->fib_FileName);
      strcat(dir,"/");
      strcat(dir,temp);
      strcpy(temp,dir);}
   Examine(lock,FInfo);
   if(i)UnLock(lock);
   strcpy(dir,FInfo->fib_FileName);
   strcat(dir,":");
   strcat(dir,temp);
   FreeMem((char *)FInfo,sizeof(struct FileInfoBlock));
   return(0);}

static void SplitName(fn)
char fn[];{
   int i,j,k;
   for(i=(k=strlen(fn))-1;i>=0;i--)if(fn[i]=='/'||fn[i]==':')break;
   for(j=i+1;j<=k;j++)fn[j-i-1]=fn[j];}