diff options
Diffstat (limited to 'xc/test/xsuite/xtest/src/libproto/linkstart.c')
-rw-r--r-- | xc/test/xsuite/xtest/src/libproto/linkstart.c | 167 |
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(); +} |