Example #1
0
        /// <summary>
        /// Implements a pipe wrapper for use internally or by front-end.
        /// </summary>
        public string RunPipe(string name, string script, string args, string inText, bool loggingEnabled, bool replacingDelims)
        {
            Pipe thePipe = new Pipe(script, this, string.Empty, string.Empty, loggingEnabled, replacingDelims);

            thePipe.Compile(args, 0, string.Empty, 0);

            if (thePipe.Errors.Count == 0)
            {
                string inTempFile = System.IO.Path.GetTempFileName();
                File.WriteAllText(inTempFile, inText);
                string outTempFile = System.IO.Path.GetTempFileName();

                thePipe.Execute(ref inTempFile, ref outTempFile);

                string results = File.ReadAllText(outTempFile);

                results = results.Substring(0, results.Length - System.Environment.NewLine.Length);

                File.Delete(inTempFile);
                File.Delete(outTempFile);

                return(results);
            }
            else
            {
                if ((name == null) || (name == string.Empty))
                {
                    name = "<unknown>";
                }
                throw new PipeWrenchCompileException(System.Environment.NewLine +
                                                     "Internal error. Pipe passed to RunPipe, (" + name + "), " +
                                                     "failed compile: " + System.Environment.NewLine + System.Environment.NewLine +
                                                     thePipe.Errors.ToString());
            }
        }
Example #2
0
        // The pipe that is being called.

        /// <summary>
        /// Compiles the filter.
        /// </summary>
        public override void Compile(string cmdLineText, int initialCharPos)
        {
            // Parse the filter's command line:

            LoggingEnabled = true;
            LogWrite("Call.Compile: begin");
            CmdLine.Text = cmdLineText;
            CmdLine.IgnoringExtraneousText = true;
            CmdLine.Parse(initialCharPos, true);

            // Load and compile the contents of the saved-to-disk pipe:

            string pipePath = (string)CmdLine.GetArg(0).Value;

            LogWrite("Call.Compile: Called pipe: \"" + pipePath + "\"");

            if (System.IO.File.Exists(pipePath))
            {
                // The pipe file exists.  Create a new pipe object from the pipe file's contents:

                string tempStr    = System.IO.Path.GetFullPath(pipePath);
                string pipeFolder = System.IO.Path.GetDirectoryName(tempStr);
                string pipeName   = System.IO.Path.GetFileName(tempStr);
                string pipeScript = System.IO.File.ReadAllText(pipePath);
                CalledPipe = new Pipe(pipeScript, (Engine)Eng, pipeFolder, pipeName,
                                      ((Filter)Host).CoreLoggingEnabled, false);
                CalledPipe.DebugFile = ((Filter)Host).DebugFile;
                CalledPipe.Errors    = ((Filter)Host).Errors;

                // Save the current folder because Pipe.Compile() may change it:

                string savedFolder = System.Environment.CurrentDirectory;

                // Compile the pipe using the CALL filter's
                // "extraneous" command line parameters:

                CalledPipe.Compile(CmdLine.Text, ((CommandLine)CmdLine).CmdLinePtr, Source, PipeLineNo);

                // Restore the prior-saved current folder:

                Directory.SetCurrentDirectory(savedFolder);
            }
            else
            {
                // Pipe file doesn't exist.

                PipeWrenchCompileException ex = new PipeWrenchCompileException("Pipe file not found.");
                ex.Data.Add("CharPos", ((CommandLine)CmdLine).CmdLinePtr);
                ex.Data.Add("CmdLine", CmdLine.Text);
                throw ex;
            }

            LogWrite("Call.Compile: end");
        }
Example #3
0
        static int Main(string[] args)
        {
            int exitCode = 0;
             string homeFolder;
            // User's home folder.
             string applDataFolder;
            // The application's folder beneath the home folder.
             string tempStr = string.Empty;
             string debugFile;

             if (args.Length != 0)
             {
            // Executing a pipe.

            try
            {
               // Load configuration parameters:

               if (isLinux)
               {
                  homeFolder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
                  applDataFolder = homeFolder + System.IO.Path.DirectorySeparatorChar + "." + appName.ToLower();
               }
               else
               {
                  homeFolder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);
                  applDataFolder = homeFolder + System.IO.Path.DirectorySeparatorChar + appName;
               }

               string configFile = applDataFolder + System.IO.Path.DirectorySeparatorChar + appName + "Conf.xml";

               if (File.Exists(configFile))
               {
                  // Configuration file found.

                  XmlDocument xmlDoc = new XmlDocument();
                  xmlDoc.Load(configFile);
                  XmlElement rootElem = xmlDoc["Config"];
                  XmlElement elem = rootElem["DebugFile"];
                  debugFile = elem.InnerText;
               }
               else
               {
                  // Configuration file doesn't exist. Default the debug file:

                  debugFile = applDataFolder + System.IO.Path.DirectorySeparatorChar + "Debug.txt";
               }

               // Create a pipe object:

               string currFolder = System.Environment.CurrentDirectory;
               string script = GetPositionalArg(1, args);
               Pipe thePipe = new Pipe(script, pipeEng, currFolder, string.Empty,
               Engine.CoreLogging(args), true);
               thePipe.DebugFile = debugFile;
               string pipeArgs = GetPositionalArg(2, args);

               // Compile the pipe:

               thePipe.Compile(pipeArgs, 0, string.Empty, 0);

               if (thePipe.Errors.Count == 0)
               {
                  // Create the input text file:

                  string inText = Path.GetTempFileName();
                  StreamWriter inTextWriter = new StreamWriter(inText);

                  // Transfer the text from standard input to the text file object:

                  while ((tempStr = Console.ReadLine()) != null)
                  {
                     inTextWriter.WriteLine(tempStr);
                  }

                  inTextWriter.Close();

                  // Create the output text file:

                  string outText = Path.GetTempFileName();

                  // Execute the pipe:

                  thePipe.Execute(ref inText, ref outText);

                  // Output the text results to standard output:

                  StreamReader outTextReader = new StreamReader(outText);

                  while (!outTextReader.EndOfStream)
                  {
                     Console.WriteLine(outTextReader.ReadLine());
                  }
               }
               else
               {
                  Console.Error.WriteLine(System.Environment.NewLine +
                  thePipe.Errors.ToString());
               }
            }

            catch (PipeWrenchExecException ex)
            {
               // Pipe execution (runtime) exception.

               tempStr = string.Empty;
               string source = (string) ex.Data["Source"];
               tempStr += source + System.Environment.NewLine;
               string lineNoStr = ((int) ex.Data["LineNo"]).ToString();
               string cmdLine = (string) ex.Data["CmdLine"];
               tempStr += "   line " + lineNoStr + ": " + cmdLine +
               System.Environment.NewLine;

               if (ex.Data.Contains("CharPos"))
               {
                  int charPos = (int) ex.Data["CharPos"];
                  tempStr += "^".PadLeft(charPos+10+lineNoStr.Length, ' ');
               }

               tempStr += System.Environment.NewLine + "      " + ex.Message;
               Console.Error.WriteLine(tempStr);
               exitCode = -1;
            }

            catch (Exception ex)
            {
               // Anything not already handled...

               exitCode = -2;
               Console.Error.WriteLine(ex.Message);
               pipeEng.Log.WriteText(ex.ToString(), "Fatal error...", "   ");
            }
             }
             else
             {
            try
            {
               string headerLeftStr = cmdLineAppName + " " + version;
               string headerRightStr;

               if (isLinux)
                  headerRightStr = "Copyright \u00a9 2013 Firefly Software";
               else
                  headerRightStr = "Copyright (C) 2013 Firefly Software";

               string headerStr = headerLeftStr + headerRightStr.PadLeft(consoleCols -
               headerLeftStr.Length - 1) + "\n\n";
               string footerStr = "\n<Press ENTER to Continue>";

               // Display the help screen:

               tempStr = cmdLineAppName.ToUpper() + " is the command-line component of " + appName + ", " +
               "the high-level text scripting tool that allows you to easily transform text, (i.e. lists, " +
               "command output, HTML, config files, log files, source code, CSV data, etc.) from one form " +
               "to another with relative ease.  In a " + appName + " script, there's no need to create conditional " +
               "or looping constructs or even to declare variables.  You simply \"stack\" filters to get " +
               "the results you want.";

               string wrapToWidthPipe = "WrapText " + consoleCols.ToString();
               string bodyStr = pipeEng.RunPipe("wrapToWidthPipe", wrapToWidthPipe, "", tempStr, false, false) + "\n\n";

               tempStr = "Notice: This software is provided WITHOUT WARRANTY OF ANY KIND under " +
               "the Free Software Foundation's GNU General Public License.  For further details, " +
               "see \"http://www.gnu.org/licenses/\". ";

               string noticeStr = pipeEng.RunPipe("wrapToWidthPipe", wrapToWidthPipe, "", tempStr, false, false);

               Console.Error.Write(headerStr + bodyStr + noticeStr + PadLines(headerStr + bodyStr + noticeStr +
               footerStr) + footerStr);
               Console.ReadKey();

               bodyStr = "Syntax: " + cmdLineAppName + " <pipe> [<arguments>]\n\n";
               bodyStr += "Where:\n\n";

               string wrapToWidthIndentedPipe = "WrapText " + (consoleCols-3).ToString() + "|InsStr 1 '   '";
               bodyStr += pipeEng.RunPipe("wrapToWidthIndentedPipe", wrapToWidthIndentedPipe, "",
               "<pipe> is a double-quoted string containing one or more " + appName + " commands separated " +
               "by \"" + Engine.PipeDelim + "\".", false, true) + "\n";

               bodyStr += pipeEng.RunPipe("wrapToWidthIndentedPipe", wrapToWidthIndentedPipe, "",
               "<arguments> is a double-quoted string containing one or more pipe arguments.",
               false, true) + "\n\n";

               bodyStr += pipeEng.RunPipe("wrapToWidthPipe", wrapToWidthPipe, "", appName.ToLower() +
               "'s I/O can be redirected. Following are some examples:", false, true) + "\n\n";

               if (isLinux)
               {
                  bodyStr +=
                  "   LOGNAME=$(echo \"$FILE\" | " + cmdLineAppName + " \"AppendStr '.log'\")\n" +
                  "   echo hello | " + cmdLineAppName + " \"UpperCase " + Engine.PipeDelim + " AppendStr ' THERE'\"\n" +
                  "   cat the.txt | " + cmdLineAppName + " \"SortLines " + Engine.PipeDelim + " DelDuplLines\" >out.txt\n" +
                  "   find . -type f -printf '%P\\n' | " + cmdLineAppName + " \"InsStr 1 '#22' " + Engine.PipeDelim + " \n" +
                  "      AppendStr '#22'\" | xargs md5sum > \"$MD5SUMSFILE\"\n" +
                  "   echo \"$FILELIST\" | " + cmdLineAppName + " \"call '$RENAMEFILESPIPE'\" >\"$TEMPSCRIPT\"\n";
               }
               else
               {
                  bodyStr +=
                  "   echo hello | " + cmdLineAppName + " \"UpperCase " + Engine.PipeDelim + " AppendStr ' THERE'\"\n" +
                  "   type the.txt | " + cmdLineAppName + " \"SortLines " + Engine.PipeDelim + " DelDuplLines\" >out.txt\n" +
                  "   echo \"%FILELIST%\" | " + cmdLineAppName + " \"call '%RENAMEFILESPIPE%'\" >\"%TEMPBATCH%\"\n" +
                  "   type template.txt | " + cmdLineAppName + " \"ReplStr '<KEY>' '%KEY%'\" >page.htm";
               }

               Console.Error.Write(headerStr + bodyStr + PadLines(headerStr + bodyStr + footerStr) + footerStr);
               Console.ReadKey();

               string filterList = GetFilters();

               string displayFiltersPipe = "ParseWords|SortLines|PadLinesRight '~'|InsStr 1 '~'|" +
               "ReplStr '~(\\\\w+)\\\\*' '*$1~' /r|AppendStr ' '|JoinLines|WrapText " +
               consoleCols.ToString() + " /j50|ReplStr '~' ' '";

               tempStr = pipeEng.RunPipe("displayFiltersPipe", displayFiltersPipe, "", filterList, false, true);
               PaginateText(tempStr, headerStr, footerStr);
            }

            catch (PipeWrenchCompileException ex)
            {
               Console.Error.WriteLine(ex.Message);
            }

            catch (PipeWrenchExecException ex)
            {
               // Pipe execution (runtime) exception.

               tempStr = string.Empty;
               string source = (string) ex.Data["Source"];
               tempStr += source + System.Environment.NewLine;
               string lineNoStr = ((int) ex.Data["LineNo"]).ToString();
               string cmdLine = (string) ex.Data["CmdLine"];
               tempStr += "   line " + lineNoStr + ": " + cmdLine + System.Environment.NewLine;

               if (ex.Data.Contains("CharPos"))
               {
                  int charPos = (int) ex.Data["CharPos"];
                  tempStr += "^".PadLeft(charPos+10+lineNoStr.Length, ' ');
               }

               tempStr += System.Environment.NewLine + "      " + ex.Message;
               Console.Error.WriteLine(tempStr);
            }

            catch (Exception ex)
            {
               // Anything not already handled...

               pipeEng.Log.WriteText(ex.ToString(), "Fatal error...", "   ");
               Console.Error.WriteLine(ex.Message);
            }
             }

             return exitCode;
        }
Example #4
0
        // The pipe that is being called.
        /// <summary>
        /// Compiles the filter.
        /// </summary>
        public override void Compile(string cmdLineText, int initialCharPos)
        {
            // Parse the filter's command line:

             LoggingEnabled = true;
             LogWrite("Call.Compile: begin");
             CmdLine.Text = cmdLineText;
             CmdLine.IgnoringExtraneousText = true;
             CmdLine.Parse(initialCharPos, true);

             // Load and compile the contents of the saved-to-disk pipe:

             string pipePath = (string) CmdLine.GetArg(0).Value;
             LogWrite("Call.Compile: Called pipe: \"" + pipePath + "\"");

             if (System.IO.File.Exists(pipePath))
             {
            // The pipe file exists.  Create a new pipe object from the pipe file's contents:

            string tempStr = System.IO.Path.GetFullPath(pipePath);
            string pipeFolder = System.IO.Path.GetDirectoryName(tempStr);
            string pipeName = System.IO.Path.GetFileName(tempStr);
            string pipeScript = System.IO.File.ReadAllText(pipePath);
            CalledPipe = new Pipe(pipeScript, (Engine) Eng, pipeFolder, pipeName,
            ((Filter) Host).CoreLoggingEnabled, false);
            CalledPipe.DebugFile = ((Filter) Host).DebugFile;
            CalledPipe.Errors = ((Filter) Host).Errors;

            // Save the current folder because Pipe.Compile() may change it:

            string savedFolder = System.Environment.CurrentDirectory;

            // Compile the pipe using the CALL filter's
            // "extraneous" command line parameters:

            CalledPipe.Compile(CmdLine.Text, ((CommandLine) CmdLine).CmdLinePtr, Source, PipeLineNo);

            // Restore the prior-saved current folder:

            Directory.SetCurrentDirectory(savedFolder);
             }
             else
             {
            // Pipe file doesn't exist.

            PipeWrenchCompileException ex = new PipeWrenchCompileException("Pipe file not found.");
            ex.Data.Add("CharPos", ((CommandLine) CmdLine).CmdLinePtr);
            ex.Data.Add("CmdLine", CmdLine.Text);
            throw ex;
             }

             LogWrite("Call.Compile: end");
        }
Example #5
0
    /// <summary>
    /// Executes the pipe.
    /// </summary>
    private void ExecutePipe(string pipeText)
    {
        try
          {
         ErrorsTextView.Buffer.Text = string.Empty;
         string pipeFolder = string.Empty;
         string pipeName = "<new pipe>";

         if (PipePath != string.Empty)
         {
            string tempStr = System.IO.Path.GetFullPath(PipePath);
            pipeFolder = System.IO.Path.GetDirectoryName(tempStr);
            pipeName = System.IO.Path.GetFileName(tempStr);
         }

         Pipe ThePipe = new Pipe(pipeText, PipeEng, pipeFolder, pipeName, CoreLogging, false);
         ThePipe.DebugFile = DebugFile;
         ThePipe.Compile(ArgsEntry.Text, 0, string.Empty, 0);

         if (ThePipe.Errors.Count == 0)
         {
            MessageDialog WarningMesgDlg = new MessageDialog (this,
            DialogFlags.DestroyWithParent, MessageType.Warning,
            ButtonsType.YesNo, "Overwrite output file?");

            try
            {
               if ((!File.Exists(OutputFileEntry.Text)) || (WarningMesgDlg.Run() == (int) ResponseType.Yes))
               {
                  if ((DebugFile != null) && (File.Exists(DebugFile)))
                  {
                     File.Delete(DebugFile);
                  }

                  string inTempFile = System.IO.Path.GetTempFileName();
                  string outTempFile = System.IO.Path.GetTempFileName();

                  try
                  {
                     if (InputFileEntry.Text == string.Empty)
                     {
                        File.WriteAllText(inTempFile, InputTextView.Buffer.Text);
                     }
                     else
                     {
                        File.Copy(InputFileEntry.Text, inTempFile, true);
                     }

                     ThePipe.Execute(ref inTempFile, ref outTempFile);

                     if (OutputFileEntry.Text == string.Empty)
                     {
                        // Unsubscribe from the TextChanged event handler so that
                        // the updates made to the ouput textbox don't change
                        // the caret's current location:

                        OutputTextView.Buffer.Changed -= IOTextBuffer_OnChanged;

                        // Write changes to the output text box:

                        OutputTextView.Buffer.Text = File.ReadAllText(outTempFile);

                        // Re-subscribe to the TextChanged event handler:

                        OutputTextView.Buffer.Changed += IOTextBuffer_OnChanged;
                     }
                     else
                     {
                        File.Copy(outTempFile, OutputFileEntry.Text, true);
                     }
                  }

                  finally
                  {
                     File.Delete(inTempFile);
                     File.Delete(outTempFile);
                  }

                  TextNotebook.CurrentPage = 1;
                  PipeTextView.GrabFocus();
               }
            }

            finally
            {
               WarningMesgDlg.Destroy();
            }
         }
         else
         {
            // The pipe had compile (syntax) errors.

            ErrorsTextView.Buffer.Text = ThePipe.Errors.ToString();
            TextNotebook.CurrentPage = 2;
         }
          }

          catch (PipeWrenchTemplateException ex)
          {
         string tempStr = (string) ex.Data["Template"] + System.Environment.NewLine;

         if (ex.Data.Contains("CharPos"))
         {
            int charPos = (int) ex.Data["CharPos"];
            tempStr += "^".PadLeft(charPos, ' ');
         }

         tempStr += System.Environment.NewLine + "   " + ex.Message;

         ErrorsTextView.Buffer.Text = tempStr;
         TextNotebook.CurrentPage = 2;
          }

          catch (PipeWrenchExecException ex)
          {
         // Pipe execution (runtime) exception.

         string tempStr = string.Empty;
         string source = (string) ex.Data["Source"];
         tempStr += source + System.Environment.NewLine;
         string lineNoStr = ((int) ex.Data["LineNo"]).ToString();
         string cmdLine = (string) ex.Data["CmdLine"];
         tempStr += "   line " + lineNoStr + ": " + cmdLine + System.Environment.NewLine;

         if (ex.Data.Contains("CharPos"))
         {
            int charPos = (int) ex.Data["CharPos"];
            tempStr += "^".PadLeft(charPos+10+lineNoStr.Length, ' ');
         }

         tempStr += System.Environment.NewLine + "      " + ex.Message;
         ErrorsTextView.Buffer.Text = tempStr;
         TextNotebook.CurrentPage = 2;
          }

          catch (Exception ex)
          {
         // Anything not already handled...

         ErrorsTextView.Buffer.Text = ex.Message;
         TextNotebook.CurrentPage = 2;
         PipeEng.Log.WriteText(ex.ToString(), "Fatal error...", "   ");
          }
    }
Example #6
0
        static int Main(string[] args)
        {
            int    exitCode = 0;
            string homeFolder;
            // User's home folder.
            string applDataFolder;
            // The application's folder beneath the home folder.
            string tempStr = string.Empty;
            string debugFile;

            if (args.Length != 0)
            {
                // Executing a pipe.

                try
                {
                    // Load configuration parameters:

                    if (isLinux)
                    {
                        homeFolder     = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
                        applDataFolder = homeFolder + System.IO.Path.DirectorySeparatorChar + "." + appName.ToLower();
                    }
                    else
                    {
                        homeFolder     = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);
                        applDataFolder = homeFolder + System.IO.Path.DirectorySeparatorChar + appName;
                    }

                    string configFile = applDataFolder + System.IO.Path.DirectorySeparatorChar + appName + "Conf.xml";

                    if (File.Exists(configFile))
                    {
                        // Configuration file found.

                        XmlDocument xmlDoc = new XmlDocument();
                        xmlDoc.Load(configFile);
                        XmlElement rootElem = xmlDoc["Config"];
                        XmlElement elem     = rootElem["DebugFile"];
                        debugFile = elem.InnerText;
                    }
                    else
                    {
                        // Configuration file doesn't exist. Default the debug file:

                        debugFile = applDataFolder + System.IO.Path.DirectorySeparatorChar + "Debug.txt";
                    }

                    // Create a pipe object:

                    string currFolder = System.Environment.CurrentDirectory;
                    string script     = GetPositionalArg(1, args);
                    Pipe   thePipe    = new Pipe(script, pipeEng, currFolder, string.Empty,
                                                 Engine.CoreLogging(args), true);
                    thePipe.DebugFile = debugFile;
                    string pipeArgs = GetPositionalArg(2, args);

                    // Compile the pipe:

                    thePipe.Compile(pipeArgs, 0, string.Empty, 0);

                    if (thePipe.Errors.Count == 0)
                    {
                        // Create the input text file:

                        string       inText       = Path.GetTempFileName();
                        StreamWriter inTextWriter = new StreamWriter(inText);

                        // Transfer the text from standard input to the text file object:

                        while ((tempStr = Console.ReadLine()) != null)
                        {
                            inTextWriter.WriteLine(tempStr);
                        }

                        inTextWriter.Close();

                        // Create the output text file:

                        string outText = Path.GetTempFileName();

                        // Execute the pipe:

                        thePipe.Execute(ref inText, ref outText);

                        // Output the text results to standard output:

                        StreamReader outTextReader = new StreamReader(outText);

                        while (!outTextReader.EndOfStream)
                        {
                            Console.WriteLine(outTextReader.ReadLine());
                        }
                    }
                    else
                    {
                        Console.Error.WriteLine(System.Environment.NewLine +
                                                thePipe.Errors.ToString());
                    }
                }

                catch (PipeWrenchExecException ex)
                {
                    // Pipe execution (runtime) exception.

                    tempStr = string.Empty;
                    string source = (string)ex.Data["Source"];
                    tempStr += source + System.Environment.NewLine;
                    string lineNoStr = ((int)ex.Data["LineNo"]).ToString();
                    string cmdLine   = (string)ex.Data["CmdLine"];
                    tempStr += "   line " + lineNoStr + ": " + cmdLine +
                               System.Environment.NewLine;

                    if (ex.Data.Contains("CharPos"))
                    {
                        int charPos = (int)ex.Data["CharPos"];
                        tempStr += "^".PadLeft(charPos + 10 + lineNoStr.Length, ' ');
                    }

                    tempStr += System.Environment.NewLine + "      " + ex.Message;
                    Console.Error.WriteLine(tempStr);
                    exitCode = -1;
                }

                catch (Exception ex)
                {
                    // Anything not already handled...

                    exitCode = -2;
                    Console.Error.WriteLine(ex.Message);
                    pipeEng.Log.WriteText(ex.ToString(), "Fatal error...", "   ");
                }
            }
            else
            {
                try
                {
                    string headerLeftStr = cmdLineAppName + " " + version;
                    string headerRightStr;

                    if (isLinux)
                    {
                        headerRightStr = "Copyright \u00a9 2013 Firefly Software";
                    }
                    else
                    {
                        headerRightStr = "Copyright (C) 2013 Firefly Software";
                    }

                    string headerStr = headerLeftStr + headerRightStr.PadLeft(consoleCols -
                                                                              headerLeftStr.Length - 1) + "\n\n";
                    string footerStr = "\n<Press ENTER to Continue>";

                    // Display the help screen:

                    tempStr = cmdLineAppName.ToUpper() + " is the command-line component of " + appName + ", " +
                              "the high-level text scripting tool that allows you to easily transform text, (i.e. lists, " +
                              "command output, HTML, config files, log files, source code, CSV data, etc.) from one form " +
                              "to another with relative ease.  In a " + appName + " script, there's no need to create conditional " +
                              "or looping constructs or even to declare variables.  You simply \"stack\" filters to get " +
                              "the results you want.";

                    string wrapToWidthPipe = "WrapText " + consoleCols.ToString();
                    string bodyStr         = pipeEng.RunPipe("wrapToWidthPipe", wrapToWidthPipe, "", tempStr, false, false) + "\n\n";

                    tempStr = "Notice: This software is provided WITHOUT WARRANTY OF ANY KIND under " +
                              "the Free Software Foundation's GNU General Public License.  For further details, " +
                              "see \"http://www.gnu.org/licenses/\". ";

                    string noticeStr = pipeEng.RunPipe("wrapToWidthPipe", wrapToWidthPipe, "", tempStr, false, false);

                    Console.Error.Write(headerStr + bodyStr + noticeStr + PadLines(headerStr + bodyStr + noticeStr +
                                                                                   footerStr) + footerStr);
                    Console.ReadKey();

                    bodyStr  = "Syntax: " + cmdLineAppName + " <pipe> [<arguments>]\n\n";
                    bodyStr += "Where:\n\n";

                    string wrapToWidthIndentedPipe = "WrapText " + (consoleCols - 3).ToString() + "|InsStr 1 '   '";
                    bodyStr += pipeEng.RunPipe("wrapToWidthIndentedPipe", wrapToWidthIndentedPipe, "",
                                               "<pipe> is a double-quoted string containing one or more " + appName + " commands separated " +
                                               "by \"" + Engine.PipeDelim + "\".", false, true) + "\n";

                    bodyStr += pipeEng.RunPipe("wrapToWidthIndentedPipe", wrapToWidthIndentedPipe, "",
                                               "<arguments> is a double-quoted string containing one or more pipe arguments.",
                                               false, true) + "\n\n";

                    bodyStr += pipeEng.RunPipe("wrapToWidthPipe", wrapToWidthPipe, "", appName.ToLower() +
                                               "'s I/O can be redirected. Following are some examples:", false, true) + "\n\n";

                    if (isLinux)
                    {
                        bodyStr +=
                            "   LOGNAME=$(echo \"$FILE\" | " + cmdLineAppName + " \"AppendStr '.log'\")\n" +
                            "   echo hello | " + cmdLineAppName + " \"UpperCase " + Engine.PipeDelim + " AppendStr ' THERE'\"\n" +
                            "   cat the.txt | " + cmdLineAppName + " \"SortLines " + Engine.PipeDelim + " DelDuplLines\" >out.txt\n" +
                            "   find . -type f -printf '%P\\n' | " + cmdLineAppName + " \"InsStr 1 '#22' " + Engine.PipeDelim + " \n" +
                            "      AppendStr '#22'\" | xargs md5sum > \"$MD5SUMSFILE\"\n" +
                            "   echo \"$FILELIST\" | " + cmdLineAppName + " \"call '$RENAMEFILESPIPE'\" >\"$TEMPSCRIPT\"\n";
                    }
                    else
                    {
                        bodyStr +=
                            "   echo hello | " + cmdLineAppName + " \"UpperCase " + Engine.PipeDelim + " AppendStr ' THERE'\"\n" +
                            "   type the.txt | " + cmdLineAppName + " \"SortLines " + Engine.PipeDelim + " DelDuplLines\" >out.txt\n" +
                            "   echo \"%FILELIST%\" | " + cmdLineAppName + " \"call '%RENAMEFILESPIPE%'\" >\"%TEMPBATCH%\"\n" +
                            "   type template.txt | " + cmdLineAppName + " \"ReplStr '<KEY>' '%KEY%'\" >page.htm";
                    }

                    Console.Error.Write(headerStr + bodyStr + PadLines(headerStr + bodyStr + footerStr) + footerStr);
                    Console.ReadKey();

                    string filterList = GetFilters();

                    string displayFiltersPipe = "ParseWords|SortLines|PadLinesRight '~'|InsStr 1 '~'|" +
                                                "ReplStr '~(\\\\w+)\\\\*' '*$1~' /r|AppendStr ' '|JoinLines|WrapText " +
                                                consoleCols.ToString() + " /j50|ReplStr '~' ' '";

                    tempStr = pipeEng.RunPipe("displayFiltersPipe", displayFiltersPipe, "", filterList, false, true);
                    PaginateText(tempStr, headerStr, footerStr);
                }

                catch (PipeWrenchCompileException ex)
                {
                    Console.Error.WriteLine(ex.Message);
                }

                catch (PipeWrenchExecException ex)
                {
                    // Pipe execution (runtime) exception.

                    tempStr = string.Empty;
                    string source = (string)ex.Data["Source"];
                    tempStr += source + System.Environment.NewLine;
                    string lineNoStr = ((int)ex.Data["LineNo"]).ToString();
                    string cmdLine   = (string)ex.Data["CmdLine"];
                    tempStr += "   line " + lineNoStr + ": " + cmdLine + System.Environment.NewLine;

                    if (ex.Data.Contains("CharPos"))
                    {
                        int charPos = (int)ex.Data["CharPos"];
                        tempStr += "^".PadLeft(charPos + 10 + lineNoStr.Length, ' ');
                    }

                    tempStr += System.Environment.NewLine + "      " + ex.Message;
                    Console.Error.WriteLine(tempStr);
                }

                catch (Exception ex)
                {
                    // Anything not already handled...

                    pipeEng.Log.WriteText(ex.ToString(), "Fatal error...", "   ");
                    Console.Error.WriteLine(ex.Message);
                }
            }

            return(exitCode);
        }
Example #7
0
        /// <summary>
        /// Executes the pipe.
        /// </summary>
        private void ExecutePipe(string pipeText)
        {
            try
            {
                ErrorsTextBox.Text = string.Empty;
                string pipeFolder = string.Empty;
                string pipeName   = "<new pipe>";

                if (PipePath != string.Empty)
                {
                    string tempStr = System.IO.Path.GetFullPath(PipePath);
                    pipeFolder = System.IO.Path.GetDirectoryName(tempStr);
                    pipeName   = System.IO.Path.GetFileName(tempStr);
                }

                Pipe ThePipe = new Pipe(pipeText, PipeEng, pipeFolder, pipeName, CoreLogging, false);
                ThePipe.DebugFile = DebugFile;
                ThePipe.Compile(ArgsTextBox.Text, 0, string.Empty, 0);

                if (ThePipe.Errors.Count == 0)
                {
                    if ((!File.Exists(OutputFileTextBox.Text)) ||
                        MessageBox.Show("Overwrite output file?", "Warning!", MessageBoxButtons.YesNoCancel,
                                        MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        if ((DebugFile != null) && (File.Exists(DebugFile)))
                        {
                            File.Delete(DebugFile);
                        }

                        string inTempFile  = System.IO.Path.GetTempFileName();
                        string outTempFile = System.IO.Path.GetTempFileName();

                        try
                        {
                            if (InputFileTextBox.Text == string.Empty)
                            {
                                File.WriteAllText(inTempFile, InputTextBox.Text);
                            }
                            else
                            {
                                File.Copy(InputFileTextBox.Text, inTempFile, true);
                            }

                            ThePipe.Execute(ref inTempFile, ref outTempFile);

                            if (OutputFileTextBox.Text == string.Empty)
                            {
                                // Unsubscribe from the TextChanged event handler so that
                                // the updates made to the ouput textbox don't change
                                // the caret's current location:

                                OutputTextBox.TextChanged -= IOTextBox_OnChanged;

                                // Write changes to the output text box:

                                OutputTextBox.Text = File.ReadAllText(outTempFile);

                                // Re-subscribe to the TextChanged event handler:

                                OutputTextBox.TextChanged += IOTextBox_OnChanged;
                            }
                            else
                            {
                                File.Copy(outTempFile, OutputFileTextBox.Text, true);
                            }
                        }

                        finally
                        {
                            File.Delete(inTempFile);
                            File.Delete(outTempFile);
                        }

                        TextTabControl.SelectedTab = OutputTabPage;
                        PipeTextBox.Focus();
                    }
                }
                else
                {
                    // Errors.

                    ErrorsTextBox.Text         = ThePipe.Errors.ToString();
                    TextTabControl.SelectedTab = ErrorsTabPage;
                }
            }

            catch (PipeWrenchExecException ex2)
            {
                // Pipe execution (runtime) exception.

                string tempStr = string.Empty;
                string source  = (string)ex2.Data["Source"];
                tempStr += source + System.Environment.NewLine;
                string lineNoStr = ((int)ex2.Data["LineNo"]).ToString();
                string cmdLine   = (string)ex2.Data["CmdLine"];
                tempStr += "   line " + lineNoStr + ": " + cmdLine + System.Environment.NewLine;

                if (ex2.Data.Contains("CharPos"))
                {
                    int charPos = (int)ex2.Data["CharPos"];
                    tempStr += "^".PadLeft(charPos + 10 + lineNoStr.Length, ' ');
                }

                tempStr                   += System.Environment.NewLine + "      " + ex2.Message;
                ErrorsTextBox.Text         = tempStr;
                TextTabControl.SelectedTab = ErrorsTabPage;
            }

            catch (Exception ex3)
            {
                // Anything not already handled...

                ErrorsTextBox.Text         = ex3.Message;
                TextTabControl.SelectedTab = ErrorsTabPage;
                PipeEng.Log.WriteText(ex3.ToString(), "Fatal error...", "   ");
            }
        }
Example #8
0
        /// <summary>
        /// Executes the pipe.
        /// </summary>
        private void ExecutePipe(string pipeText)
        {
            try
             {
            ErrorsTextBox.Text = string.Empty;
            string pipeFolder = string.Empty;
            string pipeName = "<new pipe>";

            if (PipePath != string.Empty)
            {
               string tempStr = System.IO.Path.GetFullPath(PipePath);
               pipeFolder = System.IO.Path.GetDirectoryName(tempStr);
               pipeName = System.IO.Path.GetFileName(tempStr);
            }

            Pipe ThePipe = new Pipe(pipeText, PipeEng, pipeFolder, pipeName, CoreLogging, false);
            ThePipe.DebugFile = DebugFile;
            ThePipe.Compile(ArgsTextBox.Text, 0, string.Empty, 0);

            if (ThePipe.Errors.Count == 0)
            {
               if ((!File.Exists(OutputFileTextBox.Text)) ||
               MessageBox.Show("Overwrite output file?", "Warning!", MessageBoxButtons.YesNoCancel,
               MessageBoxIcon.Warning) == DialogResult.Yes)
               {
                  if ((DebugFile != null) && (File.Exists(DebugFile)))
                  {
                     File.Delete(DebugFile);
                  }

                  string inTempFile = System.IO.Path.GetTempFileName();
                  string outTempFile = System.IO.Path.GetTempFileName();

                  try
                  {
                     if (InputFileTextBox.Text == string.Empty)
                     {
                        File.WriteAllText(inTempFile, InputTextBox.Text);
                     }
                     else
                     {
                        File.Copy(InputFileTextBox.Text, inTempFile, true);
                     }

                     ThePipe.Execute(ref inTempFile, ref outTempFile);

                     if (OutputFileTextBox.Text == string.Empty)
                     {
                        // Unsubscribe from the TextChanged event handler so that
                        // the updates made to the ouput textbox don't change
                        // the caret's current location:

                        OutputTextBox.TextChanged -= IOTextBox_OnChanged;

                        // Write changes to the output text box:

                        OutputTextBox.Text = File.ReadAllText(outTempFile);

                        // Re-subscribe to the TextChanged event handler:

                        OutputTextBox.TextChanged += IOTextBox_OnChanged;
                     }
                     else
                     {
                        File.Copy(outTempFile, OutputFileTextBox.Text, true);
                     }
                  }

                  finally
                  {
                     File.Delete(inTempFile);
                     File.Delete(outTempFile);
                  }

                  TextTabControl.SelectedTab = OutputTabPage;
                  PipeTextBox.Focus();
               }
            }
            else
            {
               // Errors.

               ErrorsTextBox.Text = ThePipe.Errors.ToString();
               TextTabControl.SelectedTab = ErrorsTabPage;
            }
             }

             catch (PipeWrenchExecException ex2)
             {
            // Pipe execution (runtime) exception.

            string tempStr = string.Empty;
            string source = (string) ex2.Data["Source"];
            tempStr += source + System.Environment.NewLine;
            string lineNoStr = ((int) ex2.Data["LineNo"]).ToString();
            string cmdLine = (string) ex2.Data["CmdLine"];
            tempStr += "   line " + lineNoStr + ": " + cmdLine + System.Environment.NewLine;

            if (ex2.Data.Contains("CharPos"))
            {
               int charPos = (int) ex2.Data["CharPos"];
               tempStr += "^".PadLeft(charPos+10+lineNoStr.Length, ' ');
            }

            tempStr += System.Environment.NewLine + "      " + ex2.Message;
            ErrorsTextBox.Text = tempStr;
            TextTabControl.SelectedTab = ErrorsTabPage;
             }

             catch (Exception ex3)
             {
            // Anything not already handled...

            ErrorsTextBox.Text = ex3.Message;
            TextTabControl.SelectedTab = ErrorsTabPage;
            PipeEng.Log.WriteText(ex3.ToString(), "Fatal error...", "   ");
             }
        }
Example #9
0
        /// <summary>
        /// Implements a pipe wrapper for use internally or by front-end.
        /// </summary>
        public string RunPipe(string name, string script, string args, string inText, bool loggingEnabled, bool replacingDelims)
        {
            Pipe thePipe = new Pipe(script, this, string.Empty, string.Empty, loggingEnabled, replacingDelims);

             thePipe.Compile(args, 0, string.Empty, 0);

             if (thePipe.Errors.Count == 0)
             {
            string inTempFile = System.IO.Path.GetTempFileName();
            File.WriteAllText(inTempFile, inText);
            string outTempFile = System.IO.Path.GetTempFileName();

            thePipe.Execute(ref inTempFile, ref outTempFile);

            string results = File.ReadAllText(outTempFile);

            results = results.Substring(0, results.Length - System.Environment.NewLine.Length);

            File.Delete(inTempFile);
            File.Delete(outTempFile);

            return results;
             }
             else
             {
            if ((name == null) || (name == string.Empty)) name = "<unknown>";
            throw new PipeWrenchCompileException(System.Environment.NewLine +
            "Internal error. Pipe passed to RunPipe, (" + name + "), " +
            "failed compile: " + System.Environment.NewLine + System.Environment.NewLine +
            thePipe.Errors.ToString());
             }
        }