--- trunk/src/mdParser/SimplePreprocessor.hpp 2006/03/29 22:24:59 924 +++ trunk/src/mdParser/SimplePreprocessor.hpp 2009/11/25 20:02:06 1390 @@ -6,19 +6,10 @@ * redistribute this software in source and binary code form, provided * that the following conditions are met: * - * 1. Acknowledgement of the program authors must be made in any - * publication of scientific results based in part on use of the - * program. An acceptable form of acknowledgement is citation of - * the article in which the program was described (Matthew - * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher - * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented - * Parallel Simulation Engine for Molecular Dynamics," - * J. Comput. Chem. 26, pp. 252-271 (2005)) - * - * 2. Redistributions of source code must retain the above copyright + * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - * 3. Redistributions in binary form must reproduce the above copyright + * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. @@ -37,6 +28,15 @@ * arising out of the use of or inability to use software, even if the * University of Notre Dame has been advised of the possibility of * such damages. + * + * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your + * research, please cite the appropriate papers when you publish your + * work. Good starting points are: + * + * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). + * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). + * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). + * [4] Vardeman & Gezelter, in progress (2009). */ #ifndef MDPARSER_SIMPLEPREPROCESSOR_HPP @@ -47,46 +47,48 @@ #include #include "utils/StringTokenizer.hpp" #include "utils/Trim.hpp" -#include "utils/OOPSEException.hpp" +#include "utils/OpenMDException.hpp" #include "utils/simError.h" /** * @class SimplePreprocessor * @brief A simple preprocessor. - * @note only support #include #ifdef, #ifndef, #endif, #define and #undef, c-like multiple line - * comment is not support, macro substitude is not support. + * @note only supports #include #ifdef, #ifndef, #endif, #define and #undef, c-like multiple line + * comment is not supported, macro substitute is not supported. */ -namespace oopse { +namespace OpenMD { class SimplePreprocessor { public: - bool preprocess(const std::string& filename, ostream& os) { + bool preprocess(std::istream& myStream, const std::string& filename, int startingLine, ostream& os) { std::set defineSet; std::stack ifStates; ifStates.push(true); - return doPreprocess(filename, os, defineSet, ifStates); + return doPreprocess(myStream, filename, startingLine, os, defineSet, ifStates); } private: - bool doPreprocess(const std::string& filename, ostream& os, std::set& defineSet, std::stack& ifStates) { - std::ifstream input(filename.c_str()); - if (!input.is_open()) { - std::stringstream ss; - ss << "Can not open " << filename << " for preprocessing\n"; - - sprintf(painCave.errMsg, - "Can not open (%s) for processing. \n" - "\tPlease check md file name syntax.\n", filename.c_str()); - - painCave.isFatal = 1; - simError(); - - throw OOPSEException(ss.str()); - } - int lineNo =1; + bool doPreprocess(std::istream& myStream, const std::string& filename, int startingLine, ostream& os, std::set& defineSet, std::stack& ifStates) { + //std::ifstream input(filename.c_str()); + //if (!input.is_open()) { + // std::stringstream ss; + // ss << "Can not open " << filename << " for preprocessing\n"; + // + // sprintf(painCave.errMsg, + // "Can not open (%s) for processing. \n" + // "\tPlease check md file name syntax.\n", filename.c_str()); + // + // painCave.isFatal = 1; + // simError(); + // + // throw OpenMDException(ss.str()); + //} + int lineNo = startingLine; os << "#line " << lineNo << " \"" << filename << "\"\n"; - while(input.getline(buffer, bufferSize)) { + const int bufferSize = 1024; + char buffer[bufferSize]; + while(myStream.getline(buffer, bufferSize)) { ++lineNo; std::string line = trimLeftCopy(buffer); if (!line.empty() && line[0] == '#') { @@ -108,7 +110,14 @@ class SimplePreprocessor { SimplePreprocessor subPreprocessor; std::string includeFilename = tokens[1]; includeFilename = includeFilename.substr(1, includeFilename.length() -2); - bool ret = subPreprocessor.doPreprocess(includeFilename, os, defineSet, ifStates); + std::ifstream includeStream(includeFilename.c_str()); + if (!includeStream.is_open()) { + std::stringstream ss; + ss << "Can not open " << includeFilename << " for preprocessing\n"; + throw OpenMDException(ss.str()); + } + + bool ret = subPreprocessor.doPreprocess(includeStream, includeFilename, 1, os, defineSet, ifStates); if (!ret) { std::cout << "Error in preprocessing\n"; return false; @@ -135,7 +144,7 @@ class SimplePreprocessor { } os << std::endl; } else { - std::cout << tokens[0] << " is not support" << std::endl; + std::cout << tokens[0] << " is not supported (yet)." << std::endl; return false; } }else { @@ -152,8 +161,6 @@ class SimplePreprocessor { } private: - const static int bufferSize = 1024; - char buffer[bufferSize]; }; }