#define PY_SSIZE_T_CLEAN #include #include #include #include #include #include int Signature_init(Signature *self, PyObject *args, PyObject *kwds) { PyObject *py_name; char *name, *email, *encoding = NULL; long long time; int offset; int err; git_signature *signature; if (kwds) { PyErr_SetString(PyExc_TypeError, "Signature takes no keyword arguments"); return -1; } if (!PyArg_ParseTuple(args, "OsLi|s", &py_name, &email, &time, &offset, &encoding)) return -1; name = py_str_to_c_str(py_name, encoding); if (name == NULL) return -1; err = git_signature_new(&signature, name, email, time, offset); free(name); if (err < 0) { Error_set(err); return -1; } self->obj = NULL; self->signature = signature; if (encoding) { self->encoding = strdup(encoding); if (self->encoding == NULL) { PyErr_NoMemory(); return -1; } } return 0; } void Signature_dealloc(Signature *self) { if (self->obj) Py_DECREF(self->obj); else { git_signature_free((git_signature*)self->signature); free((void*)self->encoding); } Py_TYPE(self)->tp_free((PyObject*)self); } PyObject * Signature_get_encoding(Signature *self) { const char *encoding; encoding = self->encoding; if (encoding == NULL) encoding = "utf-8"; return to_encoding(encoding); } PyObject * Signature_get_raw_name(Signature *self) { return to_bytes(self->signature->name); } PyObject * Signature_get_raw_email(Signature *self) { return to_bytes(self->signature->email); } PyObject * Signature_get_name(Signature *self) { return to_unicode(self->signature->name, self->encoding, "strict"); } PyObject * Signature_get_email(Signature *self) { return to_unicode(self->signature->email, self->encoding, "strict"); } PyObject * Signature_get_time(Signature *self) { return PyInt_FromLong(self->signature->when.time); } PyObject * Signature_get_offset(Signature *self) { return PyInt_FromLong(self->signature->when.offset); } PyGetSetDef Signature_getseters[] = { {"_encoding", (getter)Signature_get_encoding, NULL, "encoding", NULL}, {"_name", (getter)Signature_get_raw_name, NULL, "Name (bytes)", NULL}, {"_email", (getter)Signature_get_raw_email, NULL, "Email (bytes)", NULL}, {"name", (getter)Signature_get_name, NULL, "Name", NULL}, {"email", (getter)Signature_get_email, NULL, "Email", NULL}, {"time", (getter)Signature_get_time, NULL, "Time", NULL}, {"offset", (getter)Signature_get_offset, NULL, "Offset", NULL}, {NULL} }; PyTypeObject SignatureType = { PyVarObject_HEAD_INIT(NULL, 0) "_pygit2.Signature", /* tp_name */ sizeof(Signature), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Signature_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ "Signature", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ Signature_getseters, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)Signature_init, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; PyObject * build_signature(Object *obj, const git_signature *signature, const char *encoding) { Signature *py_signature; py_signature = PyObject_New(Signature, &SignatureType); if (py_signature) { Py_INCREF(obj); py_signature->obj = obj; py_signature->signature = signature; py_signature->encoding = encoding; } return (PyObject*)py_signature; }