Move string manipulation functions out of util
[openafs.git] / src / opr / casestrcpy.c
diff --git a/src/opr/casestrcpy.c b/src/opr/casestrcpy.c
new file mode 100644 (file)
index 0000000..7f80ded
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ *
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
+#include <afsconfig.h>
+#include <afs/param.h>
+
+#include <roken.h>
+
+#include <ctype.h>
+
+#include <afs/opr.h>
+
+/* Just like strncpy but shift-case in transit and forces null termination */
+char *
+lcstring(char *d, char *s, int n)
+{
+    char *original_d = d;
+    char c;
+
+    if ((s == 0) || (d == 0))
+       return 0;               /* just to be safe */
+    while (n) {
+       c = *s++;
+       if (isupper(c))
+           c = tolower(c);
+       *d++ = c;
+       if (c == 0)
+           break;              /* quit after transferring null */
+       if (--n == 0)
+           *(d - 1) = 0;       /* make sure null terminated */
+    }
+    return original_d;
+}
+
+char *
+ucstring(char *d, char *s, int n)
+{
+    char *original_d = d;
+    char c;
+
+    if ((s == 0) || (d == 0))
+       return 0;
+    while (n) {
+       c = *s++;
+       if (islower(c))
+           c = toupper(c);
+       *d++ = c;
+       if (c == 0)
+           break;
+       if (--n == 0)
+           *(d - 1) = 0;       /* make sure null terminated */
+    }
+    return original_d;
+}
+
+void
+stolower(char *s)
+{
+  while (*s) {
+        if (isupper(*s))
+            *s = tolower(*s);
+        s++;
+    }
+    return;
+}
+
+void
+stoupper(char *s)
+{
+  while (*s) {
+        if (islower(*s))
+            *s = toupper(*s);
+        s++;
+    }
+    return;
+}
+
+/* strcompose - concatenate strings passed to it.
+ * Input:
+ *   buf: storage for the composed string. Any data in it will be lost.
+ *   len: length of the buffer.
+ *   ...: variable number of string arguments. The last argument must be
+ *        NULL.
+ * Returns buf or NULL if the buffer was not sufficiently large.
+ */
+char *
+strcompose(char *buf, size_t len, ...)
+{
+    va_list ap;
+    size_t spaceleft = len - 1;
+    char *str;
+    size_t slen;
+
+    if (buf == NULL || len <= 0)
+       return NULL;
+
+    *buf = '\0';
+    va_start(ap, len);
+    str = va_arg(ap, char *);
+    while (str) {
+       slen = strlen(str);
+       if (spaceleft < slen)   /* not enough space left */
+           return NULL;
+
+       strcat(buf, str);
+       spaceleft -= slen;
+
+       str = va_arg(ap, char *);
+    }
+    va_end(ap);
+
+    return buf;
+}