@@ -711,42 +711,24 @@ R_API char *r_str_trunc_ellipsis(const char *str, int len) {
711
711
return buf ;
712
712
}
713
713
714
- // Returns a new heap-allocated string that matches the format-string
715
- // specification.
716
714
R_API char * r_str_newf (const char * fmt , ...) {
717
- int ret , ret2 ;
718
- char * tmp , * p , string [1024 ];
719
715
va_list ap , ap2 ;
716
+
720
717
va_start (ap , fmt );
721
- va_start (ap2 , fmt );
722
718
if (!strchr (fmt , '%' )) {
723
- va_end (ap2 );
724
719
va_end (ap );
725
720
return strdup (fmt );
726
721
}
727
- ret = vsnprintf (string , sizeof (string ) - 1 , fmt , ap );
728
- if (ret < 1 || ret >= sizeof (string )) {
729
- p = calloc (1 , ret + 3 );
730
- if (!p ) {
731
- va_end (ap2 );
732
- va_end (ap );
733
- return NULL ;
734
- }
735
- ret2 = vsnprintf (p , ret + 1 , fmt , ap2 );
736
- if (ret2 < 1 || ret2 > ret + 1 ) {
737
- free (p );
738
- va_end (ap2 );
739
- va_end (ap );
740
- return NULL ;
741
- }
742
- tmp = r_str_new (p );
743
- free (p );
744
- } else {
745
- tmp = r_str_new (string );
722
+ va_copy (ap2 , ap );
723
+ int ret = vsnprintf (NULL , 0 , fmt , ap2 );
724
+ ret ++ ;
725
+ char * p = calloc (1 , ret );
726
+ if (p ) {
727
+ (void )vsnprintf (p , ret , fmt , ap );
746
728
}
747
729
va_end (ap2 );
748
730
va_end (ap );
749
- return tmp ;
731
+ return p ;
750
732
}
751
733
752
734
// Secure string copy with null terminator (like strlcpy or strscpy but ours
@@ -908,30 +890,30 @@ R_API char *r_str_append(char *ptr, const char *string) {
908
890
}
909
891
910
892
R_API char * r_str_appendf (char * ptr , const char * fmt , ...) {
911
- int ret ;
912
- char string [4096 ];
913
- va_list ap ;
893
+ va_list ap , ap2 ;
894
+
914
895
va_start (ap , fmt );
915
- ret = vsnprintf (string , sizeof (string ), fmt , ap );
916
- if (ret >= sizeof (string )) {
917
- char * p = malloc (ret + 2 );
918
- if (!p ) {
919
- va_end (ap );
920
- return NULL ;
921
- }
922
- vsnprintf (p , ret + 1 , fmt , ap );
896
+ if (!strchr (fmt , '%' )) {
897
+ va_end (ap );
898
+ return r_str_append (ptr , fmt );
899
+ }
900
+ va_copy (ap2 , ap );
901
+ int ret = vsnprintf (NULL , 0 , fmt , ap2 );
902
+ ret ++ ;
903
+ char * p = calloc (1 , ret );
904
+ if (p ) {
905
+ (void )vsnprintf (p , ret , fmt , ap );
923
906
ptr = r_str_append (ptr , p );
924
907
free (p );
925
- } else {
926
- ptr = r_str_append (ptr , string );
927
908
}
909
+ va_end (ap2 );
928
910
va_end (ap );
929
911
return ptr ;
930
912
}
931
913
932
914
R_API char * r_str_appendch (char * x , char y ) {
933
915
char b [2 ] = { y , 0 };
934
- return r_str_append (x ,b );
916
+ return r_str_append (x , b );
935
917
}
936
918
937
919
R_API char * r_str_replace (char * str , const char * key , const char * val , int g ) {
0 commit comments