private static void Run(MessageLog messageLog, CommandLineArgs cmd)
        {
            if (stringComparer.Compare(cmd.operation, "doc") == 0)
            {
                MakeDoc(cmd.outputFile, cmd.rawsFolder, cmd.rawsExtension, cmd.isDirectory, cmd.docHeader, cmd.docFooter);
            }
            else if (stringComparer.Compare(cmd.operation, "plusplus") == 0)
            {
            #if !DEBUG
                throw new NotImplementedException();
            #endif
                LoadCodes(cmd.rawsFolder, cmd.rawsExtension, cmd.isDirectory, false);

                EACodeLanguage language;
                if (languages.TryGetValue(cmd.language, out language))
                {
                    HighlightingHelper.GetNotepadPlusPluslanguageDoc(language, cmd.outputFile);
                }
            }
            else if (stringComparer.Compare(cmd.operation, "prognotepad") == 0)
            {
                LoadCodes(cmd.rawsFolder, cmd.rawsExtension, cmd.isDirectory, false);

                HighlightingHelper.GetProgrammersNotepadlanguageDoc(languages.Values, cmd.outputFile);
            }
            else
            {
                LoadCodes(cmd.rawsFolder, cmd.rawsExtension, cmd.isDirectory, false);

                if (languages.ContainsKey(cmd.language))
                {
                    if (stringComparer.Compare(cmd.operation, "A") == 0)
                    {
                        Assemble(cmd.inputFile, cmd.outputFile, cmd.language, messageLog);
                    }
                    else if (stringComparer.Compare(cmd.operation, "D") == 0)
                    {
                        Disassemble(
                            cmd.inputFile,
                            cmd.outputFile,
                            cmd.language,
                            cmd.addEndGuards,
                            cmd.disassemblyMode.Value,
                            cmd.offset.Value,
                            cmd.priority.HasValue ? cmd.priority.Value : Priority.none,
                            cmd.size.HasValue ? cmd.size.Value : 0,
                            messageLog);
                    }
                    else messageLog.AddError("{0} is not a valid operation.", cmd.operation);
                }
                else messageLog.AddError("{0} is not a valid language", cmd.language);
            }
        }
        //StdOut - output
        //StdIn - input
        //StdError - errors and messages
        //0 - D, A or Doc, assemble, disassemble or doc generation
        //1 - language (assembly or disassembly only)
        //2 - disassembly mode (disassembly only)
        //3 - offset to disassemble (disassembly only)
        //4 - priority to disassemble (disassembly only)
        //5 - length to disassemble (disassembly only)
        //flags: -addEndGuards
        //       -raws:Folder or file
        //       -rawsExt:extension
        //       -output:File
        //       -input:File
        //       -error:File
        //       -docHeader:File
        //       -docFooter:File
        private static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                return;
            }

            var messageLog = new MessageLog(1000);

            //var cmd = HandleFlags(flags, messageLog);
            var cmd = new CommandLineArgs();
            var error = cmd.SetArgs(args);

            if (!error.CausedError)
            {
                try
                {
                    Run(messageLog, cmd);
                }
                catch (Exception e)
                {
                    messageLog.AddError(e.Message);
                }
            }

            if (cmd.errorFile != null)
            {
                using (var writer = new StreamWriter(cmd.errorFile))
                {
                    messageLog.WriteToStream(writer);
                }
            }
            else
            {
                messageLog.WriteToStream(Console.Error);
            }
            messageLog.Clear();
        }