| /* |
| Copyright 2019 Alain Dargelas |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| /* |
| * File: AnalyzeFile.cpp |
| * Author: alain |
| * |
| * Created on July 23, 2017, 11:05 PM |
| */ |
| #include "../SourceCompile/SymbolTable.h" |
| #include "../Design/TimeInfo.h" |
| #include "../Design/DesignElement.h" |
| #include "../CommandLine/CommandLineParser.hpp" |
| #include "../ErrorReporting/Error.h" |
| #include "../ErrorReporting/Location.h" |
| #include "../ErrorReporting/ErrorDefinition.h" |
| #include "../ErrorReporting/ErrorContainer.h" |
| #include "IncludeFileInfo.h" |
| #include "../Utils/StringUtils.h" |
| #include "CompilationUnit.h" |
| #include "PreprocessFile.h" |
| #include "../SourceCompile/CompileSourceFile.h" |
| #include "../SourceCompile/Compiler.h" |
| #include "../Design/Design.h" |
| #include "AnalyzeFile.h" |
| #include <fstream> |
| #include <stdio.h> |
| #include <ctype.h> |
| #include <string.h> |
| #include <iostream> |
| #include <sstream> |
| #include <stack> |
| #include <regex> |
| using namespace SURELOG; |
| |
| void |
| saveContent (std::string fileName, std::string& content) |
| { |
| std::ifstream ifs; |
| ifs.open (fileName); |
| bool save = true; |
| if (ifs.good ()) |
| { |
| std::string str ((std::istreambuf_iterator<char>(ifs)), |
| std::istreambuf_iterator<char>()); |
| ifs.close (); |
| if (str == content) |
| save = false; |
| } |
| if (save) |
| { |
| std::ofstream ofs (fileName); |
| ofs << content; |
| ofs.close (); |
| } |
| } |
| |
| void |
| AnalyzeFile::checkSLlineDirective_ (std::string line, unsigned int lineNb) |
| { |
| std::stringstream ss; |
| std::string keyword; |
| /* Storing the whole string into string stream */ |
| ss << line; |
| std::string tmp; |
| ss >> tmp; |
| std::stringstream (tmp) >> keyword; |
| unsigned int type = 0; |
| if (keyword == "SLline") |
| { |
| IncludeFileInfo info (0, 0, 0, 0); |
| ss >> tmp; |
| std::stringstream (tmp) >> info.m_sectionStartLine; |
| ss >> tmp; |
| std::string file; |
| std::stringstream (tmp) >> file; |
| StringUtils::ltrim (file, '\"'); |
| StringUtils::rtrim (file, '\"'); |
| info.m_sectionFile = m_clp->getSymbolTable ()->registerSymbol (file); |
| ss >> tmp; |
| std::stringstream (tmp) >> type; |
| |
| if (type == 1) |
| { |
| // Push |
| info.m_originalLine = lineNb; |
| info.m_type = type; |
| m_includeFileInfo.push (info); |
| } |
| else if (type == 2) |
| { |
| // Pop |
| if (m_includeFileInfo.size ()) |
| m_includeFileInfo.pop (); |
| if (m_includeFileInfo.size ()) |
| { |
| m_includeFileInfo.top ().m_sectionFile = info.m_sectionFile; |
| m_includeFileInfo.top ().m_originalLine = lineNb; |
| m_includeFileInfo.top ().m_sectionStartLine = info.m_sectionStartLine - 1; |
| m_includeFileInfo.top ().m_type = type; |
| } |
| } |
| } |
| } |
| |
| std::string |
| AnalyzeFile::setSLlineDirective_ (unsigned int lineNb, unsigned int& origFromLine, std::string& origFile) |
| { |
| std::string result; |
| if (m_includeFileInfo.size ()) |
| { |
| result = "SLline "; |
| origFile = m_clp->getSymbolTable ()->getSymbol (m_includeFileInfo.top ().m_sectionFile); |
| unsigned int origLine = m_includeFileInfo.top ().m_originalLine; |
| unsigned int sectionStartLine = m_includeFileInfo.top ().m_sectionStartLine; |
| origFromLine = lineNb - origLine + sectionStartLine; |
| result += std::to_string (origFromLine); |
| result += " \""; |
| result += origFile; |
| result += "\" "; |
| result += std::to_string (1); |
| result += "\n"; |
| |
| } |
| result = ""; |
| return result; |
| } |
| |
| void |
| AnalyzeFile::analyze () |
| { |
| std::ifstream ifs; |
| ifs.open (m_ppFileName); |
| if (!ifs.good ()) |
| { |
| return; |
| } |
| unsigned int minNbLineForPartitioning = m_clp->getNbLinesForFileSpliting (); |
| std::vector<FileChunk> fileChunks; |
| std::string line; |
| bool inPackage = false; |
| int inClass = 0; |
| int inModule = 0; |
| bool inProgram = false; |
| int inInterface = 0; |
| bool inConfig = false; |
| bool inChecker = false; |
| bool inPrimitive = false; |
| // int inFunction = false; |
| //int inTask = false; |
| bool inComment = false; |
| bool inString = false; |
| unsigned int lineNb = 0; |
| unsigned int charNb = 0; |
| unsigned int startLine = 0; |
| unsigned int startChar = 0; |
| unsigned int indexPackage = 0; |
| unsigned int indexModule = 0; |
| int nbPackage = 0, nbClass = 0, nbModule = 0, nbProgram = 0, |
| nbInterface = 0, nbConfig = 0, nbChecker = 0, nbPrimitive = 0/*./re , nbFunction = 0, nbTask = 0*/; |
| std::vector<std::string> allLines; |
| std::string prev_keyword; |
| std::string prev_prev_keyword; |
| allLines.push_back ("FILLER LINE"); |
| const std::regex import_regex ("import[ ]+[a-zA-Z_0-9:\\*]+[ ]*;"); |
| std::smatch pieces_match; |
| std::string fileLevelImportSection; |
| // Parse the file |
| while (std::getline (ifs, line)) |
| { |
| bool inLineComment = false; |
| allLines.push_back (line); |
| lineNb++; |
| char c = 0; |
| char cp = 0; |
| std::string keyword; |
| for (unsigned int i = 0; i < line.size (); i++) |
| { |
| charNb++; |
| c = line[i]; |
| if (cp == '/' && c == '*') |
| { |
| if (!inLineComment) |
| inComment = true; |
| } |
| else if (cp == '/' && c == '/') |
| { |
| if ((!inComment ) && (!inString)) |
| inLineComment = true; |
| } |
| else if (cp == '*' && c == '/') |
| { |
| inComment = false; |
| } |
| else if (cp != '\\' && c == '\"') |
| { |
| if ((!inLineComment) && (!inComment)) |
| inString = !inString; |
| } |
| if ((!inComment) && (!inLineComment) && (!inString)) |
| { |
| if ((islower (c) || isupper (c) || c == '_') && (i != (line.size () - 1))) |
| { |
| keyword += c; |
| } |
| else |
| { |
| if ((islower (c) || isupper (c) || c == '_') && (i == (line.size () - 1))) |
| { |
| keyword += c; |
| } |
| |
| if (keyword == "package") |
| { |
| std::string packageName; |
| for (unsigned int j = i + 1; j < line.size (); j++) |
| { |
| if (line[j] == ';') |
| break; |
| if (line[j] != ' ') |
| packageName += line[j]; |
| } |
| m_design->addOrderedPackage (packageName); |
| inPackage = true; |
| startLine = lineNb; |
| startChar = charNb; |
| FileChunk chunk (DesignElement::ElemType::Package, startLine, 0, startChar, 0); |
| fileChunks.push_back (chunk); |
| indexPackage = fileChunks.size () - 1; |
| } |
| if (keyword == "endpackage") |
| { |
| if (inPackage) |
| { |
| fileChunks[indexPackage].m_toLine = lineNb; |
| fileChunks[indexPackage].m_endChar = charNb; |
| nbPackage++; |
| } |
| inPackage = false; |
| //std::cout << "PACKAGE:" << allLines[fileChunks[indexPackage].m_fromLine] << " f:" << fileChunks[indexPackage].m_fromLine |
| // << " t:" << fileChunks[indexPackage].m_toLine << std::endl; |
| } |
| if (keyword == "module") |
| { |
| if (inModule == 0) |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| FileChunk chunk (DesignElement::ElemType::Module, startLine, 0, startChar, 0); |
| fileChunks.push_back (chunk); |
| indexModule = fileChunks.size () - 1; |
| } |
| inModule++; |
| } |
| if (keyword == "endmodule") |
| { |
| if (inModule == 1) |
| { |
| |
| fileChunks[indexModule].m_toLine = lineNb; |
| fileChunks[indexModule].m_endChar = charNb; |
| nbModule++; |
| } |
| inModule--; |
| } |
| /* |
| if (keyword == "function" && (prev_keyword != "context") && (prev_prev_keyword != "import")) |
| { |
| if ((inClass == 0) && (inInterface == 0) && (inModule == 0)) |
| { |
| if (inFunction == false) |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| } |
| inFunction = true; |
| } |
| } |
| if (keyword == "endfunction") |
| { |
| if (inFunction == true) |
| { |
| FileChunk chunk (DesignElement::ElemType::Function, startLine, lineNb, startChar, charNb); |
| fileChunks.push_back (chunk); |
| nbFunction++; |
| } |
| inFunction = false; |
| } |
| if (keyword == "task") |
| { |
| if ((inClass == 0) && (inInterface == 0) && (inModule == 0)) |
| { |
| if (inTask == false) |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| } |
| inTask = true; |
| } |
| } |
| if (keyword == "endtask") |
| { |
| if (inTask == true) |
| { |
| FileChunk chunk (DesignElement::ElemType::Task, startLine, lineNb, startChar, charNb); |
| fileChunks.push_back (chunk); |
| nbTask++; |
| } |
| inTask = false; |
| } |
| */ |
| if (keyword == "class" && (prev_keyword != "typedef")) |
| { |
| if (inClass == 0) |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| } |
| inClass++; |
| } |
| if (keyword == "endclass") |
| { |
| if (inClass == 1) |
| { |
| FileChunk chunk (DesignElement::ElemType::Class, startLine, lineNb, startChar, charNb); |
| fileChunks.push_back (chunk); |
| nbClass++; |
| } |
| inClass--; |
| } |
| if (keyword == "interface") |
| { |
| if (inInterface == 0) |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| } |
| inInterface++; |
| } |
| if (keyword == "endinterface") |
| { |
| if (inInterface == 1) |
| { |
| FileChunk chunk (DesignElement::ElemType::Interface, startLine, lineNb, startChar, charNb); |
| fileChunks.push_back (chunk); |
| nbInterface++; |
| } |
| inInterface--; |
| } |
| if (keyword == "config") |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| inConfig = true; |
| } |
| if (keyword == "endconfig") |
| { |
| if (inConfig) |
| { |
| FileChunk chunk (DesignElement::ElemType::Config, startLine, lineNb, startChar, charNb); |
| fileChunks.push_back (chunk); |
| nbConfig++; |
| } |
| inConfig = false; |
| } |
| if (keyword == "checker") |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| inChecker = true; |
| } |
| if (keyword == "endchecker") |
| { |
| if (inChecker) |
| { |
| FileChunk chunk (DesignElement::ElemType::Checker, startLine, lineNb, startChar, charNb); |
| fileChunks.push_back (chunk); |
| nbChecker++; |
| } |
| inChecker = false; |
| } |
| if (keyword == "program") |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| inProgram = true; |
| } |
| if (keyword == "endprogram") |
| { |
| if (inProgram) |
| { |
| FileChunk chunk (DesignElement::ElemType::Program, startLine, lineNb, startChar, charNb); |
| fileChunks.push_back (chunk); |
| nbProgram++; |
| } |
| inProgram = false; |
| } |
| if (keyword == "primitive") |
| { |
| startLine = lineNb; |
| startChar = charNb; |
| inPrimitive = true; |
| } |
| if (keyword == "endprimitive") |
| { |
| if (inPrimitive) |
| { |
| FileChunk chunk (DesignElement::ElemType::Primitive, startLine, lineNb, startChar, charNb); |
| fileChunks.push_back (chunk); |
| nbPrimitive++; |
| } |
| inPrimitive = false; |
| } |
| if (keyword != "") |
| { |
| if (prev_keyword != "") |
| { |
| prev_prev_keyword = prev_keyword; |
| } |
| prev_keyword = keyword; |
| } |
| keyword = ""; |
| } |
| } |
| cp = c; |
| } |
| |
| if ((!inPackage) && |
| (!inClass) && |
| (!inModule) && |
| (!inProgram) && |
| (!inInterface) && |
| (!inConfig) && |
| (!inChecker) && |
| (!inPrimitive) && |
| (!inComment) && |
| (!inString)) |
| { |
| if (std::regex_search (line, pieces_match, import_regex)) |
| { |
| fileLevelImportSection += line; |
| } |
| } |
| } |
| ifs.close (); |
| |
| unsigned int lineSize = lineNb; |
| |
| if (lineSize < minNbLineForPartitioning) |
| { |
| m_splitFiles.push_back (m_ppFileName); |
| m_lineOffsets.push_back (0); |
| return; |
| } |
| if (m_nbChunks < 2) |
| { |
| m_splitFiles.push_back (m_ppFileName); |
| m_lineOffsets.push_back (0); |
| return; |
| } |
| |
| if (inComment || inString) |
| { |
| m_splitFiles.clear (); |
| m_lineOffsets.clear (); |
| Location loc (0, 0, 0, m_clp->getSymbolTable ()->registerSymbol (m_fileName)); |
| Error err (ErrorDefinition::PA_CANNOT_SPLIT_FILE, loc); |
| m_clp->getErrorContainer ()->addError (err); |
| m_clp->getErrorContainer ()->printMessages (); |
| return; |
| } |
| |
| // Split the file |
| |
| unsigned int chunkSize = lineSize / m_nbChunks; |
| int chunkNb = 0; |
| |
| unsigned int fromLine = 1; |
| unsigned int toIndex = 0; |
| IncludeFileInfo info (1, m_clp->getSymbolTable ()->registerSymbol (m_fileName), 1, 1); |
| m_includeFileInfo.push (info); |
| unsigned int linesWriten = 0; |
| for (unsigned int i = 0; i < fileChunks.size (); i++) |
| { |
| DesignElement::ElemType chunkType = fileChunks[i].m_chunkType; |
| |
| // The case of a package or a module |
| if (chunkType == DesignElement::ElemType::Package || |
| chunkType == DesignElement::ElemType::Module) |
| { |
| std::string packageDeclaration; |
| std::string importSection; |
| unsigned int packagelastLine = fileChunks[i].m_toLine; |
| packageDeclaration = allLines[fileChunks[i].m_fromLine]; |
| for (unsigned hi = fileChunks[i].m_fromLine; hi < fileChunks[i].m_toLine; hi++) |
| { |
| std::string header = allLines[hi]; |
| if (std::regex_search (header, pieces_match, import_regex)) |
| { |
| importSection += header; |
| } |
| } |
| // Break up package or module |
| if ((fileChunks[i].m_toLine - fileChunks[i].m_fromLine) > chunkSize) |
| { |
| bool splitted = false; |
| bool endPackageDetected = false; |
| std::string sllineInfo; |
| unsigned int origFromLine = 0; |
| std::string origFile; |
| // unsigned int baseFromLine = fromLine; |
| while (!endPackageDetected) |
| { |
| std::string content; |
| bool actualContent = false; |
| bool finishPackage = false; |
| bool hitLimit = true; |
| for (unsigned int j = i + 1; j < fileChunks.size (); j++) |
| { |
| hitLimit = false; |
| if (fileChunks[j].m_fromLine > packagelastLine) |
| { |
| finishPackage = true; |
| toIndex = j - 1; |
| break; |
| } |
| |
| if ((fileChunks[j].m_toLine - fromLine) >= chunkSize) |
| { |
| toIndex = j; |
| break; |
| } |
| if (j == (fileChunks.size () - 1)) |
| { |
| toIndex = j; |
| break; |
| } |
| toIndex = j; |
| } |
| if (hitLimit) |
| { |
| toIndex = fileChunks.size () - 1; |
| } |
| unsigned int toLine = fileChunks[toIndex].m_toLine + 1; |
| if (finishPackage) |
| { |
| toLine = packagelastLine + 1; |
| } |
| if (toIndex == fileChunks.size () - 1) |
| { |
| toLine = allLines.size (); |
| } |
| |
| |
| if (splitted) |
| { |
| content += sllineInfo; |
| content += packageDeclaration + " " + importSection; |
| //content += "SLline " + std::to_string(fromLine - baseFromLine + origFromLine + 1) + " \"" + origFile + "\" 1"; |
| } |
| else |
| { |
| sllineInfo = setSLlineDirective_ (fromLine, origFromLine, origFile); |
| content = sllineInfo; |
| } |
| |
| bool inString = false; |
| bool inComment = false; |
| |
| m_lineOffsets.push_back (linesWriten); |
| |
| // Detect end of package or end of module |
| for (unsigned int l = fromLine; l < toLine; l++) |
| { |
| std::string line = allLines[l]; |
| checkSLlineDirective_ (line, l); |
| |
| bool inLineComment = false; |
| content += allLines[l]; |
| if (l == fileChunks[i].m_fromLine) |
| { |
| content += " " + importSection; |
| } |
| if (l != (toLine - 1)) |
| { |
| content += "\n"; |
| } |
| linesWriten++; |
| |
| actualContent = true; |
| char c = 0; |
| char cp = 0; |
| std::string keyword; |
| for (unsigned int ii = 0; ii < line.size (); ii++) |
| { |
| c = line[ii]; |
| if (cp == '/' && c == '*') |
| { |
| if (!inLineComment) |
| inComment = true; |
| } |
| else if (cp == '/' && c == '/') |
| { |
| if (!inComment) |
| inLineComment = true; |
| } |
| else if (cp == '*' && c == '/') |
| { |
| inComment = false; |
| } |
| else if (cp != '\\' && c == '\"') |
| { |
| if ((!inLineComment) && (!inComment)) |
| inString = !inString; |
| } |
| if ((!inComment) && (!inLineComment) && (!inString)) |
| { |
| if ((islower (c) || isupper (c) || c == '_') && (ii != (line.size () - 1))) |
| { |
| keyword += c; |
| } |
| else |
| { |
| if ((islower (c) || isupper (c) || c == '_') && (ii == (line.size () - 1))) |
| { |
| keyword += c; |
| } |
| |
| if ((chunkType == DesignElement::Package) && (keyword == "endpackage")) |
| endPackageDetected = true; |
| if ((chunkType == DesignElement::Module) && (keyword == "endmodule")) |
| endPackageDetected = true; |
| |
| keyword = ""; |
| } |
| } |
| cp = c; |
| } |
| |
| } |
| |
| if (actualContent) |
| { |
| splitted = true; |
| if ((chunkType == DesignElement::Package) && endPackageDetected == false) |
| content += " endpackage "; |
| if ((chunkType == DesignElement::Module) && endPackageDetected == false) |
| content += " endmodule "; |
| } |
| else |
| { |
| splitted = false; |
| } |
| |
| |
| std::string splitFileName = m_ppFileName + ".ck" + std::to_string (chunkNb); |
| if (chunkNb > 1000) |
| { |
| m_splitFiles.clear (); |
| m_lineOffsets.clear (); |
| Location loc (0, 0, 0, m_clp->getSymbolTable ()->registerSymbol (m_fileName)); |
| Error err (ErrorDefinition::PA_CANNOT_SPLIT_FILE, loc); |
| m_clp->getErrorContainer ()->addError (err); |
| m_clp->getErrorContainer ()->printMessages (); |
| return; |
| } |
| content += " " + fileLevelImportSection; |
| saveContent (splitFileName, content); |
| |
| m_splitFiles.push_back (splitFileName); |
| |
| //m_lineOffsets.push_back(fromLine - 1); |
| |
| chunkNb++; |
| fromLine = fileChunks[toIndex].m_toLine + 1; |
| |
| i = toIndex; |
| if (finishPackage) |
| { |
| fromLine = toLine; |
| } |
| if (i >= fileChunks.size () - 1) |
| { |
| break; |
| } |
| } |
| } |
| else |
| { |
| // Split the complete package/module in a file |
| std::string content; |
| unsigned int packagelastLine = fileChunks[i].m_toLine; |
| unsigned int toLine = fileChunks[i].m_toLine + 1; |
| if (i == fileChunks.size () - 1) |
| { |
| toLine = allLines.size () -1; |
| } |
| const char* temp = allLines[toLine].c_str(); |
| if (strstr(temp, "/*") && (!strstr(temp, "*/"))) |
| { |
| m_splitFiles.clear (); |
| m_lineOffsets.clear (); |
| Location loc (0, 0, 0, m_clp->getSymbolTable ()->registerSymbol (m_fileName)); |
| Error err (ErrorDefinition::PA_CANNOT_SPLIT_FILE, loc); |
| m_clp->getErrorContainer ()->addError (err); |
| m_clp->getErrorContainer ()->printMessages (); |
| return; |
| } |
| |
| if (i == fileChunks.size () - 1) |
| { |
| toLine = allLines.size (); |
| } |
| |
| |
| unsigned int origFromLine = 0; |
| std::string origFile; |
| |
| m_lineOffsets.push_back (linesWriten); |
| |
| content += setSLlineDirective_ (fromLine, origFromLine, origFile); |
| for (unsigned int l = fromLine; l < toLine; l++) |
| { |
| checkSLlineDirective_ (allLines[l], l); |
| content += allLines[l]; |
| if (l != (toLine - 1)) |
| { |
| |
| content += "\n"; |
| } |
| linesWriten++; |
| } |
| |
| std::string splitFileName = m_ppFileName + ".ck" + std::to_string (chunkNb); |
| if (chunkNb > 1000) |
| { |
| m_splitFiles.clear (); |
| m_lineOffsets.clear (); |
| Location loc (0, 0, 0, m_clp->getSymbolTable ()->registerSymbol (m_fileName)); |
| Error err (ErrorDefinition::PA_CANNOT_SPLIT_FILE, loc); |
| m_clp->getErrorContainer ()->addError (err); |
| m_clp->getErrorContainer ()->printMessages (); |
| return; |
| } |
| saveContent (splitFileName, content); |
| |
| m_splitFiles.push_back (splitFileName); |
| |
| //m_lineOffsets.push_back (fromLine-1); |
| |
| chunkNb++; |
| for (unsigned int j = i; j < fileChunks.size (); j++) |
| { |
| if ((fileChunks[j].m_toLine > packagelastLine)) |
| { |
| break; |
| } |
| if (j == (fileChunks.size () - 1)) |
| { |
| toIndex = j; |
| break; |
| } |
| toIndex = j; |
| } |
| |
| |
| fromLine = packagelastLine + 1; |
| i = toIndex; |
| } |
| } |
| // The case of classes and other chunks |
| else |
| { |
| for (unsigned int j = i; j < fileChunks.size (); j++) |
| { |
| if (fileChunks[j].m_chunkType == DesignElement::ElemType::Package) |
| { |
| break; |
| } |
| if ((fileChunks[j].m_toLine - fromLine) >= chunkSize) |
| { |
| toIndex = j; |
| break; |
| } |
| if (j == (fileChunks.size () - 1)) |
| { |
| toIndex = j; |
| break; |
| } |
| toIndex = j; |
| } |
| |
| std::string content; |
| unsigned int toLine = fileChunks[toIndex].m_toLine + 1; |
| if (toIndex == fileChunks.size () - 1) |
| { |
| toLine = allLines.size (); |
| } |
| unsigned int origFromLine = 0; |
| std::string origFile; |
| |
| m_lineOffsets.push_back (linesWriten); |
| |
| content += setSLlineDirective_ (fromLine, origFromLine, origFile); |
| content += " " + fileLevelImportSection; |
| for (unsigned int l = fromLine; l < toLine; l++) |
| { |
| checkSLlineDirective_ (allLines[l], l); |
| content += allLines[l]; |
| if (l != (toLine - 1)) |
| { |
| content += "\n"; |
| } |
| linesWriten++; |
| } |
| |
| std::string splitFileName = m_ppFileName + ".ck" + std::to_string (chunkNb); |
| if (chunkNb > 1000) |
| { |
| m_splitFiles.clear (); |
| m_lineOffsets.clear (); |
| Location loc (0, 0, 0, m_clp->getSymbolTable ()->registerSymbol (m_fileName)); |
| Error err (ErrorDefinition::PA_CANNOT_SPLIT_FILE, loc); |
| m_clp->getErrorContainer ()->addError (err); |
| m_clp->getErrorContainer ()->printMessages (); |
| return; |
| } |
| saveContent (splitFileName, content); |
| |
| m_splitFiles.push_back (splitFileName); |
| |
| chunkNb++; |
| |
| fromLine = fileChunks[toIndex].m_toLine + 1; |
| i = toIndex; |
| } |
| } |
| } |
| |
| |
| |
| |