LCOV - code coverage report
Current view: top level - src/plugins/yajl - name.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 18 19 94.7 %
Date: 2019-09-12 12:28:41 Functions: 2 2 100.0 %

          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             : }

Generated by: LCOV version 1.13