|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2002,2003 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// (c) COPYRIGHT URI/MIT 1994-1999
|
|
Packit |
a4aae4 |
// Please read the full copyright statement in the file COPYRIGHT_URI.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// Authors:
|
|
Packit |
a4aae4 |
// jhrg,jimg James Gallagher <jgallagher@gso.uri.edu>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Test the DDS scanner, parser and DDS class.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// jhrg 8/29/94
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <fstream>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <GetOpt.h>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "parser.h"
|
|
Packit |
a4aae4 |
#include "dds.tab.hh"
|
|
Packit |
a4aae4 |
#include "BaseType.h"
|
|
Packit |
a4aae4 |
#include "Int32.h"
|
|
Packit |
a4aae4 |
#include "DDS.h"
|
|
Packit |
a4aae4 |
#include "util.h"
|
|
Packit |
a4aae4 |
#include "Error.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
#ifdef DAP4
|
|
Packit |
a4aae4 |
#include "D4ParserSax2.h"
|
|
Packit |
a4aae4 |
#include "D4BaseTypeFactory.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace libdap;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void test_scanner();
|
|
Packit |
a4aae4 |
void test_parser(const string &name);
|
|
Packit |
a4aae4 |
void test_class();
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
void test_dap4_parser(const string &name);
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int ddslex();
|
|
Packit |
a4aae4 |
// int ddsparse(DDS &);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
extern YYSTYPE ddslval;
|
|
Packit |
a4aae4 |
extern int ddsdebug;
|
|
Packit |
a4aae4 |
static bool print_ddx = false;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
const char *prompt = "dds-test: ";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void usage(string name) {
|
|
Packit |
a4aae4 |
cerr << "Usage: " << name << "[s] [pd] [c]" << endl
|
|
Packit |
a4aae4 |
<< "s: Test the scanner." << endl
|
|
Packit |
a4aae4 |
<< "p: Test the parser; reads from stdin and prints the" << endl
|
|
Packit |
a4aae4 |
<< " internal structure to stdout." << endl
|
|
Packit |
a4aae4 |
<< "d: Turn on parser debugging. (only for the hard core.)" << endl
|
|
Packit |
a4aae4 |
<< "c: Test the C++ code for manipulating DDS objects." << endl
|
|
Packit |
a4aae4 |
<< " Reads from stdin, parses and writes the modified DDS" << endl
|
|
Packit |
a4aae4 |
<< " to stdout." << endl;
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
fprintf(stderr, "usage: %s %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n", name.c_str(), "[s] [pd] [c]",
|
|
Packit |
a4aae4 |
"s: Test the scanner.", "p: Test the parser; reads from stdin and prints the",
|
|
Packit |
a4aae4 |
" internal structure to stdout.", "d: Turn on parser debugging. (only for the hard core.)",
|
|
Packit |
a4aae4 |
"c: Test the C++ code for manipulating DDS objects.",
|
|
Packit |
a4aae4 |
" Reads from stdin, parses and writes the modified DDS", " to stdout.");
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int main(int argc, char *argv[]) {
|
|
Packit |
a4aae4 |
GetOpt getopt(argc, argv, "spP:dcx"); // remove fF:
|
|
Packit |
a4aae4 |
int option_char;
|
|
Packit |
a4aae4 |
int scanner_test = 0, parser_test = 0, class_test = 0;
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
int dap4_parser_test = 0;
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
string name = "";
|
|
Packit |
a4aae4 |
// process options
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
while ((option_char = getopt()) != -1)
|
|
Packit |
a4aae4 |
switch (option_char) {
|
|
Packit |
a4aae4 |
case 'd':
|
|
Packit |
a4aae4 |
ddsdebug = 1;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 's':
|
|
Packit |
a4aae4 |
scanner_test = 1;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'p':
|
|
Packit |
a4aae4 |
parser_test = 1;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'P':
|
|
Packit |
a4aae4 |
parser_test = 1;
|
|
Packit |
a4aae4 |
name = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
case 'f':
|
|
Packit |
a4aae4 |
dap4_parser_test = 1;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 'F':
|
|
Packit |
a4aae4 |
dap4_parser_test = 1;
|
|
Packit |
a4aae4 |
name = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
case 'x':
|
|
Packit |
a4aae4 |
print_ddx = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'c':
|
|
Packit |
a4aae4 |
class_test = 1;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case '?':
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
usage(argv[0]);
|
|
Packit |
a4aae4 |
return 1;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (!scanner_test && !parser_test && !class_test/* && !dap4_parser_test*/) {
|
|
Packit |
a4aae4 |
usage(argv[0]);
|
|
Packit |
a4aae4 |
return 1;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
if (scanner_test)
|
|
Packit |
a4aae4 |
test_scanner();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (parser_test)
|
|
Packit |
a4aae4 |
test_parser(name);
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
if (dap4_parser_test)
|
|
Packit |
a4aae4 |
test_dap4_parser(name);
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
if (class_test)
|
|
Packit |
a4aae4 |
test_class();
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void test_scanner(void) {
|
|
Packit |
a4aae4 |
int tok;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
cout << prompt << flush; // first prompt
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
while ((tok = ddslex())) {
|
|
Packit |
a4aae4 |
switch (tok) {
|
|
Packit |
a4aae4 |
case SCAN_DATASET:
|
|
Packit |
a4aae4 |
cout << "DATASET" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_LIST:
|
|
Packit |
a4aae4 |
cout << "LIST" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_SEQUENCE:
|
|
Packit |
a4aae4 |
cout << "SEQUENCE" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_STRUCTURE:
|
|
Packit |
a4aae4 |
cout << "STRUCTURE" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_FUNCTION:
|
|
Packit |
a4aae4 |
cout << "FUNCTION" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_GRID:
|
|
Packit |
a4aae4 |
cout << "GRID" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_BYTE:
|
|
Packit |
a4aae4 |
cout << "BYTE" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_INT16:
|
|
Packit |
a4aae4 |
cout << "INT16" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_UINT16:
|
|
Packit |
a4aae4 |
cout << "UINT16" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_INT32:
|
|
Packit |
a4aae4 |
cout << "INT32" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_UINT32:
|
|
Packit |
a4aae4 |
cout << "UINT32" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_FLOAT32:
|
|
Packit |
a4aae4 |
cout << "FLOAT32" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_FLOAT64:
|
|
Packit |
a4aae4 |
cout << "FLOAT64" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_STRING:
|
|
Packit |
a4aae4 |
cout << "STRING" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_URL:
|
|
Packit |
a4aae4 |
cout << "Url" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case SCAN_WORD:
|
|
Packit |
a4aae4 |
cout << "WORD: " << ddslval.word << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case '{':
|
|
Packit |
a4aae4 |
cout << "Left Brace" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case '}':
|
|
Packit |
a4aae4 |
cout << "Right Brace" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case '[':
|
|
Packit |
a4aae4 |
cout << "Left Bracket" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case ']':
|
|
Packit |
a4aae4 |
cout << "Right Bracket" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case ';':
|
|
Packit |
a4aae4 |
cout << "Semicolon" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case ':':
|
|
Packit |
a4aae4 |
cout << "Colon" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case '=':
|
|
Packit |
a4aae4 |
cout << "Assignment" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
cout << "Error: Unrecognized input" << endl;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
cout << prompt << flush; // print prompt after output
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void test_parser(const string &name) {
|
|
Packit |
a4aae4 |
BaseTypeFactory *factory = new BaseTypeFactory;
|
|
Packit |
a4aae4 |
DDS table(factory);
|
|
Packit |
a4aae4 |
if (name.empty())
|
|
Packit |
a4aae4 |
table.parse();
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
table.parse(name);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (table.check_semantics())
|
|
Packit |
a4aae4 |
cout << "DDS past semantic check" << endl;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cout << "DDS failed semantic check" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (table.check_semantics(true))
|
|
Packit |
a4aae4 |
cout << "DDS past full semantic check" << endl;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cout << "DDS failed full semantic check" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (print_ddx)
|
|
Packit |
a4aae4 |
table.print_xml_writer(cout, false, "");
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
table.print(cout);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete factory;
|
|
Packit |
a4aae4 |
factory = 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
void test_dap4_parser(const string &name) {
|
|
Packit |
a4aae4 |
#ifdef DAP4
|
|
Packit |
a4aae4 |
D4BaseTypeFactory factory;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DDS table(&factory);
|
|
Packit |
a4aae4 |
D4ParserSax2 parser;
|
|
Packit |
a4aae4 |
if (name.empty()) {
|
|
Packit |
a4aae4 |
parser.intern(cin, &table);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
fstream in(name.c_str(), ios_base::in);
|
|
Packit |
a4aae4 |
parser.intern(in, &table);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (table.check_semantics())
|
|
Packit |
a4aae4 |
cout << "DAP4 DDS past semantic check" << endl;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cout << "DAP4 DDS failed semantic check" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (table.check_semantics(true))
|
|
Packit |
a4aae4 |
cout << "DAP4 DDS past full semantic check" << endl;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cout << "DAP4 DDS failed full semantic check" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (print_ddx)
|
|
Packit |
a4aae4 |
table.print_xml_writer(cout, false, "");
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
table.print(cout);
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
cerr << "DAP4 parsing not supported by this version of libdap" << endl;
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void test_class(void) {
|
|
Packit |
a4aae4 |
BaseTypeFactory *factory = new BaseTypeFactory;
|
|
Packit |
a4aae4 |
DDS table(factory);
|
|
Packit |
a4aae4 |
table.parse();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (table.check_semantics())
|
|
Packit |
a4aae4 |
cout << "DDS past semantic check" << endl;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cout << "DDS filed semantic check" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (table.check_semantics(true))
|
|
Packit |
a4aae4 |
cout << "DDS past full semantic check" << endl;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cout << "DDS filed full semantic check" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
table.print(cout);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DDS table2 = table; // test copy ctor;
|
|
Packit |
a4aae4 |
table2.print(cout);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
BaseTypeFactory *factory2 = new BaseTypeFactory;
|
|
Packit |
a4aae4 |
DDS table3(factory2);
|
|
Packit |
a4aae4 |
table3 = table; // test operator=
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
cout << "Dataset name: " << table.get_dataset_name() << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string name = "goofy";
|
|
Packit |
a4aae4 |
table.add_var(table.get_factory()->NewInt32(name)); // table dtor should delete this object
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
table.print(cout);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
BaseType *btp = table.var(name);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
btp->print_decl(cout, "", true); // print out goofy w/semicolon
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
table.del_var(name);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
table.print(cout);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
table.add_var(table.get_factory()->NewInt32("goofy"));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
table.print(cout);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
btp = table.var("goofy");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
btp->print_decl(cout, "", true); // print out goofy w/semicolon
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
table.del_var("goofy");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
table.print(cout);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
for (DDS::Vars_iter p = table.var_begin(); p != table.var_end(); p++)
|
|
Packit |
a4aae4 |
(*p)->print_decl(cout, "", true); // print them all w/semicolons
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete factory;
|
|
Packit |
a4aae4 |
factory = 0;
|
|
Packit |
a4aae4 |
delete factory2;
|
|
Packit |
a4aae4 |
factory2 = 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|