home *** CD-ROM | disk | FTP | other *** search
- /* 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];}