Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief
5 : *
6 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
7 : */
8 :
9 : #include "name.h"
10 :
11 : #include <string.h>
12 :
13 : #include "iterator.h"
14 : #include "yajl.h"
15 :
16 : // TODO defined privately in keyhelpers.c, API break possible..
17 : char * keyNameGetOneLevel (const char * name, size_t * size);
18 :
19 : /**
20 : * @brief Count number of levels in name of key
21 : *
22 : * @param cur the key to count levels
23 : *
24 : * @return number of levels in key name
25 : */
26 1694 : ssize_t elektraKeyCountLevel (const Key * cur)
27 : {
28 1694 : if (!cur)
29 : {
30 : return -1;
31 : }
32 :
33 1694 : ssize_t curLevels = 0;
34 1694 : keyNameReverseIterator curIt = elektraKeyNameGetReverseIterator (cur);
35 16278 : while (elektraKeyNameReverseNext (&curIt))
36 : {
37 12890 : ++curLevels;
38 : }
39 : return curLevels;
40 : }
41 :
42 : /**
43 : * @brief Count how many levels are equal between cur and cmp
44 : * (starting from begin)
45 : *
46 : * @param cmp1 one key to compare
47 : * @param cmp2 the other key to compare
48 : *
49 : * @retval 0 on null pointers or nothing equal
50 : * @retval -1 when too many equal levels
51 : */
52 1696 : ssize_t elektraKeyCountEqualLevel (const Key * cmp1, const Key * cmp2)
53 : {
54 1696 : if (!cmp1)
55 : {
56 : return 0;
57 : }
58 1696 : if (!cmp2)
59 : {
60 : return 0;
61 : }
62 :
63 1696 : const char * pcmp1 = keyName (cmp1);
64 1696 : const char * pcmp2 = keyName (cmp2);
65 1696 : size_t size1 = 0;
66 1696 : size_t size2 = 0;
67 1696 : ssize_t counter = 0;
68 :
69 25966 : while (*(pcmp1 = keyNameGetOneLevel (pcmp1 + size1, &size1)) && *(pcmp2 = keyNameGetOneLevel (pcmp2 + size2, &size2)) &&
70 23358 : size1 == size2 && !strncmp (pcmp1, pcmp2, size1))
71 : {
72 10508 : ++counter;
73 : }
74 :
75 1696 : if (counter < 0)
76 : {
77 0 : counter = -1;
78 : }
79 :
80 : return counter;
81 : }
|