src/lib/INIReader.cpp
branchv_0
changeset 24 dd3c03162e89
parent 23 dd72e4ea4399
child 25 ee70b17950bd
equal deleted inserted replaced
23:dd72e4ea4399 24:dd3c03162e89
    38 		for (INIContentHandler* handler : handlers) handler->startDocument();
    38 		for (INIContentHandler* handler : handlers) handler->startDocument();
    39 
    39 
    40 		std::regex whitespacePattrern("\\s*");
    40 		std::regex whitespacePattrern("\\s*");
    41 		std::regex commentPattrern("\\s*(;|#)\\s*(.*)");
    41 		std::regex commentPattrern("\\s*(;|#)\\s*(.*)");
    42 		std::regex sectionPattrern("\\s*\\[\\s*([^\\]]+)\\s*\\]\\s*(\\[\\s*([^\\]]+)\\s*\\])?\\s*((;|#)\\s*(.*))?");
    42 		std::regex sectionPattrern("\\s*\\[\\s*([^\\]]+)\\s*\\]\\s*(\\[\\s*([^\\]]+)\\s*\\])?\\s*((;|#)\\s*(.*))?");
    43 		std::regex entryQuotesPattrern(/***/"\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*\"([^']+)\"\\s*((;|#)\\s*(.*))?");
    43 		std::regex entryQuotedPattrern("\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*(\"|')((?:(?!\\5).)*)(\\5)\\s*((;|#)\\s*(.*))?");
    44 		std::regex entryApostrophesPattrern("\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*'([^']+)'\\s*((;|#)\\s*(.*))?");
       
    45 		std::regex entryPlainPattrern("\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*(.*?)\\s*");
    44 		std::regex entryPlainPattrern("\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*(.*?)\\s*");
    46 
    45 
    47 		std::smatch match;
    46 		std::smatch match;
    48 		bool inSection = false;
    47 		bool inSection = false;
    49 		std::string line;
    48 		std::string line;
    77 				// event.tag = match[3];
    76 				// event.tag = match[3];
    78 				// KDE uses some weird INI dialect that allows [section][x] syntax where „x“ is kind of „tag“ that signalizes some properties of given section.
    77 				// KDE uses some weird INI dialect that allows [section][x] syntax where „x“ is kind of „tag“ that signalizes some properties of given section.
    79 				// see <https://userbase.kde.org/KDE_System_Administration/Configuration_Files>, „[$i]“ means that the section is „locked“
    78 				// see <https://userbase.kde.org/KDE_System_Administration/Configuration_Files>, „[$i]“ means that the section is „locked“
    80 				// We may emit this information somehow later, but for now, it is just ignored.
    79 				// We may emit this information somehow later, but for now, it is just ignored.
    81 				for (INIContentHandler* handler : handlers) handler->startSection(event);
    80 				for (INIContentHandler* handler : handlers) handler->startSection(event);
    82 			} else if (std::regex_match(line, match, entryQuotesPattrern) || std::regex_match(line, match, entryApostrophesPattrern)) {
    81 			} else if (std::regex_match(line, match, entryQuotedPattrern)) {
    83 				INIContentHandler::EntryEvent event;
    82 				INIContentHandler::EntryEvent event;
    84 				event.lineNumber = lineNumber;
    83 				event.lineNumber = lineNumber;
    85 				event.eventNumber = ++eventNumber;
    84 				event.eventNumber = ++eventNumber;
    86 				event.key = match[2];
    85 				event.key = match[2];
    87 				event.subKey = match[4];
    86 				event.subKey = match[4];
    88 				event.fullKey = match[1];
    87 				event.fullKey = match[1];
    89 				event.value = match[5];
    88 				event.value = match[6];
    90 				if (match.size() == 9) event.comment = match[8];
    89 				event.comment = match[10];
    91 				for (INIContentHandler* handler : handlers) handler->entry(event);
    90 				for (INIContentHandler* handler : handlers) handler->entry(event);
    92 			} else if (std::regex_match(line, match, entryPlainPattrern)) {
    91 			} else if (std::regex_match(line, match, entryPlainPattrern)) {
    93 				INIContentHandler::EntryEvent event;
    92 				INIContentHandler::EntryEvent event;
    94 				event.lineNumber = lineNumber;
    93 				event.lineNumber = lineNumber;
    95 				event.eventNumber = ++eventNumber;
    94 				event.eventNumber = ++eventNumber;