4 * Copyright 2000 Jon Griffiths
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.
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.
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
22 #include "wine/port.h"
27 /*******************************************************************
30 * Create a single string from many substrings
32 char *str_create(size_t num_str
, ...)
35 size_t len
= 1, i
= 0;
38 va_start (args
, num_str
);
39 for (i
= 0; i
< num_str
; i
++)
40 if ((t
= va_arg(args
, char *)))
44 if (!(tmp
= malloc (len
)))
45 fatal ("Out of memory");
49 va_start (args
, num_str
);
50 for (i
= 0; i
< num_str
; i
++)
51 if ((t
= va_arg(args
, char *)))
58 /*******************************************************************
61 * Create a single string from many substrings, terminating in a number
63 char *str_create_num(size_t num_str
, int num
, ...)
66 size_t len
= 8, i
= 0;
70 for (i
= 0; i
< num_str
; i
++)
71 if ((t
= va_arg(args
, char *)))
75 if (!(tmp
= malloc (len
)))
76 fatal ("Out of memory");
81 for (i
= 0; i
< num_str
; i
++)
82 if ((t
= va_arg(args
, char *)))
85 sprintf (tmp
+ len
- 8, "%d", num
);
90 /*******************************************************************
93 * Create a new substring from a string
95 char *str_substring(const char *start
, const char *end
)
99 assert (start
&& end
&& end
> start
);
101 if (!(newstr
= malloc (end
- start
+ 1)))
102 fatal ("Out of memory");
104 memcpy (newstr
, start
, end
- start
);
105 newstr
[end
- start
] = '\0';
111 /*******************************************************************
114 * Swap two strings in another string, in place
115 * Modified PD code from 'snippets'
117 char *str_replace (char *str
, const char *oldstr
, const char *newstr
)
122 if (!(p
= strstr(str
, oldstr
)))
124 oldlen
= strlen (oldstr
);
125 newlen
= strlen (newstr
);
126 memmove (q
= p
+ newlen
, p
+ oldlen
, strlen (p
+ oldlen
) + 1);
127 memcpy (p
, newstr
, newlen
);
132 /*******************************************************************
135 * Locate one string in another, ignoring spaces
137 const char *str_match (const char *str
, const char *match
, int *found
)
139 assert(str
&& match
&& found
);
141 while (*str
== ' ') str
++;
142 if (!strncmp (str
, match
, strlen (match
)))
145 str
+= strlen (match
);
146 while (*str
== ' ') str
++;
154 /*******************************************************************
157 * Locate the first occurrence of a set of characters in a string
159 const char *str_find_set (const char *str
, const char *findset
)
161 assert(str
&& findset
);
165 const char *p
= findset
;
175 /*******************************************************************
180 char *str_toupper (char *str
)
185 *str
= toupper (*str
);
192 /*******************************************************************
195 * Open a file returning only on success
197 FILE *open_file (const char *name
, const char *ext
, const char *mode
)
202 if (((unsigned)snprintf (fname
, sizeof (fname
), "%s%s%s",
203 *mode
== 'w' ? "./" : "", name
, ext
) > sizeof (fname
)))
204 fatal ("File name too long");
207 printf ("Open file %s\n", fname
);
209 fp
= fopen (fname
, mode
);
211 fatal ("Can't open file");
216 /*******************************************************************
219 * Fatal error handling
221 void fatal (const char *message
)