3535#include  "cutils.h" 
3636
3737#undef  NANOSEC
38- #define  NANOSEC  ((uint64_t) 1e9) 
38+ #define  NANOSEC   1000000000 
3939
4040#pragma  GCC visibility push(default)
4141
42- void  pstrcpy (char  * buf , int  buf_size , const  char  * str )
42+ void  pstrcpy (char  * buf , size_t  buf_size , const  char  * str )
4343{
44-     int  c ;
4544    char  * q  =  buf ;
4645
4746    if  (buf_size  <= 0 )
4847        return ;
4948
5049    for (;;) {
51-         c  =  * str ++ ;
50+         char   c  =  * str ++ ;
5251        if  (c  ==  0  ||  q  >= buf  +  buf_size  -  1 )
5352            break ;
5453        * q ++  =  c ;
@@ -57,10 +56,9 @@ void pstrcpy(char *buf, int buf_size, const char *str)
5756}
5857
5958/* strcat and truncate. */ 
60- char  * pstrcat (char  * buf , int  buf_size , const  char  * s )
59+ char  * pstrcat (char  * buf , size_t  buf_size , const  char  * s )
6160{
62-     int  len ;
63-     len  =  strlen (buf );
61+     size_t  len  =  strlen (buf );
6462    if  (len  <  buf_size )
6563        pstrcpy (buf  +  len , buf_size  -  len , s );
6664    return  buf ;
@@ -105,11 +103,6 @@ void dbuf_init2(DynBuf *s, void *opaque, DynBufReallocFunc *realloc_func)
105103    s -> realloc_func  =  realloc_func ;
106104}
107105
108- void  dbuf_init (DynBuf  * s )
109- {
110-     dbuf_init2 (s , NULL , NULL );
111- }
112- 
113106/* return < 0 if error */ 
114107int  dbuf_realloc (DynBuf  * s , size_t  new_size )
115108{
@@ -178,29 +171,59 @@ int dbuf_putstr(DynBuf *s, const char *str)
178171    return  dbuf_put (s , (const  uint8_t  * )str , strlen (str ));
179172}
180173
181- int  __attribute__((format (printf , 2 , 3 ))) dbuf_printf (DynBuf  * s ,
182-                                                       const  char  * fmt , ...)
174+ static  int  dbuf_vprintf_default (DynBuf  * s , const  char  * fmt , va_list  ap )
183175{
184-     va_list  ap ;
185176    char  buf [128 ];
177+     va_list  arg ;
178+     size_t  size , avail , ulen ;
186179    int  len ;
180+     char  * dest ;
181+ 
182+     dest  =  buf ;
183+     size  =  sizeof  buf ;
184+     avail  =  s -> allocated_size  -  s -> size ;
185+     if  (avail  >  size ) {
186+         dest  =  (char  * )(s -> buf  +  s -> size );
187+         size  =  avail ;
188+     }
189+     va_copy (arg , ap );
190+     len  =  vsnprintf (dest , size , fmt , arg );
191+     va_end (arg );
187192
188-     va_start (ap , fmt );
189-     len  =  vsnprintf (buf , sizeof (buf ), fmt , ap );
190-     va_end (ap );
191-     if  (len  <  sizeof (buf )) {
192-         /* fast case */ 
193-         return  dbuf_put (s , (uint8_t  * )buf , len );
194-     } else  {
195-         if  (dbuf_realloc (s , s -> size  +  len  +  1 ))
193+     if  (len  <  0 )
194+         return  len ;
195+ 
196+     ulen  =  (size_t )len ;
197+     if  (ulen  >= avail ) {
198+         if  (dbuf_realloc (s , s -> size  +  ulen  +  1 ))
196199            return  -1 ;
197-         va_start (ap , fmt );
198-         vsnprintf ((char  * )(s -> buf  +  s -> size ), s -> allocated_size  -  s -> size ,
199-                   fmt , ap );
200-         va_end (ap );
201-         s -> size  +=  len ;
202200    }
203-     return  0 ;
201+     if  (dest  ==  buf  &&  ulen  <  sizeof  buf ) {
202+         memcpy (s -> buf  +  s -> size , buf , ulen  +  1 );
203+     } else 
204+     if  (ulen  >= avail ) {
205+         avail  =  s -> allocated_size  -  s -> size ;
206+         va_copy (arg , ap );
207+         vsnprintf ((char  * )(s -> buf  +  s -> size ), avail , fmt , arg );
208+         va_end (arg );
209+     }
210+     s -> size  +=  ulen ;
211+     return  len ;
212+ }
213+ 
214+ /* replaceable formatter */ 
215+ int  (* dbuf_vprintf_fun )(DynBuf  * s , const  char  * fmt , va_list  ap ) =  dbuf_vprintf_default ;
216+ 
217+ __attribute__((format (printf , 2 , 3 )))
218+ int  dbuf_printf (DynBuf  * s , const  char  * fmt , ...)
219+ {
220+     va_list  ap ;
221+     int  len ;
222+ 
223+     va_start (ap , fmt );
224+     len  =  (* dbuf_vprintf_fun )(s , fmt , ap );
225+     va_end (ap );
226+     return  len ;
204227}
205228
206229void  dbuf_free (DynBuf  * s )
@@ -589,6 +612,7 @@ size_t utf8_encode_buf16(char *dest, size_t dest_len, const uint16_t *src, size_
589612
590613/* 2 <= base <= 36 */ 
591614char  const  digits36 [36 ] =  "0123456789abcdefghijklmnopqrstuvwxyz" ;
615+ char  const  digits36_upper [36 ] =  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
592616
593617#define  USE_SPECIAL_RADIX_10   1  // special case base 10 radix conversions
594618#define  USE_SINGLE_CASE_FAST   1  // special case single digit numbers
@@ -600,7 +624,7 @@ char const digits36[36] = "0123456789abcdefghijklmnopqrstuvwxyz";
600624        else \
601625            buf = (buf << 8) | (c)
602626
603- size_t  u7toa_shift (char  dest [minimum_length (8 )], uint32_t  n )
627+ static   size_t  u7toa_shift (char  dest [minimum_length (8 )], uint32_t  n )
604628{
605629    size_t  len  =  1 ;
606630    uint64_t  buf  =  0 ;
@@ -615,7 +639,7 @@ size_t u7toa_shift(char dest[minimum_length(8)], uint32_t n)
615639    return  len ;
616640}
617641
618- size_t  u07toa_shift (char  dest [minimum_length (8 )], uint32_t  n , size_t  len )
642+ static   size_t  u07toa_shift (char  dest [minimum_length (8 )], uint32_t  n , size_t  len )
619643{
620644    size_t  i ;
621645    dest  +=  len ;
@@ -641,39 +665,41 @@ size_t u32toa(char buf[minimum_length(11)], uint32_t n)
641665#define  TEN_POW_7  10000000
642666    if  (n  >= TEN_POW_7 ) {
643667        uint32_t  quo  =  n  / TEN_POW_7 ;
668+         size_t  len ;
644669        n  %= TEN_POW_7 ;
645-         size_t   len  =  u7toa_shift (buf , quo );
670+         len  =  u7toa_shift (buf , quo );
646671        return  u07toa_shift (buf , n , len );
647672    }
648673    return  u7toa_shift (buf , n );
649674}
650675
651676size_t  u64toa (char  buf [minimum_length (21 )], uint64_t  n )
652677{
678+     size_t  len ;
679+ 
653680    if  (likely (n  <  0x100000000 ))
654-         return  u32toa (buf , n );
681+         return  u32toa (buf , ( uint32_t ) n );
655682
656-     size_t  len ;
657683    if  (n  >= TEN_POW_7 ) {
658684        uint64_t  n1  =  n  / TEN_POW_7 ;
659685        n  %= TEN_POW_7 ;
660686        if  (n1  >= TEN_POW_7 ) {
661-             uint32_t  quo  =  n1  / TEN_POW_7 ;
687+             uint32_t  quo  =  ( uint32_t )( n1  / TEN_POW_7 ) ;
662688            n1  %= TEN_POW_7 ;
663689            len  =  u7toa_shift (buf , quo );
664-             len  =  u07toa_shift (buf , n1 , len );
690+             len  =  u07toa_shift (buf , ( uint32_t ) n1 , len );
665691        } else  {
666-             len  =  u7toa_shift (buf , n1 );
692+             len  =  u7toa_shift (buf , ( uint32_t ) n1 );
667693        }
668-         return  u07toa_shift (buf , n , len );
694+         return  u07toa_shift (buf , ( uint32_t ) n , len );
669695    }
670-     return  u7toa_shift (buf , n );
696+     return  u7toa_shift (buf , ( uint32_t ) n );
671697}
672698
673699size_t  i32toa (char  buf [minimum_length (12 )], int32_t  n )
674700{
675701    if  (likely (n  >= 0 ))
676-         return  u32toa (buf , n );
702+         return  u32toa (buf , ( uint32_t ) n );
677703
678704    buf [0 ] =  '-' ;
679705    return  1  +  u32toa (buf  +  1 , - (uint32_t )n );
@@ -682,7 +708,7 @@ size_t i32toa(char buf[minimum_length(12)], int32_t n)
682708size_t  i64toa (char  buf [minimum_length (22 )], int64_t  n )
683709{
684710    if  (likely (n  >= 0 ))
685-         return  u64toa (buf , n );
711+         return  u64toa (buf , ( uint64_t ) n );
686712
687713    buf [0 ] =  '-' ;
688714    return  1  +  u64toa (buf  +  1 , - (uint64_t )n );
@@ -713,7 +739,7 @@ size_t u32toa_radix(char buf[minimum_length(33)], uint32_t n, unsigned base)
713739    shift  =  radix_shift [base  &  63 ];
714740    if  (shift ) {
715741        uint32_t  mask  =  (1  << shift ) -  1 ;
716-         size_t  len  =  (32  -  clz32 (n ) +  shift  -  1 ) / shift ;
742+         size_t  len  =  (size_t )(( 32  -  clz32 (n ) +  shift  -  1 ) / shift ) ;
717743        size_t  last  =  n  &  mask ;
718744        char  * end  =  buf  +  len ;
719745        n  >>= shift ;
@@ -729,13 +755,14 @@ size_t u32toa_radix(char buf[minimum_length(33)], uint32_t n, unsigned base)
729755    } else  {
730756        size_t  len  =  2 ;
731757        size_t  last  =  n  % base ;
732-         n  /= base ;
733758        uint32_t  nbase  =  base ;
759+         char  * end ;
760+         n  /= base ;
734761        while  (n  >= nbase ) {
735762            nbase  *= base ;
736763            len ++ ;
737764        }
738-         char   * end  =  buf  +  len ;
765+         end  =  buf  +  len ;
739766        * end --  =  '\0' ;
740767        * end --  =  digits36 [last ];
741768        while  (n  >= base ) {
@@ -762,33 +789,36 @@ size_t u64toa_radix(char buf[minimum_length(65)], uint64_t n, unsigned base)
762789            buf [0 ] =  digits36 [n ];
763790            buf [1 ] =  '\0' ;
764791            return  1 ;
765-         }
766-         uint64_t  mask  =  (1  << shift ) -  1 ;
767-         size_t  len  =  (64  -  clz64 (n ) +  shift  -  1 ) / shift ;
768-         size_t  last  =  n  &  mask ;
769-         char  * end  =  buf  +  len ;
770-         n  >>= shift ;
771-         * end --  =  '\0' ;
772-         * end --  =  digits36 [last ];
773-         while  (n  >= base ) {
774-             size_t  quo  =  n  &  mask ;
792+         } else  {
793+             uint64_t  mask  =  (1  << shift ) -  1 ;
794+             size_t  len  =  (size_t )((64  -  clz64 (n ) +  shift  -  1 ) / shift );
795+             size_t  last  =  n  &  mask ;
796+             char  * end  =  buf  +  len ;
775797            n  >>= shift ;
776-             * end --  =  digits36 [quo ];
798+             * end --  =  '\0' ;
799+             * end --  =  digits36 [last ];
800+             while  (n  >= base ) {
801+                 size_t  quo  =  n  &  mask ;
802+                 n  >>= shift ;
803+                 * end --  =  digits36 [quo ];
804+             }
805+             * end  =  digits36 [n ];
806+             return  len ;
777807        }
778-         * end  =  digits36 [n ];
779-         return  len ;
808+     } else 
809+     if  (likely (n  <  0x100000000 )) {
810+         return  u32toa_radix (buf , (uint32_t )n , base );
780811    } else  {
781-         if  (likely (n  <  0x100000000 ))
782-             return  u32toa_radix (buf , n , base );
783812        size_t  last  =  n  % base ;
784-         n  /= base ;
785813        uint64_t  nbase  =  base ;
786814        size_t  len  =  2 ;
815+         char  * end ;
816+         n  /= base ;
787817        while  (n  >= nbase ) {
788818            nbase  *= base ;
789819            len ++ ;
790820        }
791-         char   * end  =  buf  +  len ;
821+         end  =  buf  +  len ;
792822        * end --  =  '\0' ;
793823        * end --  =  digits36 [last ];
794824        while  (n  >= base ) {
@@ -813,7 +843,7 @@ size_t i32toa_radix(char buf[minimum_length(34)], int32_t n, unsigned int base)
813843size_t  i64toa_radix (char  buf [minimum_length (66 )], int64_t  n , unsigned int   base )
814844{
815845    if  (likely (n  >= 0 ))
816-         return  u64toa_radix (buf , n , base );
846+         return  u64toa_radix (buf , ( uint64_t ) n , base );
817847
818848    buf [0 ] =  '-' ;
819849    return  1  +  u64toa_radix (buf  +  1 , - (uint64_t )n , base );
@@ -1008,7 +1038,14 @@ static inline void *med3(void *a, void *b, void *c, cmp_f cmp, void *opaque)
10081038/* pointer based version with local stack and insertion sort threshhold */ 
10091039void  rqsort (void  * base , size_t  nmemb , size_t  size , cmp_f  cmp , void  * opaque )
10101040{
1011-     struct  { uint8_t  * base ; size_t  count ; int  depth ; } stack [50 ], * sp  =  stack ;
1041+     struct  {
1042+         uint8_t  * base ;
1043+         size_t  count ;
1044+         int  depth ;
1045+ #if  SIZE_MAX  >  UINT_MAX 
1046+         int  pad ;
1047+ #endif 
1048+     } stack [50 ], * sp  =  stack ;
10121049    uint8_t  * ptr , * pi , * pj , * plt , * pgt , * top , * m ;
10131050    size_t  m4 , i , lt , gt , span , span2 ;
10141051    int  c , depth ;
@@ -1391,12 +1428,9 @@ int js_cond_timedwait(js_cond_t *cond, js_mutex_t *mutex, uint64_t timeout) {
13911428    if  (r  ==  0 )
13921429        return  0 ;
13931430
1394-     if  (r  ==  ETIMEDOUT )
1395-         return  -1 ;
1396- 
1397-     abort ();
1431+     if  (r  !=  ETIMEDOUT )
1432+         abort ();
13981433
1399-     /* Pacify some compilers. */ 
14001434    return  -1 ;
14011435}
14021436
0 commit comments