/* * freescope - Free source browser * Copyright (C) 2001 Olivier Deme * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ /* * FILE: dbinf.h * * DESCRIPTION: This file implements the class DbInf that manages the database */ #ifndef _DBINF_H_ #define _DBINF_H_ /************/ /* INCLUDES */ /************/ #ifdef HAVE_CONFIG_H #include #endif // HAVE_CONFIG_H #include #include #include #include #include #include #include #include "arch.h" #include "defs.h" #include "parser.h" /*********************/ /* NAMESPACE SYMBOLS */ /*********************/ using std::fstream; using std::slist; using std::hash_map; using std::string; /********************/ /* TYPE DEFINITIONS */ /********************/ typedef struct { string file; line_nbr_t lineno; string scope; } match_t; typedef struct { string file; time_t timestamp; } file_time_t; typedef Uint32 file_ptr_t; /*********************/ /* CLASS DEFINITIONS */ /*********************/ template <> class hash { public: size_t operator()(string const &str) const { hash h; return (h(str.c_str())); } }; class DbInf { // TYPE DEFINITIONS private: typedef slist pos_t; typedef unsigned int symbol_code_t; typedef unsigned short file_code_t; typedef hash_map > cont_symcode_string_t; typedef hash_map > cont_string_symcode_t; typedef hash_map > cont_string_time_t; typedef list completions_t; // CONSTANTS static const size_t BUFFER_SIZE; static const size_t RECORD_LENGTH; static const symbol_code_t SYMBOL_NEW_FILE; static const symbol_code_t SYMBOL_FREE_RECORD; // CONSTRUCTORS private: DbInf (); public: virtual ~DbInf (); // METHODS public: static DbInf* instance (); static int add_entry (const symbol_type_t type, const char* symbol, const size_t symbol_length, const char* scope, const size_t scope_length, const line_nbr_t lineno); void open (const string& filename); void flush (); void find (const string& symbol, const symbol_type_t type, list& result); time_t get_timestamp (const string& file); void add_timestamp (const string& file, const time_t timestamp); int load_symbols (); void set_mod_file (bool val) { m_do_existing_file = val; }; void set_file (const string& file); string next_completion (const string& stub, int& index, int& total); string prev_completion (const string& stub, int& index, int& total); void invalidate_records (const list& files); bool is_file_in_db (string file); void dump (); protected: int load_files (); void find_completions (const string& stub); private: void update_records (); void find_free_place (); // ATTRIBUTES private: static DbInf* m_instance; fstream m_db_file; file_ptr_t m_st_lower; file_ptr_t m_st_upper; file_ptr_t m_ft_lower; file_ptr_t m_ft_upper; bool m_db_modified; bool m_do_existing_file; string m_file; string m_old_file; string m_stub; completions_t m_completions; int m_completion_index; list::iterator m_it_completion; cont_symcode_string_t m_code_symbol; cont_string_symcode_t m_symbol_code; cont_string_time_t m_time_stamps; list m_files; list m_files_copy; vector m_buffer; }; #endif // _DBINF_H_