backport to buster
[hcoop/debian/openafs.git] / src / opr / casestrcpy.c
CommitLineData
805e021f
CE
1/*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
4 *
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
8 */
9
10#include <afsconfig.h>
11#include <afs/param.h>
12
13#include <roken.h>
14
15#include <ctype.h>
16
17#include <afs/opr.h>
18
19/* Just like strncpy but shift-case in transit and forces null termination */
20char *
21lcstring(char *d, const char *s, int n)
22{
23 char *original_d = d;
24 char c;
25
26 while (n) {
27 c = *s++;
28 if (isupper(c))
29 c = tolower(c);
30 *d++ = c;
31 if (c == 0)
32 break; /* quit after transferring null */
33 if (--n == 0)
34 *(d - 1) = 0; /* make sure null terminated */
35 }
36 return original_d;
37}
38
39char *
40ucstring(char *d, const char *s, int n)
41{
42 char *original_d = d;
43 char c;
44
45 while (n) {
46 c = *s++;
47 if (islower(c))
48 c = toupper(c);
49 *d++ = c;
50 if (c == 0)
51 break;
52 if (--n == 0)
53 *(d - 1) = 0; /* make sure null terminated */
54 }
55 return original_d;
56}
57
58void
59stolower(char *s)
60{
61 while (*s) {
62 if (isupper(*s))
63 *s = tolower(*s);
64 s++;
65 }
66 return;
67}
68
69void
70stoupper(char *s)
71{
72 while (*s) {
73 if (islower(*s))
74 *s = toupper(*s);
75 s++;
76 }
77 return;
78}
79
80/* strcompose - concatenate strings passed to it.
81 * Input:
82 * buf: storage for the composed string. Any data in it will be lost.
83 * len: length of the buffer.
84 * ...: variable number of string arguments. The last argument must be
85 * (char *)NULL.
86 * Returns buf or NULL if the buffer was not sufficiently large.
87 */
88char *
89strcompose(char *buf, size_t len, ...)
90{
91 va_list ap;
92 size_t spaceleft = len - 1;
93 char *str;
94 size_t slen;
95
96 if (len <= 0)
97 return NULL;
98
99 *buf = '\0';
100 va_start(ap, len);
101 str = va_arg(ap, char *);
102 while (str) {
103 slen = strlen(str);
104 if (spaceleft < slen) /* not enough space left */
105 return NULL;
106
107 strcat(buf, str);
108 spaceleft -= slen;
109
110 str = va_arg(ap, char *);
111 }
112 va_end(ap);
113
114 return buf;
115}