* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
parser. * mappingobject.c (lookmapping): 'freeslot' was never used due to a bug in the code.
This commit is contained in:
parent
a3d78fb268
commit
52f2c05401
|
@ -296,6 +296,9 @@ extern void initHTML();
|
||||||
#ifdef USE_XLIB
|
#ifdef USE_XLIB
|
||||||
extern void initXlib();
|
extern void initXlib();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef USE_PARSER
|
||||||
|
extern void initparser();
|
||||||
|
#endif
|
||||||
/* -- ADDMODULE MARKER 1 -- */
|
/* -- ADDMODULE MARKER 1 -- */
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
@ -475,6 +478,10 @@ struct {
|
||||||
{"Xlib", initXlib},
|
{"Xlib", initXlib},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_PARSER
|
||||||
|
{"parser", initparser},
|
||||||
|
#endif
|
||||||
|
|
||||||
/* -- ADDMODULE MARKER 2 -- */
|
/* -- ADDMODULE MARKER 2 -- */
|
||||||
|
|
||||||
{0, 0} /* Sentinel */
|
{0, 0} /* Sentinel */
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
/***********************************************************
|
||||||
|
Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
|
||||||
|
Amsterdam, The Netherlands.
|
||||||
|
|
||||||
|
All Rights Reserved
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software and its
|
||||||
|
documentation for any purpose and without fee is hereby granted,
|
||||||
|
provided that the above copyright notice appear in all copies and that
|
||||||
|
both that copyright notice and this permission notice appear in
|
||||||
|
supporting documentation, and that the names of Stichting Mathematisch
|
||||||
|
Centrum or CWI not be used in advertising or publicity pertaining to
|
||||||
|
distribution of the software without specific, written prior permission.
|
||||||
|
|
||||||
|
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||||
|
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
|
||||||
|
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
******************************************************************/
|
||||||
|
|
||||||
|
#include "allobjects.h"
|
||||||
|
#include "node.h"
|
||||||
|
#include "token.h"
|
||||||
|
#include "pythonrun.h"
|
||||||
|
#include "graminit.h"
|
||||||
|
#include "errcode.h"
|
||||||
|
|
||||||
|
object *
|
||||||
|
node2tuple(n)
|
||||||
|
node *n;
|
||||||
|
{
|
||||||
|
if (n == NULL) {
|
||||||
|
INCREF(None);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
if (ISNONTERMINAL(TYPE(n))) {
|
||||||
|
int i;
|
||||||
|
object *v, *w;
|
||||||
|
v = newtupleobject(1 + NCH(n));
|
||||||
|
if (v == NULL)
|
||||||
|
return v;
|
||||||
|
w = newintobject(TYPE(n));
|
||||||
|
if (w == NULL) {
|
||||||
|
DECREF(v);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
settupleitem(v, 0, w);
|
||||||
|
for (i = 0; i < NCH(n); i++) {
|
||||||
|
w = node2tuple(CHILD(n, i));
|
||||||
|
if (w == NULL) {
|
||||||
|
DECREF(v);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
settupleitem(v, i+1, w);
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
else if (ISTERMINAL(TYPE(n))) {
|
||||||
|
return mkvalue("(is)", TYPE(n), STR(n));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
err_setstr(SystemError, "unrecognized parse tree node type");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static object *
|
||||||
|
parser_parsefile(self, args)
|
||||||
|
object *self;
|
||||||
|
object *args;
|
||||||
|
{
|
||||||
|
char *filename;
|
||||||
|
FILE *fp;
|
||||||
|
node *n = NULL;
|
||||||
|
int err;
|
||||||
|
object *res;
|
||||||
|
if (!getargs(args, "s", &filename))
|
||||||
|
return NULL;
|
||||||
|
fp = fopen(filename, "r");
|
||||||
|
if (fp == NULL) {
|
||||||
|
err_errno(IOError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
err = parse_file(fp, filename, file_input, &n);
|
||||||
|
fclose(fp);
|
||||||
|
if (err != E_DONE) {
|
||||||
|
err_input(err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
res = node2tuple(n);
|
||||||
|
freetree(n);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct methodlist parser_methods[] = {
|
||||||
|
{"parsefile", parser_parsefile},
|
||||||
|
{0, 0} /* Sentinel */
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
initparser()
|
||||||
|
{
|
||||||
|
initmodule("parser", parser_methods);
|
||||||
|
}
|
|
@ -147,7 +147,7 @@ lookmapping(mp, key, hash)
|
||||||
return ep;
|
return ep;
|
||||||
}
|
}
|
||||||
if (ep->me_key == dummy) {
|
if (ep->me_key == dummy) {
|
||||||
if (freeslot != NULL)
|
if (freeslot == NULL)
|
||||||
freeslot = ep;
|
freeslot = ep;
|
||||||
}
|
}
|
||||||
else if (ep->me_hash == hash &&
|
else if (ep->me_hash == hash &&
|
||||||
|
|
|
@ -147,7 +147,7 @@ lookmapping(mp, key, hash)
|
||||||
return ep;
|
return ep;
|
||||||
}
|
}
|
||||||
if (ep->me_key == dummy) {
|
if (ep->me_key == dummy) {
|
||||||
if (freeslot != NULL)
|
if (freeslot == NULL)
|
||||||
freeslot = ep;
|
freeslot = ep;
|
||||||
}
|
}
|
||||||
else if (ep->me_hash == hash &&
|
else if (ep->me_hash == hash &&
|
||||||
|
|
Loading…
Reference in New Issue