factor out "print" statement's execution functionality

This commit is contained in:
Vern Paxson 2021-03-18 10:04:21 -07:00
parent b792feccab
commit 22776167bb
3 changed files with 15 additions and 9 deletions

View file

@ -12,8 +12,7 @@
#include <krb5.h>
#endif // NEED_KRB5_H
#include "zeek/Obj.h"
#include "zeek/IntrusivePtr.h"
#include "zeek/Val.h"
#include "zeek/util.h"
namespace zeek {
@ -23,6 +22,8 @@ namespace detail {
class PrintStmt;
class Attributes;
extern void do_print_stmt(const std::vector<ValPtr>& vals);
} // namespace detail;
class RecordVal;
@ -84,7 +85,7 @@ public:
protected:
friend class detail::PrintStmt;
friend void detail::do_print_stmt(const std::vector<ValPtr>& vals);
File() { Init(); }
void Init();

View file

@ -306,18 +306,23 @@ ValPtr PrintStmt::DoExec(std::vector<ValPtr> vals,
StmtFlowType& /* flow */)
{
RegisterAccess();
do_print_stmt(vals);
return nullptr;
}
void do_print_stmt(const std::vector<ValPtr>& vals)
{
if ( ! print_stdout )
print_stdout = new File(stdout);
File* f = print_stdout;
int offset = 0;
if ( vals.size() > 0 && (vals)[0]->GetType()->Tag() == TYPE_FILE )
if ( vals.size() > 0 && vals[0] && vals[0]->GetType()->Tag() == TYPE_FILE )
{
f = (vals)[0]->AsFile();
if ( ! f->IsOpen() )
return nullptr;
return;
++offset;
}
@ -331,7 +336,7 @@ ValPtr PrintStmt::DoExec(std::vector<ValPtr> vals,
case BifEnum::Log::REDIRECT_ALL:
{
print_log(vals);
return nullptr;
return;
}
case BifEnum::Log::REDIRECT_STDOUT:
if ( f->FileHandle() == stdout )
@ -339,7 +344,7 @@ ValPtr PrintStmt::DoExec(std::vector<ValPtr> vals,
// Should catch even printing to a "manually opened" stdout file,
// like "/dev/stdout" or "-".
print_log(vals);
return nullptr;
return;
}
break;
default:
@ -368,8 +373,6 @@ ValPtr PrintStmt::DoExec(std::vector<ValPtr> vals,
describe_vals(vals, &d, offset);
f->Write("\n", 1);
}
return nullptr;
}
ExprStmt::ExprStmt(ExprPtr arg_e) : Stmt(STMT_EXPR), e(std::move(arg_e))

View file

@ -62,6 +62,8 @@ protected:
StmtPtr DoSubclassReduce(ListExprPtr singletons, Reducer* c) override;
};
extern void do_print_stmt(const std::vector<ValPtr>& vals);
class ExprStmt : public Stmt {
public:
explicit ExprStmt(ExprPtr e);