bug-apl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: libapl stdout


From: Chris Moller
Subject: Re: libapl stdout
Date: Fri, 27 Jan 2023 17:18:01 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0

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, enztec@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 <moller@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

[Prev in Thread] Current Thread [Next in Thread]