class Mcpp < Formula desc "Alternative C/C++ preprocessor" homepage "https://mcpp.sourceforge.io/" url "https://downloads.sourceforge.net/project/mcpp/mcpp/V.2.7.2/mcpp-2.7.2.tar.gz" sha256 "3b9b4421888519876c4fc68ade324a3bbd81ceeb7092ecdbbc2055099fcb8864" bottle do cellar :any rebuild 1 sha256 "cdd368c63dc6403832c938967f8f099ec3d02acfcc5c75ab0426ad1cd213b045" => :sierra sha256 "0be73930b3dbc8bc247c9a26acbc6115d3f5f665daaabc9ab64606ac6793ace9" => :el_capitan sha256 "612e3efb23a8165af204338a20bbc27ae8fa2ad345964c24d2d7a206dee0317a" => :yosemite end # stpcpy is a macro on macOS; trying to define it as an extern is invalid. # Patch from ZeroC fixing EOL comment parsing # https://forums.zeroc.com/forum/bug-reports/5445-mishap-in-slice-compilers?t=5309 patch :DATA def install system "./configure", "--disable-debug", "--disable-dependency-tracking", "--prefix=#{prefix}", "--enable-mcpplib" system "make", "install" end end __END__ diff --git a/src/internal.H b/src/internal.H index 5e1c19f..39aff8c 100644 --- a/src/internal.H +++ b/src/internal.H @@ -390,6 +390,8 @@ extern char * const work_end; /* End of work[] buffer */ 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,6 +559,6 @@ extern void init_system( void); #endif #endif -#if HOST_HAVE_STPCPY +#if HOST_HAVE_STPCPY && !defined(stpcpy) extern char * stpcpy( char * dest, const char * src); #endif diff --git a/src/main.c b/src/main.c index a438894..8da4b58 100644 --- a/src/main.c +++ b/src/main.c @@ -326,6 +326,8 @@ static void init_main( void) = FALSE; option_flags.trig = TRIGRAPHS_INIT; option_flags.dig = DIGRAPHS_INIT; + sh_file = NULL; + sh_line = 0; } int mcpp_lib_main diff --git a/src/support.c b/src/support.c index c57eaef..348ede0 100644 --- a/src/support.c +++ b/src/support.c @@ -188,7 +188,7 @@ static char * append_to_buffer( size_t length ) { - if (mem_buf_p->bytes_avail < length) { /* Need to allocate more memory */ + 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,6 +1722,8 @@ com_start: 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 --git a/src/system.c b/src/system.c index 4759469..4e008fa 100644 --- a/src/system.c +++ b/src/system.c @@ -3534,6 +3534,32 @@ void add_file( 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,6 +3884,9 @@ static int chk_dirp( } #endif +FILEINFO* sh_file; +int sh_line; + void sharp( FILEINFO * sharp_file, int flag /* Flag to append to the line for GCC */ @@ -3868,8 +3897,6 @@ void sharp( * else (i.e. 'sharp_file' is NULL) 'infile'. */ { - static FILEINFO * sh_file; - static int sh_line; FILEINFO * file; int line;