# HG changeset patch # User LordOfWar # Date 2009-11-11 20:29:28 # Node ID 4ec1a6bcc9af3849ae64949c91882d84a2f8ee69 # Parent 16f1b9b211d7f3c4c76ec13cd3060dc488fd8e6d created a few functions, users can now be added to the array of users, and removed diff --git a/src/server/user_mgr.c b/src/server/user_mgr.c --- a/src/server/user_mgr.c +++ b/src/server/user_mgr.c @@ -19,11 +19,13 @@ #include "user_mgr.h" #include "malloc.h" +#include struct user_mgr_info { struct user *user_array; int current_users; + int user_array_size; } user_mgr_info; int resize_user_array() @@ -32,7 +34,8 @@ int resize_user_array() int counter2; // create array twice the size of the current amount of users - struct user *new_user_array = malloc(sizeof(struct user) * user_mgr_info.current_users * 2); + user_mgr_info.user_array_size = user_mgr_info.current_users * 2; + struct user *new_user_array = malloc(sizeof(struct user) * user_mgr_info.user_array_size); // this copies the original user_array over to the new one // using two counters allows the array to be resized at any time @@ -56,6 +59,153 @@ int resize_user_array() return 1; } +struct user *findUser(char *nameOfUser) +{ + int high; + int low; + int middle; + int result; + high = user_mgr_info.user_array_size - 1; + low = 0; + + for(middle = (low+high)/2; 1 == 1; middle = (low+high)/2) + { + // in case middle lands on a part of the array with no user + while(user_mgr_info.user_array[middle].username == 0) + { + if(result < 0) + middle--; + else + middle++; + } + + // this is where the array is cut in half and the half that the nameOfUser is on is kept + result = strcmp(nameOfUser, user_mgr_info.user_array[middle].username); + if(result == 0) + return &user_mgr_info.user_array[middle]; + else if(result < 0) + high = middle; + else + low = middle; + + // in case the user doesn't exist + if(high-low <= 0) + return 0; + } +} + +int deleteUser(struct user *user_ptr) +{ + free(user_ptr->username); + memset(user_ptr, '\0', sizeof(struct user)); + + return 1; +} + +int createUser(struct user *user_ptr, char *nameOfUser) +{ + // clear old memory + memset(user_ptr, '\0', sizeof(struct user)); + + user_ptr->username = nameOfUser; + user_ptr->render_power = 0; + user_ptr->last_job = 0; + + return 1; +} + +// places the new user at position index in the array, moves other users if it needs to +int placeUser(int index, char *nameOfUser) +{ + int higher; + int lower; + + // I shift data in the array to create an open the space where the user should be added + // but first I figure out which way is the shortest + if(user_mgr_info.user_array[index].username != 0) + { + higher = index + 1; + while(user_mgr_info.user_array[higher].username != 0) + higher++; + + lower = index - 1; + while(user_mgr_info.user_array[lower].username != 0) + lower--; + + // here the data is shifted to open up a space + if(index - lower < higher - index) + for(; lower < index; lower++) + memcpy(&user_mgr_info.user_array[lower], &user_mgr_info.user_array[lower + 1], sizeof(struct user)); + else + for(; higher > index; higher--) + memcpy(&user_mgr_info.user_array[higher], &user_mgr_info.user_array[higher - 1], sizeof(struct user)); + } + + // add the user to the array + createUser(&user_mgr_info.user_array[index], nameOfUser); + + return 1; +} + +int addUser(char *nameOfUser) +{ + int high; + int low; + int middle; + int result; + high = user_mgr_info.user_array_size - 1; + low = 0; + + for(middle = (low+high)/2; 1 == 1; middle = (low+high)/2) + { + // in case middle lands on a part of the array with no user + while(user_mgr_info.user_array[middle].username == 0) + { + if(result < 0) + middle--; + else + middle++; + } + + // this is where the array is cut in half and the half that the nameOfUser is on is kept + result = strcmp(nameOfUser, user_mgr_info.user_array[middle].username); + if(result == 0) + return 0; + else if(result < 0) + high = middle; + else + low = middle; + + // once there are less than 10 possible places for the user to be placed + // break out of this loop and begin next loop + if(high-low <= 10) + break; + } + + // this function starts at the low index number, and goes up until it finds a + // username that is bigger than it alphabetically, and tells the userPlacer + // that it needs to go 1 before that spot + for(; low <= high; low++) + { + while(user_mgr_info.user_array[low].username == 0) + low++; + + result = strcmp(nameOfUser, user_mgr_info.user_array[low].username) < 0; + if(result < 0) + { + placeUser(low - 1, nameOfUser); + return 1; + } + if(result == 0) + { + fprintf(stderr, "user already exists"); + return 0; + } + } + + return 0; +} + int initialize_users() { // pull data from XML file