LCOV - differential code coverage report
Current view: top level - src/interfaces/ecpg/pgtypeslib - common.c (source / functions) Coverage Total Hit UBC CBC
Current: Differential Code Coverage HEAD vs 15 Lines: 68.4 % 76 52 24 52
Current Date: 2023-04-08 15:15:32 Functions: 100.0 % 4 4 4
Baseline: 15
Baseline Date: 2023-04-08 15:09:40
Legend: Lines: hit not hit

           TLA  Line data    Source code
       1                 : /* src/interfaces/ecpg/pgtypeslib/common.c */
       2                 : 
       3                 : #include "postgres_fe.h"
       4                 : 
       5                 : #include "pgtypes.h"
       6                 : #include "pgtypeslib_extern.h"
       7                 : 
       8                 : /* Return value is zero-filled. */
       9                 : char *
      10 CBC       36765 : pgtypes_alloc(long size)
      11                 : {
      12           36765 :     char       *new = (char *) calloc(1L, size);
      13                 : 
      14           36765 :     if (!new)
      15 UBC           0 :         errno = ENOMEM;
      16 CBC       36765 :     return new;
      17                 : }
      18                 : 
      19                 : char *
      20             389 : pgtypes_strdup(const char *str)
      21                 : {
      22             389 :     char       *new = (char *) strdup(str);
      23                 : 
      24             389 :     if (!new)
      25 UBC           0 :         errno = ENOMEM;
      26 CBC         389 :     return new;
      27                 : }
      28                 : 
      29                 : int
      30              19 : pgtypes_fmt_replace(union un_fmt_comb replace_val, int replace_type, char **output, int *pstr_len)
      31                 : {
      32                 :     /*
      33                 :      * general purpose variable, set to 0 in order to fix compiler warning
      34                 :      */
      35              19 :     int         i = 0;
      36                 : 
      37              19 :     switch (replace_type)
      38                 :     {
      39               2 :         case PGTYPES_TYPE_NOTHING:
      40               2 :             break;
      41               4 :         case PGTYPES_TYPE_STRING_CONSTANT:
      42                 :         case PGTYPES_TYPE_STRING_MALLOCED:
      43               4 :             i = strlen(replace_val.str_val);
      44               4 :             if (i + 1 <= *pstr_len)
      45                 :             {
      46                 :                 /* include trailing terminator in what we copy */
      47               4 :                 memcpy(*output, replace_val.str_val, i + 1);
      48               4 :                 *pstr_len -= i;
      49               4 :                 *output += i;
      50               4 :                 if (replace_type == PGTYPES_TYPE_STRING_MALLOCED)
      51 UBC           0 :                     free(replace_val.str_val);
      52 CBC           4 :                 return 0;
      53                 :             }
      54                 :             else
      55 UBC           0 :                 return -1;
      56                 :             break;
      57 CBC           1 :         case PGTYPES_TYPE_CHAR:
      58               1 :             if (*pstr_len >= 2)
      59                 :             {
      60               1 :                 (*output)[0] = replace_val.char_val;
      61               1 :                 (*output)[1] = '\0';
      62               1 :                 (*pstr_len)--;
      63               1 :                 (*output)++;
      64               1 :                 return 0;
      65                 :             }
      66                 :             else
      67 UBC           0 :                 return -1;
      68                 :             break;
      69 CBC          12 :         case PGTYPES_TYPE_DOUBLE_NF:
      70                 :         case PGTYPES_TYPE_INT64:
      71                 :         case PGTYPES_TYPE_UINT:
      72                 :         case PGTYPES_TYPE_UINT_2_LZ:
      73                 :         case PGTYPES_TYPE_UINT_2_LS:
      74                 :         case PGTYPES_TYPE_UINT_3_LZ:
      75                 :         case PGTYPES_TYPE_UINT_4_LZ:
      76                 :             {
      77              12 :                 char       *t = pgtypes_alloc(PGTYPES_FMT_NUM_MAX_DIGITS);
      78                 : 
      79              12 :                 if (!t)
      80 UBC           0 :                     return ENOMEM;
      81                 :                 switch (replace_type)
      82                 :                 {
      83               0 :                     case PGTYPES_TYPE_DOUBLE_NF:
      84               0 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
      85                 :                                      "%0.0g", replace_val.double_val);
      86               0 :                         break;
      87               0 :                     case PGTYPES_TYPE_INT64:
      88               0 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
      89                 :                                      INT64_FORMAT, replace_val.int64_val);
      90               0 :                         break;
      91 CBC           3 :                     case PGTYPES_TYPE_UINT:
      92               3 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
      93                 :                                      "%u", replace_val.uint_val);
      94               3 :                         break;
      95               8 :                     case PGTYPES_TYPE_UINT_2_LZ:
      96               8 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
      97                 :                                      "%02u", replace_val.uint_val);
      98               8 :                         break;
      99 UBC           0 :                     case PGTYPES_TYPE_UINT_2_LS:
     100               0 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
     101                 :                                      "%2u", replace_val.uint_val);
     102               0 :                         break;
     103 CBC           1 :                     case PGTYPES_TYPE_UINT_3_LZ:
     104               1 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
     105                 :                                      "%03u", replace_val.uint_val);
     106               1 :                         break;
     107 UBC           0 :                     case PGTYPES_TYPE_UINT_4_LZ:
     108               0 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
     109                 :                                      "%04u", replace_val.uint_val);
     110               0 :                         break;
     111                 :                 }
     112                 : 
     113 CBC          12 :                 if (i < 0 || i >= PGTYPES_FMT_NUM_MAX_DIGITS)
     114                 :                 {
     115 UBC           0 :                     free(t);
     116               0 :                     return -1;
     117                 :                 }
     118 CBC          12 :                 i = strlen(t);
     119              12 :                 *pstr_len -= i;
     120                 : 
     121                 :                 /*
     122                 :                  * if *pstr_len == 0, we don't have enough space for the
     123                 :                  * terminator and the conversion fails
     124                 :                  */
     125              12 :                 if (*pstr_len <= 0)
     126                 :                 {
     127 UBC           0 :                     free(t);
     128               0 :                     return -1;
     129                 :                 }
     130 CBC          12 :                 strcpy(*output, t);
     131              12 :                 *output += i;
     132              12 :                 free(t);
     133                 :             }
     134              12 :             break;
     135 UBC           0 :         default:
     136               0 :             break;
     137                 :     }
     138 CBC          14 :     return 0;
     139                 : }
     140                 : 
     141                 : /* Functions declared in pgtypes.h. */
     142                 : 
     143                 : /* Just frees memory (mostly needed for Windows) */
     144                 : void
     145            1189 : PGTYPESchar_free(char *ptr)
     146                 : {
     147            1189 :     free(ptr);
     148            1189 : }
        

Generated by: LCOV version v1.16-55-g56c0a2a