Do not create a window each time VGA_DoSetMode is called. The window
[wine/multimedia.git] / tools / winedump / symbol.c
blob0617003e7fe3ef0c8cce123f48c6d0c5c9b34ad4
1 /*
2 * Symbol functions
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "config.h"
22 #include "wine/port.h"
24 #include "winedump.h"
27 /* Items that are swapped in arguments after the symbol structure
28 * has been populated
30 static const char *swap_after[] =
32 "\r", " ", /* Remove whitespace, normalise pointers and brackets */
33 "\t", " ",
34 " ", " ",
35 " * ", " *",
36 "* *", "**",
37 "* ", "*",
38 " ,", ",",
39 "( ", "(",
40 " )", ")",
41 "wchar_t", "WCHAR", /* Help with Unicode compliles */
42 "wctype_t", "WCHAR",
43 "wint_t", "WCHAR",
44 "unsigned __int64", "__uint64", /* Wine doesn't cope with unsigned i64's */
45 NULL, NULL
49 /* Items containing these substrings are assumed to be wide character
50 * strings, unless they contain more that one '*'. A preceeding 'LP'
51 * counts as a '*', so 'LPWCSTR *' is a pointer, not a string
53 static const char *wide_strings[] =
55 "WSTR", "WCSTR", NULL
58 /* Items containing these substrings are assumed to be wide characters,
59 * unless they contain one '*'. A preceeding 'LP' counts as a '*',
60 * so 'WCHAR *' is string, while 'LPWCHAR *' is a pointer
62 static const char *wide_chars[] =
64 "WCHAR", NULL
67 /* Items containing these substrings are assumed to be ASCII character
68 * strings, as above
70 static const char *ascii_strings[] =
72 "STR", "CSTR", NULL
76 /* Items containing these substrings are assumed to be ASCII characters,
77 * as above
79 static const char *ascii_chars[] =
81 "CHAR", "char", NULL
84 /* Any type other than the following will produce a FIXME warning with -v
85 * when mapped to a long, to allow fixups
87 static const char *known_longs[] =
89 "char", "CHAR", "float", "int", "INT", "short", "SHORT", "long", "LONG",
90 "WCHAR", "BOOL", "bool", "INT16", "WORD", "DWORD", NULL
93 int symbol_init(parsed_symbol* sym, const char* name)
95 memset(sym, 0, sizeof(parsed_symbol));
96 sym->symbol = strdup(name);
97 return 0;
100 /*******************************************************************
101 * symbol_clear
103 * Free the memory used by a symbol and initialise it
105 void symbol_clear(parsed_symbol *sym)
107 int i;
109 assert (sym);
110 assert (sym->symbol);
112 free (sym->symbol);
114 if (sym->return_text)
115 free (sym->return_text);
117 if (sym->function_name)
118 free (sym->function_name);
120 for (i = sym->argc - 1; i >= 0; i--)
122 if (sym->arg_text [i])
123 free (sym->arg_text [i]);
124 if (sym->arg_name [i])
125 free (sym->arg_name [i]);
127 memset (sym, 0, sizeof (parsed_symbol));
131 /*******************************************************************
132 * symbol_is_valid_c
134 * Check if a symbol is a valid C identifier
136 int symbol_is_valid_c(const parsed_symbol *sym)
138 char *name;
140 assert (sym);
141 assert (sym->symbol);
143 name = sym->symbol;
145 while (*name)
147 if (!isalnum (*name) && *name != '_')
148 return 0;
149 name++;
151 return 1;
155 /*******************************************************************
156 * symbol_get_call_convention
158 * Return the calling convention of a symbol
160 const char *symbol_get_call_convention(const parsed_symbol *sym)
162 int call = sym->flags ? sym->flags : CALLING_CONVENTION;
164 assert (sym);
165 assert (sym->symbol);
167 if (call & SYM_CDECL)
168 return "cdecl";
169 return "stdcall";
173 /*******************************************************************
174 * symbol_get_spec_type
176 * Get the .spec file text for a symbols argument
178 const char *symbol_get_spec_type (const parsed_symbol *sym, size_t arg)
180 assert (arg < sym->argc);
181 switch (sym->arg_type [arg])
183 case ARG_STRING: return "str";
184 case ARG_WIDE_STRING: return "wstr";
185 case ARG_POINTER: return "ptr";
186 case ARG_DOUBLE: return "double";
187 case ARG_STRUCT:
188 case ARG_FLOAT:
189 case ARG_LONG: return "long";
191 assert (0);
192 return NULL;
196 /*******************************************************************
197 * symbol_get_type
199 * Get the ARG_ constant for a type string
201 int symbol_get_type (const char *string)
203 const char *iter = string;
204 const char **tab;
205 int ptrs = 0;
207 while (*iter && isspace(*iter))
208 iter++;
209 if (*iter == 'P' || *iter == 'H')
210 ptrs++; /* Win32 type pointer */
212 iter = string;
213 while (*iter)
215 if (*iter == '*' || (*iter == 'L' && iter[1] == 'P')
216 || (*iter == '[' && iter[1] == ']'))
217 ptrs++;
218 if (ptrs > 1)
219 return ARG_POINTER;
220 iter++;
223 /* 0 or 1 pointer */
224 tab = wide_strings;
225 while (*tab++)
226 if (strstr (string, tab[-1]))
228 if (ptrs < 2) return ARG_WIDE_STRING;
229 else return ARG_POINTER;
231 tab = wide_chars;
232 while (*tab++)
233 if (strstr (string, tab[-1]))
235 if (!ptrs) return ARG_LONG;
236 else return ARG_WIDE_STRING;
238 tab = ascii_strings;
239 while (*tab++)
240 if (strstr (string, tab[-1]))
242 if (ptrs < 2) return ARG_STRING;
243 else return ARG_POINTER;
245 tab = ascii_chars;
246 while (*tab++)
247 if (strstr (string, tab[-1]))
249 if (!ptrs) return ARG_LONG;
250 else {
251 if (!strstr (string, "unsigned")) /* unsigned char * => ptr */
252 return ARG_STRING;
256 if (ptrs)
257 return ARG_POINTER; /* Pointer to some other type */
259 /* No pointers */
260 if (strstr (string, "double"))
261 return ARG_DOUBLE;
263 if (strstr (string, "void") || strstr (string, "VOID"))
264 return ARG_VOID;
266 if (strstr (string, "struct") || strstr (string, "union"))
267 return ARG_STRUCT; /* Struct by value, ugh */
269 if (VERBOSE)
271 int known = 0;
273 tab = known_longs;
274 while (*tab++)
275 if (strstr (string, tab[-1]))
277 known = 1;
278 break;
280 /* Unknown types passed by value can be 'grep'ed out for fixup later */
281 if (!known)
282 printf ("/* FIXME: By value type: Assumed 'int' */ typedef int %s;\n",
283 string);
285 return ARG_LONG;
289 /*******************************************************************
290 * symbol_clean_string
292 * Make a type string more Wine-friendly. Logically const :-)
294 void symbol_clean_string (const char *string)
296 const char **tab = swap_after;
297 char *str = (char *)string;
299 #define SWAP(i, p, x, y) do { i = p; while ((i = str_replace (i, x, y))); } while(0)
301 while (tab [0])
303 char *p;
304 SWAP (p, str, tab [0], tab [1]);
305 tab += 2;
307 if (str [strlen (str) - 1] == ' ')
308 str [strlen (str) - 1] = '\0'; /* no trailing space */
310 if (*str == ' ')
311 memmove (str, str + 1, strlen (str)); /* No leading spaces */