skalibs

Mirror/fork of https://skarnet.org/software/skalibs/
git clone https://ccx.te2000.cz/git/skalibs
Log | Files | Refs | README | LICENSE

netstring_put.c (849B)


      1 /* ISC license. */
      2 
      3 #include <errno.h>
      4 #include <skalibs/uint64.h>
      5 #include <skalibs/buffer.h>
      6 #include <skalibs/netstring.h>
      7 
      8 int netstring_put (buffer *b, char const *s, size_t len, size_t *written)
      9 {
     10   char fmt[UINT64_FMT] ;
     11   size_t n = uint64_fmt(fmt, len) ;
     12   if (*written > len + n + 2) return (errno = EINVAL, 0) ;
     13   fmt[n] = ':' ;
     14   if (*written < n + 1)
     15   {
     16     size_t w = *written ;
     17     int r = buffer_putall(b, fmt, n+1, &w) ;
     18     if (r < 0) return (*written = w, 0) ;
     19     *written = n+1 ;
     20   }
     21   if (*written < n+1 + len)
     22   {
     23     size_t w = *written - (n+1) ;
     24     int r = buffer_putall(b, s, len, &w) ;
     25     *written = w + (n+1) ;
     26     if (r < 0) return (*written = n+1 + w, 0) ;
     27     *written = n+1 + len ;
     28   }
     29   {
     30     size_t w = 0 ;
     31     int r = buffer_putall(b, ",", 1, &w) ;
     32     if (r < 0) return 0 ;
     33   }
     34   *written = 0 ;
     35   return 1 ;
     36 }