LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/pgtypeslib - common.c (source / functions) Hit Total Coverage
Test: PostgreSQL 17devel Lines: 52 76 68.4 %
Date: 2024-04-26 07:11:03 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          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      147092 : pgtypes_alloc(long size)
      11             : {
      12      147092 :     char       *new = (char *) calloc(1L, size);
      13             : 
      14      147092 :     if (!new)
      15           0 :         errno = ENOMEM;
      16      147092 :     return new;
      17             : }
      18             : 
      19             : char *
      20        1560 : pgtypes_strdup(const char *str)
      21             : {
      22        1560 :     char       *new = (char *) strdup(str);
      23             : 
      24        1560 :     if (!new)
      25           0 :         errno = ENOMEM;
      26        1560 :     return new;
      27             : }
      28             : 
      29             : int
      30          76 : 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          76 :     int         i = 0;
      36             : 
      37          76 :     switch (replace_type)
      38             :     {
      39           8 :         case PGTYPES_TYPE_NOTHING:
      40           8 :             break;
      41          16 :         case PGTYPES_TYPE_STRING_CONSTANT:
      42             :         case PGTYPES_TYPE_STRING_MALLOCED:
      43          16 :             i = strlen(replace_val.str_val);
      44          16 :             if (i + 1 <= *pstr_len)
      45             :             {
      46             :                 /* include trailing terminator in what we copy */
      47          16 :                 memcpy(*output, replace_val.str_val, i + 1);
      48          16 :                 *pstr_len -= i;
      49          16 :                 *output += i;
      50          16 :                 if (replace_type == PGTYPES_TYPE_STRING_MALLOCED)
      51           0 :                     free(replace_val.str_val);
      52          16 :                 return 0;
      53             :             }
      54             :             else
      55           0 :                 return -1;
      56             :             break;
      57           4 :         case PGTYPES_TYPE_CHAR:
      58           4 :             if (*pstr_len >= 2)
      59             :             {
      60           4 :                 (*output)[0] = replace_val.char_val;
      61           4 :                 (*output)[1] = '\0';
      62           4 :                 (*pstr_len)--;
      63           4 :                 (*output)++;
      64           4 :                 return 0;
      65             :             }
      66             :             else
      67           0 :                 return -1;
      68             :             break;
      69          48 :         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          48 :                 char       *t = pgtypes_alloc(PGTYPES_FMT_NUM_MAX_DIGITS);
      78             : 
      79          48 :                 if (!t)
      80           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          12 :                     case PGTYPES_TYPE_UINT:
      92          12 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
      93             :                                      "%u", replace_val.uint_val);
      94          12 :                         break;
      95          32 :                     case PGTYPES_TYPE_UINT_2_LZ:
      96          32 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
      97             :                                      "%02u", replace_val.uint_val);
      98          32 :                         break;
      99           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           4 :                     case PGTYPES_TYPE_UINT_3_LZ:
     104           4 :                         i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
     105             :                                      "%03u", replace_val.uint_val);
     106           4 :                         break;
     107           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          48 :                 if (i < 0 || i >= PGTYPES_FMT_NUM_MAX_DIGITS)
     114             :                 {
     115           0 :                     free(t);
     116           0 :                     return -1;
     117             :                 }
     118          48 :                 i = strlen(t);
     119          48 :                 *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          48 :                 if (*pstr_len <= 0)
     126             :                 {
     127           0 :                     free(t);
     128           0 :                     return -1;
     129             :                 }
     130          48 :                 strcpy(*output, t);
     131          48 :                 *output += i;
     132          48 :                 free(t);
     133             :             }
     134          48 :             break;
     135           0 :         default:
     136           0 :             break;
     137             :     }
     138          56 :     return 0;
     139             : }
     140             : 
     141             : /* Functions declared in pgtypes.h. */
     142             : 
     143             : /* Just frees memory (mostly needed for Windows) */
     144             : void
     145        4756 : PGTYPESchar_free(char *ptr)
     146             : {
     147        4756 :     free(ptr);
     148        4756 : }

Generated by: LCOV version 1.14