EFL 1.7 svn doobies
[profile/ivi/eina.git] / src / examples / eina_hash_06.c
1 //Compile with:
2 //gcc -g eina_hash_06.c -o eina_hash_06 `pkg-config --cflags --libs eina`
3
4 #include <stdio.h>
5 #include <string.h>
6 #include <Eina.h>
7
8 /*
9  * Eina Hash - phonebook
10  *
11  * This example demonstrate the use of Eina Hash by implementing a phonebook
12  * that stores its contact data into the hash.
13  *
14  * It indexes the phone numbers by Contact Full Name, so it's a hash with
15  * string keys.
16  */
17
18 struct _Phone_Entry {
19      int64_t id; // Full name.
20      const char *number; // Phone number.
21 };
22
23 typedef struct _Phone_Entry Phone_Entry;
24
25 static Phone_Entry _start_entries[] = {
26        { 1, "+01 23 456-78910" },
27        { 2, "+12 34 567-89101" },
28        { 3, "+23 45 678-91012" },
29        { 4, "+34 56 789-10123" },
30        { -1, NULL }
31 }; // _start_entries
32
33 static void
34 _phone_entry_free_cb(void *data)
35 {
36    free(data);
37 }
38
39 static Eina_Bool
40 _phone_book_foreach_cb(const Eina_Hash *phone_book, const void *key,
41                        void *data, void *fdata)
42 {
43    const int64_t *id = key;
44    const char *number = data;
45    printf("%lld: %s\n", *id, number);
46
47    // Return EINA_FALSE to stop this callback from being called
48    return EINA_TRUE;
49 }
50
51 int
52 main(int argc, const char *argv[])
53 {
54    Eina_Hash *phone_book = NULL;
55    int i;
56    int64_t entry_id = 4;
57    char *phone = NULL;
58    Eina_Bool r;
59    Eina_Iterator *it;
60    void *data;
61
62    eina_init();
63
64    phone_book = eina_hash_int64_new(_phone_entry_free_cb);
65
66    // Add initial entries to our hash
67    for (i = 0; _start_entries[i].id != -1; i++)
68      {
69         eina_hash_add(phone_book, &_start_entries[i].id,
70                       strdup(_start_entries[i].number));
71      }
72
73    // Look for a specific entry and get its phone number
74    phone = eina_hash_find(phone_book, &entry_id);
75    if (phone)
76      {
77         printf("Printing entry.\n");
78         printf("Id: %lld\n", entry_id);
79         printf("Number: %s\n\n", phone);
80      }
81
82    // Delete this entry
83    r = eina_hash_del(phone_book, &entry_id, NULL);
84    printf("Hash entry successfully deleted? %d\n\n", r);
85
86    // Modify the pointer data of an entry and free the old one
87    int64_t id3 = 3;
88    phone = eina_hash_modify(phone_book, &id3,
89                             strdup("+23 45 111-11111"));
90    free(phone);
91
92    // Modify or add an entry to the hash with eina_hash_set
93    // Let's first add a new entry
94    int64_t id5 = 5;
95    eina_error_set(0);
96    phone = eina_hash_set(phone_book, &id5,
97                          strdup("+55 01 234-56789"));
98    if (!phone)
99      {
100         Eina_Error err = eina_error_get();
101         if (!err)
102           {
103              printf("No previous phone found for id5. ");
104              printf("Creating new entry.\n");
105           }
106         else
107           printf("Error when setting phone for Raul Seixas\n");
108      }
109    else
110      {
111         printf("Old phone for id5 was %s\n", phone);
112         free(phone);
113      }
114
115    printf("\n");
116
117    // Now change the phone number
118    eina_error_set(0);
119    phone = eina_hash_set(phone_book, &id5,
120                          strdup("+55 02 222-22222"));
121    if (phone)
122      {
123         printf("Changing phone for id5 to +55 02 222-22222. ");
124         printf("Old phone was %s\n", phone);
125         free(phone);
126      }
127    else
128      {
129         Eina_Error err = eina_error_get();
130         if (err)
131           printf("Error when changing phone for id5\n");
132         else
133           {
134              printf("No previous phone found for id5. ");
135              printf("Creating new entry.\n");
136           }
137      }
138
139    // There are many ways to iterate over our Phone book.
140    // First, iterate showing the names and associated numbers.
141    printf("List of phones:\n");
142    eina_hash_foreach(phone_book, _phone_book_foreach_cb, NULL);
143    printf("\n");
144
145    // Now iterate using an iterator
146    printf("List of phones:\n");
147    it = eina_hash_iterator_tuple_new(phone_book);
148    while (eina_iterator_next(it, &data))
149      {
150         Eina_Hash_Tuple *t = data;
151         const int64_t *id = t->key;
152         const char *number = t->data;
153         printf("%lld: %s\n", *id, number);
154      }
155    eina_iterator_free(it); // Always free the iterator after its use
156    printf("\n");
157
158    // Just iterate over the keys (names)
159    printf("List of ids in the phone book:\n");
160    it = eina_hash_iterator_key_new(phone_book);
161    while (eina_iterator_next(it, &data))
162      {
163         const int64_t *id = data;
164         printf("%lld\n", *id);
165      }
166    eina_iterator_free(it);
167    printf("\n");
168
169    // Just iterate over the data (numbers)
170    printf("List of numbers in the phone book:\n");
171    it = eina_hash_iterator_data_new(phone_book);
172    while (eina_iterator_next(it, &data))
173      {
174         const char *number = data;
175         printf("%s\n", number);
176      }
177    eina_iterator_free(it);
178    printf("\n");
179
180    // Check how many items are in the phone book
181    printf("There are %d items in the hash.\n\n",
182           eina_hash_population(phone_book));
183
184    // Change the name (key) on an entry
185    int64_t id6 = 6;
186    eina_hash_move(phone_book, &id5, &id6);
187    printf("List of phones after change:\n");
188    eina_hash_foreach(phone_book, _phone_book_foreach_cb, NULL);
189    printf("\n");
190
191    // Empty the phone book, but don't destroy it
192    eina_hash_free_buckets(phone_book);
193    printf("There are %d items in the hash.\n\n",
194           eina_hash_population(phone_book));
195
196    // Phone book could still be used, but we are freeing it since we are
197    // done for now
198    eina_hash_free(phone_book);
199
200    eina_shutdown();
201 }