| /* | 
 |  *  Misc functions | 
 |  * | 
 |  *  Copyright 2000 Jon Griffiths | 
 |  * | 
 |  * This library is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU Lesser General Public | 
 |  * License as published by the Free Software Foundation; either | 
 |  * version 2.1 of the License, or (at your option) any later version. | 
 |  * | 
 |  * This library is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 |  * Lesser General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU Lesser General Public | 
 |  * License along with this library; if not, write to the Free Software | 
 |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
 |  */ | 
 |  | 
 | #include "config.h" | 
 | #include "wine/port.h" | 
 |  | 
 | #include "winedump.h" | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         str_create | 
 |  * | 
 |  * Create a single string from many substrings | 
 |  */ | 
 | char *str_create(size_t num_str, ...) | 
 | { | 
 |   va_list args; | 
 |   size_t len = 1, i = 0; | 
 |   char *tmp, *t; | 
 |  | 
 |   va_start (args, num_str); | 
 |   for (i = 0; i < num_str; i++) | 
 |     if ((t = va_arg(args, char *))) | 
 |       len += strlen (t); | 
 |   va_end (args); | 
 |  | 
 |   if (!(tmp = malloc (len))) | 
 |     fatal ("Out of memory"); | 
 |  | 
 |   tmp[0] = '\0'; | 
 |  | 
 |   va_start (args, num_str); | 
 |   for (i = 0; i < num_str; i++) | 
 |     if ((t = va_arg(args, char *))) | 
 |       strcat (tmp, t); | 
 |   va_end (args); | 
 |   return tmp; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         str_create_num | 
 |  * | 
 |  * Create a single string from many substrings, terminating in a number | 
 |  */ | 
 | char *str_create_num(size_t num_str, int num, ...) | 
 | { | 
 |   va_list args; | 
 |   size_t len = 8, i = 0; | 
 |   char *tmp, *t; | 
 |  | 
 |   va_start (args, num); | 
 |   for (i = 0; i < num_str; i++) | 
 |     if ((t = va_arg(args, char *))) | 
 |       len += strlen (t); | 
 |   va_end (args); | 
 |  | 
 |   if (!(tmp = malloc (len))) | 
 |     fatal ("Out of memory"); | 
 |  | 
 |   tmp[0] = '\0'; | 
 |  | 
 |   va_start (args, num); | 
 |   for (i = 0; i < num_str; i++) | 
 |     if ((t = va_arg(args, char *))) | 
 |       strcat (tmp, t); | 
 |   va_end (args); | 
 |   sprintf (tmp + len - 8, "%d", num); | 
 |   return tmp; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         str_substring | 
 |  * | 
 |  * Create a new substring from a string | 
 |  */ | 
 | char *str_substring(const char *start, const char *end) | 
 | { | 
 |   char *newstr; | 
 |  | 
 |   assert (start && end && end > start); | 
 |  | 
 |   if (!(newstr = malloc (end - start + 1))) | 
 |     fatal ("Out of memory"); | 
 |  | 
 |   memcpy (newstr, start, end - start); | 
 |   newstr [end - start] = '\0'; | 
 |  | 
 |   return newstr; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         str_replace | 
 |  * | 
 |  * Swap two strings in another string, in place | 
 |  * Modified PD code from 'snippets' | 
 |  */ | 
 | char *str_replace (char *str, const char *oldstr, const char *newstr) | 
 | { | 
 |   int oldlen, newlen; | 
 |   char *p, *q; | 
 |  | 
 |   if (!(p = strstr(str, oldstr))) | 
 |     return p; | 
 |   oldlen = strlen (oldstr); | 
 |   newlen = strlen (newstr); | 
 |   memmove (q = p + newlen, p + oldlen, strlen (p + oldlen) + 1); | 
 |   memcpy (p, newstr, newlen); | 
 |   return q; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         str_match | 
 |  * | 
 |  * Locate one string in another, ignoring spaces | 
 |  */ | 
 | const char *str_match (const char *str, const char *match, int *found) | 
 | { | 
 |   assert(str && match && found); | 
 |  | 
 |   while (*str == ' ') str++; | 
 |   if (!strncmp (str, match, strlen (match))) | 
 |   { | 
 |     *found = 1; | 
 |     str += strlen (match); | 
 |     while (*str == ' ') str++; | 
 |   } | 
 |   else | 
 |     *found = 0; | 
 |   return str; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         str_find_set | 
 |  * | 
 |  * Locate the first occurrence of a set of characters in a string | 
 |  */ | 
 | const char *str_find_set (const char *str, const char *findset) | 
 | { | 
 |   assert(str && findset); | 
 |  | 
 |   while (*str) | 
 |   { | 
 |     const char *p = findset; | 
 |     while (*p) | 
 |       if (*p++ == *str) | 
 |         return str; | 
 |     str++; | 
 |   } | 
 |   return NULL; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         str_toupper | 
 |  * | 
 |  * Uppercase a string | 
 |  */ | 
 | char *str_toupper (char *str) | 
 | { | 
 |   char *save = str; | 
 |   while (*str) | 
 |   { | 
 |     *str = toupper (*str); | 
 |     str++; | 
 |   } | 
 |   return save; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         open_file | 
 |  * | 
 |  * Open a file returning only on success | 
 |  */ | 
 | FILE *open_file (const char *name, const char *ext, const char *mode) | 
 | { | 
 |   char  fname[128]; | 
 |   FILE *fp; | 
 |  | 
 |   if (((unsigned)snprintf (fname, sizeof (fname), "%s%s%s", | 
 |                  *mode == 'w' ? "./" : "", name, ext) > sizeof (fname))) | 
 |     fatal ("File name too long"); | 
 |  | 
 |   if (VERBOSE) | 
 |     printf ("Open file %s\n", fname); | 
 |  | 
 |   fp = fopen (fname, mode); | 
 |   if (!fp) | 
 |     fatal ("Can't open file"); | 
 |   return fp; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************* | 
 |  *         fatal | 
 |  * | 
 |  * Fatal error handling | 
 |  */ | 
 | void  fatal (const char *message) | 
 | { | 
 |   if (errno) | 
 |     perror (message); | 
 |   else | 
 |     puts (message); | 
 |   exit(1); | 
 | } |