gwenhywfar 4.0.3

inherit.c

Go to the documentation of this file.
00001 /***************************************************************************
00002     begin       : Sun Dec 05 2003
00003     copyright   : (C) 2003-2010 by Martin Preuss
00004     email       : martin@libchipcard.de
00005 
00006  ***************************************************************************
00007  *                                                                         *
00008  *   This library is free software; you can redistribute it and/or         *
00009  *   modify it under the terms of the GNU Lesser General Public            *
00010  *   License as published by the Free Software Foundation; either          *
00011  *   version 2.1 of the License, or (at your option) any later version.    *
00012  *                                                                         *
00013  *   This library is distributed in the hope that it will be useful,       *
00014  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00015  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
00016  *   Lesser General Public License for more details.                       *
00017  *                                                                         *
00018  *   You should have received a copy of the GNU Lesser General Public      *
00019  *   License along with this library; if not, write to the Free Software   *
00020  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston,                 *
00021  *   MA  02111-1307  USA                                                   *
00022  *                                                                         *
00023  ***************************************************************************/
00024 
00025 
00026 #ifdef HAVE_CONFIG_H
00027 # include <config.h>
00028 #endif
00029 
00030 #define DISABLE_DEBUGLOG
00031 
00032 #include "inherit_p.h"
00033 #include <gwenhywfar/misc.h>
00034 #include <gwenhywfar/debug.h>
00035 #include <gwenhywfar/gwenhywfarapi.h>
00036 
00037 #include <string.h>
00038 
00039 
00040 
00041 GWEN_LIST_FUNCTIONS(GWEN_INHERITDATA, GWEN_InheritData)
00042 
00043 
00044 
00045 GWEN_INHERITDATA *GWEN_InheritData_new(const char *t,
00046                                        uint32_t id,
00047                                        void *data,
00048                                        void *baseData,
00049                                        GWEN_INHERIT_FREEDATAFN freeDataFn){
00050   GWEN_INHERITDATA *d;
00051 
00052   assert(t);
00053   GWEN_NEW_OBJECT(GWEN_INHERITDATA, d);
00054   GWEN_LIST_INIT(GWEN_INHERITDATA, d);
00055   d->typeName=strdup(t);
00056   d->id=id;
00057   d->data=data;
00058   d->baseData=baseData;
00059   d->freeDataFn=freeDataFn;
00060 
00061   DBG_VERBOUS(GWEN_LOGDOMAIN,
00062               "Created inheritance for type \"%s\" (%08x)", t, id);
00063   return d;
00064 }
00065 
00066 
00067 
00068 void GWEN_InheritData_free(GWEN_INHERITDATA *d) {
00069   if (d) {
00070     if (d->freeDataFn)
00071       d->freeDataFn(d->baseData, d->data);
00072     free(d->typeName);
00073     GWEN_LIST_FINI(GWEN_INHERITDATA, d);
00074     GWEN_FREE_OBJECT(d);
00075   }
00076 }
00077 
00078 
00079 
00080 void GWEN_InheritData_freeData(GWEN_INHERITDATA *d) {
00081   if (d) {
00082     DBG_VERBOUS(GWEN_LOGDOMAIN,
00083                 "Freeing data for type \"%s\"",
00084                 d->typeName);
00085     if (d->freeDataFn)
00086       d->freeDataFn(d->baseData, d->data);
00087     d->freeDataFn=NULL;
00088     d->data=NULL;
00089   }
00090 }
00091 
00092 
00093 
00094 void GWEN_InheritData_clear(GWEN_INHERITDATA *d){
00095   assert(d);
00096   d->freeDataFn=0;
00097   d->data=0;
00098 }
00099 
00100 
00101 
00102 const char *GWEN_InheritData_GetTypeName(const GWEN_INHERITDATA *d){
00103   assert(d);
00104   return d->typeName;
00105 }
00106 
00107 
00108 
00109 uint32_t GWEN_InheritData_GetId(const GWEN_INHERITDATA *d){
00110   assert(d);
00111   return d->id;
00112 }
00113 
00114 
00115 
00116 void *GWEN_InheritData_GetData(const GWEN_INHERITDATA *d){
00117   assert(d);
00118   return d->data;
00119 }
00120 
00121 
00122 
00123 GWEN_INHERIT_FREEDATAFN
00124 GWEN_InheritData_GetFreeDataFn(const GWEN_INHERITDATA *d){
00125   assert(d);
00126   return d->freeDataFn;
00127 }
00128 
00129 
00130 
00131 
00132 
00133 uint32_t GWEN_Inherit_MakeId(const char *typeName){
00134   unsigned int i, j;
00135   uint32_t result;
00136 
00137   result=0;
00138   j=strlen(typeName);
00139   for (i=0; i<j; i++) {
00140     uint32_t tmpResult;
00141     unsigned char c;
00142 
00143     tmpResult=result<<8;
00144     c=((result>>24)&0xff);
00145     result=tmpResult|c;
00146     result^=(unsigned char)(typeName[i]);
00147   }
00148 
00149   DBG_VERBOUS(GWEN_LOGDOMAIN,
00150               "Id for type \"%s\" is \"%08x\"",
00151             typeName, result);
00152   return result;
00153 }
00154 
00155 
00156 
00157 void *GWEN_Inherit_FindData(GWEN_INHERITDATA_LIST *l,
00158                             uint32_t id,
00159                             int wantCreate){
00160   GWEN_INHERITDATA *ih;
00161 
00162   assert(l);
00163 
00164   DBG_VERBOUS(GWEN_LOGDOMAIN,
00165               "Searching for inheritance id \"%08x\"", id);
00166   ih=GWEN_InheritData_List_First(l);
00167   while(ih) {
00168     DBG_VERBOUS(GWEN_LOGDOMAIN,
00169                 "Checking type \"%s\" (%08x) against %08x",
00170                 ih->typeName, ih->id, id);
00171     if (ih->id==id)
00172       return ih->data;
00173     ih=GWEN_InheritData_List_Next(ih);
00174   } /* while */
00175   if (!wantCreate) {
00176     DBG_WARN(GWEN_LOGDOMAIN,
00177              "Type \"%08x\" not derived from this base type", id);
00178   }
00179   return 0;
00180 }
00181 
00182 
00183 
00184 GWEN_INHERITDATA *GWEN_Inherit_FindEntry(GWEN_INHERITDATA_LIST *l,
00185                                          uint32_t id,
00186                                          int wantCreate){
00187   GWEN_INHERITDATA *ih;
00188 
00189   assert(l);
00190 
00191   DBG_VERBOUS(GWEN_LOGDOMAIN, "Searching for inheritance id \"%08x\"", id);
00192   ih=GWEN_InheritData_List_First(l);
00193   while(ih) {
00194     DBG_VERBOUS(GWEN_LOGDOMAIN, "Checking type \"%s\" (%08x) against %08x",
00195                 ih->typeName, ih->id, id);
00196     if (ih->id==id)
00197       return ih;
00198     ih=GWEN_InheritData_List_Next(ih);
00199   } /* while */
00200   if (!wantCreate) {
00201     DBG_WARN(GWEN_LOGDOMAIN,
00202              "Type \"%08x\" not derived from this base type", id);
00203   }
00204   return 0;
00205 }
00206 
00207 
00208 
00209 
00210