From 961a02ab396177657f12272e77c38d3afc0cbcd8 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Wed, 17 Mar 2021 18:26:13 +0100 Subject: [PATCH] removed: old SpaceParser --- space/spaceparser.cpp | 678 ------------------------------------------ space/spaceparser.h | 328 -------------------- 2 files changed, 1006 deletions(-) delete mode 100644 space/spaceparser.cpp delete mode 100644 space/spaceparser.h diff --git a/space/spaceparser.cpp b/space/spaceparser.cpp deleted file mode 100644 index 392c9ce..0000000 --- a/space/spaceparser.cpp +++ /dev/null @@ -1,678 +0,0 @@ -/* - * This file is a part of PikoTools - * and is distributed under the (new) BSD licence. - * Author: Tomasz Sowa - */ - -/* - * Copyright (c) 2008-2017, Tomasz Sowa - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name Tomasz Sowa nor the names of contributors to this - * project may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include "spaceparser.h" -#include "utf8/utf8.h" - - -namespace PT -{ - -#ifdef nonexisting_value - - -SpaceParser::SpaceParser() -{ - root_space = 0; - SetDefault(); -} - - -void SpaceParser::SetSpace(Space * pspace) -{ - root_space = pspace; -} - - -void SpaceParser::SetSpace(Space & pspace) -{ - root_space = &pspace; -} - - -void SpaceParser::SetDefault() -{ - // you can change this separators to what you want - // you shoud not use only white characters here (as expected by IsWhite() method) - // and new line characters ('\n') - separator = '='; - commentary = '#'; - list_start = '('; - list_end = ')'; - list_delimiter = ','; - skip_empty = false; - use_escape_char = true; - input_as_utf8 = true; -} - - - -void SpaceParser::SkipEmpty(bool skip) -{ - skip_empty = skip; -} - - -void SpaceParser::UseEscapeChar(bool escape) -{ - use_escape_char = escape; -} - - -void SpaceParser::UTF8(bool utf) -{ - input_as_utf8 = utf; -} - - - - -SpaceParser::Status SpaceParser::Parse(const char * file_name) -{ - reading_from_file = true; - - file.clear(); - file.open(file_name, std::ios_base::binary | std::ios_base::in); - - if( file ) - { - Parse(); - file.close(); - } - else - { - status = cant_open_file; - } - -return status; -} - - - -SpaceParser::Status SpaceParser::Parse(const std::string & file_name) -{ - return Parse(file_name.c_str()); -} - - - - -SpaceParser::Status SpaceParser::Parse(const wchar_t * file_name) -{ - PT::WideToUTF8(file_name, afile_name); - return Parse(afile_name.c_str()); -} - - - -SpaceParser::Status SpaceParser::Parse(const std::wstring & file_name) -{ - return Parse(file_name.c_str()); -} - - - -SpaceParser::Status SpaceParser::ParseString(const char * str) -{ - reading_from_file = false; - reading_from_wchar_string = false; - pchar_ascii = str; - pchar_unicode = 0; - - Parse(); - -return status; -} - - -SpaceParser::Status SpaceParser::ParseString(const std::string & str) -{ - return ParseString(str.c_str()); -} - - -SpaceParser::Status SpaceParser::ParseString(const wchar_t * str) -{ - reading_from_file = false; - reading_from_wchar_string = true; - pchar_unicode = str; - pchar_ascii = 0; - - Parse(); - -return status; -} - - -SpaceParser::Status SpaceParser::ParseString(const std::wstring & str) -{ - return ParseString(str.c_str()); -} - - -void SpaceParser::Parse() -{ - if( !root_space ) - { - status = no_space; - return; - } - - line = 1; - status = ok; - space = root_space; - reading_commentary = false; - ReadChar(); - SkipWhiteLines(); - - ParseLoop(); - - if( status == ok && space != root_space ) - { - // last closing ')' characters are missing (closing a space) - status = syntax_error; - } - - token.clear(); - key.clear(); - value.clear(); -} - - -void SpaceParser::ParseLoop() -{ - while( status == ok && lastc != -1 ) - { - if( lastc == list_end ) - { - SpaceEnds(); - } - else - { - ReadKey(); - SkipWhite(); - - if( lastc == list_start ) - { - SpaceStarts(); - } - else - if( lastc == separator ) - { - ReadValue(); - AddKeyValuePair(); - } - else - { - status = syntax_error; - } - } - - if( status == ok ) - SkipWhiteLines(); - } -} - - -void SpaceParser::SpaceEnds() -{ - if( space == root_space ) - { - // there cannot be a loose list end character in the global space - status = syntax_error; - } - else - { - space = space->parent; - ReadChar(); // skipping closing space character ')' - SkipWhite(); - } -} - - -void SpaceParser::SpaceStarts() -{ - Space * new_space = new Space(); - space->spaces.push_back(new_space); - new_space->parent = space; - new_space->name = key; - space = new_space; - - ReadChar(); // skipping space starts character ')' -} - - - - - -/* - those white characters here should be the same as in space.h -*/ -bool SpaceParser::IsWhite(int c) -{ - // dont use '\n' here - // 13 (\r) is at the end of a line in a dos file \r\n - // 160 is an unbreakable space - if( c==' ' || c=='\t' || c==13 || c==160 ) - return true; - -return false; -} - - -/* - skip_lines is default false -*/ -void SpaceParser::SkipWhite(bool skip_lines) -{ - while( IsWhite(lastc) || lastc == commentary || (skip_lines && lastc=='\n')) - { - if( lastc == commentary ) - SkipComment(); - else - ReadChar(); - } -} - - -void SpaceParser::SkipWhiteLines() -{ - SkipWhite(true); -} - - -/* - do not skip the last \n character -*/ -void SpaceParser::SkipLine() -{ - while( lastc != -1 && lastc != '\n' ) - ReadChar(); -} - - -/* - do not skip the last \n character -*/ -void SpaceParser::SkipComment() -{ - reading_commentary = true; - SkipLine(); - reading_commentary = false; -} - - - -void SpaceParser::Trim(std::wstring & s) -{ -std::wstring::size_type i; - - if( s.empty() ) - return; - - // looking for white characters at the end - for(i=s.size()-1 ; i>0 && IsWhite(s[i]) ; --i); - - if( i==0 && IsWhite(s[i]) ) - { - // the whole string has white characters - s.clear(); - return; - } - - // deleting white characters at the end - if( i != s.size() - 1 ) - s.erase(i+1, std::wstring::npos); - - // looking for white characters at the beginning - for(i=0 ; itable.find(var); - - if( i != space->table.end() ) - space->table.erase(i); -} - - - - - -void SpaceParser::ReadTokenQuoted() -{ - ReadChar(); // skipping the first quotation mark - - while( lastc != -1 && (char_was_escaped || lastc != '"') ) - { - token += static_cast(lastc); - ReadChar(); - } - - if( !char_was_escaped && lastc == '"' ) - ReadChar(); // skipping the last quotation mark - else - status = syntax_error; -} - - -void SpaceParser::ReadTokenSingle(bool white_delimit, bool new_line_delimit, int delimit1, int delimit2) -{ - while( true ) - { - if( lastc == commentary ) - SkipComment(); - - if( lastc == -1 || - (!char_was_escaped && - ( - lastc == list_end || - (white_delimit && IsWhite(lastc)) || - (new_line_delimit && lastc == '\n') || - (delimit1 != -1 && lastc == delimit1) || - (delimit2 != -1 && lastc == delimit2) - ) ) ) - - { - break; - } - - token += static_cast(lastc); - ReadChar(); - } - - Trim(token); -} - - -void SpaceParser::ReadToken(bool white_delimit, bool new_line_delimit, int delimit1, int delimit2) -{ - token.clear(); - SkipWhite(); - - if( !char_was_escaped && lastc == '"' ) - ReadTokenQuoted(); - else - ReadTokenSingle(white_delimit, new_line_delimit, delimit1, delimit2); -} - - -void SpaceParser::ReadKey() -{ - ReadToken(false, true, separator, list_start); - key = token; - SkipWhite(); -} - - - -void SpaceParser::ReadValueList() -{ - ReadChar(); // skipping the first list character ')' - SkipWhiteLines(); - - while( lastc != -1 && lastc != list_end ) - { - ReadToken(true, true, list_delimiter, list_end); - value.push_back(token); - - SkipWhiteLines(); - - if( lastc == list_delimiter ) - { - ReadChar(); - SkipWhiteLines(); - } - } - - if( lastc == list_end ) - { - ReadChar(); // skipping the last list character ')' - SkipWhite(); - } - else - { - status = syntax_error; // missing one ')' - } -} - - -void SpaceParser::ReadValueSingle() -{ - SkipWhite(); - ReadToken(false, true, -1, -1); - value.push_back(token); - SkipWhite(); -} - - -void SpaceParser::ReadValue() -{ - ReadChar(); // skipping separator '=' - value.clear(); - SkipWhite(); - - if( lastc == list_start ) - ReadValueList(); - else - ReadValueSingle(); - - SkipWhiteLines(); -} - - -void SpaceParser::AddKeyValuePair() -{ - if( value.empty() && skip_empty ) - { - DeleteFromTable(key); - return; - } - - space->table[key] = value; -} - - - - - - -int SpaceParser::ReadUTF8Char() -{ -int c; -bool correct; - - lastc = -1; - - do - { - PT::UTF8ToInt(file, c, correct); - - if( !file ) - return lastc; - } - while( !correct ); - - lastc = c; - - if( lastc == '\n' ) - ++line; - -return lastc; -} - - - -int SpaceParser::ReadASCIIChar() -{ - lastc = file.get(); - - if( lastc == '\n' ) - ++line; - -return lastc; -} - - - - -int SpaceParser::ReadCharFromWcharString() -{ - if( *pchar_unicode == 0 ) - lastc = -1; - else - lastc = *(pchar_unicode++); - - if( lastc == '\n' ) - ++line; - -return lastc; -} - - -int SpaceParser::ReadCharFromUTF8String() -{ -int c; -bool correct; - - lastc = -1; - - do - { - size_t len = PT::UTF8ToInt(pchar_ascii, c, correct); - pchar_ascii += len; - - if( *pchar_ascii == 0 ) - return lastc; - } - while( !correct ); - - lastc = c; - - if( lastc == '\n' ) - ++line; - -return lastc; - -} - - -int SpaceParser::ReadCharFromAsciiString() -{ - if( *pchar_ascii == 0 ) - lastc = -1; - else - lastc = *(pchar_ascii++); - - if( lastc == '\n' ) - ++line; - -return lastc; -} - - -int SpaceParser::ReadCharNoEscape() -{ - if( reading_from_file ) - { - if( input_as_utf8 ) - return ReadUTF8Char(); - else - return ReadASCIIChar(); - } - else - { - if( reading_from_wchar_string ) - { - return ReadCharFromWcharString(); - } - else - { - if( input_as_utf8 ) - return ReadCharFromUTF8String(); - else - return ReadCharFromAsciiString(); - } - } -} - - -int SpaceParser::ReadChar() -{ - char_was_escaped = false; - ReadCharNoEscape(); - - if( !reading_commentary && use_escape_char && lastc == '\\' ) - { - char_was_escaped = true; - ReadCharNoEscape(); - - switch(lastc) - { - case '0': lastc = 0; break; - case 't': lastc = '\t'; break; - case 'r': lastc = '\r'; break; - case 'n': lastc = '\n'; break; - // in other cases we return the last character - } - } - -return lastc; -} - - -#endif - - -} // namespace - - - - diff --git a/space/spaceparser.h b/space/spaceparser.h deleted file mode 100644 index bba03e6..0000000 --- a/space/spaceparser.h +++ /dev/null @@ -1,328 +0,0 @@ -/* - * This file is a part of PikoTools - * and is distributed under the (new) BSD licence. - * Author: Tomasz Sowa - */ - -/* - * Copyright (c) 2010-2017, Tomasz Sowa - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name Tomasz Sowa nor the names of contributors to this - * project may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef headerfile_picotools_confparser_spaceparser -#define headerfile_picotools_confparser_spaceparser - -#include -#include "space.h" - - - -namespace PT -{ - -#ifdef nonexisting_value - - -class SpaceParser -{ -public: - - - /* - ctor -- setting default values (SetDefault() method) - */ - SpaceParser(); - - - /* - setting the root space - */ - void SetSpace(Space * pspace); - void SetSpace(Space & pspace); - - - /* - setting options of the parser to the default values - utf8 etc. - */ - void SetDefault(); - - - /* - status of parsing - */ - enum Status { ok, cant_open_file, syntax_error, no_space }; - - - /* - the last status of parsing, set by Parse() methods - */ - Status status; - - - /* - a number of a line in which there is a syntax_error - */ - int line; - - - /* - main methods used to parse - file_name is the path to a file - */ - Status Parse(const char * file_name); - Status Parse(const std::string & file_name); - Status Parse(const wchar_t * file_name); - Status Parse(const std::wstring & file_name); - - - /* - main methods used to parse - str - input string (either 8bit ascii or UTF-8 -- see UTF8() method) - */ - Status ParseString(const char * str); - Status ParseString(const std::string & str); - - - /* - main methods used to parse - here input string is always in unicode (wide characters) - */ - Status ParseString(const wchar_t * str); - Status ParseString(const std::wstring & str); - - - /* - if true then empty values and lists, e.g: - option = - option2 = () - will be omitted (not inserted to 'table') - default: false - */ - void SkipEmpty(bool skip); - - - /* - '\' character is used to escape other characters - so "some \t t\"ext" will produce "some t t"ext" - default: true - special characters: - \0 - 0 (zero code point) - \t - tabulator (9 code point) - \r - carriage return (13 code point) - \n - a new line character (10 code point) - in other cases we return the last character so \Z gives Z and \\ gives one \ - escape character are not used in commentaries - so you can write: - # this is my comment \n but this was not a new line - */ - void UseEscapeChar(bool escape); - - - /* - if true then the input file or string (char* or std::string) is treated as UTF-8 - default: true - */ - void UTF8(bool utf); - - -private: - - - /* - current space set by SetSpace(); - */ - Space * root_space; - - - /* - a space in which we are now - */ - Space * space; - - - /* - true if Parse() method was called - false if ParseString() was called - */ - bool reading_from_file; - - - /* - pointers to the current character - if ParseString() is in used - */ - const char * pchar_ascii; - const wchar_t * pchar_unicode; - - - /* - true if ParseString(wchar_t *) or ParseString(std::wstring&) was called - */ - bool reading_from_wchar_string; - - - /* - last read token - */ - std::wstring token; - - - /* - last read key - */ - std::wstring key; - - - /* - last read list - */ - Space::Value value; - - - /* - separator between a variable and a value, default: '=' - */ - int separator; - - - /* - commentary char, default: '#' - */ - int commentary; - - - /* - list starting character, default: '(' - */ - int list_start; - - - /* - list ending character, default: ')' - */ - int list_end; - - - /* - list delimiter, default: ',' - */ - int list_delimiter; - - - /* - last read char - or -1 if the end - */ - int lastc; - - - /* - true if the lastc was escaped (with a backslash) - we have to know if the last sequence was \" or just " - */ - bool char_was_escaped; - - - /* - current file - */ - std::ifstream file; - - - /* - if true then empty lists, e.g: - option = - option2 = () - will be omitted (not inserted to 'table') - default: false - */ - bool skip_empty; - - - /* - input file is in UTF-8 - default: true - */ - bool input_as_utf8; - - - /* - if true you can use an escape character '\' in quoted values - */ - bool use_escape_char; - - - /* - true if we are reading the commentary (#) - this is to avoid parsing escape characters in the commentary - */ - bool reading_commentary; - - std::string afile_name; - - void Parse(); - void ParseLoop(); - void SpaceEnds(); - void SpaceStarts(); - - void DeleteFromTable(const std::wstring & var); - - void ReadTokenQuoted(); - void ReadTokenSingle(bool white_delimit, bool new_line_delimit, int delimit1, int delimit2); - void ReadToken(bool white_delimit, bool new_line_delimit, int delimit1, int delimit2); - void ReadKey(); - void ReadValueList(); - void ReadValueSingle(); - void ReadValue(); - void AddKeyValuePair(); - - int ReadUTF8Char(); - int ReadASCIIChar(); - int ReadCharFromWcharString(); - int ReadCharFromUTF8String(); - int ReadCharFromAsciiString(); - int ReadCharNoEscape(); - int ReadChar(); - bool IsWhite(int c); - void SkipWhite(bool skip_lines = false); - void SkipWhiteLines(); - void SkipLine(); - void SkipComment(); - void Trim(std::wstring & s); - -}; - -#endif - - -} // namespace - - -#endif