public bool Preprocess(PreprocessorRowTokenizer tokenizer)
        {
            if (tokenizer.Tokens.Count < 2)
            {
                throw new Z80AssemblerException($"Az {tokenizer.Tokens[0]} utasításnak meg kell adni a file nevét!");
            }

            string        fileName             = tokenizer.Tokens[1].Replace("\"", "").Replace("'", "");
            List <string> includedProgramLines = new List <string>();

            foreach (string includeDirectory in m_IncludeDirectories)
            {
                var filePath = Path.Combine(includeDirectory, fileName);

                if (File.Exists(filePath))
                {
                    if (m_IncludedFiles.Any(kvp => kvp.Key.Equals(filePath)))
                    {
                        throw new Z80AssemblerException($"Rekurzív file hivatkozás az #INCLUDE utasításban! A file {filePath} már beágyazásra került a(z) {m_IncludedFiles[filePath]} fileban!");
                    }

                    try
                    {
                        using (FileStream fs = new FileStream(filePath, FileMode.Open))
                        {
                            using (StreamReader sr = new StreamReader(fs))
                            {
                                while (!sr.EndOfStream)
                                {
                                    includedProgramLines.Add(sr.ReadLine());
                                }
                            }
                        }

                        if (includedProgramLines.Count == 0)
                        {
                            throw new Z80AssemblerException($"A hivatkozott file:{filePath} üres!");
                        }

                        Z80Preprocessor preprocessor = new Z80Preprocessor(includedProgramLines, m_IncludeDirectories, filePath, m_Defines);
                        if (!preprocessor.Preprocess())
                        {
                            throw new Z80AssemblerException(preprocessor.StatusMessage);
                        }

                        PreprocessedProgramLines.AddRange(preprocessor.PreprocessedProgramLines);
                        m_IncludedFiles.Add(filePath, m_FileName);
                        return(true);
                    }
                    catch (Exception e)
                    {
                        StatusMessage = $"A '{fileName}' file feldolgozásakor a következő hiba lépett fel:{e.Message}";
                        return(false);
                    }
                }
            }

            throw new Z80AssemblerException($"Az #INCLUDE utasításban megadott file:{fileName} nem található a megadott útvonalak egyikén sem!");
        }
Exemple #2
0
        public bool Call(string macroCallString)
        {
            try
            {
                ProcessParameterValues(macroCallString);
                ResolveParametersInMacroLines();
                Z80Preprocessor preprocessor = new Z80Preprocessor(m_MacroLines, m_IncludeDirectories, m_FileName, m_Defines);
                if (!preprocessor.Preprocess())
                {
                    StatusMessage = preprocessor.StatusMessage;
                    return(false);
                }

                m_Body.AddRange(preprocessor.PreprocessedProgramLines);
                return(true);
            }
            catch (Z80AssemblerException e)
            {
                StatusMessage = e.Message;
                return(false);
            }
        }