summaryrefslogtreecommitdiff
path: root/xc/test/xsuite/xtest/src/bin/mc/files.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/test/xsuite/xtest/src/bin/mc/files.c')
-rw-r--r--xc/test/xsuite/xtest/src/bin/mc/files.c259
1 files changed, 259 insertions, 0 deletions
diff --git a/xc/test/xsuite/xtest/src/bin/mc/files.c b/xc/test/xsuite/xtest/src/bin/mc/files.c
new file mode 100644
index 000000000..356b969e7
--- /dev/null
+++ b/xc/test/xsuite/xtest/src/bin/mc/files.c
@@ -0,0 +1,259 @@
+/*
+ * Copyright 1990, 1991 by the Massachusetts Institute of Technology and
+ * UniSoft Group Limited.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the names of MIT and UniSoft not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. MIT and UniSoft
+ * make no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * $XConsortium$
+ *
+ * Author: Steve Ratcliffe, UniSoft Ltd.
+ */
+
+#include "stdio.h"
+#include "mc.h"
+
+#define MC_LOC "/xtest/lib/"
+
+extern char *getenv();
+extern char *Filename;
+extern int Lineno;
+
+static int Filenum;
+static char *Filetemp[50];
+static int Filetind;
+
+FILE *opencopy();
+
+/*
+ * Open the first source file.
+ */
+FILE *
+nextfile(sources)
+struct mclist *sources;
+{
+FILE *fp;
+static int firsttime = 1;
+
+ Lineno = 0;
+ if ((Filename = getmclistitem(sources, Filenum++)) == NULL) {
+ if (firsttime)
+ fp = stdin;
+ else
+ fp = NULL;
+ } else {
+ if ((fp = fopen(Filename, "r")) == NULL) {
+ (void) fprintf(stderr, "Could not open %s\n", Filename);
+ errexit();
+ }
+ }
+
+ firsttime = 0;
+ return(fp);
+}
+
+/*
+ * Copy the contents of the corresponding skeleton file to the output.
+ * The skeleton files have a .mc suffix.
+ */
+void
+outcopy(file)
+char *file;
+{
+register FILE *fp;
+char buf[BUFSIZ];
+
+ /*
+ * Look for a corresponding file with name lib/mc/*.mc .
+ */
+ (void) sprintf(buf, "mc/%s", file);
+ file = buf;
+ if (strcmp(file+strlen(file)-3, ".mc") != 0) {
+ /*
+ * For debugging only -- there is an error in the file name
+ * conventions.
+ */
+ fprintf(stderr, "Internal error outcopy file does not end in .mc\n");
+ }
+
+ if ((fp = fopen(mcpath(file), "r")) != NULL) {
+ outfile(fp);
+ fclose(fp);
+ } else {
+ fprintf(stderr, "Could not open skeleton file %s\n", mcpath(file));
+ errexit();
+ /*NOTREACHED*/
+ }
+}
+
+/*
+ * Create a temporary file with the given name. Open a stream to it
+ * and return the stream pointer.
+ */
+FILE *
+cretmpfile(file)
+char *file;
+{
+register FILE *fp;
+
+ if ((fp = fopen(file, "w+")) == NULL) {
+ (void) fprintf(stderr, "Could not open %s\n", file);
+ errexit();
+ }
+ filetemp(file);
+ return(fp);
+}
+
+
+/*
+ * Combine all the files in the right order onto
+ * stdout.
+ */
+outfile(fp)
+FILE *fp;
+{
+static FILE *fout;
+static int olineno = 0;
+static char *ofilename;
+char buf[BUFSIZ];
+register int n;
+extern char *OutFile;
+extern int pflag;
+extern int Cmdname;
+
+ if (!fout) {
+ if (OutFile) {
+ if ((fout = fopen(OutFile, "w")) == NULL) {
+ (void) fprintf(stderr, "Could not open %s for output\n", OutFile);
+ errexit();
+ }
+ ofilename = OutFile;
+ } else {
+ fout = stdout;
+ ofilename = "stdout";
+ }
+ }
+
+ rewind(fp);
+
+ if (pflag && Cmdname == CMD_MC) {
+ while (fgets(buf, BUFSIZ, fp) != NULL) {
+ olineno++;
+ if (buf[0] == '>' && buf[1] == '>' && buf[2] == 'G')
+ (void) sprintf(buf, "#line %d \"%s\"\n", olineno+1, ofilename);
+ fputs(buf, fout);
+ }
+ } else {
+ while ((n = fread(buf, sizeof(char), BUFSIZ, fp)) > 0)
+ (void) fwrite(buf, n, 1, fout);
+ }
+}
+
+remfiles()
+{
+int i;
+
+ for (i = 0; i < Filetind; i++)
+ (void) unlink(Filetemp[i]);
+ Filetind = 0;
+}
+
+includefile(file, bp)
+char *file;
+char *bp;
+{
+char *name;
+char *savline;
+char *savfilename;
+char *path;
+char *strtok();
+FILE *fp;
+int savlineno;
+
+ savline = mcstrdup(bp);
+ file = mcstrdup(file);
+
+ name = strtok(file, " \t\n");
+ if (name == (char*)0) {
+ err("Missing file name on include directive\n");
+ errexit();
+ }
+
+ if ((fp = fopen(name, "r")) == NULL) {
+ path = mcpath(name);
+ if ((fp = fopen(path, "r")) == NULL) {
+ err("");
+ (void) fprintf(stderr, "Cannot open include file %s\n", name);
+ errexit();
+ }
+ }
+
+ savfilename = Filename;
+ savlineno = Lineno;
+ Filename = name;
+ Lineno = 0;
+
+ dohook(name, HOOK_INCSTART);
+ dosections(fp, bp);
+ (void) fclose(fp);
+ dohook(name, HOOK_INCEND);
+
+ Filename = savfilename;
+ Lineno = savlineno;
+
+ strcpy(bp, savline);
+ free(savline);
+ free(file);
+}
+
+/*
+ * Mark the file name for deletion at the end.
+ */
+void
+filetemp(name)
+char *name;
+{
+int i;
+
+ for (i = 0; i < Filetind; i++) {
+ if (strcmp(Filetemp[i], name) == 0)
+ return;
+ }
+ Filetemp[Filetind++] = name;
+}
+
+/*
+ * Return path name of file in the xtest lib directory.
+ */
+char *
+mcpath(file)
+char *file;
+{
+char *rp;
+char *path;
+int size;
+
+ rp = getenv("TET_ROOT");
+ if (rp == NULL) {
+ (void) fprintf(stderr, "TET_ROOT not set in environment\n");
+ errexit();
+ }
+ size = strlen(rp)+strlen(MC_LOC)+strlen(file)+1;
+ path = (char *)malloc((unsigned)size);
+ if (path == NULL) {
+ (void) fprintf(stderr, "Out of memory\n");
+ errexit();
+ }
+ (void) strcpy(path, rp);
+ (void) strcat(path, MC_LOC);
+ (void) strcat(path, file);
+
+ return(path);
+}