From 8733911e8291bc37c5cd0dcb38ede3dde0410f26 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 8 May 2018 19:55:40 -0400 Subject: [PATCH] support C++ in build --- src/Node.h | 8 ++++++++ src/String.h | 8 ++++++++ src/parser/{parser.c => parser.cc} | 2 ++ src/parser/parser.h | 11 ++++++++++- src/parser/{parser.y => parser.yc} | 0 wscript | 10 +++++++--- 6 files changed, 35 insertions(+), 4 deletions(-) rename src/parser/{parser.c => parser.cc} (99%) rename src/parser/{parser.y => parser.yc} (100%) diff --git a/src/Node.h b/src/Node.h index 788800e..515787c 100644 --- a/src/Node.h +++ b/src/Node.h @@ -3,6 +3,10 @@ #include "String.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef struct { int type; @@ -24,4 +28,8 @@ enum Node * Node_new(int type); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/String.h b/src/String.h index 385e70c..63d2c73 100644 --- a/src/String.h +++ b/src/String.h @@ -3,6 +3,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct { char * value; @@ -17,4 +21,8 @@ static inline char * String_cstr(const String * st) { return st->value; } static inline size_t String_size(const String * st) { return st->size; } void String_free(String * st); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/parser/parser.c b/src/parser/parser.cc similarity index 99% rename from src/parser/parser.c rename to src/parser/parser.cc index b38fb0c..8b29263 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.cc @@ -10,6 +10,7 @@ extern FILE * yyin; static const char * input_fname; +extern "C" { void parse(const char * filename) { input_fname = filename; @@ -25,6 +26,7 @@ void parse(const char * filename) return; } } +} static char * read_file(const char * filename, size_t * length) { diff --git a/src/parser/parser.h b/src/parser/parser.h index 00ebd86..b6317e1 100644 --- a/src/parser/parser.h +++ b/src/parser/parser.h @@ -2,11 +2,20 @@ #define PARSER_H #include "Node.h" -#include "parser.tab.h" +#include "parser.tab.hh" #define YYSTYPE Node * +#ifdef __cplusplus +extern "C" { +#endif + void parse(const char * filename); + +#ifdef __cplusplus +} +#endif + void handle_parse_error(const char * str, const YYLTYPE * yylloc); #endif diff --git a/src/parser/parser.y b/src/parser/parser.yc similarity index 100% rename from src/parser/parser.y rename to src/parser/parser.yc diff --git a/wscript b/wscript index 0fd2d64..73107c2 100644 --- a/wscript +++ b/wscript @@ -3,20 +3,24 @@ import sys APP_NAME = "cxlc" def options(opt): - opt.load("compiler_c"); + opt.load("compiler_c compiler_cxx"); def configure(conf): - conf.load("compiler_c flex bison"); + conf.load("compiler_c compiler_cxx flex bison"); def build(bld): sources = bld.path.ant_glob("src/**/*.c") + sources += bld.path.ant_glob("src/**/*.cc") lexer_source = "src/parser/parser.l" - parser_source = "src/parser/parser.y" + parser_source = "src/parser/parser.yc" sources += [lexer_source, parser_source] includes = ["src", "src/parser"] cflags = ["-Wall", "-O2"] + cxxflags = cflags bld.program( + features = ['c', 'cxx', 'cxxprogram'], source = sources, cflags = cflags, + cxxflags = cxxflags, target = APP_NAME, includes = includes)