wrc: parser_error must append a newline.
diff --git a/tools/wrc/newstruc.c b/tools/wrc/newstruc.c
index c49a294..e35c332 100644
--- a/tools/wrc/newstruc.c
+++ b/tools/wrc/newstruc.c
@@ -327,7 +327,7 @@
 		type |= FL_SIZEBE | FL_OS2;
 	}
 	else
-		parser_error("Invalid bitmap format, bih->biSize = %d\n", bih->biSize);
+		parser_error("Invalid bitmap format, bih->biSize = %d", bih->biSize);
 
 	switch(type)
 	{
@@ -461,7 +461,7 @@
 	else if(BYTESWAP_WORD(ih->type) == 1)
 		swap = 1;
 	else
-		parser_error("Icon resource data has invalid type id %d\n", ih->type);
+		parser_error("Icon resource data has invalid type id %d", ih->type);
 
 	cnt = swap ? BYTESWAP_WORD(ih->count) : ih->count;
 	for(i = 0; i < cnt; i++)
@@ -481,7 +481,7 @@
 		}
 		if(ide.offset > rd->size
 		|| ide.offset + ide.ressize > rd->size)
-			parser_error("Icon resource data corrupt\n");
+			parser_error("Icon resource data corrupt");
 		ico->width = ide.width;
 		ico->height = ide.height;
 		ico->nclr = ide.nclr;
@@ -556,7 +556,7 @@
 	else if(BYTESWAP_WORD(ch->type) == 2)
 		swap = 1;
 	else
-		parser_error("Cursor resource data has invalid type id %d\n", ch->type);
+		parser_error("Cursor resource data has invalid type id %d", ch->type);
 	cnt = swap ? BYTESWAP_WORD(ch->count) : ch->count;
 	for(i = 0; i < cnt; i++)
 	{
@@ -575,7 +575,7 @@
 		}
 		if(cde.offset > rd->size
 		|| cde.offset + cde.ressize > rd->size)
-			parser_error("Cursor resource data corrupt\n");
+			parser_error("Cursor resource data corrupt");
 		cur->width = cde.width;
 		cur->height = cde.height;
 		cur->nclr = cde.nclr;
@@ -840,7 +840,7 @@
 	else if(rtp->size + 2*sizeof(DWORD) == rd->size)
 		isswapped = 0;
 	else
-		parser_error("Animated %s has an invalid RIFF length\n", anistr);
+		parser_error("Animated %s has an invalid RIFF length", anistr);
 
 	switch(byteorder)
 	{
@@ -1002,7 +1002,7 @@
 		msg->memopt = WRC_MO_MOVEABLE | WRC_MO_PURE;
 
 	if(rd->size < sizeof(DWORD))
-		parser_error("Invalid messagetable, size too small\n");
+		parser_error("Invalid messagetable, size too small");
 
 	nblk = *(DWORD *)rd->data;
 	lo = WRC_LOWORD(nblk);
@@ -1019,7 +1019,7 @@
 	if(hi && lo)
 		internal_error(__FILE__, __LINE__, "Messagetable contains more than 65535 blocks; cannot determine endian\n");
 	if(!hi && !lo)
-		parser_error("Invalid messagetable block count 0\n");
+		parser_error("Invalid messagetable block count 0");
 
 	if(!hi && lo)  /* Messagetable byteorder == native byteorder */
 	{
@@ -1032,7 +1032,7 @@
 
 		mbp = (msgtab_block_t *)&(((DWORD *)rd->data)[1]);
 		if(MSGTAB_BAD_PTR(mbp, rd->data, rd->size, nblk * sizeof(*mbp)))
-			parser_error("Messagetable's blocks are outside of defined data\n");
+			parser_error("Messagetable's blocks are outside of defined data");
 		for(i = 0; i < nblk; i++)
 		{
 			msgtab_entry_t *mep, *next_mep;
@@ -1043,7 +1043,7 @@
 			for(id = mbp[i].idlo; id <= mbp[i].idhi; id++)
 			{
 				if(MSGTAB_BAD_PTR(mep, rd->data, rd->size, mep->length))
-					parser_error("Messagetable's data for block %d, ID 0x%08x is outside of defined data\n", i, id);
+					parser_error("Messagetable's data for block %d, ID 0x%08x is outside of defined data", i, id);
 				if(mep->flags == 1)	/* Docu says 'flags == 0x0001' for unicode */
 				{
 					WORD *wp = (WORD *)&mep[1];
@@ -1051,7 +1051,7 @@
 					int n;
 
 					if(mep->length & 1)
-						parser_error("Message 0x%08x is unicode (block %d), but has odd length (%d)\n", id, i, mep->length);
+						parser_error("Message 0x%08x is unicode (block %d), but has odd length (%d)", id, i, mep->length);
 					for(n = 0; n < l; n++)
 						wp[n] = BYTESWAP_WORD(wp[n]);
 
@@ -1079,7 +1079,7 @@
 		mbp = (msgtab_block_t *)&(((DWORD *)rd->data)[1]);
 		nblk = BYTESWAP_DWORD(nblk);
 		if(MSGTAB_BAD_PTR(mbp, rd->data, rd->size, nblk * sizeof(*mbp)))
-			parser_error("Messagetable's blocks are outside of defined data\n");
+			parser_error("Messagetable's blocks are outside of defined data");
 		for(i = 0; i < nblk; i++)
 		{
 			msgtab_entry_t *mep;
@@ -1096,7 +1096,7 @@
 				mep->flags  = BYTESWAP_WORD(mep->flags);
 
 				if(MSGTAB_BAD_PTR(mep, rd->data, rd->size, mep->length))
-					parser_error("Messagetable's data for block %d, ID 0x%08x is outside of defined data\n", i, id);
+					parser_error("Messagetable's data for block %d, ID 0x%08x is outside of defined data", i, id);
 				if(mep->flags == 1)	/* Docu says 'flags == 0x0001' for unicode */
 				{
 					WORD *wp = (WORD *)&mep[1];
@@ -1104,7 +1104,7 @@
 					int n;
 
 					if(mep->length & 1)
-						parser_error("Message 0x%08x is unicode (block %d), but has odd length (%d)\n", id, i, mep->length);
+						parser_error("Message 0x%08x is unicode (block %d), but has odd length (%d)", id, i, mep->length);
 					for(n = 0; n < l; n++)
 						wp[n] = BYTESWAP_WORD(wp[n]);
 
diff --git a/tools/wrc/parser.l b/tools/wrc/parser.l
index 1cae89a..21aa0d6 100644
--- a/tools/wrc/parser.l
+++ b/tools/wrc/parser.l
@@ -330,10 +330,10 @@
 		yy_pop_state();
 		lineno = (int)strtol(yytext, &cptr, 10);
 		if(!lineno)
-			parser_error("Malformed '#...' line-directive; invalid linenumber\n");
+			parser_error("Malformed '#...' line-directive; invalid linenumber");
 		fname = strchr(cptr, '"');
 		if(!fname)
-			parser_error("Malformed '#...' line-directive; missing filename\n");
+			parser_error("Malformed '#...' line-directive; missing filename");
 		fname++;
 		cptr = strchr(fname, '"');
 		if(!cptr)
@@ -361,11 +361,11 @@
         current_codepage = strtol( p, NULL, 10 );
         if (current_codepage && current_codepage != CP_UTF8 && !wine_cp_get_table( current_codepage ))
         {
-            parser_error("Codepage %d not supported\n", current_codepage);
+            parser_error("Codepage %d not supported", current_codepage);
             current_codepage = 0;
         }
     }
-<pp_code_page>[^\n]*	yy_pop_state(); parser_error("Malformed #pragma code_page directive\n");
+<pp_code_page>[^\n]*	yy_pop_state(); parser_error("Malformed #pragma code_page directive");
 
 	/*
 	 * Strip everything until a ';' taking
@@ -429,7 +429,7 @@
 				unsigned int result;
 				result = strtoul(yytext+1, 0, 8);
 				if ( result > 0xffff )
-					parser_error("Character constant out of range\n");
+					parser_error("Character constant out of range");
 				addwchar((WCHAR)result);
 			}
 <tklstr>\\x[0-9a-fA-F]{4} {  /* hex escape sequence */
@@ -437,9 +437,9 @@
 				result = strtoul(yytext+2, 0, 16);
 				addwchar((WCHAR)result);
 			}
-<tklstr>\\x[0-9a-fA-F]{1,3} {  parser_error("Invalid hex escape sequence '%s'\n", yytext); }
+<tklstr>\\x[0-9a-fA-F]{1,3} {  parser_error("Invalid hex escape sequence '%s'", yytext); }
 
-<tklstr>\\[0-9]+	parser_error("Bad escape sequence\n");
+<tklstr>\\[0-9]+	parser_error("Bad escape sequence");
 <tklstr>\\\n{ws}*	line_number++; char_number = 1; /* backslash at EOL continues string after leading whitespace on next line */
 <tklstr>\\a		addwchar('\a');
 <tklstr>\\b		addwchar('\b');
@@ -458,7 +458,7 @@
 				while(*yptr)	/* FIXME: codepage translation */
 					addwchar(*yptr++ & 0xff);
 			}
-<tklstr>\n		parser_error("Unterminated string\n");
+<tklstr>\n		parser_error("Unterminated string");
 
 	/*
 	 * Normal string scanning
@@ -474,7 +474,7 @@
 				int result;
 				result = strtol(yytext+1, 0, 8);
 				if ( result > 0xff )
-					parser_error("Character constant out of range\n");
+					parser_error("Character constant out of range");
 				addcchar((char)result);
 			}
 <tkstr>\\x[0-9a-fA-F]{2} {  /* hex escape sequence */
@@ -482,9 +482,9 @@
 				result = strtol(yytext+2, 0, 16);
 				addcchar((char)result);
 			}
-<tkstr>\\x[0-9a-fA-F]	{  parser_error("Invalid hex escape sequence '%s'\n", yytext); }
+<tkstr>\\x[0-9a-fA-F]	{  parser_error("Invalid hex escape sequence '%s'", yytext); }
 
-<tkstr>\\[0-9]+		parser_error("Bad escape sequence\n");
+<tkstr>\\[0-9]+		parser_error("Bad escape sequence");
 <tkstr>\\\n{ws}*	line_number++; char_number = 1; /* backslash at EOL continues string after leading whitespace on next line */
 <tkstr>\\a		addcchar('\a');
 <tkstr>\\b		addcchar('\b');
@@ -503,7 +503,7 @@
 <tkstr>\"\"		addcchar('\"');		/* "bla""bla"   -> "bla\"bla" */
 <tkstr>\\\"\"		addcchar('\"');		/* "bla\""bla"  -> "bla\"bla" */
 <tkstr>\"{ws}+\"	;			/* "bla" "bla"  -> "blabla" */
-<tkstr>\n		parser_error("Unterminated string\n");
+<tkstr>\n		parser_error("Unterminated string");
 
 	/*
 	 * Raw data scanning
@@ -524,7 +524,7 @@
 			}
 <tkrcd>{ws}+		;	/* Ignore space */
 <tkrcd>\n		line_number++; char_number = 1;
-<tkrcd>.		parser_error("Malformed data-line\n");
+<tkrcd>.		parser_error("Malformed data-line");
 
 	/*
 	 * Comment stripping
@@ -610,7 +610,7 @@
 
     if (!current_codepage || current_codepage == -1 || !win32)  /* store as ANSI string */
     {
-        if (!current_codepage) parser_error("Codepage set to Unicode only, cannot use ASCII string here\n");
+        if (!current_codepage) parser_error("Codepage set to Unicode only, cannot use ASCII string here");
         return str;
     }
     else  /* convert to Unicode before storing */
@@ -618,7 +618,7 @@
         string_t *str_w = convert_string( str, str_unicode, current_codepage );
         if (!check_unicode_conversion( str, str_w, current_codepage ))
             parser_error("String %s does not convert identically to Unicode and back in codepage %d. "
-                    "Try using a Unicode string instead\n", str->str.cstr, current_codepage );
+                    "Try using a Unicode string instead", str->str.cstr, current_codepage );
         free_string( str );
         return str_w;
     }
diff --git a/tools/wrc/parser.y b/tools/wrc/parser.y
index 28d3998..1aa31c7 100644
--- a/tools/wrc/parser.y
+++ b/tools/wrc/parser.y
@@ -419,7 +419,7 @@
 					&& rsc->lan->sub == head->lan->sub
 					&& !compare_name_id(rsc->name, head->name))
 					{
-						parser_error("Duplicate resource name '%s'\n", get_nameid_str(rsc->name));
+						yyerror("Duplicate resource name '%s'", get_nameid_str(rsc->name));
 					}
 					rsc = rsc->prev;
 				}
@@ -476,7 +476,7 @@
 		if($$)
 		{
 			if($1 > 65535 || $1 < -32768)
-				parser_error("Resource's ID out of range (%d)\n", $1);
+				yyerror("Resource's ID out of range (%d)", $1);
 			$$->name = new_name_id();
 			$$->name->type = name_ord;
 			$$->name->name.i_name = $1;
@@ -533,7 +533,7 @@
 			parser_warning("LANGUAGE not supported in 16-bit mode\n");
 		free(currentlanguage);
 		if (get_language_codepage($3, $5) == -1)
-			parser_error( "Language %04x is not supported\n", ($5<<10) + $3);
+			yyerror( "Language %04x is not supported", ($5<<10) + $3);
 		currentlanguage = new_language($3, $5);
 		$$ = NULL;
 		chat("Got LANGUAGE %d,%d (0x%04x)\n", $3, $5, ($5<<10) + $3);
@@ -552,7 +552,7 @@
  */
 nameid	: expr	{
 		if($1 > 65535 || $1 < -32768)
-			parser_error("Resource's ID out of range (%d)\n", $1);
+			yyerror("Resource's ID out of range (%d)", $1);
 		$$ = new_name_id();
 		$$->type = name_ord;
 		$$->name.i_name = $1;
@@ -776,7 +776,7 @@
 			$$->memopt = WRC_MO_MOVEABLE | WRC_MO_PURE;
 		}
 		if(!$5)
-			parser_error("Accelerator table must have at least one entry\n");
+			yyerror("Accelerator table must have at least one entry");
 		$$->events = get_event_head($5);
 		if($3)
 		{
@@ -1224,7 +1224,7 @@
 /* ------------------------------ Menu ------------------------------ */
 menu	: tMENU loadmemopts opt_lvc menu_body {
 		if(!$4)
-			parser_error("Menu must contain items\n");
+			yyerror("Menu must contain items");
 		$$ = new_menu();
 		if($2)
 		{
@@ -1298,7 +1298,7 @@
 		if(!win32)
 			parser_warning("MENUEX not supported in 16-bit mode\n");
 		if(!$4)
-			parser_error("MenuEx must contain items\n");
+			yyerror("MenuEx must contain items");
 		$$ = new_menuex();
 		if($2)
 		{
@@ -1432,7 +1432,7 @@
 	: stt_head tBEGIN strings tEND {
 		if(!$3)
 		{
-			parser_error("Stringtable must have at least one entry\n");
+			yyerror("Stringtable must have at least one entry");
 		}
 		else
 		{
@@ -1482,12 +1482,12 @@
 		int i;
 		assert(tagstt != NULL);
 		if($2 > 65535 || $2 < -32768)
-			parser_error("Stringtable entry's ID out of range (%d)\n", $2);
+			yyerror("Stringtable entry's ID out of range (%d)", $2);
 		/* Search for the ID */
 		for(i = 0; i < tagstt->nentries; i++)
 		{
 			if(tagstt->entries[i].id == $2)
-				parser_error("Stringtable ID %d already in use\n", $2);
+				yyerror("Stringtable ID %d already in use", $2);
 		}
 		/* If we get here, then we have a new unique entry */
 		tagstt->nentries++;
@@ -1504,9 +1504,9 @@
 		if(pedantic && !$4->size)
 			parser_warning("Zero length strings make no sense\n");
 		if(!win32 && $4->size > 254)
-			parser_error("Stringtable entry more than 254 characters\n");
+			yyerror("Stringtable entry more than 254 characters");
 		if(win32 && $4->size > 65534) /* Hmm..., does this happen? */
-			parser_error("Stringtable entry more than 65534 characters (probably something else that went wrong)\n");
+			yyerror("Stringtable entry more than 65534 characters (probably something else that went wrong)");
 		$$ = tagstt;
 		}
 	;
@@ -1537,7 +1537,7 @@
 	: /* Empty */			{ $$ = new_versioninfo(); }
 	| fix_version tFILEVERSION expr ',' expr ',' expr ',' expr {
 		if($1->gotit.fv)
-			parser_error("FILEVERSION already defined\n");
+			yyerror("FILEVERSION already defined");
 		$$ = $1;
 		$$->filever_maj1 = $3;
 		$$->filever_maj2 = $5;
@@ -1547,7 +1547,7 @@
 		}
 	| fix_version tPRODUCTVERSION expr ',' expr ',' expr ',' expr {
 		if($1->gotit.pv)
-			parser_error("PRODUCTVERSION already defined\n");
+			yyerror("PRODUCTVERSION already defined");
 		$$ = $1;
 		$$->prodver_maj1 = $3;
 		$$->prodver_maj2 = $5;
@@ -1557,35 +1557,35 @@
 		}
 	| fix_version tFILEFLAGS expr {
 		if($1->gotit.ff)
-			parser_error("FILEFLAGS already defined\n");
+			yyerror("FILEFLAGS already defined");
 		$$ = $1;
 		$$->fileflags = $3;
 		$$->gotit.ff = 1;
 		}
 	| fix_version tFILEFLAGSMASK expr {
 		if($1->gotit.ffm)
-			parser_error("FILEFLAGSMASK already defined\n");
+			yyerror("FILEFLAGSMASK already defined");
 		$$ = $1;
 		$$->fileflagsmask = $3;
 		$$->gotit.ffm = 1;
 		}
 	| fix_version tFILEOS expr {
 		if($1->gotit.fo)
-			parser_error("FILEOS already defined\n");
+			yyerror("FILEOS already defined");
 		$$ = $1;
 		$$->fileos = $3;
 		$$->gotit.fo = 1;
 		}
 	| fix_version tFILETYPE expr {
 		if($1->gotit.ft)
-			parser_error("FILETYPE already defined\n");
+			yyerror("FILETYPE already defined");
 		$$ = $1;
 		$$->filetype = $3;
 		$$->gotit.ft = 1;
 		}
 	| fix_version tFILESUBTYPE expr {
 		if($1->gotit.fst)
-			parser_error("FILESUBTYPE already defined\n");
+			yyerror("FILESUBTYPE already defined");
 		$$ = $1;
 		$$->filesubtype = $3;
 		$$->gotit.fst = 1;
@@ -1730,7 +1730,7 @@
 		if(!win32)
 			parser_warning("LANGUAGE not supported in 16-bit mode\n");
 		if($1->language)
-			parser_error("Language already defined\n");
+			yyerror("Language already defined");
 		$$ = $1;
 		$1->language = $2;
 		}
@@ -1738,7 +1738,7 @@
 		if(!win32)
 			parser_warning("CHARACTERISTICS not supported in 16-bit mode\n");
 		if($1->characts)
-			parser_error("Characteristics already defined\n");
+			yyerror("Characteristics already defined");
 		$$ = $1;
 		$1->characts = $2;
 		}
@@ -1746,7 +1746,7 @@
 		if(!win32)
 			parser_warning("VERSION not supported in 16-bit mode\n");
 		if($1->version)
-			parser_error("Version already defined\n");
+			yyerror("Version already defined");
 		$$ = $1;
 		$1->version = $2;
 		}
@@ -1762,7 +1762,7 @@
 opt_language
 	: tLANGUAGE expr ',' expr	{ $$ = new_language($2, $4);
 					  if (get_language_codepage($2, $4) == -1)
-						parser_error( "Language %04x is not supported\n", ($4<<10) + $2);
+						yyerror( "Language %04x is not supported", ($4<<10) + $2);
 					}
 	;
 
@@ -1894,7 +1894,7 @@
 {
 	assert(dlg != NULL);
 	if(dlg->title)
-		parser_error("Caption already defined\n");
+		yyerror("Caption already defined");
 	dlg->title = s;
 	return dlg;
 }
@@ -1903,7 +1903,7 @@
 {
 	assert(dlg != NULL);
 	if(dlg->font)
-		parser_error("Font already defined\n");
+		yyerror("Font already defined");
 	dlg->font = f;
 	return dlg;
 }
@@ -1912,7 +1912,7 @@
 {
 	assert(dlg != NULL);
 	if(dlg->dlgclass)
-		parser_error("Class already defined\n");
+		yyerror("Class already defined");
 	dlg->dlgclass = n;
 	return dlg;
 }
diff --git a/tools/wrc/utils.c b/tools/wrc/utils.c
index 35811bb..24f589e 100644
--- a/tools/wrc/utils.c
+++ b/tools/wrc/utils.c
@@ -71,6 +71,7 @@
 	va_list ap;
 	va_start(ap, s);
 	generic_msg(s, "Error", parser_text, ap);
+        fputc( '\n', stderr );
 	va_end(ap);
 	exit(1);
 	return 1;
@@ -241,7 +242,7 @@
     int res;
 
     if (!codepage && str->type != type)
-        parser_error( "Current language is Unicode only, cannot convert string\n" );
+        parser_error( "Current language is Unicode only, cannot convert string" );
 
     if((str->type == str_char) && (type == str_unicode))
     {
@@ -256,7 +257,7 @@
             res = wine_utf8_mbstowcs( MB_ERR_INVALID_CHARS, str->str.cstr, str->size,
                                       ret->str.wstr, ret->size );
         if (res == -2)
-            parser_error( "Invalid character in string '%.*s' for codepage %u\n",
+            parser_error( "Invalid character in string '%.*s' for codepage %u",
                    str->size, str->str.cstr, codepage );
         ret->str.wstr[ret->size] = 0;
     }