librfn
An ad-hoc utility library
string.c
Go to the documentation of this file.
1 /*
2  * string.c
3  *
4  * Part of librfn (a general utility library from redfelineninja.org.uk)
5  *
6  * Copyright (C) 2012 Daniel Thompson <daniel@redfelineninja.org.uk>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published
10  * by the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #include <ctype.h>
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <string.h>
18 
19 #include "librfn.h"
20 
21 static char *xtest(char *p)
22 {
23  if (!p)
25 
26  return p;
27 }
28 
29 char *xstrdup(const char *s)
30 {
31  return xtest(strdup(s));
32 }
33 
34 char *strdup_join(const char *head, const char *tail)
35 {
36  return strdup_printf("%s%s", head, tail);
37 }
38 
39 char *xstrdup_join(const char *head, const char *tail)
40 {
41  return xtest(strdup_join(head, tail));
42 }
43 
44 char *strtolower(char *s)
45 {
46  // did *you* know that for the code to be (portably) correct you have
47  // to force the argument of tolower (and indeed of any of the ctype.h
48  // functions) into an unsigned type before conversion?
49  //
50  // I didn't until -Wall (and newlib) told me...
51  for (char *p = s; *p != '\0'; p++)
52  *p = tolower((unsigned char) *p);
53 
54  return s;
55 }
56 
57 char *strdup_tolower(const char *s)
58 {
59  char *t = strdup(s);
60  return (t ? strtolower(t) : NULL);
61 }
62 
63 char *xstrdup_tolower(const char *s)
64 {
65  return xtest(strdup_tolower(s));
66 }
67 
68 char *strtoupper(char *s)
69 {
70  // to understand the cast see strtolower...
71  for (char *p = s; *p != '\0'; p++)
72  *p = toupper((unsigned char) *p);
73 
74  return s;
75 }
76 
77 char *strdup_toupper(const char *s)
78 {
79  char *t = strdup(s);
80  return (t ? strtoupper(t) : NULL);
81 }
82 
83 char *xstrdup_toupper(const char *s)
84 {
85  return xtest(strdup_toupper(s));
86 }
87 
88 char *strdup_printf(const char *fmt, ...)
89 {
90  char *str;
91  va_list ap;
92 
93  va_start(ap, fmt);
94  str = strdup_vprintf(fmt, ap);
95  va_end(ap);
96 
97  return str;
98 }
99 
100 char *strdup_vprintf(const char *fmt, va_list ap)
101 {
102  char *str;
103  int len;
104  va_list nap;
105 
106  va_copy(nap, ap);
107  len = vsnprintf(NULL, 0, fmt, nap);
108  va_end(nap);
109 
110  str = malloc(len+1);
111  if (str)
112  vsprintf(str, fmt, ap);
113 
114  return str;
115 }
116 
117 char *xstrdup_printf(const char *fmt, ...)
118 {
119  char *str;
120  va_list ap;
121 
122  va_start(ap, fmt);
123  str = xstrdup_vprintf(fmt, ap);
124  va_end(ap);
125 
126  return str;
127 }
128 
129 char *xstrdup_vprintf(const char *fmt, va_list ap)
130 {
131  char *str;
132  int len;
133  va_list nap;
134 
135  va_copy(nap, ap);
136  len = vsnprintf(NULL, 0, fmt, nap);
137  va_end(nap);
138 
139  str = xmalloc(len+1);
140  if (str)
141  vsprintf(str, fmt, ap);
142 
143  return str;
144 }
char * xstrdup(const char *s)
Definition: string.c:29
char * strdup_toupper(const char *s)
Definition: string.c:77
char * xstrdup_tolower(const char *s)
Definition: string.c:63
char * xstrdup_join(const char *head, const char *tail)
Definition: string.c:39
char * strdup_join(const char *head, const char *tail)
Definition: string.c:34
void * xmalloc(size_t sz)
Definition: util.c:45
char * xstrdup_vprintf(const char *fmt, va_list ap)
Definition: string.c:129
char * xstrdup_toupper(const char *s)
Definition: string.c:83
char * strdup_vprintf(const char *fmt, va_list ap)
Definition: string.c:100
char * strtolower(char *s)
Definition: string.c:44
char * strtoupper(char *s)
Definition: string.c:68
void rf_internal_out_of_memory(void)
Definition: util.c:40
char * strdup_printf(const char *fmt,...)
Definition: string.c:88
const uint8_t fmt[]
Definition: wavheader.c:24
char * strdup_tolower(const char *s)
Definition: string.c:57
char * xstrdup_printf(const char *fmt,...)
Definition: string.c:117