ReactOS 0.4.15-dev-8241-g63935f8
utils.c
Go to the documentation of this file.
1/*
2 * Utility routines
3 *
4 * Copyright 1998 Bertho A. Stultiens
5 * Copyright 2002 Ove Kaaven
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "config.h"
23#include "wine/port.h"
24
25#include <assert.h>
26#include <stdio.h>
27#include <stdlib.h>
28#include <stdarg.h>
29#include <string.h>
30#include <ctype.h>
31
32#include "widl.h"
33#include "utils.h"
34#include "parser.h"
35
36#define CURRENT_LOCATION { input_name ? input_name : "stdin", line_number, parser_text }
37
38static const int want_near_indication = 0;
39
40static void make_print(char *str)
41{
42 while(*str)
43 {
44 if(!isprint(*str))
45 *str = ' ';
46 str++;
47 }
48}
49
50static void generic_msg(const loc_info_t *loc_info, const char *s, const char *t, va_list ap)
51{
52 fprintf(stderr, "%s:%d: %s: ", loc_info->input_name, loc_info->line_number, t);
54
56 {
57 char *cpy;
58 if(loc_info->near_text)
59 {
60 cpy = xstrdup(loc_info->near_text);
61 make_print(cpy);
62 fprintf(stderr, " near '%s'", cpy);
63 free(cpy);
64 }
65 }
66}
67
68
69void error_loc(const char *s, ...)
70{
72 va_list ap;
73 va_start(ap, s);
74 generic_msg(&cur_loc, s, "error", ap);
75 va_end(ap);
76 exit(1);
77}
78
79/* yyerror: yacc assumes this is not newline terminated. */
80void parser_error(const char *s)
81{
82 error_loc("%s\n", s);
83}
84
85void error_loc_info(const loc_info_t *loc_info, const char *s, ...)
86{
87 va_list ap;
88 va_start(ap, s);
89 generic_msg(loc_info, s, "error", ap);
90 va_end(ap);
91 exit(1);
92}
93
94int parser_warning(const char *s, ...)
95{
97 va_list ap;
98 va_start(ap, s);
99 generic_msg(&cur_loc, s, "warning", ap);
100 va_end(ap);
101 return 0;
102}
103
104void error(const char *s, ...)
105{
106 va_list ap;
107 va_start(ap, s);
108 fprintf(stderr, "error: ");
109 vfprintf(stderr, s, ap);
110 va_end(ap);
111 exit(2);
112}
113
114void warning(const char *s, ...)
115{
116 va_list ap;
117 va_start(ap, s);
118 fprintf(stderr, "warning: ");
119 vfprintf(stderr, s, ap);
120 va_end(ap);
121}
122
123void warning_loc_info(const loc_info_t *loc_info, const char *s, ...)
124{
125 va_list ap;
126 va_start(ap, s);
127 generic_msg(loc_info, s, "warning", ap);
128 va_end(ap);
129}
130
131void chat(const char *s, ...)
132{
134 {
135 va_list ap;
136 va_start(ap, s);
137 fprintf(stderr, "chat: ");
138 vfprintf(stderr, s, ap);
139 va_end(ap);
140 }
141}
142
143char *dup_basename(const char *name, const char *ext)
144{
145 int namelen;
146 int extlen = strlen(ext);
147 char *base;
148 char *slash;
149
150 if(!name)
151 name = "widl.tab";
152
153 slash = strrchr(name, '/');
154 if (!slash)
155 slash = strrchr(name, '\\');
156
157 if (slash)
158 name = slash + 1;
159
161
162 /* +6 for later extension (strlen("_r.rgs")) and +1 for '\0' */
163 base = xmalloc(namelen +6 +1);
164 strcpy(base, name);
165 if(!strcasecmp(name + namelen-extlen, ext))
166 {
167 base[namelen - extlen] = '\0';
168 }
169 return base;
170}
171
172size_t widl_getline(char **linep, size_t *lenp, FILE *fp)
173{
174 char *line = *linep;
175 size_t len = *lenp;
176 size_t n = 0;
177
178 if (!line)
179 {
180 len = 64;
181 line = xmalloc(len);
182 }
183
184 while (fgets(&line[n], len - n, fp))
185 {
186 n += strlen(&line[n]);
187 if (line[n - 1] == '\n')
188 break;
189 else if (n == len - 1)
190 {
191 len *= 2;
192 line = xrealloc(line, len);
193 }
194 }
195
196 *linep = line;
197 *lenp = len;
198 return n;
199}
200
201void *xmalloc(size_t size)
202{
203 void *res;
204
205 assert(size > 0);
206 res = malloc(size);
207 if(res == NULL)
208 {
209 error("Virtual memory exhausted.\n");
210 }
211 memset(res, 0x55, size);
212 return res;
213}
214
215
216void *xrealloc(void *p, size_t size)
217{
218 void *res;
219
220 assert(size > 0);
221 res = realloc(p, size);
222 if(res == NULL)
223 {
224 error("Virtual memory exhausted.\n");
225 }
226 return res;
227}
228
229char *xstrdup(const char *str)
230{
231 char *s;
232
233 assert(str != NULL);
234 s = xmalloc(strlen(str)+1);
235 return strcpy(s, str);
236}
237
238int strendswith(const char* str, const char* end)
239{
240 int l = strlen(str);
241 int m = strlen(end);
242 return l >= m && strcmp(str + l - m, end) == 0;
243}
244
245/*******************************************************************
246 * buffer management
247 *
248 * Function for writing to a memory buffer.
249 */
250
252unsigned char *output_buffer;
255
256static struct resource
257{
258 unsigned char *data;
259 size_t size;
261static unsigned int nb_resources;
262
263static void check_output_buffer_space( size_t size )
264{
266 {
269 }
270}
271
273{
274 output_buffer_size = 1024;
277}
278
279void flush_output_buffer( const char *name )
280{
281 int fd = open( name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666 );
282 if (fd == -1) error( "Error creating %s\n", name );
284 error( "Error writing to %s\n", name );
285 close( fd );
287}
288
289static inline void put_resource_id( const char *str )
290{
291 if (str[0] != '#')
292 {
293 while (*str)
294 {
295 unsigned char ch = *str++;
296 put_word( toupper(ch) );
297 }
298 put_word( 0 );
299 }
300 else
301 {
302 put_word( 0xffff );
303 put_word( atoi( str + 1 ));
304 }
305}
306
307void add_output_to_resources( const char *type, const char *name )
308{
309 size_t data_size = output_buffer_pos;
310 size_t header_size = 5 * sizeof(unsigned int) + 2 * sizeof(unsigned short);
311
312 assert( nb_resources < sizeof(resources)/sizeof(resources[0]) );
313
314 if (type[0] != '#') header_size += (strlen( type ) + 1) * sizeof(unsigned short);
315 else header_size += 2 * sizeof(unsigned short);
316 if (name[0] != '#') header_size += (strlen( name ) + 1) * sizeof(unsigned short);
317 else header_size += 2 * sizeof(unsigned short);
318
319 header_size = (header_size + 3) & ~3;
320 align_output( 4 );
321 check_output_buffer_space( header_size );
322 resources[nb_resources].size = header_size + output_buffer_pos;
324
326 put_dword( data_size ); /* ResSize */
327 put_dword( header_size ); /* HeaderSize */
328 put_resource_id( type ); /* ResType */
329 put_resource_id( name ); /* ResName */
330 align_output( 4 );
331 put_dword( 0 ); /* DataVersion */
332 put_word( 0 ); /* Memory options */
333 put_word( 0 ); /* Language */
334 put_dword( 0 ); /* Version */
335 put_dword( 0 ); /* Characteristics */
336
339}
340
341void flush_output_resources( const char *name )
342{
343 int fd;
344 unsigned int i;
345
346 /* all output must have been saved with add_output_to_resources() first */
348
349 put_dword( 0 ); /* ResSize */
350 put_dword( 32 ); /* HeaderSize */
351 put_word( 0xffff ); /* ResType */
352 put_word( 0x0000 );
353 put_word( 0xffff ); /* ResName */
354 put_word( 0x0000 );
355 put_dword( 0 ); /* DataVersion */
356 put_word( 0 ); /* Memory options */
357 put_word( 0 ); /* Language */
358 put_dword( 0 ); /* Version */
359 put_dword( 0 ); /* Characteristics */
360
361 fd = open( name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666 );
362 if (fd == -1) error( "Error creating %s\n", name );
364 error( "Error writing to %s\n", name );
365 for (i = 0; i < nb_resources; i++)
366 {
368 error( "Error writing to %s\n", name );
369 free( resources[i].data );
370 }
371 close( fd );
372 nb_resources = 0;
374}
375
376void put_data( const void *data, size_t size )
377{
381}
382
383void put_byte( unsigned char val )
384{
387}
388
389void put_word( unsigned short val )
390{
391 if (byte_swapped) val = (val << 8) | (val >> 8);
392 put_data( &val, sizeof(val) );
393}
394
395void put_dword( unsigned int val )
396{
397 if (byte_swapped)
398 val = ((val << 24) | ((val << 8) & 0x00ff0000) | ((val >> 8) & 0x0000ff00) | (val >> 24));
399 put_data( &val, sizeof(val) );
400}
401
402void put_qword( unsigned int val )
403{
404 if (byte_swapped)
405 {
406 put_dword( 0 );
407 put_dword( val );
408 }
409 else
410 {
411 put_dword( val );
412 put_dword( 0 );
413 }
414}
415
416/* pointer-sized word */
417void put_pword( unsigned int val )
418{
419 if (pointer_size == 8) put_qword( val );
420 else put_dword( val );
421}
422
423void put_str( int indent, const char *format, ... )
424{
425 int n;
427
431
432 for (;;)
433 {
435 va_start( args, format );
437 va_end( args );
438 if (n == -1) size *= 2;
439 else if ((size_t)n >= size) size = n + 1;
440 else
441 {
443 return;
444 }
446 }
447}
448
449void align_output( unsigned int align )
450{
451 size_t size = align - (output_buffer_pos % align);
452
453 if (size == align) return;
457}
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define isprint(c)
Definition: acclib.h:73
int toupper(int c)
Definition: utclib.c:881
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define O_WRONLY
Definition: acwin.h:111
#define O_CREAT
Definition: acwin.h:110
#define O_BINARY
Definition: acwin.h:109
#define open
Definition: acwin.h:95
#define close
Definition: acwin.h:98
#define write
Definition: acwin.h:97
#define O_TRUNC
Definition: acwin.h:112
r l[0]
Definition: byte_order.h:168
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define put_byte(s, c)
Definition: deflate.h:276
#define NULL
Definition: types.h:112
static const WCHAR indent[]
Definition: object.c:1156
static const WCHAR *const ext[]
Definition: module.c:53
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
#define assert(x)
Definition: debug.h:53
int align(int length, int align)
Definition: dsound8.c:36
#define strcasecmp
Definition: fake.h:9
FxCmResList * resources
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
GLdouble GLdouble t
Definition: gl.h:2047
GLsizeiptr size
Definition: glext.h:5919
GLdouble n
Definition: glext.h:7729
GLuint res
Definition: glext.h:9613
GLint namelen
Definition: glext.h:7232
GLuint GLfloat * val
Definition: glext.h:7180
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
const GLfloat * m
Definition: glext.h:10848
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
_Check_return_opt_ _CRTIMP int __cdecl vfprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
_Check_return_opt_ _CRTIMP char *__cdecl fgets(_Out_writes_z_(_MaxCount) char *_Buf, _In_ int _MaxCount, _Inout_ FILE *_File)
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
const WCHAR * str
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
#define warning(s)
Definition: debug.h:83
#define exit(n)
Definition: config.h:202
static int fd
Definition: io.c:51
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
size_t widl_getline(char **linep, size_t *lenp, FILE *fp)
Definition: utils.c:172
void put_qword(unsigned int val)
Definition: utils.c:402
void align_output(unsigned int align)
Definition: utils.c:449
void flush_output_buffer(const char *name)
Definition: utils.c:279
void parser_error(const char *s)
Definition: utils.c:80
int parser_warning(const char *s,...)
Definition: utils.c:94
#define CURRENT_LOCATION
Definition: utils.c:36
void put_pword(unsigned int val)
Definition: utils.c:417
char * xstrdup(const char *str)
Definition: utils.c:229
size_t output_buffer_pos
Definition: utils.c:253
size_t output_buffer_size
Definition: utils.c:254
static void generic_msg(const loc_info_t *loc_info, const char *s, const char *t, va_list ap)
Definition: utils.c:50
void put_word(unsigned short val)
Definition: utils.c:389
void add_output_to_resources(const char *type, const char *name)
Definition: utils.c:307
void put_dword(unsigned int val)
Definition: utils.c:395
void error_loc_info(const loc_info_t *loc_info, const char *s,...)
Definition: utils.c:85
void flush_output_resources(const char *name)
Definition: utils.c:341
void put_data(const void *data, size_t size)
Definition: utils.c:376
void * xrealloc(void *p, size_t size)
Definition: utils.c:216
void chat(const char *s,...)
Definition: utils.c:131
int strendswith(const char *str, const char *end)
Definition: utils.c:238
void put_str(int indent, const char *format,...)
Definition: utils.c:423
void init_output_buffer(void)
Definition: utils.c:272
static void put_resource_id(const char *str)
Definition: utils.c:289
static unsigned int nb_resources
Definition: utils.c:261
static void make_print(char *str)
Definition: utils.c:40
void error_loc(const char *s,...)
Definition: utils.c:69
static void check_output_buffer_space(size_t size)
Definition: utils.c:263
unsigned char * output_buffer
Definition: utils.c:252
static const int want_near_indication
Definition: utils.c:38
int byte_swapped
Definition: utils.c:251
void warning_loc_info(const loc_info_t *loc_info, const char *s,...)
Definition: utils.c:123
char * dup_basename(const char *name, const char *ext)
Definition: utils.c:143
void * xmalloc(size_t size)
Definition: utils.c:201
int line_number
Definition: widltypes.h:287
const char * near_text
Definition: widltypes.h:288
const char * input_name
Definition: widltypes.h:286
Definition: match.c:390
Definition: parser.c:49
Definition: name.c:39
size_t size
Definition: utils.c:259
unsigned char * data
Definition: utils.c:258
#define max(a, b)
Definition: svc.c:63
#define vsnprintf
Definition: tif_win32.c:406
unsigned int pointer_size
Definition: widl.c:158
int debuglevel
Definition: widl.c:110
#define DEBUGLEVEL_CHAT
Definition: widl.h:30
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36