public Configuration()
        {
            iniFilePath = resolveFilePath(CONFIG_FILE_NAME);

            loadLocal();
            loadGlobal();

            merged = new IniData();
            merged.Merge(global);
            merged.Merge(local);

            string matchingMode = Get("Dialogue", "SubsetMatchingMode", Enum.GetName(typeof(SubsetMatchingMode), DEFAULT_GRAMMAR_MATCHING_MODE));

            try {
                if (matchingMode.ToLower() == "none")
                {
                    enableDialogueSubsetMatching = false;
                    Trace.TraceInformation("Dialogue SubsetMatchingMode Disabled");
                }
                else
                {
                    configuredMatchingMode = (SubsetMatchingMode)Enum.Parse(typeof(SubsetMatchingMode), matchingMode, true);
                    Trace.TraceInformation("Set Dialogue SubsetMatchingMode to {0}", configuredMatchingMode);
                }
            } catch (Exception ex) {
                Trace.TraceError("Failed to parse SubsetMatchingMode from ini file, falling back to default");
                Trace.TraceError(ex.ToString());
                configuredMatchingMode = DEFAULT_GRAMMAR_MATCHING_MODE;
            }

            goodbyePhrases = getPhrases("Dialogue", "goodbyePhrases");
            pausePhrases   = getPhrases("SpeechRecognition", "pausePhrases");
            resumePhrases  = getPhrases("SpeechRecognition", "resumePhrases");

            string nmlExpStr = Get("SpeechRecognition", "normalizeExpression", DEFAULT_NORMALIZE_EXPRESSION);

            if (nmlExpStr.Length > 0)
            {
                normalizeExpression  = new Regex(nmlExpStr);
                normalizeReplacement = Get("SpeechRecognition", "normalizeReplacement", DEFAULT_NORMALIZE_REPLACEMENT);
            }

            string opExpStr = Get("SpeechRecognition", "optionalExpression", DEFAULT_OPTIONAL_EXPRESSION);

            if (opExpStr.Length > 0)
            {
                optionalExpression  = new Regex(opExpStr);
                optionalReplacement = Get("SpeechRecognition", "optionalReplacement", DEFAULT_OPTIONAL_REPLACEMENT);
            }

            string localeStr = Get("SpeechRecognition", "Locale", "");

            if (localeStr.Length > 0)
            {
                locale = new CultureInfo(localeStr);
            }

            consoleCommandList = CommandList.FromIniSection(merged, "ConsoleCommands", this);
            consoleCommandList.PrintToTrace();
        }
        public Configuration()
        {
            iniFilePath = resolveFilePath(CONFIG_FILE_NAME);

            loadLocal();
            loadGlobal();

            merged = new IniData();
            merged.Merge(global);
            merged.Merge(local);
        }
        private static IniData getData()
        {
            if (merged == null)
            {
                loadLocal();
                loadGlobal();
                merged = new IniData();
                merged.Merge(global);
                merged.Merge(local);
            }

            return(merged);
        }
예제 #4
0
        /// <summary>
        /// Loads the games from a gamedb.ini file and internal settings.
        /// It will search for the files in bnetlauncher folder or it's appdata.
        /// </summary>
        private static void LoadGameList()
        {
            // Name of external gamedb file
            string[] gamedb_files =
            {
                Path.Combine(Application.StartupPath, "gamedb.ini"),
                Path.Combine(Application.StartupPath, "gamesdb.ini"),
                Path.Combine(Program.DataPath,        "gamedb.ini"),
                Path.Combine(Program.DataPath,        "gamesdb.ini")
            };

            Logger.Information("Loading gamedb files.");

            var gamedb = new IniData();

            foreach (var file in gamedb_files)
            {
                // Checks if there's a gamedb.ini and loads it if  in the datapath and copies it over if there isn't one
                if (File.Exists(file))
                {
                    var ini_filedata = (new FileIniDataParser()).ReadFile(file);
                    gamedb.Merge(ini_filedata);

                    Logger.Information($"Loaded '{file}' with '{ini_filedata.Sections.Count}' games.");
                }
            }

            // Loads internal gamedb overiding the file loaded
            var ini_parser = new IniParser.Parser.IniDataParser();
            var ini_data   = ini_parser.Parse(Properties.Resources.gamesdb);

            gamedb.Merge(ini_data);
            Logger.Information($"Loaded internal gamedb with '{ini_data.Sections.Count}' games.");

            // Load the gamedb into the games list
            foreach (var section in gamedb.Sections)
            {
                //TODO: Error checking?
                games.Add(new Game
                {
                    Id      = section.SectionName,
                    Name    = section.Keys["name"],
                    Client  = section.Keys["client"],
                    Cmd     = section.Keys["cmd"],
                    Exe     = section.Keys["exe"],
                    Options = section.Keys["options"]
                });
            }

            Logger.Information($"Known games: '{games.Count}'.");
        }
예제 #5
0
        public void Load(string path, bool clean)
        {
            SARAH.GetInstance().Log("ConfigManager", "Loading: " + path);
            var parser = new FileIniDataParser();
            var conf   = parser.ReadFile(path);

            //SARAH.GetInstance().Log("ConfigManager", conf.ToString());
            if (clean)
            {
                foreach (var section in conf.Sections)
                {
                    section.LeadingComments.Clear();
                    section.TrailingComments.Clear();
                    foreach (var keydata in section.Keys)
                    {
                        keydata.Comments.Clear();
                    }
                }
            }
            if (Config == null)
            {
                Config = conf;
            }
            else
            {
                Config.Merge(conf);
            }
        }
예제 #6
0
        /// <summary>
        /// Saves the settings to an ini file.
        /// </summary>
        public void Save()
        {
            try
            {
                var data = new IniData {
                    Configuration = IniParserConfig
                };

                foreach (var setting in Children.OfType <Settings>())
                {
                    data.Merge(setting.GetIniData());
                }

                using (var stream = File.Create($"{Name}.ini"))
                    using (var writer = new StreamWriter(stream))
                    {
                        var ini = new IniParser.StreamIniDataParser();
                        ini.WriteData(writer, data);
                    }
            }
            catch (Exception e)
            {
                Engine.Logger.Error(e);
                throw new InvalidOperationException($"Could not save ini for ${Name}. (${ClassName}): {e.Message}", e);
            }
        }
예제 #7
0
        public void Save(string db_path, IniData db_mem)
        {
            var parser = new FileIniDataParser();

            if (File.Exists(db_path))
            {
                IniData data;
                try
                {
                    data = parser.ReadFile(db_path);
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine(
                        $">>{ex.Message}\r\n" +
                        $"{ex.ToString()}");

                    data = new IniData();
                }
                data.Merge(db_mem);
                parser.WriteFile(db_path, data);
            }
            else
            {
                string directory = Path.GetDirectoryName(db_path);

                if (directory != "" && !Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                IniData data = new IniData();
                parser.WriteFile(db_path, db_mem);
            }
        }
예제 #8
0
        public static void SaveSettings(IniData data)
        {
            IniData main = Parser.ReadFile(App.SETTINGS_PATH);

            main.Merge(data);
            Parser.WriteFile(App.SETTINGS_PATH, main);
        }
예제 #9
0
        //private static Check activeCheck;
        static void Main(string[] args)
        {
            var    mainConfig = new IniData();
            String currDir    = Directory.GetCurrentDirectory() + "\\";
            String configFile = currDir + "config.ini";

            mainConfig["paths"]["src"]     = currDir + "src\\";
            mainConfig["paths"]["queue"]   = currDir + "queue\\";
            mainConfig["paths"]["results"] = currDir + "results\\";
            mainConfig["paths"]["scripts"] = @"C:\Users\iumag\Desktop\scripts\";
            // init config
            var parser = new FileIniDataParser();

            if (!File.Exists(configFile))
            {
                // write default setting
                parser.WriteFile(configFile, mainConfig);
            }

            IniData fileConfig = parser.ReadFile(configFile);

            mainConfig.Merge(fileConfig);

            globalConfig = mainConfig;

            // create folders if not exists

            if (!Directory.Exists(globalConfig["paths"]["src"]))
            {
                Directory.CreateDirectory(globalConfig["paths"]["src"]);
            }

            if (!Directory.Exists(globalConfig["paths"]["queue"]))
            {
                Directory.CreateDirectory(globalConfig["paths"]["queue"]);
            }

            if (!Directory.Exists(globalConfig["paths"]["results"]))
            {
                Directory.CreateDirectory(globalConfig["paths"]["results"]);
            }

            if (!Directory.Exists(globalConfig["paths"]["scripts"]))
            {
                Directory.CreateDirectory(globalConfig["paths"]["scripts"]);
            }

            // check exist files
            foreach (String file in Directory.GetFiles(globalConfig["paths"]["queue"], "*.new"))
            {
                runCheck(file);
            }

            // run folder listiner
            listenFolder();

            // wait - not to end
            new System.Threading.AutoResetEvent(false).WaitOne();
        }
예제 #10
0
        private static void save()
        {
            var     parser  = new FileIniDataParser();
            IniData dataTmp = (IniData)defaultData.Clone();

            dataTmp.Merge(data);
            parser.WriteFile("config.ini", data);
        }
예제 #11
0
        private static IniData ReadData(IEnumerable <Stream> streams)
        {
            IniData result = new IniData();

            foreach (var stream in streams)
            {
                var data = INIHelper.ReadINI(stream);
                result.Merge(data);
            }
            return(result);
        }
예제 #12
0
        private static IniData ReadData(IEnumerable <FileInfo> files)
        {
            IniData result = new IniData();

            foreach (var file in files)
            {
                var data = INIHelper.ReadINI(file);
                result.Merge(data);
            }
            return(result);
        }
예제 #13
0
        private static IniData ReadData(IEnumerable <string> contents)
        {
            IniData result = new IniData();

            foreach (var content in contents)
            {
                var data = INIHelper.ReadINI(content);
                result.Merge(data);
            }
            return(result);
        }
예제 #14
0
        private TreeNode AddTreeNode(IProepertyEntity obj)
        {
            var node = new TreeNode(obj.SectionName);

            node.Tag = obj;
            configItems.Nodes.Add(node);

            clientConfigData.Merge(obj.ToIniData());
            parser.WriteFile(configFile_client, clientConfigData, Encoding.Default);

            return(node);
        }
        public Configuration()
        {
            iniFilePath = resolveFilePath(CONFIG_FILE_NAME);

            loadLocal();
            loadGlobal();

            merged = new IniData();
            merged.Merge(global);
            merged.Merge(local);

            string matchingMode = Get("Dialogue", "SubsetMatchingMode", Enum.GetName(typeof(SubsetMatchingMode), DEFAULT_GRAMMAR_MATCHING_MODE));

            try {
                if (matchingMode.ToLower() == "none")
                {
                    enableDialogueSubsetMatching = false;
                    Trace.TraceInformation("Dialogue SubsetMatchingMode Disabled");
                }
                else
                {
                    configuredMatchingMode = (SubsetMatchingMode)Enum.Parse(typeof(SubsetMatchingMode), matchingMode, true);
                    Trace.TraceInformation("Set Dialogue SubsetMatchingMode to {0}", configuredMatchingMode);
                }
            } catch (Exception ex) {
                Trace.TraceError("Failed to parse SubsetMatchingMode from ini file, falling back to default");
                Trace.TraceError(ex.ToString());
                configuredMatchingMode = DEFAULT_GRAMMAR_MATCHING_MODE;
            }

            goodbyePhrases = getPhrases("Dialogue", "goodbyePhrases");
            pausePhrases   = getPhrases("SpeechRecognition", "pausePhrases");
            resumePhrases  = getPhrases("SpeechRecognition", "resumePhrases");

            consoleCommandList = CommandList.FromIniSection(merged, "ConsoleCommands");
            consoleCommandList.PrintToTrace();
        }
예제 #16
0
파일: ConfigData.cs 프로젝트: huangjk/Ash
        public ConfigData(string customConfigs)
        {
            var parser = new IniDataParser();

            _iniData = parser.Parse(DefaultConfigs);

            if (!string.IsNullOrEmpty(customConfigs))
            {
                if (customConfigs.Trim() != "")
                {
                    var userIniData = parser.Parse(customConfigs);
                    _iniData.Merge(userIniData);
                }
            }
        }
예제 #17
0
 public async Task <bool> PutValue(string section, string valueName, object value)
 {
     try
     {
         await Task.Factory.StartNew(() =>
         {
             var tmpIniData = new IniData();
             tmpIniData[section][valueName] = value != null ? value.ToString() : string.Empty;
             dataSnapshot.Merge(tmpIniData);
         });
     }
     catch (Exception e)
     {
         Debug.WriteLine(e.Message);
         return(false);
     }
     return(true);
 }
예제 #18
0
        protected override IniData GetIniData()
        {
            IniData mergedIniData = null;

            foreach (var filename in filePaths)
            {
                var iniData = fileIniDataParser.ReadFile(filename, Encoding.UTF8);
                if (mergedIniData == null)
                {
                    mergedIniData = iniData;
                }
                else
                {
                    mergedIniData.Merge(iniData);
                }
            }

            return(mergedIniData);
        }
예제 #19
0
        public static IniData ReadFile(params string[] files)
        {
            var fidp = new FileIniDataParser();
            var data = new IniData();

            foreach (var file in files)
            {
                var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, file);

                if (!File.Exists(path))
                {
                    continue;
                }

                var tmp = fidp.ReadFile(path);
                data.Merge(tmp);
            }

            return(data);
        }
예제 #20
0
        public static bool LoadSettings()
        {
            try
            {
                IniData userConfig;
                var     parser = new FileIniDataParser();

                userConfig = parser.ReadFile(ConfigPath);
                Defaults   = parser.ReadFile(ConfigDefaultsPath);

                Defaults.Merge(userConfig);

                Config = Defaults;
            }
            catch (Exception ex)
            {
                Debug.Log(ex.Message);
                return(false);
            }
            return(true);
        }
예제 #21
0
        public static IniData ParseFiles(string defaultConfig, string globalConfigFilename)
        {
            var utf8         = new UTF8Encoding(false);
            var parserConfig = CreateIniParserConfiguration();

            var     parser = new IniDataParser(parserConfig);
            IniData result = parser.Parse(DefaultLfMergeSettings.DefaultIniText);

            string globalIni = File.Exists(globalConfigFilename) ? File.ReadAllText(globalConfigFilename, utf8) : "";

            if (String.IsNullOrEmpty(globalIni))
            {
                // Can't use the log yet, so report warnings to Console.WriteLine
                Console.WriteLine("LfMerge: Warning: no global configuration found. Will use default settings.");
            }
            IniData globalConfig;

            try
            {
                globalConfig = parser.Parse(globalIni);
            }
            catch (ParsingException e)
            {
                Console.WriteLine("LfMerge: Warning: Error parsing global configuration file. Will use default settings.");
                Console.WriteLine("Error follows: {0}", e.ToString());
                globalConfig = null;                 // Merging null is perfectly acceptable to IniParser
            }
            result.Merge(globalConfig);

            foreach (KeyData item in result.Global)
            {
                // Special-case. Could be replaced with a more general regex if we end up using more variables, but YAGNI.
                if (item.Value.Contains("${HOME}"))
                {
                    item.Value = item.Value.Replace("${HOME}", Environment.GetEnvironmentVariable("HOME"));
                }
            }

            return(result);
        }
예제 #22
0
        private void loadModConfig(string dir)
        {
            if (!System.IO.Directory.Exists(dir))
            {
                return;
            }
            var files = System.IO.Directory.GetFiles(dir, "*.txt");

            for (int i = 0; i < files.Length; i++)
            {
                var cfg = new IniParser.FileIniDataParser().ReadFile(files[i]);
                if (modConfigs == null)
                {
                    modConfigs = cfg;
                }
                else
                {
                    modConfigs.Merge(cfg);
                }
            }
            Debug.Log("load mod config : " + dir + " " + modConfigs.Sections.Count);
        }
예제 #23
0
        public void merge_parsed_ini_files()
        {
            var parser = new IniDataParser();

            IniData dataA = parser.Parse(iniFileStrA);

            IniData dataB = parser.Parse(iniFileStrB);

            dataA.Merge(dataB);

            {
                // merged files
                Assert.That(dataA.Global["g"], Is.EqualTo("11"));
                Assert.That(dataA.Global["j"], Is.EqualTo("a"));
                Assert.That(dataA.Sections.Count, Is.EqualTo(3), "Expected two (3) sections");

                var s0 = dataA.Sections.GetSectionData("s0");

                Assert.That(s0, Is.Not.Null);
                Assert.That(s0.SectionName, Is.EqualTo("s0"));
                Assert.That(s0.Keys["a"], Is.EqualTo("22"));
                Assert.That(s0.Keys["b"], Is.EqualTo("44"));

                var s1 = dataA.Sections.GetSectionData("s1");

                Assert.That(s1, Is.Not.Null);
                Assert.That(s1.SectionName, Is.EqualTo("s1"));
                Assert.That(s1.Keys["a"], Is.EqualTo("3"));
                Assert.That(s1.Keys["b"], Is.EqualTo("4"));

                var s2 = dataA.Sections.GetSectionData("s2");

                Assert.That(s2, Is.Not.Null);
                Assert.That(s2.SectionName, Is.EqualTo("s2"));
                Assert.That(s2.Keys["c"], Is.EqualTo("55"));
            }
        }
예제 #24
0
        public static void ImportSettings()
        {
            var parser = new FileIniDataParser();

            data.Merge(parser.ReadFile("Configuration.ini"));
        }
예제 #25
0
        public static bool LoadSettings()
        {
            try
            {
                if (File.Exists(ConfigIniPath))
                {
                    FileIniDataParser parser     = new FileIniDataParser();
                    IniData           configdata = parser.ReadFile(ConfigIniPath);

                    string compareIni = null;
                    try
                    {
                        // get the current versions ini data
                        compareIni = ValheimPlusPlugin.getCurrentWebIniFile();
                    }
                    catch (Exception e) { }

                    if (compareIni != null)
                    {
                        StreamReader reader    = new StreamReader(new MemoryStream(System.Text.Encoding.ASCII.GetBytes(compareIni)));
                        IniData      webConfig = parser.ReadData(reader);

                        // Duplication of comments otherwise with this merge function.
                        configdata.ClearAllComments();

                        webConfig.Merge(configdata);
                        parser.WriteFile(ConfigIniPath, webConfig);
                    }

                    Configuration.Current = LoadFromIni(ConfigIniPath);
                }
                else
                {
                    Debug.LogError("Error: Configuration not found. Trying to download latest config.");

                    // download latest ini if not present
                    bool status = false;
                    try
                    {
                        string defaultIni = ValheimPlusPlugin.getCurrentWebIniFile();
                        if (defaultIni != null)
                        {
                            System.IO.File.WriteAllText(ConfigIniPath, defaultIni);
                            Debug.Log("Default Configuration downloaded. Loading downloaded default settings.");
                            Configuration.Current = LoadFromIni(ConfigIniPath);
                            status = true;
                        }
                    }
                    catch (Exception e) { }

                    return(status);
                }
            }
            catch (Exception ex)
            {
                Debug.LogError($"Could not load config file: {ex}");
                return(false);
            }

            return(true);
        }
예제 #26
0
 private void InitializeDefault(string ini)
 {
     _default = StringParser.Parse(ini);
     _merged.Merge(_default);
 }
예제 #27
0
 public void Merge(IniData newData)
 {
     data.Merge(newData);
 }
예제 #28
0
        static void Main(string[] args)
        {
            //lists to store Country code, PI code & Programme Service name from Lookup table.
            List <string> Master_List = new List <string> ();
            List <string> list_CC     = new List <string> ();
            List <string> list_ECC    = new List <string> ();
            List <string> list_PI     = new List <string> ();
            List <string> list_PSN    = new List <string> ();

            //filtered PI & PSN containing only information related to country selected by the user.
            List <string> firstFewPI  = new List <string> ();
            List <string> firstFewPSN = new List <string> ();
            List <string> firstFewECC = new List <string> ();

            /*
             * foreach (var a in args) {
             *  Console.WriteLine ("Arguments to print are: ", a + System.Environment.NewLine);
             * }*/

            double start_freq      = Convert.ToDouble(args[0]);
            int    stations2create = Int32.Parse(args[1]);
            string region          = args[2];

            if ((start_freq > 108.0) || (start_freq < 88.0))
            {
                // The user wants to exit the application. Close everything down.
                Console.WriteLine("Invalid start frequency ! only 88-108MHz is accepted ! Exiting...");
                Environment.Exit(-1);
            }

            //lists to hold 34 frequencies from 88-107.8 MHz.
            List <string> list_random_FMfreq = new List <string> ();
            int           i_count            = 0;

            //for loop runs until the end of frequency is reached and then is reset back to start.
            //use mod operator "%" if needed to create a station of more than 34 list size.
            for (double i_loop = start_freq; i_loop <= Constants.end_freq; i_loop += Constants.freq_increment)
            {
                //convert double var to single decimal point var and copy to string of lists.
                i_loop = Math.Round(i_loop, 1);
                string str = i_loop.ToString(CultureInfo.GetCultureInfo("en-GB"));
                list_random_FMfreq.Add(str);
                i_count++;
            }

            if (i_count < stations2create)
            {
                for (double i_loop = start_freq; i_count <= stations2create; i_loop += Constants.freq_increment)
                {
                    //convert double var to single decimal point var and copy to string of lists.
                    if (i_loop >= Constants.end_freq)
                    {
                        i_loop = start_freq;
                    }
                    i_loop = Math.Round(i_loop, 1);
                    string str = i_loop.ToString(CultureInfo.GetCultureInfo("en-GB"));
                    list_random_FMfreq.Add(str);
                    i_count++;
                }
            }

            using (var reader = new StreamReader(@"LUT.csv")) {
                //read 1 time outside the while loop to skip reading the heading row !
                reader.ReadLine();
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    Master_List.Add(line);
                }
            }
            IListExtensions.Shuffle(Master_List);
            foreach (var item in Master_List)
            {
                var values = item.Split(',');

                list_CC.Add(values[0]);
                list_ECC.Add(values[1]);
                list_PI.Add(values[2]);
                list_PSN.Add(values[3]);
            }

            /*
             *  //disabled routine to extract the distinct countries used in LUT table and construct windows form.
             *  // Get distinct Country Code and convert into a list again.
             *  List<string> list_Distinct_CC = new List<string>();
             *
             *  //lists to be available as input to the user in drop-down box.
             *  list_Distinct_CC = list_CC.Distinct().ToList();
             *
             *  foreach(var item in list_Distinct_CC)
             *  {
             *      string pre = "\"";
             *      string post = "\",";
             *      string merge = string.Concat(pre,item,post);
             *
             *      Console.WriteLine(item);
             *  } */
            var search_CC_List = list_CC
                                 .Select((v, i) => new { Index = i, Value = v })
                                 .Where(x => x.Value == region)
                                 .Select(x => x.Index)
                                 .ToList();

            //skip few random stations within first 50 items and take as many stations as requested by the user.
            Random rnd = new Random();

            if ((search_CC_List.Count > 50) && (search_CC_List.Count > stations2create))
            {
                if (region == "DE")
                {
                    foreach (var item in search_CC_List)
                    {
                        int temp    = Convert.ToInt32(list_PI[item], 16);
                        int DE_code = 0xD000;
                        int count   = 0;
                        if ((temp & DE_code) == DE_code)
                        {
                            if (count <= stations2create)
                            {
                                firstFewECC.Add(list_ECC[item]);
                                firstFewPI.Add(list_PI[item]);
                                firstFewPSN.Add(list_PSN[item]);
                                count++;
                            }
                        }
                    }
                }
                else
                {
                    foreach (var item in search_CC_List.Skip(rnd.Next(1, 50)).Take(stations2create))
                    {
                        firstFewECC.Add(list_ECC[item]);
                        firstFewPI.Add(list_PI[item]);
                        firstFewPSN.Add(list_PSN[item]);
                    }
                }
            }
            else
            {
                if (search_CC_List.Count < stations2create)
                {
                    stations2create = search_CC_List.Count;
                }
                foreach (var item in search_CC_List.Take(stations2create))
                {
                    firstFewECC.Add(list_ECC[item]);
                    firstFewPI.Add(list_PI[item]);
                    firstFewPSN.Add(list_PSN[item]);
                }
            }

            string builder_channel = File.ReadAllText(@"builder_channel.txt", Encoding.UTF8);
            string builder_rds     = File.ReadAllText(@"builder_rds.txt", Encoding.UTF8);
            string audio_file      = File.ReadAllText(@"audio_playlist.txt", Encoding.UTF8);

            var    parser   = new FileIniDataParser();
            string fileName = string.Concat("parser_", DateTime.Now.ToString("HHmmss") + ".ini");

            using (File.Create(fileName)) { }

            IniData data = parser.ReadFile(fileName);

            foreach (var i in Enumerable.Range(1, stations2create))
            {
                string channel = String.Concat("channel.", i);
                data.Sections.AddSection(channel);

                string rds = String.Concat("rds.", i);
                data.Sections.AddSection(rds);
            }

            //routine to append channel & rds parameter text to parser ini file
            using (File.Create(@"merge_content.ini")) { }
            using (var write = File.CreateText(@"merge_content.ini")) {
                write.WriteLine(audio_file);
                foreach (var i in Enumerable.Range(1, stations2create))
                {
                    string channel = String.Concat("[channel.", i, "]");
                    string rds     = String.Concat("[rds.", i, "]");

                    write.WriteLine(channel);
                    write.WriteLine(builder_channel);

                    write.WriteLine(rds);
                    write.WriteLine(builder_rds);
                }
            }

            foreach (var i in Enumerable.Range(1, stations2create))
            {
                string channel = String.Concat("channel.", i);
                string rds     = String.Concat("rds.", i);

                data[channel]["freq"]  = list_random_FMfreq[i - 1];
                data[channel]["idrds"] = i.ToString();

                data[rds]["name"] = String.Concat("RDS_", i);
                long   Dec       = Int32.Parse(firstFewECC[i - 1], System.Globalization.NumberStyles.HexNumber);
                string DecString = String.Format("{0:0}", Dec);
                data[rds]["slow"] = DecString;
                data[rds]["ps"]   = firstFewPSN[i - 1];
                data[rds]["pi"]   = firstFewPI[i - 1];
            }

            var merge_parser = new IniParser.Parser.IniDataParser();

            IniData user_config = merge_parser.Parse(File.ReadAllText("merge_content.ini"));

            data.Merge(user_config);

            //Save the file
            parser.WriteFile(fileName, data);
            File.Copy(fileName, Path.ChangeExtension(fileName, ".fm"));
        }