1 /*
2 * Misc functions
3 *
4 * Copyright 2000 Jon Griffiths
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21 #include "config.h"
22 #include "wine/port.h"
23
24 #include "winedump.h"
25
26
27 /*******************************************************************
28 * str_create
29 *
30 * Create a single string from many substrings
31 */
32 char *str_create(size_t num_str, ...)
33 {
34 va_list args;
35 size_t len = 1, i = 0;
36 char *tmp, *t;
37
38 va_start (args, num_str);
39 for (i = 0; i < num_str; i++)
40 if ((t = va_arg(args, char *)))
41 len += strlen (t);
42 va_end (args);
43
44 if (!(tmp = malloc (len)))
45 fatal ("Out of memory");
46
47 tmp[0] = '\0';
48
49 va_start (args, num_str);
50 for (i = 0; i < num_str; i++)
51 if ((t = va_arg(args, char *)))
52 strcat (tmp, t);
53 va_end (args);
54 return tmp;
55 }
56
57
58 /*******************************************************************
59 * str_create_num
60 *
61 * Create a single string from many substrings, terminating in a number
62 */
63 char *str_create_num(size_t num_str, int num, ...)
64 {
65 va_list args;
66 size_t len = 8, i = 0;
67 char *tmp, *t;
68
69 va_start (args, num);
70 for (i = 0; i < num_str; i++)
71 if ((t = va_arg(args, char *)))
72 len += strlen (t);
73 va_end (args);
74
75 if (!(tmp = malloc (len)))
76 fatal ("Out of memory");
77
78 tmp[0] = '\0';
79
80 va_start (args, num);
81 for (i = 0; i < num_str; i++)
82 if ((t = va_arg(args, char *)))
83 strcat (tmp, t);
84 va_end (args);
85 sprintf (tmp + len - 8, "%d", num);
86 return tmp;
87 }
88
89
90 /*******************************************************************
91 * str_substring
92 *
93 * Create a new substring from a string
94 */
95 char *str_substring(const char *start, const char *end)
96 {
97 char *newstr;
98
99 assert (start && end && end > start);
100
101 if (!(newstr = malloc (end - start + 1)))
102 fatal ("Out of memory");
103
104 memcpy (newstr, start, end - start);
105 newstr [end - start] = '\0';
106
107 return newstr;
108 }
109
110
111 /*******************************************************************
112 * str_replace
113 *
114 * Swap two strings in another string, in place
115 * Modified PD code from 'snippets'
116 */
117 char *str_replace (char *str, const char *oldstr, const char *newstr)
118 {
119 int oldlen, newlen;
120 char *p, *q;
121
122 if (!(p = strstr(str, oldstr)))
123 return p;
124 oldlen = strlen (oldstr);
125 newlen = strlen (newstr);
126 memmove (q = p + newlen, p + oldlen, strlen (p + oldlen) + 1);
127 memcpy (p, newstr, newlen);
128 return q;
129 }
130
131
132 /*******************************************************************
133 * str_match
134 *
135 * Locate one string in another, ignoring spaces
136 */
137 const char *str_match (const char *str, const char *match, int *found)
138 {
139 assert(str && match && found);
140
141 while (*str == ' ') str++;
142 if (!strncmp (str, match, strlen (match)))
143 {
144 *found = 1;
145 str += strlen (match);
146 while (*str == ' ') str++;
147 }
148 else
149 *found = 0;
150 return str;
151 }
152
153
154 /*******************************************************************
155 * str_find_set
156 *
157 * Locate the first occurrence of a set of characters in a string
158 */
159 const char *str_find_set (const char *str, const char *findset)
160 {
161 assert(str && findset);
162
163 while (*str)
164 {
165 const char *p = findset;
166 while (*p)
167 if (*p++ == *str)
168 return str;
169 str++;
170 }
171 return NULL;
172 }
173
174
175 /*******************************************************************
176 * str_toupper
177 *
178 * Uppercase a string
179 */
180 char *str_toupper (char *str)
181 {
182 char *save = str;
183 while (*str)
184 {
185 *str = toupper (*str);
186 str++;
187 }
188 return save;
189 }
190
191
192 /*******************************************************************
193 * open_file
194 *
195 * Open a file returning only on success
196 */
197 FILE *open_file (const char *name, const char *ext, const char *mode)
198 {
199 char fname[128];
200 FILE *fp;
201
202 if (((unsigned)snprintf (fname, sizeof (fname), "%s%s%s",
203 *mode == 'w' ? "./" : "", name, ext) > sizeof (fname)))
204 fatal ("File name too long");
205
206 if (VERBOSE)
207 printf ("Open file %s\n", fname);
208
209 fp = fopen (fname, mode);
210 if (!fp)
211 fatal ("Can't open file");
212 return fp;
213 }
214
215
216 /*******************************************************************
217 * fatal
218 *
219 * Fatal error handling
220 */
221 void fatal (const char *message)
222 {
223 if (errno)
224 perror (message);
225 else
226 puts (message);
227 exit(1);
228 }
229
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.