/*******************************************************************************
* Concurrent Clean Simulator: simple_sun_io.c *
* =========================================== *
* At: Department of Computer Science *
* University of Nijmegen *
* Version: 1.1 *
******************************************************************************/
#include "system.h"
#if !defined (applec) || defined (__MWERKS__)
# include <sys/types.h>
# include <sys/file.h>
# include <sys/param.h>
#endif
#if !(defined (applec) || defined (_PC_))
# include <unistd.h>
#endif
char *GetFileExtension (FileKind kind)
{
switch (kind){
case abcFile: return ".abc";
case obj00File: return ".obj0";
case obj20File: return ".obj1";
case obj81File: return ".obj2";
case iclFile: return ".icl";
case dclFile: return ".dcl";
case dumpFile: return ".dmp";
case statFile: return ".stt";
case stasFile: return ".str";
case assFile: return ".a";
case sunAssFile: return ".s";
case helpFile:
case applFile:
case otherFile:
default: return "";
}
}
#define SEARCHPATH "CLEANPATH"
#ifdef SOLARIS
char clean_lib_directory[145] = "#$@CLEANLIB %*&.";
# define clean_lib_directory (&clean_lib_directory[16])
#else
char clean_lib_directory[129] = ".";
#endif
#define CLEANLIB clean_lib_directory
static int use_clean_system_files_folder=1;
char *PATHLIST = SEARCHPATH;
static Bool file_exists (char *path)
{
return access (path, F_OK) == 0;
}
extern char *path_parameter;
static Bool findfilepath (char *fname,FileKind kind,char *mode,char *path)
{
char *s,*path_elem,c,*pathlist,*ext;
int in_clean_system_files_folder;
if (path_parameter==NULL)
pathlist=getenv ("CLEANPATH");
else
pathlist=path_parameter;
if (pathlist==NULL)
pathlist=".";
ext = GetFileExtension (kind);
in_clean_system_files_folder=0;
if (use_clean_system_files_folder)
switch (kind){
case abcFile:
case obj00File:
case obj20File:
case obj81File:
in_clean_system_files_folder=1;
}
if (! (fname[0]=='/')){
path_elem = pathlist;
s=path_elem;
for (;;){
c = *s;
if (c == ':' || c == '\0'){
char *from_p,*dest_p;
from_p=path_elem;
dest_p=path;
while (from_p<s)
*dest_p++ = *from_p++;
*dest_p = '\0';
if (in_clean_system_files_folder)
strcat (path,"/Clean System Files/");
else
strcat (path,"/");
strcat (path,fname);
strcat (path,ext);
if (file_exists (path))
return True;
if (c == '\0')
break;
path_elem = ++s;
} else
++s;
}
}
if (in_clean_system_files_folder){
strcpy (path,"Clean System Files/");
strcat (path,fname);
} else
strcpy (path,fname);
strcat (path,ext);
return file_exists (path);
}
#if 0
static Bool findfilepath (char *fname, FileKind kind, char *mode, char *path)
{
int accmode;
char *s, *pathelem,c;
char *getenv ();
char *pathlist;
char pathbuf[MAXPATHLEN]; /* buffer for tmp file name */
char *ext;
accmode = F_OK; /* required file access mode */
pathlist = getenv (SEARCHPATH);
ext = GetFileExtension (kind);
/* only scan current directory if path nonexistent */
if (pathlist == (char *) 0)
pathlist = ".";
/* interpret file mode */
for (s = mode; *s; s++)
{ switch (*s)
{
case 'r':
accmode |= R_OK;
break;
case 'w':
case 'a':
accmode |= W_OK;
break;
case '+':
accmode |= (R_OK | W_OK);
break;
}
}
/* no searching on absolute paths or if not read only */
if (fname[0] == '/' || (accmode & W_OK) == W_OK)
{ (void) strcpy (path, fname);
(void) strcat (path, ext);
if ((accmode & W_OK) == W_OK || access (path, accmode) == 0)
return True;
else
return False;
}
/* start scanning path list */
s = strcpy (pathbuf, pathlist);
pathelem = s;
for (c = *s;;c = *s){
#if defined (OS2) || defined (DOS)
if (c == ';' || c == '\0'){
#else
if (c == ':' || c == '\0'){
#endif
*s = '\0';
(void) strcpy (path, pathelem);
(void) strcat (path, "/");
(void) strcat (path, fname);
(void) strcat (path, ext);
if (access (path, accmode) == 0)
return True;
*s = c;
if (c == '\0')
break;
pathelem = ++s;
}
else
++s;
}
/* try CLEANLIB */
strcpy (path, CLEANLIB);
strcat (path, "/");
strcat (path, fname);
strcat (path, ext);
if (access (path, accmode) == 0)
return True;
/* try . */
(void) strcpy (path, fname);
(void) strcat (path, ext);
return ((Bool) (access (path, accmode) == 0));
}
#endif
File FOpen (char *wname, FileKind kind, char *mode)
{
char path[MAXPATHLEN];
Bool res;
if (mode[0]=='r')
{
if (findfilepath (wname, kind, mode, path))
return (File) fopen (path, mode);
else
return (File) Null;
}
else
{
res=findfilepath (wname,dclFile,mode,path);
if (!res)
res=findfilepath (wname,iclFile,mode,path);
if (res){
char *p,*after_last_slash;
after_last_slash=NULL;
p=path;
while (*p)
if (*p++=='/')
after_last_slash=p;
if (after_last_slash==NULL)
after_last_slash=path;
if (use_clean_system_files_folder){
strcpy (after_last_slash,"Clean System Files");
if (access (path,F_OK)!=0){
if (mkdir (path,0777)!=0)
return NULL;
}
strcat (after_last_slash,"/");
strcat (after_last_slash,wname);
} else
strcpy (after_last_slash,wname);
strcat (after_last_slash,GetFileExtension (kind));
return fopen (path,mode);
} else
return NULL;
}
} /* FOpen */
int FClose (File f)
{
return fclose ((FILE *) f);
} /* FClose */
int FDelete (char *fname, FileKind kind)
{
char path[MAXPATHLEN];
Bool res;
res = findfilepath (fname, kind, "w", path);
if (res)
return remove (path);
else
return -1;
} /* FDelete */
#ifndef FPutC
int FPutC (int c, File f)
{
return fputc (c, (FILE *) f);
}
#endif
#ifndef FGetC
int FGetC (File f)
{
return fgetc ((FILE *) f);
}
#endif
int FPrintF (File f, char *fmt, ...)
{
int n;
va_list args;
va_start (args, fmt);
n = vfprintf ((FILE*)f, fmt, args);
va_end (args);
return n;
}
size_t FWrite (void *ptr, size_t size, size_t count, File f)
{
return fwrite (ptr, size, count, (FILE *) f);
}
size_t FRead (void *ptr, size_t size, size_t count, File f)
{
return fread (ptr, size, count, (FILE *) f);
}
#ifndef FGetS
char *FGetS (char *s, int n, File f)
{
return fgets (s, n, (FILE *) f);
}
#endif
int FPutS (char *s, File f)
{
return fputs (s, (FILE *) f);
} /* FPutS */
/*******************************************************************************
* Special for files *
******************************************************************************/
int FSeek (File f, long offset, int origin)
{
return fseek ((FILE *) f, offset, origin);
} /* FSeek */
long FTell (File f)
{
return ftell ((FILE *) f);
} /* FTell */
/*******************************************************************************
* Cursor movement *
******************************************************************************/
void FGotoXY (File f, int x, int y)
{
return;
}
void FGetXY (int *x, int *y, File f)
{
*x = *y = 0;
}
/*******************************************************************************
* Time Handling *
******************************************************************************/
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/stat.h>
#ifdef HP
# include <unistd.h>
# include <sys/times.h>
#endif
SysTime GetSysTime (unsigned scale)
{
/*
#ifndef HP
# ifdef OS2
unsigned long time;
SysTime t;
# define INCL_DOS
# include <os2emx.h>
DosQuerySysInfo (QSV_MS_COUNT,QSV_MS_COUNT,&time,sizeof (time));
if (scale>=1000)
t=(SysTime)(time * (unsigned long) (scale/1000));
else
t=(SysTime)((time * (unsigned long) scale)/1000);
return t;
# else
struct rusage usage;
SysTime t;
(void) getrusage (RUSAGE_SELF, &usage);
t = (SysTime) (usage.ru_utime.tv_sec * (unsigned long) scale +
usage.ru_utime.tv_usec / (unsigned long) (1000000L / scale));
return t;
# endif
#else
double clock_ticks_per_second;
struct tms time_buffer;
clock_ticks_per_second=sysconf (_SC_CLK_TCK);
times (&time_buffer);
return (SysTime) (((double)time_buffer.tms_utime * scale) / clock_ticks_per_second);
#endif
*/
return 0;
} /* GetSysTime */
void StopTimer (void)
{
} /* StopTimer */
void ResetTimer (void)
{
} /* ResetTimer */
FileTime FGetFileTime (char *fname, FileKind kind)
{ struct stat buf;
char path[MAXPATHLEN];
if (! findfilepath (fname, kind, "", path))
return NoFile;
stat (path, &buf);
return (FileTime) buf.st_mtime;
} /* FGetFileTime */
/*******************************************************************************
* *
* Error Handling *
* *
******************************************************************************/
void DoError (char *fmt, ...)
{ va_list args;
va_start (args, fmt);
(void) vfprintf (stderr, fmt, args);
va_end (args);
} /* DoError */
void DoFatalError (char *fmt, ...)
{ va_list args;
va_start (args, fmt);
(void) vfprintf (stderr, fmt, args);
va_end (args);
exit (0);
} /* DoFatalError */
void CmdError (char *errormsg,...)
{ va_list args;
va_start (args, errormsg);
fputs ("Command line error: ", stdout);
vfprintf (stdout, errormsg, args);
fputc ('\n', stdout);
va_end (args);
} /* CmdError */
/*******************************************************************************
* Interrupt Handling *
******************************************************************************/
#include <signal.h>
/* Special for the stand alone version of the Clean compiler:
No interrupthandler should be installed
*/
static void DoNothing (void)
{
} /* DoNothing */
void (*SetSignal (void (*f) (void))) (void)
{
return DoNothing;
} /* SetSignal */
int CheckInterrupt (void)
{
return 0;
} /* CheckInterrupt */
/*******************************************************************************
* Storage *
******************************************************************************/
void *Alloc (long unsigned count, SizeT size)
{
if (size == 1)
{ if (count >= MAXUNSIGNED)
DoFatalError ("Allocate: severe memory allocation problem");
return (void *) malloc ((size_t) count);
}
else if (count >= (MAXUNSIGNED / size))
DoFatalError ("Allocate: severe memory allocation problem");
return (void *) malloc ((size_t) (count * size));
} /* Alloc */
void Free (void *p)
{
(void) free (p);
} /* Free */