Git init
[pkgs/e/elektra.git] / examples / sort.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <time.h>
4 #include <kdb.h>
5
6 void ksUnsort (KeySet *ks)
7 {
8         Key *cur;
9         size_t size = 0;
10         KeySet *randks=ksNew(0); /*This is the final randomized keyset*/
11         KeySet *tempks=ksNew(0); /*Temporary storage for keys not chosen to be inserted*/
12
13         while (ksGetSize(ks) > 0)
14         {
15                 ksRewind(ks);
16                 size = ksGetSize(ks);
17                 /* printf ("iterating %d\n", size); */
18                 while ((cur=ksPop(ks)) != 0)
19                 {
20                         /* printf ("\titerating %s\n", keyName(cur)); */
21                         if (!(rand()%size)) ksAppendKey(randks, cur);
22                         else ksAppendKey(tempks,cur);
23                 }
24                 ksAppend(ks, tempks);
25                 ksCopy(tempks,0);
26         }
27
28         ksCopy (ks, randks);
29
30         ksDel (randks);
31         ksDel (tempks);
32 }
33
34 int main(void)
35 {
36         Key *cur;
37         Key *found;
38         KeySet *ks = ksNew (30,
39                 keyNew ("user/rem2", KEY_REMOVE, KEY_DIR, KEY_END),
40                 keyNew ("user/rem1/key2", KEY_REMOVE, KEY_END),
41                 keyNew ("user/rem1/key1", KEY_REMOVE, KEY_END),
42                 keyNew ("user/rem1", KEY_REMOVE, KEY_DIR, KEY_END),
43                 keyNew ("user/dir1", KEY_DIR, KEY_END),
44                 keyNew ("user/dir1/key1", KEY_VALUE, "value1", KEY_END),
45                 keyNew ("user/dir1/key2", KEY_VALUE, "value2", KEY_END),
46                 keyNew ("user/dir1/key3", KEY_VALUE, "value3", KEY_END),
47                 keyNew ("user/dir1/key4", KEY_VALUE, "value4", KEY_END),
48                 keyNew ("user/dir1/.inactive1", KEY_COMMENT, "key is inactive", KEY_END),
49                 keyNew ("user/dir1/.inactive2", KEY_COMMENT, "additional information", KEY_END),
50                 keyNew ("user/dir2", KEY_DIR, KEY_END),
51                 keyNew ("user/dir2/key1", KEY_VALUE, "value1", KEY_END),
52                 keyNew ("user/dir2/key2", KEY_VALUE, "value2", KEY_END),
53                 keyNew ("user/dir2/key3", KEY_VALUE, "value3", KEY_END),
54                 keyNew ("user/dir2/key4", KEY_VALUE, "value4", KEY_END),
55                 keyNew ("user/dir3", KEY_DIR, KEY_END),
56                 keyNew ("user/dir3/key1", KEY_VALUE, "value1", KEY_END),
57                 keyNew ("user/dir3/.inactive1", KEY_COMMENT, "key is inactive", KEY_END),
58                 keyNew ("user/dir3/.inactive2", KEY_COMMENT, "a users comment", KEY_END),
59                 keyNew ("user/dir4", KEY_DIR, KEY_END),
60                 keyNew ("user/dir5", KEY_DIR, KEY_END),
61                 KS_END);
62
63         srand (23);
64         ksUnsort (ks);
65
66         printf ("Keys are now unsorted:\n");
67         ksRewind(ks);
68         while ((cur=ksNext(ks)) != 0)
69         {       /* Iterates over all keys and prints their name */
70                 if (keyNeedRemove(cur)) printf ("%s (Need Remove)\n", keyName(cur));
71                 else printf ("%s\n", keyName(cur));
72         }
73
74         found = ksLookupByName (ks, "user/dir1/key3", 0);
75         printf ("\nKeys are sorted after ksLookupByName:\n");
76         ksRewind(ks);
77         while ((cur=ksNext(ks)) != 0)
78         {       /* Iterates over all keys and prints their name */
79                 if (keyNeedRemove(cur)) printf ("%s (Need Remove)\n", keyName(cur));
80                 else printf ("%s\n", keyName(cur));
81         }
82
83         keySetName(found, "user/something/else");
84         found = ksLookupByName (ks, "user/something/else", 0);
85         printf ("\nKeys are *not* sorted after ksLookupByName because of changed name.\n");
86         printf ("The search for user/something/else found: %s\n", keyName(found));
87         printf ("The order is:\n");
88         ksRewind(ks);
89         while ((cur=ksNext(ks)) != 0)
90         {       /* Iterates over all keys and prints their name */
91                 if (keyNeedRemove(cur)) printf ("%s (Need Remove)\n", keyName(cur));
92                 else printf ("%s\n", keyName(cur));
93         }
94
95         printf ("\nSo we have to sort manually using ksSort()!\n");
96         ksSort (ks);
97         printf ("The same is valid for keyRemove().");
98         found = ksLookupByName (ks, "user/something/else", 0);
99         keyRemove (found);
100         found = ksLookupByName (ks, "user/something/else", 0);
101         printf ("\nKeys are *not* sorted after ksLookupByName because of changed name.\n");
102         printf ("The search for user/something/else (Need Remove) found: %s\n", keyName(found));
103         printf ("The order is:\n");
104         ksRewind(ks);
105         while ((cur=ksNext(ks)) != 0)
106         {       /* Iterates over all keys and prints their name */
107                 if (keyNeedRemove(cur)) printf ("%s (Need Remove)\n", keyName(cur));
108                 else printf ("%s\n", keyName(cur));
109         }
110
111         printf ("\nSo we have to sort manually using ksSort()!\n");
112         ksSort (ks);
113         printf ("Now we get:\n");
114         ksRewind(ks);
115         while ((cur=ksNext(ks)) != 0)
116         {       /* Iterates over all keys and prints their name */
117                 if (keyNeedRemove(cur)) printf ("%s (Need Remove)\n", keyName(cur));
118                 else printf ("%s\n", keyName(cur));
119         }
120
121
122         return 0;
123 }