Added an unknown VxD error code.
[wine] / tools / specmaker / misc.c
1 /*
2  *  Misc functions
3  *
4  *  Copyright 2000 Jon Griffiths
5  */
6 #include "specmaker.h"
7
8
9 /*******************************************************************
10  *         str_create
11  *
12  * Create a single string from many substrings
13  */
14 char *str_create(size_t num_str, ...)
15 {
16   va_list args;
17   size_t len = 1, i = 0;
18   char *tmp, *t;
19
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);
25
26   if (!(tmp = (char *) malloc (len)))
27     fatal ("Out of memory");
28
29   tmp[0] = '\0';
30
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;
37 }
38
39
40 /*******************************************************************
41  *         str_create_num
42  *
43  * Create a single string from many substrings, terminating in a number
44  */
45 char *str_create_num(size_t num_str, int num, ...)
46 {
47   va_list args;
48   size_t len = 8, i = 0;
49   char *tmp, *t;
50
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);
56
57   if (!(tmp = (char *) malloc (len)))
58     fatal ("Out of memory");
59
60   tmp[0] = '\0';
61
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;
69 }
70
71
72 /*******************************************************************
73  *         str_substring
74  *
75  * Create a new substring from a string
76  */
77 char *str_substring(const char *start, const char *end)
78 {
79   char *newstr;
80
81   assert (start && end && end > start);
82
83   if (!(newstr = (char *) malloc (end - start + 1)))
84     fatal ("Out of memory");
85
86   memcpy (newstr, start, end - start);
87   newstr [end - start] = '\0';
88
89   return newstr;
90 }
91
92
93 /*******************************************************************
94  *         str_replace
95  *
96  * Swap two strings in another string, in place
97  * Modified PD code from 'snippets'
98  */
99 char *str_replace (char *str, const char *oldstr, const char *newstr)
100 {
101   int oldlen, newlen;
102   char *p, *q;
103
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;
111 }
112
113
114 /*******************************************************************
115  *         str_match
116  *
117  * Locate one string in another, ignoring spaces
118  */
119 const char *str_match (const char *str, const char *match, int *found)
120 {
121   assert(str && match && found);
122
123   while (*str == ' ') str++;
124   if (!strncmp (str, match, strlen (match)))
125   {
126     *found = 1;
127     str += strlen (match);
128     while (*str == ' ') str++;
129   }
130   else
131     *found = 0;
132   return str;
133 }
134
135
136 /*******************************************************************
137  *         str_find_set
138  *
139  * Locate the first occurence of a set of characters in a string
140  */
141 const char *str_find_set (const char *str, const char *findset)
142 {
143   assert(str && findset);
144
145   while (*str)
146   {
147     const char *p = findset;
148     while (*p)
149       if (*p++ == *str)
150         return str;
151     str++;
152   }
153   return NULL;
154 }
155
156
157 /*******************************************************************
158  *         str_toupper
159  *
160  * Uppercase a string
161  */
162 char *str_toupper (char *str)
163 {
164   char *save = str;
165   while (*str)
166   {
167     *str = toupper (*str);
168     str++;
169   }
170   return save;
171 }
172
173
174 /*******************************************************************
175  *         open_file
176  *
177  * Open a file returning only on success
178  */
179 FILE *open_file (const char *name, const char *ext, const char *mode)
180 {
181   char  fname[128];
182   FILE *fp;
183
184   if (((unsigned)snprintf (fname, sizeof (fname), "%s%s%s",
185                  *mode == 'w' ? "./" : "", name, ext) > sizeof (fname)))
186     fatal ("File name too long");
187
188   if (VERBOSE)
189     printf ("Open file %s\n", fname);
190
191   fp = fopen (fname, mode);
192   if (!fp)
193     fatal ("Cant open file");
194   return fp;
195 }
196
197
198 /*******************************************************************
199  *         fatal
200  *
201  * Fatal error handling
202  */
203 void  fatal (const char *message)
204 {
205   if (errno)
206     perror (message);
207   else
208     puts (message);
209   do_usage ();
210 }