makedep: Get rid of restrictions on line lengths. Merge lines that end in a backslash.
diff --git a/tools/makedep.c b/tools/makedep.c
index 268fdb3..fa3555b 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -22,6 +22,7 @@
#define NO_LIBWINE_PORT
#include "wine/port.h"
+#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
@@ -63,6 +64,7 @@
static const char *OutputFileName = "Makefile";
static const char *Separator = "### Dependencies";
static const char *ProgramName;
+static int input_line;
static const char Usage[] =
"Usage: %s [options] [files]\n"
@@ -89,7 +91,7 @@
/*******************************************************************
* xmalloc
*/
-static void *xmalloc( int size )
+static void *xmalloc( size_t size )
{
void *res;
if (!(res = malloc (size ? size : 1)))
@@ -99,6 +101,18 @@
/*******************************************************************
+ * xrealloc
+ */
+void *xrealloc (void *ptr, size_t size)
+{
+ void *res;
+ assert( size );
+ if (!(res = realloc( ptr, size )))
+ fatal_error( "%s: Virtual memory exhausted.\n", ProgramName );
+ return res;
+}
+
+/*******************************************************************
* xstrdup
*/
static char *xstrdup( const char *str )
@@ -121,6 +135,50 @@
/*******************************************************************
+ * get_line
+ */
+static char *get_line( FILE *file )
+{
+ static char *buffer;
+ static unsigned int size;
+
+ if (!size)
+ {
+ size = 1024;
+ buffer = xmalloc( size );
+ }
+ if (!fgets( buffer, size, file )) return NULL;
+ input_line++;
+
+ for (;;)
+ {
+ char *p = buffer + strlen(buffer);
+ /* if line is larger than buffer, resize buffer */
+ while (p == buffer + size - 1 && p[-1] != '\n')
+ {
+ buffer = xrealloc( buffer, size * 2 );
+ fgets( buffer + size - 1, size + 1, file );
+ p = buffer + strlen(buffer);
+ size *= 2;
+ }
+ if (p > buffer && p[-1] == '\n')
+ {
+ *(--p) = 0;
+ if (p > buffer && p[-1] == '\r') *(--p) = 0;
+ if (p > buffer && p[-1] == '\\')
+ {
+ *(--p) = 0;
+ /* line ends in backslash, read continuation line */
+ fgets( p, size - (p - buffer), file );
+ input_line++;
+ continue;
+ }
+ }
+ return buffer;
+ }
+}
+
+/*******************************************************************
* is_generated
*
* Test if a given file type is generated during the make process
@@ -319,15 +377,13 @@
*/
static void parse_idl_file( INCL_FILE *pFile, FILE *file )
{
- char buffer[1024];
- char *include;
- int line = 0;
+ char *buffer, *include;
- while (fgets( buffer, sizeof(buffer)-1, file ))
+ input_line = 0;
+ while ((buffer = get_line( file )))
{
char quote;
char *p = buffer;
- line++;
while (*p && isspace(*p)) p++;
if (!strncmp( p, "import", 6 ))
@@ -351,9 +407,9 @@
include = p;
while (*p && (*p != quote)) p++;
if (!*p) fatal_error( "%s:%d: Malformed #include or import directive\n",
- pFile->filename, line );
+ pFile->filename, input_line );
*p = 0;
- add_include( pFile, include, line, (quote == '>') );
+ add_include( pFile, include, input_line, (quote == '>') );
}
}
@@ -362,15 +418,13 @@
*/
static void parse_c_file( INCL_FILE *pFile, FILE *file )
{
- char buffer[1024];
- char *include;
- int line = 0;
+ char *buffer, *include;
- while (fgets( buffer, sizeof(buffer)-1, file ))
+ input_line = 0;
+ while ((buffer = get_line( file )))
{
char quote;
char *p = buffer;
- line++;
while (*p && isspace(*p)) p++;
if (*p++ != '#') continue;
while (*p && isspace(*p)) p++;
@@ -383,9 +437,9 @@
include = p;
while (*p && (*p != quote)) p++;
if (!*p) fatal_error( "%s:%d: Malformed #include directive\n",
- pFile->filename, line );
+ pFile->filename, input_line );
*p = 0;
- add_include( pFile, include, line, (quote == '>') );
+ add_include( pFile, include, input_line, (quote == '>') );
}
}
@@ -485,11 +539,11 @@
INCL_FILE *pFile;
int i, column;
FILE *file = NULL;
- char buffer[1024];
+ char *buffer;
if (Separator && ((file = fopen( OutputFileName, "r+" ))))
{
- while (fgets( buffer, sizeof(buffer), file ))
+ while ((buffer = get_line( file )))
if (!strncmp( buffer, Separator, strlen(Separator) )) break;
ftruncate( fileno(file), ftell(file) );
fseek( file, 0L, SEEK_END );