2 * \file rpmio/rpmstring.c
10 #include <rpm/rpmstring.h>
14 int rstrcasecmp(const char * s1, const char * s2)
25 c1 = rtolower (*p1++);
26 c2 = rtolower (*p2++);
32 return (int)(c1 - c2);
35 int rstrncasecmp(const char *s1, const char *s2, size_t n)
41 if (p1 == p2 || n == 0)
46 c1 = rtolower (*p1++);
47 c2 = rtolower (*p2++);
48 if (c1 == '\0' || c1 != c2)
52 return (int)(c1 - c2);
56 * Simple and stupid asprintf() clone.
57 * FIXME: write to work with non-C99 vsnprintf or check for one in configure.
59 int rasprintf(char **strp, const char *fmt, ...)
69 n = vsnprintf(NULL, 0, fmt, ap);
76 n = vsnprintf(p, nb, fmt, ap);
84 * Concatenate two strings with dynamically (re)allocated
85 * memory what prevents static buffer overflows by design.
86 * *dest is reallocated to the size of strings to concatenate.
89 * 1) char *buf = rstrcat(NULL,"string"); is the same like rstrcat(&buf,"string");
90 * 2) rstrcat(&buf,NULL) returns buf
91 * 3) rstrcat(NULL,NULL) returns NULL
92 * 4) *dest and src can overlap
94 char *rstrcat(char **dest, const char *src)
97 return dest != NULL ? *dest : NULL;
100 if ( dest == NULL ) {
105 size_t dest_size = *dest != NULL ? strlen(*dest) : 0;
106 size_t src_size = strlen(src);
108 *dest = xrealloc(*dest, dest_size+src_size+1); /* include '\0' */
109 memmove(&(*dest)[dest_size], src, src_size+1);
116 * Concatenate strings with dynamically (re)allocated
117 * memory what prevents static buffer overflows by design.
118 * *dest is reallocated to the size of strings to concatenate.
119 * List of strings has to be NULL terminated.
122 * 1) char *buf = rstrscat(NULL,"string",NULL); is the same like rstrscat(&buf,"string",NULL);
123 * 2) rstrscat(&buf,NULL) returns buf
124 * 3) rstrscat(NULL,NULL) returns NULL
125 * 4) *dest and argument strings can overlap
127 char *rstrscat(char **dest, const char *arg, ...)
130 size_t arg_size, dst_size;
134 dst = dest ? *dest : NULL;
141 for (arg_size=0, s=arg; s; s = va_arg(ap, const char *))
142 arg_size += strlen(s);
145 dst_size = dst ? strlen(dst) : 0;
146 dst = xrealloc(dst, dst_size+arg_size+1); /* include '\0' */
150 for (s = arg; s; s = va_arg(ap, const char *)) {
151 size_t size = strlen(s);
166 * Adapted from OpenBSD, strlcpy() originally developed by
167 * Todd C. Miller <Todd.Miller@courtesan.com>
169 size_t rstrlcpy(char *dest, const char *src, size_t n)
175 /* Copy as many bytes as will fit */
178 if ((*d++ = *s++) == '\0')
183 /* Not enough room in dst, add NUL and traverse rest of src */
186 *d = '\0'; /* NUL-terminate dst */
191 return s - src - 1; /* count does not include NUL */