Exemplo n.º 1
0
 public DirectiveHandler(IncludeFileSearcher includeSearcher, IncludeFileSearcher toolSearcher)
 {
     directives = new Dictionary <string, IDirective>
     {
         { "include", new IncludeDirective {
               FileSearcher = includeSearcher
           } },
         { "incbin", new IncludeBinaryDirective {
               FileSearcher = includeSearcher
           } },
         { "incext", new IncludeExternalDirective {
               FileSearcher = toolSearcher
           } },
         { "inctext", new IncludeToolEventDirective {
               FileSearcher = toolSearcher
           } },
         { "inctevent", new IncludeToolEventDirective {
               FileSearcher = toolSearcher
           } },
         { "ifdef", new IfDefinedDirective() },
         { "ifndef", new IfNotDefinedDirective() },
         { "else", new ElseDirective() },
         { "endif", new EndIfDirective() },
         { "define", new DefineDirective() },
         { "pool", new PoolDirective() },
         { "undef", new UndefineDirective() },
     };
 }
Exemplo n.º 2
0
        public EAInterpreter(IOutput output, string game, string rawsFolder, string rawsExtension, Stream sin, string inFileName, Log log)
        {
            this.game   = game;
            this.output = output;

            try
            {
                allRaws = ProcessRaws(game, ListAllRaws(rawsFolder, rawsExtension));
            }
            catch (RawReader.RawParseException e)
            {
                Location loc = new Location
                {
                    file    = e.FileName,
                    lineNum = e.LineNumber,
                    colNum  = 1
                };

                log.Message(Log.MsgKind.ERROR, loc, "An error occured while parsing raws");
                log.Message(Log.MsgKind.ERROR, loc, e.Message);

                Environment.Exit(-1); // ew?
            }

            this.sin = sin;
            this.log = log;
            iFile    = inFileName;

            IncludeFileSearcher includeSearcher = new IncludeFileSearcher();

            includeSearcher.IncludeDirectories.Add(AppDomain.CurrentDomain.BaseDirectory);

            foreach (string path in EAOptions.Instance.includePaths)
            {
                includeSearcher.IncludeDirectories.Add(path);
            }

            IncludeFileSearcher toolSearcher = new IncludeFileSearcher {
                AllowRelativeInclude = false
            };

            toolSearcher.IncludeDirectories.Add(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Tools"));

            foreach (string path in EAOptions.Instance.toolsPaths)
            {
                includeSearcher.IncludeDirectories.Add(path);
            }

            myParser = new EAParser(allRaws, log, new Preprocessor.DirectiveHandler(includeSearcher, toolSearcher));

            myParser.Definitions['_' + game + '_']  = new Definition();
            myParser.Definitions["__COLORZ_CORE__"] = new Definition();
        }
Exemplo n.º 3
0
        static int Main(string[] args)
        {
            IncludeFileSearcher rawSearcher = new IncludeFileSearcher();

            rawSearcher.IncludeDirectories.Add(AppDomain.CurrentDomain.BaseDirectory);

            Stream inStream   = Console.OpenStandardInput();
            string inFileName = "stdin";

            IOutput?output      = null;
            string  outFileName = "none";
            string  ldsFileName = "none";

            TextWriter errorStream = Console.Error;

            Maybe <string> rawsFolder    = rawSearcher.FindDirectory("Language Raws");
            string         rawsExtension = ".txt";

            if (args.Length < 2)
            {
                Console.WriteLine("Required parameters missing.");
                return(EXIT_FAILURE);
            }

            bool outputASM = false;

            if (args[0] == "AA")
            {
                outputASM = true;
            }
            else
            if (args[0] != "A")
            {
                Console.WriteLine("Only assembly is supported currently.");
                return(EXIT_FAILURE);
            }

            for (int i = 2; i < args.Length; i++)
            {
                if (args[i][0] != '-')
                {
                    Console.Error.WriteLine("Unrecognized paramter: " + args[i]);
                }
                else
                {
                    string[] flag = args[i].Substring(1).Split(new char[] { ':' }, 2);

                    try
                    {
                        switch (flag[0])
                        {
                        case "raws":
                            rawsFolder = rawSearcher.FindDirectory(flag[1]);
                            break;

                        case "rawsExt":
                            rawsExtension = flag[1];
                            break;

                        case "output":
                            outFileName = flag[1];
                            if (outputASM)
                            {
                                ldsFileName = Path.ChangeExtension(outFileName, "lds");
                                output      = new ASM(new StreamWriter(outFileName, false),
                                                      new StreamWriter(ldsFileName, false));
                            }
                            else
                            {
                                FileStream outStream;
                                if (File.Exists(outFileName) && !File.GetAttributes(outFileName).HasFlag(FileAttributes.ReadOnly))
                                {
                                    outStream = File.Open(outFileName, FileMode.Open, FileAccess.ReadWrite);
                                }
                                else if (!File.Exists(outFileName))
                                {
                                    outStream = File.Create(outFileName);
                                }
                                else
                                {
                                    Console.Error.WriteLine("Output file is read-only.");
                                    return(EXIT_FAILURE);
                                }
                                output = new ROM(outStream);
                            }
                            break;

                        case "input":
                            inFileName = flag[1];
                            inStream   = File.OpenRead(flag[1]);
                            break;

                        case "error":
                            errorStream = new StreamWriter(File.OpenWrite(flag[1]));
                            EAOptions.Instance.noColoredLog = true;
                            break;

                        case "debug":
                            Debug = true;
                            break;

                        case "werr":
                            EAOptions.Instance.werr = true;
                            break;

                        case "-no-mess":
                            EAOptions.Instance.nomess = true;
                            break;

                        case "-no-warn":
                            EAOptions.Instance.nowarn = true;
                            break;

                        case "-no-colored-log":
                            EAOptions.Instance.noColoredLog = true;
                            break;

                        case "quiet":
                            EAOptions.Instance.nomess = true;
                            EAOptions.Instance.nowarn = true;
                            break;

                        case "-nocash-sym":
                            EAOptions.Instance.nocashSym = true;
                            break;

                        case "-build-times":
                            EAOptions.Instance.buildTimes = true;
                            break;

                        case "I":
                        case "-include":
                            EAOptions.Instance.includePaths.Add(flag[1]);
                            break;

                        case "T":
                        case "-tools":
                            EAOptions.Instance.toolsPaths.Add(flag[1]);
                            break;

                        case "IT":
                        case "TI":
                            EAOptions.Instance.includePaths.Add(flag[1]);
                            EAOptions.Instance.toolsPaths.Add(flag[1]);
                            break;

                        case "h":
                        case "-help":
                            Console.Out.WriteLine(helpstring);
                            return(EXIT_SUCCESS);

                        case "D":
                        case "def":
                        case "define":
                            try {
                                string[] def_args = flag[1].Split(new char[] { '=' }, 2);
                                EAOptions.Instance.defs.Add(Tuple.Create(def_args[0], def_args[1]));
                            } catch (IndexOutOfRangeException)
                            {
                                Console.Error.WriteLine("Improperly formed -define directive.");
                            }
                            break;

                        case "romoffset":
                            try
                            {
                                EAOptions.Instance.romOffset = Convert.ToInt32(flag[1], 16);
                            } catch {
                                Console.Error.WriteLine("Invalid hex offset given for ROM.");
                            }
                            break;

                        default:
                            Console.Error.WriteLine("Unrecognized flag: " + flag[0]);
                            return(EXIT_FAILURE);
                        }
                    }
                    catch (IOException e)
                    {
                        Console.Error.WriteLine("Exception: " + e.Message);
                        return(EXIT_FAILURE);
                    }
                }
            }

            if (output == null)
            {
                Console.Error.WriteLine("No output specified for assembly.");
                return(EXIT_FAILURE);
            }

            if (rawsFolder.IsNothing)
            {
                Console.Error.WriteLine("Couldn't find raws folder");
                return(EXIT_FAILURE);
            }

            string game = args[1];

            //FirstPass(Tokenizer.Tokenize(inputStream));

            Log log = new Log {
                Output            = errorStream,
                WarningsAreErrors = EAOptions.Instance.werr,
                NoColoredTags     = EAOptions.Instance.noColoredLog
            };

            if (EAOptions.Instance.nowarn)
            {
                log.IgnoredKinds.Add(Log.MsgKind.WARNING);
            }

            if (EAOptions.Instance.nomess)
            {
                log.IgnoredKinds.Add(Log.MsgKind.MESSAGE);
            }

            EAInterpreter myInterpreter = new EAInterpreter(output, game, rawsFolder.FromJust, rawsExtension, inStream, inFileName, log);

            ExecTimer.Timer.AddTimingPoint(ExecTimer.KEY_RAWPROC);

            bool success = myInterpreter.Interpret();

            if (success && EAOptions.Instance.nocashSym)
            {
                using (var symOut = File.CreateText(Path.ChangeExtension(outFileName, "sym")))
                {
                    if (!(success = myInterpreter.WriteNocashSymbols(symOut)))
                    {
                        log.Message(Log.MsgKind.ERROR, "Error trying to write no$gba symbol file.");
                    }
                }
            }

            if (EAOptions.Instance.buildTimes)
            {
                // Print times

                log.Output.WriteLine();
                log.Output.WriteLine("Times:");

                foreach (KeyValuePair <TimeSpan, string> time in ExecTimer.Timer.SortedTimes)
                {
                    log.Output.WriteLine("  " + time.Value + ": " + time.Key.ToString() + " (" + ExecTimer.Timer.Counts[time.Value] + ")");
                }

                // Print total time

                log.Output.WriteLine();
                log.Output.WriteLine("Total:");

                log.Output.WriteLine("  " + ExecTimer.Timer.TotalTime.ToString());
            }

            inStream.Close();
            output.Close();
            errorStream.Close();

            return(success ? EXIT_SUCCESS : EXIT_FAILURE);
        }