[LTP] [RFC PATCH v2 1/7] pan: Remove ltp-scanner
Petr Vorel
pvorel@suse.cz
Wed Jan 26 13:35:41 CET 2022
We believe that nobody uses it.
Suggested-by: Cyril Hrubis <chrubis@suse.cz>
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
New in v2
.gitignore | 1 -
INSTALL | 2 -
configure.ac | 1 -
pan/Makefile | 8 -
pan/debug.c | 84 --------
pan/debug.h | 67 -------
pan/ltp-scanner.c | 175 -----------------
pan/reporter.c | 270 --------------------------
pan/reporter.h | 80 --------
pan/scan.h | 42 ----
pan/scan.l | 456 -------------------------------------------
pan/symbol.c | 467 --------------------------------------------
pan/symbol.h | 104 ----------
pan/tag_report.c | 478 ----------------------------------------------
14 files changed, 2235 deletions(-)
delete mode 100644 pan/debug.c
delete mode 100644 pan/debug.h
delete mode 100644 pan/ltp-scanner.c
delete mode 100644 pan/reporter.c
delete mode 100644 pan/reporter.h
delete mode 100644 pan/scan.h
delete mode 100644 pan/scan.l
delete mode 100644 pan/symbol.c
delete mode 100644 pan/symbol.h
delete mode 100644 pan/tag_report.c
diff --git a/.gitignore b/.gitignore
index 3efac384f6..fd66dac786 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,7 +45,6 @@ autom4te.cache
/lib/ltp.pc
/pan/ltp-bump
/pan/ltp-pan
-/pan/ltp-scanner
cscope.*
ncscope.*
diff --git a/INSTALL b/INSTALL
index 3bb37d60b9..eb63539a8c 100644
--- a/INSTALL
+++ b/INSTALL
@@ -27,8 +27,6 @@ configure file).
pkgconf is recommended also for compilation from tarball as it
does automatic detection of some library support.
-GNU Bison / Berkeley Yacc is required for ltp-scanner.
-
Configuration
-------------
diff --git a/configure.ac b/configure.ac
index 3c56d19224..8becd74c2c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -24,7 +24,6 @@ AC_PROG_CC
# 2.62.
AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL(AR, ar, :)])
AC_PROG_AR
-AC_PROG_LEX
AC_PROG_RANLIB
AC_DEFUN([AC_PROG_STRIP], [AC_CHECK_TOOL(STRIP, strip, :)])
AC_PROG_STRIP
diff --git a/pan/Makefile b/pan/Makefile
index 8cefa99ae6..e8596ec26b 100644
--- a/pan/Makefile
+++ b/pan/Makefile
@@ -39,18 +39,10 @@ INSTALL_DIR := bin
MAKE_TARGETS := ltp-bump ltp-pan
-ifeq ($(strip $(LEXLIB)),)
-$(warning ltp-scanner will not be built because a working copy of lex was not found)
-else
-MAKE_TARGETS += ltp-scanner
-endif
-
ltp-bump: ltp-bump.o zoolib.o
ltp-pan: ltp-pan.o zoolib.o splitstr.o
-ltp-scanner: scan.o ltp-scanner.o reporter.o tag_report.o symbol.o splitstr.o debug.o
-
# flex does some whacky junk when it generates files on the fly, so let's make
# sure gcc doesn't get lost...
vpath %.c $(abs_srcdir):$(abs_builddir)))
diff --git a/pan/debug.c b/pan/debug.c
deleted file mode 100644
index 9027f9bac8..0000000000
--- a/pan/debug.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: debug.c,v 1.1 2000/09/21 21:35:06 alaffin Exp $ */
-#include <stdio.h>
-#include <string.h>
-#include "reporter.h"
-
-#ifdef DEBUGGING
-int Debug[MAXDEBUG]; /* Debug level in their areas */
-#endif
-
-/*
- * set debug areas & levels
- *
- * Syntax: area[,area]:level[,area[,area]:level]...
- */
-int set_debug(char *optarg)
-{
-#ifdef DEBUGGING
- /* pointers to the debug area and level in the option's arguments */
- char *d_area, *d_level;
- /* debug area and level after converted to integers */
- int db_area, db_level;
-
- d_area = optarg;
-
- while (*d_area) {
- d_level = strchr(d_area, ':');
- *d_level++ = '\0';
- db_level = atoi(d_level);
- db_area = atoi(d_area);
-
- if (db_area > MAXDEBUG) {
- printf("Error - Debug area %s > maximum of %d\n",
- d_area, MAXDEBUG);
- exit(-1);
- }
-
- while (d_area != NULL) {
- db_area = atoi(d_area);
- printf("Debug area %d set to %d\n", db_area, db_level);
- Debug[db_area] = db_level;
- if ((d_area = strchr(d_area, ',')) != NULL)
- d_area++;
- }
- if ((d_area = strchr(d_level, ',')) == NULL)
- break;
- }
-#else
- printf("Debugging is not enabled. -D has been ignored\n");
-#endif
-
- return 0;
-}
diff --git a/pan/debug.h b/pan/debug.h
deleted file mode 100644
index fd8182a53d..0000000000
--- a/pan/debug.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: debug.h,v 1.1 2000/09/21 21:35:06 alaffin Exp $ */
-#ifndef _DEBUG_H_
-#define _DEBUG_H_
-
-int set_debug( char * );
-
-/*
- * DEBUG support
- *
- * use -DDEBUGGING with cc to enable debugging
- */
-#ifdef DEBUGGING
-
-extern int Debug[];
-#define MAXDEBUG 30
-#define DEBUG(a,l) if (Debug[a] >= l)
-#define DEBUGO(a,l,c) if (Debug[a] >= l || c)
-
-#else
-
-#define DEBUG(a,l) if (0)
-#define DEBUGO(a,l,c) if (0)
-
-#endif
-
-#define D_INIT 1
-#define D_SCAN 2
-#define D_SCAN_LEX 3
-#define D_SCAN_CUTS 4
-#define D_REPORT 5
-#define D_REP_H 6
-#define D_REP_CUTS 7
-
-
-#endif
diff --git a/pan/ltp-scanner.c b/pan/ltp-scanner.c
deleted file mode 100644
index afdd757759..0000000000
--- a/pan/ltp-scanner.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: ltp-scanner.c,v 1.1 2009/05/19 09:39:11 subrata_modak Exp $ */
-/*
- * An RTS/pan driver output processing program.
- *
- * This program reads an RTS/pan driver output format file, parses it using lex
- * and saves the information into an in-memory hierarchical keyword table.
- *
- * The reporting segment of the program reads that keyword table to produce
- * it's reports.
- *
- * Synopsis:
- * ltp-scanner [ -e ] [ -D area:level ] [ -h ]
- *
- * Description:
- * Scanner is part of the RTS 2.0 reporting mechanism or pan.
- * It processes RTS/pan driver format output and produces a single simple report
- * of each test tag executed, the TCIDs it executed, and their testcases.
- *
- * Options:
- * -e
- * use an "extended" output format
- *
- * -D
- * enable debug statements. Areas are listed in report2.h and levels
- * are in the code. Must be compiled with "-DDEBUGGING"
- *
- * -h
- * print out a command usage statement and exit.
- *
- * INPUT
- * The input must conform to the RTS/pan driver format.
- *
- * Report Format
- * A single report style is used. It consists of a header made of all
- * keywords in the rts_keywords fields of the driver output, and the test
- * information.
- * interpretation of CUTS "number of testcases" field when there are
- * multiple TCIDs. It must be the sum of all TCIDs' testcases.
- *
- * System Configuration:
- * ARCHITECTURE IOS_MODEL_E CRAY_YMP YMP7XX
- * CONFIG JOBCNTL AVL BMD EMA HPM SECURE TFM_UDB_6 SDS SSD
- * RELEASE 82
- * UNAME sn1703c cool 8.2.0ae d82.25
- * date 03/24/94
- *
- * tag tcid testcase status contact
- * ------------------------------------------------------------------------
- *
- * When a report is made for only a tag, the TCID and Testcase fields
- * contain a dash ( "-" ). The intention is that the output be usable
- * by other Unix programs.
- *
- * When a report is made for all TCIDs and Testcases, a star ( "*" ) is used.
- *
- * When in extended mode, an additional output line is produced for each
- * tag.
- *
- * This line is identified with a "!" in the TCID and Testcase fields.
- *
- * It has no minimum and maximum field widths, so the output does not
- * line up in columns
- *
- * the "status" field contains the initiation status
- *
- * the "contact" field does not expand multiple comma-separated contacts
- *
- * fields:
- * tag, tcid, testcase, status, contact,
- * start time, duration, termination type, termination id,
- * output starting line, output ending line
- *
- * RELATED DOCUMENTS
- * Regression Test System Phase 2 Test Result Reporting System
- *
- * AUTHOR
- * Glen Overby wrote the code.
- *
- * Internal Data Format
- * All data is maintained in a hierarchical key database. While there are
- * many available databases, this impliments a simple ASCII comma-separated
- * keyed database.
- *
- * Key Naming
- * - The top-level keys are named after the RTS or pan test tags.
- * - The top-level key named "_RTS" contains the RTS Keywords
- * - Each tag has a "_keys" tag that contains the key fields from
- * the TEST_START and EXECUTION_STATUS fields.
- */
-
-#include <getopt.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "scan.h"
-#include "debug.h"
-#include "reporter.h"
-#include "symbol.h"
-
-char *cnf; /* current filename */
-int extended = 0; /* -e option */
-
-int main(int argc, char *argv[])
-{
- SYM tags; /* tag data */
- int c;
-
- while ((c = getopt(argc, argv, "D:ehi")) != -1) {
- switch (c) {
- case 'i':
- set_iscanner();
- break;
- case 'D':
- set_debug(optarg);
- break;
- case 'e':
- extended++;
- break;
- case 'h':
- fprintf(stderr,
- "%s [-e] [-i] [ -D area, level ] input-filenames\n",
- argv[0]);
- exit(0);
- default:
- fprintf(stderr, "invalid argument, %c\n", c);
- exit(1);
- }
- }
-
- lex_files(&argv[optind]); /* I hope that argv[argc+1] == NULL */
- tags = sym_open(0, 0, 0);
-
- scanner(tags);
-#ifdef DEBUGGING
- DEBUG(D_INIT, 1)
- sym_dump_s(tags, 0);
-#endif
- reporter(tags);
-
- exit(0);
-}
diff --git a/pan/reporter.c b/pan/reporter.c
deleted file mode 100644
index b9ec482d41..0000000000
--- a/pan/reporter.c
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: reporter.c,v 1.1 2000/09/21 21:35:06 alaffin Exp $ */
-/*
- * This is the report generator half of the scanner program.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include "reporter.h"
-#include "symbol.h"
-#include "tag_report.h"
-#include "splitstr.h"
-
-/************************************************************************
- * Report Generation *
- ************************************************************************/
-
-static int scanner_reporter(SYM);
-static int iscanner_reporter(SYM);
-static int scanner_test_end(SYM, SYM, SYM);
-static int iscanner_test_end(SYM, SYM, SYM);
-
-static int (*reporter_func) (SYM) = scanner_reporter;
-static int (*test_end_func) (SYM, SYM, SYM) = scanner_test_end;
-
-/*
- * Do the report generation.
- *
- * A problem: I really need multiple cursors. I'd rather not look into
- * the depths of the current symbol table implimentation (there are the
- * cursors there that I could use) so that a different (faster!) symbol
- * table can be used in the future.
- *
- * I could get a key (tag), get it's sub-keys (TCIDs), then get the key
- * again to reset to the top level, _then_ get the next key. That would
- * be very inefficient.
- *
- * The solution I chose is to extract all tags into a list (char array),
- * then go thru that list with the cursor free for other levels to use.
- *
- * (1) make a list (2d char array) of all Tags
- * (2) search for the first tag that has a "stime" record, and use that as
- * the date (MMDDYY) that the tests were run.
- * (3) print the report header
- * (4) go thru all tags and report each as described at the beginning of
- * this file
- */
-static int scanner_reporter(SYM tags)
-{
- DBT Key, Data;
- SYM Tag, Keys;
-
- time_t clock;
- struct tm *tm;
-
- /* a list of tags, a count of the number of tags allocated to the list,
- and a pointer to go thru the list */
- char **taglist, **tl;
- int ntags;
- int tagcount; /* how many tags used */
-
- char key_get[KEYSIZE];
- char *info;
-
- /*
- * extract tag names from data
- */
- ntags = NTAGS_START;
- taglist = malloc(sizeof(char *) * ntags);
- tagcount = 0;
-
- tl = taglist;
- sym_seq(tags, &Key, &Data, R_FIRST);
- do {
- if (tagcount == ntags) {
- /* exceeded tag array size -- realloc */
- ntags += NTAGS_START;
- taglist =
- (char **)realloc(taglist, sizeof(char *) * ntags);
- tl = taglist + tagcount;
- }
-
- *tl++ = Key.data;
- tagcount++;
- } while (sym_seq(tags, &Key, &Data, R_NEXT) == 0);
-
- if (tagcount == ntags) {
- /* exceeded tag array size -- realloc */
- ntags += NTAGS_START;
- taglist = (char **)realloc(taglist, sizeof(char *) * ntags);
- tl = taglist + tagcount;
- }
-
- *tl++ = NULL;
- ntags = tagcount;
- /* Retrieve one "stime" to get the date. */
- for (tl = taglist; *tl != NULL; tl++) {
- strcpy(key_get, *tl);
- strcat(key_get, ",_keys,stime");
- if ((info = (char *)sym_get(tags, key_get)) != NULL) {
- clock = atoi(info);
- tm = gmtime(&clock);
- strftime(key_get, KEYSIZE, "%x", tm);
- sym_put(tags, strdup("_RTS,date"), strdup(key_get), 0);
- break;
- }
- }
-
- print_header(tags);
-
- /*
- * The way that I am using 'Keys' and 'Tag' makes assumptions about the
- * internals of the sym_* data structure.
- */
- /* dump 'em all */
- for (tl = taglist; *tl != NULL; tl++) {
- if (!strcmp(*tl, "_RTS"))
- continue;
-
- strcpy(key_get, *tl);
- strcat(key_get, ",_keys");
- if ((Keys = sym_get(tags, key_get)) == NULL) {
- return 0;
- }
-
- strcpy(key_get, *tl);
- if ((Tag = sym_get(tags, key_get)) != NULL) {
- tag_report(NULL, Tag, Keys);
- }
- }
- free(taglist);
-
- return 0;
-}
-
-/*
- * End-Of-Test seen, insert this tag into the global tag data.
- * (1) Get the test's tag
- * (2) insert the keywords in the "_keys" tag
- * (3) insert it into the global data under this tag, replacing any existing
- * data.
- *
- * a "feature" of the key implimentation: I can insert a key tree
- * under another key tree with almost zero brainwork because a SYM
- * is what the DATA area points to.
- */
-static int scanner_test_end(SYM alltags, SYM ctag, SYM keys)
-{
- static int notag = 0; /* counter for records with no tag (error) */
- char tagname[KEYSIZE]; /* used when creating name (see above) */
- char *tag; /* tag name to look things up in */
- char *status; /* initiation status of old tag */
- SYM rm; /* pointer to old tag -- to remove it */
-
- if (alltags == NULL || keys == NULL || ctag == NULL)
- return -1; /* for really messed up test output */
-
- /* insert keys into tag */
- sym_put(ctag, "_keys", (void *)keys, 0);
-
- /* get the tag, or build a new one */
- if ((tag = (char *)sym_get(keys, "tag")) == NULL) {
- /* this is an "impossible" situation: test_output checks for this
- * and creates a dummy tag. */
- sprintf(tagname, "no_tag_%d", notag++);
- fprintf(stderr, "No TAG key! Using %s\n", tagname);
- sym_put(keys, "tag", strdup(tagname), 0);
- tag = strdup(tagname);
- }
-
- /*
- * Special case: duplicate tag that has an initiation_status failure
- * is thrown away.
- */
- if ((rm = (SYM) sym_get(alltags, tag)) != NULL) {
- if ((status =
- (char *)sym_get(keys, "initiation_status")) != NULL) {
- if (strcmp(status, "ok")) {
- /* do not take new data. remove new data */
- sym_rm(ctag, RM_KEY | RM_DATA);
- return 1;
- } else {
- /* remove old data in alltags */
- sym_rm(rm, RM_KEY | RM_DATA);
- }
- } else {
- /* new data does not have an initiation_status -- throw it away */
- sym_rm(ctag, RM_KEY | RM_DATA);
- return 1;
- }
- }
-
- /* put new data.. replaces existing "tag" key if it exists
- * (it's data should have been removed above) */
- sym_put(alltags, tag, ctag, PUT_REPLACE);
-
- return 0;
-}
-
-static int iscanner_reporter(SYM tags)
-{
- return 0;
-}
-
-static int iscanner_test_end(SYM alltags, SYM ctag, SYM keys)
-{
- if (alltags == NULL || keys == NULL || ctag == NULL)
- return -1; /* for really messed up test output */
-
- /* insert keys into tag */
- sym_put(ctag, "_keys", (void *)keys, 0);
-
- return tag_report(alltags, ctag, keys);
-}
-
-int reporter(SYM s)
-{
- return reporter_func(s);
-}
-
-int test_end(SYM a, SYM b, SYM c)
-{
- return test_end_func(a, b, c);
-}
-
-void set_scanner(void)
-{
- reporter_func = scanner_reporter;
- test_end_func = scanner_test_end;
-}
-
-void set_iscanner(void)
-{
- reporter_func = iscanner_reporter;
- test_end_func = iscanner_test_end;
-}
diff --git a/pan/reporter.h b/pan/reporter.h
deleted file mode 100644
index 9af554c6a7..0000000000
--- a/pan/reporter.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: reporter.h,v 1.1 2000/09/21 21:35:06 alaffin Exp $ */
-#ifndef _REPORT_H_
-#define _REPORT_H_
-#include "symbol.h"
-
-void set_scanner(void);
-void set_iscanner(void);
-
-int reporter( SYM );
-int test_end( SYM, SYM, SYM );
-
-/*
- * how much TCID space to start with (table)
- */
-#define NTCID_START 5
-
-/*
- * how much tag space to start with (table)
- */
-#define NTAGS_START 500
-
-/* Return Tokens (from lex) */
-#define KW_START 100
-#define KW_END 101
-#define TEST_START 102
-#define TEST_OUTPUT 103
-#define EXEC_STATUS 104
-#define TEST_END 105
-#define TEXT_LINE 106
-#define KEYWORD 107
-#define KEYWORD_QUOTED 108
-#define CUTS_RESULT 109
-#define CUTS_RESULT_R 110
-#define SPACE 999
-
-/* Scan Modes (above and beyond what I use lex for) */
-#define SCAN_OUTSIDE 10 /* not in anything */
-#define SCAN_RTSKEY 20 /* keywords: rts_keyword */
-#define SCAN_TSTKEY 21 /* keywords: either test_start or
- execution_status */
-#define SCAN_OUTPUT 30 /* test_output */
-
-/*
- * Configuration type things
- */
-#define KEYSIZE 255 /* maximum key size */
-
-#endif
diff --git a/pan/scan.h b/pan/scan.h
deleted file mode 100644
index 6e01a323cd..0000000000
--- a/pan/scan.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: scan.h,v 1.1 2000/09/21 21:35:06 alaffin Exp $ */
-#ifndef _SCAN_H_
-#define _SCAN_H_
-#include "symbol.h"
-
-int scanner ( SYM );
-int sym_dump_s ( SYM, int );
-int lex_files( char ** );
-
-#endif
diff --git a/pan/scan.l b/pan/scan.l
deleted file mode 100644
index fdc33f330e..0000000000
--- a/pan/scan.l
+++ /dev/null
@@ -1,456 +0,0 @@
-%{
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: scan.l,v 1.1 2000/09/21 21:35:06 alaffin Exp $ */
-/*
- * Lex rules for input processing.
- *
- * This handles all of the input parsing. The rules liste here properly
- * store or process the pertenant input data in the proper ways. The rules
- * for the various patterns maintains a "state" to determine if corrupted
- * input is seen (%Start keys + internal ones that only flag errors).
- *
- * See scanner.c for routines called from the actions.
- *
- * States:
- * SCAN_OUTSIDE
- * start-up state, inbetween tests
- * SCAN_RTSKEY valid from SCAN_OUTSIDE
- * from rts_keyword_start to _end
- * accompanied by lex KEY state.
- * SCAN_TSTKEY valid from SCAN_OUTSIDE
- * test_start to test_output or test_end,
- * execution_status to test_end
- * accompanied by lex KEY state.
- * SCAN_OUTPUT
- * test_output to execution_status.
- * accompanied by lex OUT or CUTS states.
- */
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "scan.h"
-#include "reporter.h"
-#include "symbol.h"
-#include "tag_report.h"
-
-int scan_mode = SCAN_OUTSIDE; /* current mode */
-char *key, *cont; /* keyword pieces */
-SYM keys=NULL; /* stored keywords */
-SYM ctag=NULL; /* temporary - for storing current tag's info */
-SYM alltags; /* entire tag database. set to scanner 'tags' param.*/
-SYM k; /* temporary sym pointer -- for key removal */
-char info[KEYSIZE]; /* tmp string for inserting line numbers */
-static int test_output( SYM, SYM);
-static int check_mode(int, int, ...);
-
-/*
- * Lex Definitions:
- * UI Unsigned Integer
- * A Alphabetic
- * W "Word" characters (Alpha, Numeric, Hyphens, Underscores)
- * S Space characters
- */
-%}
-
-%option noc++
-%option noinput
-%option nolex-compat
-%option nounput
-%option yylineno
-
-UI [0-9]+
-A [a-zA-Z]+
-W [a-zA-Z0-9_-]+
-S [ \t]+
-
-%Start KEY OUT CUTS
-%%
-^<<<rts_keyword_start>>>$ {
- BEGIN KEY;
- check_mode(scan_mode, SCAN_OUTSIDE, 0);
- scan_mode = SCAN_RTSKEY;
-
- /* remove any keys that exist right now */
- if(keys != NULL)
- sym_rm(keys, RM_KEY | RM_DATA);
- /* start a new table of keys */
- keys = sym_open(0, 0, 0);
- return(KW_START);
- /* NOTREACHED */
-}
-
-^<<<rts_keyword_end>>>$ {
- BEGIN 0;
- check_mode(scan_mode, SCAN_RTSKEY, 0);
- scan_mode = SCAN_OUTSIDE;
-#ifdef DEBUGGING
- DEBUG(D_SCAN_LEX, 10) {
- printf("RTS Keywords:\n");
- sym_dump_s(keys, 0);
- }
-#endif
- /* remove _RTS key, if it exists, before replacing it */
- if( (k=(SYM)sym_get(alltags, "_RTS")) != NULL) {
- sym_rm(k, RM_KEY | RM_DATA);
- }
-
- sym_put(alltags, "_RTS", (void *)keys, PUT_REPLACE);
- keys = NULL;
-
- return(KW_END);
- /* NOTREACHED */
-}
-
-^<<<test_start>>>$ {
- BEGIN KEY;
- check_mode(scan_mode, SCAN_OUTSIDE, 0);
- scan_mode = SCAN_TSTKEY;
-
- /*
- * set up new "tag" and "keys" tables
- * to put the new data into.
- */
-
- /* remove any keys that exist right now */
- if(keys != NULL)
- sym_rm(keys, RM_KEY | RM_DATA);
- keys = sym_open(0, 0, 0);
-
- sprintf(info, "%d", yylineno);
- sym_put(keys, "_Start_line", strdup(info), 0);
-
- /* remove any tag info that exists right now */
- if(ctag != NULL)
- sym_rm(ctag, RM_KEY | RM_DATA);
- ctag = sym_open(0, 0, 0);
-
- return(TEST_START);
- /* NOTREACHED */
-}
-
-^<<<test_output>>>$ {
- BEGIN OUT;
- check_mode(scan_mode, SCAN_TSTKEY, 0);
- scan_mode = SCAN_OUTPUT;
-
- test_output(ctag, keys);
-
- return(TEST_OUTPUT);
- /* NOTREACHED */
-}
-
-^<<<execution_status>>>$ {
- BEGIN KEY;
- check_mode(scan_mode, SCAN_TSTKEY, SCAN_OUTPUT, 0);
- scan_mode = SCAN_TSTKEY;
- return(EXEC_STATUS);
- /* NOTREACHED */
-}
-
-^<<<test_end>>>$ {
- BEGIN 0;
- check_mode(scan_mode, SCAN_TSTKEY, 0);
- scan_mode = SCAN_OUTSIDE;
-
- sprintf(info, "%d", yylineno);
-
- sym_put(keys, "_End_line", strdup(info), 0);
-#ifdef DEBUGGING
- DEBUG(D_SCAN_LEX, 10) {
- printf("Tag's Keywords:\n");
- sym_dump_s(keys, 0);
- }
-#endif
- test_end(alltags, ctag, keys);
- ctag = keys = NULL;
-
- return(TEST_END);
- /* NOTREACHED */
-}
-
-<KEY>[a-zA-Z_-]+=\"[^\"\n]+\" {
- key = yytext;
- cont = strchr(yytext, '=');
- *cont++ = '\0';
- if(*cont == '"') cont++;
- if(yytext[yyleng-1] == '"')
- yytext[yyleng-1] = '\0';
-#ifdef DEBUGGING
- DEBUG(D_SCAN_LEX, 5)
- printf("A quoted keyword: %s = %s\n", key, cont);
-#endif
- sym_put(keys, key, strdup(cont), 0);
-
- return(KEYWORD_QUOTED);
- /* NOTREACHED */
-}
-
-<KEY>[a-zA-Z_-]+=[^\t \n]+ {
- key = yytext;
- cont = strchr(yytext, '=');
- *cont++ = '\0';
-#ifdef DEBUGGING
- DEBUG(D_SCAN_LEX, 5)
- printf("A keyword: %s = %s\n", key, cont);
-#endif
- sym_put(keys, key, strdup(cont), 0);
-
- return(KEYWORD);
- /* NOTREACHED */
-}
-
-<KEY>[ \t\n]* {
- return(SPACE);
- /* NOTREACHED */
-}
-
-<OUT>^.+$ {
-#ifdef DEBUGGING
- DEBUG(D_SCAN_LEX, 5)
- printf("TEXT_LINE: %s\n", yytext);
-#endif
-
- return(TEXT_LINE);
- /* NOTREACHED */
-}
-
-<CUTS>^{W}{S}{UI}{S}{A}{S}":" {
-#ifdef DEBUGGING
- DEBUG(D_SCAN_LEX, 5)
- printf("CUTS Result: %s\n", yytext);
-#endif
- cuts_testcase(ctag, keys);
-
- return(CUTS_RESULT);
- /* NOTREACHED */
-}
-
-<CUTS>^{W}{S}{UI}-{UI}{S}{A}{S}":" {
-#ifdef DEBUGGING
- DEBUG(D_SCAN_LEX, 5)
- printf("CUTS Result: %s\n", yytext);
-#endif
- cuts_testcase(ctag, keys);
-
- return(CUTS_RESULT_R);
- /* NOTREACHED */
-}
-
-. {
- return(SPACE);
- /* NOTREACHED */
-
-}
-"\n" {
- return(SPACE);
- /* NOTREACHED */
-}
-%%
-/*
- * the BEGIN macro only exists in the lex file, so define a routine to
- * BEGIN the CUTS state.
- */
-int
-begin_cuts(void)
-{
- BEGIN CUTS;
- return 0;
-}
-
-/*
- * Calls lex repeatedly until all input is seen.
- */
-int
-scanner(SYM tags)
-{
- alltags = tags; /* move into global scope for lex actions */
-
- while(yylex())
- ;
-
- return 0;
-}
-
-/*
- * Test-Output record
- * check if this is a CUTS test; if so, enter the lex "cuts" state;
- * otherwise do nothing and lex will be in a "data" mode that will just
- * toss all the output.
- */
-static int
-test_output(SYM tag, SYM keys)
-{
- char *at;
-
- if((at=(char *)sym_get(keys, "analysis")) != NULL) {
- /* CUTS:number_of_testcases || CUTS-1:number_of_testcases */
- if(strncasecmp("cuts", at, 4) == 0) {
- begin_cuts();
- /*printf("CUTS output expected\n");*/
- }
- }
- return 0;
-}
-
-/* Input Data State Check
- * RTS driver output goes thru specific
- * phases; this is used to verify that the new state is a legal state
- * to change to from the current state.
- * This accepts a variable number of arguments (valid states to be
- * in). The last argument MUST be zero
- */
-struct parse_states {
- char *name;
- int bits;
-} parse_states[] = {
- { "outside", SCAN_OUTSIDE },
- { "rts_keyword_start", SCAN_RTSKEY },
- { "test_start | execution_status", SCAN_TSTKEY },
- { "test_output", SCAN_OUTPUT },
- { "unknown", 0 }, /*end sentinel: bits = 0 */
-};
-
-static int
-check_mode(int scan_mode, int fst, ...)
-{
- va_list ap; /* used for variable argument functions*/
- int found=0; /* set to true if a valid state was found */
- int ckm; /* Check Mode: the mode to look for */
- register struct parse_states *ps; /* for looking thru parse_states */
- char exp_mode[KEYSIZE]; /* expected mode list (for error message) */
-
- extern int yylineno; /* Line number from Lex */
-
- /* look thru parse_states; end sentinel is "bits" = 0 */
- for(ps=parse_states; ps->bits && (ps->bits != fst);ps++)
- ;
- strcpy(exp_mode, ps->name);
-
- /* look at first variable argument */
- if(fst == scan_mode)
- found++;
- else {
- /* not first... look at variable args */
- va_start(ap, fst);
- while(((ckm = va_arg(ap, int)) != 0) && (ckm != scan_mode)) {
- for(ps=parse_states; ps->bits && (ps->bits != ckm);ps++)
- ;
- strcat(exp_mode, ", ");
- strcat(exp_mode, ps->name);
- }
- va_end(ap);
-
- if(ckm == scan_mode)
- found++;
- }
-
- if(!found) {
- for(ps=parse_states; ps->bits && (ps->bits != scan_mode);ps++)
- ;
-
- fprintf(stderr, "PARSE ERROR -- Line %d found %s in mode %s[%d] expected { %s }\n",
- yylineno, yytext, ps->name, scan_mode, exp_mode);
- }
-
- return 0;
-}
-
-/*
- * This part of the file contains subroutines called by a lex scanner which
- * is parsing rts-driver-format input and putting it into a multi-level
- * symbol table.
- */
-
-/*
- * References to lex variables
- */
-/*extern char yytext[]; / * text matched by last pattern */
-/*extern long yyleng; / * length of above */
-
-char **filenames;
-
-int
-lex_files(char **names)
-{
- /* lex */
- extern FILE *yyin;
-
- filenames = names;
-
- if(*filenames != NULL) {
-#ifdef DEBUGGING
- DEBUG(D_SCAN, 1)
- printf("lex_files: first file is %s\n", *filenames);
-#endif
- if((yyin = fopen(*filenames, "r")) == NULL) {
- printf("Error opening %s for reading\n", *filenames);
- exit(1);
- }
- }
-
- return 0;
-}
-
-/*
- * Called by lex's end-of-file processing.
- * Open the next file on the command line. If there is no next file,
- * return "-1" and lex will end.
- */
-int
-yywrap(void)
-{
- extern FILE *yyin;
- extern int yylineno; /* Line number from Lex */
-
- if(*filenames != NULL)
- if(*++filenames != NULL) {
-#ifdef DEBUGGING
- DEBUG(D_SCAN, 1)
- printf("yywrap: next file is %s\n", *filenames);
-#endif
- yylineno=1;
- if((yyin = fopen(*filenames, "r")) != NULL)
- return(0);
- else {
- printf("Error opening %s for reading\n", *filenames);
- return(1);
- }
- }
-
- return(-1);
-}
-
diff --git a/pan/symbol.c b/pan/symbol.c
deleted file mode 100644
index 37521143ed..0000000000
--- a/pan/symbol.c
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: symbol.c,v 1.4 2002/05/28 16:26:16 robbiew Exp $ */
-/*
- * Generic Symbol Table
- *
- * This is intended to look a lot like ndbm, except that all information
- * is kept in memory, and a multi-key, hierarchical access mode is provided.
- * This is largely patterned after the Berkeley "DB" package.
- *
- * Requirements
- *
- * - "key" is ASCII (a C string, in fact)
- *
- * Symbol Table Structure
- *
- * Two data structures:
- * Symbol Table Header
- * Symbol Table Node
- *
- * A symbol table header consists of a magic number, a pointer to
- * the first node in the symbol table, and a cursor that is used
- * when sequentialy stepping thru the entire list.
- *
- * Symbol table nodes contain a pointer to a key, a pointer to this
- * key's data, and a pointer to the next node in the chain.
- * Note that to create a hierarchical symbol table, a node is created
- * whose data points to a symbol table header.
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include "symbol.h"
-#include "splitstr.h"
-
-#define SYM_MAGIC 0xbadc0de
-
-/*
- * Some functions can report an error message by assigning it to this
- * string.
- */
-
-static char *sym_error = NULL;
-
-/*
- * Memory Allocators
- *
- * newsym() allocates a new symbol table header node
- * mknode(...) allocates a new symbol table entry
- */
-
-SYM newsym(void)
-{
- SYM h;
-
- if ((h = malloc(sizeof(struct symh))) == NULL) {
- sym_error = "sym header malloc failed!";
- return (NULL);
- }
-
- h->magic = SYM_MAGIC;
- h->sym = NULL;
- h->cursor = NULL;
- return (h);
-}
-
-static struct sym *mknode(struct sym *next, char *key, void *data)
-{
- struct sym *n;
-
- if ((n = malloc(sizeof(struct sym))) == NULL) {
- sym_error = "sym node malloc failed!";
- return (NULL);
- }
-
- n->next = next;
- n->key = strdup(key);
- n->data = data;
-
- if (n->key == NULL) {
- sym_error = "sym node strdup(key) failed!";
- free(n);
- return (NULL);
- }
- return (n);
-}
-
-/*
- * Search for a key in a single-level symbol table hierarchy.
- */
-static struct sym *find_key1(struct sym *sym, char *key)
-{
- while (sym != NULL)
- if (strcmp(sym->key, key) == 0)
- return (sym);
- else
- sym = sym->next;
- return (NULL);
-}
-
-/*
- * Create a new key node, add it to the *end* of this list
- */
-static int add_key(SYM sym, char *key, void *data)
-{
- register struct sym *sn;
-
- if (sym->sym == NULL) {
- sym->sym = mknode(NULL, key, data);
- if (sym->sym == NULL) {
- return (-1);
- }
- } else {
- for (sn = sym->sym; sn != NULL && sn->next != NULL;
- sn = sn->next) ;
- sn->next = mknode(NULL, key, data);
- assert(sn->next != NULL);
- if (sn->next == NULL)
- return (-1);
- }
- return (0);
-}
-
-/*
- * Create a new symbol table
- */
-SYM sym_open(int flags, int mode, int openinfo)
-{
- return (newsym());
-}
-
-/*
- * Add (key, data) to an existing symbol table
- *
- * If the key does not exist, a new key is added to the end of the list.
- * If the key exists and the PUT_REPLACE flag is not supplied, return EEXIST.
- * If a symbol table entry in a multi-part key is not a symbol table (i.e.
- * element two of a three or more element key), return ENOTDIR.
- *
- * "data" is not duplicated and must not point to a static area that could
- * go away before the element is deleted (such as a local string in a
- * function)
- *
- * "key" is duplicated as needed, and is not modified.
- *
- * Code:
- * chop up key on commas
- *
- * search until a key element isn't found in the key tree, the key list is
- * exhausted, or a key's data element is not a sub-tree
- *
- * if the key list is exhausted, return a "duplicate entry" error
- *
- * if the last found key's data element is not a sub-tree, return
- * something like "ENOTDIR".
- *
- * add new keys for sub-trees until key list is exhausted;
- * last node gets 'data'.
- *
- */
-int sym_put(SYM sym, char *key, void *data, int flags)
-{
- const char **keys; /* key split into a 2d string array */
- char **kk;
- char *nkey; /* copy of 'key' -- before split */
- SYM csym, ncsym; /* search: current symbol table */
- struct sym *nsym = NULL; /* search: found symbol entry */
-
- if (sym == NULL)
- return (EINVAL);
-
- nkey = strdup(key);
- keys = splitstr(key, ",", NULL);
-
- if (keys == NULL) {
- free(nkey);
- return (EINVAL);
- }
-
- for (kk = (char **)keys, csym = sym;
- *kk != NULL && (nsym = find_key1(csym->sym, *kk)) != NULL;
- csym = nsym->data) {
-
- if (*++kk == NULL)
- break;
-
- if (nsym->data == NULL) { /* fatal error */
- free(nkey);
- splitstr_free(keys);
- return (ENOTDIR);
- }
- if (((SYM) (nsym->data))->magic != SYM_MAGIC) {
- free(nkey);
- splitstr_free(keys);
- return (ENOTDIR);
- }
- }
-
- if (*kk == NULL) { /* found a complete match */
- free(nkey);
- splitstr_free(keys);
-
- if (flags == PUT_REPLACE) {
- nsym->data = data;
- return (0);
- } else {
- return (EEXIST);
- }
- }
-
- /* csym is a ptr to a list */
- for (; *kk != NULL; kk++) {
- if (*(kk + 1) != NULL) {
- add_key(csym, *kk, (void *)(ncsym = newsym()));
- csym = ncsym;
- } else {
- add_key(csym, *kk, data); /* last key */
- }
- }
-
- free(nkey);
- splitstr_free(keys);
- return (0);
-}
-
-/*
- * Retrieve a Symbol's Contents
- *
- * "key" is not modified.
- * If the key cannot be found, NULL is returned
- */
-void *sym_get(SYM sym, char *key)
-{
- char *nkey;
- const char **keys; /* key split into a 2d string array */
- char **kk;
- SYM csym; /* search: current symbol table */
- struct sym *nsym = NULL; /* search: found symbol entry */
-
- if (sym == NULL)
- return (NULL);
-
- nkey = strdup(key);
- keys = splitstr(nkey, ",", NULL);
- if (keys == NULL)
- return (NULL);
-
- for (kk = (char **)keys, csym = sym;
- *kk != NULL && (nsym = find_key1(csym->sym, *kk)) != NULL;
- csym = nsym->data) {
-
- if (*++kk == NULL)
- break;
-
- if (nsym->data == NULL) { /* fatal error */
- free(nkey);
- splitstr_free(keys);
- return (NULL);
- }
- if (((SYM) (nsym->data))->magic != SYM_MAGIC) {
- free(nkey);
- splitstr_free(keys);
- return (NULL);
- }
- }
-
- if (*kk == NULL) { /* found a complete match */
- splitstr_free(keys);
- free(nkey);
- return (nsym->data);
- } else {
- splitstr_free(keys);
- free(nkey);
- return (NULL);
- }
-}
-
-/*
- * Step thru a symbol table list
- *
- * The cursor must be set by R_CURSOR, R_FIRST before using R_NEXT.
- * NULL is returned when no more items are available.
- */
-int sym_seq(SYM sym, DBT * key, DBT * data, int flags)
-{
- SYM csym;
-
- switch (flags) {
- /*
- * A number of ways to do this:
- * specificly: sym_seq( .., "key,key") sets to Nth element of the 2nd
- * level symbol table
- * sym_seq(.., "key,key,") sets to the first element of the 3rd
- * level symbol table
- *
- * sym_seq(.., "key,key") where both must be complete keys, sets
- * cursor to the first element of the 3rd level symbol table;
- * if there is no 3rd level, return an error.
- */
- case R_CURSOR:
- csym = (SYM) sym_get(sym, (char *)key->data);
- if (csym == NULL || csym->magic != SYM_MAGIC) {
- return (2);
- }
- sym->cursor = csym->sym;
- if (sym->cursor == NULL)
- return (1);
- key->data = sym->cursor->key;
- data->data = sym->cursor->data;
-
- return (0);
-
- case R_FIRST:
- sym->cursor = sym->sym;
- if (sym->cursor == NULL)
- return (1);
- key->data = sym->cursor->key;
- data->data = sym->cursor->data;
-
- return (0);
-
- case R_NEXT:
- if (sym->cursor == NULL)
- return (1);
- sym->cursor = sym->cursor->next;
-
- if (sym->cursor == NULL)
- return (1);
-
- key->data = sym->cursor->key;
- data->data = sym->cursor->data;
-
- return (0);
-
- case R_LAST:
- case R_PREV:
- default:
- return (-1);
- }
-}
-
-/*
- * Dump a symbol table's keys.
- * Handles hierarchies, using a double quote to indicate depth, one
- * double quote for each level.
- */
-int sym_dump(SYM sym, int depth)
-{
-
- register struct sym *se; /* symbol entry */
- register int d;
-
- if (sym == NULL || sym->magic != SYM_MAGIC)
- return -1;
-
- for (se = sym->sym; se != NULL; se = se->next) {
- for (d = 0; d < depth; d++) {
- putchar('"');
- putchar(' ');
- }
- printf("%s\n", se->key);
- sym_dump((SYM) se->data, depth + 1);
- }
- return 0;
-}
-
-/*
- * sym dump, but data is _always_ a string (print it)
- */
-int sym_dump_s(SYM sym, int depth)
-{
-
- register struct sym *se; /* symbol entry */
- register int d;
-
- if (sym == NULL)
- return 0;
-
- if (sym->magic != SYM_MAGIC) {
- for (d = 0; d < depth; d++) {
- putchar('"');
- putchar(' ');
- }
- printf(" = %s\n", (char *)sym);
- return 0;
- }
-
- for (se = sym->sym; se != NULL; se = se->next) {
- for (d = 0; d < depth; d++) {
- putchar('"');
- putchar(' ');
- }
- printf("%s", se->key);
- if (((SYM) se->data)->magic == SYM_MAGIC) {
- putchar('\n');
- sym_dump_s((SYM) se->data, depth + 1);
- } else {
- printf("(%p) = %s (%p)\n", se->key, (char *)se->data,
- se->data);
- }
- }
- return 0;
-}
-
-/*
- * Remove an entire symbol table (done bottom up)
- */
-int sym_rm(SYM sym, int flags)
-{
- register struct sym *se, *nse; /* symbol entry */
-
- if (sym == NULL)
- return 0;
-
- if (sym->magic != SYM_MAGIC) {
- if (!(flags & RM_DATA))
- free(sym);
- return 0;
- }
-
- for (se = sym->sym; se != NULL;) {
- sym_rm((SYM) se->data, flags);
- nse = se->next;
- if (flags & RM_KEY)
- free(se->key);
- if (flags & RM_DATA)
- free(se->data);
- free(se);
- se = nse;
- }
- if (!(flags & RM_DATA))
- free(sym);
- return 0;
-}
diff --git a/pan/symbol.h b/pan/symbol.h
deleted file mode 100644
index 7b2d035fe1..0000000000
--- a/pan/symbol.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: symbol.h,v 1.1 2000/09/21 21:35:06 alaffin Exp $ */
-#ifndef _SYMBOL_H_
-#define _SYMBOL_H_
-
-/*
- * "Generic" Symbol Table
- *
- * These data structures are the internal part of a library providing
- * an in-memory dbm-like (key, content) database with hierarchical
- * key names.
- */
-struct sym {
- struct sym *next;
- char *key;
- void *data;
-};
-
-/*
- * Symbol Table Header
- */
-struct symh {
- int magic;
- struct sym *sym;
- struct sym *cursor;
-};
-
-/*
- * The "SYM" typedef is the only external data type.
- */
-typedef struct symh *SYM;
-
-/*
- * Data for keys and contents (lifted from dbopen(3))
- * dbopen(3) uses this for all functions, but I'm hard-wired into chars
- * for keys and the like; I just need this for sym_get
- */
-typedef struct {
- void *data;
- int size;
-} DBT;
-
-/*
- * Prototypes
- */
-
-SYM sym_open(int flags, int mode, int openinfo );
-int sym_put (SYM sym, char *key, void *data, int flags );
-void *sym_get (SYM sym, char *key );
-int sym_seq (SYM sym, DBT *key, DBT *data, int flags );
-int sym_rm (SYM sym, int flags );
-
-/*
- * Flags for sym_put
- */
-#define PUT_REPLACE 1 /* replace data on a put */
-
-/*
- * Flags for sym_rm
- */
-#define RM_KEY 001 /* free() on key pointer */
-#define RM_DATA 002 /* free() on data pointer */
-
-/*
- * Flags for sym_seq (clones of 44BSD dbopen(3))
- */
-#define R_CURSOR 1 /* set "cursor" to where "data" key is */
-#define R_FIRST 2 /* set "cursor" to first item */
-#define R_NEXT 4 /* set "cursor" to next item */
-#define R_LAST 3 /* set "cursor" to last item (UNIMP) */
-#define R_PREV 5 /* set "cursor" to previous item (UNIMP) */
-
-#endif
diff --git a/pan/tag_report.c b/pan/tag_report.c
deleted file mode 100644
index eb8fb3dbcf..0000000000
--- a/pan/tag_report.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: tag_report.c,v 1.2 2006/12/13 22:55:22 vapier Exp $ */
-#include "tag_report.h"
-#include "debug.h"
-#include "reporter.h"
-#include "splitstr.h"
-
-static char *worst_case(char *, char *);
-
-/************************************************************************
- * Report Generation *
- ************************************************************************/
-
-/*
- * printf format statement for standard reports
- * 5 fields with max/min widths
- */
-#define FORMAT "%-20.20s %-15.15s %10.10s %-20.20s %s\n"
-
-/*
- * This is the central results reporting function. All standard report
- * format results are printed thru test_result.
- */
-int test_result(char *tag, char *tcid, char *tc, char *result, SYM tags)
-{
- char *expert, expkey[KEYSIZE];
- register char *c;
- char **cont;
- const char **cont_save;
-
- if (tcid == NULL)
- tcid = "-";
- if (tc == NULL)
- tc = "-";
- if (tag == NULL)
- tag = "test_result: no tag";
- if (result == NULL)
- result = "(RESULT IS NULL)";
-
- strcpy(expkey, "contacts");
- /* note: the sym_get here does _not_ change the "cursor" */
- if ((expert = (char *)sym_get(tags, expkey)) == NULL) {
- expert = "UNKNOWN";
- }
-
- /* ' tr " " "_" ' */
- for (c = result; *c; c++) {
- if (*c == ' ') {
- *c = '_';
- }
- }
- if (*result == '\0')
- result = "?";
-
- /* split contacts on "," and print out a line for each */
- cont_save = splitstr(expert, ",", NULL);
- for (cont = (char **)cont_save; *cont != NULL; cont++) {
- printf(FORMAT, tag, tcid, tc, result, *cont);
- }
- splitstr_free(cont_save);
-
- return 0;
-}
-
-/*
- * CUTS test reporting.
- *
- * (1) make a list (2d char array) of all TCIDs (see above for why)
- * (2) look thru the list:
- * (a) keep track of the "worst case" in this *TAG*
- * (b) report each testcase's results
- * (c) if the testcase number is != 0, count it
- * (3) report tag's results
- * (4) check the number of expected results with the actual results,
- * report an error if they don't match.
- */
-
-int cuts_report(SYM tags, SYM keys, char *at, char *tag)
-{
- DBT Key, Data;
-
- /* analysis type: count of CUTS test cases */
- const char **ant;
- char *dat; /* strdup(at) */
- int tccount; /* expected count of testcases */
- int tcnum; /* seen count of testcases */
-
- /* a list of tcids */
- char **taglist, **tl;
- int ntags, tagcount;
-
- char key_get[255];
-
- char *result = "", *worst_case(); /* overall result */
-
- /* parse analysis type: cuts:tc-count */
- ant = splitstr((dat = strdup(at)), ":", NULL);
- if (ant[1] != NULL)
- tccount = atoi(ant[1]);
- else
- tccount = 0;
- free(dat);
- splitstr_free(ant);
-
- /* extract tcids */
- ntags = NTCID_START;
- taglist = (char **)malloc(sizeof(char *) * ntags);
- tagcount = 0;
-
- tl = taglist;
- sym_seq(tags, &Key, &Data, R_FIRST);
- do {
- if (tagcount == ntags) {
- /* exceeded tag array size -- realloc */
- ntags += NTCID_START;
- taglist =
- (char **)realloc(taglist, sizeof(char *) * ntags);
- tl = taglist + tagcount;
- }
-
- if (strcmp((char *)Key.data, "_keys") == 0)
- continue;
- DEBUG(D_REPORT, 10)
- printf("cuts_report: tcid %s\n", (char *)Key.data);
- *tl++ = Key.data;
- tagcount++;
- } while (sym_seq(tags, &Key, &Data, R_NEXT) == 0);
-
- if (tagcount == ntags) {
- /* exceeded tag array size -- realloc */
- ntags++; /* need just one more */
- taglist = (char **)realloc(taglist, sizeof(char *) * ntags);
- tl = taglist + tagcount;
- }
-
- *tl++ = NULL;
-
- ntags = tagcount;
-
- /* dump all found records */
- tcnum = 0;
- for (tl = taglist; *tl != NULL; tl++) {
-
- strcpy(key_get, *tl);
- Key.data = (void *)key_get;
-
- /*sym_dump_s(sym_get(tags, key_get), 0); */
-
- sym_seq(tags, &Key, &Data, R_CURSOR);
- do {
- DEBUG(D_REPORT, 10)
- printf("cuts_report: tc %s = %s\n",
- (char *)Key.data, (char *)Data.data);
- result = worst_case(result, (char *)Data.data);
- test_result(tag, *tl, (char *)Key.data,
- (char *)Data.data, keys);
- if (atoi((char *)Key.data))
- tcnum++;
- } while (sym_seq(tags, &Key, &Data, R_NEXT) == 0);
- }
-
- test_result(tag, "*", "*", result, keys);
-
- if (tccount != 0 && tccount != tcnum)
- test_result(tag, "-", "-", "TC count wrong", keys);
-
- free(taglist);
-
- return 0;
-}
-
-/*
- * Do the report generation.
- *
- * A problem: I really need multiple cursors. I'd rather not look into
- * the depths of the current symbol table implimentation (there are the
- * cursors there that I could use) so that a different (faster!) symbol
- * table can be used in the future.
- *
- * I could get a key (tag), get it's sub-keys (TCIDs), then get the key
- * again to reset to the top level, _then_ get the next key. That would
- * be very inefficient.
- *
- * The solution I chose is to extract all tags into a list (char array),
- * then go thru that list with the cursor free for other levels to use.
- *
- * (1) make a list (2d char array) of all Tags
- * (2) search for the first tag that has a "stime" record, and use that as
- * the date (MMDDYY) that the tests were run.
- * (3) print the report header
- * (4) go thru all tags and report each as described at the beginning of
- * this file
- */
-int tag_report(SYM alltags, SYM ctag, SYM keys)
-{
-
- extern int extended;
-
- char key_get[KEYSIZE];
- char *info;
-
- /* retrieved _keys values: initation status, start time, duration,
- * termination type, termination id, start line, end line. */
- char *tag, *contact, *is, *mystime, *duration, *tt, *ti, *sl, *el;
-
- /* Check all driver-level status first */
- strcpy(key_get, "tag");
- if ((tag = (char *)sym_get(keys, key_get)) == NULL) {
- return -1;
- }
-
- /* Check all driver-level status first */
- strcpy(key_get, "initiation_status");
- if ((is = (char *)sym_get(keys, key_get)) == NULL) {
- test_result(tag, NULL, NULL, "no init status", keys);
- return -1;
- }
-
- if (strcmp(is, "ok")) {
- test_result(tag, NULL, NULL, is, keys);
- } else {
-
- strcpy(key_get, "corefile");
- if ((info = (char *)sym_get(keys, key_get)) != NULL)
- if (strcmp(info, "no") != 0) {
- test_result(tag, NULL, NULL, "coredump", keys);
- }
-
- strcpy(key_get, "termination_type");
- if ((tt = (char *)sym_get(keys, key_get)) == NULL) {
- test_result(tag, NULL, NULL, "no Term Type", keys);
- return -1;
- }
-
- if (strcmp(tt, "exited")) {
- test_result(tag, NULL, NULL, tt, keys);
- }
-
- strcpy(key_get, "analysis");
- if ((info = (char *)sym_get(keys, key_get)) == NULL) {
- test_result(tag, NULL, NULL, "no Analysis Type", keys);
- return -1;
- }
-
- /* Getting here indicates that there were no fatal driver-level
- * errors. Do the kind of reporting requested by the test.
- */
-
- if (strncmp(info, "none", 4) == 0) {
- /*
- * If analysis is 'none', alway report the test as
- * a pass regardless of output or exit status.
- */
- test_result(tag, NULL, NULL, "pass", keys);
-
- } else if (strncmp(info, "cuts", 4)) {
-
- /*
- * If analysis is not cuts, assume it is 'exit', thus
- * the termination_id is used to determine pass/fail result.
- */
- if (strcmp(tt, "timeout")) {
- strcpy(key_get, "termination_id");
- if ((info =
- (char *)sym_get(keys, key_get)) == NULL) {
- test_result(tag, NULL, NULL,
- "no_Term_Id", keys);
- } else {
- if (strcmp(info, "0")) {
- test_result(tag, NULL, NULL,
- "fail", keys);
- } else {
- test_result(tag, NULL, NULL,
- "pass", keys);
- }
- }
- }
- } else {
- cuts_report(ctag, keys, info, tag);
- }
- }
-
- /*
- * Extended Format:
- * - tcid+tc = "!"
- * - tab separated fields
- * - no field widths
- * - fields 6 - ~ are:
- * start-time (time_t)
- * duration
- * termination_id
- * termination_type
- * Start Line (of test results in output file)
- * End Line
- */
-
- if (extended) {
-
- strcpy(key_get, "termination_id");
- if ((ti = (char *)sym_get(keys, key_get)) == NULL) {
- ti = "No_Termination_ID";
- }
-
- strcpy(key_get, "termination_type");
- if ((tt = (char *)sym_get(keys, key_get)) == NULL) {
- tt = "No_Termination_Type";
- }
-
- strcpy(key_get, "duration");
- if ((duration = (char *)sym_get(keys, key_get)) == NULL) {
- duration = "No_Duration";
- }
-
- strcpy(key_get, "_Start_line");
- if ((sl = (char *)sym_get(keys, key_get)) == NULL) {
- sl = "No_Start_line";
- }
-
- strcpy(key_get, "_End_line");
- if ((el = (char *)sym_get(keys, key_get)) == NULL) {
- el = "No_End_line";
- }
-
- strcpy(key_get, "contacts");
- if ((contact = (char *)sym_get(keys, key_get)) == NULL) {
- contact = "No_Contacts";
- }
-
- strcpy(key_get, "stime");
- if ((mystime = (char *)sym_get(keys, key_get)) == NULL) {
- mystime = "No_stime";
- }
-
- printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n",
- tag, "!", "!", is, contact, mystime, duration,
- ti, tt, sl, el);
- }
-
- return 0;
-}
-
-/*
- * Print a header made up of the RTS keywords
- * In "extended" mode, print the header to stderr.
- */
-int print_header(SYM tags)
-{
- DBT Key, Data;
- char key_get[255];
-
- FILE *out;
-
- extern int extended;
-
- if (extended)
- out = stderr;
- else
- out = stdout;
-
- fprintf(out, "System Configuration:\n");
- /* build header out of RTS keywords */
- sprintf(key_get, "_RTS");
- Key.data = (void *)key_get;
- if (sym_seq(tags, &Key, &Data, R_CURSOR) == 0) {
- do {
- if (strcmp((char *)Key.data, "PATH") == 0)
- continue;
- fprintf(out, "%-20.20s %s\n", (char *)Key.data,
- (char *)Data.data);
- } while (sym_seq(tags, &Key, &Data, R_NEXT) == 0);
- }
-
- fprintf(out, "\n");
- fprintf(out, FORMAT, "tag", "tcid", "testcase", "status", "contact");
- fprintf(out,
- "-------------------------------------------------------------------------------\n");
-
- return 0;
-}
-
-/*
- * CUTS testcase record
- *
- * This is passed s SYM for the current tag and the initiation keys.
- * The text seen by lex is in yytext (global).
- */
-int cuts_testcase(SYM tag, SYM keys)
-{
- char *cuts_info[6];
- char key[KEYSIZE];
- char *oldresult, *newresult, *worst_case();
- int tok_num = 0;
- extern char yytext[];
-
- cuts_info[tok_num] = strtok(yytext, "\t ");
- while (tok_num < 5 &&
- (cuts_info[++tok_num] = strtok(NULL, "\t ")) != NULL) ;
-
- strcpy(key, cuts_info[0]);
- strcat(key, ",");
- strcat(key, cuts_info[1]);
-
-#ifdef DEBUGGING
- DEBUG(D_SCAN_CUTS, 1) {
- printf("cuts_testcase: TCID=%s TC=%s Result=%s\n", cuts_info[0],
- cuts_info[1], cuts_info[2]);
- printf("cuts_testcase: %d %s\n", tok_num, key);
- }
-#endif
-
- if ((oldresult = (char *)sym_get(tag, key)) != NULL) {
- /* Duplicate -- assume mulitple runs */
- /* keep "worst case" */
- newresult = worst_case(oldresult, cuts_info[2]);
- sym_put(tag, key, strdup(newresult), PUT_REPLACE);
- free(oldresult); /* remove the "data" portion of the key */
- } else {
- sym_put(tag, key, strdup(cuts_info[2]), 0);
- }
- return 0;
-}
-
-/*
- * Determine a "worst case" status from two given statuses.
- */
-static char *worst_case(char *t1, char *t2)
-{
- /* NULL-terminated table, ordered from worst-case to best-case */
- static char *worst[] = {
- "FAIL", "BROK", "PASS", "CONF",
- "WARN", "INFO", NULL,
- };
-
- char **w1, **w2;
-
- /* Search the table for each status, then use the index to determine
- which has a lower precedence */
- for (w1 = worst; *w1 != NULL && strcmp(t1, *w1); w1++) ;
-
- for (w2 = worst; *w2 != NULL && strcmp(t2, *w2); w2++) ;
-
- if (w1 < w2)
- return (t1);
- else
- return (t2);
-
-}
--
2.34.1
More information about the ltp
mailing list