aboutsummaryrefslogtreecommitdiff
path: root/tests/example.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/example.c')
-rw-r--r--tests/example.c86
1 files changed, 42 insertions, 44 deletions
diff --git a/tests/example.c b/tests/example.c
index a85f422d4..99263027f 100644
--- a/tests/example.c
+++ b/tests/example.c
@@ -1,25 +1,25 @@
-#include <stdio.h> /* gets */
+#include <stdio.h> /* printf */
#include <stdlib.h> /* atoi, malloc */
#include <string.h> /* strcpy */
#include "uthash.h"
struct my_struct {
int id; /* key */
- char name[10];
+ char name[21];
UT_hash_handle hh; /* makes this structure hashable */
};
struct my_struct *users = NULL;
-void add_user(int user_id, char *name)
+void add_user(int user_id, const char *name)
{
struct my_struct *s;
HASH_FIND_INT(users, &user_id, s); /* id already in the hash? */
- if (s==NULL) {
- s = (struct my_struct*)malloc(sizeof(struct my_struct));
+ if (s == NULL) {
+ s = (struct my_struct*)malloc(sizeof *s);
s->id = user_id;
- HASH_ADD_INT( users, id, s ); /* id: name of key field */
+ HASH_ADD_INT(users, id, s); /* id is the key field */
}
strcpy(s->name, name);
}
@@ -28,23 +28,24 @@ struct my_struct *find_user(int user_id)
{
struct my_struct *s;
- HASH_FIND_INT( users, &user_id, s ); /* s: output pointer */
+ HASH_FIND_INT(users, &user_id, s); /* s: output pointer */
return s;
}
void delete_user(struct my_struct *user)
{
- HASH_DEL( users, user); /* user: pointer to deletee */
+ HASH_DEL(users, user); /* user: pointer to deletee */
free(user);
}
void delete_all()
{
- struct my_struct *current_user, *tmp;
+ struct my_struct *current_user;
+ struct my_struct *tmp;
HASH_ITER(hh, users, current_user, tmp) {
- HASH_DEL(users,current_user); /* delete it (users advances to next) */
- free(current_user); /* free it */
+ HASH_DEL(users, current_user); /* delete it (users advances to next) */
+ free(current_user); /* free it */
}
}
@@ -52,41 +53,45 @@ void print_users()
{
struct my_struct *s;
- for(s=users; s != NULL; s=(struct my_struct*)(s->hh.next)) {
+ for (s = users; s != NULL; s = (struct my_struct*)(s->hh.next)) {
printf("user id %d: name %s\n", s->id, s->name);
}
}
-int name_sort(struct my_struct *a, struct my_struct *b)
+int by_name(const struct my_struct *a, const struct my_struct *b)
{
- return strcmp(a->name,b->name);
+ return strcmp(a->name, b->name);
}
-int id_sort(struct my_struct *a, struct my_struct *b)
+int by_id(const struct my_struct *a, const struct my_struct *b)
{
return (a->id - b->id);
}
-void sort_by_name()
+const char *getl(const char *prompt)
{
- HASH_SORT(users, name_sort);
-}
-
-void sort_by_id()
-{
- HASH_SORT(users, id_sort);
+ static char buf[21];
+ char *p;
+ printf("%s? ", prompt); fflush(stdout);
+ p = fgets(buf, sizeof(buf), stdin);
+ if (p == NULL || (p = strchr(buf, '\n')) == NULL) {
+ puts("Invalid input!");
+ exit(EXIT_FAILURE);
+ }
+ *p = '\0';
+ return buf;
}
int main()
{
- char in[10];
- int id=1, running=1;
+ int id = 1;
+ int running = 1;
struct my_struct *s;
- unsigned num_users;
+ int temp;
while (running) {
printf(" 1. add user\n");
- printf(" 2. add/rename user by id\n");
+ printf(" 2. add or rename user by id\n");
printf(" 3. find user\n");
printf(" 4. delete user\n");
printf(" 5. delete all users\n");
@@ -95,27 +100,20 @@ int main()
printf(" 8. print users\n");
printf(" 9. count users\n");
printf("10. quit\n");
- gets(in);
- switch(atoi(in)) {
+ switch (atoi(getl("Command"))) {
case 1:
- printf("name?\n");
- add_user(id++, gets(in));
+ add_user(id++, getl("Name (20 char max)"));
break;
case 2:
- printf("id?\n");
- gets(in);
- id = atoi(in);
- printf("name?\n");
- add_user(id, gets(in));
+ temp = atoi(getl("ID"));
+ add_user(temp, getl("Name (20 char max)"));
break;
case 3:
- printf("id?\n");
- s = find_user(atoi(gets(in)));
+ s = find_user(atoi(getl("ID to find")));
printf("user: %s\n", s ? s->name : "unknown");
break;
case 4:
- printf("id?\n");
- s = find_user(atoi(gets(in)));
+ s = find_user(atoi(getl("ID to delete")));
if (s) {
delete_user(s);
} else {
@@ -126,20 +124,20 @@ int main()
delete_all();
break;
case 6:
- sort_by_name();
+ HASH_SORT(users, by_name);
break;
case 7:
- sort_by_id();
+ HASH_SORT(users, by_id);
break;
case 8:
print_users();
break;
case 9:
- num_users=HASH_COUNT(users);
- printf("there are %u users\n", num_users);
+ temp = HASH_COUNT(users);
+ printf("there are %d users\n", temp);
break;
case 10:
- running=0;
+ running = 0;
break;
}
}