Пример #1
0
        public static int Main(string[] arguments)
        {
            if (0 == arguments.Length)
            {
                showUsage();
                return(0);
            }

            IniFile ini;
            string  outfile = null;

            ini = new IniFile();

            for (int i = 0; i < arguments.Length; i++)
            {
                string a = arguments[i];

                if (a[0] == '-' || a[0] == '/' || a[0] == '!')
                {
                    while (a[0] == '-' || a[0] == '/')
                    {
                        a = a.Substring(1);
                    }
                    string al = a.ToLower();

                    if (al.Equals("?") || al.StartsWith("help"))
                    {
                        showUsage();
                        return(0);
                    }
                    else if (al.StartsWith("q") || al.StartsWith("!q"))
                    {
                        quiet = al.StartsWith("q");
                    }
                    else if (al.StartsWith("v") || al.StartsWith("!v"))
                    {
                        verbose = al.StartsWith("v");

                        //
                        // Output file..
                        //
                    }
                    else if (al.StartsWith("o"))
                    {
                        outfile = a;

                        //
                        // Expand output (adds space between sections and before/after the equal sign)..
                        //
                    }
                    else if (al.StartsWith("expand") || al.StartsWith("!expand"))
                    {
                        ini.Expand = al.StartsWith("expand");

                        //
                        // Case sensitivity..
                        //
                    }
                    else if (al.Equals("i") || al.StartsWith("case-i") || al.StartsWith("casei"))
                    {
                        ini.SectionsStringComparison = StringComparison.CurrentCultureIgnoreCase;
                        ini.EntriesStringComparison  = StringComparison.CurrentCultureIgnoreCase;
                    }
                    else if (al.StartsWith("!i") || al.StartsWith("case-s") || al.StartsWith("cases"))
                    {
                        ini.SectionsStringComparison = StringComparison.CurrentCulture;
                        ini.EntriesStringComparison  = StringComparison.CurrentCulture;
                    }
                    else if (al.Equals("sections-is"))
                    {
                        ini.SectionsStringComparison = StringComparison.CurrentCultureIgnoreCase;
                    }
                    else if (al.Equals("sections-cs"))
                    {
                        ini.SectionsStringComparison = StringComparison.CurrentCulture;
                    }
                    else if (al.Equals("entries-is"))
                    {
                        ini.EntriesStringComparison = StringComparison.CurrentCultureIgnoreCase;
                    }
                    else if (al.Equals("entries-cs"))
                    {
                        ini.EntriesStringComparison = StringComparison.CurrentCulture;

                        //
                        // Sort direction..
                        //
                    }
                    else if (al.Equals("sort-asc") || al.Equals("sortasc"))
                    {
                        ini.SectionsSortOption = SortOption.Ascending;
                        ini.EntriesSortOption  = SortOption.Ascending;
                    }
                    else if (al.Equals("sort-desc") || al.Equals("sortdesc"))
                    {
                        ini.SectionsSortOption = SortOption.Descending;
                        ini.EntriesSortOption  = SortOption.Descending;
                    }
                    else if (al.Equals("!sort") || al.Equals("!sort"))
                    {
                        ini.SectionsSortOption = SortOption.None;
                        ini.EntriesSortOption  = SortOption.None;
                    }
                    else if (al.Equals("sections") || al.Equals("sections-asc"))
                    {
                        ini.SectionsSortOption = SortOption.Ascending;
                    }
                    else if (al.Equals("sections-desc"))
                    {
                        ini.SectionsSortOption = SortOption.Descending;
                    }
                    else if (al.Equals("!sections"))
                    {
                        ini.SectionsSortOption = SortOption.None;
                    }
                    else if (al.Equals("entries") || al.Equals("entries-asc"))
                    {
                        ini.EntriesSortOption = SortOption.Ascending;
                    }
                    else if (al.Equals("entries-desc"))
                    {
                        ini.EntriesSortOption = SortOption.Descending;
                    }
                    else if (al.Equals("!entries"))
                    {
                        ini.EntriesSortOption = SortOption.None;
                    }
                    else
                    {
                        if (!quiet)
                        {
                            Console.WriteLine("Unknown option: " + a);
                        }
                    }
                }
                else
                {
                    if (ini.FileName == null || ini.FileName.Length == 0)
                    {
                        ini.FileName = a;
                        while (ini.FileName.StartsWith("\"") && ini.FileName.EndsWith("\""))
                        {
                            ini.FileName = ini.FileName.Substring(1, ini.FileName.Length - 2);
                        }
                    }
                    else if (outfile == null || outfile.Length == 0)
                    {
                        outfile = a;
                    }
                    else
                    {
                        if (!quiet)
                        {
                            Console.WriteLine("Unknown option: " + a);
                        }
                    }
                }
            }

            if (StdInEx.IsInputRedirected)
            {
                // Ignore the specified `file` (if exists)..
                ini.FileName = StdInEx.RedirectInputToFile();
            }
            else if (ini.FileName == null || (ini.FileName = ini.FileName.Trim()).Length == 0)
            {
                throw new ArgumentNullException("file");
            }
            else if (!File.Exists(ini.FileName))
            {
                throw new ArgumentException("The specified file was not found (or is inaccessible)", "file");
            }

            try {
                // LOAD & SORT
                if (!ini.Load())
                {
                    throw new Exception("Could not load specified file");
                }

                // SORT
                ini.Sort();

                // OUTPUT
                if (!StdInEx.IsOutputRedirected && (outfile == null || outfile.Length == 0))
                {
                    // Write back to the input file..
                    if (!ini.Save())
                    {
                        throw new InvalidOperationException("Failed saving back to file");
                    }
                }
                else
                {
                    if (outfile != null && outfile.Length > 0)
                    {
                        if (!ini.Save(outfile))
                        {
                            throw new InvalidOperationException("Failed saving to outfile");
                        }
                    }
                    if (StdInEx.IsOutputRedirected)
                    {
                        string             tmpOut;
                        DeleteFileWhenDone tmpDel;
                        if (outfile != null && outfile.Length > 0)
                        {
                            tmpOut = outfile; // just output the new file..
                        }
                        else
                        {
                            tmpOut = Path.GetTempFileName();
                            tmpDel = new DeleteFileWhenDone(tmpOut);
                            if (!ini.Save(tmpOut))
                            {
                                throw new InvalidOperationException("Failed saving to temporary output (for stdout)");
                            }
                        }
                        Console.WriteLine(File.ReadAllText(tmpOut));
                    }
                }
            } catch (Exception ex) {
                StringBuilder s = new StringBuilder();
                s.AppendLine("**** ERROR OCURRED")
                .AppendLine(ex.Message);
                Console.Error.WriteLine(s.ToString());
                if (outfile != null && outfile.Length > 0)
                {
                    // Write the error to the destination file..
                    File.WriteAllText(outfile, s.ToString());
                }
                return(1);
            }

            if (!quiet)
            {
                Console.WriteLine("SUCCESS");
            }

            return(0);
        }
Пример #2
0
        public static int Main(string[] args)
        {
            envars = new EnvironmentVariables(appName);

            string file = null;
            SortedDictionary <string, string> dc;
            string        line;
            bool          exists;
            string        name;
            string        comment;
            StringBuilder cb;
            int           index;
            string        a;
            bool          vf;    // verify file exists
            string        sfn;   // saved backup file name
            bool          sf;    // don't delete the backup file
            bool          oc;    // output to the console, instead of back to the file
            Encoding      enc;   // the encoding used to open the source descript.ion file

            vf = false;
            sf = false;
            oc = false;

            // Load environment variables first.
            // Command-line arguments will overwrite them when present.
            if (envars.contains("vf"))
            {
                vf = envars.attr <bool>("vf");
            }
            if (envars.contains("sf"))
            {
                sf = envars.attr <bool>("sf");
            }

            if (args.Length > 0)
            {
                for (int i = 0; i < args.Length; i++)
                {
                    a = args[i];
                    if (a.StartsWith("/") || a.StartsWith("-") || a.StartsWith("!"))
                    {
                        while (a.StartsWith("/") || a.StartsWith("-"))
                        {
                            a = a.Substring(1);
                        }

                        if (a.StartsWith("h", StringComparison.CurrentCultureIgnoreCase) || a.Equals("?", StringComparison.CurrentCultureIgnoreCase))
                        {
                            usage();
                            return(0);
                        }
                        else if (a.Equals("vf", StringComparison.CurrentCultureIgnoreCase))
                        {
                            vf = true;
                        }
                        else if (a.Equals("!vf", StringComparison.CurrentCultureIgnoreCase))
                        {
                            vf = false;
                        }
                        else if (a.Equals("sf", StringComparison.CurrentCultureIgnoreCase))
                        {
                            sf = true;
                        }
                        else if (a.Equals("!sf", StringComparison.CurrentCultureIgnoreCase))
                        {
                            sf = false;
                        }
                        else if (a.Equals("oc", StringComparison.CurrentCultureIgnoreCase))
                        {
                            oc = true;
                        }
                        else if (a.Equals("!oc", StringComparison.CurrentCultureIgnoreCase))
                        {
                            oc = false;
                        }
                    }
                    else
                    {
                        // get the filename
                        file = a;
                    }
                }
            }

            if (StdInEx.IsInputRedirected)
            {
                file = StdInEx.RedirectInputToFile();
                oc   = true;
            }
            else
            {
                if (file == null || file.Length == 0)
                {
                    //Console.WriteLine("Using: " + Environment.CurrentDirectory);
                    file = Path.Combine(Environment.CurrentDirectory, "descript.ion");
                }
            }

            if (!File.Exists(file))
            {
                Console.WriteLine("there is no descript.ion file in the current folder");
                return(1);
            }

            try {
                BackupFile(file, "bak_", out sfn);
            } catch (Exception ex) {
                Console.WriteLine("error backing up descript.ion file: " + ex.Message);
                return(2);
            }

            dc  = new SortedDictionary <string, string>();
            cb  = new StringBuilder();
            enc = Encoding.Default;

            using (StreamReader r = new StreamReader(File.OpenRead(file), Encoding.Default, true)) {
                enc = r.CurrentEncoding;

                while (!r.EndOfStream)
                {
                    if ((line = r.ReadLine()) != null)
                    {
                        // do not trim the line itself!
                        if (line.Trim().Length == 0)
                        {
                            continue;
                        }

                        // Get the file name and comments
                        if (line.StartsWith("\""))
                        {
                            index = line.IndexOf("\" ", 1);
                            if (index == -1)
                            {
                                Console.WriteLine("--> invalid line:");
                                Console.WriteLine("    " + line.Substring(0, Math.Min(80, line.Length)));
                                continue;
                            }
                            index += 2;
                        }
                        else
                        {
                            index = line.IndexOf(' ');
                        }

                        if (index == -1)
                        {
                            continue;
                        }

                        name    = line.Substring(0, index).Trim().Trim('"', ' ', '\t');
                        comment = line.Substring(index).Trim();

                        // Verify that the file exists in the current folder.
                        if (vf)
                        {
                            if (!File.Exists(name) && !Directory.Exists(name))
                            {
                                Console.WriteLine("--> file/folder was not found: " + name);
                                sf = true;
                                continue;
                            }
                        }

                        // Ensure a unique file name for the dictionary
                        exists = false;
                        while (dc.ContainsKey(name))
                        {
                            exists = true;
                            name  += "_";
                        }
                        if (exists)
                        {
                            Console.WriteLine("--> duplicate entry was found.. saved as: " + name);
                        }

                        // Cleanup the comment
                        //while (comment.IndexOf('’') > -1) {
                        //   comment = comment.Replace('’', '\'');
                        //}

                        //cb.Clear();
                        //foreach (char ch in comment) {
                        //   if (ch < 32 || ch > 126) {
                        //      // 9=tab
                        //      // 10=new line
                        //      // 13=carriage return
                        //      // 169=copyright symbol
                        //      // 174=registered symbol
                        //      //
                        //      if (ch != 9 && ch != 10 && ch != 13 && ch != 169 && ch != 174 && ch != '•') {
                        //         //cb.Append(' ');
                        //         continue;
                        //      }
                        //   }
                        //   cb.Append(ch);
                        //}
                        //comment = cb.ToString().Trim();

                        while (comment.IndexOf("\\\\n") > -1)
                        {
                            comment = comment.Replace("\\\\n", "\\n");
                        }

                        while (comment.IndexOf((char)4) == comment.Length - 1 || comment.IndexOf((char)194) == comment.Length - 1)
                        {
                            comment = comment.Substring(0, comment.Length - 1);
                        }

                        while (comment.EndsWith("\\n"))
                        {
                            comment = comment.Substring(0, comment.Length - 2).TrimEnd();
                        }

                        dc.Add(name, comment);
                    }
                }

                r.Close();
            }

            try {
                File.SetAttributes(file, FileAttributes.Normal);
                File.Delete(file);
            } catch (Exception ex) {
                Console.WriteLine("error: " + ex.Message);
                return(3);
            }

            if (dc.Count > 0)
            {
                if (oc)
                {
                    foreach (KeyValuePair <string, string> p in dc)
                    {
                        Console.Write(string.Format("{0,-30}{1}", p.Key, p.Value));
                    }
                }
                else if (enc != null)
                {
                    try {
                        using (FileStream fs = File.Create(file)) {
                            foreach (KeyValuePair <string, string> p in dc)
                            {
                                byte[] b;

                                if (p.Key.Contains(" "))
                                {
                                    name = "\"" + p.Key + "\"";
                                }
                                else
                                {
                                    name = p.Key;
                                }
                                comment = p.Value;

                                b = new byte[name.Length];
                                enc.GetBytes(name.ToCharArray(), 0, name.Length, b, 0);
                                fs.Write(b, 0, b.Length);

                                fs.Write(new byte[] { 32 }, 0, 1);

                                b = new byte[comment.Length];
                                enc.GetBytes(comment.ToCharArray(), 0, comment.Length, b, 0);
                                fs.Write(b, 0, b.Length);

                                // Write out the special characters to indicate to Total Commander that there are new lines in the comments.
                                if (comment.IndexOf("\\n") > -1)
                                {
                                    fs.Write(new byte[] { 4, 194 }, 0, 2);
                                }

                                // New line and carriage return.
                                fs.Write(new byte[] { 13, 10 }, 0, 2);
                            }
                            fs.Flush();
                            fs.Close();
                        }
                    } catch (Exception ex) {
                        Console.WriteLine("error writing descript.ion file: " + ex.Message);
                        if (File.Exists(file))
                        {
                            File.SetAttributes(file, FileAttributes.Normal);
                            File.Delete(file);
                        }
                        File.Move(sfn, file);
                        Console.WriteLine("original file was put back");
                        return(4);
                    }
                }
                else
                {
                    Console.WriteLine("**** ERROR: failed to get the encoding of the input.");
                }
            }

            // Since we're not updating the file, there is no
            // need to create a backup of it. --> !oc
            if (!sf && !oc)
            {
                try {
                    File.SetAttributes(sfn, FileAttributes.Normal);
                    File.Delete(sfn);
                } catch (Exception ex) {
                    Console.WriteLine("error deleting backup file: " + ex.Message);
                    return(5);
                }
            }

            return(0);
        }