The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#ifndef _SANDWICH_PHPINTERP_H
#define _SANDWICH_PHPINTERP_H

#include <EXTERN.h>
#include <perl.h>
#include <perlapi.h>

#undef module_name
#undef API_EXPORT
#include <main/php_config.h>
#include <main/php.h>
#include <main/php_ini.h>
#include <main/php_main.h>
#include <zend.h>
#include <zend_API.h>
#include <zend_compile.h>
#include <zend_ini.h>
#include <SAPI.h>
#include <TSRM.h>

typedef struct {
  void *ctx;
  int ref;
  SV *output_handler;
} sandwich_per_interp;

int sandwich_php_interpreter_create();

sandwich_per_interp *sandwich_per_interp_setup();

void sandwhich_per_interp_shutdown(sandwich_per_interp *interp);

SV *sandwich_eval(sandwich_per_interp *interp, char *code);
int sandwich_include(sandwich_per_interp *interp, char *file, int once);

/* NOTE: caller must tsrm_set_interpreter_context and reset the old one */
zval *sandwich_call_function(sandwich_per_interp *interp, zval *method, zval **params, zend_uint param_count);

#define sandwich_interp_inc_ref(interp) interp->ref++
#define sandwich_interp_dec_ref(interp) if(--interp->ref == 0) sandwich_per_interp_shutdown(interp)

zval *SvZval(SV *sv TSRMLS_DC);
SV *newSVzval(zval *param, sandwich_per_interp *interp);

#ifdef ZTS
#define INTERP_CTX_ENTER(ctx) void *old_ctx = tsrm_set_interpreter_context(ctx)
#define INTERP_CTX_LEAVE()   tsrm_set_interpreter_context(old_ctx)
#else
#define INTERP_CTX_ENTER(ctx)
#define INTERP_CTX_LEAVE()
#endif

#endif