diff -r -c -N ../mcpp-2.7.2-old/noconfig/vc2010.dif ./noconfig/vc2010.dif
*** ../mcpp-2.7.2-old/noconfig/vc2010.dif	Wed Dec 31 20:30:00 1969
--- ./noconfig/vc2010.dif	Fri May 14 12:47:22 2010
***************
*** 0 ****
--- 1,67 ----
+ *** noconfig.H	Thu Sep 25 15:34:56 2008
+ --- noconfig.H.vc2005	Thu Sep 25 17:23:49 2008
+ ***************
+ *** 15,21 ****
+    */
+   
+   /* Define target operating-system.  */
+ ! #define SYSTEM              SYS_FREEBSD
+   
+   /* Define target compiler.          */
+   #ifndef COMPILER
+ --- 15,21 ----
+    */
+   
+   /* Define target operating-system.  */
+ ! #define SYSTEM              SYS_WIN32
+   
+   /* Define target compiler.          */
+   #ifndef COMPILER
+ ***************
+ *** 26,36 ****
+   #define HOST_SYSTEM         SYSTEM
+   
+   /* Define host compiler.            */
+ ! #define HOST_COMPILER       GNUC
+   
+   /* Version message.                 */
+   /* "MCPP V.2.* (200y/mm) compiled by " precedes VERSION_MSG */
+ ! #define VERSION_MSG         "GCC 3.4"
+   #if     0
+       "LCC-Win32 2006-03"
+       "Visual C 2005"
+ --- 26,36 ----
+   #define HOST_SYSTEM         SYSTEM
+   
+   /* Define host compiler.            */
+ ! #define HOST_COMPILER       MSC
+   
+   /* Version message.                 */
+   /* "MCPP V.2.* (200y/mm) compiled by " precedes VERSION_MSG */
+ ! #define VERSION_MSG         "Visual C 2010"
+   #if     0
+       "LCC-Win32 2006-03"
+       "Visual C 2005"
+ ***************
+ *** 212,221 ****
+   #define ONE_PASS            TRUE
+   #endif
+   #define COMPILER_EXT        "_MSC_VER"
+ ! #define COMPILER_EXT_VAL    "1500"      /* VC 6.0: "1200"   */
+       /* VC 2002: "1300", VC 2003: "1310", VC 2005: "1400", VC 2008: "1500"   */
+   #define COMPILER_EXT2       "_MSC_FULL_VER"
+ ! #define COMPILER_EXT2_VAL   "150021022" /* VC 6.0: "12008804"       */
+       /* VC 2002: "13009466", VC 2003: "13103077", VC 2005: "140050320"       */
+       /* VC 2008: "150021022" */
+   #define COMPILER_SP1        "_MSC_EXTENSIONS"
+ --- 212,221 ----
+   #define ONE_PASS            TRUE
+   #endif
+   #define COMPILER_EXT        "_MSC_VER"
+ ! #define COMPILER_EXT_VAL    "1600"      /* VC 6.0: "1200"   */
+       /* VC 2002: "1300", VC 2003: "1310", VC 2005: "1400", VC 2008: "1500"   */
+   #define COMPILER_EXT2       "_MSC_FULL_VER"
+ ! #define COMPILER_EXT2_VAL   "160030319" /* VC 6.0: "12008804"       */
+       /* VC 2002: "13009466", VC 2003: "13103077", VC 2005: "140050320"       */
+       /* VC 2008: "150021022" */
+   #define COMPILER_SP1        "_MSC_EXTENSIONS"
diff -r -c -N ../mcpp-2.7.2-old/src/internal.H ./src/internal.H
*** ../mcpp-2.7.2-old/src/internal.H	Wed Aug 27 10:31:16 2008
--- ./src/internal.H	Fri May 14 12:40:56 2010
***************
*** 390,395 ****
--- 390,397 ----
  extern char     identifier[];       /* Lastly scanned name          */
  extern IFINFO   ifstack[];          /* Information of #if nesting   */
  extern char     work_buf[];
+ extern FILEINFO * sh_file;
+ extern int      sh_line;
          /* Temporary buffer for directive line and macro expansion  */
  
  /* main.c   */
***************
*** 557,562 ****
  #endif
  #endif
  
! #if HOST_HAVE_STPCPY
  extern char *   stpcpy( char * dest, const char * src);
  #endif
--- 559,564 ----
  #endif
  #endif
  
! #if HOST_HAVE_STPCPY && !defined(stpcpy)
  extern char *   stpcpy( char * dest, const char * src);
  #endif
diff -r -c -N ../mcpp-2.7.2-old/src/main.c ./src/main.c
*** ../mcpp-2.7.2-old/src/main.c	Wed Nov  5 05:04:46 2008
--- ./src/main.c	Fri May 14 12:40:56 2010
***************
*** 326,331 ****
--- 326,333 ----
              = FALSE;
      option_flags.trig = TRIGRAPHS_INIT;
      option_flags.dig = DIGRAPHS_INIT;
+     sh_file = NULL;
+     sh_line = 0;
  }
  
  int     mcpp_lib_main
diff -r -c -N ../mcpp-2.7.2-old/src/support.c ./src/support.c
*** ../mcpp-2.7.2-old/src/support.c	Tue Jun 10 06:02:33 2008
--- ./src/support.c	Fri May 14 12:40:56 2010
***************
*** 188,194 ****
      size_t      length
  )
  {
!     if (mem_buf_p->bytes_avail < length) {  /* Need to allocate more memory */
          size_t size = MAX( BUF_INCR_SIZE, length);
  
          if (mem_buf_p->buffer == NULL) {            /* 1st append   */
--- 188,194 ----
      size_t      length
  )
  {
!     if (mem_buf_p->bytes_avail < length + 1) {  /* Need to allocate more memory */
          size_t size = MAX( BUF_INCR_SIZE, length);
  
          if (mem_buf_p->buffer == NULL) {            /* 1st append   */
***************
*** 1722,1727 ****
--- 1722,1729 ----
                      sp -= 2;
                      while (*sp != '\n')     /* Until end of line    */
                          mcpp_fputc( *sp++, OUT);
+                     mcpp_fputc( '\n', OUT);
+                     wrong_line = TRUE;
                  }
                  goto  end_line;
              default:                        /* Not a comment        */
diff -r -c -N ../mcpp-2.7.2-old/src/system.c ./src/system.c
*** ../mcpp-2.7.2-old/src/system.c      2008-11-26 10:53:51.000000000 +0100
--- ./src/system.c      2011-02-21 16:18:05.678058106 +0100
***************
*** 3534,3539 ****
--- 3534,3565 ----
      FILEINFO *      file;
      const char *    too_many_include_nest =
              "More than %.0s%ld nesting of #include";    /* _F_ _W4_ */
+             
+     //
+     // When encoding is UTF-8, skip BOM if present.
+     //
+     if(mbchar == UTF8 && fp != NULL && ftell(fp) == 0)
+     {
+         const unsigned char UTF8_BOM[3] = {0xEF, 0xBB, 0xBF};
+         unsigned char FILE_HEAD[3] = {0, 0, 0};
+         int i;
+         for(i = 0; i < 3; ++i)
+         {
+             FILE_HEAD[i] = getc(fp);
+             if(FILE_HEAD[i] != UTF8_BOM[i])
+             {
+                 if(FILE_HEAD[i] == (unsigned char)EOF)
+                 {
+                     i--;
+                 }
+                 for(; i >= 0; --i)
+                 {
+                     ungetc(FILE_HEAD[i], fp);
+                 }
+                 break;
+             }
+         }
+     }
  
      filename = set_fname( filename);    /* Search or append to fnamelist[]  */
      fullname = set_fname( fullname);    /* Search or append to fnamelist[]  */
***************
*** 3858,3863 ****
--- 3884,3892 ----
  }
  #endif
  
+ FILEINFO*       sh_file;
+ int             sh_line;
+ 
  void    sharp(
      FILEINFO *  sharp_file,
      int         flag        /* Flag to append to the line for GCC   */
***************
*** 3868,3875 ****
   * else (i.e. 'sharp_file' is NULL) 'infile'.
   */
  {
-     static FILEINFO *   sh_file;
-     static int  sh_line;
      FILEINFO *  file;
      int         line;
  
--- 3897,3902 ----
