/* Copyright (c) 1986, Greg McGary */
static char sccsid[] = "@(#)opensrc.c	1.1 86/10/09";

#include	<stdio.h>
#include	"string.h"
#ifdef UNIX
#include	<sys/types.h>
#include	<sys/stat.h>
#endif

#ifdef AMIGA
#include <dos/dosextens.h>
#include <clib/dos_protos.h>
#include <pragmas/dos_pragmas.h>

extern struct DosLibrary *DOSBase;
#endif

FILE *openSrcFILE();
char *getSCCS();
char *coRCS();

FILE *
openSrcFILE(path, sccsDir, rcsDir)
	char		*path;
	char		*sccsDir;
	char		*rcsDir;
{
	char		*command = NULL;
	char		*what = NULL;
	char		*get = "get SCCS file";
	char		*checkout = "checkout RCS file";
	char		*dirName;
	char		*baseName;
	FILE		*srcFILE;

#ifdef UNIX
	if ((srcFILE = fopen(path, "r")) != NULL)
		return srcFILE;

	if ((baseName = strrchr(path, '/')) == NULL) {
		dirName = ".";
		baseName = path;
	} else {
		dirName = path;
		*baseName++ = '\0';
	}

	if (rcsDir && (command = coRCS(dirName, baseName, rcsDir)))
		what = checkout;
	else if (sccsDir && (command = getSCCS(dirName, baseName, sccsDir)))
		what = get;
	else if ((command = coRCS(dirName, baseName, "RCS"))
	     ||  (command = coRCS(dirName, baseName, ".")))
		what = checkout;
	else if ((command = getSCCS(dirName, baseName, "SCCS"))
	     ||  (command = getSCCS(dirName, baseName, "sccs"))
	     ||  (command = getSCCS(dirName, baseName, ".")))
		what = get;

	if (dirName == path)
		*--baseName = '/';

	if (!command) {
		filerr("open", path);
		return NULL;
	}

	system(command);
	if ((srcFILE = fopen(path, "r")) == NULL) {
		filerr("open", path);
		return NULL;
	}

	fprintf(stderr, "%s\n", command);
	return srcFILE;
#endif
#ifdef AMIGA
	char *anchor,sep;

	if ((srcFILE = fopen(path, "r")) != NULL)
		return srcFILE;

	baseName = FilePart(path);
	dirName = PathPart(path);

	if(dirName == path)
	{
		dirName = "";
		anchor = NULL;
	}
	else
	{
		anchor = dirName;
		sep = *anchor;

		*dirName = 0;
		dirName = path;
	}

	if (command = coRCS(dirName, baseName, rcsDir))
		what = checkout;

	if(anchor)
		*anchor = sep;

	if (!command) {
		filerr("open", path);
		return NULL;
	}

	Execute(command,NULL,NULL);
	if ((srcFILE = fopen(path, "r")) == NULL) {
		filerr("open", path);
		return NULL;
	}

	fprintf(stderr, "%s\n", command);
	return srcFILE;
#endif
}

char *
getSCCS(dir, base, sccsDir)
	char		*dir;
	char		*base;
	char		*sccsDir;
{
#ifdef UNIX
	static char	cmdBuf[BUFSIZ];
	char		fileBuf[BUFSIZ];
	struct stat	statBuf;

	if (!*sccsDir)
		sccsDir = ".";

	sprintf(fileBuf, "%s/%s/s.%s", dir, sccsDir, base);
	if (stat(fileBuf, &statBuf) < 0)
		return NULL;
	sprintf(cmdBuf, "cd %s; get -s %s/s.%s", dir, sccsDir, base);

	return cmdBuf;
#endif
#ifdef AMIGA
	return NULL;
#endif
}

char *
coRCS(dir, base, rcsDir)
	char		*dir;
	char		*base;
	char		*rcsDir;
{
#ifdef UNIX
	static char	cmdBuf[BUFSIZ];
	char		fileBuf[BUFSIZ];
	struct stat	statBuf;

	if (!*rcsDir)
		rcsDir = ".";

	sprintf(fileBuf, "%s/%s/%s,v", dir, rcsDir, base);
	if (stat(fileBuf, &statBuf) < 0)
		return NULL;
	sprintf(cmdBuf, "cd %s; co -q %s/%s,v", dir, rcsDir, base);

	return cmdBuf;
#endif
#ifdef AMIGA
	static char	cmdBuf[BUFSIZ];
	char		fileBuf[BUFSIZ];
	static char	rcs_drawer_name[BUFSIZ];
	char 		*result,*tail;

	result = NULL;

	if(!rcsDir)
	{
		BPTR FileLock;

		if(FileLock = Lock("RCS",SHARED_LOCK))
		{
			struct FileInfoBlock __aligned FileInfo;

			if(Examine(FileLock,&FileInfo))
			{
				if(FileInfo . fib_DirEntryType > 0)
					strcpy(rcsDir = rcs_drawer_name,"RCS");
			}

			UnLock(FileLock);
		}
	}

	if(!rcsDir)
	{
		FILE *in;

		if(in = fopen("rcs_link","rb"))
		{
			if(fgets(rcs_drawer_name,BUFSIZ-1,in))
				rcsDir = rcs_drawer_name;

			fclose(in);
		}
	}

	if(!rcsDir)
		rcsDir = "";

	strcpy(fileBuf,rcsDir);

	if(AddPart(fileBuf,base,BUFSIZ))
	{
		BPTR FileLock;

		if(FileLock = Lock(fileBuf,SHARED_LOCK))
		{
			struct FileInfoBlock __aligned FileInfo;

			if(Examine(FileLock,&FileInfo))
			{
				if(FileInfo . fib_DirEntryType < 0)
				{
					if(*dir)
						sprintf(result = cmdBuf,"cd \"%s\"\nco -q \"%s\"",dir,base);
					else
						sprintf(result = cmdBuf,"co -q \"%s\"",base);
				}
			}

			UnLock(FileLock);
		}
	}

	if(!result)
	{
		char suffixBuf[BUFSIZ];

		sprintf(suffixBuf,"%s,v",base);

		strcpy(fileBuf,rcsDir);

		if(AddPart(fileBuf,suffixBuf,BUFSIZ))
		{
			BPTR FileLock;

			if(FileLock = Lock(fileBuf,SHARED_LOCK))
			{
				struct FileInfoBlock __aligned FileInfo;

				if(Examine(FileLock,&FileInfo))
				{
					if(FileInfo . fib_DirEntryType < 0)
					{
						if(*dir)
							sprintf(result = cmdBuf,"cd \"%s\"\nco -q \"%s\"",dir,base);
						else
							sprintf(result = cmdBuf,"co -q \"%s\"",base);
					}
				}

				UnLock(FileLock);
			}
		}
	}

	return(result);
#endif
}
