Added some checks for the config.h inclusion rules in the Wine tree.
diff --git a/tools/makedep.c b/tools/makedep.c
index dfc9ebb..0aec443 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -25,6 +25,7 @@
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
@@ -71,16 +72,26 @@
/*******************************************************************
+ * fatal_error
+ */
+static void fatal_error( const char *msg, ... )
+{
+ va_list valist;
+ va_start( valist, msg );
+ vfprintf( stderr, msg, valist );
+ va_end( valist );
+ exit(1);
+}
+
+
+/*******************************************************************
* xmalloc
*/
static void *xmalloc( int size )
{
void *res;
if (!(res = malloc (size ? size : 1)))
- {
- fprintf( stderr, "%s: Virtual memory exhausted.\n", ProgramName );
- exit(1);
- }
+ fatal_error( "%s: Virtual memory exhausted.\n", ProgramName );
return res;
}
@@ -91,11 +102,7 @@
static char *xstrdup( const char *str )
{
char *res = strdup( str );
- if (!res)
- {
- fprintf( stderr, "%s: Virtual memory exhausted.\n", ProgramName );
- exit(1);
- }
+ if (!res) fatal_error( "%s: Virtual memory exhausted.\n", ProgramName );
return res;
}
@@ -169,14 +176,42 @@
static INCL_FILE *add_include( INCL_FILE *pFile, const char *name, int line, int system )
{
INCL_FILE **p = &firstInclude;
+ char *ext;
int pos;
for (pos = 0; pos < MAX_INCLUDES; pos++) if (!pFile->files[pos]) break;
if (pos >= MAX_INCLUDES)
+ fatal_error( "%s: %s: too many included files, please fix MAX_INCLUDES\n",
+ ProgramName, pFile->name );
+
+ /* enforce some rules for the Wine tree */
+
+ if (!memcmp( name, "../", 3 ))
+ fatal_error( "%s:%d: #include directive with relative path not allowed\n",
+ pFile->filename, line );
+
+ if (!strcmp( name, "config.h" ))
{
- fprintf( stderr, "%s: %s: too many included files, please fix MAX_INCLUDES\n",
- ProgramName, pFile->name );
- exit(1);
+ if ((ext = strrchr( pFile->filename, '.' )) && !strcmp( ext, ".h" ))
+ fatal_error( "%s:%d: config.h must not be included by a header file\n",
+ pFile->filename, line );
+ if (pos)
+ fatal_error( "%s:%d: config.h must be included before anything else\n",
+ pFile->filename, line );
+ }
+ else if (!strcmp( name, "wine/port.h" ))
+ {
+ if ((ext = strrchr( pFile->filename, '.' )) && !strcmp( ext, ".h" ))
+ fatal_error( "%s:%d: wine/port.h must not be included by a header file\n",
+ pFile->filename, line );
+ if (!pos) fatal_error( "%s:%d: config.h must be included before wine/port.h\n",
+ pFile->filename, line );
+ if (pos > 1)
+ fatal_error( "%s:%d: wine/port.h must be included before everything except config.h\n",
+ pFile->filename, line );
+ if (strcmp( pFile->files[0]->name, "config.h" ))
+ fatal_error( "%s:%d: config.h must be included before wine/port.h\n",
+ pFile->filename, line );
}
while (*p && strcmp( name, (*p)->name )) p = &(*p)->next;
@@ -317,12 +352,8 @@
if (quote == '<') quote = '>';
include = p;
while (*p && (*p != quote)) p++;
- if (!*p)
- {
- fprintf( stderr, "%s:%d: Malformed #include or import directive\n",
- pFile->filename, line );
- exit(1);
- }
+ if (!*p) fatal_error( "%s:%d: Malformed #include or import directive\n",
+ pFile->filename, line );
*p = 0;
add_include( pFile, include, line, (quote == '>') );
}
@@ -353,12 +384,8 @@
if (quote == '<') quote = '>';
include = p;
while (*p && (*p != quote)) p++;
- if (!*p)
- {
- fprintf( stderr, "%s:%d: Malformed #include directive\n",
- pFile->filename, line );
- exit(1);
- }
+ if (!*p) fatal_error( "%s:%d: Malformed #include directive\n",
+ pFile->filename, line );
*p = 0;
add_include( pFile, include, line, (quote == '>') );
}