Index: third_party/sqlite/src/tool/Replace.cs |
diff --git a/third_party/sqlite/src/tool/Replace.cs b/third_party/sqlite/src/tool/Replace.cs |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3475a47e6e813a7e8c2ff0893d4ee28442bd15fb |
--- /dev/null |
+++ b/third_party/sqlite/src/tool/Replace.cs |
@@ -0,0 +1,223 @@ |
+/* |
+** 2016 February 26 |
+** |
+** The author disclaims copyright to this source code. In place of |
+** a legal notice, here is a blessing: |
+** |
+** May you do good and not evil. |
+** May you find forgiveness for yourself and forgive others. |
+** May you share freely, never taking more than you give. |
+** |
+************************************************************************* |
+** This file contains C# code to perform regular expression replacements |
+** using the standard input and output channels. |
+*/ |
+ |
+using System; |
+using System.Diagnostics; |
+using System.IO; |
+using System.Reflection; |
+using System.Runtime.InteropServices; |
+using System.Text.RegularExpressions; |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+#region Assembly Metadata |
+[assembly: AssemblyTitle("Replace Tool")] |
+[assembly: AssemblyDescription("Replace text using standard input/output.")] |
+[assembly: AssemblyCompany("SQLite Development Team")] |
+[assembly: AssemblyProduct("SQLite")] |
+[assembly: AssemblyCopyright("Public Domain")] |
+[assembly: ComVisible(false)] |
+[assembly: Guid("95a0513f-8863-48cd-a76f-cb80868cb578")] |
+[assembly: AssemblyVersion("1.0.*")] |
+ |
+#if DEBUG |
+[assembly: AssemblyConfiguration("Debug")] |
+#else |
+[assembly: AssemblyConfiguration("Release")] |
+#endif |
+#endregion |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+namespace Replace |
+{ |
+ /// <summary> |
+ /// This enumeration is used to represent all the possible exit codes from |
+ /// this tool. |
+ /// </summary> |
+ internal enum ExitCode |
+ { |
+ /// <summary> |
+ /// The file download was a success. |
+ /// </summary> |
+ Success = 0, |
+ |
+ /// <summary> |
+ /// The command line arguments are missing (i.e. null). Generally, |
+ /// this should not happen. |
+ /// </summary> |
+ MissingArgs = 1, |
+ |
+ /// <summary> |
+ /// The wrong number of command line arguments was supplied. |
+ /// </summary> |
+ WrongNumArgs = 2, |
+ |
+ /// <summary> |
+ /// The "matchingOnly" flag could not be converted to a value of the |
+ /// <see cref="Boolean"/> type. |
+ /// </summary> |
+ BadMatchingOnlyFlag = 3, |
+ |
+ /// <summary> |
+ /// An exception was caught in <see cref="Main" />. Generally, this |
+ /// should not happen. |
+ /// </summary> |
+ Exception = 4 |
+ } |
+ |
+ /////////////////////////////////////////////////////////////////////////// |
+ |
+ internal static class Replace |
+ { |
+ #region Private Support Methods |
+ /// <summary> |
+ /// This method displays an error message to the console and/or |
+ /// displays the command line usage information for this tool. |
+ /// </summary> |
+ /// <param name="message"> |
+ /// The error message to display, if any. |
+ /// </param> |
+ /// <param name="usage"> |
+ /// Non-zero to display the command line usage information. |
+ /// </param> |
+ private static void Error( |
+ string message, |
+ bool usage |
+ ) |
+ { |
+ if (message != null) |
+ Console.WriteLine(message); |
+ |
+ string fileName = Path.GetFileName( |
+ Process.GetCurrentProcess().MainModule.FileName); |
+ |
+ Console.WriteLine(String.Format( |
+ "usage: {0} <regExPattern> <regExSubSpec> <matchingOnly>", |
+ fileName)); |
+ } |
+ #endregion |
+ |
+ /////////////////////////////////////////////////////////////////////// |
+ |
+ #region Program Entry Point |
+ /// <summary> |
+ /// This is the entry-point for this tool. It handles processing the |
+ /// command line arguments, reading from the standard input channel, |
+ /// replacing any matching lines of text, and writing to the standard |
+ /// output channel. |
+ /// </summary> |
+ /// <param name="args"> |
+ /// The command line arguments. |
+ /// </param> |
+ /// <returns> |
+ /// Zero upon success; non-zero on failure. This will be one of the |
+ /// values from the <see cref="ExitCode" /> enumeration. |
+ /// </returns> |
+ private static int Main( |
+ string[] args |
+ ) |
+ { |
+ // |
+ // NOTE: Sanity check the command line arguments. |
+ // |
+ if (args == null) |
+ { |
+ Error(null, true); |
+ return (int)ExitCode.MissingArgs; |
+ } |
+ |
+ if (args.Length != 3) |
+ { |
+ Error(null, true); |
+ return (int)ExitCode.WrongNumArgs; |
+ } |
+ |
+ try |
+ { |
+ // |
+ // NOTE: Create a regular expression from the first command |
+ // line argument. Then, grab the replacement string, |
+ // which is the second argument. |
+ // |
+ Regex regEx = new Regex(args[0]); |
+ string replacement = args[1]; |
+ |
+ // |
+ // NOTE: Attempt to convert the third argument to a boolean. |
+ // |
+ bool matchingOnly; |
+ |
+ if (!bool.TryParse(args[2], out matchingOnly)) |
+ { |
+ Error(null, true); |
+ return (int)ExitCode.BadMatchingOnlyFlag; |
+ } |
+ |
+ // |
+ // NOTE: Grab the standard input and output channels from the |
+ // console. |
+ // |
+ TextReader inputTextReader = Console.In; |
+ TextWriter outputTextWriter = Console.Out; |
+ |
+ // |
+ // NOTE: Loop until end-of-file is hit on the standard input |
+ // stream. |
+ // |
+ while (true) |
+ { |
+ // |
+ // NOTE: Read a line from the standard input channel. If |
+ // null is returned here, there is no more input and |
+ // we are done. |
+ // |
+ string inputLine = inputTextReader.ReadLine(); |
+ |
+ if (inputLine == null) |
+ break; |
+ |
+ // |
+ // NOTE: Perform regular expression replacements on this |
+ // line, if any. Then, write the modified line to |
+ // the standard output channel. |
+ // |
+ string outputLine = regEx.Replace(inputLine, replacement); |
+ |
+ if (!matchingOnly || !String.Equals( |
+ inputLine, outputLine, StringComparison.Ordinal)) |
+ { |
+ outputTextWriter.WriteLine(outputLine); |
+ } |
+ } |
+ |
+ // |
+ // NOTE: At this point, everything has succeeded. |
+ // |
+ return (int)ExitCode.Success; |
+ } |
+ catch (Exception e) |
+ { |
+ // |
+ // NOTE: An exception was caught. Report it via the console |
+ // and return failure. |
+ // |
+ Error(e.ToString(), false); |
+ return (int)ExitCode.Exception; |
+ } |
+ } |
+ #endregion |
+ } |
+} |