mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	- updated func/fift - additional checks in block validator - docs - tunnel prototype in ADNL
		
			
				
	
	
		
			163 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|     This file is part of TON Blockchain Library.
 | |
| 
 | |
|     TON Blockchain Library is free software: you can redistribute it and/or modify
 | |
|     it under the terms of the GNU Lesser General Public License as published by
 | |
|     the Free Software Foundation, either version 2 of the License, or
 | |
|     (at your option) any later version.
 | |
| 
 | |
|     TON Blockchain Library is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|     GNU Lesser General Public License for more details.
 | |
| 
 | |
|     You should have received a copy of the GNU Lesser General Public License
 | |
|     along with TON Blockchain Library.  If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
|     Copyright 2017-2020 Telegram Systems LLP
 | |
| */
 | |
| #pragma once
 | |
| 
 | |
| #include <string>
 | |
| #include <vector>
 | |
| #include <iostream>
 | |
| 
 | |
| namespace src {
 | |
| 
 | |
| /*
 | |
|  *
 | |
|  *   SOURCE FILE READER
 | |
|  *
 | |
|  */
 | |
| 
 | |
| struct FileDescr {
 | |
|   std::string filename;
 | |
|   std::string text;
 | |
|   std::vector<long> line_offs;
 | |
|   bool is_stdin;
 | |
|   FileDescr(std::string _fname, bool _stdin = false) : filename(std::move(_fname)), is_stdin(_stdin) {
 | |
|   }
 | |
|   const char* push_line(std::string new_line);
 | |
|   const char* convert_offset(long offset, long* line_no, long* line_pos, long* line_size = nullptr) const;
 | |
| };
 | |
| 
 | |
| struct Fatal {
 | |
|   std::string message;
 | |
|   Fatal(std::string _msg) : message(std::move(_msg)) {
 | |
|   }
 | |
|   std::string get_msg() const {
 | |
|     return message;
 | |
|   }
 | |
| };
 | |
| 
 | |
| std::ostream& operator<<(std::ostream& os, const Fatal& fatal);
 | |
| 
 | |
| struct SrcLocation {
 | |
|   const FileDescr* fdescr;
 | |
|   long char_offs;
 | |
|   SrcLocation() : fdescr(nullptr), char_offs(-1) {
 | |
|   }
 | |
|   SrcLocation(const FileDescr* _fdescr, long offs = -1) : fdescr(_fdescr), char_offs(-1) {
 | |
|   }
 | |
|   bool defined() const {
 | |
|     return fdescr;
 | |
|   }
 | |
|   bool eof() const {
 | |
|     return char_offs == -1;
 | |
|   }
 | |
|   void set_eof() {
 | |
|     char_offs = -1;
 | |
|   }
 | |
|   const char* convert_pos(long* line_no, long* line_pos, long* line_size = nullptr) const {
 | |
|     return defined() ? fdescr->convert_offset(char_offs, line_no, line_pos, line_size) : nullptr;
 | |
|   }
 | |
|   void show(std::ostream& os) const;
 | |
|   bool show_context(std::ostream& os) const;
 | |
|   void show_gen_error(std::ostream& os, std::string message, std::string err_type = "") const;
 | |
|   void show_note(std::string err_msg) const {
 | |
|     show_gen_error(std::cerr, err_msg, "note");
 | |
|   }
 | |
|   void show_warning(std::string err_msg) const {
 | |
|     show_gen_error(std::cerr, err_msg, "warning");
 | |
|   }
 | |
|   void show_error(std::string err_msg) const {
 | |
|     show_gen_error(std::cerr, err_msg, "error");
 | |
|   }
 | |
| };
 | |
| 
 | |
| std::ostream& operator<<(std::ostream& os, const SrcLocation& loc);
 | |
| 
 | |
| struct Error {
 | |
|   virtual ~Error() = default;
 | |
|   virtual void show(std::ostream& os) const = 0;
 | |
| };
 | |
| 
 | |
| std::ostream& operator<<(std::ostream& os, const Error& error);
 | |
| 
 | |
| struct ParseError : Error {
 | |
|   SrcLocation where;
 | |
|   std::string message;
 | |
|   ParseError(const SrcLocation& _where, std::string _msg) : where(_where), message(_msg) {
 | |
|   }
 | |
|   ParseError(const SrcLocation* _where, std::string _msg) : message(_msg) {
 | |
|     if (_where) {
 | |
|       where = *_where;
 | |
|     }
 | |
|   }
 | |
|   ~ParseError() override = default;
 | |
|   void show(std::ostream& os) const override;
 | |
| };
 | |
| 
 | |
| class SourceReader {
 | |
|   std::istream* ifs;
 | |
|   FileDescr* fdescr;
 | |
|   SrcLocation loc;
 | |
|   bool eof;
 | |
|   std::string cur_line;
 | |
|   int cur_line_len;
 | |
|   void set_eof();
 | |
|   const char *start, *cur, *end;
 | |
| 
 | |
|  public:
 | |
|   SourceReader(std::istream* _is, FileDescr* _fdescr);
 | |
|   bool load_line();
 | |
|   bool is_eof() const {
 | |
|     return eof;
 | |
|   }
 | |
|   int is_eoln() const {
 | |
|     return cur == end;
 | |
|   }
 | |
|   int skip_spc();
 | |
|   bool seek_eoln() {
 | |
|     skip_spc();
 | |
|     return is_eoln();
 | |
|   }
 | |
|   bool seek_eof();
 | |
|   const char* cur_line_cstr() const {
 | |
|     return cur_line.c_str();
 | |
|   }
 | |
|   const SrcLocation& here() const {
 | |
|     return loc;
 | |
|   }
 | |
|   char cur_char() const {
 | |
|     return *cur;
 | |
|   }
 | |
|   char next_char() const {
 | |
|     return cur[1];
 | |
|   }
 | |
|   const char* get_ptr() const {
 | |
|     return cur;
 | |
|   }
 | |
|   const char* get_end_ptr() const {
 | |
|     return end;
 | |
|   }
 | |
|   const char* set_ptr(const char* ptr);
 | |
|   void advance(int n) {
 | |
|     set_ptr(get_ptr() + n);
 | |
|   }
 | |
|   void error(std::string err_msg) {
 | |
|     throw ParseError{loc, err_msg};
 | |
|   }
 | |
| };
 | |
| 
 | |
| }  // namespace src
 |