e576bb | 2002-10-11 | Martin Nilsson | | |
128a45 | 2003-12-09 | Martin Nilsson | | || $Id: parser.c,v 1.19 2003/12/09 08:10:25 nilsson Exp $
|
e576bb | 2002-10-11 | Martin Nilsson | | */
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | #include "global.h"
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #include "stralloc.h"
#include "global.h"
|
128a45 | 2003-12-09 | Martin Nilsson | | RCSID("$Id: parser.c,v 1.19 2003/12/09 08:10:25 nilsson Exp $");
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #include "pike_macros.h"
#include "interpret.h"
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | #include "program.h"
|
6c4a1a | 1999-12-30 | Martin Stjernholm | | #include "program_id.h"
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #include "object.h"
#include "operators.h"
|
51ef5c | 2002-10-21 | Marcus Comstedt | | #include "module.h"
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | |
#include "parser.h"
|
6dc277 | 2000-07-28 | Fredrik Hübinette (Hubbe) | |
|
531c17 | 2002-05-11 | Martin Nilsson | | #define sp Pike_sp
#define fp Pike_fp
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #define PARSER_INITER
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | |
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | |
|
6c4a1a | 1999-12-30 | Martin Stjernholm | | #define PARSER_CLASS(name,init,exit,prog,id) \
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | void init(void); void exit(void); struct program *prog;
#define PARSER_SUBMODULE(name,init,exit) \
void init(void); void exit(void);
#define PARSER_SUBMODMAG(name,init,exit) \
void init(void); void exit(void);
#define PARSER_FUNCTION(name,func,def0,def1) \
void func(INT32 args);
#include "initstuff.h"
static struct
{
char *name;
void (*init)(void);
void (*exit)(void);
struct program **dest;
|
6c4a1a | 1999-12-30 | Martin Stjernholm | | int id;
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | } initclass[]=
{
#undef PARSER_CLASS
#undef PARSER_SUBMODULE
#undef PARSER_FUNCTION
#undef PARSER_SUBMODMAG
#define PARSER_SUBMODMAG(a,b,c)
#define PARSER_FUNCTION(a,b,c,d)
|
6c4a1a | 1999-12-30 | Martin Stjernholm | | #define PARSER_CLASS(name,init,exit,prog,id) { name,init,exit,&prog,id },
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #define PARSER_SUBMODULE(a,b,c)
#include "initstuff.h"
};
static struct
{
char *name;
void (*init)(void);
void (*exit)(void);
} initsubmodule[]=
{
#undef PARSER_CLASS
#undef PARSER_SUBMODULE
|
6c4a1a | 1999-12-30 | Martin Stjernholm | | #define PARSER_CLASS(name,init,exit,prog,id)
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #define PARSER_SUBMODULE(name,init,exit) { name,init,exit },
#include "initstuff.h"
|
07228a | 1999-06-19 | Fredrik Hübinette (Hubbe) | | {0,0,0 }
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | };
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | |
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | static struct
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | {
char *name;
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | void (*init)(void);
void (*exit)(void);
struct pike_string *ps;
struct object *o;
} submagic[]=
{
#undef PARSER_SUBMODULE
#undef PARSER_SUBMODMAG
#define PARSER_SUBMODULE(a,b,c)
#define PARSER_SUBMODMAG(name,init,exit) { name,init,exit,NULL,NULL },
#include "initstuff.h"
|
07228a | 1999-06-19 | Fredrik Hübinette (Hubbe) | | { 0,0,0,0,0 }
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | };
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #ifdef PIKE_DEBUG
|
125e52 | 2000-08-16 | Henrik Grubbström (Grubba) | | #define PARSER_CHECK_STACK(X) do { \
if (save_sp != sp) { \
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("%s:%d: %ld droppings on stack! previous init: %s\n", \
|
125e52 | 2000-08-16 | Henrik Grubbström (Grubba) | | __FILE__, __LINE__, \
|
6f9590 | 2000-08-17 | Henrik Grubbström (Grubba) | | PTRDIFF_T_TO_LONG(sp - save_sp), X); \
|
125e52 | 2000-08-16 | Henrik Grubbström (Grubba) | | } \
} while(0)
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #else
#define PARSER_CHECK_STACK(X)
#endif /* PIKE_DEBUG */
static void parser_magic_index(INT32 args)
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | {
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | int i;
if (args!=1)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Parser.`[]: Too few or too many arguments\n");
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | if (sp[-1].type!=T_STRING)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Parser.`[]: Illegal type of argument\n");
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | |
|
07228a | 1999-06-19 | Fredrik Hübinette (Hubbe) | | for (i=0; i<(int)NELEM(submagic)-1; i++)
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | if (sp[-1].u.string==submagic[i].ps)
{
#ifdef PIKE_DEBUG
struct svalue *save_sp;
#endif
pop_stack();
#ifdef PIKE_DEBUG
save_sp = sp;
#endif
if (!submagic[i].o)
{
struct program *p;
start_new_program();
(submagic[i].init)();
PARSER_CHECK_STACK(submagic[i].name);
p=end_program();
submagic[i].o=clone_object(p,0);
free_program(p);
}
ref_push_object(submagic[i].o);
return;
}
stack_dup();
ref_push_object(fp->current_object);
stack_swap();
f_arrow(2);
if (sp[-1].type==T_INT)
{
pop_stack();
stack_dup();
|
128a45 | 2003-12-09 | Martin Nilsson | | push_constant_text("_Parser_");
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | stack_swap();
f_add(2);
|
da1bd1 | 2003-12-01 | Martin Nilsson | | SAFE_APPLY_MASTER("resolv",1);
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | }
if (sp[-1].type==T_INT)
{
pop_stack();
stack_dup();
|
128a45 | 2003-12-09 | Martin Nilsson | | push_constant_text("_Parser");
|
da1bd1 | 2003-12-01 | Martin Nilsson | | SAFE_APPLY_MASTER("resolv",1);
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | stack_swap();
|
52c579 | 2000-05-23 | Fredrik Hübinette (Hubbe) | | if(sp[-2].type == T_INT)
{
pop_stack();
}else{
f_index(2);
}
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | }
stack_swap();
pop_stack();
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | }
|
51ef5c | 2002-10-21 | Marcus Comstedt | | PIKE_MODULE_INIT
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | {
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #ifdef PIKE_DEBUG
struct svalue *save_sp = sp;
#endif
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | int i;
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | for (i=0; i<(int)NELEM(initclass); i++)
{
start_new_program();
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if (initclass[i].id) Pike_compiler->new_program->id = initclass[i].id;
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | |
#ifdef DEBUG
fprintf(stderr,"Parser: initiating class \"Parser.%s\"...\n",
initclass[i].name);
#endif
(initclass[i].init)();
PARSER_CHECK_STACK(initclass[i].name);
initclass[i].dest[0]=end_program();
add_program_constant(initclass[i].name,initclass[i].dest[0],0);
}
|
07228a | 1999-06-19 | Fredrik Hübinette (Hubbe) | | for (i=0; i<(int)NELEM(initsubmodule)-1; i++)
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | {
struct program *p;
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | struct pike_string *s;
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | |
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | #ifdef DEBUG
fprintf(stderr,"Parser: initiating submodule \"Parser.%s\"...\n",
initsubmodule[i].name);
#endif
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | start_new_program();
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | (initsubmodule[i].init)();
PARSER_CHECK_STACK(initsubmodule[i].name);
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | p=end_program();
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | push_object(clone_object(p,0));
s=make_shared_string(initsubmodule[i].name);
add_constant(s,sp-1,0);
free_string(s);
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | free_program(p);
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | pop_stack();
}
|
07228a | 1999-06-19 | Fredrik Hübinette (Hubbe) | | for (i=0; i<(int)NELEM(submagic)-1; i++)
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | submagic[i].ps=make_shared_string(submagic[i].name);
#undef PARSER_FUNCTION
#define PARSER_FUNCTION(name,func,def0,def1) ADD_FUNCTION(name,func,def0,def1);
#include "initstuff.h"
ADD_FUNCTION("`[]",parser_magic_index,
tFunc(tString,tMixed),0);
}
|
51ef5c | 2002-10-21 | Marcus Comstedt | | PIKE_MODULE_EXIT
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | {
int i;
for (i=0; i<(int)NELEM(initclass); i++)
{
(initclass[i].exit)();
free_program(initclass[i].dest[0]);
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | }
|
07228a | 1999-06-19 | Fredrik Hübinette (Hubbe) | | for (i=0; i<(int)NELEM(initsubmodule)-1; i++)
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | (initsubmodule[i].exit)();
|
07228a | 1999-06-19 | Fredrik Hübinette (Hubbe) | | for (i=0; i<(int)NELEM(submagic)-1; i++)
|
7068e3 | 1999-06-12 | Mirar (Pontus Hagland) | | if (submagic[i].o)
{
(submagic[i].exit)();
free_object(submagic[i].o);
}
|
0533e2 | 1999-02-19 | Mirar (Pontus Hagland) | | }
|