Cleanup: use PyC_StringEnum to path access functions

This gives better error messages, simplify code.
This commit is contained in:
2019-10-01 05:16:40 +10:00
parent aba6fc8208
commit 9411b0a3c7

View File

@@ -147,39 +147,28 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec
// PyDoc_STRVAR(bpy_user_resource_doc[] = // now in bpy/utils.py
static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
const char *type;
const struct PyC_StringEnumItems type_items[] = {
{BLENDER_USER_DATAFILES, "DATAFILES"},
{BLENDER_USER_CONFIG, "CONFIG"},
{BLENDER_USER_SCRIPTS, "SCRIPTS"},
{BLENDER_USER_AUTOSAVE, "AUTOSAVE"},
{0, NULL},
};
struct PyC_StringEnum type = {type_items};
const char *subdir = NULL;
int folder_id;
const char *path;
static const char *_keywords[] = {"type", "subdir", NULL};
static _PyArg_Parser _parser = {"s|s:user_resource", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, &type, &subdir)) {
return NULL;
}
/* stupid string compare */
if (STREQ(type, "DATAFILES")) {
folder_id = BLENDER_USER_DATAFILES;
}
else if (STREQ(type, "CONFIG")) {
folder_id = BLENDER_USER_CONFIG;
}
else if (STREQ(type, "SCRIPTS")) {
folder_id = BLENDER_USER_SCRIPTS;
}
else if (STREQ(type, "AUTOSAVE")) {
folder_id = BLENDER_USER_AUTOSAVE;
}
else {
PyErr_SetString(PyExc_ValueError, "invalid resource argument");
static _PyArg_Parser _parser = {"O&|s:user_resource", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, PyC_ParseStringEnum, &type, &subdir)) {
return NULL;
}
/* same logic as BKE_appdir_folder_id_create(),
* but best leave it up to the script author to create */
path = BKE_appdir_folder_id_user_notest(folder_id, subdir);
path = BKE_appdir_folder_id_user_notest(type.value_found, subdir);
return PyC_UnicodeFromByte(path ? path : "");
}
@@ -195,34 +184,25 @@ PyDoc_STRVAR(bpy_system_resource_doc,
" :type path: string\n");
static PyObject *bpy_system_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
const char *type;
const struct PyC_StringEnumItems type_items[] = {
{BLENDER_SYSTEM_DATAFILES, "DATAFILES"},
{BLENDER_SYSTEM_SCRIPTS, "SCRIPTS"},
{BLENDER_SYSTEM_PYTHON, "PYTHON"},
{0, NULL},
};
struct PyC_StringEnum type = {type_items};
const char *subdir = NULL;
int folder_id;
const char *path;
static const char *_keywords[] = {"type", "path", NULL};
static _PyArg_Parser _parser = {"s|s:system_resource", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, &type, &subdir)) {
static _PyArg_Parser _parser = {"O&|s:system_resource", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, PyC_ParseStringEnum, &type, &subdir)) {
return NULL;
}
/* stupid string compare */
if (STREQ(type, "DATAFILES")) {
folder_id = BLENDER_SYSTEM_DATAFILES;
}
else if (STREQ(type, "SCRIPTS")) {
folder_id = BLENDER_SYSTEM_SCRIPTS;
}
else if (STREQ(type, "PYTHON")) {
folder_id = BLENDER_SYSTEM_PYTHON;
}
else {
PyErr_SetString(PyExc_ValueError, "invalid resource argument");
return NULL;
}
path = BKE_appdir_folder_id(folder_id, subdir);
path = BKE_appdir_folder_id(type.value_found, subdir);
return PyC_UnicodeFromByte(path ? path : "");
}
@@ -243,33 +223,25 @@ PyDoc_STRVAR(
" :rtype: string\n");
static PyObject *bpy_resource_path(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
const char *type;
const struct PyC_StringEnumItems type_items[] = {
{BLENDER_RESOURCE_PATH_USER, "USER"},
{BLENDER_RESOURCE_PATH_LOCAL, "LOCAL"},
{BLENDER_RESOURCE_PATH_SYSTEM, "SYSTEM"},
{0, NULL},
};
struct PyC_StringEnum type = {type_items};
int major = BLENDER_VERSION / 100, minor = BLENDER_VERSION % 100;
int folder_id;
const char *path;
static const char *_keywords[] = {"type", "major", "minor", NULL};
static _PyArg_Parser _parser = {"s|ii:resource_path", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, &type, &major, &minor)) {
static _PyArg_Parser _parser = {"O&|ii:resource_path", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(
args, kw, &_parser, PyC_ParseStringEnum, &type, &major, &minor)) {
return NULL;
}
/* stupid string compare */
if (STREQ(type, "USER")) {
folder_id = BLENDER_RESOURCE_PATH_USER;
}
else if (STREQ(type, "LOCAL")) {
folder_id = BLENDER_RESOURCE_PATH_LOCAL;
}
else if (STREQ(type, "SYSTEM")) {
folder_id = BLENDER_RESOURCE_PATH_SYSTEM;
}
else {
PyErr_SetString(PyExc_ValueError, "invalid resource argument");
return NULL;
}
path = BKE_appdir_folder_id_version(folder_id, (major * 100) + minor, false);
path = BKE_appdir_folder_id_version(type.value_found, (major * 100) + minor, false);
return PyC_UnicodeFromByte(path ? path : "");
}