ekg2  GIT master
perl_core.h
Idź do dokumentacji tego pliku.
1 #ifndef PERL_CORE_H
2 #define PERL_CORE_H
3 
4 #ifdef bool
5 #define HAS_BOOL
6 #endif
7 
8 #define fix(s) ((s) ? (s) : "") /* xmalloc.h */
9 
10 #include <EXTERN.h>
11 #include <perl.h>
12 #include <XSUB.h>
13 
14 /* syfffff irssi */
15 
16 #define new_pv(a) newSVpv(fix(a), xstrlen(a))
17 
18 #define is_hvref(o) \
19  ((o) && SvROK(o) && SvRV(o) && (SvTYPE(SvRV(o)) == SVt_PVHV))
20 
21 #define hvref(o) \
22  (is_hvref(o) ? (HV *)SvRV(o) : NULL)
23 
24 /* syfffff ekg2 */
25 
26 #define PERL_HANDLER_HEADER(x) \
27  char *fullproc, *error; \
28  int perl_retcount, ret = 0;\
29  SV *perl_ret;\
30  if (!x) return -1;\
31  fullproc = saprintf("Ekg2::Script::%s::%s", scr->name, x);\
32  { /* tag will be closed in PERL_HANDLER_FOOTER macro */ \
33  dSP;\
34  ENTER;\
35  SAVETMPS;\
36  PUSHMARK(sp);
37 
38 int perl_initialize();
39 int perl_finalize();
40 
41 SV *create_sv_ptr(void *object);
42 
43 #endif
44 /* zrobic to jakos ladniej... hack.*/
45 
46 #undef RESTORE_ARGS
47 #undef PERL_HANDLER_FOOTER
48 
49 #ifdef PERL_RESTORE_ARGS
50 #define RESTORE_ARGS(x)\
51  if (change) {\
52  for (i=0; i < scr_que->argc; i++) {\
53  if (scr_que->argv_type[i] & QUERY_ARG_CONST)\
54  continue;\
55  switch ( scr_que->argv_type[i] & QUERY_ARG_TYPES ) {\
56  case (QUERY_ARG_INT):\
57  *( (int *) args[i]) = SvIV(SvRV(perlargs[i]));\
58  break;\
59 \
60  case (QUERY_ARG_CHARP):\
61  {\
62  char *retarg = xstrdup( SvPV_nolen(SvRV(perlargs[i])) ); \
63  if ( xstrcmp(retarg, *( (char **) args[i])) ) {\
64  xfree(*(char **) args[i]); \
65  *( (char **) args[i]) = retarg;\
66  } else\
67  xfree(retarg);\
68  break;\
69  }\
70  case (QUERY_ARG_CHARPP): /* wazne, zrobic. */\
71  break;\
72 \
73  }\
74  }\
75  }
76 
77 #else
78 #define RESTORE_ARGS(x) ;
79 #endif
80 
81 #define PERL_HANDLER_FOOTER()\
82  PUTBACK;\
83 /* perl_retcount = perl_call_sv(func, G_EVAL|G_DISCARD);*/\
84  perl_retcount = perl_call_pv(fullproc, G_EVAL);\
85  SPAGAIN;\
86  if (SvTRUE(ERRSV)) {\
87  error = SvPV(ERRSV, PL_na);\
88  print("script_error", error);\
89  ret = SCRIPT_HANDLE_UNBIND;\
90  }\
91  else if (perl_retcount > 0)\
92  {\
93  perl_ret = POPs;\
94  ret = SvIV(perl_ret);\
95  }\
96  RESTORE_ARGS(0);\
97 /* debug("%d %d\n", ret, perl_retcount); */\
98  \
99  PUTBACK;\
100  FREETMPS;\
101  LEAVE;\
102  \
103  if (ret < 0) return -1;\
104  else return ret; \
105  } /* closing tag defined in PERL_HANDLER_HEADER() macro */ \
106  xfree(fullproc);
107 
int perl_initialize()
Definition: perl_core.c:229
SV * create_sv_ptr(void *object)
Definition: perl_core.c:273
int perl_finalize()
Definition: perl_core.c:371