diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e08aed8 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +###### Building tasks ####### +build: + @build_scripts/build_configurations/build.sh + +build_dbg: + @build_scripts/build_configurations/build_dbg.sh + +###### Testing tasks ####### +test: build + @build_scripts/build_configurations/test.sh + +test_valgrind: build_dbg + @build_scripts/build_configurations/test_valgrind.sh + +all: build diff --git a/build_scripts/build_configurations/build.sh b/build_scripts/build_configurations/build.sh new file mode 100644 index 0000000..4a11792 --- /dev/null +++ b/build_scripts/build_configurations/build.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +source build_scripts/init.sh + +print "${CYAN}===============[build]================\n" +clear_dir "$OUTDIR" +clear_dir "$OBJDIR" +compile_c "$BUILD_C_ARGS" "$SRC_C $TESTS_C" +compile_cpp "$BUILD_CPP_ARGS" "$SRC_CPP $TESTS_CPP" +link "$BUILD_CPP_ARGS $BUILD_LINKER_ARGS" $BUILD_FILE diff --git a/build_scripts/build_configurations/build_dbg.sh b/build_scripts/build_configurations/build_dbg.sh new file mode 100644 index 0000000..54a79b0 --- /dev/null +++ b/build_scripts/build_configurations/build_dbg.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +source build_scripts/init.sh + +print "${CYAN}=============[build_dbg]==============\n" +clear_dir "$OUTDIR" +clear_dir "$OBJDIR" +compile_c "$BUILD_DBG_C_ARGS" "$SRC_C $TESTS_C" +compile_cpp "$BUILD_DBG_CPP_ARGS" "$SRC_CPP $TESTS_CPP" +link "$BUILD_DBG_CPP_ARGS $BUILD_DBG_LINKER_ARGS" $TEST_DBG_FILE diff --git a/build_scripts/build_configurations/test.sh b/build_scripts/build_configurations/test.sh new file mode 100644 index 0000000..45ac85c --- /dev/null +++ b/build_scripts/build_configurations/test.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +source build_scripts/init.sh + +print "${CYAN}================[test]================\n" +cd $OUTDIR +./$TEST_FILE +cd .. diff --git a/build_scripts/build_configurations/test_valgrind.sh b/build_scripts/build_configurations/test_valgrind.sh new file mode 100644 index 0000000..a92df20 --- /dev/null +++ b/build_scripts/build_configurations/test_valgrind.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +source build_scripts/init.sh + +print "${CYAN}===========[test_valgrind]============\n" +cd $OUTDIR +valgrind $VALGRIND_ARGS ./$TEST_DBG_FILE +cat "valgrind.log" +cd .. diff --git a/build_scripts/colors.sh b/build_scripts/colors.sh new file mode 100644 index 0000000..e3e8363 --- /dev/null +++ b/build_scripts/colors.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +BLACK='\033[0;30m' +GRAY='\033[0;37m' +WHITE='\033[0;97m' +RED='\033[0;91m' +GREEN='\033[0;92m' +YELLOW='\033[0;93m' +BLUE='\033[0;94m' +PURPLE='\033[0;95m' +CYAN='\033[0;96m' diff --git a/build_scripts/default.config.sh b/build_scripts/default.config.sh new file mode 100644 index 0000000..7f99014 --- /dev/null +++ b/build_scripts/default.config.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +OUTDIR=bin +OBJDIR=obj +CMP_C=gcc +CMP_CPP=g++ +STD_C=c11 +STD_CPP=c++17 +WARN_C="-Wall -Wno-discarded-qualifiers" #-Wextra +WARN_CPP="-Wall -Wno-unused-variable -Wno-return-type" #-Wextra +SRC_C="$( find src -name '*.c')" +SRC_CPP="$( find src -name '*.cpp')" +TESTS_C="$( find tests -name '*.c')" +TESTS_CPP="$(find tests -name '*.cpp')" +VALGRIND_ARGS="-s --log-file=valgrind.log --read-var-info=yes --track-origins=yes --fullpath-after=cobek/ --leak-check=full --show-leak-kinds=all" + +# build +TEST_FILE=cb2c.com +BUILD_C_ARGS="-O2" +BUILD_CPP_ARGS="$BUILD_C_ARGS" +BUILD_LINKER_ARGS="" + +# build_dbg +TEST_DBG_FILE=$TEST_FILE +BUILD_DBG_C_ARGS="-O0 -g" +BUILD_DBG_CPP_ARGS="$BUILD_DBG_C_ARGS" +BUILD_DBG_LINKER_ARGS="" diff --git a/build_scripts/functions.sh b/build_scripts/functions.sh new file mode 100644 index 0000000..0e09cc3 --- /dev/null +++ b/build_scripts/functions.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +function print { + printf "$1$GRAY" +} + +function clear_dir { + print "${BLUE}clearing $1\n" + rm -rf $1 + mkdir $1 +} + +function compile { + local cmp=$1 + print "${BLUE}compiler: ${GRAY}$cmp\n" + local std=$2 + print "${BLUE}standard: ${GRAY}$std\n" + local warn=$3 + print "${BLUE}warnings: ${GRAY}$warn\n" + local args=$4 + print "${BLUE}args: ${GRAY}$args\n" + local sources=$5 + print "${BLUE}sources: ${GRAY}$sources\n" + local compilation_error=0 + + for srcfile in $sources + do ( + local object="$OBJDIR/$(basename $srcfile).o" + if ! $($cmp -std=$std $warn $args -c -o $object $srcfile) + then + print "${RED}some error happened\n" + compilation_error=1 + fi + ) & done + wait + + if [ $compilation_error != 0 ] + then + exit 1 + fi +} + +# (args, sources) +function compile_c { + print "${CYAN}-------------[compile_c]--------------\n" + compile $CMP_C $STD_C "$WARN_C" "$1" "$2" +} + +# (args, sources) +function compile_cpp { + print "${CYAN}------------[compile_cpp]-------------\n" + compile $CMP_CPP $STD_CPP "$WARN_CPP" "$1" "$2" +} + +# (args, outfile) +function link { + print "${CYAN}----------------[link]----------------\n" + local args=$1 + print "${BLUE}args: ${GRAY}$args\n" + local outfile=$OUTDIR/$2 + print "${BLUE}outfile: ${GRAY}$outfile\n" + local objects="$(find $OBJDIR -name *.o)" + print "${BLUE}objects: ${GRAY}$objects\n" + if $CMP_CPP $args -o $outfile $(echo $objects | tr '\n' ' ') + then + print "${GREEN}file $CYAN$outfile ${GREEN}created\n" + rm -rf $OBJDIR + else + print "${RED}some error happened\n" + exit 1 + fi +} diff --git a/build_scripts/init.sh b/build_scripts/init.sh new file mode 100644 index 0000000..c249b95 --- /dev/null +++ b/build_scripts/init.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +reset +tabs 4 + +source build_scripts/colors.sh +source build_scripts/functions.sh + +if [ ! -f ".config" ]; then + print "${YELLOW}./.config doesn't exists\n" + cp build_scripts/default.config.sh .config + print "${YELLOW}default config created\n" + while true; do + print "${WHITE}continue? (y/n) " + read answ + case $answ in + [Yy] ) break;; + [Nn] ) exit;; + * ) print "${RED}incorrect answer\n";; + esac + done +fi +source .config diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index aa52791..07d5f71 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -25,7 +25,7 @@ Maybe _throw_wrongchar(SharedLexerData* sld){ char* errline=string_extract(line); char* _context=string_extract(context); printf("\n\e[91mwrong char <%c> at [%s:%u:%u %s]\n >>> %s\n", - source[charnum], filename,linenum,charnum,context, errline); + source[charnum], filename,linenum,charnum,_context, errline); exit(96); } #define throw_wrongchar(freeMem) { freeMem; return _throw_wrongchar(sld); } diff --git a/src/lexer/my_type_ext.h b/src/lexer/my_type_ext.h index 748d859..f47ccd9 100644 --- a/src/lexer/my_type_ext.h +++ b/src/lexer/my_type_ext.h @@ -2,6 +2,7 @@ #include "../../../kerep/src/base/base.h" + typedef enum lexer_type{ AutoarrTokenPtr=my_type_last+1 } lexer_type; \ No newline at end of file