This commit is contained in:
ceriel
1991-10-25 18:23:32 +00:00
parent 035d9f7624
commit 45afd0804b
20 changed files with 2371 additions and 0 deletions

5
fast/driver/.distr Normal file
View File

@@ -0,0 +1,5 @@
afcc.1
afm2.1
afpc.1
driver.c
proto.make

136
fast/driver/afcc.1 Normal file
View File

@@ -0,0 +1,136 @@
.TH AFCC 1
.SH NAME
afcc \- fast ACK compatible ANSI C compiler
.SH SYNOPSIS
.B afcc
[
.B \-c
]
[
.B \-v
]
[
.B \-vn
]
[ \fB\-D\fIname\fR ]
[ \fB\-D\fIname\fB=\fIdef\fR ]
[
.BI \-I pathname
]
[
.B \-w
]
[
.B \-o
.I outfile
]
[
.BI \-U name
]
[
.BI -M compiler
]
.I sourcefile ...
.SH DESCRIPTION
.LP
.I Afcc
is a fast
.B C
compiler. It translates
.B C
programs
into ack(1)-compatible relocatable object modules, and does so in one pass.
Then, if the \fB\-c\fP flag is not given,
.I afcc
offers the object modules to a link-editor,
to create an executable binary.
.LP
.I Afcc
accepts several types of filename arguments. Files with
names ending in
.B .c
are taken to be
.B C
source programs.
They are compiled, and the resulting object module is placed in the current
directory.
The object module is named after its source file, the suffix
.B .o
replacing
.BR .c
in the name of the object.
.LP
Other arguments refer to loader options,
object modules, or object libraries.
Unless the
.B \-c
flag is given, these modules and libraries, together with the results of any
specified compilations, are passed (in the order given) to the
link-editor to produce
an output file named
.IR a.out .
You can specify a name for the executable by using the
.B \-o
option.
.SH OPTIONS
.LP
.IP \fB\-c\fP
.br
Suppress the loading phase of the compilation, and force an object module to
be produced, even if only one program is compiled.
A single object module can be named explicitly using the
.B \-o
option.
.IP \fB\-D\fIname\fR\fB=\fIdef\fR
Define a symbol
.I name
to the
preprocessor, as if by "#define".
.IP \fB\-D\fIname\fR
.br
same as \fB\-D\fIname\fB=1\fR.
.IP \fB\-I\fIpathname\fR
.br
Add
.I pathname
to the list of directories in which to search for
.B #include
files with filenames not beginning with slash.
The compiler first searches for
.B #include
files in the directory containing
.I sourcefile,
then in directories in
.B \-I
options, then in the ACK include directory,
and finally, in
.I /usr/include.
.IP "\fB\-o \fIoutput\fR"
Name the final output file
.I output.
.IP \fB\-U\fIname\fR
.br
Remove any initial definition of
.I name.
.IP \fB\-v\fP
.br
Verbose. Print the commands as they are executed.
.IP \fB\-vn\fP
.br
Verbose, no execute. Only print the commands, do not execute them.
.IP \fB\-w\fP
suppress warning messages.
.IP \fB\-M\fIcompiler\fR
.br
use \fIcompiler\fR as C compiler instead of the default.
.LP
Object modules produced by ack(1) and
.I afcc
can be freely mixed.
.SH "SEE ALSO"
.IP [1]
B.W. Kernighan, D. Ritchie, "\fIThe C programming Language\fP", Prentice-Hall Inc., 1978
.IP [2]
ack(1) manual page.
.SH DIAGNOSTICS
Diagnostics are intended to be self-explanatory.

201
fast/driver/afm2.1 Normal file
View File

@@ -0,0 +1,201 @@
.TH FM2 1
.SH NAME
afm2 \- fast ACK compatible Modula-2 compiler
.SH SYNOPSIS
.B afm2
[
.B \-c
]
[
.B \-v
]
[
.B \-vn
]
[ \fB\-D\fIname\fR ]
[ \fB\-D\fIname\fB=\fIdef\fR ]
[
.BI \-I pathname
]
[
.BI \-w classes
]
[
.BI \-W classes
]
[
.B \-L
]
[
.B \-o
.I outfile
]
[
.B \-R
]
[
.B \-A
]
[
.B \-3
]
[
.B \-_
]
[
.BI \-U name
]
[
.BI -M compiler
]
.I sourcefile ...
.SH DESCRIPTION
.LP
.I afm2
is a fast
.B Modula-2
compiler. It translates
.B Modula-2
programs
into ack(1)-compatible relocatable object modules, and does so in one pass.
Then, if the \fB\-c\fP flag is not given,
.I afm2
offers the object modules to a link-editor,
to create an executable binary.
.LP
.I Afm2
accepts several types of filename arguments. Files with
names ending in
.B .mod
are taken to be
.B Modula-2
source programs.
They are compiled, and the resulting object module is placed in the current
directory.
The object module is named after its source file, the suffix
.B .o
replacing
.BR .mod
in the name of the object.
A file with suffix
.B .mod
is passed through the C preprocessor if it begins with a '#'.
.PP
Definition modules are not separately compiled. The compiler reads them when
it needs them.
Definition modules are expected to reside in files with names ending
in
.BR .def .
The name of the file in which a definition module is stored must be the same as
the module-name, apart from the extension.
Also, in most Unix systems filenames are only 14 characters long.
So, given an IMPORT declaration for a module called "LongModulName",
the compiler will try to open a file called "LongModulN.def".
The requirement does not hold for implementation or program modules,
but is certainly recommended.
.LP
Other arguments refer to loader options,
object modules, or object libraries.
Unless the
.B \-c
flag is given, these modules and libraries, together with the results of any
specified compilations, are passed (in the order given) to the
link-editor to produce
an output file named
.IR a.out .
You can specify a name for the executable by using the
.B \-o
option.
.SH OPTIONS
.LP
.IP \fB\-c\fP
.br
Suppress the loading phase of the compilation, and force an object module to
be produced, even if only one program is compiled.
A single object module can be named explicitly using the
.B \-o
option.
.IP \fB\-D\fIname\fR\fB=\fIdef\fR
Define a symbol
.I name
to the
preprocessor, as if by "#define".
.IP \fB\-D\fIname\fR
.br
same as \fB\-D\fIname\fB=1\fR.
.IP \fB\-I\fIpathname\fR
.br
Add
.I pathname
to the list of directories in which to search for
.B #include
files with filenames not beginning with slash.
The preprocessor first searches for
.B #include
files in the directory containing
.I sourcefile,
then in directories in
.B \-I
options, then in the ACK include directory,
and finally, in
.I /usr/include.
This flag is also passed to the compiler. When the compiler needs a definition
module, it is first searched for in the current directory, then in the
directories given to it by the \fB\-I\fP flag, and then in a default directory,
.I $TARGET_HOME/lib/m2.
.I afm2
This default directory contains all definition modules of
the runtime system.
.IP "\fB\-o \fIoutput\fR"
Name the final output file
.I output.
.IP \fB\-U\fIname\fR
.br
Remove any initial definition of
.I name.
.IP \fB\-v\fP
.br
Verbose. Print the commands as they are executed.
.IP \fB\-vn\fP
.br
Verbose, no execute. Only print the commands, do not execute them.
.IP \fB\-L\fR
do not generate code to keep track of
the current location in the source code.
.IP \fB\-w\fR\fIclasses\fR
suppress warning messages whose class is a member of \fIclasses\fR.
Currently, there are three classes: \fBO\fR, indicating old-flashioned use,
\fBW\fR, indicating "ordinary" warnings, and \fBR\fR, indicating
restricted Modula-2.
If no \fIclasses\fR are given, all warnings are suppressed.
By default, warnings in class \fBO\fR and \fBW\fR are given.
.IP \fB\-W\fR\fIclasses\fR
allow for warning messages whose class is a member of \fIclasses\fR.
.IP \fB\-R\fP
.br
disable all range-checks.
.IP \fB\-A\fP
.br
enable extra array bound checks. Unfortunately, the back-end used for this
compiler is a bit sloppy, so extra array bound checks are needed if you want
detection of array bound errors.
.IP \fB\-3\fP
.br
Only accept Modula-2 programs that strictly conform to the 3rd Edition of
[1].
.IP \fB\-_\fP
.br
allow for underscores within identifiers. Identifiers may not start or end
with an underscore, even if this flag is given.
.IP \fB\-M\fIcompiler\fR
.br
use \fIcompiler\fR as Modula-2 compiler instead of the default.
.SH "SEE ALSO"
.IP [1]
N. Wirth, \fIProgramming in Modula-2\fP, 3rd edition, Springer Verlag.
.IP [2]
C.J.H. Jacobs, \fIThe ACK Modula-2 Compiler\fP.
.IP [3]
ack(1) unix manual page.
.SH DIAGNOSTICS
Diagnostics are intended to be self-explanatory.

219
fast/driver/afpc.1 Normal file
View File

@@ -0,0 +1,219 @@
.TH AFPC 1
.SH NAME
afpc \- fast ACK compatible Pascal compiler
.SH SYNOPSIS
.B afpc
[
.B \-c
]
[
.B \-v
]
[
.B \-vn
]
[ \fB\-D\fIname\fR ]
[ \fB\-D\fIname\fB=\fIdef\fR ]
[
.BI \-I pathname
]
[
.B \-w
]
[
.B \-L
]
[
.B \-o
.I outfile
]
[
.B \-R
]
[
.B \-A
]
[
.B \-a
]
[
.B \-d
]
[
.BI \-i num
]
[
.B \-t
]
[
.B \-C
]
[
.B \-U+
]
[
.B \-u+
]
[
.B \-s+
]
[
.B \-c+
]
[
.BI \-U name
]
[
.BI -M compiler
]
.I sourcefile ...
.SH DESCRIPTION
.LP
.I afpc
is a fast
.B Pascal
compiler. It translates
.B Pascal
programs
into ack(1)-compatible relocatable object modules, and does so in one pass.
Then, if the \fB\-c\fP flag is not given,
.I afpc
offers the object modules to a link-editor,
to create an executable binary.
.LP
.I Fpc
accepts several types of filename arguments. Files with
names ending in
.B .p
are taken to be
.B Pascal
source programs.
They are compiled, and the resulting object module is placed in the current
directory.
The object module is named after its source file, the suffix
.B .o
replacing
.BR .p
in the name of the object.
A file with suffix
.B .p
is passed through the C preprocessor if it begins with a '#'.
.LP
Other arguments refer to loader options,
object modules, or object libraries.
Unless the
.B \-c
flag is given, these modules and libraries, together with the results of any
specified compilations, are passed (in the order given) to the
link-editor to produce
an output file named
.IR a.out .
You can specify a name for the executable by using the
.B \-o
option.
.LP
If a single
.B Pascal
program is compiled and loaded all at once, the object module
file is deleted.
.SH OPTIONS
.LP
.IP \fB\-c\fP
.br
Suppress the loading phase of the compilation, and force an object module to
be produced, even if only one program is compiled.
A single object module can be named explicitly using the
.B \-o
option.
.IP \fB\-D\fIname\fR\fB=\fIdef\fR
Define a symbol
.I name
to the
preprocessor, as if by "#define".
.IP \fB\-D\fIname\fR
.br
same as \fB\-D\fIname\fB=1\fR.
.IP \fB\-I\fIpathname\fR
.br
Add
.I pathname
to the list of directories in which to search for
.B #include
files with filenames not beginning with slash.
The preprocessor first searches for
.B #include
files in the directory containing
.I sourcefile,
then in directories in
.B \-I
options, and finally, in
.I /usr/include.
.IP "\fB\-o \fIoutput\fR"
Name the final output file
.I output.
.IP \fB\-U\fIname\fR
.br
Remove any initial definition of
.I name.
.IP \fB\-v\fP
.br
Verbose. Print the commands as they are executed.
.IP \fB\-vn\fP
.br
Verbose, no execute. Only print the commands, do not execute them.
.IP \fB\-L\fP
.br
do not generate code to keep track of
the current location in the source code.
.IP \fB\-w\fP
.br
suppress warning messages.
.IP \fB\-d\fP
.br
allow for "long"s.
.IP \fB\-i\fInum\fR
.br
set size for integer sets. By default, the set size is the word size.
.IP \fB\-C\fP
.br
distinguish between lower case and upper case. Normally, upper case letters
are considered equal to their lower case counterpart.
.IP \fB\-t\fP
.br
trace calls and exits of procedures and functions.
.IP \fB\-R\fP
.br
disable all range-checks.
.IP \fB\-A\fP
.br
enable extra array bound checks. Unfortunately, the back-end used for this
compiler is a bit sloppy, so extra array bound checks are needed if you want
detection of array bound errors.
.IP \fB\-a\fP
.br
disable assertions. Assertions are skipped instead of evaluated.
.IP "\fB\-U+\fP, \fB\-u+\fP"
.br
allow for underscores within identifiers. Identifiers may not start
with an underscore, even if this flag is given.
.IP \fB-s+\fP
.br
allow only standard
.BR Pascal .
This disables the \fB\-c+\fP, \fB\-d\fR, \fB\-u+\fR,
\fB\-U+\fR and \fB\-C\fR options.
Furthermore, assertions are not recognized at all.
.IP \fB-c+\fP
.br
allow C-like strings. This option is mainly intended for usage with
C-functions. This option will cause the type 'string' to be known.
.IP \fB\-M\fIcompiler\fR
.br
use \fIcompiler\fR as Modula-2 compiler instead of the default.
.SH "SEE ALSO"
.IP [1]
J.W. Stevenson, H. v. Eck, \fIAmsterdam Compiler Kit-Pascal reference manual\fP.
.IP [2]
ack(1) unix manual page.
.SH DIAGNOSTICS
Diagnostics are intended to be self-explanatory.

654
fast/driver/driver.c Normal file
View File

@@ -0,0 +1,654 @@
/* fcc/fm2/fpc
Driver for fast ACK compilers.
Derived from the C compiler driver from Minix.
Compile this file with
cc -O -I<ACK home directory>/config -DF?? driver.c
where F?? is either FCC, FPC, or FM2.
Install the resulting binaries in the EM bin directory.
Suggested names: afcc, afm2, and afpc.
*/
#if FM2+FPC+FCC > 1
Something wrong here! Only one of FM2, FPC, or FCC must be defined
#endif
#include <errno.h>
#include <signal.h>
#include <varargs.h>
#include <stdio.h>
#include <em_path.h>
#define M2DEF "/lib/m2"
#define FASTDIR EM_DIR
#define BINDIR "/lib.bin/"
#define CCINCL "/include/tail_ac"
char *ROOT_DIR = FASTDIR;
/*
Version producing ACK .o files in one pass.
*/
#define MAXARGC 256 /* maximum number of arguments allowed in a list */
#define USTR_SIZE 128 /* maximum length of string variable */
typedef char USTRING[USTR_SIZE];
USTRING INCLUDE = "-I";
struct arglist {
int al_argc;
char *al_argv[MAXARGC];
};
#define CPP "*cpp"
#define LD "*../bin/ack"
#define SHELL "/bin/sh"
int kids = -1;
int ecount = 0;
struct arglist CPP_FLAGS = {
7,
{
"-D__unix",
"-D_EM_WSIZE=4",
"-D_EM_PSIZE=4",
"-D_EM_SSIZE=2",
"-D_EM_LSIZE=4",
"-D_EM_FSIZE=4",
"-D_EM_DSIZE=8",
}
};
struct arglist COMP_FLAGS;
char *o_FILE = "a.out"; /* default name for executable file */
#define remove(str) ((noexec || unlink(str)), (str)[0] = '\0')
#define cleanup(str) (str && str[0] && remove(str))
#define init(al) ((al)->al_argc = 1)
char ProgCall[128];
struct arglist SRCFILES;
struct arglist LDFILES;
struct arglist GEN_LDFILES;
int RET_CODE = 0;
struct arglist LD_FLAGS;
struct arglist CALL_VEC;
int o_flag = 0;
int c_flag = 0;
int v_flag = 0;
int O_flag = 0;
char *mkstr();
char *malloc();
char *alloc();
char *extension();
USTRING ofile;
USTRING BASE;
USTRING tmp_file;
int noexec = 0;
extern char *strcat(), *strcpy(), *mktemp(), *strchr();
trapcc(sig)
int sig;
{
signal(sig, SIG_IGN);
if (kids != -1) kill(kids, sig);
cleanup(ofile);
cleanup(tmp_file);
exit(1);
}
#ifdef FCC
#define lang_suffix() "c"
#define comp_name() "*c_ce"
#endif FCC
#ifdef FM2
#define lang_suffix() "mod"
#define comp_name() "*m2_ce"
#endif FM2
#ifdef FPC
#define lang_suffix() "p"
#define comp_name() "*pc_ce"
#endif FPC
#ifdef FCC
int
lang_opt(str)
char *str;
{
switch(str[1]) {
case '-': /* debug options */
case 'w': /* disable warnings */
if (str[2]) {
char buf[3];
buf[2] = '\0';
buf[0] = '-';
buf[1] = str[2];
append(&COMP_FLAGS, buf);
}
else append(&COMP_FLAGS, "-a");
return 1;
}
return 0;
}
#endif FCC
#ifdef FM2
int
lang_opt(str)
char *str;
{
switch(str[1]) {
case '-': /* debug options */
case 'w': /* disable warnings */
case 'R': /* no runtime checks */
case 'W': /* add warnings */
case 'L': /* no line numbers */
case 'A': /* extra array bound checks */
case '3': /* only accept 3rd edition Modula-2 */
append(&COMP_FLAGS, str);
return 1;
case 'I':
append(&COMP_FLAGS, str);
break; /* !!! */
case 'U': /* underscores in identifiers allowed */
if (str[2] == '\0') {
append(&COMP_FLAGS, str);
return 1;
}
break;
case 'e': /* local extension for Modula-2 compiler:
procedure constants
*/
str[1] = 'l';
append(&COMP_FLAGS, str);
return 1;
}
return 0;
}
#endif FM2
#ifdef FPC
int
lang_opt(str)
char *str;
{
switch(str[1]) {
case '-': /* debug options */
case 'a': /* enable assertions */
case 'd': /* allow doubles (longs) */
case 'i': /* set size of integer sets */
case 't': /* tracing */
case 'w': /* disable warnings */
case 'A': /* extra array bound checks */
case 'C': /* distinguish between lower case and upper case */
case 'L': /* no FIL and LIN instructions */
case 'R': /* no runtime checks */
append(&COMP_FLAGS, str);
return 1;
case 'u':
case 'U':
/* underscores in identifiers */
case 's':
/* only compile standard pascal */
case 'c':
/* C type strings */
if (str[2] == '+' && str[3] == '\0') {
str[2] = 0;
append(&COMP_FLAGS, str);
return 1;
}
}
return 0;
}
#endif FPC
main(argc, argv)
char *argv[];
{
char *str;
char **argvec;
int count;
char *ext;
register struct arglist *call = &CALL_VEC;
char *file;
char *ldfile = 0;
USTRING COMP;
int compile_cnt = 0;
setbuf(stdout, (char *) 0);
basename(*argv++,ProgCall);
strcat(INCLUDE, ROOT_DIR);
#ifdef FM2
strcat(INCLUDE, M2DEF);
#endif FM2
#ifdef FCC
strcat(INCLUDE, CCINCL);
#endif FCC
#ifdef FPC
INCLUDE[0] = '\0';
#endif FPC
strcpy(COMP,comp_name());
#ifdef vax4
append(CPP_FLAGS, "-D__vax");
#endif
#ifdef sun3
append(CPP_FLAGS, "-D__sun");
#endif
#ifdef m68020
append(CPP_FLAGS, "-D__mc68020");
append(CPP_FLAGS, "-D__mc68000");
#endif
if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
signal(SIGHUP, trapcc);
if (signal(SIGINT, SIG_IGN) != SIG_IGN)
signal(SIGINT, trapcc);
if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)
signal(SIGQUIT, trapcc);
while (--argc > 0) {
if (*(str = *argv++) != '-') {
append(&SRCFILES, str);
continue;
}
if (lang_opt(str)) {
}
else switch (str[1]) {
case 'c': /* stop after producing .o files */
c_flag = 1;
break;
case 'D': /* preprocessor #define */
case 'U': /* preprocessor #undef */
append(&CPP_FLAGS, str);
break;
case 'I': /* include directory */
append(&CPP_FLAGS, str);
break;
case 'o': /* target file */
if (argc-- >= 0) {
o_flag = 1;
o_FILE = *argv++;
ext = extension(o_FILE);
if (ext != o_FILE && ! strcmp(ext, lang_suffix())
) {
error("-o would overwrite %s", o_FILE);
}
append(&LD_FLAGS, "-o");
append(&LD_FLAGS, o_FILE);
}
break;
case 'O': /* use built in peephole optimizer */
O_flag = 1;
break;
case 'v': /* verbose */
v_flag++;
if (str[2] == 'n')
noexec = 1;
break;
case 'l': /* library file */
append(&SRCFILES, str);
break;
case 'M': /* use other compiler (for testing) */
strcpy(COMP, str+2);
break;
default:
append(&LD_FLAGS, str);
break;
}
}
if (ecount) exit(1);
count = SRCFILES.al_argc;
argvec = &(SRCFILES.al_argv[0]);
while (count-- > 0) {
ext = extension(*argvec);
if (*argvec[0] != '-' &&
ext != *argvec++ && (! strcmp(ext, lang_suffix())
)) {
compile_cnt++;
}
}
if (compile_cnt > 1 && c_flag && o_flag) {
warning("-o flag ignored");
o_flag = 0;
}
count = SRCFILES.al_argc;
argvec = &(SRCFILES.al_argv[0]);
while (count-- > 0) {
register char *f;
basename(file = *argvec++, BASE);
ext = extension(file);
if (file[0] != '-' &&
ext != file && (!strcmp(ext, lang_suffix())
)) {
if (compile_cnt > 1) printf("%s\n", file);
ldfile = c_flag ? ofile : alloc((unsigned)strlen(BASE)+3);
if (
#ifdef FCC
!strcmp(ext, "s") &&
#endif
needsprep(file)) {
strcpy(tmp_file, TMP_DIR);
strcat(tmp_file, "/F_XXXXXX");
mktemp(tmp_file);
init(call);
append(call, CPP);
concat(call, &CPP_FLAGS);
append(call, INCLUDE);
append(call, file);
if (runvec(call, tmp_file)) {
file = tmp_file;
}
else {
remove(tmp_file);
tmp_file[0] = '\0';
continue;
}
}
init(call);
if (o_flag && c_flag) {
f = o_FILE;
}
else f = mkstr(ldfile, BASE, ".o", (char *)0);
append(call, COMP);
#ifdef FCC
concat(call, &CPP_FLAGS);
#endif
concat(call, &COMP_FLAGS);
#if FM2 || FCC
append(call, INCLUDE);
#endif
append(call, file);
append(call, f);
if (runvec(call, (char *) 0)) {
file = f;
}
else {
remove(f);
continue;
}
cleanup(tmp_file);
tmp_file[0] = '\0';
}
else if (file[0] != '-' &&
strcmp(ext, "o") && strcmp(ext, "a")) {
warning("file with unknown suffix (%s) passed to the loader", ext);
}
if (c_flag)
continue;
append(&LDFILES, file);
if (ldfile) {
append(&GEN_LDFILES, ldfile);
ldfile = 0;
}
}
/* *.s to a.out */
if (RET_CODE == 0 && LDFILES.al_argc > 0) {
init(call);
append(call, LD);
#ifdef FCC
append(call, "-.c");
append(call, "-ansi");
#endif
#ifdef FM2
append(call, "-.mod");
#endif
#ifdef FPC
append(call, "-.p");
#endif
concat(call, &LD_FLAGS);
concat(call, &LDFILES);
if (runvec(call, (char *) 0) && GEN_LDFILES.al_argc == 1)
;
cleanup(tmp_file);
}
exit(RET_CODE);
}
needsprep(name)
char *name;
{
int file;
char fc;
file = open(name,0);
if (file < 0) return 0;
if (read(file, &fc, 1) != 1) fc = 0;
close(file);
return fc == '#';
}
char *
alloc(u)
unsigned u;
{
char *p = malloc(u);
if (p == 0)
panic("no space");
return p;
}
append(al, arg)
struct arglist *al;
char *arg;
{
if (!arg || !*arg) return;
if (al->al_argc >= MAXARGC)
panic("argument list overflow");
if (*arg == '*') {
char *p;
p = alloc((unsigned)strlen(ROOT_DIR)+strlen(BINDIR)+strlen(arg+1)+1);
strcpy(p, ROOT_DIR);
strcat(p, BINDIR);
strcat(p, arg+1);
arg = p;
}
al->al_argv[(al->al_argc)++] = arg;
}
concat(al1, al2)
struct arglist *al1, *al2;
{
register i = al2->al_argc;
register char **p = &(al1->al_argv[al1->al_argc]);
register char **q = &(al2->al_argv[0]);
if ((al1->al_argc += i) >= MAXARGC)
panic("argument list overflow");
while (i-- > 0) {
if (**q == '*') {
*p = alloc((unsigned)strlen(ROOT_DIR)+strlen(BINDIR)+strlen(*q+1)+2);
strcpy(*p, ROOT_DIR);
strcat(*p, BINDIR);
strcat(*p++, *q+1);
q++;
}
else *p++ = *q++;
}
}
/*VARARGS*/
char *
mkstr(va_alist)
va_dcl
{
va_list ap;
char *dst;
va_start(ap);
{
register char *p;
register char *q;
dst = q = va_arg(ap, char *);
p = va_arg(ap, char *);
while (p) {
while (*q++ = *p++);
q--;
p = va_arg(ap, char *);
}
}
va_end(ap);
return dst;
}
basename(str, dst)
char *str;
register char *dst;
{
register char *p1 = str;
register char *p2 = p1;
while (*p1)
if (*p1++ == '/')
p2 = p1;
p1--;
while (*p1 != '.' && p1 >= p2) p1--;
if (p1 >= p2) {
*p1 = '\0';
while (*dst++ = *p2++);
*p1 = '.';
}
else
while (*dst++ = *p2++);
}
char *
extension(fn)
char *fn;
{
register char *c = fn;
while (*c++) ;
while (*--c != '.' && c >= fn) { }
if (c++ < fn || !*c) return fn;
return c;
}
runvec(vec, outp)
struct arglist *vec;
char *outp;
{
int pid, status;
if (v_flag) {
pr_vec(vec);
putc('\n', stderr);
}
if ((pid = fork()) == 0) { /* start up the process */
if (outp) { /* redirect standard output */
close(1);
if (creat(outp, 0666) != 1)
panic("cannot create output file");
}
ex_vec(vec);
}
if (pid == -1)
panic("no more processes");
kids = pid;
wait(&status);
if (status) switch(status & 0177) {
case SIGHUP:
case SIGINT:
case SIGQUIT:
case SIGTERM:
case 0:
break;
default:
error("%s died with signal %d\n", vec->al_argv[1], status&0177);
}
kids = -1;
return status ? ((RET_CODE = 1), 0) : 1;
}
/*VARARGS1*/
error(str, s1, s2)
char *str, *s1, *s2;
{
fprintf(stderr, "%s: ", ProgCall);
fprintf(stderr, str, s1, s2);
putc('\n', stderr);
ecount++;
}
/*VARARGS1*/
warning(str, s1, s2)
char *str, *s1, *s2;
{
fprintf(stderr, "%s: (warning) ", ProgCall);
fprintf(stderr, str, s1, s2);
putc('\n', stderr);
}
panic(str)
char *str;
{
error(str);
trapcc(SIGINT);
}
pr_vec(vec)
register struct arglist *vec;
{
register char **ap = &vec->al_argv[1];
vec->al_argv[vec->al_argc] = 0;
fputs(*ap, stderr);
while (*++ap) {
putc(' ', stderr);
fputs(*ap, stderr);
}
}
extern int errno;
ex_vec(vec)
register struct arglist *vec;
{
if (noexec)
exit(0);
vec->al_argv[vec->al_argc] = 0;
execv(vec->al_argv[1], &(vec->al_argv[1]));
if (errno == ENOEXEC) { /* not an a.out, try it with the SHELL */
vec->al_argv[0] = SHELL;
execv(SHELL, &(vec->al_argv[0]));
}
if (access(vec->al_argv[1], 1) == 0) {
/* File is executable. */
error("cannot execute %s", vec->al_argv[1]);
} else {
error("%s is not executable", vec->al_argv[1]);
}
exit(1);
}

55
fast/driver/proto.make Normal file
View File

@@ -0,0 +1,55 @@
# $Header$
#PARAMS do not remove this line!
SRC_DIR = $(SRC_HOME)/fast/driver
INCLUDES = -I$(TARGET_HOME)/config
CFLAGS = $(COPTIONS) $(INCLUDES)
LINTFLAGS = $(LINTOPTIONS) $(INCLUDES)
LDFLAGS = $(LDOPTIONS)
all: afcc afm2 afpc
install: all
cp afcc afm2 afpc $(TARGET_HOME)/bin
if [ $(DO_MACHINE_INDEP) = y ] ; \
then cp $(SRC_DIR)/afcc.1 $(SRC_DIR)/afm2.1 $(SRC_DIR)/afpc.1 $(TARGET_HOME)/man ; \
fi
cmp: all
-cmp afcc $(TARGET_HOME)/bin/afcc
-cmp afm2 $(TARGET_HOME)/bin/afm2
-cmp afpc $(TARGET_HOME)/bin/afpc
-cmp afcc.1 $(TARGET_HOME)/man/afcc.1
-cmp afm2.1 $(TARGET_HOME)/man/afm2.1
-cmp afpc.1 $(TARGET_HOME)/man/afpc.1
pr:
@pr $(SRC_DIR)/proto.make $(SRC_DIR)/driver.c
opr:
make pr | opr
clean:
rm -f *,$(SUF) afcc afm2 afpc Out
afcc.$(SUF): $(SRC_DIR)/driver.c $(TARGET_HOME)/config/em_path.h
$(CC) $(CFLAGS) -c -DFCC -D$(MACH) -D`ack_sys` $(SRC_DIR)/driver.c
mv driver.$(SUF) afcc.$(SUF)
afpc.$(SUF): $(SRC_DIR)/driver.c $(TARGET_HOME)/config/em_path.h
$(CC) $(CFLAGS) -c -DFPC -D$(MACH) -D`ack_sys` $(SRC_DIR)/driver.c
mv driver.$(SUF) afpc.$(SUF)
afm2.$(SUF): $(SRC_DIR)/driver.c $(TARGET_HOME)/config/em_path.h
$(CC) $(CFLAGS) -c -DFM2 -D$(MACH) -D`ack_sys` $(SRC_DIR)/driver.c
mv driver.$(SUF) afm2.$(SUF)
afcc: afcc.$(SUF)
$(CC) $(LDFLAGS) -o afcc afcc.$(SUF)
afm2: afm2.$(SUF)
$(CC) $(LDFLAGS) -o afm2 afm2.$(SUF)
afpc: afpc.$(SUF)
$(CC) $(LDFLAGS) -o afpc afpc.$(SUF)