From: <kak...@us...> - 2008-04-05 05:45:03
|
Revision: 9691 http://amsn.svn.sourceforge.net/amsn/?rev=9691&view=rev Author: kakaroto Date: 2008-04-04 22:45:09 -0700 (Fri, 04 Apr 2008) Log Message: ----------- Use a Tcl_HashTable instead of custom list code... remaining TkCximage and Capture.. buth they both look too complex to modify at this time Modified Paths: -------------- trunk/amsn/utils/tcl_siren/src/tcl_siren.c trunk/amsn/utils/tcl_siren/src/tcl_siren.h trunk/amsn/utils/webcamsn/src/webcamsn.c trunk/amsn/utils/webcamsn/src/webcamsn.h Modified: trunk/amsn/utils/tcl_siren/src/tcl_siren.c =================================================================== --- trunk/amsn/utils/tcl_siren/src/tcl_siren.c 2008-04-04 22:49:16 UTC (rev 9690) +++ trunk/amsn/utils/tcl_siren/src/tcl_siren.c 2008-04-05 05:45:09 UTC (rev 9691) @@ -10,95 +10,10 @@ // Include the header file #include "tcl_siren.h" -struct list_ptr { - struct list_ptr* prev_item; - struct list_ptr* next_item; - struct data_item* element; -}; +static int codec_counter = 0; +static Tcl_HashTable *Coders = NULL; - -int codec_counter = 0; -struct list_ptr *Coders = NULL; - -///////////////////////////////////// -// Functions to manage lists // -///////////////////////////////////// - -struct list_ptr* Siren_lstGetListItem(char *list_element_id){ //Get the list item with the specified name - struct list_ptr* item = g_list; - - while(item && strcmp(item->element->list_element_id, list_element_id)) - item = item->next_item; - - return item; - -} - -int Siren_lstListSize(){ - struct list_ptr* item = g_list; - int ret = 0; - - while(item) { - item = item->next_item; - ret = ret + 1; - } - - return ret; - -} - -struct data_item* Siren_lstAddItem(struct data_item* item) { - struct list_ptr* newItem; - - if (!item) return NULL; - if (Siren_lstGetListItem(item->list_element_id)) return NULL; - - newItem = (struct list_ptr *) malloc(sizeof(struct list_ptr)); - - if(newItem) { - memset(newItem,0,sizeof(struct list_ptr)); - newItem->element = item; - - newItem->next_item = g_list; - - if (g_list) { - g_list->prev_item = newItem; - } - g_list = newItem; - return newItem->element; - } else - return NULL; - -} - -struct data_item* Siren_lstGetItem(char *list_element_id){ //Get the item with the specified name - struct list_ptr* listitem = Siren_lstGetListItem(list_element_id); - if(listitem) - return listitem->element; - else - return NULL; -} - -struct data_item* Siren_lstDeleteItem(char *list_element_id){ - struct list_ptr* item = Siren_lstGetListItem(list_element_id); - struct data_item* element = NULL; - - if(item) { - element = item->element; - if(item->prev_item==NULL) //The first item - g_list = item->next_item; - else - (item->prev_item)->next_item = item->next_item; - - if (item->next_item) - (item->next_item)->prev_item = item->prev_item; - - free(item); - } - return element; -} - static int Siren_NewCodec (Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], SirenCodecType type) { SirenCodecObject *new_codec; @@ -106,6 +21,8 @@ char * req_name = NULL; int sample_rate = 16000; char *prefix; + Tcl_HashEntry *hPtr = NULL; + int newHash; static char encoder_prefix[] = "encoder"; static char decoder_prefix[] = "decoder"; @@ -141,7 +58,7 @@ if ( objc == 3) { // Set the requested name and see if it exists... req_name = Tcl_GetStringFromObj(objv[2], NULL); - if (Siren_lstGetItem(req_name) == NULL) { + if (Tcl_FindHashEntry(Coders, req_name) == NULL) { strcpy(name, req_name); }else { sprintf(name, "%s%d", prefix, ++codec_counter); @@ -159,9 +76,9 @@ new_codec->decoder = Siren7_NewDecoder(sample_rate); } + hPtr = Tcl_CreateHashEntry(Coders, name, &newHash); + Tcl_SetHashValue(hPtr, (ClientData) new_codec); - Siren_lstAddItem(new_codec); - Tcl_ResetResult(interp); Tcl_AppendResult(interp, name, NULL); @@ -200,6 +117,7 @@ unsigned char * output = NULL; unsigned char * out_ptr = NULL; unsigned char* input = NULL; + Tcl_HashEntry *hPtr = NULL; int length = 0; int dataSize; int processed = 0; @@ -212,7 +130,10 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - encoder = Siren_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Coders, name); + if (hPtr != NULL) { + encoder = (SirenCodecObject *) Tcl_GetHashValue(hPtr); + } if (!encoder || encoder->codecType != SIREN_ENCODER) { Tcl_AppendResult (interp, "Invalid encoder : " , name, (char *) NULL); @@ -253,6 +174,7 @@ unsigned char * output = NULL; unsigned char * out_ptr = NULL; unsigned char* input = NULL; + Tcl_HashEntry *hPtr = NULL; int length = 0; int dataSize; int processed = 0; @@ -265,7 +187,10 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - decoder = Siren_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Coders, name); + if (hPtr != NULL) { + decoder = (SirenCodecObject *) Tcl_GetHashValue(hPtr); + } if (!decoder || decoder->codecType != SIREN_DECODER) { Tcl_AppendResult (interp, "Invalid decoder : " , name, (char *) NULL); @@ -300,6 +225,7 @@ { char * name = NULL; SirenCodecObject * codec; + Tcl_HashEntry *hPtr = NULL; // We verify the arguments if( objc != 2) { @@ -309,8 +235,12 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - codec = Siren_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Coders, name); + if (hPtr != NULL) { + codec = (SirenCodecObject *) Tcl_GetHashValue(hPtr); + } + if (!codec) { Tcl_AppendResult (interp, "Invalid Siren codec : " , name, (char *) NULL); return TCL_ERROR; @@ -321,7 +251,9 @@ } else if (codec->codecType == SIREN_DECODER) { Siren7_CloseDecoder(codec->decoder); } - Siren_lstDeleteItem(name); + + Tcl_DeleteHashEntry(hPtr); + free(codec); return TCL_OK; @@ -339,6 +271,7 @@ FILE * f = NULL; unsigned int dataSize; SirenCodecObject * codec; + Tcl_HashEntry *hPtr = NULL; // We verify the arguments if( objc != 4) { @@ -347,8 +280,12 @@ } name = Tcl_GetStringFromObj(objv[1], NULL); - codec = Siren_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Coders, name); + if (hPtr != NULL) { + codec = (SirenCodecObject *) Tcl_GetHashValue(hPtr); + } + if (!codec) { Tcl_AppendResult (interp, "Invalid codec : " , name, (char *) NULL); return TCL_ERROR; @@ -412,6 +349,10 @@ return TCL_ERROR; } + Coders = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable)); + Tcl_InitHashTable(Coders, TCL_STRING_KEYS); + + // Create the wrapping commands in the Webcamsn namespace linked to custom functions with a NULL clientdata and // no deleteproc inside the current interpreter Tcl_CreateObjCommand(interp, "::Siren::NewEncoder", Siren_NewEncoder, Modified: trunk/amsn/utils/tcl_siren/src/tcl_siren.h =================================================================== --- trunk/amsn/utils/tcl_siren/src/tcl_siren.h 2008-04-04 22:49:16 UTC (rev 9690) +++ trunk/amsn/utils/tcl_siren/src/tcl_siren.h 2008-04-05 05:45:09 UTC (rev 9691) @@ -65,12 +65,6 @@ } SirenCodecObject; -#define g_list Coders -#define data_item SirenCodecObject -#define list_element_id name - - - // External functions EXTERN int Siren_Init _ANSI_ARGS_((Tcl_Interp *interp)); EXTERN int Siren_SafeInit _ANSI_ARGS_((Tcl_Interp *interp)); Modified: trunk/amsn/utils/webcamsn/src/webcamsn.c =================================================================== --- trunk/amsn/utils/webcamsn/src/webcamsn.c 2008-04-04 22:49:16 UTC (rev 9690) +++ trunk/amsn/utils/webcamsn/src/webcamsn.c 2008-04-05 05:45:09 UTC (rev 9691) @@ -13,100 +13,13 @@ -int encoder_counter = 0; -int decoder_counter = 0; +static int encoder_counter = 0; +static int decoder_counter = 0; -struct list_ptr *Codecs = NULL; +static Tcl_HashTable *Codecs = NULL; - -struct list_ptr { - struct list_ptr* prev_item; - struct list_ptr* next_item; - struct data_item* element; -}; - - -///////////////////////////////////// -// Functions to manage lists // -///////////////////////////////////// - -struct list_ptr* Webcamsn_lstGetListItem(char *list_element_id){ //Get the list item with the specified name - struct list_ptr* item = g_list; - - while(item && strcmp(item->element->list_element_id, list_element_id)) - item = item->next_item; - - return item; - -} - -int Webcamsn_lstListSize(){ - struct list_ptr* item = g_list; - int ret = 0; - - while(item) { - item = item->next_item; - ret = ret + 1; - } - - return ret; - -} - -struct data_item* Webcamsn_lstAddItem(struct data_item* item) { - struct list_ptr* newItem; - - if (!item) return NULL; - if (Webcamsn_lstGetListItem(item->list_element_id)) return NULL; - - newItem = (struct list_ptr *) malloc(sizeof(struct list_ptr)); - - if(newItem) { - memset(newItem,0,sizeof(struct list_ptr)); - newItem->element = item; - - newItem->next_item = g_list; - - if (g_list) { - g_list->prev_item = newItem; - } - g_list = newItem; - return newItem->element; - } else - return NULL; - -} - -struct data_item* Webcamsn_lstGetItem(char *list_element_id){ //Get the item with the specified name - struct list_ptr* listitem = Webcamsn_lstGetListItem(list_element_id); - if(listitem) - return listitem->element; - else - return NULL; -} - -struct data_item* Webcamsn_lstDeleteItem(char *list_element_id){ - struct list_ptr* item = Webcamsn_lstGetListItem(list_element_id); - struct data_item* element = NULL; - - if(item) { - element = item->element; - if(item->prev_item==NULL) //The first item - g_list = item->next_item; - else - (item->prev_item)->next_item = item->next_item; - - if (item->next_item) - (item->next_item)->prev_item = item->prev_item; - - free(item); - } - return element; -} - - BYTE * RGBA2RGB(Tk_PhotoImageBlock data) { int i; int size = data.height * data.width * data.pixelSize; @@ -131,6 +44,8 @@ CodecInfo *new_decoder; char name[30]; char *req_name = NULL; + Tcl_HashEntry *hPtr = NULL; + int newHash; // We verify the arguments if( objc > 2) { @@ -144,7 +59,7 @@ if ( objc == 2) { // Set the requested name and see if it exists... req_name = Tcl_GetStringFromObj(objv[1], NULL); - if (Webcamsn_lstGetItem(req_name) == NULL) { + if (Tcl_FindHashEntry(Codecs, req_name) == NULL) { strcpy(name, req_name ); }else { sprintf(name, "decoder%d", ++decoder_counter); @@ -159,7 +74,8 @@ new_decoder->type = DECODER_UNINITIALIZED; new_decoder->frames = 0; - Webcamsn_lstAddItem(new_decoder); + hPtr = Tcl_CreateHashEntry(Codecs, name, &newHash); + Tcl_SetHashValue(hPtr, (ClientData) new_decoder); Tcl_ResetResult(interp); Tcl_AppendResult(interp, name, NULL); @@ -181,6 +97,8 @@ char * req_name = NULL; char * strResolution = NULL; MimicResEnum resolution; + Tcl_HashEntry *hPtr = NULL; + int newHash; // We verify the arguments @@ -209,7 +127,7 @@ if ( objc == 3) { // Set the requested name and see if it exists... req_name = Tcl_GetStringFromObj(objv[2], NULL); - if (Webcamsn_lstGetItem(req_name) == NULL) { + if (Tcl_FindHashEntry(Codecs, req_name) == NULL) { strcpy(name, req_name); }else { sprintf(name, "encoder%d", ++encoder_counter); @@ -226,8 +144,9 @@ mimic_encoder_init(new_encoder->codec, resolution); + hPtr = Tcl_CreateHashEntry(Codecs, name, &newHash); + Tcl_SetHashValue(hPtr, (ClientData) new_encoder); - Webcamsn_lstAddItem(new_encoder); Tcl_ResetResult(interp); Tcl_AppendResult(interp, name, NULL); @@ -252,6 +171,7 @@ BYTE * buffer = NULL; BYTE * FrameData = NULL; BYTE * output = NULL; + Tcl_HashEntry *hPtr = NULL; int length = 0; int width = 0; int height = 0; @@ -264,7 +184,10 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - decoder = Webcamsn_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Codecs, name); + if (hPtr != NULL) { + decoder = (CodecInfo *) Tcl_GetHashValue(hPtr); + } if (!decoder) { Tcl_AppendResult (interp, "Invalid decoder : " , name, (char *) NULL); @@ -372,6 +295,7 @@ BYTE * buffer = NULL; BYTE * FrameData = NULL; BYTE * output = NULL; + Tcl_HashEntry *hPtr = NULL; int length = 0; int width = 0; int height = 0; @@ -384,7 +308,10 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - encoder = Webcamsn_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Codecs, name); + if (hPtr != NULL) { + encoder = (CodecInfo *) Tcl_GetHashValue(hPtr); + } if (!encoder) { Tcl_AppendResult (interp, "Invalid encoder : " , name, (char *) NULL); @@ -440,6 +367,7 @@ int quality = 0; char * name = NULL; CodecInfo * encoder; + Tcl_HashEntry *hPtr = NULL; // We verify the arguments if( objc != 3) { @@ -449,7 +377,10 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - encoder = Webcamsn_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Codecs, name); + if (hPtr != NULL) { + encoder = (CodecInfo *) Tcl_GetHashValue(hPtr); + } if (!encoder) { Tcl_AppendResult (interp, "Invalid encoder : " , name, (char *) NULL); @@ -483,6 +414,7 @@ char * name = NULL; CodecInfo * codec; + Tcl_HashEntry *hPtr = NULL; // We verify the arguments if( objc != 2) { @@ -492,8 +424,12 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - codec = Webcamsn_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Codecs, name); + if (hPtr != NULL) { + codec = (CodecInfo *) Tcl_GetHashValue(hPtr); + } + if (!codec) { Tcl_AppendResult (interp, "Invalid encoder/decoder : " , name, (char *) NULL); return TCL_ERROR; @@ -523,6 +459,7 @@ char * name = NULL; CodecInfo * codec; + Tcl_HashEntry *hPtr = NULL; // We verify the arguments if( objc != 2) { @@ -532,8 +469,12 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - codec = Webcamsn_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Codecs, name); + if (hPtr != NULL) { + codec = (CodecInfo *) Tcl_GetHashValue(hPtr); + } + if (!codec) { Tcl_AppendResult (interp, "Invalid encoder/decoder : " , name, (char *) NULL); return TCL_ERROR; @@ -566,6 +507,7 @@ char * name = NULL; CodecInfo * codec; + Tcl_HashEntry *hPtr = NULL; // We verify the arguments if( objc != 2) { @@ -575,8 +517,12 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - codec = Webcamsn_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Codecs, name); + if (hPtr != NULL) { + codec = (CodecInfo *) Tcl_GetHashValue(hPtr); + } + if (!codec) { Tcl_AppendResult (interp, "Invalid encoder/decoder : " , name, (char *) NULL); return TCL_ERROR; @@ -607,6 +553,7 @@ { char * name = NULL; CodecInfo * codec; + Tcl_HashEntry *hPtr = NULL; // We verify the arguments if( objc != 2) { @@ -616,15 +563,19 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - codec = Webcamsn_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Codecs, name); + if (hPtr != NULL) { + codec = (CodecInfo *) Tcl_GetHashValue(hPtr); + } + if (!codec) { Tcl_AppendResult (interp, "Invalid encoder/decoder : " , name, (char *) NULL); return TCL_ERROR; } mimic_close(codec->codec); - Webcamsn_lstDeleteItem(name); + Tcl_DeleteHashEntry(hPtr); free(codec); return TCL_OK; @@ -637,8 +588,16 @@ int objc, Tcl_Obj *CONST objv[])) { + Tcl_HashSearch searchPtr; + Tcl_HashEntry *hPtr = NULL; + int count = 0; - Tcl_SetObjResult(interp, Tcl_NewIntObj(Webcamsn_lstListSize())); + for (hPtr = Tcl_FirstHashEntry(Codecs, &searchPtr); hPtr; + hPtr = Tcl_NextHashEntry(&searchPtr)) { + count++; + } + + Tcl_SetObjResult(interp, Tcl_NewIntObj(count)); return TCL_OK; } @@ -650,6 +609,7 @@ char * name = NULL; CodecInfo * codec; + Tcl_HashEntry *hPtr = NULL; // We verify the arguments if( objc != 2) { @@ -659,8 +619,12 @@ name = Tcl_GetStringFromObj(objv[1], NULL); - codec = Webcamsn_lstGetItem(name); + hPtr = Tcl_FindHashEntry(Codecs, name); + if (hPtr != NULL) { + codec = (CodecInfo *) Tcl_GetHashValue(hPtr); + } + if (!codec) { Tcl_AppendResult (interp, "Invalid encoder/decoder : " , name, (char *) NULL); return TCL_ERROR; @@ -741,6 +705,9 @@ return TCL_ERROR; } + Codecs = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable)); + Tcl_InitHashTable(Codecs, TCL_STRING_KEYS); + // Create the wrapping commands in the Webcamsn namespace linked to custom functions with a NULL clientdata and // no deleteproc inside the current interpreter Modified: trunk/amsn/utils/webcamsn/src/webcamsn.h =================================================================== --- trunk/amsn/utils/webcamsn/src/webcamsn.h 2008-04-04 22:49:16 UTC (rev 9690) +++ trunk/amsn/utils/webcamsn/src/webcamsn.h 2008-04-05 05:45:09 UTC (rev 9691) @@ -85,9 +85,6 @@ typedef struct CodecInfo CodecInfo; -#define g_list Codecs -#define data_item CodecInfo -#define list_element_id name #define MAX_INTERFRAMES 15 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |