//role control void add_role(); void print_role(struct linkedlist* list,int cur,int end,struct Map* map); void * showRole(struct linkedlist* list,int index); struct Map* sortRole(struct linkedlist* list,int choice); void role_control(){ int choice = -1; struct user db = read_db_user(); do{ char buf[1024]; welcome_message(buf); sprintf(buf+strlen(buf),"Role control\n"); choice = choices_selecter((char*[]){ "add admin role", "list role" },2,buf); switch (choice){ case 3: break; case 1: add_role(); break; case 2:; char * SortItems[] = { "admin", "role", }; void * list = getLinkedList(role_list_db(),0); lister(list,NULL,sizeofLinkedlist(list),"Role",SortItems,2,print_role,sortRole,showRole); //warning appears but can be ignore due to the fact that they are just pointer, no difference break; default: break; } }while(choice != 3); } void add_role(){ char role[100]; printf("Enter Admin role name: "); fflush_stdin(); scanf("%s", role); if(is_admin(role)){//check if role exist in admin file printf("Admin role already exist\n"); printf("press any key to continue\n"); fflush_stdin(); getchar(); }else{ add_admin(role); printf("role added\n"); printf("press any key to continue\n"); fflush_stdin(); getchar(); } return; } void print_role(struct linkedlist* list,int cur,int end,struct Map* map){ printf("%-10s%-10s%-10s\n","No.","Role","Admin?"); if(map == NULL){ for(int i = cur; i < end; i++){ list = getLinkedList(list,i); char* name = list->data; printf("%-10d%-10s%-10s\n",i-cur + 5,StringCompression(name,8),is_admin(name)?"T":"F"); } }else{ for(int i = cur; i < end; i++){ list = getLinkedList(list,map[i].key); char* name = list->data; printf("%-10d%-10s%-10s\n",i-cur + 5,StringCompression(name,8),is_admin(name)?"T":"F"); } } } void * showRole(struct linkedlist* list,int index){ int choice; list = getLinkedList(list,index); char* name = list->data; Cls(); printf("%-10s%-10s\n","Role","Admin?"); printf("%-10s%-10s\n",name,is_admin(name)?"T":"F"); choice = choices_selecter((char*[]){"Toggle admin"},1,"Role control\n"); if(choice == 1){ if(is_admin(name)){ remove_admin(name); }else{ add_admin(name); } printf("Admin role toggled\n"); printf("Press any key to continue\n"); fflush_stdin(); getchar(); } return list; } struct Map* sortRole(struct linkedlist* list,int choice){ struct Map* map = malloc(sizeof(struct Map)*sizeofLinkedlist(list)); struct linkedlist* cur = getLinkedList(list,0); for(int i = 0; i < sizeofLinkedlist(list); i++){ switch(choice){ case 1: case 2: map[i].key = i; bool temp = !is_admin(cur->data); bool* tempstar = malloc(sizeof(bool)); *tempstar = temp; map[i].value = tempstar; break; case 3: case 4: map[i].key = i; map[i].value = cur->data; break; } cur = cur->next; } switch(choice){ case 1: case 3: qsort(map,sizeofLinkedlist(list),sizeof(struct Map),compare_decending_str); break; case 2: case 4: qsort(map,sizeofLinkedlist(list),sizeof(struct Map),compare_ascending_str); break; } return map; }