diff options
author | Simo Sorce <ssorce@redhat.com> | 2009-04-07 14:25:28 -0400 |
---|---|---|
committer | Simo Sorce <ssorce@redhat.com> | 2009-04-07 14:25:28 -0400 |
commit | 7e0e2529c6b59e092317c9f4a95316b72e999336 (patch) | |
tree | c2f3ba654f5c05fd2a5f0e9d9fc182154a81651b /common | |
parent | 2f2e7ac94c86ced957a0232e368985ba8c8f59e7 (diff) | |
download | sssd-7e0e2529c6b59e092317c9f4a95316b72e999336.tar.gz sssd-7e0e2529c6b59e092317c9f4a95316b72e999336.tar.xz sssd-7e0e2529c6b59e092317c9f4a95316b72e999336.zip |
Style fixes for /common
Diffstat (limited to 'common')
-rw-r--r-- | common/collection/collection.c | 1743 | ||||
-rw-r--r-- | common/collection/collection.h | 327 | ||||
-rw-r--r-- | common/collection/collection_priv.h | 2 | ||||
-rw-r--r-- | common/collection/collection_tools.c | 585 | ||||
-rw-r--r-- | common/ini/ini_config.c | 863 | ||||
-rw-r--r-- | common/trace/trace.h | 75 |
6 files changed, 1977 insertions, 1618 deletions
diff --git a/common/collection/collection.c b/common/collection/collection.c index 4a5b50443..79e4421ff 100644 --- a/common/collection/collection.c +++ b/common/collection/collection.c @@ -89,27 +89,27 @@ typedef int (*internal_item_fn)(struct collection_item *head, void *custom_data, int *stop); -/******************** SUPPLIMENTARY FUNCTIONS ****************************/ +/******************** SUPPLEMENTARY FUNCTIONS ****************************/ /* BASIC OPERATIONS */ /* Function that checks if property can be added */ static int validate_property(char *property) { - TRACE_FLOW_STRING("validate_property","Entry point."); + TRACE_FLOW_STRING("validate_property", "Entry point."); /* Only alpha numeric characters are allowed in names of the properties */ int invalid = 0; char *check; check = property; - while(*check != '\0') { - if((!isalnum((int)(*check))) && (!ispunct((int)(*check)))) { + while (*check != '\0') { + if ((!isalnum(*check)) && (!ispunct(*check))) { invalid = 1; break; } check++; } - TRACE_FLOW_NUMBER("validate_property. Returning ",invalid); + TRACE_FLOW_NUMBER("validate_property. Returning ", invalid); return invalid; } @@ -120,10 +120,10 @@ static void delete_item(struct collection_item *item) { TRACE_FLOW_STRING("delete_item","Entry point."); - if(item == (struct collection_item *)NULL) return; + if (item == NULL) return; - if(item->property != NULL) free(item->property); - if(item->data != NULL) free(item->data); + if (item->property != NULL) free(item->property); + if (item->data != NULL) free(item->data); free(item); @@ -131,42 +131,43 @@ static void delete_item(struct collection_item *item) } /* A generic function to allocate a property item */ -static int allocate_item(struct collection_item **ci,char *property,void *item_data,int length, int type) +static int allocate_item(struct collection_item **ci, char *property, + void *item_data,int length, int type) { struct collection_item *item = NULL; int error = 0; errno = 0; - TRACE_FLOW_STRING("allocate_item","Entry point."); - TRACE_INFO_NUMBER("Will be using type:",type); + TRACE_FLOW_STRING("allocate_item", "Entry point."); + TRACE_INFO_NUMBER("Will be using type:", type); /* Check the length */ - if(length >= COL_MAX_DATA) { - TRACE_ERROR_STRING("allocate_item","Data to long."); + if (length >= COL_MAX_DATA) { + TRACE_ERROR_STRING("allocate_item", "Data to long."); return EMSGSIZE; } - if(validate_property(property)) { - TRACE_ERROR_STRING("Invalid chracters in the property name",property); + if (validate_property(property)) { + TRACE_ERROR_STRING("Invalid chracters in the property name", property); return EINVAL; } /* Allocate memory for the structure */ - item = (struct collection_item *)(malloc(sizeof(struct collection_item))); - if(item == (struct collection_item *)(NULL)) { + item = (struct collection_item *)malloc(sizeof(struct collection_item)); + if (item == NULL) { error = errno; - TRACE_ERROR_STRING("allocate_item","Malloc failed."); + TRACE_ERROR_STRING("allocate_item", "Malloc failed."); return error; } /* After we initialize "next" we can use delete_item() in case of error */ - item->next = (struct collection_item *)(NULL); + item->next = NULL; /* Copy property */ item->property = strdup(property); - if(item->property == NULL) { + if (item->property == NULL) { error = errno; - TRACE_ERROR_STRING("allocate_item","Failed to dup property."); + TRACE_ERROR_STRING("allocate_item", "Failed to dup property."); delete_item(item); return error; } @@ -175,71 +176,74 @@ static int allocate_item(struct collection_item **ci,char *property,void *item_d /* Deal with data */ item->data = malloc(length); - if(item->data == NULL) { - TRACE_ERROR_STRING("allocate_item","Failed to dup data."); + if (item->data == NULL) { + TRACE_ERROR_STRING("allocate_item", "Failed to dup data."); delete_item(item); return errno; } - memcpy(item->data,item_data,length); + memcpy(item->data, item_data, length); /* Deal with other properties of the item */ - TRACE_INFO_NUMBER("About to set type to:",type); + TRACE_INFO_NUMBER("About to set type to:", type); item->type = type; item->length = length; /* Make sure that data is NULL terminated in case of string */ - if(type == COL_TYPE_STRING) *(((char *)(item->data))+length-1) = '\0'; + if (type == COL_TYPE_STRING) ((char *)(item->data))[length-1] = '\0'; *ci = item; - TRACE_INFO_STRING("Item property",item->property); - TRACE_INFO_NUMBER("Item property type",item->type); - TRACE_INFO_NUMBER("Item data length",item->length); - TRACE_FLOW_STRING("allocate_item","Success exit."); + TRACE_INFO_STRING("Item property", item->property); + TRACE_INFO_NUMBER("Item property type", item->type); + TRACE_INFO_NUMBER("Item data length", item->length); + TRACE_FLOW_STRING("allocate_item", "Success exit."); return 0; } /* Add item to the end of collection */ /* Can add itself to itself - nice...*/ -static int add_item_to_collection(struct collection_item *collection,struct collection_item *item) +static int add_item_to_collection(struct collection_item *collection, + struct collection_item *item) { struct collection_header *header; - TRACE_FLOW_STRING("add_item_to_collection","Entry point."); + TRACE_FLOW_STRING("add_item_to_collection", "Entry point."); - if(collection == (struct collection_item *)(NULL)) { - TRACE_INFO_STRING("add_item_to_collection","Collection accepting is NULL"); - if((item != (struct collection_item *)(NULL)) && - (item->type == COL_TYPE_COLLECTION)) { + if (collection == NULL) { + TRACE_INFO_STRING("add_item_to_collection", + "Collection accepting is NULL"); + if ((item != NULL) && (item->type == COL_TYPE_COLLECTION)) { /* This is a special case of self creation */ - TRACE_INFO_STRING("add_item_to_collection","Adding header item to new collection."); + TRACE_INFO_STRING("add_item_to_collection", + "Adding header item to new collection."); collection = item; } } /* We can add items only to collections */ - if(collection->type != COL_TYPE_COLLECTION) { - TRACE_ERROR_STRING("add_item_to_collection","Attempt to add item to non collection."); - TRACE_ERROR_STRING("Collection name:",collection->property); - TRACE_ERROR_NUMBER("Collection type:",collection->type); + if (collection->type != COL_TYPE_COLLECTION) { + TRACE_ERROR_STRING("add_item_to_collection", + "Attempt to add item to non collection."); + TRACE_ERROR_STRING("Collection name:", collection->property); + TRACE_ERROR_NUMBER("Collection type:", collection->type); return EINVAL; } - header = (struct collection_header *)(collection->data); + header = (struct collection_header *)collection->data; /* Link new item to the last item in the list if there any */ - if(header->last != (struct collection_item *)(NULL)) (header->last)->next = item; + if (header->last != NULL) header->last->next = item; /* Make sure we save a new last element */ header->last = item; header->count++; - TRACE_INFO_STRING("Collection:",collection->property); - TRACE_INFO_STRING("Just added item is:",item->property); - TRACE_INFO_NUMBER("Item type.",item->type); - TRACE_INFO_NUMBER("Number of items in collection now is.",header->count); + TRACE_INFO_STRING("Collection:", collection->property); + TRACE_INFO_STRING("Just added item is:", item->property); + TRACE_INFO_NUMBER("Item type.", item->type); + TRACE_INFO_NUMBER("Number of items in collection now is.", header->count); - TRACE_FLOW_STRING("add_item_to_collection","Success exit."); + TRACE_FLOW_STRING("add_item_to_collection", "Success exit."); return EOK; } @@ -255,15 +259,15 @@ inline static int is_in_item_handler(char *property, void *found, int *dummy) { - TRACE_FLOW_STRING("is_in_item_handler","Entry."); - TRACE_INFO_STRING("Property:",property); - TRACE_INFO_NUMBER("Property length:",property_len); - TRACE_INFO_NUMBER("Type:",type); - TRACE_INFO_NUMBER("Length:",length); + TRACE_FLOW_STRING("is_in_item_handler", "Entry."); + TRACE_INFO_STRING("Property:", property); + TRACE_INFO_NUMBER("Property length:", property_len); + TRACE_INFO_NUMBER("Type:", type); + TRACE_INFO_NUMBER("Length:", length); *((int *)(found)) = COL_MATCH; - TRACE_FLOW_STRING("is_in_item_handler","Success Exit."); + TRACE_FLOW_STRING("is_in_item_handler", "Success Exit."); return EOK; } @@ -277,11 +281,11 @@ inline static int get_subcollection(char *property, void *found, int *dummy) { - TRACE_FLOW_STRING("get_subcollection","Entry."); - TRACE_INFO_STRING("Property:",property); - TRACE_INFO_NUMBER("Property length:",property_len); - TRACE_INFO_NUMBER("Type:",type); - TRACE_INFO_NUMBER("Length:",length); + TRACE_FLOW_STRING("get_subcollection", "Entry."); + TRACE_INFO_STRING("Property:", property); + TRACE_INFO_NUMBER("Property length:", property_len); + TRACE_INFO_NUMBER("Type:", type); + TRACE_INFO_NUMBER("Length:", length); *((struct collection_item **)(found)) = *((struct collection_item **)(data)); @@ -294,7 +298,8 @@ inline static int get_subcollection(char *property, /* ADD PROPERTY */ -/* Add a single property to a collection. Returns a pointer to a newly allocated property */ +/* Add a single property to a collection. + * Returns a pointer to a newly allocated property */ static struct collection_item *add_property(struct collection_item *collection, char *subcollection, char *property, @@ -303,63 +308,68 @@ static struct collection_item *add_property(struct collection_item *collection, int type, int *error) { - struct collection_item *item = (struct collection_item *) NULL; - struct collection_item *acceptor = (struct collection_item *)(NULL); + struct collection_item *item = NULL; + struct collection_item *acceptor = NULL; - TRACE_FLOW_STRING("add_property","Entry."); + TRACE_FLOW_STRING("add_property", "Entry."); /* Allocate item */ - TRACE_INFO_NUMBER("Property type to add",type); - *error = allocate_item(&item,property,item_data,length, type); - if(*error) return (struct collection_item *)(NULL); + TRACE_INFO_NUMBER("Property type to add", type); + *error = allocate_item(&item, property, item_data, length, type); + if (*error) return NULL; - TRACE_INFO_STRING("Created item:",item->property); - TRACE_INFO_NUMBER("Item has type:",item->type); + TRACE_INFO_STRING("Created item:", item->property); + TRACE_INFO_NUMBER("Item has type:", item->type); /* Add item to collection */ - if(subcollection == NULL) acceptor = collection; + if (subcollection == NULL) { + acceptor = collection; + } else { - TRACE_INFO_STRING("Subcollection id not null, searching",subcollection); - *error = find_item_and_do(collection, subcollection, COL_TYPE_COLLECTIONREF, + TRACE_INFO_STRING("Subcollection id not null, searching", subcollection); + *error = find_item_and_do(collection, subcollection, + COL_TYPE_COLLECTIONREF, COL_TRAVERSE_DEFAULT, - get_subcollection,(void *)(&acceptor),COLLECTION_ACTION_FIND); - if(*error) { - TRACE_ERROR_NUMBER("Search for subcollection returned error:",*error); + get_subcollection, (void *)(&acceptor), + COLLECTION_ACTION_FIND); + if (*error) { + TRACE_ERROR_NUMBER("Search for subcollection returned error:", *error); delete_item(item); - return (struct collection_item *)(NULL); + return NULL; } - if(acceptor == (struct collection_item *)(NULL)) { - TRACE_ERROR_STRING("Search for subcollection returned NULL pointer",""); + if (acceptor == NULL) { + TRACE_ERROR_STRING("Search for subcollection returned NULL pointer", ""); delete_item(item); - *error=ENOENT; - return (struct collection_item *)(NULL); + *error = ENOENT; + return NULL; } } - *error = add_item_to_collection(acceptor,item); - if(*error) { - TRACE_ERROR_NUMBER("Failed to add item to collection error:",*error); + *error = add_item_to_collection(acceptor, item); + if (*error) { + TRACE_ERROR_NUMBER("Failed to add item to collection error:", *error); delete_item(item); - return (struct collection_item *)(NULL); + return NULL; } - TRACE_FLOW_STRING("add_property","Success Exit."); + TRACE_FLOW_STRING("add_property", "Success Exit."); return item; } /* CLEANUP */ /* Cleans the collection tree including current item. */ -/* After the execution passed in variable should not be used - memory is gone!!! */ +/* The passed in variable should not be used after the call + * as memory is freed!!! */ static void delete_collection(struct collection_item *ci) { struct collection_item *other_collection; - TRACE_FLOW_STRING("delete_collection","Entry."); + TRACE_FLOW_STRING("delete_collection", "Entry."); - if(ci == (struct collection_item *)(NULL)) { - TRACE_FLOW_STRING("delete_collection","Nothing to do Exit."); + if (ci == NULL) { + TRACE_FLOW_STRING("delete_collection", "Nothing to do Exit."); return; } @@ -369,14 +379,15 @@ static void delete_collection(struct collection_item *ci) /* Handle external or embedded collection */ if(ci->type == COL_TYPE_COLLECTIONREF) { - /* Our data is a pointer to a whole external collection so dereference it or delete */ + /* Our data is a pointer to a whole external collection so dereference + * it or delete */ other_collection = *((struct collection_item **)(ci->data)); destroy_collection(other_collection); } /* Delete this item */ delete_item(ci); - TRACE_FLOW_STRING("delete_collection","Exit."); + TRACE_FLOW_STRING("delete_collection", "Exit."); } @@ -408,21 +419,21 @@ static int create_path_data(struct path_data **name_path, int error = EOK; struct path_data *new_name_path; - TRACE_FLOW_STRING("create_path_data","Entry."); + TRACE_FLOW_STRING("create_path_data", "Entry."); - TRACE_INFO_STRING("Constructing path from name:",name); - TRACE_INFO_STRING("Constructing path from property:",property); + TRACE_INFO_STRING("Constructing path from name:", name); + TRACE_INFO_STRING("Constructing path from property:", property); /* Allocate structure */ errno = 0; - new_name_path = (struct path_data *)(malloc(sizeof(struct path_data))); - if(new_name_path == (struct path_data *)(NULL)) return errno; + new_name_path = (struct path_data *)malloc(sizeof(struct path_data)); + if (new_name_path == NULL) return errno; - new_name_path->name=malloc(length+property_len+2); - if(new_name_path->name == NULL) { + new_name_path->name = malloc(length + property_len + 2); + if (new_name_path->name == NULL) { error = errno; - TRACE_ERROR_NUMBER("Failed to allocate memory for new path name. Errno",error); - free((void *)(new_name_path)); + TRACE_ERROR_NUMBER("Failed to allocate memory for new path name. Errno", error); + free(new_name_path); return error; } @@ -430,26 +441,26 @@ static int create_path_data(struct path_data **name_path, new_name_path->length = 0; if(length > 0) { - memcpy(new_name_path->name,name,length); + memcpy(new_name_path->name, name, length); new_name_path->length = length; - *(new_name_path->name+new_name_path->length) = '.'; + new_name_path->name[new_name_path->length] = '.'; new_name_path->length++; - *(new_name_path->name+new_name_path->length) = '\0'; - TRACE_INFO_STRING("Name so far:",new_name_path->name); - TRACE_INFO_NUMBER("Len so far:",new_name_path->length); + new_name_path->name[new_name_path->length] = '\0'; + TRACE_INFO_STRING("Name so far:", new_name_path->name); + TRACE_INFO_NUMBER("Len so far:", new_name_path->length); } - memcpy(new_name_path->name+new_name_path->length,property,property_len); + memcpy(&new_name_path->name[new_name_path->length], property, property_len); new_name_path->length += property_len; - *(new_name_path->name + new_name_path->length) = '\0'; + new_name_path->name[new_name_path->length] = '\0'; /* Link to the chain */ new_name_path->previous_path = *name_path; *name_path = new_name_path; - TRACE_INFO_STRING("Constructed path",new_name_path->name); + TRACE_INFO_STRING("Constructed path", new_name_path->name); - TRACE_FLOW_NUMBER("create_path_data. Returning:",error); + TRACE_FLOW_NUMBER("create_path_data. Returning:", error); return error; } @@ -462,13 +473,14 @@ static int match_item(struct collection_item *current, char *start; char *data_str; - TRACE_FLOW_STRING("match_item","Entry"); + TRACE_FLOW_STRING("match_item", "Entry"); - if(traverse_data->type_to_match & current->type) { + if (traverse_data->type_to_match & current->type) { /* Check if there is any value to match */ - if((traverse_data->name_to_find == NULL) || - (*(traverse_data->name_to_find) == '\0')) { - TRACE_INFO_STRING("match_item","Returning MATCH because there is no search criteria!"); + if ((traverse_data->name_to_find == NULL) || + (*(traverse_data->name_to_find) == '\0')) { + TRACE_INFO_STRING("match_item", + "Returning MATCH because there is no search criteria!"); return COL_MATCH; } @@ -477,26 +489,27 @@ static int match_item(struct collection_item *current, start = current->property; data_str = start + current->property_len; - TRACE_INFO_STRING("Searching for:",traverse_data->name_to_find); - TRACE_INFO_STRING("Item name:",current->property); - TRACE_INFO_STRING("Current path:",traverse_data->current_path->name); - TRACE_INFO_NUMBER("Searching:",toupper(*find_str)); - TRACE_INFO_NUMBER("Have:",toupper(*data_str)); + TRACE_INFO_STRING("Searching for:", traverse_data->name_to_find); + TRACE_INFO_STRING("Item name:", current->property); + TRACE_INFO_STRING("Current path:", traverse_data->current_path->name); + TRACE_INFO_NUMBER("Searching:", toupper(*find_str)); + TRACE_INFO_NUMBER("Have:", toupper(*data_str)); /* We start pointing to 0 so the loop will be executed at least once */ - while(toupper(*data_str) == toupper(*find_str)) { + while (toupper(*data_str) == toupper(*find_str)) { TRACE_INFO_STRING("Loop iteration:",""); - if(data_str == start) { - if(find_str > traverse_data->name_to_find) { - if(*(find_str-1) == '.') { - /* We matched the property but the search string is longer */ - /* so we need to continue matching */ - TRACE_INFO_STRING("match_item","Need to continue matching"); + if (data_str == start) { + if (find_str > traverse_data->name_to_find) { + if (*(find_str-1) == '.') { + /* We matched the property but the search string is + * longer so we need to continue matching */ + TRACE_INFO_STRING("match_item", + "Need to continue matching"); start = traverse_data->current_path->name; - data_str = start + traverse_data->current_path->length - 1; - find_str-=2; + data_str = &start[traverse_data->current_path->length - 1]; + find_str -= 2; continue; } else { @@ -509,13 +522,13 @@ static int match_item(struct collection_item *current, return COL_MATCH; } } - else if((find_str == traverse_data->name_to_find) && - (*(data_str-1) == '.')) return COL_MATCH; + else if ((find_str == traverse_data->name_to_find) && + (*(data_str-1) == '.')) return COL_MATCH; data_str--; find_str--; - TRACE_INFO_NUMBER("Searching:",toupper(*find_str)); - TRACE_INFO_NUMBER("Have:",toupper(*data_str)); + TRACE_INFO_NUMBER("Searching:", toupper(*find_str)); + TRACE_INFO_NUMBER("Have:", toupper(*data_str)); } } @@ -530,20 +543,21 @@ static void delete_path_data(struct path_data *path) { TRACE_FLOW_STRING("delete_path_data","Entry."); - if(path!= (struct path_data *)(NULL)) { - TRACE_INFO_STRING("delete_path_data","Item to delete exits."); - if(path->previous_path != (struct path_data *)(NULL)) { - TRACE_INFO_STRING("delete_path_data","But previous item to delete exits to. Nesting."); + if (path != NULL) { + TRACE_INFO_STRING("delete_path_data", "Item to delete exits."); + if (path->previous_path != NULL) { + TRACE_INFO_STRING("delete_path_data", + "But previous item to delete exits to. Nesting."); delete_path_data(path->previous_path); } - if(path->name != NULL) { - TRACE_INFO_STRING("delete_path_data Deleting path:",path->name); + if (path->name != NULL) { + TRACE_INFO_STRING("delete_path_data Deleting path:", path->name); free(path->name); } - TRACE_INFO_STRING("delete_path_data","Deleting path element"); - free((void *)(path)); + TRACE_INFO_STRING("delete_path_data", "Deleting path element"); + free(path); } - TRACE_FLOW_STRING("delete_path_data","Exit"); + TRACE_FLOW_STRING("delete_path_data", "Exit"); } @@ -567,71 +581,75 @@ static int walk_items(struct collection_item *ci, int stop = 0; int error = EOK; - TRACE_FLOW_STRING("walk_items","Entry."); - TRACE_INFO_NUMBER("Mode flags:",mode_flags); + TRACE_FLOW_STRING("walk_items", "Entry."); + TRACE_INFO_NUMBER("Mode flags:", mode_flags); current = ci; - while(current != (struct collection_item *)(NULL)) { + while (current) { - TRACE_INFO_STRING("Processing item:",current->property); - TRACE_INFO_NUMBER("Item type:",current->type); + TRACE_INFO_STRING("Processing item:", current->property); + TRACE_INFO_NUMBER("Item type:", current->type); - if(current->type == COL_TYPE_COLLECTIONREF) { + if (current->type == COL_TYPE_COLLECTIONREF) { - TRACE_INFO_STRING("Subcollection:",current->property); + TRACE_INFO_STRING("Subcollection:", current->property); - if((mode_flags & COL_TRAVERSE_IGNORE) == 0) { + if ((mode_flags & COL_TRAVERSE_IGNORE) == 0) { - TRACE_INFO_STRING("Subcollection is not ignored.",""); + TRACE_INFO_STRING("Subcollection is not ignored.", ""); /* We are not ignoring sub collections */ - error = traverse_handler(ci,parent,current,traverse_data,user_item_handler,custom_data,&stop); - if(stop != 0) { - TRACE_INFO_STRING("Traverse handler returned STOP.",""); + error = traverse_handler(ci, parent, current, traverse_data, + user_item_handler, custom_data, &stop); + if (stop != 0) { + TRACE_INFO_STRING("Traverse handler returned STOP.", ""); error = EINTR_INTERNAL; } /* Check what error we got */ - if(error == EINTR_INTERNAL) { - TRACE_FLOW_NUMBER("Internal error - means we are stopping.",error); + if (error == EINTR_INTERNAL) { + TRACE_FLOW_NUMBER("Internal error - means we are stopping.", error); return error; } - else if(error) { - TRACE_ERROR_NUMBER("Traverse handler returned error.",error); + else if (error) { + TRACE_ERROR_NUMBER("Traverse handler returned error.", error); return error; } - if((mode_flags & COL_TRAVERSE_ONELEVEL) == 0) { + if ((mode_flags & COL_TRAVERSE_ONELEVEL) == 0) { TRACE_INFO_STRING("Before diving into sub collection",""); sub = *((struct collection_item **)(current->data)); - TRACE_INFO_STRING("Sub collection name",sub->property); - TRACE_INFO_NUMBER("Header type",sub->type); + TRACE_INFO_STRING("Sub collection name", sub->property); + TRACE_INFO_NUMBER("Header type", sub->type); /* We need to go into sub collections */ - error = walk_items(sub, mode_flags,traverse_handler,traverse_data, + error = walk_items(sub, mode_flags, + traverse_handler, traverse_data, user_item_handler, custom_data); - TRACE_INFO_STRING("Returned from sub collection processing",""); - TRACE_INFO_STRING("Done processing item:",current->property); - TRACE_INFO_NUMBER("Done processing item type:",current->type); + TRACE_INFO_STRING("Returned from sub collection processing", ""); + TRACE_INFO_STRING("Done processing item:", current->property); + TRACE_INFO_NUMBER("Done processing item type:", current->type); } } } else /* Call handler then move on */ - error = traverse_handler(ci,parent,current,traverse_data,user_item_handler,custom_data,&stop); + error = traverse_handler(ci, parent, current, + traverse_data, user_item_handler, + custom_data, &stop); /* If we are stopped - return EINTR_INTERNAL */ - if(stop != 0) { - TRACE_INFO_STRING("Traverse handler returned STOP.",""); + if (stop != 0) { + TRACE_INFO_STRING("Traverse handler returned STOP.", ""); error = EINTR_INTERNAL; } /* Check what error we got */ - if(error == EINTR_INTERNAL) { - TRACE_FLOW_NUMBER("Internal error - means we are stopping.",error); + if (error == EINTR_INTERNAL) { + TRACE_FLOW_NUMBER("Internal error - means we are stopping.", error); return error; } - else if(error) { - TRACE_ERROR_NUMBER("Traverse handler returned error.",error); + else if (error) { + TRACE_ERROR_NUMBER("Traverse handler returned error.", error); return error; } @@ -640,14 +658,16 @@ static int walk_items(struct collection_item *ci, } - TRACE_INFO_STRING("Out of loop",""); + TRACE_INFO_STRING("Out of loop", ""); - if((mode_flags & COL_TRAVERSE_END) != 0) { - TRACE_INFO_STRING("About to do the special end collection invocation of handler",""); - error = traverse_handler(ci,parent,current,traverse_data,user_item_handler,custom_data,&stop); + if ((mode_flags & COL_TRAVERSE_END) != 0) { + TRACE_INFO_STRING("About to do the special end collection invocation of handler", ""); + error = traverse_handler(ci, parent, current, + traverse_data, user_item_handler, + custom_data, &stop); } - TRACE_FLOW_NUMBER("walk_items. Returns: ",error); + TRACE_FLOW_NUMBER("walk_items. Returns: ", error); return error; } @@ -670,62 +690,64 @@ static int find_item_and_do(struct collection_item *ci, int error = EOK; struct find_name *traverse_data = NULL; - TRACE_FLOW_STRING("find_item_and_do","Entry."); + TRACE_FLOW_STRING("find_item_and_do", "Entry."); /* Item handler is always required */ - if((item_handler == (item_fn)(NULL)) && (action ==COLLECTION_ACTION_FIND)) { - TRACE_ERROR_NUMBER("No item handler - returning error!",EINVAL); + if ((item_handler == NULL) && + (action == COLLECTION_ACTION_FIND)) { + TRACE_ERROR_NUMBER("No item handler - returning error!", EINVAL); return EINVAL; } /* Make sure that there is anything to search */ type &= COL_TYPE_ANY; - if((ci == (struct collection_item *)(NULL)) || - ((property_to_find == NULL) && (type == 0)) || - ((*property_to_find == '\0') && (type == 0))) { - TRACE_ERROR_NUMBER("No item search criteria specified - returning error!",ENOKEY); + if ((ci == NULL) || + ((property_to_find == NULL) && (type == 0)) || + ((*property_to_find == '\0') && (type == 0))) { + TRACE_ERROR_NUMBER("No item search criteria specified - returning error!", ENOKEY); return ENOKEY; } /* Prepare data for traversal */ errno = 0; - traverse_data= (struct find_name *)(malloc(sizeof(struct find_name))); - if(traverse_data == (struct find_name *)(NULL)) { + traverse_data= (struct find_name *)malloc(sizeof(struct find_name)); + if (traverse_data == NULL) { error = errno; - TRACE_ERROR_NUMBER("Failed to allocate traverse data memory - returning error!",errno); + TRACE_ERROR_NUMBER("Failed to allocate traverse data memory - returning error!", errno); return error; } - TRACE_INFO_STRING("find_item_and_do","Filling in traverse data."); + TRACE_INFO_STRING("find_item_and_do", "Filling in traverse data."); traverse_data->name_to_find = property_to_find; traverse_data->name_len_to_find = strlen(property_to_find); traverse_data->type_to_match = type; traverse_data->given_name = NULL; traverse_data->given_len = 0; - traverse_data->current_path = (struct path_data *)(NULL); + traverse_data->current_path = NULL; traverse_data->action = action; mode_flags |= COL_TRAVERSE_END; - TRACE_INFO_STRING("find_item_and_do","About to walk the tree."); - TRACE_INFO_NUMBER("Traverse flags",mode_flags); + TRACE_INFO_STRING("find_item_and_do", "About to walk the tree."); + TRACE_INFO_NUMBER("Traverse flags", mode_flags); error = walk_items(ci, mode_flags, act_traverse_handler, (void *)traverse_data, item_handler, custom_data); - if(traverse_data->current_path != (struct path_data *)(NULL)) { - TRACE_INFO_STRING("find_item_and_do","Path was not cleared - deleting"); + if (traverse_data->current_path != NULL) { + TRACE_INFO_STRING("find_item_and_do", + "Path was not cleared - deleting"); delete_path_data(traverse_data->current_path); } - free((void *)(traverse_data)); + free(traverse_data); - if((error) && (error != EINTR_INTERNAL)) { - TRACE_ERROR_NUMBER("Walk items returned error. Returning: ",error); + if (error && (error != EINTR_INTERNAL)) { + TRACE_ERROR_NUMBER("Walk items returned error. Returning: ", error); return error; } else { - TRACE_FLOW_STRING("Walk items returned SUCCESS.",""); + TRACE_FLOW_STRING("Walk items returned SUCCESS.", ""); return EOK; } } @@ -734,30 +756,33 @@ static int find_item_and_do(struct collection_item *ci, static int update_current_item(struct collection_item *current, struct update_property *update_data) { - TRACE_FLOW_STRING("update_current_item","Entry"); + TRACE_FLOW_STRING("update_current_item", "Entry"); - /* If type is different or same but it is string or binary we need to replace the storage */ - if((current->type != update_data->type) || - ((current->type == update_data->type) && - ((current->type == COL_TYPE_STRING) || (current->type == COL_TYPE_BINARY)))) { - TRACE_INFO_STRING("Replacing item data buffer",""); + /* If type is different or same but it is string or binary we need to + * replace the storage */ + if ((current->type != update_data->type) || + ((current->type == update_data->type) && + ((current->type == COL_TYPE_STRING) || + (current->type == COL_TYPE_BINARY)))) { + TRACE_INFO_STRING("Replacing item data buffer", ""); free(current->data); current->data = malloc(update_data->length); - if(current->data == NULL) { - TRACE_ERROR_STRING("Failed to allocate memory",""); + if (current->data == NULL) { + TRACE_ERROR_STRING("Failed to allocate memory", ""); current->length = 0; return ENOMEM; } current->length = update_data->length; } - TRACE_INFO_STRING("Overwriting item data",""); - memcpy(current->data,update_data->data,current->length); + TRACE_INFO_STRING("Overwriting item data", ""); + memcpy(current->data, update_data->data, current->length); current->type = update_data->type; - if(current->type == COL_TYPE_STRING) *(((char *)(current->data))+current->length-1) = '\0'; + if (current->type == COL_TYPE_STRING) + ((char *)(current->data))[current->length-1] = '\0'; - TRACE_FLOW_STRING("update_current_item","Exit"); + TRACE_FLOW_STRING("update_current_item", "Exit"); return EOK; } @@ -775,9 +800,9 @@ inline static int simple_traverse_handler(struct collection_item *head, { int error = EOK; - TRACE_FLOW_STRING("simple_traverse_handler","Entry."); + TRACE_FLOW_STRING("simple_traverse_handler", "Entry."); - if(current == (struct collection_item *)(NULL)) current = &dummy; + if (current == NULL) current = &dummy; error = user_item_handler(current->property, current->property_len, @@ -787,7 +812,7 @@ inline static int simple_traverse_handler(struct collection_item *head, custom_data, stop); - TRACE_FLOW_NUMBER("simple_traverse_handler. Returning:",error); + TRACE_FLOW_NUMBER("simple_traverse_handler. Returning:", error); return error; } @@ -812,16 +837,17 @@ static int act_traverse_handler(struct collection_item *head, int property_len; struct update_property *update_data; - TRACE_FLOW_STRING("act_traverse_handler","Entry."); + TRACE_FLOW_STRING("act_traverse_handler", "Entry."); - traverse_data = (struct find_name *)(passed_traverse_data); + traverse_data = (struct find_name *)passed_traverse_data; /* We can be called when current points to NULL */ - if(current==(struct collection_item *)(NULL)) { - TRACE_INFO_STRING("act_traverse_handler","Special call at the end of the collection."); + if (current == NULL) { + TRACE_INFO_STRING("act_traverse_handler", + "Special call at the end of the collection."); temp = traverse_data->current_path; traverse_data->current_path = temp->previous_path; - temp->previous_path = (struct path_data *)(NULL); + temp->previous_path = NULL; delete_path_data(temp); traverse_data->given_name = NULL; traverse_data->given_len = 0; @@ -830,24 +856,25 @@ static int act_traverse_handler(struct collection_item *head, } /* Create new path at the beginning of a new sub collection */ - if(current->type == COL_TYPE_COLLECTION) { + if (current->type == COL_TYPE_COLLECTION) { - TRACE_INFO_STRING("act_traverse_handler","Processing collection handle."); + TRACE_INFO_STRING("act_traverse_handler", + "Processing collection handle."); /* Create new path */ - if(traverse_data->current_path != (struct path_data *)(NULL)) { - TRACE_INFO_STRING("Already have part of the path",""); - name = (traverse_data->current_path)->name; - length = (traverse_data->current_path)->length; - TRACE_INFO_STRING("Path:",name); - TRACE_INFO_NUMBER("Path len:",length); + if (traverse_data->current_path != NULL) { + TRACE_INFO_STRING("Already have part of the path", ""); + name = traverse_data->current_path->name; + length = traverse_data->current_path->length; + TRACE_INFO_STRING("Path:", name); + TRACE_INFO_NUMBER("Path len:", length); } else { name = NULL; length = 0; } - if(traverse_data->given_name != NULL) { + if (traverse_data->given_name != NULL) { property = traverse_data->given_name; property_len = traverse_data->given_len; } @@ -856,101 +883,108 @@ static int act_traverse_handler(struct collection_item *head, property_len = current->property_len; } - TRACE_INFO_STRING("act_traverse_handler","About to create path data."); + TRACE_INFO_STRING("act_traverse_handler", "About to create path data."); error = create_path_data(&(traverse_data->current_path), - name, length, property,property_len); + name, length, property, property_len); TRACE_INFO_NUMBER("create_path_data returned:", error); return error; } /* Handle the collection pointers */ - if(current->type == COL_TYPE_COLLECTIONREF) { + if (current->type == COL_TYPE_COLLECTIONREF) { traverse_data->given_name = current->property; traverse_data->given_len = current->property_len; - TRACE_INFO_STRING("Saved given name:",traverse_data->given_name); + TRACE_INFO_STRING("Saved given name:", traverse_data->given_name); } - TRACE_INFO_STRING("Processing item with property:",current->property); + TRACE_INFO_STRING("Processing item with property:", current->property); /* Do here what we do with items */ - if(match_item(current,traverse_data)) { - TRACE_INFO_STRING("Matched item:",current->property); - switch(traverse_data->action) { - case COLLECTION_ACTION_FIND: - TRACE_INFO_STRING("It is a find action - calling handler.",""); - if(user_item_handler != (item_fn)(NULL)) { - /* Call user handler */ - error = user_item_handler(current->property, - current->property_len, - current->type, - current->data, - current->length, - custom_data, - stop); - - TRACE_INFO_NUMBER("Handler returned:",error); - TRACE_INFO_NUMBER("Handler set STOP to:",*stop); + if (match_item(current, traverse_data)) { + TRACE_INFO_STRING("Matched item:", current->property); + switch (traverse_data->action) { + case COLLECTION_ACTION_FIND: + TRACE_INFO_STRING("It is a find action - calling handler.", ""); + if (user_item_handler != NULL) { + /* Call user handler */ + error = user_item_handler(current->property, + current->property_len, + current->type, + current->data, + current->length, + custom_data, + stop); + + TRACE_INFO_NUMBER("Handler returned:", error); + TRACE_INFO_NUMBER("Handler set STOP to:", *stop); - } - break; - case COLLECTION_ACTION_GET: - TRACE_INFO_STRING("It is a get action.",""); - if(custom_data != NULL) *((struct collection_item **)(custom_data)) = current; - break; - case COLLECTION_ACTION_DEL: - TRACE_INFO_STRING("It is a delete action.",""); - /* Make sure we tell the caller we found a match */ - if(custom_data != NULL) *(int *)(custom_data) = COL_MATCH; - /* Dereference external collections */ - if(current->type == COL_TYPE_COLLECTIONREF) { - TRACE_INFO_STRING("Dereferencing a referenced collection.",""); - other = *((struct collection_item **)(current->data)); - header = (struct collection_header *)(other->data); - destroy_collection(other); - } + } + break; - /* Adjust header of the collection */ - header = (struct collection_header *)(head->data); - (header->count)--; - if(current->next == (struct collection_item *)(NULL)) header->last = previous; + case COLLECTION_ACTION_GET: + TRACE_INFO_STRING("It is a get action.", ""); + if (custom_data != NULL) + *((struct collection_item **)(custom_data)) = current; + break; - /* Unlink and delete iteam */ - /* Previous can't be NULL here becuase we never delete header elements */ - previous->next = current->next; - delete_item(current); - TRACE_INFO_STRING("Did the delete of the item.",""); - break; - case COLLECTION_ACTION_UPDATE: - TRACE_INFO_STRING("It is an update action.",""); - if((current->type == COL_TYPE_COLLECTION) || - (current->type == COL_TYPE_COLLECTIONREF)) { - TRACE_ERROR_STRING("Can't update collections it is an error for now",""); - return EINVAL; - } + case COLLECTION_ACTION_DEL: + TRACE_INFO_STRING("It is a delete action.", ""); + /* Make sure we tell the caller we found a match */ + if (custom_data != NULL) + *(int *)custom_data = COL_MATCH; + /* Dereference external collections */ + if (current->type == COL_TYPE_COLLECTIONREF) { + TRACE_INFO_STRING("Dereferencing a referenced collection.", ""); + other = *((struct collection_item **)current->data); + header = (struct collection_header *)other->data; + destroy_collection(other); + } - /* Make sure we tell the caller we found a match */ - if(custom_data != NULL) { - update_data = (struct update_property *) custom_data; - update_data-> found = COL_MATCH; - error = update_current_item(current, update_data); - } - else { - TRACE_ERROR_STRING("Error - update data is required",""); - return EINVAL; - } + /* Adjust header of the collection */ + header = (struct collection_header *)head->data; + header->count--; + if (current->next == NULL) + header->last = previous; + + /* Unlink and delete iteam */ + /* Previous can't be NULL here becuase we never delete + * header elements */ + previous->next = current->next; + delete_item(current); + TRACE_INFO_STRING("Did the delete of the item.", ""); + break; - TRACE_INFO_STRING("Did the delete of the item.",""); - break; - default: - break; + case COLLECTION_ACTION_UPDATE: + TRACE_INFO_STRING("It is an update action.", ""); + if((current->type == COL_TYPE_COLLECTION) || + (current->type == COL_TYPE_COLLECTIONREF)) { + TRACE_ERROR_STRING("Can't update collections it is an error for now", ""); + return EINVAL; + } + + /* Make sure we tell the caller we found a match */ + if (custom_data != NULL) { + update_data = (struct update_property *)custom_data; + update_data->found = COL_MATCH; + error = update_current_item(current, update_data); + } + else { + TRACE_ERROR_STRING("Error - update data is required", ""); + return EINVAL; + } + + TRACE_INFO_STRING("Did the delete of the item.", ""); + break; + default: + break; } /* Force interrupt if we found */ *stop = 1; } - TRACE_FLOW_NUMBER("act_traverse_handler returning",error); + TRACE_FLOW_NUMBER("act_traverse_handler returning", error); return error; } @@ -967,80 +1001,85 @@ static int copy_traverse_handler(struct collection_item *head, int error = EOK; struct collection_item *parent; struct collection_item *item; - struct collection_item *new_collection = (struct collection_item *)(NULL); + struct collection_item *new_collection = NULL; - TRACE_FLOW_STRING("copy_traverse_handler","Entry."); + TRACE_FLOW_STRING("copy_traverse_handler", "Entry."); - parent = (struct collection_item *)(passed_traverse_data); + parent = (struct collection_item *)passed_traverse_data; /* Skip current element but rather work with next if it is not NULL */ item = current->next; - if(item == (struct collection_item *)(NULL)) return error; + if (item == NULL) return error; /* Check if this is a special case of sub collection */ - if(item->type == COL_TYPE_COLLECTIONREF) { - TRACE_INFO_STRING("Found a subcollection we need to copy. Name:",item->property); + if (item->type == COL_TYPE_COLLECTIONREF) { + TRACE_INFO_STRING("Found a subcollection we need to copy. Name:", + item->property); error = copy_collection(&new_collection, *((struct collection_item **)(item->data)), item->property); - if(error) { - TRACE_ERROR_NUMBER("Copy subcollection returned error:",error); + if (error) { + TRACE_ERROR_NUMBER("Copy subcollection returned error:", error); return error; } - /* Add new item to a collection - all references are now sub collections */ - (void)add_property(parent,NULL,item->property,(void *)(&new_collection), - sizeof(struct collection_item **), - COL_TYPE_COLLECTIONREF, &error); - if(error) { - TRACE_ERROR_NUMBER("Add property returned error:",error); + /* Add new item to a collection + * all references are now sub collections */ + add_property(parent, NULL, item->property, + (void *)(&new_collection), + sizeof(struct collection_item **), + COL_TYPE_COLLECTIONREF, &error); + if (error) { + TRACE_ERROR_NUMBER("Add property returned error:", error); return error; } } else { - (void)add_property(parent,NULL,item->property,item->data, - item->length,item->type,&error); - if(error) { - TRACE_ERROR_NUMBER("Add property returned error:",error); + add_property(parent, NULL, item->property, + item->data, item->length, item->type, &error); + if (error) { + TRACE_ERROR_NUMBER("Add property returned error:", error); return error; } } - TRACE_FLOW_NUMBER("copy_traverse_handler returning",error); + TRACE_FLOW_NUMBER("copy_traverse_handler returning", error); return error; } -/********************* MAIN INTERFACE FUNCTIONS ***********************************/ +/********************* MAIN INTERFACE FUNCTIONS *****************************/ /* CREATE */ /* Function that creates an named collection of a given class*/ -int create_collection(struct collection_item **ci,char *name, unsigned class) +int create_collection(struct collection_item **ci, char *name, unsigned cclass) { - struct collection_item *handle = (struct collection_item *)(NULL); + struct collection_item *handle = NULL; struct collection_header header; - int error=EOK; + int error = EOK; - TRACE_FLOW_STRING("create_collection","Entry."); + TRACE_FLOW_STRING("create_collection", "Entry."); /* Prepare header */ - header.last = (struct collection_item *)(NULL); + header.last = NULL; header.reference_count = 1; header.count = 0; - header.class = class; + header.cclass = cclass; /* Create a collection type property */ - handle = add_property((struct collection_item *)(NULL),NULL,name,&header,sizeof(header), COL_TYPE_COLLECTION, &error); - if(error) return error; + handle = add_property(NULL, NULL, name, + &header, sizeof(header), + COL_TYPE_COLLECTION, &error); + if (error) return error; *ci = handle; - TRACE_FLOW_STRING("create_collection","Success Exit."); + TRACE_FLOW_STRING("create_collection", "Success Exit."); return 0; } @@ -1052,28 +1091,31 @@ void destroy_collection(struct collection_item *ci) { struct collection_header *header; - TRACE_FLOW_STRING("destroy_collection","Entry."); + TRACE_FLOW_STRING("destroy_collection", "Entry."); /* Do not try to delete NULL */ - if(ci == (struct collection_item *)(NULL)) return; + if (ci == NULL) return; /* You can delete only whole collection not a part of it */ - if(ci->type != COL_TYPE_COLLECTION) { - TRACE_ERROR_STRING("Attempt to delete a non collection - BAD!",""); - TRACE_ERROR_NUMBER("Actual type is:",ci->type); + if (ci->type != COL_TYPE_COLLECTION) { + TRACE_ERROR_STRING("Attempt to delete a non collection - BAD!", ""); + TRACE_ERROR_NUMBER("Actual type is:", ci->type); return; } /* Collection can be referenced by other collection */ header = (struct collection_header *)(ci->data); - if(header->reference_count>1) { - TRACE_INFO_STRING("Dereferencing a referenced collection.",""); - (header->reference_count)--; - TRACE_INFO_NUMBER("Number after dereferencing.",header->reference_count); + if (header->reference_count > 1) { + TRACE_INFO_STRING("Dereferencing a referenced collection.", ""); + header->reference_count--; + TRACE_INFO_NUMBER("Number after dereferencing.", + header->reference_count); + } + else { + delete_collection(ci); } - else delete_collection(ci); - TRACE_FLOW_STRING("destroy_collection","Exit."); + TRACE_FLOW_STRING("destroy_collection", "Exit."); } @@ -1082,272 +1124,313 @@ void destroy_collection(struct collection_item *ci) /* Add a string property. If length equals 0, the length is determined based on the string. Lenght INCLUDES the terminating 0 */ -inline int add_str_property(struct collection_item *ci,char *subcollection, char *property,char *string,int length) +inline int add_str_property(struct collection_item *ci, char *subcollection, + char *property,char *string,int length) { int error = EOK; - TRACE_FLOW_STRING("add_str_property","Entry."); + TRACE_FLOW_STRING("add_str_property", "Entry."); + + if (length == 0) + length = strlen(string) + 1; - if(length == 0) length = strlen(string) + 1; - (void)(add_property(ci,subcollection,property,(void *)(string),length, COL_TYPE_STRING, &error)); + add_property(ci, subcollection, property, + (void *)(string), length, COL_TYPE_STRING, &error); - TRACE_FLOW_NUMBER("add_str_property returning",error); + TRACE_FLOW_NUMBER("add_str_property returning", error); return error; } /* Add a binary property. */ -inline int add_binary_property(struct collection_item *ci,char *subcollection, char *property,void *binary_data,int length) +inline int add_binary_property(struct collection_item *ci, char *subcollection, + char *property, void *binary_data, int length) { int error = EOK; - TRACE_FLOW_STRING("add_binary_property","Entry."); + TRACE_FLOW_STRING("add_binary_property", "Entry."); - (void)(add_property(ci,subcollection,property,binary_data,length, COL_TYPE_BINARY, &error)); + add_property(ci, subcollection, property, + binary_data, length, COL_TYPE_BINARY, &error); - TRACE_FLOW_NUMBER("add_binary_property returning",error); + TRACE_FLOW_NUMBER("add_binary_property returning", error); return error; } /* Add an int property. */ -inline int add_int_property(struct collection_item *ci,char *subcollection, char *property,int number) +inline int add_int_property(struct collection_item *ci, char *subcollection, + char *property,int number) { int error = EOK; - TRACE_FLOW_STRING("add_int_property","Entry."); + TRACE_FLOW_STRING("add_int_property", "Entry."); - (void)(add_property(ci,subcollection,property,(void *)(&number),sizeof(int), COL_TYPE_INTEGER, &error)); + add_property(ci, subcollection, property, + (void *)(&number), sizeof(int), + COL_TYPE_INTEGER, &error); - TRACE_FLOW_NUMBER("add_int_property returning",error); + TRACE_FLOW_NUMBER("add_int_property returning", error); return error; } /* Add an unsigned int property. */ -inline int add_unsigned_property(struct collection_item *ci,char *subcollection, char *property,unsigned int number) +inline int add_unsigned_property(struct collection_item *ci, + char *subcollection, + char *property, unsigned int number) { int error = EOK; - TRACE_FLOW_STRING("add_unsigned_property","Entry."); + TRACE_FLOW_STRING("add_unsigned_property", "Entry."); - (void)(add_property(ci,subcollection,property,(void *)(&number),sizeof(int), COL_TYPE_UNSIGNED, &error)); + add_property(ci, subcollection, property, + (void *)(&number), sizeof(int), COL_TYPE_UNSIGNED, &error); - TRACE_FLOW_NUMBER("add_unsigned_property returning",error); + TRACE_FLOW_NUMBER("add_unsigned_property returning", error); return error; } /* Add an long property. */ -inline int add_long_property(struct collection_item *ci,char *subcollection, char *property,long number) +inline int add_long_property(struct collection_item *ci, char *subcollection, + char *property,long number) { int error = EOK; - TRACE_FLOW_STRING("add_long_property","Entry."); + TRACE_FLOW_STRING("add_long_property", "Entry."); - (void)(add_property(ci,subcollection,property,(void *)(&number),sizeof(long), COL_TYPE_LONG, &error)); + add_property(ci, subcollection, property, + (void *)(&number), sizeof(long), COL_TYPE_LONG, &error); - TRACE_FLOW_NUMBER("add_long_property returning",error); + TRACE_FLOW_NUMBER("add_long_property returning", error); return error; } /* Add an unsigned long property. */ -inline int add_ulong_property(struct collection_item *ci,char *subcollection, char *property,unsigned long number) +inline int add_ulong_property(struct collection_item *ci, char *subcollection, + char *property, unsigned long number) { int error = EOK; - TRACE_FLOW_STRING("add_ulong_property","Entry."); + TRACE_FLOW_STRING("add_ulong_property", "Entry."); - (void)(add_property(ci,subcollection,property,(void *)(&number),sizeof(long), COL_TYPE_ULONG, &error)); + add_property(ci, subcollection, property, + (void *)(&number), sizeof(long), + COL_TYPE_ULONG, &error); - TRACE_FLOW_NUMBER("add_ulong_property returning",error); + TRACE_FLOW_NUMBER("add_ulong_property returning", error); return error; } /* Add a double property. */ -inline int add_double_property(struct collection_item *ci,char *subcollection, char *property,double number) +inline int add_double_property(struct collection_item *ci, char *subcollection, + char *property,double number) { int error = EOK; - TRACE_FLOW_STRING("add_double_property","Entry."); + TRACE_FLOW_STRING("add_double_property", "Entry."); - (void)(add_property(ci,subcollection,property,(void *)(&number),sizeof(double), COL_TYPE_DOUBLE, &error)); + add_property(ci, subcollection, property, + (void *)(&number), sizeof(double), COL_TYPE_DOUBLE, &error); - TRACE_FLOW_NUMBER("add_double_property returning",error); + TRACE_FLOW_NUMBER("add_double_property returning", error); return error; } /* Add a bool property. */ -inline int add_bool_property(struct collection_item *ci,char *subcollection, char *property,unsigned char logical) +inline int add_bool_property(struct collection_item *ci, char *subcollection, + char *property,unsigned char logical) { int error = EOK; - TRACE_FLOW_STRING("add_bool_property","Entry."); + TRACE_FLOW_STRING("add_bool_property", "Entry."); - (void)(add_property(ci,subcollection,property,(void *)(&logical),sizeof(unsigned char), COL_TYPE_BOOL, &error)); + add_property(ci, subcollection, property, + (void *)(&logical), sizeof(unsigned char), + COL_TYPE_BOOL, &error); - TRACE_FLOW_NUMBER("add_bool_property returning",error); + TRACE_FLOW_NUMBER("add_bool_property returning", error); return error; } /* A function to add a property */ inline int add_any_property(struct collection_item *ci, - char *subcollection, - char *property, - int type, - void *data, - int length) + char *subcollection, char *property, + int type, void *data, int length) { int error = EOK; - TRACE_FLOW_STRING("add_any_property","Entry."); + TRACE_FLOW_STRING("add_any_property", "Entry."); - (void)(add_property(ci,subcollection,property,data,length, type, &error)); + add_property(ci, subcollection, property, data, length, type, &error); - TRACE_FLOW_NUMBER("add_any_property returning",error); + TRACE_FLOW_NUMBER("add_any_property returning", error); return error; } /* Add a string property. If length equals 0, the length is determined based on the string. Lenght INCLUDES the terminating 0 */ -inline int add_str_property_with_ref(struct collection_item *ci,char *subcollection, - char *property,char *string,int length, +inline int add_str_property_with_ref(struct collection_item *ci, + char *subcollection, char *property, + char *string, int length, struct collection_item **ref_ret) { int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_str_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_str_property_with_ref", "Entry."); - if(length == 0) length = strlen(string) + 1; - item = add_property(ci,subcollection,property,(void *)(string),length, COL_TYPE_STRING, &error); + if (length == 0) length = strlen(string) + 1; - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + item = add_property(ci, subcollection, property, + (void *)(string), length, COL_TYPE_STRING, &error); - TRACE_FLOW_NUMBER("add_str_property_with_ref returning",error); + if (ref_ret != NULL) *ref_ret = item; + + TRACE_FLOW_NUMBER("add_str_property_with_ref returning", error); return error; } /* Add a binary property. */ -inline int add_binary_property_with_ref(struct collection_item *ci,char *subcollection, - char *property,void *binary_data,int length, +inline int add_binary_property_with_ref(struct collection_item *ci, + char *subcollection, char *property, + void *binary_data, int length, struct collection_item **ref_ret) { int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_binary_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_binary_property_with_ref", "Entry."); - item = add_property(ci,subcollection,property,binary_data,length, COL_TYPE_BINARY, &error); + item = add_property(ci, subcollection, property, + binary_data, length, COL_TYPE_BINARY, &error); - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + if (ref_ret != NULL) *ref_ret = item; - TRACE_FLOW_NUMBER("add_binary_property_with_ref returning",error); + TRACE_FLOW_NUMBER("add_binary_property_with_ref returning", error); return error; } /* Add an int property. */ -inline int add_int_property_with_ref(struct collection_item *ci,char *subcollection, - char *property,int number, +inline int add_int_property_with_ref(struct collection_item *ci, + char *subcollection, char *property, + int number, struct collection_item **ref_ret) { int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_int_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_int_property_with_ref", "Entry."); - item = add_property(ci,subcollection,property,(void *)(&number),sizeof(int), COL_TYPE_INTEGER, &error); + item = add_property(ci, subcollection, property, + (void *)(&number), sizeof(int), + COL_TYPE_INTEGER, &error); - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + if (ref_ret != NULL) *ref_ret = item; - TRACE_FLOW_NUMBER("add_int_property_with_ref returning",error); + TRACE_FLOW_NUMBER("add_int_property_with_ref returning", error); return error; } /* Add an unsigned int property. */ -inline int add_unsigned_property_with_ref(struct collection_item *ci,char *subcollection, - char *property,unsigned int number, +inline int add_unsigned_property_with_ref(struct collection_item *ci, + char *subcollection, char *property, + unsigned int number, struct collection_item **ref_ret) { int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_unsigned_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_unsigned_property_with_ref", "Entry."); - item = add_property(ci,subcollection,property,(void *)(&number),sizeof(int), COL_TYPE_UNSIGNED, &error); + item = add_property(ci, subcollection, property, + (void *)(&number), sizeof(int), + COL_TYPE_UNSIGNED, &error); - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + if (ref_ret != NULL) *ref_ret = item; - TRACE_FLOW_NUMBER("add_unsigned_property_with_ref returning",error); + TRACE_FLOW_NUMBER("add_unsigned_property_with_ref returning", error); return error; } /* Add an long property. */ -inline int add_long_property_with_ref(struct collection_item *ci,char *subcollection, - char *property,long number, +inline int add_long_property_with_ref(struct collection_item *ci, + char *subcollection, char *property, + long number, struct collection_item **ref_ret) { int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_long_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_long_property_with_ref", "Entry."); - item = add_property(ci,subcollection,property,(void *)(&number),sizeof(long), COL_TYPE_LONG, &error); + item = add_property(ci, subcollection, property, + (void *)(&number), sizeof(long), COL_TYPE_LONG, &error); - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + if (ref_ret != NULL) *ref_ret = item; - TRACE_FLOW_NUMBER("add_long_property_with_ref returning",error); + TRACE_FLOW_NUMBER("add_long_property_with_ref returning", error); return error; } /* Add an unsigned long property. */ -inline int add_ulong_property_with_ref(struct collection_item *ci,char *subcollection, - char *property,unsigned long number, +inline int add_ulong_property_with_ref(struct collection_item *ci, + char *subcollection, char *property, + unsigned long number, struct collection_item **ref_ret) { int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_ulong_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_ulong_property_with_ref", "Entry."); - item = add_property(ci,subcollection,property,(void *)(&number),sizeof(long), COL_TYPE_ULONG, &error); + item = add_property(ci, subcollection, property, + (void *)(&number), sizeof(long), + COL_TYPE_ULONG, &error); - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + if (ref_ret != NULL) *ref_ret = item; - TRACE_FLOW_NUMBER("add_ulong_property_with_ref returning",error); + TRACE_FLOW_NUMBER("add_ulong_property_with_ref returning", error); return error; } /* Add a double property. */ -inline int add_double_property_with_ref(struct collection_item *ci,char *subcollection, - char *property,double number, +inline int add_double_property_with_ref(struct collection_item *ci, + char *subcollection, char *property, + double number, struct collection_item **ref_ret) { int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_double_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_double_property_with_ref", "Entry."); - item = add_property(ci,subcollection,property,(void *)(&number),sizeof(double), COL_TYPE_DOUBLE, &error); + item = add_property(ci, subcollection, property, + (void *)(&number), sizeof(double), + COL_TYPE_DOUBLE, &error); - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + if (ref_ret != NULL) *ref_ret = item; - TRACE_FLOW_NUMBER("add_double_property_with_ref returning",error); + TRACE_FLOW_NUMBER("add_double_property_with_ref returning", error); return error; } /* Add a bool property. */ -inline int add_bool_property_with_ref(struct collection_item *ci,char *subcollection, - char *property,unsigned char logical, +inline int add_bool_property_with_ref(struct collection_item *ci, + char *subcollection, char *property, + unsigned char logical, struct collection_item **ref_ret) { int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_bool_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_bool_property_with_ref", "Entry."); - item = add_property(ci,subcollection,property,(void *)(&logical),sizeof(unsigned char), COL_TYPE_BOOL, &error); + item = add_property(ci, subcollection, property, + (void *)(&logical), sizeof(unsigned char), + COL_TYPE_BOOL, &error); - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + if (ref_ret != NULL) *ref_ret = item; - TRACE_FLOW_NUMBER("add_bool_property_with_ref returning",error); + TRACE_FLOW_NUMBER("add_bool_property_with_ref returning", error); return error; } @@ -1363,13 +1446,14 @@ inline int add_any_property_with_ref(struct collection_item *ci, int error = EOK; struct collection_item *item; - TRACE_FLOW_STRING("add_any_property_with_ref","Entry."); + TRACE_FLOW_STRING("add_any_property_with_ref", "Entry."); - item = add_property(ci,subcollection,property,data,length, type, &error); + item = add_property(ci, subcollection, property, + data, length, type, &error); - if(ref_ret != (struct collection_item **)(NULL)) *ref_ret = item; + if (ref_ret != NULL) *ref_ret = item; - TRACE_FLOW_NUMBER("add_any_property_with_ref returning",error); + TRACE_FLOW_NUMBER("add_any_property_with_ref returning", error); return error; } @@ -1381,35 +1465,37 @@ inline int add_any_property_with_ref(struct collection_item *ci, /* Referenced collections of the donor are copied as sub collections. */ int copy_collection(struct collection_item **collection_copy, struct collection_item *collection_to_copy, - char *name_to_use) { - + char *name_to_use) +{ int error = EOK; - struct collection_item *new_collection = (struct collection_item *)(NULL); + struct collection_item *new_collection = NULL; char *name; struct collection_header *header; - TRACE_FLOW_STRING("copy_collection","Entry."); + TRACE_FLOW_STRING("copy_collection", "Entry."); /* Determine what name to use */ - if(name_to_use != NULL) name = name_to_use; - else name = collection_to_copy->property; + if (name_to_use != NULL) + name = name_to_use; + else + name = collection_to_copy->property; - header = (struct collection_header *)(collection_to_copy->data); + header = (struct collection_header *)collection_to_copy->data; /* Create a new collection */ - error = create_collection(&new_collection,name,header->class); - if(error) { - TRACE_ERROR_NUMBER("Create_cllection failed returning",error); + error = create_collection(&new_collection, name, header->cclass); + if (error) { + TRACE_ERROR_NUMBER("Create_cllection failed returning", error); return error; } - error = walk_items(collection_to_copy, COL_TRAVERSE_ONELEVEL, copy_traverse_handler, - new_collection, NULL, NULL); + error = walk_items(collection_to_copy, COL_TRAVERSE_ONELEVEL, + copy_traverse_handler, new_collection, NULL, NULL); - if(!error) *collection_copy = new_collection; + if (!error) *collection_copy = new_collection; else destroy_collection(new_collection); - TRACE_FLOW_NUMBER("copy_collection returning",error); + TRACE_FLOW_NUMBER("copy_collection returning", error); return error; } @@ -1422,42 +1508,46 @@ int get_collection_reference(struct collection_item *ci, /* High level char *collection_to_find) /* Name to of the collection */ { struct collection_header *header; - struct collection_item *subcollection = (struct collection_item *)(NULL); + struct collection_item *subcollection = NULL; int error = EOK; - TRACE_FLOW_STRING("get_collection_reference","Entry."); + TRACE_FLOW_STRING("get_collection_reference", "Entry."); - if((ci == (struct collection_item *)(NULL)) || - (ci->type != COL_TYPE_COLLECTION) || - (acceptor == (struct collection_item **)(NULL)) || - (collection_to_find == NULL)) { + if ((ci == NULL) || + (ci->type != COL_TYPE_COLLECTION) || + (acceptor == NULL) || + (collection_to_find == NULL)) { TRACE_ERROR_NUMBER("Invalid parameter - returning error",EINVAL); return EINVAL; } /* Find a sub collection */ - TRACE_INFO_STRING("We are given subcollection name - search it:",collection_to_find); - error = find_item_and_do(ci,collection_to_find,COL_TYPE_COLLECTIONREF, + TRACE_INFO_STRING("We are given subcollection name - search it:", + collection_to_find); + error = find_item_and_do(ci, collection_to_find, + COL_TYPE_COLLECTIONREF, COL_TRAVERSE_DEFAULT, - get_subcollection,(void *)(&subcollection),COLLECTION_ACTION_FIND); - if(error) { - TRACE_ERROR_NUMBER("Search failed returning error",error); + get_subcollection, + (void *)(&subcollection), + COLLECTION_ACTION_FIND); + if (error) { + TRACE_ERROR_NUMBER("Search failed returning error", error); return error; } - if(subcollection == (struct collection_item *)(NULL)) { - TRACE_ERROR_STRING("Search for subcollection returned NULL pointer",""); + if (subcollection == NULL) { + TRACE_ERROR_STRING("Search for subcollection returned NULL pointer", ""); return ENOENT; } - header = (struct collection_header *)(subcollection->data); - TRACE_INFO_NUMBER("Count:",header->count); - TRACE_INFO_NUMBER("Ref count:",header->reference_count); - (header->reference_count)++; - TRACE_INFO_NUMBER("Ref count after increment:",header->reference_count); + header = (struct collection_header *)subcollection->data; + TRACE_INFO_NUMBER("Count:", header->count); + TRACE_INFO_NUMBER("Ref count:", header->reference_count); + header->reference_count++; + TRACE_INFO_NUMBER("Ref count after increment:", header->reference_count); *acceptor = subcollection; - TRACE_FLOW_STRING("get_collection_reference","Success Exit."); + TRACE_FLOW_STRING("get_collection_reference", "Success Exit."); return EOK; } @@ -1466,27 +1556,27 @@ int get_reference_from_item(struct collection_item *ci, struct collection_item **acceptor) { struct collection_header *header; - struct collection_item *subcollection = (struct collection_item *)(NULL); + struct collection_item *subcollection = NULL; - TRACE_FLOW_STRING("get_reference_from_item","Entry."); + TRACE_FLOW_STRING("get_reference_from_item", "Entry."); - if((ci == (struct collection_item *)(NULL)) || - (ci->type != COL_TYPE_COLLECTIONREF) || - (acceptor == (struct collection_item **)(NULL))) { + if ((ci == NULL) || + (ci->type != COL_TYPE_COLLECTIONREF) || + (acceptor == NULL)) { TRACE_ERROR_NUMBER("Invalid parameter - returning error",EINVAL); return EINVAL; } - subcollection = *((struct collection_item **)(ci->data)); + subcollection = *((struct collection_item **)ci->data); - header = (struct collection_header *)(subcollection->data); - TRACE_INFO_NUMBER("Count:",header->count); - TRACE_INFO_NUMBER("Ref count:",header->reference_count); - (header->reference_count)++; - TRACE_INFO_NUMBER("Ref count after increment:",header->reference_count); + header = (struct collection_header *)subcollection->data; + TRACE_INFO_NUMBER("Count:", header->count); + TRACE_INFO_NUMBER("Ref count:", header->reference_count); + header->reference_count++; + TRACE_INFO_NUMBER("Ref count after increment:", header->reference_count); *acceptor = subcollection; - TRACE_FLOW_STRING("get_reference_from_item","Success Exit."); + TRACE_FLOW_STRING("get_reference_from_item", "Success Exit."); return EOK; } @@ -1504,121 +1594,143 @@ int add_collection_to_collection( struct collection_item *collection_to_add, /* Collection to add */ int mode) /* How this collection needs to be added */ { - struct collection_item *acceptor = (struct collection_item *)(NULL); + struct collection_item *acceptor = NULL; char *name_to_use; struct collection_header *header; struct collection_item *collection_copy; int error = EOK; - TRACE_FLOW_STRING("add_collection_to_collection","Entry."); + TRACE_FLOW_STRING("add_collection_to_collection", "Entry."); - if((ci == (struct collection_item *)(NULL)) || - (ci->type != COL_TYPE_COLLECTION) || - (collection_to_add == (struct collection_item *)(NULL)) || - (collection_to_add->type != COL_TYPE_COLLECTION)) { + if ((ci == NULL) || + (ci->type != COL_TYPE_COLLECTION) || + (collection_to_add == NULL) || + (collection_to_add->type != COL_TYPE_COLLECTION)) { /* Need to debug here */ - TRACE_ERROR_NUMBER("Missing parameter - returning error",EINVAL); + TRACE_ERROR_NUMBER("Missing parameter - returning error", EINVAL); return EINVAL; } - if(sub_collection_name != NULL) { + if (sub_collection_name != NULL) { /* Find a sub collection */ - TRACE_INFO_STRING("We are given subcollection name - search it:",sub_collection_name); - error = find_item_and_do(ci,sub_collection_name,COL_TYPE_COLLECTIONREF, + TRACE_INFO_STRING("We are given subcollection name - search it:", + sub_collection_name); + error = find_item_and_do(ci, sub_collection_name, + COL_TYPE_COLLECTIONREF, COL_TRAVERSE_DEFAULT, - get_subcollection,(void *)(&acceptor),COLLECTION_ACTION_FIND); - if(error) { - TRACE_ERROR_NUMBER("Search failed returning error",error); + get_subcollection, + (void *)(&acceptor), + COLLECTION_ACTION_FIND); + if (error) { + TRACE_ERROR_NUMBER("Search failed returning error", error); return error; } - if(acceptor == (struct collection_item *)(NULL)) { - TRACE_ERROR_STRING("Search for subcollection returned NULL pointer",""); + if (acceptor == NULL) { + TRACE_ERROR_STRING("Search for subcollection returned NULL pointer", ""); return ENOENT; } } - else acceptor = ci; + else { + acceptor = ci; + } - if(as_property != NULL) + if (as_property != NULL) name_to_use = as_property; else name_to_use = collection_to_add->property; - TRACE_INFO_STRING("Going to use name:",name_to_use); - - - switch(mode) { - case COL_ADD_MODE_REFERENCE: - TRACE_INFO_STRING("We are adding a reference.",""); - TRACE_INFO_NUMBER("Type of the header element:",collection_to_add->type); - TRACE_INFO_STRING("Header name we are adding.",collection_to_add->property); - /* Create a pointer to external collection */ - /* For future thread safety: Transaction start -> */ - (void)(add_property(acceptor,NULL,name_to_use,(void *)(&collection_to_add), - sizeof(struct collection_item **), - COL_TYPE_COLLECTIONREF, &error)); - - TRACE_INFO_NUMBER("Type of the header element after add_property:",collection_to_add->type); - TRACE_INFO_STRING("Header name we just added.",collection_to_add->property); - if(error) { - TRACE_ERROR_NUMBER("Adding property failed with error:",error); - return error; - } - header = (struct collection_header *)(collection_to_add->data); - TRACE_INFO_NUMBER("Count:",header->count); - TRACE_INFO_NUMBER("Ref count:",header->reference_count); - (header->reference_count)++; - TRACE_INFO_NUMBER("Ref count after increment:",header->reference_count); - /* -> Transaction end */ - break; - case COL_ADD_MODE_EMBED: - TRACE_INFO_STRING("We are embedding the collection.",""); - /* First check if the passed in collection is referenced more than once */ - TRACE_INFO_NUMBER("Type of the header element we are adding:",collection_to_add->type); - TRACE_INFO_STRING("Header name we are adding.",collection_to_add->property); - TRACE_INFO_NUMBER("Type of the header element we are adding to:",acceptor->type); - TRACE_INFO_STRING("Header name we are adding to.",acceptor->property); - - (void)(add_property(acceptor,NULL,name_to_use,(void *)(&collection_to_add), - sizeof(struct collection_item **), - COL_TYPE_COLLECTIONREF, &error)); - - TRACE_INFO_NUMBER("Adding property returned:",error); - break; - - case COL_ADD_MODE_CLONE: - TRACE_INFO_STRING("We are cloning the collection.",""); - TRACE_INFO_STRING("Name we will use.",name_to_use); - - /* For future thread safety: Transaction start -> */ - error = copy_collection(&collection_copy, collection_to_add, name_to_use); - if(error) return error; - - TRACE_INFO_STRING("We have a collection copy.", collection_copy->property); - TRACE_INFO_NUMBER("Collection type.", collection_copy->type); - TRACE_INFO_STRING("Acceptor collection.", acceptor->property); - TRACE_INFO_NUMBER("Acceptor collection type.", acceptor->type); - - (void)(add_property(acceptor,NULL,name_to_use,(void *)(&collection_copy), - sizeof(struct collection_item **), - COL_TYPE_COLLECTIONREF, &error)); - - /* -> Transaction end */ - TRACE_INFO_NUMBER("Adding property returned:",error); - break; - - default: error = EINVAL; - } - - TRACE_FLOW_NUMBER("add_collection_to_collection returning:",error); + TRACE_INFO_STRING("Going to use name:", name_to_use); + + + switch (mode) { + case COL_ADD_MODE_REFERENCE: + TRACE_INFO_STRING("We are adding a reference.", ""); + TRACE_INFO_NUMBER("Type of the header element:", + collection_to_add->type); + TRACE_INFO_STRING("Header name we are adding.", + collection_to_add->property); + /* Create a pointer to external collection */ + /* For future thread safety: Transaction start -> */ + add_property(acceptor, NULL, name_to_use, + (void *)(&collection_to_add), + sizeof(struct collection_item **), + COL_TYPE_COLLECTIONREF, &error); + + TRACE_INFO_NUMBER("Type of the header element after add_property:", + collection_to_add->type); + TRACE_INFO_STRING("Header name we just added.", + collection_to_add->property); + if (error) { + TRACE_ERROR_NUMBER("Adding property failed with error:", error); + return error; + } + header = (struct collection_header *)collection_to_add->data; + TRACE_INFO_NUMBER("Count:", header->count); + TRACE_INFO_NUMBER("Ref count:", header->reference_count); + header->reference_count++; + TRACE_INFO_NUMBER("Ref count after increment:", + header->reference_count); + /* -> Transaction end */ + break; + + case COL_ADD_MODE_EMBED: + TRACE_INFO_STRING("We are embedding the collection.", ""); + /* First check if the passed in collection is referenced more than once */ + TRACE_INFO_NUMBER("Type of the header element we are adding:", + collection_to_add->type); + TRACE_INFO_STRING("Header name we are adding.", + collection_to_add->property); + TRACE_INFO_NUMBER("Type of the header element we are adding to:", + acceptor->type); + TRACE_INFO_STRING("Header name we are adding to.", + acceptor->property); + + add_property(acceptor, NULL, name_to_use, + (void *)(&collection_to_add), + sizeof(struct collection_item **), + COL_TYPE_COLLECTIONREF, &error); + + TRACE_INFO_NUMBER("Adding property returned:", error); + break; + + case COL_ADD_MODE_CLONE: + TRACE_INFO_STRING("We are cloning the collection.", ""); + TRACE_INFO_STRING("Name we will use.", name_to_use); + + /* For future thread safety: Transaction start -> */ + error = copy_collection(&collection_copy, + collection_to_add, name_to_use); + if (error) return error; + + TRACE_INFO_STRING("We have a collection copy.", collection_copy->property); + TRACE_INFO_NUMBER("Collection type.", collection_copy->type); + TRACE_INFO_STRING("Acceptor collection.", acceptor->property); + TRACE_INFO_NUMBER("Acceptor collection type.", acceptor->type); + + add_property(acceptor, NULL, name_to_use, + (void *)(&collection_copy), + sizeof(struct collection_item **), + COL_TYPE_COLLECTIONREF, &error); + + /* -> Transaction end */ + TRACE_INFO_NUMBER("Adding property returned:", error); + break; + + default: + error = EINVAL; + } + + TRACE_FLOW_NUMBER("add_collection_to_collection returning:", error); return error; } /* TRAVERSING */ -/* Function to traverse the entire collection including optionally sub collections */ +/* Function to traverse the entire collection including optionally + * sub collections */ inline int traverse_collection(struct collection_item *ci, int mode_flags, item_fn item_handler, @@ -1626,17 +1738,17 @@ inline int traverse_collection(struct collection_item *ci, { int error = EOK; - TRACE_FLOW_STRING("traverse_collection","Entry."); + TRACE_FLOW_STRING("traverse_collection", "Entry."); error = walk_items(ci, mode_flags, simple_traverse_handler, NULL, item_handler, custom_data); - if((error != 0) && (error != EINTR_INTERNAL)) { - TRACE_ERROR_NUMBER("Error walking tree",error); + if ((error != 0) && (error != EINTR_INTERNAL)) { + TRACE_ERROR_NUMBER("Error walking tree", error); return error; } - TRACE_FLOW_STRING("traverse_collection","Success exit."); + TRACE_FLOW_STRING("traverse_collection", "Success exit."); return EOK; } @@ -1654,10 +1766,13 @@ inline int is_item_in_collection(struct collection_item *ci, TRACE_FLOW_STRING("is_item_in_collection","Entry."); *found = COL_NOMATCH; - error = find_item_and_do(ci,property_to_find,type,mode_flags, - is_in_item_handler,(void *)found,COLLECTION_ACTION_FIND); + error = find_item_and_do(ci, property_to_find, + type, mode_flags, + is_in_item_handler, + (void *)found, + COLLECTION_ACTION_FIND); - TRACE_FLOW_NUMBER("is_item_in_collection returning",error); + TRACE_FLOW_NUMBER("is_item_in_collection returning", error); return error; } @@ -1676,9 +1791,13 @@ inline int get_item_and_do(struct collection_item *ci, /* Collection to fi TRACE_FLOW_STRING("get_item_and_do","Entry."); - error = find_item_and_do(ci,property_to_find,type,mode_flags,item_handler,custom_data,COLLECTION_ACTION_FIND); + error = find_item_and_do(ci, property_to_find, + type, mode_flags, + item_handler, + custom_data, + COLLECTION_ACTION_FIND); - TRACE_FLOW_NUMBER("get_item_and_do returning",error); + TRACE_FLOW_NUMBER("get_item_and_do returning", error); return error; } @@ -1693,11 +1812,14 @@ inline int get_item(struct collection_item *ci, /* Collection to find thin int error = EOK; - TRACE_FLOW_STRING("get_item","Entry."); + TRACE_FLOW_STRING("get_item", "Entry."); - error = find_item_and_do(ci,property_to_find,type,mode_flags,NULL,(void *)(item),COLLECTION_ACTION_GET); + error = find_item_and_do(ci, property_to_find, + type, mode_flags, + NULL, (void *)item, + COLLECTION_ACTION_GET); - TRACE_FLOW_NUMBER("get_item returning",error); + TRACE_FLOW_NUMBER("get_item returning", error); return error; } @@ -1711,13 +1833,18 @@ inline int delete_property(struct collection_item *ci, /* Collection to find int error = EOK; int found; - TRACE_FLOW_STRING("delete_property","Entry."); + TRACE_FLOW_STRING("delete_property", "Entry."); found = COL_NOMATCH; - error = find_item_and_do(ci,property_to_find,type,mode_flags,NULL,(void *)(&found),COLLECTION_ACTION_DEL); + error = find_item_and_do(ci, property_to_find, + type, mode_flags, + NULL, (void *)(&found), + COLLECTION_ACTION_DEL); - if((error == EOK) && (found == COL_NOMATCH)) error = ENOENT; - TRACE_FLOW_NUMBER("delete_property returning",error); + if ((error == EOK) && (found == COL_NOMATCH)) + error = ENOENT; + + TRACE_FLOW_NUMBER("delete_property returning", error); return error; } @@ -1734,20 +1861,26 @@ int update_property(struct collection_item *ci, /* Collection to find things int error = EOK; struct update_property update_data; - TRACE_FLOW_STRING("update_property","Entry."); + TRACE_FLOW_STRING("update_property", "Entry."); update_data.type = type; update_data.data = new_data; update_data.length = length; update_data.found = COL_NOMATCH; - error = find_item_and_do(ci,property_to_find,type,mode_flags,NULL,(void *)(&update_data),COLLECTION_ACTION_UPDATE); + error = find_item_and_do(ci, property_to_find, + type, mode_flags, + NULL, (void *)(&update_data), + COLLECTION_ACTION_UPDATE); + + if ((error == EOK) && (update_data.found == COL_NOMATCH)) + error = ENOENT; - if((error == EOK) && (update_data.found == COL_NOMATCH)) error = ENOENT; - TRACE_FLOW_NUMBER("update_property returning",error); + TRACE_FLOW_NUMBER("update_property returning", error); return error; } -/* Update a string property in the collection. Length should include the null terminating 0 */ +/* Update a string property in the collection. + * Length should include the terminating 0 */ inline int update_str_property(struct collection_item *ci, char *property, int mode_flags, @@ -1755,12 +1888,13 @@ inline int update_str_property(struct collection_item *ci, int length) { int error = EOK; - TRACE_FLOW_STRING("update_str_property","Entry."); + TRACE_FLOW_STRING("update_str_property", "Entry."); - if(length == 0) length = strlen(string) + 1; - error = update_property(ci,property, COL_TYPE_STRING, (void *)(string),length,mode_flags); + if (length == 0) length = strlen(string) + 1; + error = update_property(ci, property, COL_TYPE_STRING, + (void *)string, length, mode_flags); - TRACE_FLOW_NUMBER("update_str_property Returning",error); + TRACE_FLOW_NUMBER("update_str_property Returning", error); return error; } @@ -1772,11 +1906,12 @@ inline int update_binary_property(struct collection_item *ci, int length) { int error = EOK; - TRACE_FLOW_STRING("update_binary_property","Entry."); + TRACE_FLOW_STRING("update_binary_property", "Entry."); - error = update_property(ci,property, COL_TYPE_BINARY, binary_data, length, mode_flags); + error = update_property(ci, property, COL_TYPE_BINARY, + binary_data, length, mode_flags); - TRACE_FLOW_NUMBER("update_binary_property Returning",error); + TRACE_FLOW_NUMBER("update_binary_property Returning", error); return error; } @@ -1787,25 +1922,28 @@ inline int update_int_property(struct collection_item *ci, int number) { int error = EOK; - TRACE_FLOW_STRING("update_int_property","Entry."); + TRACE_FLOW_STRING("update_int_property", "Entry."); - error = update_property(ci,property, COL_TYPE_INTEGER, (void *)(&number), sizeof(int), mode_flags); + error = update_property(ci, property, COL_TYPE_INTEGER, + (void *)(&number), sizeof(int), mode_flags); - TRACE_FLOW_NUMBER("update_int_property Returning",error); + TRACE_FLOW_NUMBER("update_int_property Returning", error); return error; } /* Update an unsigned int property. */ inline int update_unsigned_property(struct collection_item *ci, - char *property,int mode_flags, + char *property, int mode_flags, unsigned int number) { int error = EOK; - TRACE_FLOW_STRING("update_unsigned_property","Entry."); + TRACE_FLOW_STRING("update_unsigned_property", "Entry."); - error = update_property(ci,property, COL_TYPE_UNSIGNED, (void *)(&number), sizeof(unsigned int), mode_flags); + error = update_property(ci, property, COL_TYPE_UNSIGNED, + (void *)(&number), sizeof(unsigned int), + mode_flags); - TRACE_FLOW_NUMBER("update_unsigned_property Returning",error); + TRACE_FLOW_NUMBER("update_unsigned_property Returning", error); return error; } /* Update a long property. */ @@ -1815,11 +1953,12 @@ inline int update_long_property(struct collection_item *ci, long number) { int error = EOK; - TRACE_FLOW_STRING("update_long_property","Entry."); + TRACE_FLOW_STRING("update_long_property", "Entry."); - error = update_property(ci,property, COL_TYPE_LONG, (void *)(&number), sizeof(long), mode_flags); + error = update_property(ci, property, COL_TYPE_LONG, + (void *)(&number), sizeof(long), mode_flags); - TRACE_FLOW_NUMBER("update_long_property Returning",error); + TRACE_FLOW_NUMBER("update_long_property Returning", error); return error; } @@ -1831,11 +1970,13 @@ inline int update_ulong_property(struct collection_item *ci, unsigned long number) { int error = EOK; - TRACE_FLOW_STRING("update_ulong_property","Entry."); + TRACE_FLOW_STRING("update_ulong_property", "Entry."); - error = update_property(ci,property, COL_TYPE_ULONG, (void *)(&number), sizeof(unsigned long), mode_flags); + error = update_property(ci, property, COL_TYPE_ULONG, + (void *)(&number), sizeof(unsigned long), + mode_flags); - TRACE_FLOW_NUMBER("update_ulong_property Returning",error); + TRACE_FLOW_NUMBER("update_ulong_property Returning", error); return error; } @@ -1846,11 +1987,12 @@ inline int update_double_property(struct collection_item *ci, double number) { int error = EOK; - TRACE_FLOW_STRING("update_double_property","Entry."); + TRACE_FLOW_STRING("update_double_property", "Entry."); - error = update_property(ci,property, COL_TYPE_DOUBLE, (void *)(&number), sizeof(double), mode_flags); + error = update_property(ci, property, COL_TYPE_DOUBLE, + (void *)(&number), sizeof(double), mode_flags); - TRACE_FLOW_NUMBER("update_double_property Returning",error); + TRACE_FLOW_NUMBER("update_double_property Returning", error); return error; } @@ -1861,11 +2003,13 @@ inline int update_bool_property(struct collection_item *ci, unsigned char logical) { int error = EOK; - TRACE_FLOW_STRING("update_bool_property","Entry."); + TRACE_FLOW_STRING("update_bool_property", "Entry."); - error = update_property(ci,property, COL_TYPE_BOOL, (void *)(&logical), sizeof(unsigned char), mode_flags); + error = update_property(ci, property, COL_TYPE_BOOL, + (void *)(&logical), sizeof(unsigned char), + mode_flags); - TRACE_FLOW_NUMBER("update_bool_property Returning",error); + TRACE_FLOW_NUMBER("update_bool_property Returning", error); return error; } @@ -1876,33 +2020,34 @@ int modify_item(struct collection_item *item, void *data, int length) { - TRACE_FLOW_STRING("modify_item","Entry"); + TRACE_FLOW_STRING("modify_item", "Entry"); - if((item == (struct collection_item *)(NULL)) || - (item->type == COL_TYPE_COLLECTION) || - (item->type == COL_TYPE_COLLECTIONREF)) { - TRACE_ERROR_NUMBER("Invalid argument or invalid argument type",EINVAL); + if ((item == NULL) || + (item->type == COL_TYPE_COLLECTION) || + (item->type == COL_TYPE_COLLECTIONREF)) { + TRACE_ERROR_NUMBER("Invalid argument or invalid argument type", EINVAL); return EINVAL; } - if(property != NULL) { + if (property != NULL) { free(item->property); item->property=strdup(property); - if(item->property == NULL) { - TRACE_ERROR_STRING("Failed to allocate memory",""); + if (item->property == NULL) { + TRACE_ERROR_STRING("Failed to allocate memory", ""); return ENOMEM; } } - /* If type is different or same but it is string or binary we need to replace the storage */ - if((item->type != type) || - ((item->type == type) && - ((item->type == COL_TYPE_STRING) || (item->type == COL_TYPE_BINARY)))) { - TRACE_INFO_STRING("Replacing item data buffer",""); + /* If type is different or same but it is string or binary we need to + * replace the storage */ + if ((item->type != type) || + ((item->type == type) && + ((item->type == COL_TYPE_STRING) || (item->type == COL_TYPE_BINARY)))) { + TRACE_INFO_STRING("Replacing item data buffer", ""); free(item->data); item->data = malloc(length); - if(item->data == NULL) { - TRACE_ERROR_STRING("Failed to allocate memory",""); + if (item->data == NULL) { + TRACE_ERROR_STRING("Failed to allocate memory", ""); item->length = 0; return ENOMEM; } @@ -1910,13 +2055,14 @@ int modify_item(struct collection_item *item, } - TRACE_INFO_STRING("Overwriting item data",""); - memcpy(item->data,data,item->length); + TRACE_INFO_STRING("Overwriting item data", ""); + memcpy(item->data, data, item->length); item->type = type; - if(item->type == COL_TYPE_STRING) *(((char *)(item->data))+item->length-1) = '\0'; + if (item->type == COL_TYPE_STRING) + ((char *)(item->data))[item->length - 1] = '\0'; - TRACE_FLOW_STRING("modify_item","Exit"); + TRACE_FLOW_STRING("modify_item", "Exit"); return EOK; } @@ -1931,14 +2077,16 @@ inline int modify_str_item(struct collection_item *item, int len; int error; - TRACE_FLOW_STRING("modify_str_item","Entry"); + TRACE_FLOW_STRING("modify_str_item", "Entry"); - if(length != 0) len = length; - else len = strlen(string) + 1; + if (length != 0) + len = length; + else + len = strlen(string) + 1; - error = modify_item(item,property,COL_TYPE_STRING,(void *)string,len); + error = modify_item(item, property, COL_TYPE_STRING, (void *)string, len); - TRACE_FLOW_STRING("modify_str_item","Exit"); + TRACE_FLOW_STRING("modify_str_item", "Exit"); return error; } @@ -1950,11 +2098,11 @@ inline int modify_binary_item(struct collection_item *item, { int error; - TRACE_FLOW_STRING("modify_binary_item","Entry"); + TRACE_FLOW_STRING("modify_binary_item", "Entry"); - error = modify_item(item,property,COL_TYPE_BINARY,binary_data,length); + error = modify_item(item, property, COL_TYPE_BINARY, binary_data, length); - TRACE_FLOW_STRING("modify_binary_item","Exit"); + TRACE_FLOW_STRING("modify_binary_item", "Exit"); return error; } @@ -1965,11 +2113,11 @@ inline int modify_bool_item(struct collection_item *item, { int error; - TRACE_FLOW_STRING("modify_bool_item","Entry"); + TRACE_FLOW_STRING("modify_bool_item", "Entry"); - error = modify_item(item,property,COL_TYPE_BOOL,(void *)(&logical),1); + error = modify_item(item, property, COL_TYPE_BOOL, (void *)(&logical), 1); - TRACE_FLOW_STRING("modify_bool_item","Exit"); + TRACE_FLOW_STRING("modify_bool_item", "Exit"); return error; } @@ -1982,9 +2130,10 @@ inline int modify_int_item(struct collection_item *item, TRACE_FLOW_STRING("modify_int_item","Entry"); - error = modify_item(item,property,COL_TYPE_INTEGER,(void *)(&number),sizeof(int)); + error = modify_item(item, property, COL_TYPE_INTEGER, + (void *)(&number), sizeof(int)); - TRACE_FLOW_STRING("modify_int_item","Exit"); + TRACE_FLOW_STRING("modify_int_item", "Exit"); return error; } @@ -1995,11 +2144,12 @@ inline int modify_long_item(struct collection_item *item, { int error; - TRACE_FLOW_STRING("modify_long_item","Entry"); + TRACE_FLOW_STRING("modify_long_item", "Entry"); - error = modify_item(item,property,COL_TYPE_LONG,(void *)(&number),sizeof(long)); + error = modify_item(item, property, COL_TYPE_LONG, + (void *)(&number), sizeof(long)); - TRACE_FLOW_STRING("modify_long_item","Exit"); + TRACE_FLOW_STRING("modify_long_item", "Exit"); return error; } @@ -2010,11 +2160,12 @@ inline int modify_ulong_item(struct collection_item *item, { int error; - TRACE_FLOW_STRING("modify_ulong_item","Entry"); + TRACE_FLOW_STRING("modify_ulong_item", "Entry"); - error = modify_item(item,property,COL_TYPE_ULONG,(void *)(&number),sizeof(unsigned long)); + error = modify_item(item, property, COL_TYPE_ULONG, + (void *)(&number), sizeof(unsigned long)); - TRACE_FLOW_STRING("modify_ulong_item","Exit"); + TRACE_FLOW_STRING("modify_ulong_item", "Exit"); return error; } @@ -2024,11 +2175,12 @@ inline int modify_unsigned_item(struct collection_item *item, { int error; - TRACE_FLOW_STRING("modify_unsigned_item","Entry"); + TRACE_FLOW_STRING("modify_unsigned_item", "Entry"); - error = modify_item(item,property,COL_TYPE_UNSIGNED,(void *)(&number),sizeof(unsigned)); + error = modify_item(item, property, COL_TYPE_UNSIGNED, + (void *)(&number), sizeof(unsigned)); - TRACE_FLOW_STRING("modify_unsigned_item","Exit"); + TRACE_FLOW_STRING("modify_unsigned_item", "Exit"); return error; } @@ -2038,11 +2190,12 @@ inline int modify_double_item(struct collection_item *item, { int error; - TRACE_FLOW_STRING("modify_double_item","Entry"); + TRACE_FLOW_STRING("modify_double_item", "Entry"); - error = modify_item(item,property,COL_TYPE_DOUBLE,(void *)(&number),sizeof(double)); + error = modify_item(item, property, COL_TYPE_DOUBLE, + (void *)(&number), sizeof(double)); - TRACE_FLOW_STRING("modify_double_item","Exit"); + TRACE_FLOW_STRING("modify_double_item", "Exit"); return error; } @@ -2053,20 +2206,20 @@ static int grow_stack(struct collection_iterator *iterator, unsigned desired) int grow_by = 0; struct collection_item **temp; - TRACE_FLOW_STRING("grow_stack","Entry."); + TRACE_FLOW_STRING("grow_stack", "Entry."); - if(desired > iterator->stack_size) { + if (desired > iterator->stack_size) { grow_by = (((desired - iterator->stack_size) / STACK_DEPTH_BLOCK) + 1) * STACK_DEPTH_BLOCK; errno = 0; - temp = (struct collection_item **)(realloc(iterator->stack,grow_by * sizeof(struct collection_item *))); - if(temp == (struct collection_item **)(NULL)) { - TRACE_ERROR_NUMBER("Failed to allocate memory",ENOMEM); + temp = (struct collection_item **)realloc(iterator->stack, grow_by * sizeof(struct collection_item *)); + if (temp == NULL) { + TRACE_ERROR_NUMBER("Failed to allocate memory", ENOMEM); return ENOMEM; } iterator->stack = temp; iterator->stack_size += grow_by; } - TRACE_FLOW_STRING("grow_stack","Exit."); + TRACE_FLOW_STRING("grow_stack", "Exit."); return EOK; } @@ -2079,83 +2232,81 @@ int bind_iterator(struct collection_iterator **iterator, { int error; struct collection_header *header; - struct collection_iterator *iter = (struct collection_iterator *)(NULL); + struct collection_iterator *iter = NULL; - TRACE_FLOW_STRING("bind_iterator","Entry."); + TRACE_FLOW_STRING("bind_iterator", "Entry."); /* Do some argument checking first */ - if((iterator == (struct collection_iterator **)(NULL)) || - (ci == (struct collection_item *)(NULL))) { - TRACE_ERROR_NUMBER("Invalid parameter.",EINVAL); + if ((iterator == NULL) || (ci == NULL)) { + TRACE_ERROR_NUMBER("Invalid parameter.", EINVAL); return EINVAL; } iter = (struct collection_iterator *)malloc(sizeof(struct collection_iterator)); - if(iter == (struct collection_iterator *)(NULL)) { - TRACE_ERROR_NUMBER("Error allocating memory for the iterator.",ENOMEM); + if (iter == NULL) { + TRACE_ERROR_NUMBER("Error allocating memory for the iterator.", ENOMEM); return ENOMEM; } /* Allocate memory for the stack */ - iter->stack = (struct collection_item **)(NULL); + iter->stack = NULL; iter->stack_size = 0; iter->stack_depth = 0; iter->flags = mode_flags; /* Allocate memory for stack */ - error = grow_stack(iter,1); + error = grow_stack(iter, 1); if(error) { free(iter); - TRACE_ERROR_NUMBER("Error growing stack.",error); + TRACE_ERROR_NUMBER("Error growing stack.", error); return error; } /* Make sure that we tie iterator to the collection */ - header = (struct collection_header *)(ci->data); - (header->reference_count)++; + header = (struct collection_header *)ci->data; + header->reference_count++; iter->top = ci; *(iter->stack) = ci; iter->stack_depth++; *iterator = iter; - TRACE_FLOW_STRING("bind_iterator","Exit"); + TRACE_FLOW_STRING("bind_iterator", "Exit"); return EOK; } -/* Stop processing this subcollection and move to the next item in the collection 'level' levels up.*/ +/* Stop processing this subcollection and move to the next item in the + * collection 'level' levels up.*/ inline int iterate_up(struct collection_iterator *iterator, int level) { - TRACE_FLOW_STRING("iterate_up","Entry"); + TRACE_FLOW_STRING("iterate_up", "Entry"); - if((iterator == (struct collection_iterator *)(NULL)) || - (level >= iterator->stack_depth)) { - TRACE_ERROR_NUMBER("Invalid parameter.",EINVAL); + if ((iterator == NULL) || (level >= iterator->stack_depth)) { + TRACE_ERROR_NUMBER("Invalid parameter.", EINVAL); return EINVAL; } - TRACE_INFO_NUMBER("Going up:",level); + TRACE_INFO_NUMBER("Going up:", level); iterator->stack_depth--; - TRACE_INFO_NUMBER("Stack depth at the end:",iterator->stack_depth); - TRACE_FLOW_STRING("iterate_up","Exit"); + TRACE_INFO_NUMBER("Stack depth at the end:", iterator->stack_depth); + TRACE_FLOW_STRING("iterate_up", "Exit"); return EOK; } /* How deep are we relative to the top level.*/ inline int get_iterator_depth(struct collection_iterator *iterator, int *depth) { - TRACE_FLOW_STRING("iterate_up","Entry"); + TRACE_FLOW_STRING("iterate_up", "Entry"); - if((iterator == (struct collection_iterator *)(NULL)) || - (depth == (int *)(NULL))) { - TRACE_ERROR_NUMBER("Invalid parameter.",EINVAL); + if ((iterator == NULL) || (depth == NULL)) { + TRACE_ERROR_NUMBER("Invalid parameter.", EINVAL); return EINVAL; } *depth = iterator->stack_depth -1; - TRACE_INFO_NUMBER("Stack depth at the end:",iterator->stack_depth); + TRACE_INFO_NUMBER("Stack depth at the end:", iterator->stack_depth); TRACE_FLOW_STRING("iterate_up","Exit"); return EOK; } @@ -2164,177 +2315,181 @@ inline int get_iterator_depth(struct collection_iterator *iterator, int *depth) /* Unbind the iterator from the collection */ inline void unbind_iterator(struct collection_iterator *iterator) { - TRACE_FLOW_STRING("unbind_iterator","Entry."); - if(iterator != (struct collection_iterator *)(NULL)) { + TRACE_FLOW_STRING("unbind_iterator", "Entry."); + if (iterator != NULL) { destroy_collection(iterator->top); - if(iterator->stack != (struct collection_item **)(NULL)) free(iterator->stack); + if (iterator->stack != NULL) free(iterator->stack); free(iterator); } - TRACE_FLOW_STRING("unbind_iterator","Exit"); + TRACE_FLOW_STRING("unbind_iterator", "Exit"); } /* Get items from the collection one by one following the tree */ -int iterate_collection(struct collection_iterator *iterator, struct collection_item **item) +int iterate_collection(struct collection_iterator *iterator, + struct collection_item **item) { int error; struct collection_item *current; struct collection_item *other; - TRACE_FLOW_STRING("iterate_collection","Entry."); + TRACE_FLOW_STRING("iterate_collection", "Entry."); /* Check if we have storage for item */ - if(item == (struct collection_item **)(NULL)) { - TRACE_ERROR_NUMBER("Invalid parameter.",EINVAL); + if (item == NULL) { + TRACE_ERROR_NUMBER("Invalid parameter.", EINVAL); return EINVAL; } - while(1) { + while (1) { - TRACE_INFO_NUMBER("Stack depth:",iterator->stack_depth); + TRACE_INFO_NUMBER("Stack depth:", iterator->stack_depth); /* Are we done? */ - if(iterator->stack_depth == 0) { - TRACE_FLOW_STRING("We are done.",""); - *item = (struct collection_item *)(NULL); + if (iterator->stack_depth == 0) { + TRACE_FLOW_STRING("We are done.", ""); + *item = NULL; return EOK; } /* Is current item available */ - current = *(iterator->stack + iterator->stack_depth - 1); + current = iterator->stack[iterator->stack_depth - 1]; /* We are not done so check if we have an item */ - if(current != (struct collection_item *)(NULL)) { + if (current != NULL) { - TRACE_INFO_STRING("Current item:",current->property); - TRACE_INFO_NUMBER("Current item type:",current->type); + TRACE_INFO_STRING("Current item:", current->property); + TRACE_INFO_NUMBER("Current item type:", current->type); /* Is this a collection reference */ - if(current->type == COL_TYPE_COLLECTIONREF) { + if (current->type == COL_TYPE_COLLECTIONREF) { /* We do follow references? */ - TRACE_INFO_STRING("Current item:","collection reference"); - if((iterator->flags & COL_TRAVERSE_IGNORE) == 0) { + TRACE_INFO_STRING("Current item:", "collection reference"); + if ((iterator->flags & COL_TRAVERSE_IGNORE) == 0) { /* We should not ignore - then move on */ - TRACE_INFO_STRING("Collection references are not ignored",""); - error = grow_stack(iterator,iterator->stack_depth + 1); - if(error) { - TRACE_ERROR_NUMBER("Error growing stack.",error); + TRACE_INFO_STRING("Collection references are not ignored", ""); + error = grow_stack(iterator, iterator->stack_depth + 1); + if (error) { + TRACE_ERROR_NUMBER("Error growing stack.", error); return error; } /* Do we need to go deeper than one level ? */ - if((iterator->flags & COL_TRAVERSE_ONELEVEL) == 0) { - TRACE_INFO_STRING("Need to go deeper",""); + if ((iterator->flags & COL_TRAVERSE_ONELEVEL) == 0) { + TRACE_INFO_STRING("Need to go deeper", ""); /* We need to go deeper... */ /* Do we need to show headers but not reference? */ - if((iterator->flags & COL_TRAVERSE_ONLYSUB) != 0) { - TRACE_INFO_STRING("Instructed to show header not reference",""); - other = *((struct collection_item **)(current->data)); - *(iterator->stack + iterator->stack_depth) = other->next; + if ((iterator->flags & COL_TRAVERSE_ONLYSUB) != 0) { + TRACE_INFO_STRING("Instructed to show header not reference", ""); + other = *((struct collection_item **)current->data); + iterator->stack[iterator->stack_depth] = other->next; *item = other; } /* Do we need to show both? */ - else if((iterator->flags & COL_TRAVERSE_SHOWSUB) != 0) { + else if ((iterator->flags & COL_TRAVERSE_SHOWSUB) != 0) { TRACE_INFO_STRING("Instructed to show header and reference",""); - *(iterator->stack + iterator->stack_depth) = *((struct collection_item **)(current->data)); + iterator->stack[iterator->stack_depth] = *((struct collection_item **)(current->data)); *item = current; } /* We need to show reference only */ else { - TRACE_INFO_STRING("Instructed to show reference only",""); - other = *((struct collection_item **)(current->data)); - TRACE_INFO_STRING("Sub collection:",other->property); - TRACE_INFO_NUMBER("Sub collection type:",other->type); - *(iterator->stack + iterator->stack_depth) = other->next; - if(other->next != (struct collection_item *)(NULL)) { - TRACE_INFO_STRING("Will show this item next time:",(other->next)->property); - TRACE_INFO_NUMBER("Will show this item next time type:",(other->next)->type); + TRACE_INFO_STRING("Instructed to show reference only", ""); + other = *((struct collection_item **)current->data); + TRACE_INFO_STRING("Sub collection:", other->property); + TRACE_INFO_NUMBER("Sub collection type:", other->type); + iterator->stack[iterator->stack_depth] = other->next; + if (other->next != NULL) { + TRACE_INFO_STRING("Will show this item next time:", other->next->property); + TRACE_INFO_NUMBER("Will show this item next time type:", other->next->type); } *item = current; } - TRACE_INFO_STRING("We return item:",(*item)->property); - TRACE_INFO_NUMBER("We return item type:",(*item)->type); - TRACE_INFO_STRING("Moving to the next item on the previous item in stack",""); - *(iterator->stack + iterator->stack_depth - 1) = current->next; - (iterator->stack_depth)++; + TRACE_INFO_STRING("We return item:", (*item)->property); + TRACE_INFO_NUMBER("We return item type:", (*item)->type); + TRACE_INFO_STRING("Moving to the next item on the previous item in stack", ""); + iterator->stack[iterator->stack_depth - 1] = current->next; + iterator->stack_depth++; } else { - TRACE_INFO_STRING("Instructed to parse just one level",""); + TRACE_INFO_STRING("Instructed to parse just one level", ""); /* On one level - just return current */ *item = current; - TRACE_INFO_STRING("Moving to the next item on one level",""); - *(iterator->stack + iterator->stack_depth - 1) = current->next; + TRACE_INFO_STRING("Moving to the next item on one level", ""); + iterator->stack[iterator->stack_depth - 1] = current->next; } break; } else { /* We need to ignore references so move to the next item */ - TRACE_INFO_STRING("Stepping over the reference",""); - *(iterator->stack + iterator->stack_depth - 1) = current->next; + TRACE_INFO_STRING("Stepping over the reference", ""); + iterator->stack[iterator->stack_depth - 1] = current->next; continue; } } else { /* Got a normal item - return it and move to the next one */ - TRACE_INFO_STRING("Simple item",""); + TRACE_INFO_STRING("Simple item", ""); *item = current; - *(iterator->stack + iterator->stack_depth - 1) = current->next; + iterator->stack[iterator->stack_depth - 1] = current->next; break; } } else { /* Item is NULL */ - TRACE_INFO_STRING("Finished level","moving to upper level"); + TRACE_INFO_STRING("Finished level", "moving to upper level"); iterator->stack_depth--; - TRACE_INFO_NUMBER("Stack depth at the end:",iterator->stack_depth); - if((iterator->flags & COL_TRAVERSE_END) != 0) { + TRACE_INFO_NUMBER("Stack depth at the end:", iterator->stack_depth); + if ((iterator->flags & COL_TRAVERSE_END) != 0) { /* Return dummy entry to indicate the end of the collection */ - TRACE_INFO_STRING("Finished level","told to return END"); + TRACE_INFO_STRING("Finished level", "told to return END"); *item = &dummy; break; } - else continue; /* Move to next level */ + else { + /* Move to next level */ + continue; + } } } - TRACE_FLOW_STRING("iterate_collection","Exit"); + TRACE_FLOW_STRING("iterate_collection", "Exit"); return EOK; } /* Set collection class */ -inline int set_collection_class(struct collection_item *item, unsigned class) +inline int set_collection_class(struct collection_item *item, unsigned cclass) { struct collection_header *header; - TRACE_FLOW_STRING("set_collection_class","Entry"); + TRACE_FLOW_STRING("set_collection_class", "Entry"); - if(item->type != COL_TYPE_COLLECTION) { - TRACE_INFO_NUMBER("Not a collectin object. Type is",item->type); + if (item->type != COL_TYPE_COLLECTION) { + TRACE_INFO_NUMBER("Not a collectin object. Type is", item->type); return EINVAL; } - header = (struct collection_header *)(item->data); - header->class = class; - TRACE_FLOW_STRING("set_collection_class","Exit"); + header = (struct collection_header *)item->data; + header->cclass = cclass; + TRACE_FLOW_STRING("set_collection_class", "Exit"); return EOK; } /* Get collection class */ inline int get_collection_class(struct collection_item *item, - unsigned *class) + unsigned *cclass) { struct collection_header *header; - TRACE_FLOW_STRING("get_collection_class","Entry"); + TRACE_FLOW_STRING("get_collection_class", "Entry"); - if(item->type != COL_TYPE_COLLECTION) { - TRACE_ERROR_NUMBER("Not a collection object. Type is",item->type); + if (item->type != COL_TYPE_COLLECTION) { + TRACE_ERROR_NUMBER("Not a collection object. Type is", item->type); return EINVAL; } - header = (struct collection_header *)(item->data); - *class = header->class; - TRACE_FLOW_STRING("get_collection_class","Exit"); + header = (struct collection_header *)item->data; + *cclass = header->cclass; + TRACE_FLOW_STRING("get_collection_class", "Exit"); return EOK; } @@ -2344,38 +2499,40 @@ inline int get_collection_count(struct collection_item *item, { struct collection_header *header; - TRACE_FLOW_STRING("get_collection_count","Entry"); + TRACE_FLOW_STRING("get_collection_count", "Entry"); - if(item->type != COL_TYPE_COLLECTION) { - TRACE_ERROR_NUMBER("Not a collectin object. Type is",item->type); + if (item->type != COL_TYPE_COLLECTION) { + TRACE_ERROR_NUMBER("Not a collectin object. Type is", item->type); return EINVAL; } - header = (struct collection_header *)(item->data); + header = (struct collection_header *)item->data; *count = header->count; - TRACE_FLOW_STRING("get_collection_count","Exit"); + TRACE_FLOW_STRING("get_collection_count", "Exit"); return EOK; } /* Convinience function to check if the collection is of the specific class */ /* In case of internal error assumes that collection is not of the right class */ -inline int is_of_class(struct collection_item *item,unsigned class) +inline int is_of_class(struct collection_item *item, unsigned cclass) { int error = EOK; unsigned ret_class = 0; - TRACE_FLOW_STRING("is_of_class invoked",""); + TRACE_FLOW_STRING("is_of_class invoked", ""); - error = get_collection_class(item,&ret_class); - if((error) || (ret_class != class)) return 0; - else return 1; + error = get_collection_class(item, &ret_class); + if (error || (ret_class != cclass)) + return 0; + else + return 1; } /* Get propery */ inline char *get_item_property(struct collection_item *ci,int *property_len) { - if(property_len != NULL) *property_len = ci->property_len; + if (property_len != NULL) *property_len = ci->property_len; return ci->property; } @@ -2399,42 +2556,45 @@ void *get_item_data(struct collection_item *ci) /* Set time stamp in the collection - FIXME move to another level */ -int set_timestamp(struct collection_item *ci,struct collection_item **timestr_ref,struct collection_item **timeint_ref) +int set_timestamp(struct collection_item *ci, + struct collection_item **timestr_ref, + struct collection_item **timeint_ref) { time_t utctime; struct tm time_struct; char time_array[TIME_ARRAY_SIZE+1]; int len; - struct collection_item *timestr = (struct collection_item *)(NULL); - struct collection_item *timeint = (struct collection_item *)(NULL); + struct collection_item *timestr = NULL; + struct collection_item *timeint = NULL; int error = EOK; - TRACE_FLOW_STRING("set_timestamp","Entry point"); + TRACE_FLOW_STRING("set_timestamp", "Entry point"); utctime = time(NULL); - localtime_r(&utctime,&time_struct); + localtime_r(&utctime, &time_struct); len = strftime(time_array, TIME_ARRAY_SIZE, DATE_FORMAT, &time_struct); - if(len == 0) { - TRACE_ERROR_STRING("add_time","CODING ERROR - INCREASE THE BUFFER"); + if (len == 0) { + TRACE_ERROR_STRING("add_time", "CODING ERROR - INCREASE THE BUFFER"); return EMSGSIZE; } - TRACE_INFO_STRING("Timestamp:",time_array); + TRACE_INFO_STRING("Timestamp:", time_array); /* Check if we have the timestamp item already */ - error = get_item(ci, TS_NAME, COL_TYPE_STRING,COL_TRAVERSE_IGNORE,×tr); - if(error) { - TRACE_ERROR_NUMBER("search failed with error:",error); + error = get_item(ci, TS_NAME, COL_TYPE_STRING, + COL_TRAVERSE_IGNORE, ×tr); + if (error) { + TRACE_ERROR_NUMBER("search failed with error:", error); return error; } - if(timestr != (struct collection_item *)(NULL)) { + if (timestr != NULL) { /* There is a timestamp */ free(timestr->data); timestr->data = strdup(time_array); - if(timestr->data == NULL) { - TRACE_ERROR_NUMBER("failed to add timestamp property:",error); + if (timestr->data == NULL) { + TRACE_ERROR_NUMBER("failed to add timestamp property:", error); return ENOMEM; } timestr->length = len+1; @@ -2442,35 +2602,38 @@ int set_timestamp(struct collection_item *ci,struct collection_item **timestr_re } else { /* Add timestamp to the collection */ - error = add_str_property_with_ref(ci,NULL, TS_NAME,time_array,len+1,timestr_ref); - if(error) { - TRACE_ERROR_NUMBER("failed to add timestamp property:",error); + error = add_str_property_with_ref(ci, NULL, TS_NAME, + time_array, len+1, timestr_ref); + if (error) { + TRACE_ERROR_NUMBER("failed to add timestamp property:", error); return error; } } /* Check if we have the time item already */ - error = get_item(ci, T_NAME, COL_TYPE_INTEGER,COL_TRAVERSE_IGNORE,&timeint); - if(error) { - TRACE_ERROR_NUMBER("search failed with error:",error); + error = get_item(ci, T_NAME, COL_TYPE_INTEGER, + COL_TRAVERSE_IGNORE, &timeint); + if (error) { + TRACE_ERROR_NUMBER("search failed with error:", error); return error; } - if(timeint != (struct collection_item *)(NULL)) { + if (timeint != NULL) { /* There is a time property */ *((int *)(timeint->data)) = utctime; *timeint_ref = timeint; } else { /* Add time to the collection */ - error = add_int_property_with_ref(ci,NULL, T_NAME,utctime,timeint_ref); - if(error) { - TRACE_ERROR_NUMBER("failed to add time property:",error); + error = add_int_property_with_ref(ci, NULL, T_NAME, + utctime, timeint_ref); + if (error) { + TRACE_ERROR_NUMBER("failed to add time property:", error); return error; } } - TRACE_FLOW_STRING("set_timestamp","Exit point"); + TRACE_FLOW_STRING("set_timestamp", "Exit point"); return EOK; } diff --git a/common/collection/collection.h b/common/collection/collection.h index bccf3e3cf..ddb741258 100644 --- a/common/collection/collection.h +++ b/common/collection/collection.h @@ -26,7 +26,8 @@ #define EOK 0 #endif -#define COL_TYPE_STRING 0x00000001 /* For elements of type string the trailing 0 is counted into the length. */ +#define COL_TYPE_STRING 0x00000001 /* For elements of type string the + lenght includes the trailing 0 */ #define COL_TYPE_BINARY 0x00000002 #define COL_TYPE_INTEGER 0x00000004 #define COL_TYPE_UNSIGNED 0x00000008 @@ -34,10 +35,18 @@ #define COL_TYPE_ULONG 0x00000020 #define COL_TYPE_DOUBLE 0x00000040 #define COL_TYPE_BOOL 0x00000080 -#define COL_TYPE_COLLECTION 0x00000100 /* The item of this type denotes that starting element of a collection */ -#define COL_TYPE_COLLECTIONREF 0x00000200 /* The item of this type denotes a pointer to already existing external collection */ -#define COL_TYPE_END 0x10000000 /* Special type that denotes the end of the collection. Useful when traversing collection */ -#define COL_TYPE_ANY 0x0FFFFFFF /* Special type that denotes any. Useful when traversing collection */ +#define COL_TYPE_COLLECTION 0x00000100 /* The item of this type denotes + that starting element of a + collection */ +#define COL_TYPE_COLLECTIONREF 0x00000200 /* An item of this type is a pointer + to an existing external + collection */ +#define COL_TYPE_END 0x10000000 /* Special type that denotes the end + of the collection. Useful when + traversing collections */ +#define COL_TYPE_ANY 0x0FFFFFFF /* Special type that denotes any. + Useful when traversing + collections */ /* Any data we deal with can't be longer than this */ /* FIXME - make it compile time option */ @@ -48,31 +57,53 @@ /* The modes that define how one collection can be added to another */ -#define COL_ADD_MODE_REFERENCE 0 /* One collection will contain a pointer of another */ -#define COL_ADD_MODE_EMBED 1 /* One collection will be donated to become a part of another collection. - * After that the donating connection handle should not be used or freed. - * It means that it can be donated only once. The donation attempt will - * fail if the collection is referenced by other collection. */ -#define COL_ADD_MODE_CLONE 2 /* Creates a deep copy of a collection with its sub collections */ +#define COL_ADD_MODE_REFERENCE 0 /* The collection will contain a pointer + to another */ +#define COL_ADD_MODE_EMBED 1 /* The collection will become part of + another collection. + After this operation the handle should + not be used or freed. + Can't be done more than once. + If the collection is referenced by + another collection, the operation will + fail. */ +#define COL_ADD_MODE_CLONE 2 /* Creates a deep copy of a collection with + its sub collections */ /* Modes how the collection is traversed */ -#define COL_TRAVERSE_DEFAULT 0x00000000 /* No special flags - means it will go through all the items */ -#define COL_TRAVERSE_ONELEVEL 0x00000001 /* Flag to traverse only high level - ignored it IGNORE flag is specified */ -#define COL_TRAVERSE_END 0x00000002 /* Call handler once more when end of the collection is reached - good for processing nested collections */ - /* Flag is implied for iterator unless FLAT flag is specified */ -#define COL_TRAVERSE_IGNORE 0x00000004 /* Ignore sub collections at all as if there are none */ -#define COL_TRAVERSE_FLAT 0x00000008 /* Flatten the collection - FIXME - not implemented yet */ -/* Additional iterator flags - not respected by traverse functions */ -#define COL_TRAVERSE_SHOWSUB 0x00010000 /* Include header of the sub collections - respected by iterator */ - /* By default iterator returns just references and skips headers */ - /* Ignored if ONELEVEL flag is specified and not ignored */ - /* Ignored if FLAT flag is specified */ -#define COL_TRAVERSE_ONLYSUB 0x00020000 /* Show header of the sub collection instead of reference - respected by iterator */ - /* Ignored if ONELEVEL flag is specified and not ignored */ - /* Ignored if FLAT flag is specified */ - -/* FIXME - move to event level - this does not belong to collection */ +#define COL_TRAVERSE_DEFAULT 0x00000000 /* Traverse all items */ +#define COL_TRAVERSE_ONELEVEL 0x00000001 /* Flag to traverse only top level + ignored if the IGNORE flag is + specified */ +#define COL_TRAVERSE_END 0x00000002 /* Call the handler once more when the + end of the collection is reached. + Good for processing nested + collections. + Implicit for iterators unless + the FLAT flag is specified */ +#define COL_TRAVERSE_IGNORE 0x00000004 /* Ignore sub collections as if none + is present */ +#define COL_TRAVERSE_FLAT 0x00000008 /* Flatten the collection. + FIXME: not implemented yet */ + +/* Additional iterator flags + * NOTE: ignored by traverse functions */ +#define COL_TRAVERSE_SHOWSUB 0x00010000 /* Include headers of sub collections + By default iterators return just + references and skips headers. + Ignored if the ONELEVEL flag is + specified and not ignored. + Ignored if the FLAT flag is + specified. */ +#define COL_TRAVERSE_ONLYSUB 0x00020000 /* Show the header of the sub + collection instead of reference. + Ignored if the ONELEVEL flag is + specified and not ignored. + Ignored if the FLAT flag is + specified. */ + +/* FIXME: move to event level - this does not belong to collection */ /* Time stamp property name */ #define TS_NAME "stamp" /* Time property name */ @@ -105,49 +136,53 @@ struct collection_item; struct collection_iterator; #endif /* COLLECTION_PRIV_H */ -/* IMPORTANT - the collection is a set of items of different types. +/* IMPORTANT - the collection is a set of items of different type. * There is always a header item in any collection that starts the collection. - * Most of the functions in the interface (unless it is explicitly mentioned - * otherwise) assume that the collection_item * argument points to the header element. - * Passing in elements extracted from the middle of collection to the functions + * Most of the functions in the interface (unless explicitly stated otherwise) + * assume that the collection_item * argument points to the header element. + * Passing in elements extracted from the middle of a collection to functions * that expect header elements is illegal. There might be not enough checking * at the moment but this will be enforced in future versions of the library. * IMPORTANT - To better understand how collections work imagine travel bags. - * They usually come in different sizes and one can put a bag in a bag when they put away - * to the shelf in a garage or closet. Collection is such bag except that you - * can put other bags into each other even if they are not empty. + * They usually come in different sizes and one can put a bag in a bag when + * they put away to the shelf in a garage or closet. Collection is such bag + * except that you can put other bags into each other even if they are not + * empty. * When you put items into a bag you do not see the contents of the bag. * You just hold the bag. How many other bags inside this bag you do not know. * But you might know that you put a "valet" somewhere there. * You ask the bag you hold: "find my valet and give it to me". * get_item function will return you the item that is you "valet". - * You can then change something or just get information about the item you retrieved. - * But in most cases you do not the valet itself. You want to get something from the vallet - * or put something into it. IMO money would be an obvious choice. - * To do this you use update_xxx_property functions. - * There might be a bag somewhere deep and you might want to add something to it. - * add_xxx_property_xxx functions allow you to specify sub collection you want the item - * to be added to. If this sub collection argument is NULL top level collection is assumed. - * The search in the collections users a dotted notation to refer to an item (or property) - * You can search for "valet" and it will find any first instance of the "valet" in - * your luggage. But you might have two valets. One is yours and another is your significant other's. - * So you might say find "my.valet". It will find valet in your bad (collection) named "my". - * This collection can be many levels deep inside other collections. You do not need to know - * the full path to get to it. But if you have the full path you can use the fill path - * like this "luggage.newbags.my.valet". - * It is useful to be able to put bags into bags as well as get them out of each other. - * When the collection is created the header keeps a reference count on how many - * copies of the collection are known to the world. So one can put a collection into collection - * and give up its access to it (embed) of still hold to the reference. - * By embedding the collection the caller effectively gives up its responsibility - * to destroy the collection after it is used. - * By extracting reference from an internal collection the caller gains access to the - * collection directly and thus has responsibility to destroy it after use. + * You can then change something or just get information about the item you + * retrieved. But in most cases you do not the valet itself. You want to get + * something from the vallet or put something into it. IMO money would be an + * obvious choice. To do this you use update_xxx_property functions. + * There might be a bag somewhere deep and you might want to add something to + * it. add_xxx_property_xxx functions allow you to specify sub collection you + * want the item to be added to. If this sub collection argument is NULL top + * level collection is assumed. + * The search in the collections users a dotted notation to refer to an item (or + * property). You can search for "valet" and it will find any first instance of + * the "valet" in your luggage. But you might have two valets. One is yours and + * another is your significant other's. So you might say find "my.valet". + * It will find valet in your bad (collection) named "my". This collection can + * be many levels deep inside other collections. You do not need to know the + * full path to get to it. But if you have the full path you can use the fill + * path like this "luggage.newbags.my.valet". + * It is useful to be able to put bags into bags as well as get them out of each + * other. When the collection is created the header keeps a reference count on + * how many copies of the collection are known to the world. So one can put a + * collection into collection and give up its access to it (embed) of still hold + * to the reference. By embedding the collection the caller effectively gives + * up its responsibility to destroy the collection after it is used. + * By extracting reference from an internal collection the caller gains access + * to the collection directly and thus has responsibility to destroy it after + * use. */ /* Function that creates an named collection */ -int create_collection(struct collection_item **ci,char *name,unsigned class); +int create_collection(struct collection_item **ci, char *name,unsigned cclass); /* Function that destroys a collection */ void destroy_collection(struct collection_item *ci); @@ -155,88 +190,131 @@ void destroy_collection(struct collection_item *ci); /* Family of functions that add properties to an event */ /* See details about subcollection argument above. */ /* Family includes the following convinience functions: */ -/* Add a string property to collection. Length should include the null terminating 0 */ -int add_str_property(struct collection_item *ci,char *subcollection, char *property,char *string,int length); +/* Add a string property to collection. The length should include the + * terminating 0 */ +int add_str_property(struct collection_item *ci, char *subcollection, + char *property, char *string, int length); /* Add a binary property to collection. */ -int add_binary_property(struct collection_item *ci,char *subcollection, char *property,void *binary_data,int length); +int add_binary_property(struct collection_item *ci, char *subcollection, + char *property, void *binary_data, int length); /* Add an int property to collection. */ -int add_int_property(struct collection_item *ci,char *subcollection, char *property,int number); +int add_int_property(struct collection_item *ci, char *subcollection, + char *property, int number); /* Add an unsigned int property. */ -int add_unsigned_property(struct collection_item *ci,char *subcollection, char *property,unsigned int number); +int add_unsigned_property(struct collection_item *ci, char *subcollection, + char *property,unsigned int number); /* Add a long property. */ -int add_long_property(struct collection_item *ci,char *subcollection, char *property,long number); +int add_long_property(struct collection_item *ci, char *subcollection, + char *property, long number); /* Add an unsigned long property. */ -int add_ulong_property(struct collection_item *ci,char *subcollection, char *property,unsigned long number); +int add_ulong_property(struct collection_item *ci, char *subcollection, + char *property, unsigned long number); /* Add a double property. */ -int add_double_property(struct collection_item *ci,char *subcollection, char *property,double number); +int add_double_property(struct collection_item *ci, char *subcollection, + char *property,double number); /* Add a bool property. */ -int add_bool_property(struct collection_item *ci,char *subcollection, char *property,unsigned char logical); +int add_bool_property(struct collection_item *ci, char *subcollection, + char *property, unsigned char logical); /* Add any property */ -int add_any_property(struct collection_item *ci, /* Collection to find things in */ +int add_any_property(struct collection_item *ci, /* A collection of items */ char *subcollection, /* Subcollection */ char *property, /* Name */ - int type, /* Type of the passed in data */ - void *data, /* Pointer to the new data */ - int length); /* Length of the data. For strings should include trailing 0 */ - -/* The functions that add an item and immediately return you this item in the ret_ref parameter */ -int add_str_property_with_ref(struct collection_item *ci,char *subcollection, char *property,char *string,int length, + int type, /* Data type */ + void *data, /* Pointer to the data */ + int length); /* Length of the data. For + strings it includes the + trailing 0 */ + +/* The functions that add an item and immediately return you this item + * in the ret_ref parameter */ +int add_str_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property, char *string, int length, struct collection_item **ret_ref); -int add_binary_property_with_ref(struct collection_item *ci,char *subcollection, char *property,void *binary_data,int length, +int add_binary_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property, void *binary_data, int length, struct collection_item **ret_ref); -int add_int_property_with_ref(struct collection_item *ci,char *subcollection, char *property,int number, +int add_int_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property, int number, struct collection_item **ret_ref); -int add_unsigned_property_with_ref(struct collection_item *ci,char *subcollection, char *property,unsigned int number, +int add_unsigned_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property,unsigned int number, struct collection_item **ret_ref); -int add_long_property_with_ref(struct collection_item *ci,char *subcollection, char *property,long number, +int add_long_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property, long number, struct collection_item **ret_ref); -int add_ulong_property_with_ref(struct collection_item *ci,char *subcollection, char *property,unsigned long number, +int add_ulong_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property, unsigned long number, struct collection_item **ret_ref); -int add_double_property_with_ref(struct collection_item *ci,char *subcollection, char *property,double number, - struct collection_item **ret_ref); -int add_bool_property_with_ref(struct collection_item *ci,char *subcollection, char *property,unsigned char logical, +int add_double_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property, double number, struct collection_item **ret_ref); -int add_any_property_with_ref(struct collection_item *ci,char *subcollection,char *property,int type,void *data,int length, +int add_bool_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property, unsigned char logical, + struct collection_item **ret_ref); +int add_any_property_with_ref(struct collection_item *ci, + char *subcollection, + char *property, int type, void *data, int length, struct collection_item **ret_ref); /* FIXME - does not belong here - move to other place */ /* Function to create a timestamp */ -/* Automatically adds/updates time and timestamp properties in the collection returning references */ +/* Automatically adds/updates time and timestamp properties in the + * collection returning references */ int set_timestamp(struct collection_item *ci, struct collection_item **timestr_ref, struct collection_item **timeint_ref); /* Update functions */ -/* All update functions search the property using the search algorithm described at the top of the header file. +/* All update functions search the property using the search algorithm + * described at the top of the header file. * Use same dotted notation to specify a property. */ -/* Update a string property in the collection. Length should include the null terminating 0 */ -int update_str_property(struct collection_item *ci, char *property,int mode_flags, char *string,int length); +/* Update a string property in the collection. + * Length should include the terminating 0 */ +int update_str_property(struct collection_item *ci, char *property, + int mode_flags, char *string,int length); /* Update a binary property in the collection. */ -int update_binary_property(struct collection_item *ci, char *property,int mode_flags, void *binary_data,int length); +int update_binary_property(struct collection_item *ci, char *property, + int mode_flags, void *binary_data,int length); /* Update an int property in the collection. */ -int update_int_property(struct collection_item *ci, char *property,int mode_flags, int number); +int update_int_property(struct collection_item *ci, char *property, + int mode_flags, int number); /* Update an unsigned int property. */ -int update_unsigned_property(struct collection_item *ci, char *property,int mode_flags, unsigned int number); +int update_unsigned_property(struct collection_item *ci, char *property, + int mode_flags, unsigned int number); /* Update a long property. */ -int update_long_property(struct collection_item *ci, char *property,int mode_flags ,long number); +int update_long_property(struct collection_item *ci, char *property, + int mode_flags, long number); /* Update an unsigned long property. */ -int update_ulong_property(struct collection_item *ci, char *property,int mode_flags, unsigned long number); +int update_ulong_property(struct collection_item *ci, char *property, + int mode_flags, unsigned long number); /* Update a double property. */ -int update_double_property(struct collection_item *ci, char *property,int mode_flags, double number); +int update_double_property(struct collection_item *ci, char *property, + int mode_flags, double number); /* Update a double property. */ -int update_bool_property(struct collection_item *ci, char *property,int mode_flags, unsigned char logical); +int update_bool_property(struct collection_item *ci, char *property, + int mode_flags, unsigned char logical); /* Update property in the collection */ -int update_property(struct collection_item *ci, /* Collection to find things in */ - char *property_to_find, /* Name to match */ - int type, /* Type of the passed in data */ - void *new_data, /* Pointer to the new data */ - int length, /* Length of the data. For strings should include trailing 0 */ - int mode_flags); /* How to traverse the collection */ +int update_property(struct collection_item *ci, /* A collection of items */ + char *property_to_find, /* Name to match */ + int type, /* Data type */ + void *new_data, /* Pointer to the data */ + int length, /* Length of the data. For + strings, it includes the + trailing 0 */ + int mode_flags); /* How to traverse the collection */ @@ -283,12 +361,12 @@ int traverse_collection(struct collection_item *ci, /* Collection to traverse the data passed in custom_data and see if the item was found and that the action was performed. */ -int get_item_and_do(struct collection_item *ci, /* Collection to find things in */ - char *property_to_find, /* Name to match */ - int type, /* Type filter */ - int mode_flags, /* How to traverse the collection */ - item_fn item_handler, /* Function to call when the item is found */ - void *custom_data); /* Custom data passed around */ +int get_item_and_do(struct collection_item *ci, /* A collection of items */ + char *property_to_find, /* Name to match */ + int type, /* Type filter */ + int mode_flags, /* How to traverse the collection */ + item_fn item_handler, /* Function to call when the item is found */ + void *custom_data); /* Custom data passed around */ /* Convenience function to get individual item */ /* Caller should be aware that this is not a copy of the item @@ -354,7 +432,7 @@ int modify_double_item(struct collection_item *item, double number); /* Delete property from the collection */ -int delete_property(struct collection_item *ci, /* Collection to find things in */ +int delete_property(struct collection_item *ci, /* A collection of items */ char *property_to_find, /* Name to match */ int type, /* Type filter */ int mode_flags); /* How to traverse the collection */ @@ -381,18 +459,21 @@ int get_reference_from_item(struct collection_item *ci, /* Reference el /* Bind iterator to a collection */ -int bind_iterator(struct collection_iterator **iterator, /* The iterator to bind */ - struct collection_item *ci, /* Collection to bind iterator to */ - int mode_flags); /* How the collection needs to be iterated */ +int bind_iterator(struct collection_iterator **iterator, /* The iterator to bind */ + struct collection_item *ci, /* Collection to bind iterator to */ + int mode_flags); /* How the collection needs to be iterated */ /* Unbind the iterator from the collection */ void unbind_iterator(struct collection_iterator *iterator); /* Get items from the collection one by one following the tree */ -int iterate_collection(struct collection_iterator *iterator, struct collection_item **item); +int iterate_collection(struct collection_iterator *iterator, + struct collection_item **item); -/* Stop processing this subcollection and move to the next item in the collection 'level' levels up.*/ -/* 'Level' parameter indicates how many levels up you want to jump. If 0 - call is a no op. +/* Stop processing this subcollection and move to the next item in the + * collection 'level' levels up. + * The 'Level' parameter indicates how many levels up you want to jump. + * If 0 - call is a no op. * If the depth is less than requested level function will return error EINVAL. */ int iterate_up(struct collection_iterator *iterator, int level); @@ -403,24 +484,26 @@ int get_iterator_depth(struct collection_iterator *iterator, int *depth); /* FIXME - Do we need to be able to rewind iterator? */ /* Set collection class */ -int set_collection_class(struct collection_item *item, /* Collection */ - unsigned class); /* Class of the collection */ +int set_collection_class(struct collection_item *item, /* Collection */ + unsigned cclass); /* Collection class */ /* Get collection class */ -int get_collection_class(struct collection_item *item, /* Collection */ - unsigned *class); /* Class of the collection */ +int get_collection_class(struct collection_item *item, /* Collection */ + unsigned *cclass); /* Collection class */ /* Get collection count */ -int get_collection_count(struct collection_item *item, /* Collection */ - unsigned *count); /* Count of elements in this collection. - * Each subcollection is counted as 1 element. - */ +int get_collection_count(struct collection_item *item, /* Collection */ + unsigned *count); /* Number of elements in + this collection. + Each subcollection is + counted as 1 element. + */ /* Convenience function to check if the collection is of the specific class */ /* In case of internal error assumes that collection is not of the right class */ -int is_of_class(struct collection_item *item, /* Collection */ - unsigned class); /* Class of the collection */ +int is_of_class(struct collection_item *item, /* Collection */ + unsigned cclass); /* Class of the collection */ diff --git a/common/collection/collection_priv.h b/common/collection/collection_priv.h index 8dd6d8022..38d9012a6 100644 --- a/common/collection/collection_priv.h +++ b/common/collection/collection_priv.h @@ -63,7 +63,7 @@ struct collection_header { struct collection_item *last; unsigned reference_count; unsigned count; - unsigned class; + unsigned cclass; }; #endif diff --git a/common/collection/collection_tools.c b/common/collection/collection_tools.c index ed44707d6..63c037604 100644 --- a/common/collection/collection_tools.c +++ b/common/collection/collection_tools.c @@ -41,109 +41,112 @@ int debug_handle(char *property, int i; int nest_level; - TRACE_FLOW_STRING("debug_handle","Entry."); + TRACE_FLOW_STRING("debug_handle", "Entry."); nest_level = *(int *)(custom_data); - TRACE_INFO_NUMBER("We are getting this pointer:",custom_data); - TRACE_INFO_NUMBER("Nest level:",nest_level); - - switch(type) { - case COL_TYPE_STRING: - printf("%*s %s[%d] str: %s (%d)\n", - (nest_level-1)*4,"", - property, - length, - (char *)(data), - (int)(nest_level)); - break; - case COL_TYPE_BINARY: - printf("%*s %s[%d] bin: ", - (nest_level-1)*4,"", - property, - length); - for(i=0;i<length;i++) printf("%02X",*((unsigned char *)(data+i))); - printf(" (%d)\n",(int)(nest_level)); - break; - case COL_TYPE_INTEGER: - printf("%*s %s[%d] int: %d (%d)\n", - (nest_level-1)*4,"", - property, - length, - *((int *)(data)), - nest_level); - break; - case COL_TYPE_UNSIGNED: - printf("%*s %s[%d] uint: %u (%d)\n", - (nest_level-1)*4,"", - property, - length, - *((unsigned int *)(data)), - nest_level); - break; - case COL_TYPE_LONG: - printf("%*s %s[%d] long: %ld (%d)\n", - (nest_level-1)*4,"", - property, - length, - *((long *)(data)), - nest_level); - break; - case COL_TYPE_ULONG: - printf("%*s %s[%d] ulong: %lu (%d)\n", - (nest_level-1)*4,"", - property, - length, - *((unsigned long *)(data)), - nest_level); - break; - case COL_TYPE_DOUBLE: - printf("%*s %s[%d] double: %.4f (%d)\n", - (nest_level-1)*4,"", - property, - length, - *((double *)(data)), - nest_level); - break; - case COL_TYPE_BOOL: - printf("%*s %s[%d] bool: %s (%d)\n", - (nest_level-1)*4,"", - property, - length, - (*((unsigned char *)(data)) == '\0') ? "flase" : "true", - (int)(nest_level)); - break; - case COL_TYPE_COLLECTION: - nest_level++; - printf("%*s %s[%d] header: count %d, ref_count %d class %d data: ", - (nest_level-1)*4,"", - property, - length, - ((struct collection_header *)(data))->count, - ((struct collection_header *)(data))->reference_count, - ((struct collection_header *)(data))->class); - for(i=0;i<length;i++) printf("%02X",*((unsigned char *)(data+i))); - printf(" (%d)\n",(int)(nest_level)); - break; - case COL_TYPE_COLLECTIONREF: - printf("%*s %s[%d] external link: ", - (nest_level-1)*4,"", - property, - length); - for(i=0;i<length;i++) printf("%02X",*((unsigned char *)(data+i))); - printf(" (%d)\n",(int)(nest_level)); - break; - case COL_TYPE_END: - nest_level--; - /* printf("Reduced nest level\n");*/ - break; - default: - printf("Not implemented yet.\n"); - break; + TRACE_INFO_NUMBER("We are getting this pointer:", custom_data); + TRACE_INFO_NUMBER("Nest level:", nest_level); + + switch (type) { + case COL_TYPE_STRING: + printf("%*s %s[%d] str: %s (%d)\n", + (nest_level -1) * 4, "", + property, + length, + (char *)(data), + nest_level); + break; + case COL_TYPE_BINARY: + printf("%*s %s[%d] bin: ", + (nest_level -1) * 4, "", + property, + length); + for (i = 0; i < length; i++) + printf("%02X", ((unsigned char *)(data))[i]); + printf(" (%d)\n", nest_level); + break; + case COL_TYPE_INTEGER: + printf("%*s %s[%d] int: %d (%d)\n", + (nest_level -1) * 4, "", + property, + length, + *((int *)(data)), + nest_level); + break; + case COL_TYPE_UNSIGNED: + printf("%*s %s[%d] uint: %u (%d)\n", + (nest_level -1) * 4, "", + property, + length, + *((unsigned int *)(data)), + nest_level); + break; + case COL_TYPE_LONG: + printf("%*s %s[%d] long: %ld (%d)\n", + (nest_level -1) * 4, "", + property, + length, + *((long *)(data)), + nest_level); + break; + case COL_TYPE_ULONG: + printf("%*s %s[%d] ulong: %lu (%d)\n", + (nest_level -1) * 4, "", + property, + length, + *((unsigned long *)(data)), + nest_level); + break; + case COL_TYPE_DOUBLE: + printf("%*s %s[%d] double: %.4f (%d)\n", + (nest_level -1) * 4, "", + property, + length, + *((double *)(data)), + nest_level); + break; + case COL_TYPE_BOOL: + printf("%*s %s[%d] bool: %s (%d)\n", + (nest_level -1) * 4, "", + property, + length, + (*((unsigned char *)(data)) == '\0') ? "flase" : "true", + nest_level); + break; + case COL_TYPE_COLLECTION: + nest_level++; + printf("%*s %s[%d] header: count %d, ref_count %d class %d data: ", + (nest_level -1) * 4, "", + property, + length, + ((struct collection_header *)(data))->count, + ((struct collection_header *)(data))->reference_count, + ((struct collection_header *)(data))->cclass); + for (i = 0; i < length; i++) + printf("%02X", ((unsigned char *)(data))[i]); + printf(" (%d)\n", nest_level); + break; + case COL_TYPE_COLLECTIONREF: + printf("%*s %s[%d] external link: ", + (nest_level -1) * 4, "", + property, + length); + for (i = 0; i < length; i++) + printf("%02X", ((unsigned char *)(data))[i]); + printf(" (%d)\n", nest_level); + break; + case COL_TYPE_END: + nest_level--; + /* printf("Reduced nest level\n");*/ + break; + default: + printf("Not implemented yet.\n"); + break; } *(int *)(custom_data) = nest_level; - TRACE_INFO_NUMBER("Nest level at the end:",nest_level); - TRACE_FLOW_STRING("debug_handle","Success exit."); + TRACE_INFO_NUMBER("Nest level at the end:", nest_level); + TRACE_FLOW_STRING("debug_handle", "Success exit."); return EOK; } @@ -163,24 +166,25 @@ inline int debug_item(struct collection_item *item) /* Print collection for debugging purposes */ -int debug_collection(struct collection_item *handle,int flag) +int debug_collection(struct collection_item *handle, int flag) { int error = EOK; - int nest_level=0; + int nest_level = 0; - TRACE_FLOW_STRING("debug_collection","Entry."); + TRACE_FLOW_STRING("debug_collection", "Entry."); - printf("DEBUG COLLECTION %s\n",handle->property); + printf("DEBUG COLLECTION %s\n", handle->property); flag |= COL_TRAVERSE_END; - printf("Traverse flags %d\n",flag); + printf("Traverse flags %d\n", flag); /* Traverse collection */ - error = traverse_collection(handle,flag,debug_handle,(void *)(&nest_level)); - if(error) printf("Error debuging collection %d\n",error); + error = traverse_collection(handle, flag, + debug_handle, (void *)(&nest_level)); + if (error) printf("Error debuging collection %d\n", error); - TRACE_FLOW_STRING("debug_collection","Exit."); + TRACE_FLOW_STRING("debug_collection", "Exit."); return error; } @@ -188,16 +192,33 @@ int debug_collection(struct collection_item *handle,int flag) /* Return a static string based on type of the element */ static inline const char *get_type(int type) { - switch(type) { - case COL_TYPE_STRING: return COL_TYPE_NAME_STRING; - case COL_TYPE_INTEGER: return COL_TYPE_NAME_INTEGER; - case COL_TYPE_UNSIGNED: return COL_TYPE_NAME_UNSIGNED; - case COL_TYPE_LONG: return COL_TYPE_NAME_LONG; - case COL_TYPE_ULONG: return COL_TYPE_NAME_ULONG; - case COL_TYPE_BINARY: return COL_TYPE_NAME_BINARY; - case COL_TYPE_DOUBLE: return COL_TYPE_NAME_DOUBLE; - case COL_TYPE_BOOL: return COL_TYPE_NAME_BOOL; - default: return COL_TYPE_NAME_UNKNOWN; + switch (type) { + case COL_TYPE_STRING: + return COL_TYPE_NAME_STRING; + + case COL_TYPE_INTEGER: + return COL_TYPE_NAME_INTEGER; + + case COL_TYPE_UNSIGNED: + return COL_TYPE_NAME_UNSIGNED; + + case COL_TYPE_LONG: + return COL_TYPE_NAME_LONG; + + case COL_TYPE_ULONG: + return COL_TYPE_NAME_ULONG; + + case COL_TYPE_BINARY: + return COL_TYPE_NAME_BINARY; + + case COL_TYPE_DOUBLE: + return COL_TYPE_NAME_DOUBLE; + + case COL_TYPE_BOOL: + return COL_TYPE_NAME_BOOL; + + default: + return COL_TYPE_NAME_UNKNOWN; } } @@ -207,28 +228,32 @@ int get_data_len(int type, int length) { int len = 0; - TRACE_FLOW_STRING("util_get_item_len","Entry point"); - - switch(type) { - case COL_TYPE_INTEGER: - case COL_TYPE_UNSIGNED: - case COL_TYPE_LONG: - case COL_TYPE_ULONG: - len = 15; - break; - case COL_TYPE_STRING: - case COL_TYPE_BINARY: - len = length * 2 + 2; - break; - case COL_TYPE_DOUBLE: - len = 64; - break; - case COL_TYPE_BOOL: - len = 6; - break; - default: - len = 0; - break; + TRACE_FLOW_STRING("util_get_item_len", "Entry point"); + + switch (type) { + case COL_TYPE_INTEGER: + case COL_TYPE_UNSIGNED: + case COL_TYPE_LONG: + case COL_TYPE_ULONG: + len = 15; + break; + + case COL_TYPE_STRING: + case COL_TYPE_BINARY: + len = length * 2 + 2; + break; + + case COL_TYPE_DOUBLE: + len = 64; + break; + + case COL_TYPE_BOOL: + len = 6; + break; + + default: + len = 0; + break; } TRACE_FLOW_STRING("util_get_item_len","Exit point"); @@ -237,27 +262,27 @@ int get_data_len(int type, int length) } /* Copy data escaping characters */ -static int copy_esc(char *dest,char *source,char esc) +static int copy_esc(char *dest, char *source, char esc) { - int i=0; - int j=0; + int i = 0; + int j = 0; - *(dest +j) = esc; + dest[j] = esc; j++; - while(*(source+i) != '\0') { - if((*(source+i) == '\\') || - (*(source+i) == esc)) { + while (source[i]) { + if ((source[i] == '\\') || + (source[i] == esc)) { - *(dest +j) = '\\'; + dest[j] = '\\'; j++; } - *(dest +j) = *(source +i); + dest[j] = source[i]; i++; j++; } - *(dest +j) = esc; + dest[j] = esc; j++; return j; @@ -266,30 +291,30 @@ static int copy_esc(char *dest,char *source,char esc) /* Grow buffer to accomodate more space */ int grow_buffer(struct serial_data *buf_data, int len) { - void *tmp; + char *tmp; - TRACE_FLOW_STRING("grow_buffer","Entry point"); - TRACE_INFO_NUMBER("Current length: ",buf_data->length); - TRACE_INFO_NUMBER("Increment length: ",len); - TRACE_INFO_NUMBER("Expected length: ",buf_data->length+len); - TRACE_INFO_NUMBER("Current size: ",buf_data->size); + TRACE_FLOW_STRING("grow_buffer", "Entry point"); + TRACE_INFO_NUMBER("Current length: ", buf_data->length); + TRACE_INFO_NUMBER("Increment length: ", len); + TRACE_INFO_NUMBER("Expected length: ", buf_data->length+len); + TRACE_INFO_NUMBER("Current size: ", buf_data->size); /* Grow buffer if needed */ - while(buf_data->length+len >= buf_data->size) { + while (buf_data->length+len >= buf_data->size) { errno = 0; - tmp = realloc(buf_data->buffer,buf_data->size+BLOCK_SIZE); - if(tmp == NULL) { - TRACE_ERROR_NUMBER("Error. Failed to allocate memory. Errno: ",errno); + tmp = realloc(buf_data->buffer, buf_data->size + BLOCK_SIZE); + if (tmp == NULL) { + TRACE_ERROR_NUMBER("Error. Failed to allocate memory. Errno: ", errno); return errno; } - buf_data->buffer = (char *)(tmp); + buf_data->buffer = tmp; buf_data->size += BLOCK_SIZE; - TRACE_INFO_NUMBER("New size: ",buf_data->size); + TRACE_INFO_NUMBER("New size: ", buf_data->size); } - TRACE_INFO_NUMBER("Final size: ",buf_data->size); - TRACE_FLOW_STRING("grow_buffer","Success Exit."); + TRACE_INFO_NUMBER("Final size: ", buf_data->size); + TRACE_FLOW_STRING("grow_buffer", "Success Exit."); return EOK; } @@ -298,17 +323,17 @@ int put_marker(struct serial_data *buf_data, void *data, int len) { int error = EOK; - TRACE_FLOW_STRING("put_marker","Entry point"); - TRACE_INFO_NUMBER("Marker length: ",len); + TRACE_FLOW_STRING("put_marker", "Entry point"); + TRACE_INFO_NUMBER("Marker length: ", len); error = grow_buffer(buf_data, len); - if(error) { - TRACE_ERROR_NUMBER("grow_buffer failed with: ",error); + if (error) { + TRACE_ERROR_NUMBER("grow_buffer failed with: ", error); return error; } - memcpy(buf_data->buffer+buf_data->length,data,len); - buf_data->length+=len; - *(buf_data->buffer+buf_data->length) = '\0'; + memcpy(buf_data->buffer + buf_data->length, data, len); + buf_data->length += len; + buf_data->buffer[buf_data->length] = '\0'; TRACE_FLOW_STRING("put_marker","Success exit"); return error; @@ -337,21 +362,21 @@ int serialize(char *property_in, *dummy = 0; /* Check is there is buffer. If not allocate */ - buf_data = (struct serial_data *)(custom_data); - if(buf_data == (struct serial_data *)(NULL)) { - TRACE_ERROR_STRING("Error.","Storage data is not passed in!"); + buf_data = (struct serial_data *)custom_data; + if (buf_data == NULL) { + TRACE_ERROR_STRING("Error.", "Storage data is not passed in!"); return EINVAL; } - if(buf_data->buffer == NULL) { - TRACE_INFO_STRING("First time use.","Allocating buffer."); + if (buf_data->buffer == NULL) { + TRACE_INFO_STRING("First time use.", "Allocating buffer."); errno = 0; buf_data->buffer = malloc(BLOCK_SIZE); - if(buf_data->buffer == NULL) { - TRACE_ERROR_NUMBER("Error. Failed to allocate memory. Errno: ",errno); + if (buf_data->buffer == NULL) { + TRACE_ERROR_NUMBER("Error. Failed to allocate memory. Errno: ", errno); return errno; } - *(buf_data->buffer)='\0'; - buf_data->length=0; + buf_data->buffer[0] = '\0'; + buf_data->length = 0; buf_data->size = BLOCK_SIZE; } @@ -360,35 +385,37 @@ int serialize(char *property_in, TRACE_INFO_STRING("Buffer: ", buf_data->buffer); /* Check the beginning of the collection */ - if(type == COL_TYPE_COLLECTION) { + if (type == COL_TYPE_COLLECTION) { TRACE_INFO_STRING("Serializing collection: ", property_in); TRACE_INFO_STRING("First header. ", ""); - if((error=put_marker(buf_data,"(",1))) return error; + error = put_marker(buf_data, "(", 1); + if (error != EOK) return error; property = TEXT_COLLECTION; property_len = TEXT_COLLEN; data = property_in; - length = property_len_in+1; - type=COL_TYPE_STRING; + length = property_len_in + 1; + type = COL_TYPE_STRING; buf_data->nest_level++; } /* Check for subcollections */ - else if(type==COL_TYPE_COLLECTIONREF) { + else if (type == COL_TYPE_COLLECTIONREF) { /* Skip */ - TRACE_FLOW_STRING("serialize","skip reference return"); + TRACE_FLOW_STRING("serialize", "skip reference return"); return EOK; } /* Check for the end of the collection */ - else if(type==COL_TYPE_END) { - if((buf_data->length>0) && - (*(buf_data->buffer+buf_data->length-1) == ',')) { + else if (type == COL_TYPE_END) { + if ((buf_data->length > 0) && + (buf_data->buffer[buf_data->length-1] == ',')) { buf_data->length--; - *(buf_data->buffer+buf_data->length) = '\0'; + buf_data->buffer[buf_data->length] = '\0'; } - if(buf_data->nest_level>0) { + if (buf_data->nest_level > 0) { buf_data->nest_level--; - if((error=put_marker(buf_data,")",1))) return error; + error = put_marker(buf_data, ")", 1); + if (error != EOK) return error; } - TRACE_FLOW_STRING("serialize","end collection item processed returning"); + TRACE_FLOW_STRING("serialize", "end collection item processed returning"); return EOK; } else { @@ -402,9 +429,9 @@ int serialize(char *property_in, TRACE_INFO_NUMBER("Property length: ", property_len); /* Start with property and "=" */ - if((error=put_marker(buf_data,property,property_len)) || - (error=put_marker(buf_data,"=",1))) { - TRACE_ERROR_NUMBER("put_marker returned error: ",error); + if ((error = put_marker(buf_data, property, property_len)) || + (error = put_marker(buf_data, "=", 1))) { + TRACE_ERROR_NUMBER("put_marker returned error: ", error); return error; } /* Get projected length of the item */ @@ -413,60 +440,77 @@ int serialize(char *property_in, TRACE_INFO_STRING("Buffer so far: ", buf_data->buffer); /* Make sure we have enough space */ - if((error=grow_buffer(buf_data,len))) { - TRACE_ERROR_NUMBER("grow_buffer returned error: ",error); + if ((error = grow_buffer(buf_data, len))) { + TRACE_ERROR_NUMBER("grow_buffer returned error: ", error); return error; } /* Add the value */ - switch(type) { - case COL_TYPE_STRING: - /* Escape double quotes */ - len = copy_esc(buf_data->buffer+buf_data->length,(char *)(data),'"'); - break; - case COL_TYPE_BINARY: - *(buf_data->buffer+buf_data->length) = '\''; - for(i=0;i<length;i++) sprintf(buf_data->buffer+buf_data->length+i*2 + 1,"%02X",*((unsigned char *)(data+i))); - len = length * 2 + 1; - *(buf_data->buffer+buf_data->length + len) = '\''; - len++; - break; - case COL_TYPE_INTEGER: - len = sprintf(buf_data->buffer+buf_data->length,"%d",*((int *)(data))); - break; - case COL_TYPE_UNSIGNED: - len = sprintf(buf_data->buffer+buf_data->length,"%u",*((unsigned int *)(data))); - break; - case COL_TYPE_LONG: - len = sprintf(buf_data->buffer+buf_data->length,"%ld",*((long *)(data))); - break; - case COL_TYPE_ULONG: - len = sprintf(buf_data->buffer+buf_data->length,"%lu",*((unsigned long *)(data))); - break; - case COL_TYPE_DOUBLE: - len = sprintf(buf_data->buffer+buf_data->length,"%.4f",*((double *)(data))); - break; - case COL_TYPE_BOOL: - len = sprintf(buf_data->buffer+buf_data->length,"%s",(*((unsigned char *)(data)) == '\0') ? "false" : "true"); - break; - default: - *(buf_data->buffer+buf_data->length) = '\0'; - len = 0; - break; + switch (type) { + case COL_TYPE_STRING: + /* Escape double quotes */ + len = copy_esc(&buf_data->buffer[buf_data->length], (char *)(data), '"'); + break; + + case COL_TYPE_BINARY: + buf_data->buffer[buf_data->length] = '\''; + for (i = 0; i < length; i++) + sprintf(&buf_data->buffer[buf_data->length + i *2] + 1, + "%02X", (unsigned int)(((unsigned char *)(data))[i])); + len = length * 2 + 1; + buf_data->buffer[buf_data->length + len] = '\''; + len++; + break; + + case COL_TYPE_INTEGER: + len = sprintf(&buf_data->buffer[buf_data->length], + "%d", *((int *)(data))); + break; + + case COL_TYPE_UNSIGNED: + len = sprintf(&buf_data->buffer[buf_data->length], + "%u", *((unsigned int *)(data))); + break; + + case COL_TYPE_LONG: + len = sprintf(&buf_data->buffer[buf_data->length], + "%ld", *((long *)(data))); + break; + + case COL_TYPE_ULONG: + len = sprintf(&buf_data->buffer[buf_data->length], + "%lu", *((unsigned long *)(data))); + break; + + case COL_TYPE_DOUBLE: + len = sprintf(&buf_data->buffer[buf_data->length], + "%.4f", *((double *)(data))); + break; + + case COL_TYPE_BOOL: + len = sprintf(&buf_data->buffer[buf_data->length], + "%s", (*((unsigned char *)(data))) ? "true" : "false"); + break; + + default: + buf_data->buffer[buf_data->length] = '\0'; + len = 0; + break; } /* Adjust length */ - buf_data->length+=len; - *(buf_data->buffer+buf_data->length) = '\0'; + buf_data->length += len; + buf_data->buffer[buf_data->length] = '\0'; /* Always put a comma at the end */ - if((error=put_marker(buf_data,",",1))) { - TRACE_ERROR_NUMBER("put_marker returned error: ",error); + error = put_marker(buf_data, ",", 1); + if (error != EOK) { + TRACE_ERROR_NUMBER("put_marker returned error: ", error); return error; } - TRACE_INFO_STRING("Data: ",buf_data->buffer); - TRACE_FLOW_STRING("serialize","Exit point"); + TRACE_INFO_STRING("Data: ", buf_data->buffer); + TRACE_FLOW_STRING("serialize", "Exit point"); return EOK; } @@ -481,15 +525,19 @@ int print_collection(struct collection_item *handle) printf("COLLECTION:\n"); - buf_data.buffer=NULL; - buf_data.length=0; - buf_data.size=0; - buf_data.nest_level=0; + buf_data.buffer = NULL; + buf_data.length = 0; + buf_data.size = 0; + buf_data.nest_level = 0; /* Traverse collection */ - error = traverse_collection(handle,COL_TRAVERSE_DEFAULT | COL_TRAVERSE_END ,serialize,(void *)(&buf_data)); - if(error) printf("Error traversing collection %d\n",error); - else printf("%s\n",buf_data.buffer); + error = traverse_collection(handle, + COL_TRAVERSE_DEFAULT | COL_TRAVERSE_END , + serialize, (void *)(&buf_data)); + if (error) + printf("Error traversing collection %d\n", error); + else + printf("%s\n", buf_data.buffer); free(buf_data.buffer); @@ -500,41 +548,42 @@ int print_collection(struct collection_item *handle) /* Print the collection using iterator */ int print_collection2(struct collection_item *handle) { - struct collection_iterator *iterator = (struct collection_iterator *)(NULL); + struct collection_iterator *iterator = NULL; int error = EOK; - struct collection_item *item = (struct collection_item *)(NULL); - int nest_level=0; + struct collection_item *item = NULL; + int nest_level = 0; int dummy = 0; int line = 1; TRACE_FLOW_STRING("print_collection2", "Entry"); /* If we have something to print print it */ - if(handle == (struct collection_item *)(NULL)) { - TRACE_ERROR_STRING("No error list",""); + if (handle == NULL) { + TRACE_ERROR_STRING("No error list", ""); return EINVAL; } /* Bind iterator */ - error = bind_iterator(&iterator,handle,COL_TRAVERSE_DEFAULT|COL_TRAVERSE_END|COL_TRAVERSE_SHOWSUB); - if(error) { - TRACE_ERROR_NUMBER("Error (bind):",error); + error = bind_iterator(&iterator, handle, + COL_TRAVERSE_DEFAULT| COL_TRAVERSE_END| COL_TRAVERSE_SHOWSUB); + if (error) { + TRACE_ERROR_NUMBER("Error (bind):", error); return error; } do { /* Loop through a collection */ error = iterate_collection(iterator, &item); - if(error) { - TRACE_ERROR_NUMBER("Error (iterate):",error); + if (error) { + TRACE_ERROR_NUMBER("Error (iterate):", error); unbind_iterator(iterator); return error; } /* Are we done ? */ - if(item == (struct collection_item *)(NULL)) break; + if (item == NULL) break; - if(item->type != COL_TYPE_END) printf("%05d",line); + if (item->type != COL_TYPE_END) printf("%05d", line); debug_handle(item->property, item->property_len, @@ -564,21 +613,25 @@ int print_item(struct collection_item *handle, char *name) printf("FIND ITEM:\n"); - buf_data.buffer=NULL; - buf_data.length=0; - buf_data.size=0; - buf_data.nest_level=0; + buf_data.buffer = NULL; + buf_data.length = 0; + buf_data.size = 0; + buf_data.nest_level = 0; - error = get_item_and_do(handle, name, COL_TYPE_ANY,COL_TRAVERSE_DEFAULT, serialize,&buf_data); - if(error) printf("Error searching collection %d\n",error); + error = get_item_and_do(handle, name, COL_TYPE_ANY, + COL_TRAVERSE_DEFAULT, serialize, &buf_data); + if(error) printf("Error searching collection %d\n", error); else { - if(buf_data.buffer != NULL) { - if(buf_data.length> 0) buf_data.length--; - *(buf_data.buffer+buf_data.length)= '\0', - printf("%s\n",buf_data.buffer); + if (buf_data.buffer != NULL) { + if (buf_data.length > 0) buf_data.length--; + buf_data.buffer[buf_data.length] = '\0', + printf("%s\n", buf_data.buffer); free(buf_data.buffer); } - else printf("Name %s is not found in the collection %s.\n",name,handle->property); + else { + printf("Name %s is not found in the collection %s.\n", + name, handle->property); + } } TRACE_FLOW_NUMBER("print_item returning", error); diff --git a/common/ini/ini_config.c b/common/ini/ini_config.c index fafc565d7..01acdd694 100644 --- a/common/ini/ini_config.c +++ b/common/ini/ini_config.c @@ -68,19 +68,21 @@ /* Function to return parsing error */ inline const char *parsing_error_str(int parsing_error) { - char *placeholder= _("Unknown error."); - char *str_error[] = { _("Data is too long."), - _("No closing bracket."), - _("Section name is missing."), - _("Section name is too long."), - _("Equal sign is missing."), - _("Property name is missing."), - _("Property name is too long.") + const char *placeholder= _("Unknown error."); + const char *str_error[] = { _("Data is too long."), + _("No closing bracket."), + _("Section name is missing."), + _("Section name is too long."), + _("Equal sign is missing."), + _("Property name is missing."), + _("Property name is too long.") }; /* Check the range */ - if((parsing_error < 1) || (parsing_error > ERR_MAXPARSE)) return (const char *)placeholder; - else return (const char *)(str_error[parsing_error-1]); + if ((parsing_error < 1) || (parsing_error > ERR_MAXPARSE)) + return placeholder; + else + return str_error[parsing_error-1]; } #else @@ -88,8 +90,8 @@ inline const char *parsing_error_str(int parsing_error) inline const char *parsing_error_str(int parsing_error) { - char *placeholder= _("Parsing errors are not compiled."); - return (const char*)(placeholder); + const char *placeholder= _("Parsing errors are not compiled."); + return placeholder; } #endif @@ -104,19 +106,23 @@ static int add_or_update(struct collection_item *current_section, int type) { int found = COL_NOMATCH; - int error = EOK; + int error; TRACE_FLOW_STRING("add_or_update", "Entry"); - (void)is_item_in_collection(current_section,key,COL_TYPE_ANY,COL_TRAVERSE_IGNORE,&found); + error = is_item_in_collection(current_section, key, + COL_TYPE_ANY, COL_TRAVERSE_IGNORE, &found); - if(found == COL_MATCH) { + if (found == COL_MATCH) { TRACE_INFO_STRING("Updating...", ""); - error = update_property(current_section,key,type,value,length,COL_TRAVERSE_IGNORE); + error = update_property(current_section, + key, type, value, length, + COL_TRAVERSE_IGNORE); } else { TRACE_INFO_STRING("Adding...", ""); - error = add_any_property(current_section,NULL,key,type,value,length); + error = add_any_property(current_section, NULL, + key, type, value, length); } TRACE_FLOW_NUMBER("add_or_update returning", error); @@ -137,7 +143,7 @@ static int ini_to_collection(const char *filename, int section_count = 0; char *key = NULL; char *value = NULL; - struct collection_item *current_section = (struct collection_item *)(NULL); + struct collection_item *current_section = NULL; int length; int ext_err = -1; struct parse_error pe; @@ -148,17 +154,17 @@ static int ini_to_collection(const char *filename, /* Open file for reading */ file = fopen(filename,"r"); - if(file == NULL) { + if (file == NULL) { error = errno; TRACE_ERROR_NUMBER("Failed to open file - but this is OK", error); return EOK; } /* Open the collection of errors */ - if(error_list != (struct collection_item **)(NULL)) { - *error_list = (struct collection_item *)(NULL); - error = create_collection(error_list,(char *)filename,COL_CLASS_INI_PERROR); - if(error) { + if (error_list != NULL) { + *error_list = NULL; + error = create_collection(error_list, filename, COL_CLASS_INI_PERROR); + if (error) { TRACE_ERROR_NUMBER("Failed to create error collection", error); fclose(file); return EOK; @@ -167,112 +173,125 @@ static int ini_to_collection(const char *filename, } /* Read file lines */ - while((status = read_line(file,&key,&value,&length,&ext_err)) != RET_EOF) { + while (1) { + status = read_line(file, &key, &value, &length, &ext_err); + if (status == RET_EOF) break; line++; - switch(status) { - case RET_PAIR: - /* Do we have a section at the top of the file ? */ - if(section_count == 0) { - /* Check if collection already exists */ - error = get_collection_reference(ini_config,¤t_section,INI_DEFAULT_SECTION); - if(error != EOK) { - /* Create default collection */ - if((error=create_collection(¤t_section,INI_DEFAULT_SECTION,COL_CLASS_INI_SECTION)) || - (error=add_collection_to_collection(ini_config,NULL,NULL, - current_section, - COL_ADD_MODE_REFERENCE))) { - TRACE_ERROR_NUMBER("Failed to create collection", error); - fclose(file); - destroy_collection(current_section); - if(created) destroy_collection(*error_list); - return error; - } - } - section_count++; - } - - /* Put value into the collection */ - if((error=add_or_update(current_section,key,value,length,COL_TYPE_STRING))) { - TRACE_ERROR_NUMBER("Failed to add pair to collection", error); - fclose(file); - destroy_collection(current_section); - if(created) destroy_collection(*error_list); - return error; - } - break; - - case RET_SECTION: - /* Read a new section */ + switch (status) { + case RET_PAIR: + /* Do we have a section at the top of the file ? */ + if (section_count == 0) { + /* Check if collection already exists */ + error = get_collection_reference(ini_config, ¤t_section, + INI_DEFAULT_SECTION); + if (error != EOK) { + /* Create default collection */ + if ((error = create_collection(¤t_section, + INI_DEFAULT_SECTION, + COL_CLASS_INI_SECTION)) || + (error = add_collection_to_collection(ini_config, + NULL,NULL, + current_section, + COL_ADD_MODE_REFERENCE))) { + TRACE_ERROR_NUMBER("Failed to create collection", error); + fclose(file); destroy_collection(current_section); - current_section = (struct collection_item *)(NULL); - - error = get_collection_reference(ini_config,¤t_section,key); - if(error != EOK) { - /* Create default collection */ - if((error=create_collection(¤t_section,key,COL_CLASS_INI_SECTION)) || - (error=add_collection_to_collection(ini_config,NULL,NULL, - current_section, - COL_ADD_MODE_REFERENCE))) { - TRACE_ERROR_NUMBER("Failed to add collection", error); - fclose(file); - destroy_collection(current_section); - if(created) destroy_collection(*error_list); - return error; - } - } - section_count++; - break; - - case RET_EMPTY: - TRACE_INFO_STRING("Empty string", ""); - break; - - case RET_COMMENT: - TRACE_INFO_STRING("Comment", ""); - break; - - case RET_ERROR: - pe.line = line; - pe.error = ext_err; - error = add_binary_property(*error_list,NULL, ERROR_TXT,(void *)&pe,sizeof(pe)); - if(error) { - TRACE_ERROR_NUMBER("Failed to add error to collection", error); - fclose(file); - destroy_collection(current_section); - if(created) destroy_collection(*error_list); - return error; - } - /* Exit if there was an error parsing file */ - if(error_level != INI_STOP_ON_NONE) { - TRACE_ERROR_STRING("Invalid format of the file", ""); - destroy_collection(current_section); - fclose(file); - return EIO; - } - break; - case RET_INVALID: - default: - pe.line = line; - pe.error = ext_err; - error = add_binary_property(*error_list,NULL, WARNING_TXT,(void *)&pe,sizeof(pe)); - if(error) { - TRACE_ERROR_NUMBER("Failed to add warning to collection", error); - fclose(file); - destroy_collection(current_section); - if(created) destroy_collection(*error_list); - return error; - } - /* Exit if we are told to exit on warnings */ - if(error_level == INI_STOP_ON_ANY) { - TRACE_ERROR_STRING("Invalid format of the file", ""); - if(created) destroy_collection(current_section); - fclose(file); - return EIO; - } - TRACE_ERROR_STRING("Invalid string", ""); - break; + if (created) destroy_collection(*error_list); + return error; + } + } + section_count++; + } + + /* Put value into the collection */ + error = add_or_update(current_section, + key, value, length, COL_TYPE_STRING); + if (error != EOK) { + TRACE_ERROR_NUMBER("Failed to add pair to collection", error); + fclose(file); + destroy_collection(current_section); + if (created) destroy_collection(*error_list); + return error; + } + break; + + case RET_SECTION: + /* Read a new section */ + destroy_collection(current_section); + current_section = NULL; + + error = get_collection_reference(ini_config, ¤t_section, key); + if (error != EOK) { + /* Create default collection */ + if ((error = create_collection(¤t_section, key, + COL_CLASS_INI_SECTION)) || + (error = add_collection_to_collection(ini_config, + NULL, NULL, + current_section, + COL_ADD_MODE_REFERENCE))) { + TRACE_ERROR_NUMBER("Failed to add collection", error); + fclose(file); + destroy_collection(current_section); + if (created) destroy_collection(*error_list); + return error; + } + } + section_count++; + break; + + case RET_EMPTY: + TRACE_INFO_STRING("Empty string", ""); + break; + + case RET_COMMENT: + TRACE_INFO_STRING("Comment", ""); + break; + + case RET_ERROR: + pe.line = line; + pe.error = ext_err; + error = add_binary_property(*error_list, NULL, + ERROR_TXT, &pe, sizeof(pe)); + if (error) { + TRACE_ERROR_NUMBER("Failed to add error to collection", error); + fclose(file); + destroy_collection(current_section); + if (created) destroy_collection(*error_list); + return error; + } + /* Exit if there was an error parsing file */ + if (error_level != INI_STOP_ON_NONE) { + TRACE_ERROR_STRING("Invalid format of the file", ""); + destroy_collection(current_section); + fclose(file); + return EIO; + } + break; + + case RET_INVALID: + default: + pe.line = line; + pe.error = ext_err; + error = add_binary_property(*error_list, NULL, + WARNING_TXT, &pe, sizeof(pe)); + if (error) { + TRACE_ERROR_NUMBER("Failed to add warning to collection", error); + fclose(file); + destroy_collection(current_section); + if (created) destroy_collection(*error_list); + return error; + } + /* Exit if we are told to exit on warnings */ + if (error_level == INI_STOP_ON_ANY) { + TRACE_ERROR_STRING("Invalid format of the file", ""); + if (created) destroy_collection(current_section); + fclose(file); + return EIO; + } + TRACE_ERROR_STRING("Invalid string", ""); + break; } ext_err = -1; } @@ -304,39 +323,44 @@ int config_from_file(const char *application, TRACE_FLOW_STRING("config_from_file", "Entry"); - if((ini_config == (struct collection_item **)(NULL)) || - (application == NULL)) { + if ((ini_config == NULL) || + (application == NULL)) { TRACE_ERROR_NUMBER("Invalid argument", EINVAL); return EINVAL; } /* Create collection if needed */ - if(*ini_config == (struct collection_item *)(NULL)) { - if((error=create_collection(ini_config,(char *)application,COL_CLASS_INI_CONFIG))) { + if (*ini_config == NULL) { + error = create_collection(ini_config, + application, + COL_CLASS_INI_CONFIG); + if (error != EOK) { TRACE_ERROR_NUMBER("Failed to create collection", error); return error; } created = 1; } /* Is the collection of the right class? */ - else if(is_of_class(*ini_config,COL_CLASS_INI_CONFIG)) { + else if (is_of_class(*ini_config, COL_CLASS_INI_CONFIG)) { TRACE_ERROR_NUMBER("Wrong collection type", EINVAL); return EINVAL; } /* Do the actual work */ - error = ini_to_collection((char *)config_file, *ini_config,error_level, error_list); + error = ini_to_collection(config_file, *ini_config, + error_level, error_list); /* In case of error when we created collection - delete it */ - if((error) && (created)) { + if (error && created) { destroy_collection(*ini_config); - *ini_config = (struct collection_item *)(NULL); + *ini_config = NULL; } TRACE_FLOW_NUMBER("config_from_file. Returns", error); return error; } -/* Read default config file and then overwrite it with a specific one from the directory */ +/* Read default config file and then overwrite it with a specific one + * from the directory */ int config_for_app(const char *application, const char *config_file, const char *config_dir, @@ -344,131 +368,142 @@ int config_for_app(const char *application, int error_level, struct collection_item **error_set) { - int error=EOK; + int error = EOK; char *file_name; - struct collection_item *error_list_common = (struct collection_item *)(NULL); - struct collection_item *error_list_specific = (struct collection_item *)(NULL); - struct collection_item **pass_common = (struct collection_item **)(NULL); - struct collection_item **pass_specific = (struct collection_item **)(NULL); + struct collection_item *error_list_common = NULL; + struct collection_item *error_list_specific = NULL; + struct collection_item **pass_common = NULL; + struct collection_item **pass_specific = NULL; int created = 0; TRACE_FLOW_STRING("config_to_collection", "Entry"); - if(ini_config == (struct collection_item **)(NULL)) { + if (ini_config == NULL) { TRACE_ERROR_NUMBER("Failed to create collection", EINVAL); return EINVAL; } /* Prepare error collection pointers */ - if(error_set != (struct collection_item **)(NULL)) { + if (error_set != NULL) { TRACE_INFO_STRING("Error set is not NULL", "preparing error set"); pass_common = &error_list_common; pass_specific = &error_list_specific; - *error_set = (struct collection_item *)(NULL); + *error_set = NULL; /* Construct the overarching error collection */ - if((error=create_collection(error_set,FILE_ERROR_SET,COL_CLASS_INI_PESET))) { + error = create_collection(error_set, + FILE_ERROR_SET, + COL_CLASS_INI_PESET); + if (error != EOK) { TRACE_ERROR_NUMBER("Failed to create collection", error); return error; } } else { TRACE_INFO_STRING("No error set. Errors will not be captured", ""); - pass_common = (struct collection_item **)(NULL); - pass_specific = (struct collection_item **)(NULL); + pass_common = NULL; + pass_specific = NULL; } /* Create collection if needed */ - if(*ini_config == (struct collection_item *)(NULL)) { + if (*ini_config == NULL) { TRACE_INFO_STRING("New config collection. Allocate.", ""); - if((error=create_collection(ini_config,(char *)application,COL_CLASS_INI_CONFIG))) { + error = create_collection(ini_config, + application, + COL_CLASS_INI_CONFIG); + if (error != EOK) { TRACE_ERROR_NUMBER("Failed to create collection", error); destroy_collection(*error_set); - *error_set = (struct collection_item *)(NULL); + *error_set = NULL; return error; } } /* Is the collection of the right class? */ - else if(is_of_class(*ini_config,COL_CLASS_INI_CONFIG)) { + else if (is_of_class(*ini_config, COL_CLASS_INI_CONFIG)) { TRACE_ERROR_NUMBER("Wrong collection type", EINVAL); return EINVAL; } /* Read master file */ - if(config_file != NULL) { + if (config_file != NULL) { TRACE_INFO_STRING("Reading master file:", config_file); - if((error = ini_to_collection(config_file,*ini_config, error_level, pass_common))) { + error = ini_to_collection(config_file, *ini_config, + error_level, pass_common); + if (error != EOK) { TRACE_ERROR_NUMBER("Failed to read master file", error); /* In case of error when we created collection - delete it */ - if((error) && (created)) { + if(error && created) { destroy_collection(*ini_config); - *ini_config = (struct collection_item *)(NULL); + *ini_config = NULL; } /* We do not clear the error_set here */ return error; } /* Add error results if any to the overarching error collection */ - if((pass_common != (struct collection_item **)(NULL)) && - (*pass_common != (struct collection_item *)(NULL))) { + if ((pass_common != NULL) && (*pass_common != NULL)) { TRACE_INFO_STRING("Process erros resulting from file:", config_file); - error = add_collection_to_collection(*error_set,NULL,NULL,*pass_common,COL_ADD_MODE_EMBED); - if(error) { - if(created) { + error = add_collection_to_collection(*error_set, NULL, NULL, + *pass_common, + COL_ADD_MODE_EMBED); + if (error) { + if (created) { destroy_collection(*ini_config); - *ini_config = (struct collection_item *)(NULL); + *ini_config = NULL; } destroy_collection(*error_set); - *error_set = (struct collection_item *)(NULL); + *error_set = NULL; TRACE_ERROR_NUMBER("Failed to add error collection to another error collection", error); return error; } } } - if(config_dir != NULL) { + if (config_dir != NULL) { /* Get specific application file */ file_name = malloc(strlen(config_dir) + strlen(application) + NAME_OVERHEAD); - if(file_name == NULL) { + if (file_name == NULL) { error = errno; TRACE_ERROR_NUMBER("Failed to allocate memory for file name", error); /* In case of error when we created collection - delete it */ - if((error) && (created)) { + if(error && created) { destroy_collection(*ini_config); - *ini_config = (struct collection_item *)(NULL); + *ini_config = NULL; } destroy_collection(*error_set); - *error_set = (struct collection_item *)(NULL); + *error_set = NULL; return error; } - sprintf(file_name,"%s%s%s.conf",config_dir, SLASH, application); + sprintf(file_name, "%s%s%s.conf", config_dir, SLASH, application); TRACE_INFO_STRING("Opening file:", file_name); /* Read master file */ - error = ini_to_collection(file_name,*ini_config,error_level,pass_specific); + error = ini_to_collection(file_name, *ini_config, + error_level, pass_specific); free(file_name); - if(error) { + if (error) { TRACE_ERROR_NUMBER("Failed to read specific application file", error); /* In case of error when we created collection - delete it */ - if((error) && (created)) { + if (error && created) { destroy_collection(*ini_config); - *ini_config = (struct collection_item *)(NULL); + *ini_config = NULL; } /* We do not clear the error_set here */ return error; } /* Add error results if any to the overarching error collection */ - if((pass_specific != (struct collection_item **)(NULL)) && - (*pass_specific != (struct collection_item *)(NULL))) { + if ((pass_specific != NULL) && (*pass_specific != NULL)) { TRACE_INFO_STRING("Process erros resulting from file:", file_name); - error = add_collection_to_collection(*error_set,NULL,NULL,*pass_specific,COL_ADD_MODE_EMBED); - if(error){ - if(created) { + error = add_collection_to_collection(*error_set, NULL, NULL, + *pass_specific, + COL_ADD_MODE_EMBED); + if (error) { + if (created) { destroy_collection(*ini_config); - *ini_config = (struct collection_item *)(NULL); + *ini_config = NULL; } destroy_collection(*error_set); - *error_set = (struct collection_item *)(NULL); + *error_set = NULL; TRACE_ERROR_NUMBER("Failed to add error collection to another error collection", error); return error; } @@ -480,100 +515,100 @@ int config_for_app(const char *application, } /* Reads a line from the file */ -int read_line(FILE *file,char **key,char **value, int *length, int *ext_error) +int read_line(FILE *file, char **key,char **value, int *length, int *ext_error) { - char *res = NULL; + char *res; char buf[BUFFER_SIZE+1]; - int len = 0; - char *buffer = NULL; - int i = 0; - char *eq = NULL; + int len; + char *buffer; + int i; + char *eq; - TRACE_FLOW_STRING("read_line","Entry"); + TRACE_FLOW_STRING("read_line", "Entry"); *ext_error = 0; buffer = buf; /* Get data from file */ - res = fgets(buffer,BUFFER_SIZE,file); - if(res == NULL) { - TRACE_ERROR_STRING("Read nothing",""); + res = fgets(buffer, BUFFER_SIZE, file); + if (res == NULL) { + TRACE_ERROR_STRING("Read nothing", ""); return RET_EOF; } len = strlen(buffer); - if(len == 0) { - TRACE_ERROR_STRING("Nothing was read.",""); + if (len == 0) { + TRACE_ERROR_STRING("Nothing was read.", ""); return RET_EMPTY; } /* Added \r just in case we deal with Windows in future */ - if((*(buffer + len - 1) != '\n') && (*(buffer + len - 1) != '\r')) { - TRACE_ERROR_STRING("String it too big!",""); + if ((buffer[len - 1] != '\n') && (buffer[len - 1] != '\r')) { + TRACE_ERROR_STRING("String it too big!", ""); *ext_error = ERR_LONGDATA; return RET_ERROR; } /* Ingnore comments */ - if((*buffer == ';') || (*buffer == '#')) { - TRACE_FLOW_STRING("Comment",buf); + if ((*buffer == ';') || (*buffer == '#')) { + TRACE_FLOW_STRING("Comment", buf); return RET_COMMENT; } - TRACE_INFO_STRING("BUFFER before trimming:",buffer); + TRACE_INFO_STRING("BUFFER before trimming:", buffer); /* Trucate trailing spaces and CRs */ - while(isspace(*(buffer + len - 1))) { - *(buffer + len - 1) = '\0'; + while (isspace(buffer[len - 1])) { + buffer[len - 1] = '\0'; len--; } - TRACE_INFO_STRING("BUFFER after trimming trailing spaces:",buffer); + TRACE_INFO_STRING("BUFFER after trimming trailing spaces:", buffer); /* Trucate leading spaces */ - while(isspace(*buffer)) { + while (isspace(*buffer)) { buffer++; len--; } - TRACE_INFO_STRING("BUFFER after trimming leading spaces:",buffer); - TRACE_INFO_NUMBER("BUFFER length:",len); + TRACE_INFO_STRING("BUFFER after trimming leading spaces:", buffer); + TRACE_INFO_NUMBER("BUFFER length:", len); /* Empty line */ - if(len == 0) { - TRACE_FLOW_STRING("Empty line",buf); + if (len == 0) { + TRACE_FLOW_STRING("Empty line", buf); return RET_EMPTY; } /* Section */ - if(*buffer == '[') { - if(*(buffer+len-1) != ']') { - TRACE_ERROR_STRING("Invalid format for section",buf); + if (*buffer == '[') { + if (buffer[len-1] != ']') { + TRACE_ERROR_STRING("Invalid format for section", buf); *ext_error = ERR_NOCLOSESEC; return RET_ERROR; } buffer++; len--; - while(isspace(*(buffer))) { + while (isspace(*buffer)) { buffer++; len--; } - if(len == 0) { - TRACE_ERROR_STRING("Invalid format for section",buf); + if (len == 0) { + TRACE_ERROR_STRING("Invalid format for section", buf); *ext_error = ERR_NOSECTION; return RET_ERROR; } - *(buffer + len - 1) = '\0'; + buffer[len - 1] = '\0'; len--; - while(isspace(*(buffer + len - 1))) { - *(buffer + len - 1) = '\0'; + while (isspace(buffer[len - 1])) { + buffer[len - 1] = '\0'; len--; } - if(len >= MAX_KEY) { - TRACE_ERROR_STRING("Section name is too long",buf); + if (len >= MAX_KEY) { + TRACE_ERROR_STRING("Section name is too long", buf); *ext_error = ERR_SECTIONLONG; return RET_ERROR; } @@ -584,9 +619,9 @@ int read_line(FILE *file,char **key,char **value, int *length, int *ext_error) /* Assume we are dealing with the K-V here */ /* Find "=" */ - eq = strchr(buffer,'='); - if(eq == NULL) { - TRACE_ERROR_STRING("No equal sign",buf); + eq = strchr(buffer, '='); + if (eq == NULL) { + TRACE_ERROR_STRING("No equal sign", buf); *ext_error = ERR_NOEQUAL; return RET_BEST_EFFORT; } @@ -595,26 +630,26 @@ int read_line(FILE *file,char **key,char **value, int *length, int *ext_error) /* Strip spaces around "=" */ i = eq - buffer - 1; - while((i >= 0) && isspace(*(buffer + i))) i--; - if(i<0) { - TRACE_ERROR_STRING("No key",buf); + while ((i >= 0) && isspace(buffer[i])) i--; + if (i < 0) { + TRACE_ERROR_STRING("No key", buf); *ext_error = ERR_NOKEY; return RET_BEST_EFFORT; } /* Copy key into provided buffer */ if(i >= MAX_KEY) { - TRACE_ERROR_STRING("Section name is too long",buf); + TRACE_ERROR_STRING("Section name is too long", buf); *ext_error = ERR_LONGKEY; return RET_BEST_EFFORT; } *key = buffer; - *(buffer+i+1) = '\0'; - TRACE_INFO_STRING("KEY:",*key); + buffer[i + 1] = '\0'; + TRACE_INFO_STRING("KEY:", *key); eq++; len--; - while(isspace(*eq)) { + while (isspace(*eq)) { eq++; len--; } @@ -623,10 +658,10 @@ int read_line(FILE *file,char **key,char **value, int *length, int *ext_error) /* Make sure we include trailing 0 into data */ *length = len + 1; - TRACE_INFO_STRING("VALUE:",*value); - TRACE_INFO_NUMBER("LENGTH:",*length); + TRACE_INFO_STRING("VALUE:", *value); + TRACE_INFO_NUMBER("LENGTH:", *length); - TRACE_FLOW_STRING("read_line","Exit"); + TRACE_FLOW_STRING("read_line", "Exit"); return RET_PAIR; } @@ -637,64 +672,64 @@ void print_file_parsing_errors(FILE *file, { struct collection_iterator *iterator; int error; - struct collection_item *item = (struct collection_item *)(NULL); + struct collection_item *item = NULL; struct parse_error *pe; unsigned int count; TRACE_FLOW_STRING("print_file_parsing_errors", "Entry"); /* If we have something to print print it */ - if(error_list == (struct collection_item *)(NULL)) { + if (error_list == NULL) { TRACE_ERROR_STRING("No error list",""); return; } /* Make sure we go the right collection */ - if(!is_of_class(error_list,COL_CLASS_INI_PERROR)) { - TRACE_ERROR_STRING("Wrong collection class:",WRONG_COLLECTION); - fprintf(file,"%s\n",WRONG_COLLECTION); + if (!is_of_class(error_list, COL_CLASS_INI_PERROR)) { + TRACE_ERROR_STRING("Wrong collection class:", WRONG_COLLECTION); + fprintf(file,"%s\n", WRONG_COLLECTION); return; } /* Bind iterator */ - error = bind_iterator(&iterator,error_list,COL_TRAVERSE_DEFAULT); - if(error) { - TRACE_ERROR_STRING("Error (bind):",FAILED_TO_PROCCESS); - fprintf(file,"%s\n",FAILED_TO_PROCCESS); + error = bind_iterator(&iterator, error_list, COL_TRAVERSE_DEFAULT); + if (error) { + TRACE_ERROR_STRING("Error (bind):", FAILED_TO_PROCCESS); + fprintf(file, "%s\n", FAILED_TO_PROCCESS); return; } - do { + while(1) { /* Loop through a collection */ error = iterate_collection(iterator, &item); - if(error) { - TRACE_ERROR_STRING("Error (iterate):",FAILED_TO_PROCCESS); - fprintf(file,"%s\n",FAILED_TO_PROCCESS); + if (error) { + TRACE_ERROR_STRING("Error (iterate):", FAILED_TO_PROCCESS); + fprintf(file, "%s\n", FAILED_TO_PROCCESS); unbind_iterator(iterator); return; } /* Are we done ? */ - if(item == (struct collection_item *)(NULL)) break; + if (item == NULL) break; /* Process collection header */ - if(get_item_type(item) == COL_TYPE_COLLECTION) { + if (get_item_type(item) == COL_TYPE_COLLECTION) { get_collection_count(item, &count); - if(count > 1) fprintf(file,ERROR_HEADER,get_item_property(item,NULL)); + if (count > 1) + fprintf(file, ERROR_HEADER, get_item_property(item, NULL)); else break; } else { /* Put error into provided format */ pe = (struct parse_error *)(get_item_data(item)); - fprintf(file,LINE_FORMAT, - get_item_property(item,NULL), /* Error or warning */ + fprintf(file, LINE_FORMAT, + get_item_property(item, NULL), /* Error or warning */ pe->error, /* Error */ pe->line, /* Line */ parsing_error_str(pe->error)); /* Error str */ } } - while(1); /* Do not forget to unbind iterator - otherwise there will be a leak */ unbind_iterator(iterator); @@ -703,64 +738,65 @@ void print_file_parsing_errors(FILE *file, } -/* Print errors and warnings that were detected parsing configuration as a whole */ -void print_config_parsing_errors(FILE *file,struct collection_item *error_list) +/* Print errors and warnings that were detected while parsing + * the whole configuration */ +void print_config_parsing_errors(FILE *file, + struct collection_item *error_list) { struct collection_iterator *iterator; int error; - struct collection_item *item = (struct collection_item *)(NULL); - struct collection_item *file_errors = (struct collection_item *)(NULL); + struct collection_item *item = NULL; + struct collection_item *file_errors = NULL; TRACE_FLOW_STRING("print_config_parsing_errors", "Entry"); /* If we have something to print print it */ - if(error_list == (struct collection_item *)(NULL)) { - TRACE_ERROR_STRING("No error list",""); + if (error_list == NULL) { + TRACE_ERROR_STRING("No error list", ""); return; } /* Make sure we go the right collection */ - if(!is_of_class(error_list,COL_CLASS_INI_PESET)) { - TRACE_ERROR_STRING("Wrong collection class:",WRONG_COLLECTION); - fprintf(file,"%s\n",WRONG_COLLECTION); + if (!is_of_class(error_list, COL_CLASS_INI_PESET)) { + TRACE_ERROR_STRING("Wrong collection class:", WRONG_COLLECTION); + fprintf(file, "%s\n", WRONG_COLLECTION); return; } /* Bind iterator */ - error = bind_iterator(&iterator,error_list,COL_TRAVERSE_DEFAULT); - if(error) { - TRACE_ERROR_STRING("Error (bind):",FAILED_TO_PROCCESS); - fprintf(file,"%s\n",FAILED_TO_PROCCESS); + error = bind_iterator(&iterator, error_list, COL_TRAVERSE_DEFAULT); + if (error) { + TRACE_ERROR_STRING("Error (bind):", FAILED_TO_PROCCESS); + fprintf(file,"%s\n", FAILED_TO_PROCCESS); return; } - do { + while(1) { /* Loop through a collection */ error = iterate_collection(iterator, &item); - if(error) { - TRACE_ERROR_STRING("Error (iterate):",FAILED_TO_PROCCESS); - fprintf(file,"%s\n",FAILED_TO_PROCCESS); + if (error) { + TRACE_ERROR_STRING("Error (iterate):", FAILED_TO_PROCCESS); + fprintf(file, "%s\n", FAILED_TO_PROCCESS); unbind_iterator(iterator); return; } /* Are we done ? */ - if(item == (struct collection_item *)(NULL)) break; + if (item == NULL) break; /* Print per file sets of errors */ - if(get_item_type(item) == COL_TYPE_COLLECTIONREF) { + if (get_item_type(item) == COL_TYPE_COLLECTIONREF) { /* Extract a sub collection */ - error = get_reference_from_item(item,&file_errors); - if(error) { - TRACE_ERROR_STRING("Error (extract):",FAILED_TO_PROCCESS); - fprintf(file,"%s\n",FAILED_TO_PROCCESS); + error = get_reference_from_item(item, &file_errors); + if (error) { + TRACE_ERROR_STRING("Error (extract):", FAILED_TO_PROCCESS); + fprintf(file, "%s\n", FAILED_TO_PROCCESS); return; } - print_file_parsing_errors(file,file_errors); + print_file_parsing_errors(file, file_errors); destroy_collection(file_errors); } } - while(1); /* Do not forget to unbind iterator - otherwise there will be a leak */ unbind_iterator(iterator); @@ -776,56 +812,58 @@ int get_config_item(const char *section, struct collection_item **item) { int error = EOK; - struct collection_item *section_handle = (struct collection_item *)(NULL); + struct collection_item *section_handle = NULL; char *to_find; char default_section[] = INI_DEFAULT_SECTION; TRACE_FLOW_STRING("get_config_item", "Entry"); /* Do we have the accepting memory ? */ - if(item == (struct collection_item **)(NULL)) { + if (item == NULL) { TRACE_ERROR_NUMBER("No buffer - invalid argument.", EINVAL); return EINVAL; } /* Is the collection of a right type */ - if(!is_of_class(ini_config,COL_CLASS_INI_CONFIG)) { + if (!is_of_class(ini_config, COL_CLASS_INI_CONFIG)) { TRACE_ERROR_NUMBER("Wrong collection type", EINVAL); return EINVAL; } - *item = (struct collection_item *)(NULL); + *item = NULL; - if(section == NULL) to_find = default_section; - else to_find = (char *)section; + if (section == NULL) to_find = default_section; + else to_find = section; TRACE_INFO_STRING("Getting Name:", name); TRACE_INFO_STRING("In Section:", section); /* Get Subcollection */ - error = get_collection_reference(ini_config,§ion_handle,to_find); + error = get_collection_reference(ini_config, §ion_handle, to_find); /* Check error */ - if((error) && (error != ENOENT)) { + if (error && (error != ENOENT)) { TRACE_ERROR_NUMBER("Failed to get section", error); return error; } /* Did we find a section */ - if((error == ENOENT) || (section_handle == (struct collection_item *)(NULL))) { + if ((error == ENOENT) || (section_handle == NULL)) { /* We have not found section - return success */ TRACE_FLOW_STRING("get_value_from_config", "No such section"); return EOK; } /* Get item */ - error = get_item(section_handle,(char *)name, COL_TYPE_STRING, COL_TRAVERSE_ONELEVEL, item); + error = get_item(section_handle, name, + COL_TYPE_STRING, COL_TRAVERSE_ONELEVEL, item); TRACE_FLOW_NUMBER("get_config_item returning", error); return error; } /* Get long value from config item */ -long get_long_config_value(struct collection_item *item, int strict, long def, int *error) +long get_long_config_value(struct collection_item *item, + int strict, long def, int *error) { char *endptr, *str; long val = 0; @@ -833,17 +871,17 @@ long get_long_config_value(struct collection_item *item, int strict, long def, i TRACE_FLOW_STRING("get_long_config_value", "Entry"); /* Do we have the item ? */ - if((item == (struct collection_item *)(NULL)) || + if ((item == NULL) || (get_item_type(item) != COL_TYPE_STRING)) { TRACE_ERROR_NUMBER("Invalid argument.", EINVAL); - if(error) *error = EINVAL; + if (error) *error = EINVAL; return def; } - if(error) *error = EOK; + if (error) *error = EOK; /* Try to parse the value */ - str = (char *)(get_item_data(item)); + str = (char *)get_item_data(item); errno = 0; val = strtol(str, &endptr, 10); @@ -854,13 +892,13 @@ long get_long_config_value(struct collection_item *item, int strict, long def, i ((errno != 0) && (val == 0)) || (endptr == str)) { TRACE_ERROR_NUMBER("Conversion failed", EIO); - if(error) *error = EIO; + if (error) *error = EIO; return def; } - if ((strict) && (*endptr != '\0')) { + if (strict && (*endptr != '\0')) { TRACE_ERROR_NUMBER("More characters than expected", EIO); - if(error) *error = EIO; + if (error) *error = EIO; val = def; } @@ -869,25 +907,29 @@ long get_long_config_value(struct collection_item *item, int strict, long def, i } /* Get integer value from config item */ -inline int get_int_config_value(struct collection_item *item, int strict, int def, int *error) +inline int get_int_config_value(struct collection_item *item, + int strict, int def, int *error) { - return (int)get_long_config_value(item, strict, (long)def, error); + return get_long_config_value(item, strict, def, error); } /* Get unsigned integer value from config item */ -unsigned get_unsigned_config_value(struct collection_item *item, int strict, unsigned def, int *error) +unsigned get_unsigned_config_value(struct collection_item *item, + int strict, unsigned def, int *error) { - return (unsigned int)get_long_config_value(item, strict, (long)def, error); + return get_long_config_value(item, strict, def, error); } /* Get unsigned long value from config item */ -unsigned long get_ulong_config_value(struct collection_item *item, int strict, unsigned long def, int *error) +unsigned long get_ulong_config_value(struct collection_item *item, + int strict, unsigned long def, int *error) { - return (unsigned long)get_long_config_value(item, strict, (long)def, error); + return get_long_config_value(item, strict, def, error); } /* Get double value */ -double get_double_config_value(struct collection_item *item, int strict, double def, int *error) +double get_double_config_value(struct collection_item *item, + int strict, double def, int *error) { char *endptr, *str; double val = 0; @@ -895,32 +937,32 @@ double get_double_config_value(struct collection_item *item, int strict, double TRACE_FLOW_STRING("get_double_config_value", "Entry"); /* Do we have the item ? */ - if((item == (struct collection_item *)(NULL)) || - (get_item_type(item) != COL_TYPE_STRING)) { + if ((item == NULL) || + (get_item_type(item) != COL_TYPE_STRING)) { TRACE_ERROR_NUMBER("Invalid argument.", EINVAL); - if(error) *error = EINVAL; + if (error) *error = EINVAL; return def; } - if(error) *error = EOK; + if (error) *error = EOK; /* Try to parse the value */ - str = (char *)(get_item_data(item)); + str = (char *)get_item_data(item); errno = 0; val = strtod(str, &endptr); /* Check for various possible errors */ - if ((errno == ERANGE) || + if ((errno == ERANGE) || ((errno != 0) && (val == 0)) || (endptr == str)) { TRACE_ERROR_NUMBER("Conversion failed", EIO); - if(error) *error = EIO; + if (error) *error = EIO; return def; } - if ((strict) && (*endptr != '\0')) { + if (strict && (*endptr != '\0')) { TRACE_ERROR_NUMBER("More characters than expected", EIO); - if(error) *error = EIO; + if (error) *error = EIO; val = def; } @@ -929,7 +971,8 @@ double get_double_config_value(struct collection_item *item, int strict, double } /* Get boolean value */ -unsigned char get_bool_config_value(struct collection_item *item, unsigned char def, int *error) +unsigned char get_bool_config_value(struct collection_item *item, + unsigned char def, int *error) { char *str; int len; @@ -937,63 +980,64 @@ unsigned char get_bool_config_value(struct collection_item *item, unsigned char TRACE_FLOW_STRING("get_bool_config_value", "Entry"); /* Do we have the item ? */ - if((item == (struct collection_item *)(NULL)) || - (get_item_type(item) != COL_TYPE_STRING)) { + if ((item == NULL) || + (get_item_type(item) != COL_TYPE_STRING)) { TRACE_ERROR_NUMBER("Invalid argument.", EINVAL); - if(error) *error = EINVAL; + if (error) *error = EINVAL; return def; } - if(error) *error = EOK; + if (error) *error = EOK; - str = (char *)(get_item_data(item)); + str = (char *)get_item_data(item); len = get_item_length(item); /* Try to parse the value */ - if((strncasecmp(str,"true",len) == 0) || - (strncasecmp(str,"yes",len) == 0)) { + if ((strncasecmp(str, "true", len) == 0) || + (strncasecmp(str, "yes", len) == 0)) { TRACE_FLOW_STRING("Returning", "true"); return '\1'; } - else if((strncasecmp(str,"false",len) == 0) || - (strncasecmp(str,"no",len) == 0)) { + else if ((strncasecmp(str, "false", len) == 0) || + (strncasecmp(str, "no", len) == 0)) { TRACE_FLOW_STRING("Returning", "false"); return '\0'; } TRACE_ERROR_STRING("Returning", "error"); - if(error) *error = EIO; + if (error) *error = EIO; return def; } /* Return a string out of the value */ -inline char *get_string_config_value(struct collection_item *item, int dup, int *error) +char *get_string_config_value(struct collection_item *item, + int dup, int *error) { char *str = NULL; TRACE_FLOW_STRING("get_string_config_value", "Entry"); /* Do we have the item ? */ - if((item == (struct collection_item *)(NULL)) || - (get_item_type(item) != COL_TYPE_STRING)) { + if ((item == NULL) || + (get_item_type(item) != COL_TYPE_STRING)) { TRACE_ERROR_NUMBER("Invalid argument.", EINVAL); - if(error) *error = EINVAL; + if (error) *error = EINVAL; return NULL; } /* If we are told to dup the value */ - if(dup) { + if (dup) { errno = 0; - str = strdup((char *)(get_item_data(item))); - if(str == NULL) { + str = strdup((char *)get_item_data(item)); + if (str == NULL) { TRACE_ERROR_NUMBER("Failed to allocate memory.", ENOMEM); - if(error) *error = ENOMEM; + if (error) *error = ENOMEM; return NULL; } } - else str = (char *)(get_item_data(item)); + else str = (char *)get_item_data(item); - if(error) *error = EOK; + if (error) *error = EOK; TRACE_FLOW_STRING("get_string_config_value", "Exit"); return str; @@ -1005,7 +1049,8 @@ inline char *get_string_config_value(struct collection_item *item, int dup, int * Example: '0A2BFECC' * Case does not matter. */ -char *get_bin_config_value(struct collection_item *item, int *length, int *error) +char *get_bin_config_value(struct collection_item *item, + int *length, int *error) { int i; char *value = NULL; @@ -1018,67 +1063,71 @@ char *get_bin_config_value(struct collection_item *item, int *length, int *error TRACE_FLOW_STRING("get_bin_config_value", "Entry"); /* Do we have the item ? */ - if((item == (struct collection_item *)(NULL)) || - (get_item_type(item) != COL_TYPE_STRING)) { + if ((item == NULL) || + (get_item_type(item) != COL_TYPE_STRING)) { TRACE_ERROR_NUMBER("Invalid argument.", EINVAL); - if(error) *error = EINVAL; + if (error) *error = EINVAL; return NULL; } /* Check the length */ len = get_item_length(item)-1; - if((len/2) *2 != len) { - TRACE_ERROR_STRING("Invalid length for binary data","") - if(error) *error = EINVAL; + if ((len%2) != 0) { + TRACE_ERROR_STRING("Invalid length for binary data", ""); + if (error) *error = EINVAL; return NULL; } - str = (char *)(get_item_data(item)); + str = (char *)get_item_data(item); /* Is the format correct ? */ - if((*str != '\'') || - (*(str + len -1) != '\'')) { - TRACE_ERROR_STRING("String is not escaped","") - if(error) *error = EIO; + if ((*str != '\'') || + (str[len -1] != '\'')) { + TRACE_ERROR_STRING("String is not escaped",""); + if (error) *error = EIO; return NULL; } /* Check that all the symbols are ok */ buff = str + 1; len -= 2; - for(i=0;i<len;i+=2) { - if((!isxdigit(*(buff+i))) || (!isxdigit(*(buff+i+1)))) { - TRACE_ERROR_STRING("Invalid encoding for binary data",buff+i) - if(error) *error = EIO; + for (i = 0; i < len; i += 2) { + if (!isxdigit(buff[i]) || !isxdigit(buff[i + 1])) { + TRACE_ERROR_STRING("Invalid encoding for binary data", buff + i); + if (error) *error = EIO; return NULL; } } /* The value is good so we can allocate memory for it */ - value = malloc(len/2); - if(value == NULL) { + value = malloc(len / 2); + if (value == NULL) { TRACE_ERROR_NUMBER("Failed to allocate memory.", ENOMEM); - if(error) *error = ENOMEM; + if (error) *error = ENOMEM; return NULL; } /* Convert the value */ - for(i=0;i<len;i+=2) { - if(isdigit(*(buff+i))) { - if(isdigit(*(buff+i+1))) hex = 16 * (*(buff+i) - '0') + (*(buff+i+1) - '0'); - else hex = 16 * (*(buff+i) - '0') + (tolower(*(buff+i+1)) - 'a' + 10); + for (i = 0; i < len; i += 2) { + if (isdigit(buff[i])) { + if (isdigit(buff[i+1])) + hex = 16 * (buff[i] - '0') + (buff[i+1] - '0'); + else + hex = 16 * (buff[i] - '0') + (tolower(buff[i+1]) - 'a' + 10); } else { - if(isdigit(*(buff+i+1))) hex = 16 * (tolower(*(buff+i)) - 'a') + (*(buff+i+1) - '0'); - else hex = 16 * (tolower(*(buff+i)) - 'a' + 10) + (tolower(*(buff+i+1)) - 'a' + 10); + if (isdigit(buff[i+1])) + hex = 16 * (tolower(buff[i]) - 'a') + (buff[i+1] - '0'); + else + hex = 16 * (tolower(buff[i]) - 'a' + 10) + (tolower(buff[i+1]) - 'a' + 10); } - *(value+size) = (char)(hex); + value[size] = (char)(hex); size++; } - if(error) *error = EOK; - if(length) *length = size; + if (error) *error = EOK; + if (length) *length = size; TRACE_FLOW_STRING("get_bin_config_value", "Exit"); return value; } @@ -1086,11 +1135,12 @@ char *get_bin_config_value(struct collection_item *item, int *length, int *error /* Function to free binary configuration value */ inline void free_bin_config_value(char *value) { - if(value) free(value); + if (value) free(value); } /* Arrays of stings and integers */ -char **get_string_config_array(struct collection_item *item, char *sep, int *size, int *error) +char **get_string_config_array(struct collection_item *item, + char *sep, int *size, int *error) { char defsep[] = ","; char *copy = NULL; @@ -1102,28 +1152,28 @@ char **get_string_config_array(struct collection_item *item, char *sep, int *siz int resume_len; char **array; char *start; - int i,j,k; + int i, j, k; int growlen = 0; TRACE_FLOW_STRING("get_string_config_array", "Entry"); /* Do we have the item ? */ - if((item == (struct collection_item *)(NULL)) || - (get_item_type(item) != COL_TYPE_STRING)) { + if ((item == NULL) || + (get_item_type(item) != COL_TYPE_STRING)) { TRACE_ERROR_NUMBER("Invalid argument.", EINVAL); - if(error) *error = EINVAL; + if (error) *error = EINVAL; return NULL; } /* Handle the separators */ - if(sep == NULL) sep = defsep; - lensep = strnlen(sep,3); + if (sep == NULL) sep = defsep; + lensep = strnlen(sep, 3); /* Allocate memory for the copy of the string */ copy = malloc(get_item_length(item)); - if(copy == NULL) { + if (copy == NULL) { TRACE_ERROR_NUMBER("Failed to allocate memory.", ENOMEM); - if(error) *error = ENOMEM; + if (error) *error = ENOMEM; return NULL; } @@ -1131,22 +1181,22 @@ char **get_string_config_array(struct collection_item *item, char *sep, int *siz dest = copy; buff = item->data; start = buff; - for(i=0;i<item->length;i++) { + for(i = 0; i < item->length; i++) { growlen = 1; - for(j=0;j<lensep;j++) { - if(*(buff+i) == *(sep+j)) { + for(j = 0; j < lensep; j++) { + if(buff[i] == sep[j]) { /* If we found one of the separators trim spaces around */ resume_len = len; - while(len > 0) { - if(isspace(*(start+len - 1))) len--; + while (len > 0) { + if (isspace(start[len - 1])) len--; else break; } - if(len > 0) { + if (len > 0) { /* Save block aside */ - memcpy(dest,start,len); + memcpy(dest, start, len); count++; - dest+=len; - *dest='\0'; + dest += len; + *dest = '\0'; dest++; len = 0; /* Move forward and trim spaces if any */ @@ -1155,12 +1205,12 @@ char **get_string_config_array(struct collection_item *item, char *sep, int *siz TRACE_INFO_STRING("Remaining buffer :", start); TRACE_INFO_STRING("Other pointer :", buff + i); k = 0; - while(((i+k) < item->length) && (isspace(*start))) { + while (((i + k) < item->length) && (isspace(*start))) { k++; start++; } TRACE_INFO_STRING("Remaining buffer after triming spaces:", start); - if(k) i+=k-1; + if (k) i += k - 1; /* Next iteration of the loop will add 1 */ } /* Break out of the inner loop */ @@ -1168,36 +1218,36 @@ char **get_string_config_array(struct collection_item *item, char *sep, int *siz break; } } - if(growlen) len++; + if (growlen) len++; } /* Copy the remaining piece */ - memcpy(dest,start,len); + memcpy(dest, start, len); count++; - dest+=len; - dest='\0'; + dest += len; + dest = '\0'; dest++; /* Now we know how many items are there in the list */ array = malloc((count + 1) * sizeof(char *)); - if(array == NULL) { + if (array == NULL) { free(copy); TRACE_ERROR_NUMBER("Failed to allocate memory.", ENOMEM); - if(error) *error = ENOMEM; + if (error) *error = ENOMEM; return NULL; } /* Loop again to fill in the pointers */ start = copy; - for(i=0;i<count;i++) { - *(array+i) = start; - while(*start!='\0') start++; + for (i = 0; i < count; i++) { + array[i] = start; + while (start) start++; start++; } - *(array+count) = NULL; + array[count] = NULL; - if(error) *error = EOK; - if(size) *size = count; + if (error) *error = EOK; + if (size) *size = count; TRACE_FLOW_STRING("get_string_config_array", "Exit"); return array; } @@ -1207,8 +1257,8 @@ void free_string_config_array(char **str_config) { TRACE_FLOW_STRING("free_string_config_array", "Entry"); - if(str_config != NULL) { - if(*str_config !=NULL) free(*str_config); + if (str_config != NULL) { + if (*str_config != NULL) free(*str_config); free(str_config); } @@ -1226,25 +1276,25 @@ long *get_long_config_array(struct collection_item *item, int *size, int *error) TRACE_FLOW_STRING("get_long_config_array", "Entry"); /* Do we have the item ? */ - if((item == (struct collection_item *)(NULL)) || - (get_item_type(item) != COL_TYPE_STRING) || - (size == (int *)(NULL))) { + if ((item == NULL) || + (get_item_type(item) != COL_TYPE_STRING) || + (size == NULL)) { TRACE_ERROR_NUMBER("Invalid argument.", EINVAL); - if(error) *error = EINVAL; - return (long *)(NULL); + if (error) *error = EINVAL; + return NULL; } /* Assume that we have maximum number of different numbers */ array = (long *)malloc(sizeof(long) * get_item_length(item)/2); - if(array == NULL) { + if (array == NULL) { TRACE_ERROR_NUMBER("Failed to allocate memory.", ENOMEM); - if(error) *error = ENOMEM; - return (long *)(NULL); + if (error) *error = ENOMEM; + return NULL; } /* Now parse the string */ - str = (char *)(get_item_data(item)); - while(*str != '\0') { + str = (char *)get_item_data(item); + while (str) { errno = 0; val = strtol(str, &endptr, 10); if (((errno == ERANGE) && @@ -1254,21 +1304,22 @@ long *get_long_config_array(struct collection_item *item, int *size, int *error) (endptr == str)) { TRACE_ERROR_NUMBER("Conversion failed", EIO); free(array); - if(error) *error = EIO; - return (long *)(NULL); + if (error) *error = EIO; + return NULL; } /* Save value */ - *(array + count) = val; + array[count] = val; count++; /* Are we done? */ - if(*endptr == 0) break; + if (*endptr == 0) break; /* Advance to the next valid number */ - str = endptr; - while(!isdigit(*str) && (*str != 0) && (*str != '-') && (*str != '+')) str++; + for (str = endptr; *str; str++) { + if (isdigit(*str) || (*str != '-') || (*str != '+')) break; + } } *size = count; - if(error) *error = EOK; + if (error) *error = EOK; TRACE_FLOW_NUMBER("get_long_config_value returning", val); return array; @@ -1278,6 +1329,6 @@ long *get_long_config_array(struct collection_item *item, int *size, int *error) /* Special function to free long config array */ inline void free_long_config_array(long *array) { - if(array != (long *)(NULL)) free(array); + if (array != NULL) free(array); } diff --git a/common/trace/trace.h b/common/trace/trace.h index 58c979361..9211e20d6 100644 --- a/common/trace/trace.h +++ b/common/trace/trace.h @@ -41,47 +41,56 @@ extern unsigned trace_level; #ifdef HAVE_TRACE /* Tracing strings */ -#define TRACE_STRING(level,message,str) if(level & trace_level) \ - printf("[DEBUG] %23s (%4d) %s %s\n",__FILE__,__LINE__,message,str); -/* Convenience wrappers for strings */ -#define TRACE_FLOW_STRING(message,str) TRACE_STRING(TRACE_FLOW,message,str) -#define TRACE_ERROR_STRING(message,str) TRACE_STRING(TRACE_ERROR,message,str) -#define TRACE_INFO_STRING(message,str) TRACE_STRING(TRACE_INFO,message,str) +#define TRACE_STRING(level, msg, str) \ + do { \ + if (level & trace_level) { \ + printf("[DEBUG] %23s (%4d) %s %s\n", \ + __FILE__, __LINE__, msg, str); \ + } \ + } while(0) /* Tracing numbers */ -#define TRACE_NUMBER(level,message,number) if(level & trace_level) \ - printf("[DEBUG] %23s (%4d) %s %lu\n",__FILE__,__LINE__,message,(unsigned long int)(number)); -/* Convenience wrappers for numbers */ -#define TRACE_FLOW_NUMBER(message,number) TRACE_NUMBER(TRACE_FLOW,message,number) -#define TRACE_ERROR_NUMBER(message,number) TRACE_NUMBER(TRACE_ERROR,message,number) -#define TRACE_INFO_NUMBER(message,number) TRACE_NUMBER(TRACE_INFO,message,number) +#define TRACE_NUMBER(level, msg, num) \ + do { \ + if (level & trace_level) { \ + printf("[DEBUG] %23s (%4d) %s %lu\n", \ + __FILE__, __LINE__, msg, (unsigned long int)(num)); \ + } \ + } while(0) /* Tracing doubles */ -#define TRACE_DOUBLE(level,message,number) if(level & trace_level) \ - printf("[DEBUG] %23s (%4d) %s %e\n",__FILE__,__LINE__,message,(double)(number)); -/* Convenience wrappers for numbers */ -#define TRACE_FLOW_DOUBLE(message,number) TRACE_DOUBLE(TRACE_FLOW,message,number) -#define TRACE_ERROR_DOUBLE(message,number) TRACE_DOUBLE(TRACE_ERROR,message,number) -#define TRACE_INFO_DOUBLE(message,number) TRACE_DOUBLE(TRACE_INFO,message,number) +#define TRACE_DOUBLE(level, msg, num) \ + do { \ + if (level & trace_level) { \ + printf("[DEBUG] %23s (%4d) %s %e\n", \ + __FILE__, __LINE__, msg, (double)(num)); \ + } \ + } while(0) /* Assertion */ -#define TRACE_ASSERT(expression) expression ? ; : printf("ASSERTION FAILED\n"); -#else +#define TRACE_ASSERT(expression) expression ? : printf("ASSERTION FAILED\n") +#else /* HAVE_TRACE */ + /* Noop in case the tracing is disabled */ -#define TRACE_STRING(level,message,str) ; -#define TRACE_NUMBER(level,message,number) ; -#define TRACE_DOUBLE(level,message,number) ; -#define TRACE_FLOW_STRING(message,str) ; -#define TRACE_ERROR_STRING(message,str) ; -#define TRACE_INFO_STRING(message,str) ; -#define TRACE_FLOW_NUMBER(message,str) ; -#define TRACE_ERROR_NUMBER(message,str) ; -#define TRACE_INFO_NUMBER(message,str) ; -#define TRACE_FLOW_DOUBLE(message,str) ; -#define TRACE_ERROR_DOUBLE(message,str) ; -#define TRACE_INFO_DOUBLE(message,str) ; -#define TRACE_ASSERT(expression) ; +#define TRACE_STRING(level, msg, str) +#define TRACE_NUMBER(level, msg, num) +#define TRACE_DOUBLE(level, msg, num) #endif /* HAVE_TRACE */ +/* Convenience wrappers for strings */ +#define TRACE_FLOW_STRING(msg, str) TRACE_STRING(TRACE_FLOW, msg, str) +#define TRACE_ERROR_STRING(msg, str) TRACE_STRING(TRACE_ERROR, msg, str) +#define TRACE_INFO_STRING(msg, str) TRACE_STRING(TRACE_INFO, msg, str) + +/* Convenience wrappers for numbers */ +#define TRACE_FLOW_NUMBER(msg, num) TRACE_NUMBER(TRACE_FLOW, msg, num) +#define TRACE_ERROR_NUMBER(msg, num) TRACE_NUMBER(TRACE_ERROR, msg, num) +#define TRACE_INFO_NUMBER(msg, num) TRACE_NUMBER(TRACE_INFO, msg, num) + +/* Convenience wrappers for numbers */ +#define TRACE_FLOW_DOUBLE(msg, num) TRACE_DOUBLE(TRACE_FLOW, msg, num) +#define TRACE_ERROR_DOUBLE(msg, num) TRACE_DOUBLE(TRACE_ERROR, msg, num) +#define TRACE_INFO_DOUBLE(msg, num) TRACE_DOUBLE(TRACE_INFO, msg, num) + #endif /* COMMON_TRACE_H */ |