@@ -1976,12 +1976,14 @@ LFORTRAN_API void _lfortran_strcpy(char** x, char *y, int8_t free_target)
1976
1976
* x = (char * ) malloc ((strlen (y ) + 1 ) * sizeof (char ));
1977
1977
_lfortran_string_init (strlen (y ) + 1 , * x );
1978
1978
// }
1979
- for (size_t i = 0 ; i < strlen (* x ); i ++ ) {
1980
- if (i < strlen (y )) {
1981
- x [0 ][i ] = y [i ];
1982
- } else {
1983
- x [0 ][i ] = ' ' ;
1984
- }
1979
+ size_t y_len = strlen (y );
1980
+ size_t x_len = strlen (* x );
1981
+ size_t i = 0 ;
1982
+ for (; i < x_len && i < y_len ; i ++ ) {
1983
+ x [0 ][i ] = y [i ];
1984
+ }
1985
+ for (; i < x_len ; i ++ ) {
1986
+ x [0 ][i ] = ' ' ;
1985
1987
}
1986
1988
}
1987
1989
@@ -2129,21 +2131,29 @@ LFORTRAN_API int32_t _lpython_bit_length8(int64_t num)
2129
2131
//repeat str for n time
2130
2132
LFORTRAN_API void _lfortran_strrepeat (char * * s , int32_t n , char * * dest )
2131
2133
{
2132
- int cntr = 0 ;
2133
2134
char trmn = '\0' ;
2134
2135
int s_len = strlen (* s );
2135
2136
int trmn_size = sizeof (trmn );
2136
2137
int f_len = s_len * n ;
2137
2138
if (f_len < 0 )
2138
2139
f_len = 0 ;
2139
2140
char * dest_char = (char * )malloc (f_len + trmn_size );
2140
- for (int i = 0 ; i < n ; i ++ ) {
2141
- for (int j = 0 ; j < s_len ; j ++ ) {
2142
- dest_char [cntr ] = (* s )[j ];
2143
- cntr ++ ;
2141
+
2142
+ if (s_len == 1 ) {
2143
+ memset (dest_char , * (* s ), n );
2144
+ } else {
2145
+ memcpy (dest_char , * s , s_len );
2146
+ int chars_copied = s_len ;
2147
+ int copy_length ;
2148
+ while (chars_copied < f_len ) {
2149
+ copy_length = (chars_copied <= f_len - chars_copied )
2150
+ ? chars_copied : f_len - chars_copied ;
2151
+ memcpy (dest_char + chars_copied , dest_char , copy_length );
2152
+ chars_copied += copy_length ;
2144
2153
}
2145
2154
}
2146
- dest_char [cntr ] = trmn ;
2155
+
2156
+ dest_char [f_len ] = trmn ;
2147
2157
* dest = & (dest_char [0 ]);
2148
2158
}
2149
2159
0 commit comments