[BACK]Return to ox_python.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_python

Diff for /OpenXM/src/ox_python/ox_python.c between version 1.4 and 1.6

version 1.4, 2019/03/22 00:14:50 version 1.6, 2022/01/02 00:23:25
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/ox_python/ox_python.c,v 1.3 2018/09/08 05:04:34 takayama Exp $  /* $OpenXM: OpenXM/src/ox_python/ox_python.c,v 1.5 2021/12/31 07:43:48 takayama Exp $
 */  */
   
 #include <stdio.h>  #include <stdio.h>
Line 152  cmo *make_error2(const char *reason,const char *fname,
Line 152  cmo *make_error2(const char *reason,const char *fname,
     cmo **argv;      cmo **argv;
     int n;      int n;
     char *s;      char *s;
       char s_tmp[256];
       s = s_tmp;
     n = 5;      n = 5;
     argv = (cmo **) GC_malloc(sizeof(cmo *)*n);      argv = (cmo **) GC_malloc(sizeof(cmo *)*n);
     ms = (cmo *)new_cmo_string("Error"); argv[0] = ms;      ms = (cmo *)new_cmo_string("error"); argv[0] = ms;
     if (reason != NULL) {s = (char *)GC_malloc(strlen(reason)+1); strcpy(s,reason);      if (reason != NULL) {s = (char *)GC_malloc(strlen(reason)+3);
     }else strcpy(s,"");        strcpy(s,"\"");strcat(s,reason);strcat(s,"\"");
       }else strcpy(s,"0");
     ms = (cmo *) new_cmo_string(s); argv[1] = ms;      ms = (cmo *) new_cmo_string(s); argv[1] = ms;
     if (fname != NULL) {s = (char *)GC_malloc(strlen(fname)+1); strcpy(s,fname);      if (fname != NULL) {s = (char *)GC_malloc(strlen(fname)+3);
     }else strcpy(s,"");        strcpy(s,"\"");strcat(s,fname);strcat(s,"\"");
       }else strcpy(s,"0");
     ms = (cmo *) new_cmo_string(s); argv[2] = ms;      ms = (cmo *) new_cmo_string(s); argv[2] = ms;
     err = (cmo *)new_cmo_int32(line); argv[3] = err;      err = (cmo *)new_cmo_int32(line); argv[3] = err;
     err = (cmo *)new_cmo_int32(code); argv[4] = err;      err = (cmo *)new_cmo_int32(code); argv[4] = err;
Line 477  void push_error_from_file() {
Line 481  void push_error_from_file() {
   FILE *fp;    FILE *fp;
 #define BUF_SIZE 1024  #define BUF_SIZE 1024
   char logname[BUF_SIZE];    char logname[BUF_SIZE];
   char cmd[BUF_SIZE];    char cmd[BUF_SIZE+256];
   char file[BUF_SIZE];    char file[BUF_SIZE];
   char reason[BUF_SIZE];    char reason[BUF_SIZE];
   int gsl_errno, line;    int gsl_errno, line;
Line 526  int main(int argc,char *argv[])
Line 530  int main(int argc,char *argv[])
 #endif  #endif
   
     /* Initialize python */      /* Initialize python */
     Py_SetProgramName(argv[0]);  /* optional but recommended */      Py_SetProgramName((wchar_t *) argv[0]);  /* optional but recommended */
     Py_Initialize();      Py_Initialize();
   
   
Line 590  int my_PyRun_String() {
Line 594  int my_PyRun_String() {
   if (py_main == NULL) py_main = PyImport_AddModule("__main__");    if (py_main == NULL) py_main = PyImport_AddModule("__main__");
   if (py_dict == NULL) py_dict = PyModule_GetDict(py_main);    if (py_dict == NULL) py_dict = PyModule_GetDict(py_main);
 //  pyRes = PyRun_String(cmd,Py_single_input,py_dict,py_dict);  //  pyRes = PyRun_String(cmd,Py_single_input,py_dict,py_dict);
   pyRes = PyRun_String(cmd,Py_single_input,py_dict,py_dict);    pyRes = PyRun_String(cmd,Py_eval_input,py_dict,py_dict);
   if (pyRes==NULL) {    if (pyRes==NULL) {
     push(make_error2("PyRun_String: exception",NULL,0,-1));      push(make_error2("PyRun_String: exception",NULL,0,-1));
     PyRun_SimpleString("\n");      PyRun_SimpleString("\n");
Line 602  int my_PyRun_String() {
Line 606  int my_PyRun_String() {
 }  }
   
 int push_python_result(PyObject *pyRes) {  int push_python_result(PyObject *pyRes) {
   if (PyString_Check(pyRes)) {    if (PyUnicode_Check(pyRes)) {
     push((cmo *)new_cmo_string(PyString_AsString(pyRes)));      push((cmo *)new_cmo_string(PyBytes_AsString(PyUnicode_AsEncodedString(pyRes,"UTF-8","strict"))));
     return(0);      return(0);
   }else if (PyInt_Check(pyRes)) {    }else if (PyLong_Check(pyRes)) {
     push((cmo *)new_cmo_int32((int) PyInt_AS_LONG(pyRes)));      push((cmo *)new_cmo_int32((int) PyLong_AsLong(pyRes)));
     return(0);      return(0);
   }else {    }else {
     push((cmo *)new_cmo_string(PyString_AsString(PyObject_Str(pyRes))));      push((cmo *)new_cmo_string(PyBytes_AsString(PyUnicode_AsEncodedString(PyObject_Str(pyRes),"UTF-8","strict"))));
     return(0);      return(0);
       /* push((cmo *)new_cmo_string(PyBytes_AsString(PyObject_Str(pyRes))));
       return(0); */
 //    push(make_error2("PyRun_String returns an object which as not been implemented.",NULL,0,-1));  //    push(make_error2("PyRun_String returns an object which as not been implemented.",NULL,0,-1));
 //    return(-1);  //    return(-1);
   }    }
Line 634  int my_eval() {
Line 640  int my_eval() {
   printf("my_eval cmd=%s\n",cmd);    printf("my_eval cmd=%s\n",cmd);
   
   // code from https://docs.python.jp/2.7/extending/embedding.html    // code from https://docs.python.jp/2.7/extending/embedding.html
   if (pName==NULL) pName = PyString_FromString("__builtin__");    if (pName==NULL) pName = PyBytes_FromString("__builtin__");
   if (pModule==NULL) pModule = PyImport_Import(pName);    if (pModule==NULL) pModule = PyImport_Import(pName);
   
   if (pModule != NULL) {    if (pModule != NULL) {
     if (pFunc==NULL) pFunc = PyObject_GetAttrString(pModule, "eval");      if (pFunc==NULL) pFunc = PyObject_GetAttrString(pModule, "eval");
     if (pFunc && PyCallable_Check(pFunc)) {      if (pFunc && PyCallable_Check(pFunc)) {
       pArgs = PyTuple_New(3);        pArgs = PyTuple_New(3);
       PyTuple_SetItem(pArgs,0,PyString_FromString(cmd));        PyTuple_SetItem(pArgs,0,PyBytes_FromString(cmd));
       PyTuple_SetItem(pArgs,1,PyEval_GetGlobals());        PyTuple_SetItem(pArgs,1,PyEval_GetGlobals());
       PyTuple_SetItem(pArgs,2,PyEval_GetLocals());        PyTuple_SetItem(pArgs,2,PyEval_GetLocals());
       pValue = PyObject_CallObject(pFunc, pArgs);        pValue = PyObject_CallObject(pFunc, pArgs);
Line 698  int my_eval2() {
Line 704  int my_eval2() {
   if (pModule != NULL) {    if (pModule != NULL) {
     if (pFunc && PyCallable_Check(pFunc)) {      if (pFunc && PyCallable_Check(pFunc)) {
       pArgs = PyTuple_New(1);        pArgs = PyTuple_New(1);
       PyTuple_SetItem(pArgs,0,PyString_FromString(cmd));        PyTuple_SetItem(pArgs,0,PyBytes_FromString(cmd));
       pValue = PyObject_CallObject(pFunc, pArgs);        pValue = PyObject_CallObject(pFunc, pArgs);
       Py_DECREF(pArgs);        Py_DECREF(pArgs);
       if (pValue != NULL) {        if (pValue != NULL) {

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.6

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>