Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Mudathir Mohamed 4 : : * 5 : : * This file is part of the cvc5 project. 6 : : * 7 : : * Copyright (c) 2009-2024 by the authors listed in the file AUTHORS 8 : : * in the top-level source directory and their institutional affiliations. 9 : : * All rights reserved. See the file COPYING in the top-level source 10 : : * directory for licensing information. 11 : : * **************************************************************************** 12 : : * 13 : : * input class. 14 : : */ 15 : : 16 : : #include "parser/input.h" 17 : : 18 : : #include <fstream> 19 : : 20 : : #include <cvc5/cvc5_parser.h> 21 : : 22 : : namespace cvc5 { 23 : : namespace parser { 24 : : 25 : : /** File input class */ 26 : : class FileInput : public Input 27 : : { 28 : : public: 29 : 22704 : FileInput(const std::string& filename) : Input() 30 : : { 31 : 22700 : d_fs.open(filename, std::fstream::in); 32 [ + + ]: 22700 : if (!d_fs.is_open()) 33 : : { 34 : 4 : std::stringstream ss; 35 : 2 : ss << "Couldn't open file: " << filename; 36 : 2 : throw ParserException(ss.str()); 37 : : } 38 : 22698 : } 39 : 22698 : std::istream* getStream() override { return &d_fs; } 40 : : 41 : : private: 42 : : /** File stream */ 43 : : std::ifstream d_fs; 44 : : }; 45 : : 46 : : /** Stream reference input class */ 47 : : class StreamInput : public Input 48 : : { 49 : : public: 50 : 205 : StreamInput(std::istream& input) : Input(), d_input(input) {} 51 : 205 : std::istream* getStream() override { return &d_input; } 52 : 205 : bool isInteractive() const override { return true; } 53 : : 54 : : private: 55 : : /** Reference to stream */ 56 : : std::istream& d_input; 57 : : }; 58 : : 59 : : /** String input class, which buffers to a std::stringstream */ 60 : : class StringInput : public Input 61 : : { 62 : : public: 63 : 152 : StringInput(const std::string& input) : Input() { d_input << input; } 64 : 152 : std::istream* getStream() override { return &d_input; } 65 : : 66 : : private: 67 : : /** Reference to stream */ 68 : : std::stringstream d_input; 69 : : }; 70 : : 71 : 23057 : Input::Input() {} 72 : : 73 : 22700 : std::unique_ptr<Input> Input::mkFileInput(const std::string& filename) 74 : : { 75 : 22700 : return std::unique_ptr<Input>(new FileInput(filename)); 76 : : } 77 : : 78 : 205 : std::unique_ptr<Input> Input::mkStreamInput(std::istream& input) 79 : : { 80 : 205 : return std::unique_ptr<Input>(new StreamInput(input)); 81 : : } 82 : : 83 : 152 : std::unique_ptr<Input> Input::mkStringInput(const std::string& input) 84 : : { 85 : 152 : return std::unique_ptr<Input>(new StringInput(input)); 86 : : } 87 : 22850 : bool Input::isInteractive() const { return false; } 88 : : 89 : : } // namespace parser 90 : : } // namespace cvc5