view release on metacpan or search on metacpan
Compiler/Compiler.xs view on Meta::CPAN
amd_require(_AMD "::Compiler::Node");
amd_require(_AMD "::Program");
}
}
Anarres::Mud::Driver::Compiler
new(class)
SV * class
CODE:
RETVAL = Newz(0, RETVAL, 1, struct _amd_parser);
OUTPUT:
RETVAL
int
lex(class, str)
SV * class
char * str
CODE:
test_lexer(str);
RETVAL = 0;
OUTPUT:
RETVAL
int
parse(class, prog, str)
SV * class
SV * prog
char * str
CODE:
amd_yyparser_parse(prog, str);
RETVAL = 0;
OUTPUT:
RETVAL
void
DESTROY(self)
Anarres::Mud::Driver::Compiler self
CODE:
Safefree(self);
Compiler/junk view on Meta::CPAN
out = newSVpvn("", 0);
for (i = 0; i < num; i++) {
sv_catpvn(out, "*", 1);
}
sv_catsv(out, self);
RETVAL = sv_bless(newRV_noinc(out),
gv_stashpv(_AMD "::Compiler::Type", TRUE));
}
OUTPUT:
RETVAL
SV *
mapping(self, num = 1)
Anarres::Mud::Driver::Compiler::Type self
int num
CODE:
{
/* I can't quite get the typemap to bless an output
* reference to a scalar. */
Compiler/junk view on Meta::CPAN
out = newSVpvn("", 0);
for (i = 0; i < num; i++) {
sv_catpvn(out, "#", 1);
}
sv_catsv(out, self);
RETVAL = sv_bless(newRV_noinc(out),
gv_stashpv(_AMD "::Compiler::Type", TRUE));
}
OUTPUT:
RETVAL
Compiler/lexer.c view on Meta::CPAN
#line 2 "lexer.yy"
#include <stdio.h>
#include <stdlib.h>
#include "compiler.h"
#include "parser.h"
#define YY_DECL int amd_yylex(AMD_YYSTYPE *amd_yylval, amd_parse_param_t *param)
static int amd_yyinteger(AMD_YYSTYPE *lvalp);
static int amd_yyidentifier(AMD_YYSTYPE *lvalp, amd_parse_param_t *param);
#define YY_NO_INPUT 1
#define YY_NO_UNPUT 1
#define YY_NO_TOP_STATE 1
/* %option debug */
#define CODE 1
#define BLANK 2
#define STRING 3
#define PPLINE 4
Compiler/lexer.c view on Meta::CPAN
*/
#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int amd_yywrap YY_PROTO(( void ));
#else
extern int amd_yywrap YY_PROTO(( void ));
#endif
#endif
#ifndef YY_NO_UNPUT
static void amd_yyunput YY_PROTO(( int c, char *buf_ptr ));
#endif
#ifndef amd_yytext_ptr
static void amd_yy_flex_strncpy YY_PROTO(( char *, amd_yyconst char *, int ));
#endif
#ifdef YY_NEED_STRLEN
static int amd_yy_flex_strlen YY_PROTO(( amd_yyconst char * ));
#endif
#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int amd_yyinput YY_PROTO(( void ));
#else
static int input YY_PROTO(( void ));
#endif
#endif
#if YY_STACK_USED
static int amd_yy_start_stack_ptr = 0;
static int amd_yy_start_stack_depth = 0;
Compiler/lexer.c view on Meta::CPAN
#ifndef ECHO
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
*/
#define ECHO (void) fwrite( amd_yytext, amd_yyleng, 1, amd_yyout )
#endif
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
* is returned in "result".
*/
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
if ( amd_yy_current_buffer->amd_yy_is_interactive ) \
{ \
int c = '*', n; \
for ( n = 0; n < max_size && \
(c = getc( amd_yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
if ( c == '\n' ) \
buf[n++] = (char) c; \
if ( c == EOF && ferror( amd_yyin ) ) \
YY_FATAL_ERROR( "input in flex scanner failed" ); \
Compiler/lexer.c view on Meta::CPAN
num_to_read = amd_yy_current_buffer->amd_yy_buf_size -
number_to_move - 1;
#endif
}
if ( num_to_read > YY_READ_BUF_SIZE )
num_to_read = YY_READ_BUF_SIZE;
/* Read in more data. */
YY_INPUT( (&amd_yy_current_buffer->amd_yy_ch_buf[number_to_move]),
amd_yy_n_chars, num_to_read );
amd_yy_current_buffer->amd_yy_n_chars = amd_yy_n_chars;
}
if ( amd_yy_n_chars == 0 )
{
if ( number_to_move == YY_MORE_ADJ )
{
ret_val = EOB_ACT_END_OF_FILE;
Compiler/lexer.c view on Meta::CPAN
if ( amd_yy_current_state >= 134 )
amd_yy_c = amd_yy_meta[(unsigned int) amd_yy_c];
}
amd_yy_current_state = amd_yy_nxt[amd_yy_base[amd_yy_current_state] + (unsigned int) amd_yy_c];
amd_yy_is_jam = (amd_yy_current_state == 133);
return amd_yy_is_jam ? 0 : amd_yy_current_state;
}
#ifndef YY_NO_UNPUT
#ifdef YY_USE_PROTOS
static void amd_yyunput( int c, register char *amd_yy_bp )
#else
static void amd_yyunput( c, amd_yy_bp )
int c;
register char *amd_yy_bp;
#endif
{
register char *amd_yy_cp = amd_yy_c_buf_p;
Compiler/lexer.c view on Meta::CPAN
YY_FATAL_ERROR( "flex scanner push-back overflow" );
}
*--amd_yy_cp = (char) c;
amd_yytext_ptr = amd_yy_bp;
amd_yy_hold_char = *amd_yy_cp;
amd_yy_c_buf_p = amd_yy_cp;
}
#endif /* ifndef YY_NO_UNPUT */
#ifdef __cplusplus
static int amd_yyinput()
#else
static int input()
#endif
{
int c;
Compiler/parser.c view on Meta::CPAN
if (rest) {
len = av_len(rest);
for (i = 0; i <= len; i++) {
svp = av_fetch(rest, i, FALSE);
if (svp)
XPUSHs(*svp);
}
}
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from constructing %s\n", type);
node = POPs;
PUTBACK;
SvREFCNT_inc(node);
FREETMPS;
LEAVE;
// sv_2mortal(node); /* This segfaults it at the moment. */
return node;
}
Compiler/parser.c view on Meta::CPAN
sv = newSVsv(stars);
sv_catpv(sv, type);
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(class);
XPUSHs(sv); /* Does this get freed? */
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from constructing Type\n");
node = POPs;
PUTBACK;
SvREFCNT_inc(node);
FREETMPS;
LEAVE;
/* In the outer scope. Let's hope this doesn't get dested. */
sv_2mortal(node);
return node;
Compiler/parser.c view on Meta::CPAN
PUSHMARK(SP);
XPUSHs(class);
XPUSHs(k_type);
XPUSHs(newtype);
XPUSHs(k_name);
XPUSHs(name);
XPUSHs(k_flags);
XPUSHs(mods);
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from constructing Variable\n");
node = POPs;
PUTBACK;
SvREFCNT_inc(node);
FREETMPS;
LEAVE;
return node;
}
static SV *
Compiler/parser.c view on Meta::CPAN
XPUSHs(class);
XPUSHs(k_type);
XPUSHs(newtype);
XPUSHs(k_name);
XPUSHs(name);
XPUSHs(k_args);
XPUSHs(args);
XPUSHs(k_flags);
XPUSHs(mods);
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from constructing Method\n");
node = POPs;
PUTBACK;
SvREFCNT_inc(node);
FREETMPS;
LEAVE;
// printf("End of amd_yyparse_method\n");
return node;
}
Compiler/parser.c view on Meta::CPAN
dSP;
int count;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(method);
XPUSHs(code);
PUTBACK;
count = call_method("code", G_DISCARD);
SPAGAIN;
if (count != 0)
croak("Got a return value from method->code()\n");
PUTBACK;
FREETMPS;
LEAVE;
}
static SV *
amd_yyparse_program_apply(amd_parse_param_t *param,
const char *func, SV *arg0, SV *arg1)
{
dSP;
int count;
Compiler/parser.c view on Meta::CPAN
// printf("Apply %s\n", func);
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(param->program);
if (arg0) XPUSHs(arg0);
if (arg1) XPUSHs(arg1);
PUTBACK;
count = call_method(func, G_SCALAR);
SPAGAIN;
if (count != 1)
croak("No returned value from apply %s\n", func);
node = POPs;
SvREFCNT_inc(node);
PUTBACK;
FREETMPS;
LEAVE;
return node;
}
#line 386 "parser.y"
typedef union {
int number;
Compiler/parser.y view on Meta::CPAN
if (rest) {
len = av_len(rest);
for (i = 0; i <= len; i++) {
svp = av_fetch(rest, i, FALSE);
if (svp)
XPUSHs(*svp);
}
}
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from constructing %s\n", type);
node = POPs;
PUTBACK;
SvREFCNT_inc(node);
FREETMPS;
LEAVE;
// sv_2mortal(node); /* This segfaults it at the moment. */
return node;
}
Compiler/parser.y view on Meta::CPAN
sv = newSVsv(stars);
sv_catpv(sv, type);
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(class);
XPUSHs(sv); /* Does this get freed? */
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from constructing Type\n");
node = POPs;
PUTBACK;
SvREFCNT_inc(node);
FREETMPS;
LEAVE;
/* In the outer scope. Let's hope this doesn't get dested. */
sv_2mortal(node);
return node;
Compiler/parser.y view on Meta::CPAN
PUSHMARK(SP);
XPUSHs(class);
XPUSHs(k_type);
XPUSHs(newtype);
XPUSHs(k_name);
XPUSHs(name);
XPUSHs(k_flags);
XPUSHs(mods);
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from constructing Variable\n");
node = POPs;
PUTBACK;
SvREFCNT_inc(node);
FREETMPS;
LEAVE;
return node;
}
static SV *
Compiler/parser.y view on Meta::CPAN
XPUSHs(class);
XPUSHs(k_type);
XPUSHs(newtype);
XPUSHs(k_name);
XPUSHs(name);
XPUSHs(k_args);
XPUSHs(args);
XPUSHs(k_flags);
XPUSHs(mods);
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from constructing Method\n");
node = POPs;
PUTBACK;
SvREFCNT_inc(node);
FREETMPS;
LEAVE;
// printf("End of yyparse_method\n");
return node;
}
Compiler/parser.y view on Meta::CPAN
dSP;
int count;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(method);
XPUSHs(code);
PUTBACK;
count = call_method("code", G_DISCARD);
SPAGAIN;
if (count != 0)
croak("Got a return value from method->code()\n");
PUTBACK;
FREETMPS;
LEAVE;
}
static SV *
yyparse_program_apply(amd_parse_param_t *param,
const char *func, SV *arg0, SV *arg1)
{
dSP;
int count;
Compiler/parser.y view on Meta::CPAN
// printf("Apply %s\n", func);
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(param->program);
if (arg0) XPUSHs(arg0);
if (arg1) XPUSHs(arg1);
PUTBACK;
count = call_method(func, G_SCALAR);
SPAGAIN;
if (count != 1)
croak("No returned value from apply %s\n", func);
node = POPs;
SvREFCNT_inc(node);
PUTBACK;
FREETMPS;
LEAVE;
return node;
}
%}
%token L_BREAK L_CASE L_CATCH L_CLASS L_CONTINUE L_DEFAULT L_DO
%token L_EFUN L_ELSE L_FOR L_FOREACH L_IF L_IN L_INHERIT L_NEW
Compiler/typemap view on Meta::CPAN
Anarres::Mud::Driver::Compiler T_PTROBJ
Anarres::Mud::Driver::Compiler::Type T_BLESS_SVREF
############################
INPUT
T_BLESS_SVREF
if (sv_isa($arg, \"${ntype}\"))
$var = SvPV_nolen(SvRV($arg));
else
croak(\"$var is not of type ${ntype}\");
############################
OUTPUT
T_BLESS_SVREF
sv_setsv($arg, sv_bless(newRV_noinc(newSVpv($var, 0)),
gv_stashpv("$Package", TRUE)));
Compiler/utils.c view on Meta::CPAN
{
dSP;
int count;
amd_require("Data::Dumper");
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv);
PUTBACK;
count = call_pv("Data::Dumper::Dumper", G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Didn't get a return value from Dumper\n");
printf("%s: %s\n", prefix, POPp);
fflush(stdout);
PUTBACK;
FREETMPS;
LEAVE;
}
void
amd_peek(const char *prefix, SV *sv)
{
dSP;
int count;
amd_require("Devel::Peek");
printf("Peeking at %s\n", prefix);
fflush(stdout);
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv);
PUTBACK;
count = call_pv("Devel::Peek::Dump", G_DISCARD);
FREETMPS;
LEAVE;
}
Efun/Core/Core.xs view on Meta::CPAN
PROTOTYPES: ENABLE
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::intp
int
invoke(arg)
SV * arg
CODE:
RETVAL = SvIOKp(arg); /* Not necessarily the best way? */
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::floatp
int
invoke(arg)
SV * arg
CODE:
RETVAL = SvNOKp(arg);
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::stringp
int
invoke(arg)
SV * arg
CODE:
RETVAL = SvPOKp(arg);
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::replace_string
SV *
invoke(big, find, replace)
char * big
char * find
char * replace
CODE:
Efun/Core/Core.xs view on Meta::CPAN
cp = strstr(big, find);
while (cp) {
sv_catpvn(RETVAL, op, (cp - op));
sv_catpvn(RETVAL, replace, rlen);
op = cp + flen;
cp = strstr(op, find);
}
sv_catpv(RETVAL, op);
}
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::explode
SV *
invoke(str, sep)
char * str
char * sep
CODE:
{
Efun/Core/Core.xs view on Meta::CPAN
else {
sv = newSVpv(cp, 0);
av_push(av, sv);
break;
}
}
}
RETVAL = sv_2mortal(newRV_noinc((SV *)av));
}
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::substr
SV *
invoke(input, start, end, sep, eep)
SV * input;
int start
int end
int sep
Efun/Core/Core.xs view on Meta::CPAN
if (start < 0)
start = 0;
if (end < 0)
end = 0;
if (start > length)
start = length;
if (end > length)
end = length;
RETVAL = newSVpvn(str + start, (end - start));
}
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::subchar
SV *
invoke(input, idx, ep)
SV * input;
int idx
int ep
Efun/Core/Core.xs view on Meta::CPAN
str = SvPV(input, length);
if (ep)
idx = length - idx + 1;
if (idx < 0)
idx = 0;
if (idx > length)
idx = length;
RETVAL = newSViv((IV)str[idx]);
}
OUTPUT:
RETVAL
Type/Type.xs view on Meta::CPAN
SV *
new(self, code)
SV * self
char * code
CODE:
RETVAL = amd_type_new(code);
/* This is automatically mortalised.
* We always have a ref to it through the hash anyway. */
SvREFCNT_inc(RETVAL);
OUTPUT:
RETVAL
void
compatible(self, arg)
Anarres::Mud::Driver::Compiler::Type self
Anarres::Mud::Driver::Compiler::Type arg
CODE:
{
/* This actually returns a boolean */
/* Can we assign type 'self' to type 'arg'? */
Type/Type.xs view on Meta::CPAN
sv_catpvn(out, T_UNKNOWN, strlen(T_UNKNOWN));
}
else {
out = newSVpvn(self, len);
}
RETVAL = amd_type_new(SvPV_nolen(out));
SvREFCNT_inc(RETVAL);
SvREFCNT_dec(out);
}
OUTPUT:
RETVAL
Type/typemap view on Meta::CPAN
Anarres::Mud::Driver::Compiler::Type T_BLESS_SVREF
############################
INPUT
T_BLESS_SVREF
if (sv_isa($arg, \"${ntype}\"))
$var = SvPV_nolen(SvRV($arg));
else
croak(\"$var is not of type ${ntype}\");
############################
OUTPUT
T_BLESS_SVREF
sv_setsv($arg, sv_bless(newRV_noinc(newSVpv($var, 0)),
gv_stashpv("$Package", TRUE)));