35
35
#include "cutils.h"
36
36
37
37
#undef NANOSEC
38
- #define NANOSEC ((uint64_t) 1e9)
38
+ #define NANOSEC 1000000000
39
39
40
40
#pragma GCC visibility push(default)
41
41
42
- void pstrcpy (char * buf , int buf_size , const char * str )
42
+ void pstrcpy (char * buf , size_t buf_size , const char * str )
43
43
{
44
- int c ;
45
44
char * q = buf ;
46
45
47
46
if (buf_size <= 0 )
48
47
return ;
49
48
50
49
for (;;) {
51
- c = * str ++ ;
50
+ char c = * str ++ ;
52
51
if (c == 0 || q >= buf + buf_size - 1 )
53
52
break ;
54
53
* q ++ = c ;
@@ -57,10 +56,9 @@ void pstrcpy(char *buf, int buf_size, const char *str)
57
56
}
58
57
59
58
/* 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 )
61
60
{
62
- int len ;
63
- len = strlen (buf );
61
+ size_t len = strlen (buf );
64
62
if (len < buf_size )
65
63
pstrcpy (buf + len , buf_size - len , s );
66
64
return buf ;
@@ -105,11 +103,6 @@ void dbuf_init2(DynBuf *s, void *opaque, DynBufReallocFunc *realloc_func)
105
103
s -> realloc_func = realloc_func ;
106
104
}
107
105
108
- void dbuf_init (DynBuf * s )
109
- {
110
- dbuf_init2 (s , NULL , NULL );
111
- }
112
-
113
106
/* return < 0 if error */
114
107
int dbuf_realloc (DynBuf * s , size_t new_size )
115
108
{
@@ -178,29 +171,59 @@ int dbuf_putstr(DynBuf *s, const char *str)
178
171
return dbuf_put (s , (const uint8_t * )str , strlen (str ));
179
172
}
180
173
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 )
183
175
{
184
- va_list ap ;
185
176
char buf [128 ];
177
+ va_list arg ;
178
+ size_t size , avail , ulen ;
186
179
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 );
187
192
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 ))
196
199
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 ;
202
200
}
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 ;
204
227
}
205
228
206
229
void dbuf_free (DynBuf * s )
@@ -589,6 +612,7 @@ size_t utf8_encode_buf16(char *dest, size_t dest_len, const uint16_t *src, size_
589
612
590
613
/* 2 <= base <= 36 */
591
614
char const digits36 [36 ] = "0123456789abcdefghijklmnopqrstuvwxyz" ;
615
+ char const digits36_upper [36 ] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
592
616
593
617
#define USE_SPECIAL_RADIX_10 1 // special case base 10 radix conversions
594
618
#define USE_SINGLE_CASE_FAST 1 // special case single digit numbers
@@ -600,7 +624,7 @@ char const digits36[36] = "0123456789abcdefghijklmnopqrstuvwxyz";
600
624
else \
601
625
buf = (buf << 8) | (c)
602
626
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 )
604
628
{
605
629
size_t len = 1 ;
606
630
uint64_t buf = 0 ;
@@ -615,7 +639,7 @@ size_t u7toa_shift(char dest[minimum_length(8)], uint32_t n)
615
639
return len ;
616
640
}
617
641
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 )
619
643
{
620
644
size_t i ;
621
645
dest += len ;
@@ -641,39 +665,41 @@ size_t u32toa(char buf[minimum_length(11)], uint32_t n)
641
665
#define TEN_POW_7 10000000
642
666
if (n >= TEN_POW_7 ) {
643
667
uint32_t quo = n / TEN_POW_7 ;
668
+ size_t len ;
644
669
n %= TEN_POW_7 ;
645
- size_t len = u7toa_shift (buf , quo );
670
+ len = u7toa_shift (buf , quo );
646
671
return u07toa_shift (buf , n , len );
647
672
}
648
673
return u7toa_shift (buf , n );
649
674
}
650
675
651
676
size_t u64toa (char buf [minimum_length (21 )], uint64_t n )
652
677
{
678
+ size_t len ;
679
+
653
680
if (likely (n < 0x100000000 ))
654
- return u32toa (buf , n );
681
+ return u32toa (buf , ( uint32_t ) n );
655
682
656
- size_t len ;
657
683
if (n >= TEN_POW_7 ) {
658
684
uint64_t n1 = n / TEN_POW_7 ;
659
685
n %= TEN_POW_7 ;
660
686
if (n1 >= TEN_POW_7 ) {
661
- uint32_t quo = n1 / TEN_POW_7 ;
687
+ uint32_t quo = ( uint32_t )( n1 / TEN_POW_7 ) ;
662
688
n1 %= TEN_POW_7 ;
663
689
len = u7toa_shift (buf , quo );
664
- len = u07toa_shift (buf , n1 , len );
690
+ len = u07toa_shift (buf , ( uint32_t ) n1 , len );
665
691
} else {
666
- len = u7toa_shift (buf , n1 );
692
+ len = u7toa_shift (buf , ( uint32_t ) n1 );
667
693
}
668
- return u07toa_shift (buf , n , len );
694
+ return u07toa_shift (buf , ( uint32_t ) n , len );
669
695
}
670
- return u7toa_shift (buf , n );
696
+ return u7toa_shift (buf , ( uint32_t ) n );
671
697
}
672
698
673
699
size_t i32toa (char buf [minimum_length (12 )], int32_t n )
674
700
{
675
701
if (likely (n >= 0 ))
676
- return u32toa (buf , n );
702
+ return u32toa (buf , ( uint32_t ) n );
677
703
678
704
buf [0 ] = '-' ;
679
705
return 1 + u32toa (buf + 1 , - (uint32_t )n );
@@ -682,7 +708,7 @@ size_t i32toa(char buf[minimum_length(12)], int32_t n)
682
708
size_t i64toa (char buf [minimum_length (22 )], int64_t n )
683
709
{
684
710
if (likely (n >= 0 ))
685
- return u64toa (buf , n );
711
+ return u64toa (buf , ( uint64_t ) n );
686
712
687
713
buf [0 ] = '-' ;
688
714
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)
713
739
shift = radix_shift [base & 63 ];
714
740
if (shift ) {
715
741
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 ) ;
717
743
size_t last = n & mask ;
718
744
char * end = buf + len ;
719
745
n >>= shift ;
@@ -729,13 +755,14 @@ size_t u32toa_radix(char buf[minimum_length(33)], uint32_t n, unsigned base)
729
755
} else {
730
756
size_t len = 2 ;
731
757
size_t last = n % base ;
732
- n /= base ;
733
758
uint32_t nbase = base ;
759
+ char * end ;
760
+ n /= base ;
734
761
while (n >= nbase ) {
735
762
nbase *= base ;
736
763
len ++ ;
737
764
}
738
- char * end = buf + len ;
765
+ end = buf + len ;
739
766
* end -- = '\0' ;
740
767
* end -- = digits36 [last ];
741
768
while (n >= base ) {
@@ -762,33 +789,36 @@ size_t u64toa_radix(char buf[minimum_length(65)], uint64_t n, unsigned base)
762
789
buf [0 ] = digits36 [n ];
763
790
buf [1 ] = '\0' ;
764
791
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 ;
775
797
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 ;
777
807
}
778
- * end = digits36 [n ];
779
- return len ;
808
+ } else
809
+ if (likely (n < 0x100000000 )) {
810
+ return u32toa_radix (buf , (uint32_t )n , base );
780
811
} else {
781
- if (likely (n < 0x100000000 ))
782
- return u32toa_radix (buf , n , base );
783
812
size_t last = n % base ;
784
- n /= base ;
785
813
uint64_t nbase = base ;
786
814
size_t len = 2 ;
815
+ char * end ;
816
+ n /= base ;
787
817
while (n >= nbase ) {
788
818
nbase *= base ;
789
819
len ++ ;
790
820
}
791
- char * end = buf + len ;
821
+ end = buf + len ;
792
822
* end -- = '\0' ;
793
823
* end -- = digits36 [last ];
794
824
while (n >= base ) {
@@ -813,7 +843,7 @@ size_t i32toa_radix(char buf[minimum_length(34)], int32_t n, unsigned int base)
813
843
size_t i64toa_radix (char buf [minimum_length (66 )], int64_t n , unsigned int base )
814
844
{
815
845
if (likely (n >= 0 ))
816
- return u64toa_radix (buf , n , base );
846
+ return u64toa_radix (buf , ( uint64_t ) n , base );
817
847
818
848
buf [0 ] = '-' ;
819
849
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)
1008
1038
/* pointer based version with local stack and insertion sort threshhold */
1009
1039
void rqsort (void * base , size_t nmemb , size_t size , cmp_f cmp , void * opaque )
1010
1040
{
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 ;
1012
1049
uint8_t * ptr , * pi , * pj , * plt , * pgt , * top , * m ;
1013
1050
size_t m4 , i , lt , gt , span , span2 ;
1014
1051
int c , depth ;
@@ -1391,12 +1428,9 @@ int js_cond_timedwait(js_cond_t *cond, js_mutex_t *mutex, uint64_t timeout) {
1391
1428
if (r == 0 )
1392
1429
return 0 ;
1393
1430
1394
- if (r == ETIMEDOUT )
1395
- return -1 ;
1396
-
1397
- abort ();
1431
+ if (r != ETIMEDOUT )
1432
+ abort ();
1398
1433
1399
- /* Pacify some compilers. */
1400
1434
return -1 ;
1401
1435
}
1402
1436
0 commit comments