Include device name in call to CreateIC.
[wine/testsucceed.git] / tools / specmaker / misc.c
blob62231310ebae5fd12304697613b37ca6da5c84da
1 /*
2 * Misc functions
4 * Copyright 2000 Jon Griffiths
5 */
6 #include "specmaker.h"
9 /*******************************************************************
10 * str_create
12 * Create a single string from many substrings
14 char *str_create(size_t num_str, ...)
16 va_list args;
17 size_t len = 1, i = 0;
18 char *tmp, *t;
20 va_start (args, num_str);
21 for (i = 0; i < num_str; i++)
22 if ((t = va_arg(args, char *)))
23 len += strlen (t);
24 va_end (args);
26 if (!(tmp = (char *) malloc (len)))
27 fatal ("Out of memory");
29 tmp[0] = '\0';
31 va_start (args, num_str);
32 for (i = 0; i < num_str; i++)
33 if ((t = va_arg(args, char *)))
34 strcat (tmp, t);
35 va_end (args);
36 return tmp;
40 /*******************************************************************
41 * str_create_num
43 * Create a single string from many substrings, terminating in a number
45 char *str_create_num(size_t num_str, int num, ...)
47 va_list args;
48 size_t len = 8, i = 0;
49 char *tmp, *t;
51 va_start (args, num);
52 for (i = 0; i < num_str; i++)
53 if ((t = va_arg(args, char *)))
54 len += strlen (t);
55 va_end (args);
57 if (!(tmp = (char *) malloc (len)))
58 fatal ("Out of memory");
60 tmp[0] = '\0';
62 va_start (args, num);
63 for (i = 0; i < num_str; i++)
64 if ((t = va_arg(args, char *)))
65 strcat (tmp, t);
66 va_end (args);
67 sprintf (tmp + len - 8, "%d", num);
68 return tmp;
72 /*******************************************************************
73 * str_substring
75 * Create a new substring from a string
77 char *str_substring(const char *start, const char *end)
79 char *newstr;
81 assert (start && end && end > start);
83 if (!(newstr = (char *) malloc (end - start + 1)))
84 fatal ("Out of memory");
86 memcpy (newstr, start, end - start);
87 newstr [end - start] = '\0';
89 return newstr;
93 /*******************************************************************
94 * str_replace
96 * Swap two strings in another string, in place
97 * Modified PD code from 'snippets'
99 char *str_replace (char *str, const char *oldstr, const char *newstr)
101 int oldlen, newlen;
102 char *p, *q;
104 if (!(p = strstr(str, oldstr)))
105 return p;
106 oldlen = strlen (oldstr);
107 newlen = strlen (newstr);
108 memmove (q = p + newlen, p + oldlen, strlen (p + oldlen) + 1);
109 memcpy (p, newstr, newlen);
110 return q;
114 /*******************************************************************
115 * str_match
117 * Locate one string in another, ignoring spaces
119 const char *str_match (const char *str, const char *match, int *found)
121 assert(str && match && found);
123 while (*str == ' ') str++;
124 if (!strncmp (str, match, strlen (match)))
126 *found = 1;
127 str += strlen (match);
128 while (*str == ' ') str++;
130 else
131 *found = 0;
132 return str;
136 /*******************************************************************
137 * str_find_set
139 * Locate the first occurence of a set of characters in a string
141 const char *str_find_set (const char *str, const char *findset)
143 assert(str && findset);
145 while (*str)
147 const char *p = findset;
148 while (*p)
149 if (*p++ == *str)
150 return str;
151 str++;
153 return NULL;
157 /*******************************************************************
158 * str_toupper
160 * Uppercase a string
162 char *str_toupper (char *str)
164 char *save = str;
165 while (*str)
167 *str = toupper (*str);
168 str++;
170 return save;
174 /*******************************************************************
175 * open_file
177 * Open a file returning only on success
179 FILE *open_file (const char *name, const char *ext, const char *mode)
181 char fname[128];
182 FILE *fp;
184 if (((unsigned)snprintf (fname, sizeof (fname), "%s%s%s",
185 *mode == 'w' ? "./" : "", name, ext) > sizeof (fname)))
186 fatal ("File name too long");
188 if (VERBOSE)
189 printf ("Open file %s\n", fname);
191 fp = fopen (fname, mode);
192 if (!fp)
193 fatal ("Cant open file");
194 return fp;
198 /*******************************************************************
199 * fatal
201 * Fatal error handling
203 void fatal (const char *message)
205 if (errno)
206 perror (message);
207 else
208 puts (message);
209 do_usage ();