Qt isn't necessary--that's just the environment I'm working in.  From my example, get rid of the #include <QtWidgets>line.

Here's aplexec.h:

   #ifndef APLEXEC_H
   #define APLEXEC_H

   #include <QtWidgets>
   #include <apl/libapl.h>

   #define APL_VARIABLE "([⍙∆a-z][⍙∆_a-z0-9]*)"

   typedef enum {
     APL_OP_EXEC,
     APL_OP_COMMAND
   } apl_op_e;

   class AplExec
   {
   public:
     static LIBAPL_error
     aplExec (apl_op_e apl_op, QString &cmd,
              QString &outString, QString &errString);
   };
   #endif // APLEEXEC_H



Again, you don't need the Qt stuff.  Mostly, what you need is the

   #include <apl/libapl.h>

line.  And you probably don't need the #define APL_VARIABLE "([⍙∆a-z][⍙∆_a-z0-9]*)" line

For this to work at all, you need to build Jürgen's APL twice, once as usual to install apl itself, and a second time with

   ./configure --with-libapl
   make install

(with any other options you need on the configure)

What this does is put apl-related stuff in /usr/local/include and /usr/local/lib.  (I think I manually copied Error.def from the apl source tree into /usr/local/include--I don't think it gets copied with the make install.)

On 1/27/23 16:28, enz...@gmx.com wrote:
Chris

i don't have qt installed nor do i have your
#include "aplexec.h"

On Fri, 27 Jan 2023 11:23:08 -0500
Chris Moller<mol...@mollerware.com>  wrote:

For what it's worth, in an ongoing project in use:

     #include <QtWidgets>

     #include <iostream>
     #include <sstream>

     #include <apl/libapl.h>

     #include "aplexec.h"

     LIBAPL_error
     AplExec::aplExec (apl_op_e apl_op, QString &cmd,
                QString &outString, QString &errString)
     {
       LIBAPL_error execerr = LAE_NO_ERROR;

       switch(apl_op) {
       case APL_OP_EXEC:
         {
           std::stringstream outbuffer;
           std::streambuf *coutbuf = std::cout.rdbuf();
           std::cout.rdbuf(outbuffer.rdbuf());
           std::stringstream errbuffer;
           std::streambuf *cerrbuf = std::cerr.rdbuf();
           std::cerr.rdbuf(errbuffer.rdbuf());
           execerr = apl_exec (cmd.toStdString ().c_str ());
           std::cout.rdbuf(coutbuf);
           std::cerr.rdbuf(cerrbuf);
           outString = QString (outbuffer.str ().c_str ());
           errString = QString (errbuffer.str ().c_str ());
         }
         break;
       case APL_OP_COMMAND:
         {
           std::stringstream errbuffer;
           std::streambuf *cerrbuf = std::cerr.rdbuf();
           std::cerr.rdbuf(errbuffer.rdbuf());
           const char *res = apl_command (cmd.toStdString ().c_str ());
           if (res) {
             outString = QString (res);
             free ((void *)res);
           }
           std::cerr.rdbuf(cerrbuf);
           errString = QString (errbuffer.str ().c_str ());
         }
         break;
       }

       return execerr;
     }

I.e., I'm capturing stdout and stderr in strings.


Attachment: OpenPGP_0xDA6C01938888083E.asc
Description: OpenPGP public key

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to