LTP GCOV extension - code coverage report
Current view: directory - work/ustr - ustr-sub-code.h
Test: Ustr coverage
Date: 2008-02-26 Instrumented lines: 273
Code covered: 100.0 % Executed lines: 273

       1                 : /* Copyright (c) 2007 Paul Rosenfeld
       2                 :                       James Antill -- See LICENSE file for terms. */
       3                 : #ifndef USTR_SUB_H
       4                 : #error " Include ustr-sub.h before this file."
       5                 : #endif
       6                 : 
       7                 : USTR_CONF_i_PROTO int ustrp__sub_undef(struct Ustr_pool *p, struct Ustr **ps1,
       8                 :                                        size_t pos, size_t len)
       9             920 : {
      10                 :   size_t clen;
      11                 :   
      12             459 :   USTR_ASSERT(ps1 && ustrp__assert_valid(!!p, *ps1));
      13                 :   
      14             920 :   if (!len)
      15             236 :     return (USTR_TRUE);
      16                 : 
      17             684 :   clen = ustrp__assert_valid_subustr(!!p, *ps1, pos, 1);
      18             684 :   if (!clen)
      19               2 :     return (USTR_FALSE);
      20             682 :   --pos;
      21                 :   
      22             682 :   if ((clen - pos) < len)
      23                 :   { /* need to expand s1, it's basically like ustr_set() with an offset */
      24              64 :     if (!ustrp__add_undef(p, ps1, len - (clen - pos)))
      25              12 :       return (USTR_FALSE);
      26                 :   }
      27             618 :   else if (!ustrp__sc_ensure_owner(p, ps1))
      28               6 :     return (USTR_FALSE);
      29                 :   
      30             664 :   return (USTR_TRUE);
      31                 : }
      32                 : USTR_CONF_I_PROTO
      33                 : int ustr_sub_undef(struct Ustr **ps1, size_t pos, size_t len)
      34               6 : { return (ustrp__sub_undef(0, ps1, pos, len)); }
      35                 : USTR_CONF_I_PROTO int ustrp_sub_undef(struct Ustr_pool *p, struct Ustrp **ps1,
      36                 :                                       size_t pos, size_t len)
      37               4 : {
      38               4 :   struct Ustr *tmp = &(*ps1)->s;
      39               4 :   int ret = ustrp__sub_undef(p, &tmp, pos, len);
      40               4 :   *ps1 = USTRP(tmp);
      41               4 :   return (ret);
      42                 : }
      43                 : 
      44                 : USTR_CONF_i_PROTO int ustrp__sub_buf(struct Ustr_pool *p, struct Ustr **ps1,
      45                 :                                      size_t pos, const void *buf, size_t len)
      46             722 : {
      47             722 :   if (!ustrp__sub_undef(p, ps1, pos, len))
      48              10 :     return (USTR_FALSE);
      49             712 :   --pos;
      50                 :   
      51             712 :   ustr__memcpy(*ps1, pos, buf, len);
      52                 : 
      53             712 :   return (USTR_TRUE);
      54                 : }
      55                 : USTR_CONF_I_PROTO
      56                 : int ustr_sub_buf(struct Ustr **ps1, size_t pos, const void *buf, size_t len)
      57              20 : { return (ustrp__sub_buf(0, ps1, pos, buf, len)); }
      58                 : USTR_CONF_I_PROTO int ustrp_sub_buf(struct Ustr_pool *p, struct Ustrp **ps1,
      59                 :                                     size_t pos, const void *buf, size_t len)
      60               8 : {
      61               8 :   struct Ustr *tmp = &(*ps1)->s;
      62               8 :   int ret = ustrp__sub_buf(p, &tmp, pos, buf, len);
      63               8 :   *ps1 = USTRP(tmp);
      64               8 :   return (ret);
      65                 : }
      66                 : 
      67                 : USTR_CONF_i_PROTO int ustrp__sub(struct Ustr_pool *p, struct Ustr **ps1,
      68                 :                                  size_t pos, const struct Ustr *s2)
      69              84 : {
      70              84 :   if (*ps1 == s2)
      71              44 :     return (ustrp__ins_subustr(p, ps1, pos - 1, s2, 1, pos - 1));
      72                 :   
      73              40 :   return (ustrp__sub_buf(p, ps1, pos, ustr_cstr(s2), ustr_len(s2)));
      74                 : }
      75                 : USTR_CONF_I_PROTO
      76                 : int ustr_sub(struct Ustr **ps1, size_t pos, const struct Ustr *s2)
      77              32 : { return (ustrp__sub(0, ps1, pos, s2)); }
      78                 : USTR_CONF_I_PROTO int ustrp_sub(struct Ustr_pool *p, struct Ustrp **ps1,
      79                 :                                 size_t pos, const struct Ustrp *s2)
      80               4 : {
      81               4 :   struct Ustr *tmp = &(*ps1)->s;
      82               4 :   int ret = ustrp__sub(p, &tmp, pos, &s2->s);
      83               4 :   *ps1 = USTRP(tmp);
      84               4 :   return (ret);
      85                 : }
      86                 : 
      87                 : USTR_CONF_i_PROTO
      88                 : int ustrp__sub_subustr(struct Ustr_pool *p, struct Ustr **ps1, size_t pos1,
      89                 :                        const struct Ustr *s2, size_t pos2, size_t len2)
      90              80 : {
      91              80 :   size_t clen2 = 0;
      92                 :   
      93              80 :   if (!len2)
      94               8 :     return (USTR_TRUE);
      95                 :   
      96              72 :   if (!(clen2 = ustrp__assert_valid_subustr(!!p, s2, pos2, len2)))
      97               4 :     return (USTR_FALSE);
      98                 : 
      99              68 :   if (clen2 == len2)
     100              16 :     return (ustrp__sub(p, ps1, pos1, s2));
     101                 :   
     102              52 :   if ((*ps1 == s2) && ustr_owner(*ps1))
     103                 :   {
     104              44 :     struct Ustr *tmp = USTR_NULL;
     105              44 :     int ret = USTR_FALSE;
     106                 : 
     107              44 :     if (pos1 == pos2) /* delete from end */
     108               5 :       return (ustrp__del(p, ps1, ((ustr_len(*ps1) - pos1) + 1) - len2));
     109                 :     
     110                 :     /* This is somewhat difficult to do "well". So punt. */
     111              40 :     if (!(tmp = ustrp__dup_subustr(p, s2, pos2, len2)))
     112               8 :       return (USTR_FALSE);
     113                 : 
     114              32 :     ret = ustrp__sub(p, ps1, pos1, tmp);
     115              32 :     ustrp__free(p, tmp);
     116                 :     
     117              32 :     return (ret);
     118                 :   }
     119                 :   
     120               8 :   --pos2;
     121                 :   
     122               8 :   return (ustrp__sub_buf(p, ps1, pos1, ustr_cstr(s2) + pos2, len2));
     123                 : }
     124                 : USTR_CONF_I_PROTO
     125                 : int ustr_sub_subustr(struct Ustr **ps1, size_t pos1,
     126                 :                      const struct Ustr *s2, size_t pos2, size_t len2)
     127              76 : { return (ustrp__sub_subustr(0, ps1, pos1, s2, pos2, len2)); }
     128                 : USTR_CONF_I_PROTO
     129                 : int ustrp_sub_subustrp(struct Ustr_pool *p, struct Ustrp **ps1, size_t pos1,
     130                 :                       const struct Ustrp *s2, size_t pos2, size_t len2)
     131               4 : {
     132               4 :   struct Ustr *tmp = &(*ps1)->s;
     133               4 :   int ret = ustrp__sub_subustr(p, &tmp, pos1, &s2->s, pos2, len2);
     134               4 :   *ps1 = USTRP(tmp);
     135               4 :   return (ret);
     136                 : }
     137                 : 
     138                 : USTR_CONF_i_PROTO int ustrp__sub_rep_chr(struct Ustr_pool *p, struct Ustr **ps1,
     139                 :                                          size_t pos, char chr, size_t len)
     140             176 : {
     141             176 :   if (!ustrp__sub_undef(p, ps1, pos, len))
     142               4 :     return (USTR_FALSE);
     143             172 :   --pos;
     144                 :   
     145             172 :   ustr__memset(*ps1, pos, chr, len);
     146                 : 
     147             172 :   return (USTR_TRUE);
     148                 : }
     149                 : USTR_CONF_I_PROTO
     150                 : int ustr_sub_rep_chr(struct Ustr **ps1, size_t pos, char chr, size_t len)
     151              24 : { return (ustrp__sub_rep_chr(0, ps1, pos, chr, len)); }
     152                 : USTR_CONF_I_PROTO int ustrp_sub_rep_chr(struct Ustr_pool *p, struct Ustrp **ps1,
     153                 :                                         size_t pos, char chr, size_t len)
     154               4 : {
     155               4 :   struct Ustr *tmp = &(*ps1)->s;
     156               4 :   int ret = ustrp__sub_rep_chr(p, &tmp, pos, chr, len);
     157               4 :   *ps1 = USTRP(tmp);
     158               4 :   return (ret);
     159                 : }
     160                 : 
     161                 : USTR_CONF_i_PROTO int ustrp__sc_sub_undef(struct Ustr_pool *p,struct Ustr **ps1,
     162                 :                                         size_t pos, size_t olen, size_t len)
     163             244 : {
     164             120 :   USTR_ASSERT(ps1);
     165                 : 
     166             244 :   if (!olen)
     167               8 :     return (ustrp__ins_undef(p, ps1, pos - 1, len));
     168                 :   
     169             236 :   if (!ustrp__assert_valid_subustr(!!p, *ps1, pos, olen))
     170               4 :     return (USTR_FALSE);
     171                 :   
     172             232 :   if (len == olen)
     173              92 :     return (ustrp__sc_ensure_owner(p, ps1));
     174                 : 
     175                 :   /* work at end, so we don't have to memmove as much */
     176             140 :   if (len < olen)
     177              76 :     return (ustrp__del_subustr(p, ps1, pos +  len,     olen -  len));
     178                 : 
     179              64 :   return (ustrp__ins_undef(    p, ps1, pos + olen - 1,  len - olen));
     180                 : }
     181                 : USTR_CONF_I_PROTO
     182                 : int ustr_sc_sub_undef(struct Ustr **ps1, size_t pos, size_t olen, size_t len)
     183               6 : { return (ustrp__sc_sub_undef(0, ps1, pos, olen, len)); }
     184                 : USTR_CONF_I_PROTO int ustrp_sc_sub_undef(struct Ustr_pool *p,struct Ustrp **ps1,
     185                 :                                          size_t pos, size_t olen, size_t len)
     186               4 : {
     187               4 :   struct Ustr *tmp = &(*ps1)->s;
     188               4 :   int ret = ustrp__sc_sub_undef(p, &tmp, pos, olen, len);
     189               4 :   *ps1 = USTRP(tmp);
     190               4 :   return (ret);
     191                 : }
     192                 : 
     193                 : USTR_CONF_i_PROTO
     194                 : int ustrp__sc_sub_buf(struct Ustr_pool *p, struct Ustr **ps1,
     195                 :                       size_t pos, size_t olen, const void *buf, size_t len)
     196             170 : {
     197             170 :   if (!ustrp__sc_sub_undef(p, ps1, pos, olen, len))
     198               4 :     return (USTR_FALSE);
     199                 : 
     200             166 :   return (ustrp__sub_buf(p, ps1, pos, buf, len));
     201                 : }
     202                 : USTR_CONF_I_PROTO
     203                 : int ustr_sc_sub_buf(struct Ustr **ps1,
     204                 :                     size_t pos, size_t olen, const void *buf, size_t len)
     205               8 : { return (ustrp__sc_sub_buf(0, ps1, pos, olen, buf, len)); }
     206                 : USTR_CONF_I_PROTO
     207                 : int ustrp_sc_sub_buf(struct Ustr_pool *p, struct Ustrp **ps1,
     208                 :                       size_t pos, size_t olen, const void *buf, size_t len)
     209               8 : {
     210               8 :   struct Ustr *tmp = &(*ps1)->s;
     211               8 :   int ret = ustrp__sc_sub_buf(p, &tmp, pos, olen, buf, len);
     212               8 :   *ps1 = USTRP(tmp);
     213               8 :   return (ret);
     214                 : }
     215                 : 
     216                 : USTR_CONF_i_PROTO
     217                 : int ustrp__sc_sub(struct Ustr_pool *p, struct Ustr **ps1,size_t pos,size_t olen,
     218                 :                   const struct Ustr *s2)
     219             100 : {
     220             100 :   if (!olen)
     221               4 :     return (ustrp__ins(p, ps1, pos - 1, s2));
     222                 :     
     223              96 :   if ((*ps1 == s2) && ustr_owner(*ps1))
     224                 :   {
     225              26 :     size_t clen = ustrp__assert_valid_subustr(!!p, *ps1, pos, olen);
     226              26 :     size_t alen = (clen - olen);
     227              26 :     size_t epos = ( pos + olen);
     228              26 :     size_t elen = (clen - epos) + 1;
     229                 :     char *ptr;
     230                 : 
     231              26 :     if (!clen)
     232               2 :       return (USTR_FALSE);
     233                 :     
     234                 :     /*
     235                 :       abcd/1.2 => abcdcd
     236                 :       abcd/2.2 => aabcdd
     237                 :       abcd/3.2 => ababcd
     238                 :     */
     239                 :     
     240              24 :     if (!ustrp__add_undef(p, ps1, alen))
     241               4 :       return (USTR_FALSE);
     242                 : 
     243              20 :     ptr = ustr_wstr(*ps1);
     244              20 :     if (pos != 1)
     245                 :     {
     246              16 :       size_t bpos = pos - 1;
     247              16 :       size_t blen = bpos;
     248                 : 
     249                 :       /* move current data, to make room */
     250              16 :       memmove(ptr + bpos, ptr, clen);
     251              16 :       memcpy(ptr, ptr + bpos, blen);
     252              16 :       epos += blen;
     253              16 :       clen += blen;
     254                 :     }
     255              20 :     ustr__memcpy(*ps1, clen, ptr + epos - 1, elen);
     256                 : 
     257              10 :     USTR_ASSERT(ps1 && ustrp__assert_valid(!!p, *ps1));
     258              20 :     return (USTR_TRUE);
     259                 :   }
     260                 :   
     261              70 :   return (ustrp__sc_sub_buf(p, ps1, pos, olen, ustr_cstr(s2), ustr_len(s2)));
     262                 : }
     263                 : USTR_CONF_I_PROTO
     264                 : int ustr_sc_sub(struct Ustr **ps1,size_t pos,size_t olen,
     265                 :                   const struct Ustr *s2)
     266              52 : { return (ustrp__sc_sub(0, ps1, pos, olen, s2)); }
     267                 : USTR_CONF_I_PROTO
     268                 : int ustrp_sc_sub(struct Ustr_pool *p, struct Ustrp **ps1,size_t pos,size_t olen,
     269                 :                  const struct Ustrp *s2)
     270               4 : {
     271               4 :   struct Ustr *tmp = &(*ps1)->s;
     272               4 :   int ret = ustrp__sc_sub(p, &tmp, pos, olen, &s2->s);
     273               4 :   *ps1 = USTRP(tmp);
     274               4 :   return (ret);
     275                 : }
     276                 : 
     277                 : USTR_CONF_i_PROTO
     278                 : int ustrp__sc_sub_subustr(struct Ustr_pool *p,
     279                 :                           struct Ustr **ps1, size_t pos1, size_t len1,
     280                 :                           const struct Ustr *s2, size_t pos2, size_t len2)
     281              76 : {
     282              76 :   size_t clen2 = 0;
     283                 :   
     284              76 :   if (!len2)
     285              12 :     return (ustrp__del_subustr(p, ps1, pos1, len1));
     286                 :   
     287              64 :   if (!(clen2 = ustrp__assert_valid_subustr(!!p, s2, pos2, len2)))
     288               4 :     return (USTR_FALSE);
     289                 : 
     290              60 :   if (clen2 == len2)
     291               4 :     return (ustrp__sc_sub(p, ps1, pos1, len1, s2));
     292                 :   
     293              56 :   if ((*ps1 == s2) && ustr_owner(*ps1))
     294                 :   {
     295              44 :     struct Ustr *tmp = USTR_NULL;
     296              44 :     int ret = USTR_FALSE;
     297                 :     
     298                 :     /* This is somewhat difficult to do "well". So punt. */
     299              44 :     if (!(tmp = ustrp__dup_subustr(p, s2, pos2, len2)))
     300               4 :       return (USTR_FALSE);
     301                 : 
     302              40 :     ret = ustrp__sc_sub(p, ps1, pos1, len1, tmp);
     303              40 :     ustrp__free(p, tmp);
     304                 :     
     305              40 :     return (ret);
     306                 :   }
     307                 : 
     308              12 :   --pos2;
     309                 :   
     310              12 :   return (ustrp__sc_sub_buf(p, ps1, pos1, len1, ustr_cstr(s2) + pos2, len2));
     311                 : }
     312                 : USTR_CONF_I_PROTO
     313                 : int ustr_sc_sub_subustr(struct Ustr **ps1, size_t pos1, size_t len1,
     314                 :                         const struct Ustr *s2, size_t pos2, size_t len2)
     315              72 : { return (ustrp__sc_sub_subustr(0, ps1, pos1, len1, s2, pos2, len2)); }
     316                 : USTR_CONF_I_PROTO
     317                 : int ustrp_sc_sub_subustrp(struct Ustr_pool *p,
     318                 :                           struct Ustrp **ps1, size_t pos1, size_t len1,
     319                 :                           const struct Ustrp *s2, size_t pos2, size_t len2)
     320               4 : {
     321               4 :   struct Ustr *tmp = &(*ps1)->s;
     322               4 :   int ret = ustrp__sc_sub_subustr(p, &tmp, pos1, len1, &s2->s, pos2, len2);
     323               4 :   *ps1 = USTRP(tmp);
     324               4 :   return (ret);
     325                 : }
     326                 : 
     327                 : USTR_CONF_i_PROTO
     328                 : int ustrp__sc_sub_rep_chr(struct Ustr_pool *p, struct Ustr **ps1,
     329                 :                           size_t pos, size_t olen, char chr, size_t len)
     330              56 : {
     331              56 :   if (!ustrp__sc_sub_undef(p, ps1, pos, olen, len))
     332               4 :     return (USTR_FALSE);
     333                 : 
     334              52 :   return (ustrp__sub_rep_chr(p, ps1, pos, chr, len));
     335                 : }
     336                 : USTR_CONF_I_PROTO int ustr_sc_sub_rep_chr(struct Ustr **ps1, size_t pos,
     337                 :                                           size_t olen, char chr, size_t len)
     338              16 : { return (ustrp__sc_sub_rep_chr(0, ps1, pos, olen, chr, len)); }
     339                 : USTR_CONF_I_PROTO
     340                 : int ustrp_sc_sub_rep_chr(struct Ustr_pool *p, struct Ustrp **ps1,
     341                 :                          size_t pos, size_t olen, char chr, size_t len)
     342               4 : {
     343               4 :   struct Ustr *tmp = &(*ps1)->s;
     344               4 :   int ret = ustrp__sc_sub_rep_chr(p, &tmp, pos, olen, chr, len);
     345               4 :   *ps1 = USTRP(tmp);
     346               4 :   return (ret);
     347                 : }
     348                 : 
     349                 : #ifdef USTR_FMT_H
     350                 : # if USTR_CONF_HAVE_VA_COPY
     351                 : USTR_CONF_i_PROTO
     352                 : int ustrp__sub_vfmt_lim(struct Ustr_pool *p, struct Ustr **ps1, size_t pos,
     353                 :                         size_t lim, const char *fmt, va_list ap)
     354              56 : { /* NOTE: Copy and pasted so we can use ustrp_set_undef() */
     355                 :   va_list nap;
     356              56 :   int rc = -1;
     357                 :   char buf[USTR__SNPRINTF_LOCAL];
     358                 :   char *ptr;
     359                 :   char save_end;
     360                 :   
     361              56 :   USTR__VA_COPY(nap, ap);
     362              56 :   rc = USTR_CONF_VSNPRINTF_BEG(buf, sizeof(buf), fmt, nap);
     363              56 :   va_end(nap);
     364                 : 
     365              56 :   if ((rc == -1) && ((rc = ustr__retard_vfmt_ret(fmt, ap)) == -1))
     366               4 :     return (USTR_FALSE);
     367                 : 
     368              52 :   if (lim && ((size_t)rc > lim))
     369              12 :     rc = lim;
     370                 :   
     371              52 :   if ((size_t)rc < sizeof(buf)) /* everything is done */
     372              40 :     return (ustrp__sub_buf(p, ps1, pos, buf, rc));
     373                 :   
     374              12 :   if (!ustrp__sub_undef(p, ps1, pos--, rc))
     375               4 :     return (USTR_FALSE);
     376                 :   
     377               8 :   ptr = ustr_wstr(*ps1);
     378                 :   
     379               8 :   save_end = ptr[pos + rc]; /* might be NIL, might be a char */
     380               8 :   USTR_CONF_VSNPRINTF_END(ptr + pos, rc + 1, fmt, ap);
     381               8 :   ptr[pos + rc] = save_end;
     382                 : 
     383               4 :   USTR_ASSERT(ustrp__assert_valid(!!p, *ps1));
     384                 :   
     385               8 :   return (USTR_TRUE);
     386                 : }
     387                 : USTR_CONF_I_PROTO int ustr_sub_vfmt_lim(struct Ustr **ps1,size_t pos,size_t lim,
     388                 :                                         const char *fmt, va_list ap)
     389              44 : { return (ustrp__sub_vfmt_lim(0, ps1, pos, lim, fmt, ap)); }
     390                 : USTR_CONF_I_PROTO
     391                 : int ustrp_sub_vfmt_lim(struct Ustr_pool *p,struct Ustrp **ps1, size_t pos,
     392                 :                        size_t lim, const char *fmt, va_list ap)
     393              12 : {
     394              12 :   struct Ustr *tmp = &(*ps1)->s;
     395              12 :   int ret = ustrp__sub_vfmt_lim(p, &tmp, pos, lim, fmt, ap);
     396              12 :   *ps1 = USTRP(tmp);
     397              12 :   return (ret);
     398                 : }
     399                 : 
     400                 : USTR_CONF_I_PROTO int ustr_sub_fmt_lim(struct Ustr **ps1, size_t pos,
     401                 :                                        size_t lim, const char *fmt, ...)
     402              20 : {
     403                 :   va_list ap;
     404              20 :   int ret = USTR_FALSE;
     405                 :   
     406              20 :   va_start(ap, fmt);
     407              20 :   ret = ustr_sub_vfmt_lim(ps1, pos, lim, fmt, ap);
     408              20 :   va_end(ap);
     409                 :   
     410              20 :   return (ret);
     411                 : }
     412                 : 
     413                 : USTR_CONF_I_PROTO
     414                 : int ustrp_sub_fmt_lim(struct Ustr_pool *p, struct Ustrp **ps1, size_t pos,
     415                 :                       size_t lim, const char*fmt, ...)
     416               4 : {
     417                 :   va_list ap;
     418               4 :   int ret = USTR_FALSE;
     419                 :   
     420               4 :   va_start(ap, fmt);
     421               4 :   ret = ustrp_sub_vfmt_lim(p, ps1, pos, lim, fmt, ap);
     422               4 :   va_end(ap);
     423                 :   
     424               4 :   return (ret);
     425                 : }
     426                 : 
     427                 : USTR_CONF_I_PROTO int ustr_sub_vfmt(struct Ustr **ps1, size_t pos,
     428                 :                                     const char *fmt, va_list ap)
     429              24 : { return (ustr_sub_vfmt_lim(ps1, pos, 0, fmt, ap)); }
     430                 : 
     431                 : USTR_CONF_I_PROTO int ustrp_sub_vfmt(struct Ustr_pool *p, struct Ustrp **ps1,
     432                 :                                      size_t pos, const char *fmt, va_list ap)
     433               8 : { return (ustrp_sub_vfmt_lim(p, ps1, pos, 0, fmt, ap)); }
     434                 : 
     435                 : USTR_CONF_I_PROTO
     436                 : int ustr_sub_fmt(struct Ustr **ps1, size_t pos, const char *fmt, ...)
     437              24 : {
     438                 :   va_list ap;
     439              24 :   int ret = USTR_FALSE;
     440                 :   
     441              24 :   va_start(ap, fmt);
     442              24 :   ret = ustr_sub_vfmt(ps1, pos, fmt, ap);
     443              24 :   va_end(ap);
     444                 :   
     445              24 :   return (ret);
     446                 : }
     447                 : 
     448                 : USTR_CONF_I_PROTO int ustrp_sub_fmt(struct Ustr_pool *p, struct Ustrp **ps1,
     449                 :                                     size_t pos, const char *fmt, ...)
     450               8 : {
     451                 :   va_list ap;
     452               8 :   int ret = USTR_FALSE;
     453                 :   
     454               8 :   va_start(ap, fmt);
     455               8 :   ret = ustrp_sub_vfmt(p, ps1, pos, fmt, ap);
     456               8 :   va_end(ap);
     457                 :   
     458               8 :   return (ret);
     459                 : }
     460                 : 
     461                 : USTR_CONF_i_PROTO
     462                 : int ustrp__sc_sub_vfmt_lim(struct Ustr_pool *p, struct Ustr **ps1, size_t pos,
     463                 :                            size_t len, size_t lim, const char *fmt, va_list ap)
     464              52 : { /* NOTE: Copy and pasted so we can use ustrp_set_undef() */
     465                 :   va_list nap;
     466              52 :   int rc = -1;
     467                 :   char buf[USTR__SNPRINTF_LOCAL];
     468                 :   char *ptr;
     469                 :   char save_end;
     470                 :   
     471              52 :   USTR__VA_COPY(nap, ap);
     472              52 :   rc = USTR_CONF_VSNPRINTF_BEG(buf, sizeof(buf), fmt, nap);
     473              52 :   va_end(nap);
     474                 : 
     475              52 :   if ((rc == -1) && ((rc = ustr__retard_vfmt_ret(fmt, ap)) == -1))
     476               4 :     return (USTR_FALSE);
     477                 : 
     478              48 :   if (lim && ((size_t)rc > lim))
     479              16 :     rc = lim;
     480                 :   
     481              48 :   if ((size_t)rc < sizeof(buf)) /* everything is done */
     482              40 :     return (ustrp__sc_sub_buf(p, ps1, pos, len, buf, rc));
     483                 :   
     484               8 :   if (!ustrp__sc_sub_undef(p, ps1, pos--, len, rc))
     485               4 :     return (USTR_FALSE);
     486                 :   
     487               4 :   ptr = ustr_wstr(*ps1);
     488                 :   
     489               4 :   save_end = ptr[pos + rc]; /* might be NIL if at end, might be a char */
     490               4 :   USTR_CONF_VSNPRINTF_END(ptr + pos, rc + 1, fmt, ap);
     491               4 :   ptr[pos + rc] = save_end;
     492                 : 
     493               2 :   USTR_ASSERT(ustrp__assert_valid(!!p, *ps1));
     494                 :   
     495               4 :   return (USTR_TRUE);
     496                 : }
     497                 : USTR_CONF_I_PROTO
     498                 : int ustr_sc_sub_vfmt_lim(struct Ustr **ps1,size_t pos, size_t len,
     499                 :                          size_t lim, const char *fmt, va_list ap)
     500              40 : { return (ustrp__sc_sub_vfmt_lim(0, ps1, pos, len, lim, fmt, ap)); }
     501                 : USTR_CONF_I_PROTO
     502                 : int ustrp_sc_sub_vfmt_lim(struct Ustr_pool *p,struct Ustrp **ps1, size_t pos,
     503                 :                           size_t len, size_t lim, const char *fmt, va_list ap)
     504              12 : {
     505              12 :   struct Ustr *tmp = &(*ps1)->s;
     506              12 :   int ret = ustrp__sc_sub_vfmt_lim(p, &tmp, pos, len, lim, fmt, ap);
     507              12 :   *ps1 = USTRP(tmp);
     508              12 :   return (ret);
     509                 : }
     510                 : 
     511                 : USTR_CONF_I_PROTO
     512                 : int ustr_sc_sub_fmt_lim(struct Ustr **ps1, size_t pos, size_t len,
     513                 :                         size_t lim, const char *fmt, ...)
     514              28 : {
     515                 :   va_list ap;
     516              28 :   int ret = USTR_FALSE;
     517                 :   
     518              28 :   va_start(ap, fmt);
     519              28 :   ret = ustr_sc_sub_vfmt_lim(ps1, pos, len, lim, fmt, ap);
     520              28 :   va_end(ap);
     521                 :   
     522              28 :   return (ret);
     523                 : }
     524                 : 
     525                 : USTR_CONF_I_PROTO
     526                 : int ustrp_sc_sub_fmt_lim(struct Ustr_pool *p, struct Ustrp **ps1, size_t pos,
     527                 :                          size_t len, size_t lim, const char*fmt, ...)
     528               4 : {
     529                 :   va_list ap;
     530               4 :   int ret = USTR_FALSE;
     531                 :   
     532               4 :   va_start(ap, fmt);
     533               4 :   ret = ustrp_sc_sub_vfmt_lim(p, ps1, pos, len, lim, fmt, ap);
     534               4 :   va_end(ap);
     535                 :   
     536               4 :   return (ret);
     537                 : }
     538                 : 
     539                 : USTR_CONF_I_PROTO int ustr_sc_sub_vfmt(struct Ustr **ps1, size_t pos,
     540                 :                                        size_t len, const char *fmt, va_list ap)
     541              12 : { return (ustr_sc_sub_vfmt_lim(ps1, pos, len, 0, fmt, ap)); }
     542                 : 
     543                 : USTR_CONF_I_PROTO
     544                 : int ustrp_sc_sub_vfmt(struct Ustr_pool *p, struct Ustrp **ps1,
     545                 :                    size_t pos, size_t len, const char *fmt, va_list ap)
     546               8 : { return (ustrp_sc_sub_vfmt_lim(p, ps1, pos, len, 0, fmt, ap)); }
     547                 : 
     548                 : USTR_CONF_I_PROTO int ustr_sc_sub_fmt(struct Ustr **ps1, size_t pos, size_t len,
     549                 :                                       const char *fmt, ...)
     550              12 : {
     551                 :   va_list ap;
     552              12 :   int ret = USTR_FALSE;
     553                 :   
     554              12 :   va_start(ap, fmt);
     555              12 :   ret = ustr_sc_sub_vfmt(ps1, pos, len, fmt, ap);
     556              12 :   va_end(ap);
     557                 :   
     558              12 :   return (ret);
     559                 : }
     560                 : 
     561                 : USTR_CONF_I_PROTO
     562                 : int ustrp_sc_sub_fmt(struct Ustr_pool *p, struct Ustrp **ps1,
     563                 :                      size_t pos, size_t len, const char *fmt, ...)
     564               8 : {
     565                 :   va_list ap;
     566               8 :   int ret = USTR_FALSE;
     567                 :   
     568               8 :   va_start(ap, fmt);
     569               8 :   ret = ustrp_sc_sub_vfmt(p, ps1, pos, len, fmt, ap);
     570               8 :   va_end(ap);
     571                 :   
     572               8 :   return (ret);
     573                 : }
     574                 : # endif
     575                 : #endif

Generated by: LTP GCOV extension version 1.4