blob: 9b933f955479a07488458444cc522275a59db351 [file] [log] [blame]
/* Copyright 2015. Los Alamos National Security, LLC. This material was produced
* under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National
* Laboratory (LANL), which is operated by Los Alamos National Security, LLC
* for the U.S. Department of Energy. The U.S. Government has rights to use,
* reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR LOS
* ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* Under this license, it is required to include a reference to this work. We
* request that each derivative work contain a reference to LANL Copyright
* Disclosure C15076/LA-CC-15-054 so that this work's impact can be roughly
* measured.
*
* This is LANL Copyright Disclosure C15076/LA-CC-15-054
*/
/*
* PowerParser is a general purpose input file parser for software applications.
*
* Authors: Chuck Wingate XCP-2 caw@lanl.gov
* Robert Robey XCP-2 brobey@lanl.gov
*/
#ifndef CMDHHINCLUDE
#define CMDHHINCLUDE
// ***************************************************************************
// ***************************************************************************
// Generalized command class.
// ***************************************************************************
// ***************************************************************************
#include <string>
#include <deque>
#include <vector>
#include <map>
#include <sstream>
#include "Variable.hh"
#include "Function.hh"
namespace PP
{
using std::string;
using std::deque;
using std::vector;
using std::map;
using std::stringstream;
//class Variable;
//class Function;
class Cmd
{
public:
Cmd();
Cmd(string s, map<string, Variable> *v, map<string, Function> *f,
deque<string> *lstr, int lnum, int file_lnum, string fname,
stringstream &serr, int &ierr);
void set_index_base(int base);
void set_case_sensitive(bool case_sensitive_in);
void add_word(string str, int lnum, int file_lnum, string fname);
void erase_word(int iw);
void erase_last_word();
void reset_name_type();
void delete_words(int i1, int i2);
void check_ppmm(stringstream &serr, int &ierr);
void remove_commas();
void handle_two_words();
bool check_input_end(bool kill_run, stringstream &serr, int &ierr);
void print_duplicate_line(int iw, stringstream &ss, int fn_width,
int lnum_width, string after_lnum);
void get_duplicate_sizes(int iw, int &fn_width, int &lnum_width);
string get_cmd_filename(stringstream &ssfiles);
void handle_quotes(stringstream &serr, int &ierr);
void handle_exe_args(string &sout);
void deprecated_input01(string action, stringstream &serr, int &ierr);
void fatal_error(int iw, stringstream &serr, int &ierr);
void warning(int iw, stringstream &serr, int &ierr);
void get_bool_int(string &cname, int *array_vals, const vector<int> &size,
vector<Cmd *> &dup_cmd1, vector<int> &dup_wdex1,
int dup_fatal, vector<int> &dup_vals,
bool skip, stringstream &serr, int &ierr);
void get_bool(string &cname, bool *array_vals, const vector<int> &size,
vector<Cmd *> &dup_cmd1, vector<int> &dup_wdex1,
int dup_fatal, vector<int> &dup_vals,
bool skip, stringstream &serr, int &ierr);
void get_int(string &cname, int *array_vals, const vector<int> &size,
vector<Cmd *> &dup_cmd1, vector<int> &dup_wdex1,
int dup_fatal, vector<int> &dup_vals,
bool skip, stringstream &serr, int &ierr);
void get_int(string &cname, int64_t *array_vals, const vector<int> &size,
vector<Cmd *> &dup_cmd1, vector<int> &dup_wdex1,
int dup_fatal, vector<int> &dup_vals,
bool skip, stringstream &serr, int &ierr);
void get_real(string &cname, double *array_vals, const vector<int> &size,
vector<Cmd *> &dup_cmd1, vector<int> &dup_wdex1,
int dup_fatal, vector<int> &dup_vals,
bool skip, stringstream &serr, int &ierr);
void get_char(string &cname, vector<string> &vstr, const vector<int> &size,
bool single_char, vector<Cmd *> &dup_cmd1,
vector<int> &dup_wdex1, int dup_fatal,
vector<int> &dup_vals, bool skip,
stringstream &serr, int &ierr);
void get_size(vector<int> &size, stringstream &serr, int &ierr);
void get_sizeb(vector<int> &size, stringstream &serr, int &ierr);
// Handle unary minus and plus in command lines.
void handle_cmd_unary_minus(stringstream &serr, int &ierr);
void handle_cmd_unary_plus(stringstream &serr, int &ierr);
// Handle multiplicity in command lines, i.e. a(1)=15*3.0
void handle_cmd_multiplicity(stringstream &serr, int &ierr);
// Handle variables.
bool check_for_dimension(stringstream &serr, int &ierr);
bool check_for_var_description(stringstream &serr, int &ierr);
void substitute_variables(stringstream &serr, int &ierr);
void set_variables(stringstream &serr, int &ierr);
// Math evaluation.
void math_eval(stringstream &serr, int &ierr);
void check_misplaced_math(stringstream &serr, int &ierr);
// Handle comments.
void single_line_comments();
void multi_line_comments(int &level);
// Handle processed flags.
void clear_processed();
void set_processed(bool ip);
void check_processed(bool &good, stringstream &serr, int &ierr);
// If statements.
void handle_if(bool &skip, deque<bool> &skip_level,
deque<bool> &satisfied,
stringstream &serr, int &ierr);
// Do loops.
void handle_do(bool &skip, deque<int> &do_start, int &cdex,
bool &end_do_loop, stringstream &serr, int &ierr);
bool find_matching_enddo(int &dlev, bool &stop_checking);
// Subroutines
void handle_subroutines(bool &skip,
bool &go_to_sub, string &sub_name,
bool &go_to_call,
stringstream &serr, int &ierr);
bool find_subroutine(string &sub_name);
void get_call_args(vector<string> &sargs, vector<bool> &sargs_isvar,
stringstream &serr, int &ierr);
void get_sub_args(vector<string> &sargs, vector<bool> &sargs_isvar);
void copy_call_args(vector<string> &sargs, vector<bool> &sargs_isvar);
void copy_sub_args(vector<string> &sargs, vector<bool> &sargs_isvar);
// Accessor functions.
string get_cmd_name() { return cmd_name; }
string get_cmd_type() { return cmd_type; }
int get_nwords() { return words.size(); }
string get_string(int iw) {
if ((int)words.size() <= iw) return "";
return words[iw].get_string();
}
string get_original_str() { return original_str; }
int get_line_number(int iw) { return words[iw].get_line_number(); }
int get_file_line_number(int iw) { return words[iw].get_file_line_number(); }
string get_filename(int iw) { return words[iw].get_filename(); }
string get_filename() { return filename; }
deque<string> *get_lines() { return lines; }
void set_filename(string fn) {
filename = fn;
for (int iw=0; iw<(int)words.size(); iw++) {
words[iw].set_filename(fn);
}
}
bool is_include() { if(words[0].get_string() == "include") return true;
return false; }
// Debug
void print_all_words();
void print_all_words(stringstream &ss);
void print_using_words(stringstream &ss);
void print_using_words_fm(stringstream &ss);
void print_original_string(stringstream &ss);
private:
// Initialization method for this class.
void init();
void process_string(string in_str, stringstream &serr, int &ierr);
bool extract_next_word(int &istart, string &str, string &word,
stringstream &serr, int &ierr);
int find_closing_symbol(string opensym, string closesym, int i1);
bool handle_innermost_parens(int &i1, int &i2, int &iwres, int &nargs,
bool remp, stringstream &serr, int &ierr);
void evaluate_function(int iw1, int &i2, int &nargs,
stringstream &serr, int &ierr);
void seval(int &i1, int &i2, stringstream &serr, int &ierr);
void handle_unary_op(int i1, int &i2, string utype,
stringstream &serr, int &ierr);
void do_unary_op(int ip, string utype);
void handle_star_star(); // ** exponentiation
void handle_ops();
void subvar_w0(int i1, int &i2, stringstream &serr, int &ierr);
void subvar0(int vardex, string &varname, int increment,
stringstream &serr, int &ierr);
bool evaluate_variable(int iw1, int &i2, int &nargs,
stringstream &serr, int &ierr);
int find(int i1, int i2, string s);
int find_last(string s, int i1, int i2);
int find_any_char(int i1, int i2, string s);
void replace_words(int i1, int i2, Word &w);
void replace_words(int i1, int i2, vector<Word> &vw);
void merge_words(int i1, int i2);
bool separate_str(string &subs, string &fstr, vector<string> &vs);
int find_equals();
bool check_syntax(vector<int> &istart, stringstream &serr, int &ierr);
bool get_nvals(vector<int> &istart, const vector<int> &size,
int &nvals, stringstream &serr, int &ierr);
void debug_print_words(string s);
void fatal_error2(stringstream &serr, int &ierr);
void error_dup_line(string &cname, int wdex, int cdex,
vector<int> &dup_wdex1, vector<Cmd *> &dup_cmd1,
vector<int> &dup_vals, const vector<int> &size,
int dup_fatal, stringstream &serr, int &ierr);
// This is needed for telling the user what line in the input
// file or include file the error occurred on.
//
// line_number The line_number corresponding to this command, this is
// an index into lines and starts from 1, not 0.
// lines Pointer to the deque of original lines. This contains all
// the lines from the input file and any include files.
// file_line_number The line number in the input file or include file.
// filename The name of the input file or include file.
//
// file_line_number and filename are needed to that the user can open
// the file and go to the line in error.
int line_number, file_line_number;
string filename;
deque<string> *lines;
// index base, generally 1 for Fortran style and 0 for C/C++, default 1
// int index_base; -- using static variable instead
// The original string before processing.
string original_str;
// Pointer to the map of variables.
map<string, Variable> *vmap;
// Pointer to the map of functions.
map<string, Function> *fmap;
// Definitions of white space, delimiters, etc.
string white_space;
string delims;
// Storage for all the words on the line.
deque <Word> words;
// The name and type of the command.
string cmd_name;
string cmd_type;
// Used for subroutines.
vector<string> call_args, sub_args;
vector<bool> call_args_isvar, sub_args_isvar;
};
} // end of PP namespace
#endif