Index: libcfa/src/collections/string.cfa
===================================================================
--- libcfa/src/collections/string.cfa	(revision a3f820b8df8e324ea23e2462c94f1aa1910acdf2)
+++ libcfa/src/collections/string.cfa	(revision 479fbe377d83fb9941a02a57b51b980995a449d1)
@@ -10,6 +10,6 @@
 // Created On       : Fri Sep 03 11:00:00 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jan  4 11:27:37 2024
-// Update Count     : 233
+// Last Modified On : Sun Jan 14 12:03:47 2024
+// Update Count     : 240
 //
 
@@ -29,10 +29,4 @@
 // string RAII
 
-
-void ?{}( string & s ) {
-    (s.inner) { malloc() };
-    ?{}( *s.inner );
-}
-
 // private (not in header)
 static void ?{}( string & s, string_res & src, size_t start, size_t end ) {
@@ -41,4 +35,9 @@
 }
 
+void ?{}( string & s ) {
+    (s.inner) { malloc() };
+    ?{}( *s.inner );
+}
+
 void ?{}( string & s, const string & c ) {
     (s.inner) { malloc() };
@@ -50,12 +49,18 @@
 }
 
-void ?{}( string & s, const char * val ) {
-    (s.inner) { malloc() };
-    ?{}( *s.inner, val );
-}
-
-void ?{}( string & s, const char * buffer, size_t bsize) {
-    (s.inner) { malloc() };
-    ?{}( *s.inner, buffer, bsize );
+void ?{}( string & s, const char c ) {
+    (s.inner) { malloc() };
+	char cs[2] = { c, '\0' };
+    ?{}( *s.inner, cs );
+}
+
+void ?{}( string & s, const char * c ) {
+    (s.inner) { malloc() };
+    ?{}( *s.inner, c );
+}
+
+void ?{}( string & s, const char * c, size_t size) {
+    (s.inner) { malloc() };
+    ?{}( *s.inner, c, size );
 }
 
@@ -237,13 +242,16 @@
 }
 
-string ?*?(char c, size_t size) {
-    string ret = "";
-    for ((size_t)size) ret += c;
-    return ret;
-}
-
-string ?*?(const char *s, size_t factor) {
-    string ss = s;
-    return ss * factor;
+void ?*=?(string & s, size_t factor) {
+    s = s * factor;
+}
+
+string ?*?(char c, size_t factor) {
+    string ret = c;
+    return ret * factor;
+}
+
+string ?*?(const char * s, size_t factor) {
+    string ret = s;
+    return ret * factor;
 }
 
Index: libcfa/src/collections/string.hfa
===================================================================
--- libcfa/src/collections/string.hfa	(revision a3f820b8df8e324ea23e2462c94f1aa1910acdf2)
+++ libcfa/src/collections/string.hfa	(revision 479fbe377d83fb9941a02a57b51b980995a449d1)
@@ -10,6 +10,6 @@
 // Created On       : Fri Sep 03 11:00:00 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jan  4 11:27:35 2024
-// Update Count     : 75
+// Last Modified On : Sun Jan 14 12:03:46 2024
+// Update Count     : 81
 //
 
@@ -33,12 +33,14 @@
 // RAII, assignment
 void ?{}(string & s); // empty string
-void ?{}(string & s, const char * initial); // copy from string literal (NULL-terminated)
-void ?{}(string & s, const char * buffer, size_t bsize); // copy specific length from buffer
-
 void ?{}(string & s, const string & s2);
 void ?{}(string & s, string & s2);
 
+void ?{}(string & s, const char);
+void ?{}(string & s, const char * c); // copy from string literal (NULL-terminated)
+void ?{}(string & s, const char * c, size_t size); // copy specific length from buffer
+
 void ?=?(string & s, const char * c); // copy assignment from literal
 static inline string & strcpy(string & s, const char * c) { s = c; return s; }
+static inline string & strncpy(string & s, const char * c, size_t n) { s = c; return s; }
 void ?=?(string & s, const string & c);
 static inline string & strcpy(string & s, const string c) { s = c; return s; }
@@ -112,6 +114,7 @@
 // Repetition
 string ?*?(const string & s, size_t factor);
-string ?*?(char c, size_t size);
-string ?*?(const char *s, size_t size);
+void ?*=?(string & s, size_t factor);
+string ?*?(char c, size_t factor);
+string ?*?(const char *s, size_t factor);
 
 // Character access
