diff --git a/tools/winebuild/parser.c b/tools/winebuild/parser.c
index b3a68c8dc9b0198ce3161f1d8f8baf5b13ac997f..f0e30ec09bc49af3026a1da7dd65a62803cef678 100644
--- a/tools/winebuild/parser.c
+++ b/tools/winebuild/parser.c
@@ -24,8 +24,8 @@ int current_line = 0;
 static SPEC_TYPE SpecType = SPEC_INVALID;
 
 static char ParseBuffer[512];
+static char TokenBuffer[512];
 static char *ParseNext = ParseBuffer;
-static char ParseSaveChar;
 static FILE *input_file;
 
 static const char * const TypeNames[TYPE_NBTYPES] =
@@ -53,7 +53,7 @@ static const char * const FlagNames[] =
     NULL
 };
 
-static int IsNumberString(char *s)
+static int IsNumberString(const char *s)
 {
     while (*s) if (!isdigit(*s++)) return 0;
     return 1;
@@ -64,60 +64,49 @@ inline static int is_token_separator( char ch )
     return (ch == '(' || ch == ')' || ch == '-');
 }
 
-static char * GetTokenInLine(void)
+static const char * GetTokenInLine(void)
 {
-    char *p;
-    char *token;
+    char *p = ParseNext;
+    char *token = TokenBuffer;
 
-    if (ParseNext != ParseBuffer)
-    {
-	if (ParseSaveChar == '\0')
-	    return NULL;
-	*ParseNext = ParseSaveChar;
-    }
-    
     /*
      * Remove initial white space.
      */
-    for (p = ParseNext; isspace(*p); p++)
-	;
-    
-    if ((*p == '\0') || (*p == '#'))
-	return NULL;
-    
+    while (isspace(*p)) p++;
+
+    if ((*p == '\0') || (*p == '#')) return NULL;
+
     /*
      * Find end of token.
      */
-    token = p++;
-    if (!is_token_separator(*token))
-        while (*p != '\0' && !is_token_separator(*p) && !isspace(*p))
-	    p++;
-    
-    ParseSaveChar = *p;
+    if (is_token_separator(*p))
+    {
+        /* a separator is always a complete token */
+        *token++ = *p++;
+    }
+    else while (*p != '\0' && !is_token_separator(*p) && !isspace(*p))
+    {
+        if (*p == '\\') p++;
+        if (*p) *token++ = *p++;
+    }
+    *token = '\0';
     ParseNext = p;
-    *p = '\0';
-
-    return token;
+    return TokenBuffer;
 }
 
-static char * GetToken( int allow_eof )
+static const char * GetToken( int allow_eof )
 {
-    char *token;
+    const char *token;
 
     while ((token = GetTokenInLine()) == NULL)
     {
 	ParseNext = ParseBuffer;
-	while (1)
-	{
-            current_line++;
-	    if (fgets(ParseBuffer, sizeof(ParseBuffer), input_file) == NULL)
-            {
-                if (!allow_eof) fatal_error( "Unexpected end of file\n" );
-                return NULL;
-            }
-	    if (ParseBuffer[0] != '#')
-		break;
-	}
+        current_line++;
+        if (fgets(ParseBuffer, sizeof(ParseBuffer), input_file) == NULL)
+        {
+            if (!allow_eof) fatal_error( "Unexpected end of file\n" );
+            return NULL;
+        }
     }
     return token;
 }
@@ -130,7 +119,7 @@ static char * GetToken( int allow_eof )
  */
 static void ParseDebug(void)
 {
-    char *token = GetToken(0);
+    const char *token = GetToken(0);
     if (*token != '(') fatal_error( "Expected '(' got '%s'\n", token );
     for (;;)
     {
@@ -150,7 +139,7 @@ static void ParseDebug(void)
  */
 static void ParseIgnore(void)
 {
-    char *token = GetToken(0);
+    const char *token = GetToken(0);
     if (*token != '(') fatal_error( "Expected '(' got '%s'\n", token );
     for (;;)
     {
@@ -172,8 +161,8 @@ static void ParseVariable( ORDDEF *odp )
     int *value_array;
     int n_values;
     int value_array_size;
-    
-    char *token = GetToken(0);
+
+    const char *token = GetToken(0);
     if (*token != '(') fatal_error( "Expected '(' got '%s'\n", token );
 
     n_values = 0;
@@ -210,7 +199,7 @@ static void ParseVariable( ORDDEF *odp )
  */
 static void ParseExportFunction( ORDDEF *odp )
 {
-    char *token;
+    const char *token;
     unsigned int i;
 
     switch(SpecType)
@@ -291,8 +280,8 @@ static void ParseExportFunction( ORDDEF *odp )
 static void ParseEquate( ORDDEF *odp )
 {
     char *endptr;
-    
-    char *token = GetToken(0);
+
+    const char *token = GetToken(0);
     int value = strtol(token, &endptr, 0);
     if (endptr == NULL || *endptr != '\0')
 	fatal_error( "Expected number value, got '%s'\n", token );
@@ -321,7 +310,7 @@ static void ParseStub( ORDDEF *odp )
  */
 static void ParseInterrupt( ORDDEF *odp )
 {
-    char *token;
+    const char *token;
 
     if (SpecType == SPEC_WIN32)
         fatal_error( "'interrupt' not supported for Win32\n" );
@@ -368,10 +357,10 @@ static void ParseForward( ORDDEF *odp )
  *
  * Parse the optional flags for an entry point
  */
-static char *ParseFlags( ORDDEF *odp )
+static const char *ParseFlags( ORDDEF *odp )
 {
     unsigned int i;
-    char *token;
+    const char *token;
 
     do
     {
@@ -407,7 +396,7 @@ static void fix_export_name( char *name )
  */
 static void ParseOrdinal(int ordinal)
 {
-    char *token;
+    const char *token;
 
     ORDDEF *odp = xmalloc( sizeof(*odp) );
     memset( odp, 0, sizeof(*odp) );
@@ -534,7 +523,7 @@ static void sort_names(void)
  */
 SPEC_TYPE ParseTopLevel( FILE *file )
 {
-    char *token;
+    const char *token;
 
     input_file = file;
     current_line = 1;