Upstream-Status: Pending

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/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 ----
