home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
telecomm
/
uemlsrc
/
cc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-08-24
|
12KB
|
316 lines
/* FILE: cc.c
* DATE: 27-Jan-1987
* Updated 07-01-1987 to allow wildcards and linking multiple
* files.
* Updated 27-01-1987 to allow assembling and/or compiling and
* to allow linking without compiling.
* AUTHOR: Robert Royar rdroya01@bitnet
* SYSTEM: Atari ST
* COMPILER: Alcyon v. 4.14
* PURPOSE: A simple minded compiler driver, no frills. (well, almost)
* USAGE: cc filename[s] (path must agree with cc.ini)
* the command line may contain wildcards as long as all
* source files are on the drive designated as the sdir in
* this file. Using the link option will cause the linker to
* look for a command file on the source directory. That link
* file should be named `foo.lnk' where `foo' is the name in
* the cc.ini file associated with the lnkfile value. The
* link file should tell the linker to place the output on the
* source dir if the relocation program is to find the
* `foo.68k' file and successfully create a `foo.prg' file.
* Calling the program without a command line and with dolink=1
* will force it to try to link the file `linkfile.68k' and
* then call relmod. Giving it a filename with an .s extent
* will skip the compiling and assemble the file. Files with
* .s extents and .c extents may be mixed on a line.
* DISTRIBUTION: Public Domain. Do with it what you will. Just leave
* the header intact.
*/
#include <stdio.h>
#include <osbind.h>
#include <ctype.h>
#include <errno.h>
unsigned long _STKSIZ = 16284; /* keep 16K */
/* These are the defaults. All of them can be over-ridden by values
* in the cc.ini file if that file is on the default drive and directory.
*/
char sdir[81] = "e:\\"; /* where the source files are */
char include[81] = "d:\\stdlib.h\\"; /* include files */
char tdir[81] = "m:\\"; /* temporary files (all of them) */
char bin[81] = "c:\\bin\\"; /* compiler directory */
char symb[81] = "c:\\bin\\"; /* as68 symbols */
char floflag[12] = " "; /* float ? */
char delflag[12] = "1"; /* delete temporary files */
char lnkflag[12] = "0"; /* link file[s] if == "1" */
char warn[12] = " "; /* make it -w to suppress warnings */
char syslib[81] = "c:\\bin\\"; /* drive to log for linker */
char lnk[81] = "out"; /* .68K and .lnk filename */
char fprg[81] = "out"; /* final output name */
char pname[81];
char command[81];
char source[81];
int temdrv;
char delfile[80];
int delete = 1;
int dolink = 0;
int doasm = FALSE;
char path[128];
int exec;
int curdrv;
char author[30] = "Robert Royar";
main(argc,argv)
register int argc;
char *argv[];
{
register char c, *ptr;
register int argnum;
char *index();
argnum = 1;
curdrv = (int)Dgetdrv(); /* 0 = A */
Dgetpath(path,(1+curdrv)); /* 1 = A */
if (access("cc.ini",4) != -1)
if (!inivar())
exit(-1);
if (argc == 1 && dolink == FALSE)
{
fprintf(stderr,"usage: %s filename[s]\n",argv[0]);
exit(-1);
}
if (argc == 1)
{
exec = linkfil();
goto out;
}
if (tdir[1] == ':')
{
c = (char)toupper(tdir[0]);
temdrv = (int)(c - 'A');
Dsetdrv(temdrv); /* Log into temp drive */
}
if((exec=(int)Dsetpath(tdir))!=0)
goto out;
while(--argc)
{
strcpy(source,argv[argnum++]);
if ((ptr=index(source,':'))!=NULL)
strcpy(source,++ptr);
/* If the file has an .s extent, then assemble it.
* Check the source dir first. If it's not there,
* check the temp dir. Set the doasm flag to fit
* the outcome, or break if no file found.
*/
if ((ptr=index(source,'.'))!=NULL)
{
*ptr = '\0'; /* don't let the extension through */
/* delete any existing .o files */
sprintf(delfile,"%s%s.o",tdir,source);
if (access(delfile,4)==NULL)
unlink(delfile);
++ptr;
if (*ptr != '\0')
{
*ptr = tolower(*ptr);
if (strcmp(ptr,"s")==NULL) /* assemb only */
{
sprintf(command,"%s%s.s",sdir,source);
if ((exec=access(command,4)) == -1)
{
sprintf(command,"%s%s.s",
tdir,source);
if ((exec=access(command,4))
== -1)
continue;
else /* this is a tdir file */
doasm = FALSE;
}
else /* this asm file is on sdir */
doasm = TRUE;
if ((exec=as())!=NULL)
goto out;
else
continue;
}
}
}
/* delete any existing .o files */
sprintf(delfile,"%s%s.o",tdir,source);
if (access(delfile,4)==NULL)
unlink(delfile);
doasm = FALSE;
sprintf(command,"%s%s.c",sdir,source);
if ((exec=access(command,4)) == -1)
break;
if ((exec=cc())!=NULL)
break;
}
if (dolink && (exec == NULL))
exec = linkfil();
out: Dsetdrv(curdrv);
Dsetpath(path);
exit(exec);
}
cc()
{
fprintf(stderr,"\nCompiling : %s%s.c\n",sdir,source);
sprintf(&command[1],"-i %s %s%s.c %s%s.i ",
include,sdir,source,tdir,source);
command[0] = (char)strlen(&command[1]);
sprintf(pname,"%sCP68.PRG",bin);
if((exec=(int)Pexec(0,pname,command,0L))!=0)
return(exec);
sprintf(&command[1],"%s%s.i %s%s.1 %s%s.2 %s%s.3 %s %s",
tdir,source,tdir,source,tdir,source,tdir,source,floflag,warn);
command[0] = (char)strlen(&command[1]);
sprintf(pname,"%sC068.PRG",bin);
if((exec=(int)Pexec(0,pname,command,0L))!=0)
return(exec);
if (delete)
{
sprintf(command,"%s%s.i",tdir,source);
unlink(command);
}
sprintf(&command[1],"%s%s.1 %s%s.2 %s%s.s",
tdir,source,tdir,source,tdir,source);
command[0] = (char)strlen(&command[1]);
sprintf(pname,"%sC168.PRG",bin);
if((exec=(int)Pexec(0,pname,command,0L))!=0)
return(exec);
sprintf(command,"%s%s.1",tdir,source);
unlink(command);
sprintf(command,"%s%s.2",tdir,source);
unlink(command);
exec = as();
return(exec);
}
as()
{
if (!doasm)
{
fprintf(stderr,"\nAssembling : %s%s.s\n",tdir,source);
sprintf(&command[1],"-l -u -s %s %s%s.s",bin,tdir,source);
}
else
{
fprintf(stderr,"\nAssembling : %s%s.s\n",sdir,source);
sprintf(&command[1],"-l -u -s %s %s%s.s",bin,sdir,source);
}
command[0] = (char)strlen(&command[1]);
sprintf(pname,"%sAS68.PRG",bin);
if((exec=(int)Pexec(0,pname,command,0L))!=0)
return(exec);
sprintf(command,"%s%s.o",tdir,source);
if ((exec=access(command,4))==NULL)
if (delete)
{
sprintf(command,"%s%s.s",tdir,source);
unlink(command);
}
return(exec);
}
linkfil()
{
register char c;
if (syslib[1] == ':')
{
c = (char)toupper(syslib[0]);
temdrv = (int) (c - 'A');
Dsetdrv(temdrv);
}
else
Dsetdrv(curdrv);
Dsetpath(syslib);
/* save disk write errors */
sprintf(delfile,"%s%s.68k",sdir,lnk);
if (access(delfile,4)==NULL)
unlink(delfile);
sprintf(delfile,"%s%s.prg",tdir,lnk);
if (access(delfile,4)==NULL)
unlink(delfile);
sprintf(source,"%s%s",sdir,lnk);
sprintf(pname,"%s%s",bin,"link68.ttp");
sprintf(&command[1],"[co[%s.lnk]]",source);
command[0] = (char)strlen(&command[1]);
if ((exec=Pexec(0,pname,command,0L))!=0)
return(exec);
sprintf(source,"%s%s.68K",sdir,lnk);
if ((exec=access(source,4))!=NULL)
return(exec);
sprintf(pname,"%s%s",tdir,lnk);
sprintf(&command[1],"%s %s",source,pname);
sprintf(pname,"%s%s",bin,"relmod.ttp");
command[0] = (char)strlen(&command[1]);
if ((exec=Pexec(0,pname,command,0L))!=0)
return(exec);
if ((exec=access(delfile,4))==NULL)
if (delete)
unlink(source);
return(exec);
}
inivar()
{
FILE *freopen();
char *gets(), *index();
register char *ptr;
static char line[81];
if (freopen("cc.ini","r",stdin) != stdin)
{
fprintf(stderr,"cc: cannot open %scc.ini\n",path);
return(0);
}
while (gets(line))
{
if ((ptr=index(line,' '))!=(char *)NULL)
*ptr = '\0';
if ((ptr=index(line,'\t'))!=(char *)NULL)
*ptr = '\0';
if ((ptr=index(line,'='))!=(char *)NULL)
*ptr = '\0';
else
continue;
++ptr;
if (strcmp(line,"source")==NULL)
strncpy(sdir,ptr,80);
else if (strcmp(line,"include")==NULL)
strncpy(include,ptr,80);
else if (strcmp(line,"temp")==NULL)
strncpy(tdir,ptr,80);
else if (strcmp(line,"bin")==NULL)
strncpy(bin,ptr,80);
else if (strcmp(line,"symb")==NULL)
strncpy(symb,ptr,80);
else if (strcmp(line,"syslib")==NULL)
strncpy(syslib,ptr,80);
else if (strcmp(line,"linkfile")==NULL)
strncpy(lnk,ptr,80);
else if (strcmp(line,"float")==NULL)
strncpy(floflag,ptr,3);
else if (strcmp(line,"warn")==NULL)
strncpy(warn,ptr,3);
else if (strcmp(line,"delete")==NULL)
{
strncpy(delflag,ptr,2);
if (strncmp(delflag,"0",1)==NULL)
delete = FALSE;
}
else if (strcmp(line,"dolink")==NULL)
{
strncpy(lnkflag,ptr,2);
if (strncmp(lnkflag,"1",1)==NULL)
dolink = TRUE;
}
else if (feof(stdin))
break;
}
return(1);
}