summaryrefslogtreecommitdiff
path: root/xc/test/xsuite/xtest/src/libproto/linkstart.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/test/xsuite/xtest/src/libproto/linkstart.c')
-rw-r--r--xc/test/xsuite/xtest/src/libproto/linkstart.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/xc/test/xsuite/xtest/src/libproto/linkstart.c b/xc/test/xsuite/xtest/src/libproto/linkstart.c
new file mode 100644
index 000000000..2f902c141
--- /dev/null
+++ b/xc/test/xsuite/xtest/src/libproto/linkstart.c
@@ -0,0 +1,167 @@
+/*
+ * 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$
+ */
+
+#include "xtest.h"
+#include "tet_api.h"
+#include "stdlib.h"
+#include <stdio.h>
+#include <string.h>
+
+#define MAXTPS 1000
+#define TLI nullfn,1
+#define TLI10 TLI, TLI, TLI, TLI, TLI, TLI, TLI, TLI, TLI, TLI
+#define TLI50 TLI10, TLI10, TLI10, TLI10, TLI10
+
+static void
+nullfn()
+{
+ return;
+}
+
+/*
+ * Define the TET interface variables here. This module will be
+ * brought into the executable by the references to these variables.
+ */
+int tet_thistest;
+
+struct tet_testlist tet_testlist[MAXTPS+1] = {
+ TLI50, TLI50, TLI50, TLI50, TLI50,
+ TLI50, TLI50, TLI50, TLI50, TLI50,
+ TLI50, TLI50, TLI50, TLI50, TLI50,
+ TLI50, TLI50, TLI50, TLI50, TLI50,
+ NULL, 0 };
+
+void linkstart();
+void linkclean();
+
+void (*tet_startup)() = linkstart;
+void (*tet_cleanup)() = linkclean;
+
+char *TestName;
+int ntests;
+
+extern char *tet_pname;
+
+extern struct linkinfo *linktbl[];
+
+/*
+ * The startup routine for the linked executables case. We have
+ * to make some assumptions about the TET that are not officialy in
+ * the spec.
+ * - It is valid to change the contents of tet_testlist[] in the
+ * startup routine.
+ *
+ * Get the name of the routine and set up the interface to
+ * point to the tests for that routine.
+ */
+void
+linkstart()
+{
+struct linkinfo *lp;
+struct linkinfo **lpp;
+struct tet_testlist *tlp;
+char *name;
+int i;
+
+ lp = (struct linkinfo *)0;
+
+ /*
+ * Get the basename part of tet_pname.
+ */
+ name = strrchr(tet_pname, '/');
+ if (name)
+ name++;
+ else
+ name = tet_pname;
+
+ for (lpp = linktbl; *lpp; lpp++) {
+ if (strcmp((*lpp)->name, name) == 0) {
+ lp = *lpp;
+ break;
+ }
+ }
+
+ if (lp == (struct linkinfo *)0) {
+ /*
+ * If this happens if probably means that the executable
+ * has been built incorrectly.
+ */
+ report("Name (%s) not found in link table, aborting test\n", name);
+ fprintf(stderr, "Name (%s) not found in link table, aborting test\n", name);
+ exit(EXIT_FAILURE);
+ }
+
+ TestName = lp->testname;
+ ntests = *lp->ntests;
+
+ tlp = lp->testlist;
+ for (i = 0; tlp[i].testfunc != 0; i++) {
+ tet_testlist[i] = tlp[i];
+ }
+ /* Copy the final null entry */
+ tet_testlist[i] = tlp[i];
+
+ if (lp->localstartup)
+ (*lp->localstartup)();
+ else
+ protostartup();
+
+}
+
+/*
+ * Cleanup function for linked executables.
+ */
+void
+linkclean()
+{
+struct linkinfo *lp;
+struct linkinfo **lpp;
+char *name;
+
+ lp = (struct linkinfo *)0;
+
+ /*
+ * Get the basename part of tet_pname.
+ */
+ name = strrchr(tet_pname, '/');
+ if (name)
+ name++;
+ else
+ name = tet_pname;
+
+ for (lpp = linktbl; *lpp; lpp++) {
+ if (strcmp((*lpp)->name, name) == 0) {
+ lp = *lpp;
+ break;
+ }
+ }
+
+ if (lp == (struct linkinfo *)0) {
+ /*
+ * If this happens here, something has gone VERY BADLY WRONG
+ * and I'm not certain what we can do about it.
+ */
+ report("Name (%s) not found in link table in linkclean!\n", name);
+ fprintf(stderr, "Name (%s) not found in link table in linkclean!\n", name);
+ exit(EXIT_FAILURE);
+ }
+
+ if (lp->localcleanup)
+ (*lp->localcleanup)();
+ else
+ protocleanup();
+}