17db96d56Sopenharmony_ci#define PY_SSIZE_T_CLEAN
27db96d56Sopenharmony_ci#include <Python.h>
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ciint
57db96d56Sopenharmony_cimain(int argc, char *argv[])
67db96d56Sopenharmony_ci{
77db96d56Sopenharmony_ci    PyObject *pName, *pModule, *pFunc;
87db96d56Sopenharmony_ci    PyObject *pArgs, *pValue;
97db96d56Sopenharmony_ci    int i;
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci    if (argc < 3) {
127db96d56Sopenharmony_ci        fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
137db96d56Sopenharmony_ci        return 1;
147db96d56Sopenharmony_ci    }
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci    Py_Initialize();
177db96d56Sopenharmony_ci    pName = PyUnicode_DecodeFSDefault(argv[1]);
187db96d56Sopenharmony_ci    /* Error checking of pName left out */
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci    pModule = PyImport_Import(pName);
217db96d56Sopenharmony_ci    Py_DECREF(pName);
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci    if (pModule != NULL) {
247db96d56Sopenharmony_ci        pFunc = PyObject_GetAttrString(pModule, argv[2]);
257db96d56Sopenharmony_ci        /* pFunc is a new reference */
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci        if (pFunc && PyCallable_Check(pFunc)) {
287db96d56Sopenharmony_ci            pArgs = PyTuple_New(argc - 3);
297db96d56Sopenharmony_ci            for (i = 0; i < argc - 3; ++i) {
307db96d56Sopenharmony_ci                pValue = PyLong_FromLong(atoi(argv[i + 3]));
317db96d56Sopenharmony_ci                if (!pValue) {
327db96d56Sopenharmony_ci                    Py_DECREF(pArgs);
337db96d56Sopenharmony_ci                    Py_DECREF(pModule);
347db96d56Sopenharmony_ci                    fprintf(stderr, "Cannot convert argument\n");
357db96d56Sopenharmony_ci                    return 1;
367db96d56Sopenharmony_ci                }
377db96d56Sopenharmony_ci                /* pValue reference stolen here: */
387db96d56Sopenharmony_ci                PyTuple_SetItem(pArgs, i, pValue);
397db96d56Sopenharmony_ci            }
407db96d56Sopenharmony_ci            pValue = PyObject_CallObject(pFunc, pArgs);
417db96d56Sopenharmony_ci            Py_DECREF(pArgs);
427db96d56Sopenharmony_ci            if (pValue != NULL) {
437db96d56Sopenharmony_ci                printf("Result of call: %ld\n", PyLong_AsLong(pValue));
447db96d56Sopenharmony_ci                Py_DECREF(pValue);
457db96d56Sopenharmony_ci            }
467db96d56Sopenharmony_ci            else {
477db96d56Sopenharmony_ci                Py_DECREF(pFunc);
487db96d56Sopenharmony_ci                Py_DECREF(pModule);
497db96d56Sopenharmony_ci                PyErr_Print();
507db96d56Sopenharmony_ci                fprintf(stderr,"Call failed\n");
517db96d56Sopenharmony_ci                return 1;
527db96d56Sopenharmony_ci            }
537db96d56Sopenharmony_ci        }
547db96d56Sopenharmony_ci        else {
557db96d56Sopenharmony_ci            if (PyErr_Occurred())
567db96d56Sopenharmony_ci                PyErr_Print();
577db96d56Sopenharmony_ci            fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
587db96d56Sopenharmony_ci        }
597db96d56Sopenharmony_ci        Py_XDECREF(pFunc);
607db96d56Sopenharmony_ci        Py_DECREF(pModule);
617db96d56Sopenharmony_ci    }
627db96d56Sopenharmony_ci    else {
637db96d56Sopenharmony_ci        PyErr_Print();
647db96d56Sopenharmony_ci        fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
657db96d56Sopenharmony_ci        return 1;
667db96d56Sopenharmony_ci    }
677db96d56Sopenharmony_ci    if (Py_FinalizeEx() < 0) {
687db96d56Sopenharmony_ci        return 120;
697db96d56Sopenharmony_ci    }
707db96d56Sopenharmony_ci    return 0;
717db96d56Sopenharmony_ci}
72