ucx/string.c

changeset 47
22fb97e9f58a
parent 39
bf8ab7bb74ff
child 67
27e67e725d35
equal deleted inserted replaced
46:48ca036d7d9c 47:22fb97e9f58a
56 56
57 sstr_t sstrncat (size_t n, sstr_t s, sstr_t c1, ...) { 57 sstr_t sstrncat (size_t n, sstr_t s, sstr_t c1, ...) {
58 va_list ap; 58 va_list ap;
59 va_start(ap, c1); 59 va_start(ap, c1);
60 s.ptr[0] = 0; 60 s.ptr[0] = 0;
61 61
62 s.ptr = strncat (s.ptr, c1.ptr, s.length); 62 size_t len = s.length;
63 size_t cplen = c1.length > len ? len : c1.length;
64 char *ptr = s.ptr;
65
66 memcpy(ptr, c1.ptr, cplen);
67 len -= cplen;
68 ptr += cplen;
63 for (int i=0;i<n-1;i++) { 69 for (int i=0;i<n-1;i++) {
64 sstr_t str = va_arg (ap, sstr_t); 70 sstr_t str = va_arg (ap, sstr_t);
65 s.ptr = strncat (s.ptr, str.ptr, s.length); 71 cplen = str.length > len ? len : str.length;
72 if(cplen <= 0) {
73 va_end(ap);
74 return s;
75 }
76 memcpy(ptr, str.ptr, cplen);
77 len -= cplen;
78 ptr += cplen;
66 } 79 }
67 va_end(ap); 80 va_end(ap);
68 81
69 return s; 82 return s;
70 } 83 }

mercurial