summaryrefslogtreecommitdiff
path: root/src/runtime/python
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/python')
-rw-r--r--src/runtime/python/pypgf.c197
1 files changed, 72 insertions, 125 deletions
diff --git a/src/runtime/python/pypgf.c b/src/runtime/python/pypgf.c
index e3cc404b5..056cdc924 100644
--- a/src/runtime/python/pypgf.c
+++ b/src/runtime/python/pypgf.c
@@ -12,31 +12,6 @@ static PyObject* PGFError;
static PyObject* ParseError;
-static PyObject*
-gu2py_string(GuString s) {
- GuWord w = s.w_;
- uint8_t buf[sizeof(GuWord)];
-
- char* src;
- size_t len;
- if (w & 1) {
- len = (w & 0xff) >> 1;
- gu_assert(len <= sizeof(GuWord));
- size_t i = len;
- while (i > 0) {
- w >>= 8;
- buf[--i] = w & 0xff;
- }
- src = (char*) buf;
- } else {
- uint8_t* p = (void*) w;
- len = (p[0] == 0) ? ((size_t*) p)[-1] : p[0];
- src = (char*) &p[1];
- }
-
- return PyString_FromStringAndSize(src, len);
-}
-
typedef struct {
PyObject_HEAD
GuPool* pool;
@@ -129,7 +104,7 @@ Expr_repr(ExprObject *self)
pgf_print_expr(self->expr, NULL, 0, out, err);
GuString str = gu_string_buf_freeze(sbuf, tmp_pool);
- PyObject* pystr = gu2py_string(str);
+ PyObject* pystr = PyString_FromString(str);
gu_pool_free(tmp_pool);
return pystr;
@@ -258,11 +233,13 @@ Expr_initLiteral(ExprObject *self, PyObject *lit)
e->lit = gu_null_variant;
if (PyString_Check(lit)) {
+ GuString s = PyString_AsString(lit);
PgfLiteralStr* slit =
- gu_new_variant(PGF_LITERAL_STR,
- PgfLiteralStr,
- &e->lit, self->pool);
- slit->val = gu_str_string(PyString_AsString(lit), self->pool);
+ gu_new_flex_variant(PGF_LITERAL_STR,
+ PgfLiteralStr,
+ val, strlen(s)+1,
+ &e->lit, self->pool);
+ strcpy(slit->val, s);
} else if (PyInt_Check(lit)) {
PgfLiteralInt* ilit =
gu_new_variant(PGF_LITERAL_INT,
@@ -293,10 +270,11 @@ Expr_initApp(ExprObject *self, const char* fname, PyObject *args)
self->pool = gu_new_pool();
PgfExprFun* e =
- gu_new_variant(PGF_EXPR_FUN,
- PgfExprFun,
- &self->expr, self->pool);
- e->fun = gu_str_string(fname, self->pool);
+ gu_new_flex_variant(PGF_EXPR_FUN,
+ PgfExprFun,
+ fun, strlen(fname)+1,
+ &self->expr, self->pool);
+ strcpy(e->fun, fname);
for (Py_ssize_t i = 0; i < n_args; i++) {
PyObject* obj = PyList_GetItem(args, i);
@@ -345,7 +323,7 @@ Expr_unpack(ExprObject* self, PyObject *fargs)
PyObject* py_bindtype =
(eabs->bind_type == PGF_BIND_TYPE_EXPLICIT) ? Py_True
: Py_False;
- PyObject* py_var = gu2py_string(eabs->id);
+ PyObject* py_var = PyString_FromString(eabs->id);
PyObject* res =
Py_BuildValue("OOOO", py_bindtype, py_var, py_body, args);
Py_DECREF(py_var);
@@ -383,7 +361,7 @@ Expr_unpack(ExprObject* self, PyObject *fargs)
switch (i.tag) {
case PGF_LITERAL_STR: {
PgfLiteralStr* lstr = i.data;
- return gu2py_string(lstr->val);
+ return PyString_FromString(lstr->val);
}
case PGF_LITERAL_INT: {
PgfLiteralInt* lint = i.data;
@@ -405,7 +383,7 @@ Expr_unpack(ExprObject* self, PyObject *fargs)
}
case PGF_EXPR_FUN: {
PgfExprFun* efun = i.data;
- PyObject* fun = gu2py_string(efun->fun);
+ PyObject* fun = PyString_FromString(efun->fun);
PyObject* res = Py_BuildValue("OO", fun, args);
Py_DECREF(fun);
Py_DECREF(args);
@@ -482,7 +460,7 @@ redo:;
}
case PGF_LITERAL_STR: {
PgfLiteralStr* lstr = i.data;
- return gu2py_string(lstr->val);
+ return PyString_FromString(lstr->val);
}
}
}
@@ -497,7 +475,7 @@ redo:;
case PGF_EXPR_FUN: {
PgfExprFun* efun = i.data;
if (strcmp(name, "name") == 0) {
- return gu2py_string(efun->fun);
+ return PyString_FromString(efun->fun);
}
break;
}
@@ -604,7 +582,7 @@ Type_init(TypeObject *self, PyObject *args, PyObject *kwds)
if (obj->ob_type == &pgf_TypeType) {
py_bindtype = Py_True;
- cid = gu_str_string("_", self->pool);
+ cid = "_";
py_type = obj;
} else {
if (!PyTuple_Check(obj) ||
@@ -624,7 +602,7 @@ Type_init(TypeObject *self, PyObject *args, PyObject *kwds)
PyErr_SetString(PyExc_TypeError, "the arguments in the first list must be triples of (boolean,string,pgf.Type)");
return -1;
}
- cid = gu_str_string(PyString_AsString(py_var), self->pool);
+ cid = gu_string_copy(PyString_AsString(py_var), self->pool);
py_type = PyTuple_GetItem(obj, 2);
if (py_type->ob_type != &pgf_TypeType) {
@@ -644,7 +622,7 @@ Type_init(TypeObject *self, PyObject *args, PyObject *kwds)
Py_INCREF(py_type);
}
- self->type->cid = gu_str_string(catname_s, self->pool);
+ self->type->cid = gu_string_copy(catname_s, self->pool);
self->type->n_exprs = n_exprs;
for (Py_ssize_t i = 0; i < n_exprs; i++) {
@@ -675,7 +653,7 @@ Type_repr(TypeObject *self)
pgf_print_type(self->type, NULL, 0, out, err);
GuString str = gu_string_buf_freeze(sbuf, tmp_pool);
- PyObject* pystr = gu2py_string(str);
+ PyObject* pystr = PyString_FromString(str);
gu_pool_free(tmp_pool);
return pystr;
@@ -713,7 +691,7 @@ Type_getHypos(TypeObject *self, void *closure)
(hypo->bind_type == PGF_BIND_TYPE_EXPLICIT) ? Py_True
: Py_False;
- PyObject* py_var = gu2py_string(hypo->cid);
+ PyObject* py_var = PyString_FromString(hypo->cid);
if (py_var == NULL)
goto fail;
@@ -752,7 +730,7 @@ fail:
static PyObject*
Type_getCat(TypeObject *self, void *closure)
{
- return gu2py_string(self->type->cid);
+ return PyString_FromString(self->type->cid);
}
static PyObject*
@@ -920,8 +898,8 @@ Iter_fetch_token(IterObject* self)
if (tp == NULL)
return NULL;
- PyObject* py_tok = gu2py_string(tp->tok);
- PyObject* py_cat = gu2py_string(tp->cat);
+ PyObject* py_tok = PyString_FromString(tp->tok);
+ PyObject* py_cat = PyString_FromString(tp->cat);
PyObject* res = Py_BuildValue("(f,O,O)", tp->prob, py_tok, py_cat);
Py_DECREF(py_tok);
@@ -1061,16 +1039,11 @@ Concr_init(ConcrObject *self, PyObject *args, PyObject *kwds)
static PyObject*
Concr_printName(ConcrObject* self, PyObject *args)
{
- const char *name_s;
- if (!PyArg_ParseTuple(args, "s", &name_s))
+ GuString name;
+ if (!PyArg_ParseTuple(args, "s", &name))
return NULL;
- GuPool *tmp_pool = gu_local_pool();
- GuString name = gu_str_string(name_s, tmp_pool);
- PyObject* pyname = gu2py_string(pgf_print_name(self->concr, name));
- gu_pool_free(tmp_pool);
-
- return pyname;
+ return PyString_FromString(pgf_print_name(self->concr, name));
}
typedef struct {
@@ -1085,7 +1058,7 @@ static PgfToken
pypgf_python_lexer_read_token(PgfLexer *base, GuExn* err)
{
PgfPythonLexer* lexer = (PgfPythonLexer*) base;
- lexer->base.tok = gu_empty_string;
+ lexer->base.tok = "";
PyObject* item = PyIter_Next(lexer->pylexer);
if (item == NULL)
@@ -1098,7 +1071,7 @@ pypgf_python_lexer_read_token(PgfLexer *base, GuExn* err)
if (str == NULL)
gu_raise(err, PyPgfLexerExn);
else
- lexer->base.tok = gu_str_string(str, lexer->pool);
+ lexer->base.tok = gu_string_copy(str, lexer->pool);
}
return lexer->base.tok;
@@ -1109,7 +1082,7 @@ pypgf_new_python_lexer(PyObject* pylexer, GuPool* pool)
{
PgfPythonLexer* lexer = gu_new(PgfPythonLexer, pool);
lexer->base.read_token = pypgf_python_lexer_read_token;
- lexer->base.tok = gu_empty_string;
+ lexer->base.tok = "";
lexer->pylexer = pylexer;
lexer->pool = pool;
return ((PgfLexer*) lexer);
@@ -1146,11 +1119,11 @@ Concr_parse(ConcrObject* self, PyObject *args, PyObject *keywds)
int len;
const uint8_t *buf = NULL;
PyObject* py_lexer = NULL;
- const char *catname_s = NULL;
+ PgfCId catname = pgf_start_cat(self->grammar->pgf);
int max_count = -1;
double heuristics = -1;
if (!PyArg_ParseTupleAndKeywords(args, keywds, "|s#Osid", kwlist,
- &buf, &len, &py_lexer, &catname_s, &max_count, &heuristics))
+ &buf, &len, &py_lexer, &catname, &max_count, &heuristics))
return NULL;
if ((buf == NULL && py_lexer == NULL) ||
@@ -1187,10 +1160,6 @@ Concr_parse(ConcrObject* self, PyObject *args, PyObject *keywds)
pyres->counter = 0;
pyres->fetch = Iter_fetch_expr;
- GuString catname =
- (catname_s == NULL) ? pgf_start_cat(self->grammar->pgf, pyres->pool)
- : gu_str_string(catname_s, pyres->pool);
-
PgfLexer *lexer = NULL;
if (buf != NULL) {
GuIn* in = gu_data_in(buf, len, pyres->pool);
@@ -1208,10 +1177,10 @@ Concr_parse(ConcrObject* self, PyObject *args, PyObject *keywds)
PgfToken tok =
pgf_lexer_current_token(lexer);
- if (gu_string_eq(tok, gu_empty_string))
+ if (*tok == 0)
PyErr_SetString(PGFError, "The sentence cannot be parsed");
else {
- PyObject* py_tok = gu2py_string(tok);
+ PyObject* py_tok = PyString_FromString(tok);
PyObject_SetAttrString(ParseError, "token", py_tok);
PyErr_Format(ParseError, "Unexpected token: \"%s\"",
PyString_AsString(py_tok));
@@ -1236,12 +1205,12 @@ Concr_complete(ConcrObject* self, PyObject *args, PyObject *keywds)
int len;
const uint8_t *buf = NULL;
PyObject* py_lexer = NULL;
- const char *catname_s = NULL;
- const char *prefix_s = NULL;
+ GuString catname = pgf_start_cat(self->grammar->pgf);
+ GuString prefix = "";
int max_count = -1;
if (!PyArg_ParseTupleAndKeywords(args, keywds, "|s#Ossi", kwlist,
- &buf, &len, &py_lexer, &catname_s,
- &prefix_s, &max_count))
+ &buf, &len, &py_lexer, &catname,
+ &prefix, &max_count))
return NULL;
if ((buf == NULL && py_lexer == NULL) ||
@@ -1276,14 +1245,6 @@ Concr_complete(ConcrObject* self, PyObject *args, PyObject *keywds)
GuPool *tmp_pool = gu_local_pool();
- GuString catname =
- (catname_s == NULL) ? pgf_start_cat(self->grammar->pgf, tmp_pool)
- : gu_str_string(catname_s, tmp_pool);
-
- GuString prefix =
- (prefix_s == NULL) ? gu_empty_string
- : gu_str_string(prefix_s, pyres->pool);
-
PgfLexer *lexer = NULL;
if (buf != NULL) {
GuIn* in = gu_data_in(buf, len, tmp_pool);
@@ -1303,10 +1264,10 @@ Concr_complete(ConcrObject* self, PyObject *args, PyObject *keywds)
PgfToken tok =
pgf_lexer_current_token(lexer);
- if (gu_string_eq(tok, gu_empty_string))
+ if (*tok == 0)
PyErr_SetString(PGFError, "The sentence cannot be parsed");
else {
- PyObject* py_tok = gu2py_string(tok);
+ PyObject* py_tok = PyString_FromString(tok);
PyObject_SetAttrString(ParseError, "token", py_tok);
PyErr_Format(ParseError, "Unexpected token: \"%s\"",
PyString_AsString(py_tok));
@@ -1323,14 +1284,12 @@ Concr_complete(ConcrObject* self, PyObject *args, PyObject *keywds)
static PyObject*
Concr_parseval(ConcrObject* self, PyObject *args) {
ExprObject* pyexpr = NULL;
- const char* s_cat = NULL;
- if (!PyArg_ParseTuple(args, "O!s", &pgf_ExprType, &pyexpr, &s_cat))
+ PgfCId cat = "";
+ if (!PyArg_ParseTuple(args, "O!s", &pgf_ExprType, &pyexpr, &cat))
return NULL;
GuPool* tmp_pool = gu_local_pool();
- PgfCId cat = gu_str_string(s_cat, tmp_pool);
-
double precision = 0;
double recall = 0;
double exact = 0;
@@ -1387,7 +1346,7 @@ Concr_linearize(ConcrObject* self, PyObject *args)
}
GuString str = gu_string_buf_freeze(sbuf, tmp_pool);
- PyObject* pystr = gu2py_string(str);
+ PyObject* pystr = PyString_FromString(str);
gu_pool_free(tmp_pool);
return pystr;
@@ -1526,7 +1485,7 @@ pgf_bracket_lzn_symbol_token(PgfLinFuncs** funcs, PgfToken tok)
{
PgfBracketLznState* state = gu_container(funcs, PgfBracketLznState, funcs);
- PyObject* str = gu2py_string(tok);
+ PyObject* str = PyString_FromString(tok);
PyList_Append(state->list, str);
Py_DECREF(str);
}
@@ -1540,7 +1499,7 @@ pgf_bracket_lzn_expr_literal(PgfLinFuncs** funcs, PgfLiteral lit)
switch (i.tag) {
case PGF_LITERAL_STR: {
PgfLiteralStr* lstr = i.data;
- PyObject* str = gu2py_string(lstr->val);
+ PyObject* str = PyString_FromString(lstr->val);
PyList_Append(state->list, str);
Py_DECREF(str);
break;
@@ -1584,10 +1543,10 @@ pgf_bracket_lzn_end_phrase(PgfLinFuncs** funcs, PgfCId cat, int fid, int lindex,
BracketObject* bracket = (BracketObject *)
pgf_BracketType.tp_alloc(&pgf_BracketType, 0);
if (bracket != NULL) {
- bracket->cat = gu2py_string(cat);
+ bracket->cat = PyString_FromString(cat);
bracket->fid = fid;
bracket->lindex = lindex;
- bracket->fun = gu2py_string(fun);
+ bracket->fun = PyString_FromString(fun);
bracket->children = state->list;
PyList_Append(parent, (PyObject*) bracket);
Py_DECREF(bracket);
@@ -1652,13 +1611,13 @@ Concr_bracketedLinearize(ConcrObject* self, PyObject *args)
static PyObject*
Concr_getName(ConcrObject *self, void *closure)
{
- return gu2py_string(pgf_concrete_name(self->concr));
+ return PyString_FromString(pgf_concrete_name(self->concr));
}
static PyObject*
Concr_getLanguageCode(ConcrObject *self, void *closure)
{
- return gu2py_string(pgf_language_code(self->concr));
+ return PyString_FromString(pgf_language_code(self->concr));
}
static PyObject*
@@ -1679,7 +1638,7 @@ Concr_graphvizParseTree(ConcrObject* self, PyObject *args) {
}
GuString str = gu_string_buf_freeze(sbuf, tmp_pool);
- PyObject* pystr = gu2py_string(str);
+ PyObject* pystr = PyString_FromString(str);
gu_pool_free(tmp_pool);
return pystr;
@@ -1697,8 +1656,8 @@ pypgf_collect_morpho(PgfMorphoCallback* self,
{
PyMorphoCallback* callback = (PyMorphoCallback*) self;
- PyObject* py_lemma = gu2py_string(lemma);
- PyObject* py_analysis = gu2py_string(analysis);
+ PyObject* py_lemma = PyString_FromString(lemma);
+ PyObject* py_analysis = PyString_FromString(analysis);
PyObject* res =
Py_BuildValue("OOf", py_lemma, py_analysis, prob);
@@ -1780,7 +1739,7 @@ Iter_fetch_fullform(IterObject* self)
GuString tokens =
pgf_fullform_get_string(entry);
- py_tokens = gu2py_string(tokens);
+ py_tokens = PyString_FromString(tokens);
if (py_tokens == NULL)
goto done;
@@ -1936,7 +1895,7 @@ PGF_dealloc(PGFObject* self)
static PyObject*
PGF_getAbstractName(PGFObject *self, void *closure)
{
- return gu2py_string(pgf_abstract_name(self->pgf));
+ return PyString_FromString(pgf_abstract_name(self->pgf));
}
typedef struct {
@@ -1948,14 +1907,14 @@ typedef struct {
static void
pgf_collect_langs(GuMapItor* fn, const void* key, void* value, GuExn* err)
{
- PgfCId name = *((PgfCId*) key);
+ PgfCId name = (PgfCId) key;
PgfConcr* concr = *((PgfConcr**) value);
PyPGFClosure* clo = (PyPGFClosure*) fn;
PyObject* py_name = NULL;
PyObject* py_lang = NULL;
- py_name = gu2py_string(name);
+ py_name = PyString_FromString(name);
if (py_name == NULL) {
gu_raise(err, PgfExn);
goto end;
@@ -2012,12 +1971,12 @@ PGF_getLanguages(PGFObject *self, void *closure)
static void
pgf_collect_cats(GuMapItor* fn, const void* key, void* value, GuExn* err)
{
- PgfCId name = *((PgfCId*) key);
+ PgfCId name = (PgfCId) key;
PyPGFClosure* clo = (PyPGFClosure*) fn;
PyObject* py_name = NULL;
- py_name = gu2py_string(name);
+ py_name = PyString_FromString(name);
if (py_name == NULL) {
gu_raise(err, PgfExn);
goto end;
@@ -2059,21 +2018,18 @@ PGF_getCategories(PGFObject *self, void *closure)
static PyObject*
PGF_getStartCat(PGFObject *self, void *closure)
{
- GuPool* tmp_pool = gu_local_pool();
- PyObject* pyname = gu2py_string(pgf_start_cat(self->pgf, tmp_pool));
- gu_pool_free(tmp_pool);
- return pyname;
+ return PyString_FromString(pgf_start_cat(self->pgf));
}
static void
pgf_collect_funs(GuMapItor* fn, const void* key, void* value, GuExn* err)
{
- PgfCId name = *((PgfCId*) key);
+ PgfCId name = (PgfCId) key;
PyPGFClosure* clo = (PyPGFClosure*) fn;
PyObject* py_name = NULL;
- py_name = gu2py_string(name);
+ py_name = PyString_FromString(name);
if (py_name == NULL) {
gu_raise(err, PgfExn);
goto end;
@@ -2115,19 +2071,17 @@ PGF_getFunctions(PGFObject *self, void *closure)
static PyObject*
PGF_functionsByCat(PGFObject* self, PyObject *args)
{
- const char *catname_s;
- if (!PyArg_ParseTuple(args, "s", &catname_s))
+ PgfCId catname;
+ if (!PyArg_ParseTuple(args, "s", &catname))
return NULL;
- GuPool *tmp_pool = gu_local_pool();
- GuString catname = gu_str_string(catname_s, tmp_pool);
-
PyObject* functions = PyList_New(0);
if (functions == NULL) {
- gu_pool_free(tmp_pool);
return NULL;
}
+ GuPool *tmp_pool = gu_local_pool();
+
// Create an exception frame that catches all errors.
GuExn* err = gu_new_exn(NULL, gu_kind(type), tmp_pool);
@@ -2146,20 +2100,14 @@ PGF_functionsByCat(PGFObject* self, PyObject *args)
static TypeObject*
PGF_functionType(PGFObject* self, PyObject *args)
{
- const char *funname_s;
- if (!PyArg_ParseTuple(args, "s", &funname_s))
+ PgfCId funname;
+ if (!PyArg_ParseTuple(args, "s", &funname))
return NULL;
- GuPool *tmp_pool = gu_local_pool();
- GuString funname = gu_str_string(funname_s, tmp_pool);
-
PgfType* type =
pgf_function_type(self->pgf, funname);
-
- gu_pool_free(tmp_pool);
-
if (type == NULL) {
- PyErr_Format(PyExc_KeyError, "Function '%s' is not defined", funname_s);
+ PyErr_Format(PyExc_KeyError, "Function '%s' is not defined", funname);
return NULL;
}
@@ -2179,10 +2127,10 @@ PGF_generateAll(PGFObject* self, PyObject *args, PyObject *keywds)
{
static char *kwlist[] = {"cat", "n", NULL};
- const char *catname_s;
+ PgfCId catname;
int max_count = -1;
if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|i", kwlist,
- &catname_s, &max_count))
+ &catname, &max_count))
return NULL;
IterObject* pyres = (IterObject*)
@@ -2201,7 +2149,6 @@ PGF_generateAll(PGFObject* self, PyObject *args, PyObject *keywds)
pyres->container = (PyObject*) pyres;
GuPool *tmp_pool = gu_local_pool();
- GuString catname = gu_str_string(catname_s, tmp_pool);
pyres->res =
pgf_generate_all(self->pgf, catname, pyres->pool);
@@ -2245,7 +2192,7 @@ PGF_graphvizAbstractTree(PGFObject* self, PyObject *args) {
}
GuString str = gu_string_buf_freeze(sbuf, tmp_pool);
- PyObject* pystr = gu2py_string(str);
+ PyObject* pystr = PyString_FromString(str);
gu_pool_free(tmp_pool);
return pystr;