moved idcode functions into their own file (was added as a todo in the comments)...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 10 Aug 2010 15:14:19 +0000 (15:14 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 10 Aug 2010 15:14:19 +0000 (15:14 +0000)
source/blender/blenkernel/BKE_idcode.h [new file with mode: 0644]
source/blender/blenkernel/intern/idcode.c [new file with mode: 0644]
source/blender/blenloader/BLO_readfile.h
source/blender/blenloader/intern/readblenentry.c
source/blender/blenloader/intern/readfile.c
source/blender/editors/space_console/space_console.c
source/blender/editors/space_file/filelist.c
source/blender/editors/space_file/filesel.c
source/blender/windowmanager/intern/wm_operators.c
source/gameengine/Converter/KX_BlenderSceneConverter.cpp
source/gameengine/Ketsji/KX_PythonInit.cpp

diff --git a/source/blender/blenkernel/BKE_idcode.h b/source/blender/blenkernel/BKE_idcode.h
new file mode 100644 (file)
index 0000000..643446d
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * 
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BKE_ID_INFO_H
+#define BKE_ID_INFO_H
+
+/**
+ * Convert an idcode into a name.
+ * 
+ * @param code The code to convert.
+ * @return A static string representing the name of
+ * the code.
+ */
+const char *BKE_idcode_to_name(int code);
+
+/**
+ * Convert an idcode into a name (plural).
+ * 
+ * @param code The code to convert.
+ * @return A static string representing the name of
+ * the code.
+ */
+const char *BKE_idcode_to_name_plural(int code);
+
+/**
+ * Convert a name into an idcode (ie. ID_SCE)
+ * 
+ * @param name The name to convert.
+ * @return The code for the name, or 0 if invalid.
+ */
+int BKE_idcode_from_name(const char *name);
+
+/**
+ * Return non-zero when an ID type is linkable.
+ * 
+ * @param code The code to check.
+ * @return Boolean, 0 when non linkable.
+ */
+int BKE_idcode_is_linkable(int code);
+
+/**
+ * Return if the ID code is a valid ID code.
+ * 
+ * @param code The code to check.
+ * @return Boolean, 0 when invalid.
+ */
+int BKE_idcode_is_valid(int code);
+
+#endif
diff --git a/source/blender/blenkernel/intern/idcode.c b/source/blender/blenkernel/intern/idcode.c
new file mode 100644 (file)
index 0000000..c9dee00
--- /dev/null
@@ -0,0 +1,128 @@
+/**
+ * $Id: readblenentry.c 31028 2010-08-04 04:01:27Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * return info about ID types
+ */
+#include <stdlib.h>
+#include <string.h>
+
+#include "DNA_ID.h"
+
+typedef struct {
+       unsigned short code;
+       char *name, *plural;
+       
+       int flags;
+#define IDTYPE_FLAGS_ISLINKABLE        (1<<0)
+} IDType;
+
+/* plural need to match rna_main.c's MainCollectionDef */
+static IDType idtypes[]= {
+       { ID_AC,                "Action",       "actions",              IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_AR,                "Armature", "armatures",        IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_BR,                "Brush",        "brushes",              IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_CA,                "Camera",       "cameras",              IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_CU,                "Curve",        "curves",               IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_GD,                "GPencil",      "gpencil",              IDTYPE_FLAGS_ISLINKABLE},  /* rename gpencil */
+       { ID_GR,                "Group",        "groups",               IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_ID,                "ID",           "ids",                  0}, /* plural is fake */
+       { ID_IM,                "Image",        "images",               IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_IP,                "Ipo",          "ipos",                 IDTYPE_FLAGS_ISLINKABLE},  /* deprecated */
+       { ID_KE,                "Key",          "keys",                 0}, 
+       { ID_LA,                "Lamp",         "lamps",                IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_LI,                "Library",      "libraries",    0}, 
+       { ID_LT,                "Lattice",      "lattices",             IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_MA,                "Material", "materials",        IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_MB,                "Metaball", "metaballs",        IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_ME,                "Mesh",         "meshes",               IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_NT,                "NodeTree",     "node_groups",  IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_OB,                "Object",       "objects",              IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_PA,                "ParticleSettings",     "particles", 0},
+       { ID_SCE,               "Scene",        "scenes",               IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_SCR,               "Screen",       "screens",              0}, 
+       { ID_SEQ,               "Sequence",     "sequences",    0}, /* not actually ID data */
+       { ID_SO,                "Sound",        "sounds",               IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_TE,                "Texture",      "textures",             IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_TXT,               "Text",         "texts",                IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_VF,                "VFont",        "fonts",                IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_WO,                "World",        "worlds",               IDTYPE_FLAGS_ISLINKABLE}, 
+       { ID_WM,                "WindowManager", "window_managers",     0}, 
+};
+static int nidtypes= sizeof(idtypes)/sizeof(idtypes[0]);
+
+static IDType *idtype_from_name(const char *str) 
+{
+       int i= nidtypes;
+       
+       while (i--)
+               if (strcmp(str, idtypes[i].name)==0)
+                       return &idtypes[i];
+
+       return NULL;
+}
+static IDType *idtype_from_code(int code) 
+{
+       int i= nidtypes;
+       
+       while (i--)
+               if (code==idtypes[i].code)
+                       return &idtypes[i];
+       
+       return NULL;
+}
+
+int BKE_idcode_is_valid(int code) 
+{
+       return idtype_from_code(code)?1:0;
+}
+
+int BKE_idcode_is_linkable(int code) {
+       IDType *idt= idtype_from_code(code);
+       return idt?(idt->flags&IDTYPE_FLAGS_ISLINKABLE):0;
+}
+
+const char *BKE_idcode_to_name(int code) 
+{
+       IDType *idt= idtype_from_code(code);
+       
+       return idt?idt->name:NULL;
+}
+
+int BKE_idcode_from_name(const char *name) 
+{
+       IDType *idt= idtype_from_name(name);
+       
+       return idt?idt->code:0;
+}
+
+const char *BKE_idcode_to_name_plural(int code) 
+{
+       IDType *idt= idtype_from_code(code);
+       
+       return idt?idt->plural:NULL;
+}
index d6418f426c87ab0774bda51065d1f35fc033760d..eeced13b57b28e1c3a60df3c8a53c7ddee1e1f04 100644 (file)
@@ -111,38 +111,6 @@ BlendFileData *BLO_read_from_memfile(struct Main *oldmain, const char *filename,
        void
 BLO_blendfiledata_free(
        BlendFileData *bfd);
-
-/**
- * Convert an idcode into a name.
- * 
- * @param code The code to convert.
- * @return A static string representing the name of
- * the code.
- */
-       char*
-BLO_idcode_to_name(
-       int code);
-       
-/**
- * Convert an idcode into a name (plural).
- * 
- * @param code The code to convert.
- * @return A static string representing the name of
- * the code.
- */
-       char*
-BLO_idcode_to_name_plural(
-       int code);
-
-/**
- * Convert a name into an idcode (ie. ID_SCE)
- * 
- * @param name The name to convert.
- * @return The code for the name, or 0 if invalid.
- */
-       int
-BLO_idcode_from_name(
-       char *name);
        
 /**
  * Open a blendhandle from a file path.
index 6101012203ada6c62fe92cb1777ea51fad0b1072..d66d802c8eef650a6b5d809287602a0bf0ac0d4c 100644 (file)
@@ -46,6 +46,7 @@
 
 #include "BKE_main.h"
 #include "BKE_library.h" // for free_main
+#include "BKE_idcode.h"
 #include "BKE_report.h"
 
 #include "BLO_readfile.h"
 #include "BLI_winstuff.h"
 #endif
 
-       /**
-        * IDType stuff, I plan to move this
-        * out into its own file + prefix, and
-        * make sure all IDType handling goes through
-        * these routines.
-        */
-
-typedef struct {
-       unsigned short code;
-       char *name, *plural;
-       
-       int flags;
-#define IDTYPE_FLAGS_ISLINKABLE        (1<<0)
-} IDType;
-
-/* plural need to match rna_main.c's MainCollectionDef */
-static IDType idtypes[]= {
-       { ID_AC,                "Action",       "actions",              IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_AR,                "Armature", "armatures",        IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_BR,                "Brush",        "brushes",              IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_CA,                "Camera",       "cameras",              IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_CU,                "Curve",        "curves",               IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_GD,                "GPencil",      "gpencil",              IDTYPE_FLAGS_ISLINKABLE},  /* rename gpencil */
-       { ID_GR,                "Group",        "groups",               IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_ID,                "ID",           "ids",                  0}, /* plural is fake */
-       { ID_IM,                "Image",        "images",               IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_IP,                "Ipo",          "ipos",                 IDTYPE_FLAGS_ISLINKABLE},  /* deprecated */
-       { ID_KE,                "Key",          "keys",                 0}, 
-       { ID_LA,                "Lamp",         "lamps",                IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_LI,                "Library",      "libraries",    0}, 
-       { ID_LT,                "Lattice",      "lattices",             IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_MA,                "Material", "materials",        IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_MB,                "Metaball", "metaballs",        IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_ME,                "Mesh",         "meshes",               IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_NT,                "NodeTree",     "node_groups",  IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_OB,                "Object",       "objects",              IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_PA,                "ParticleSettings",     "particles", 0},
-       { ID_SCE,               "Scene",        "scenes",               IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_SCR,               "Screen",       "screens",              0}, 
-       { ID_SEQ,               "Sequence",     "sequences",    0}, /* not actually ID data */
-       { ID_SO,                "Sound",        "sounds",               IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_TE,                "Texture",      "textures",             IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_TXT,               "Text",         "texts",                IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_VF,                "VFont",        "fonts",                IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_WO,                "World",        "worlds",               IDTYPE_FLAGS_ISLINKABLE}, 
-       { ID_WM,                "WindowManager", "window_managers",     0}, 
-};
-static int nidtypes= sizeof(idtypes)/sizeof(idtypes[0]);
-
 /* local prototypes --------------------- */
 void BLO_blendhandle_print_sizes(BlendHandle *, void *); 
 
-
-static IDType *idtype_from_name(char *str) 
-{
-       int i= nidtypes;
-       
-       while (i--)
-               if (BLI_streq(str, idtypes[i].name))
-                       return &idtypes[i];
-       
-       return NULL;
-}
-static IDType *idtype_from_code(int code) 
-{
-       int i= nidtypes;
-       
-       while (i--)
-               if (code==idtypes[i].code)
-                       return &idtypes[i];
-       
-       return NULL;
-}
-
-static int bheadcode_is_idcode(int code) 
-{
-       return idtype_from_code(code)?1:0;
-}
-
-static int idcode_is_linkable(int code) {
-       IDType *idt= idtype_from_code(code);
-       return idt?(idt->flags&IDTYPE_FLAGS_ISLINKABLE):0;
-}
-
-char *BLO_idcode_to_name(int code) 
-{
-       IDType *idt= idtype_from_code(code);
-       
-       return idt?idt->name:NULL;
-}
-
-int BLO_idcode_from_name(char *name) 
-{
-       IDType *idt= idtype_from_name(name);
-       
-       return idt?idt->code:0;
-}
-
-char *BLO_idcode_to_name_plural(int code) 
-{
-       IDType *idt= idtype_from_code(code);
-       
-       return idt?idt->plural:NULL;
-}
-
        /* Access routines used by filesel. */
         
 BlendHandle *BLO_blendhandle_from_file(char *file) 
@@ -308,13 +207,13 @@ LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
        for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
                if (bhead->code==ENDB) {
                        break;
-               } else if (bheadcode_is_idcode(bhead->code)) {
-                       if (idcode_is_linkable(bhead->code)) {
-                               char *str= BLO_idcode_to_name(bhead->code);
+               } else if (BKE_idcode_is_valid(bhead->code)) {
+                       if (BKE_idcode_is_linkable(bhead->code)) {
+                               const char *str= BKE_idcode_to_name(bhead->code);
                                
-                               if (!BLI_ghash_haskey(gathered, str)) {
+                               if (!BLI_ghash_haskey(gathered, (void *)str)) {
                                        BLI_linklist_prepend(&names, strdup(str));
-                                       BLI_ghash_insert(gathered, str, NULL);
+                                       BLI_ghash_insert(gathered, (void *)str, NULL);
                                }
                        }
                }
index e36b73189e6dfd052de02d6d36630dbe7abee146..ef99b3ab8e4574bd6bb47063456ef547a01eeb06 100644 (file)
 #include "BKE_image.h"
 #include "BKE_lattice.h"
 #include "BKE_library.h" // for which_libbase
+#include "BKE_idcode.h"
 #include "BKE_main.h" // for Main
 #include "BKE_mesh.h" // for ME_ defines (patching)
 #include "BKE_modifier.h"
@@ -12592,8 +12593,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
 
                                                                append_id_part(fd, mainptr, id, &realid);
                                                                if (!realid) {
-                                                                       BKE_reportf(fd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
-                                                                       if(!G.background && basefd->reports) printf("LIB ERROR: %s:'%s' missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
+                                                                       BKE_reportf(fd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
+                                                                       if(!G.background && basefd->reports) printf("LIB ERROR: %s:'%s' missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
                                                                }
                                                                
                                                                change_idid_adr(mainlist, basefd, id, realid);
@@ -12628,8 +12629,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
                                ID *idn= id->next;
                                if(id->flag & LIB_READ) {
                                        BLI_remlink(lbarray[a], id);
-                                       BKE_reportf(basefd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
-                                       if(!G.background && basefd->reports)printf("LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
+                                       BKE_reportf(basefd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
+                                       if(!G.background && basefd->reports)printf("LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
                                        change_idid_adr(mainlist, basefd, id, NULL);
 
                                        MEM_freeN(id);
index f5d913e9f3255ff2a80283f21db0fd75d7ed1376..4ee69bbd809cc08b51b660723a9b835934622906 100644 (file)
 
 #include "MEM_guardedalloc.h"
 
-#include "BLO_readfile.h" /* get the ID name for dnd*/
-
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
 
 #include "BKE_context.h"
 #include "BKE_screen.h"
+#include "BKE_idcode.h"
 
 #include "ED_screen.h"
 
@@ -177,7 +176,7 @@ static void id_drop_copy(wmDrag *drag, wmDropBox *drop)
        char text[64];
        ID *id= drag->poin;
 
-       snprintf(text, sizeof(text), "bpy.data.%s['%s']", BLO_idcode_to_name_plural(GS(id->name)), id->name+2); 
+       snprintf(text, sizeof(text), "bpy.data.%s['%s']", BKE_idcode_to_name_plural(GS(id->name)), id->name+2); 
 
        /* copy drag path to properties */
        RNA_string_set(drop->ptr, "text", text);
index 2664082b20b1de450eb943cd99c2e7e22fb1585e..c3bea2a5bea4f1c59a031365d799cb0cb122b7a3 100644 (file)
@@ -57,6 +57,7 @@
 #include "BKE_main.h"
 #include "BKE_report.h"
 #include "BLO_readfile.h"
+#include "BKE_idcode.h"
 
 #include "DNA_space_types.h"
 
@@ -881,7 +882,7 @@ static int groupname_to_code(char *group)
        if (lslash)
                lslash[0]= '\0';
 
-       return BLO_idcode_from_name(buf);
+       return BKE_idcode_from_name(buf);
 }
 
 void filelist_from_library(struct FileList* filelist)
index 8783296f5c29871ef5956205a7a5bb933cd04f52..0dbd10483487acb9873f188f9bfa52ac25c6c6dd 100644 (file)
@@ -62,8 +62,6 @@
 #include "BLI_storage_types.h"
 #include "BLI_dynstr.h"
 
-#include "BLO_readfile.h"
-
 #include "BKE_context.h"
 #include "BKE_global.h"
 
index 4c3e88d978ed8177c3b3aa041b3bbc729ae66c9e..fef7f737c8ae87ab4b90b116d88c301408930894 100644 (file)
@@ -63,6 +63,7 @@
 #include "BKE_screen.h" /* BKE_ST_MAXNAME */
 #include "BKE_utildefines.h"
 #include "BKE_brush.h" // JW
+#include "BKE_idcode.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h" /* for paint cursor */
@@ -1586,7 +1587,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
                scene_deselect_all(scene);
 
        bh = BLO_blendhandle_from_file(libname);
-       idcode = BLO_idcode_from_name(group);
+       idcode = BKE_idcode_from_name(group);
        
        flag = wm_link_append_flag(op);
 
index 0575c55846b6eb43a0e49e59caa296ffeef47deb..b4ddc4f9e54ecf2e55b16970b90113286a53c599 100644 (file)
@@ -100,6 +100,7 @@ extern "C"
 extern "C" {
        #include "BKE_context.h"
        #include "BLO_readfile.h"
+       #include "BKE_idcode.h"
        #include "BKE_report.h"
        #include "DNA_space_types.h"
        #include "DNA_windowmanager_types.h" /* report api */
@@ -938,7 +939,7 @@ bool KX_BlenderSceneConverter::LinkBlendFile(const char *path, char *group, KX_S
        Main *main_tmp= NULL; /* created only for linking, then freed */
        LinkNode *names = NULL;
        BlendHandle *bpy_openlib = NULL;        /* ptr to the open .blend file */       
-       int idcode= BLO_idcode_from_name(group);
+       int idcode= BKE_idcode_from_name(group);
        short flag= 0; /* dont need any special options */
        ReportList reports;
        static char err_local[255];
index 3e63aa61d82dde1eda0b98f4a14a93d1f7de4cb4..3350a59681ba8141c25b36c9923f552e57ab6c05 100644 (file)
@@ -118,7 +118,7 @@ extern "C" {
 #include "KX_BlenderSceneConverter.h"
 #include "KX_MeshProxy.h" /* for creating a new library of mesh objects */
 extern "C" {
-       #include "BLO_readfile.h"
+       #include "BKE_idcode.h"
 }
 
 #include "NG_NetworkScene.h" //Needed for sendMessage()
@@ -666,7 +666,7 @@ static PyObject *gLibNew(PyObject*, PyObject* args)
                return NULL;
        }
        
-       idcode= BLO_idcode_from_name(group);
+       idcode= BKE_idcode_from_name(group);
        if(idcode==0) {
                PyErr_Format(PyExc_ValueError, "invalid group given \"%s\"", group);
                return NULL;