################################################################################
# dpuser2c-parser/lex Makefile
################################################################################

MV         = mv
RM         = rm -f
SED        = sed

ifeq ($(PLATFORM), WIN)
   # didn't manage to do this as onliner like in the unix-case, pipe doesn't work...
   ARCH := $(shell wmic os get osarchitecture)
   $(shell @echo $(ARCH) > _bbb.txt)
   ARCH := $(shell sed  -e "s/OSArchitecture//g" -e "s/ //g" -e "s/-bit//g" -e "s/-Bit//g" _bbb.txt)
   $(shell del _bbb.txt)
   
   YACC           = ..\..\bin\WIN$(ARCH)\yacc.exe
   LEX            = ..\..\bin\WIN$(ARCH)\flex.exe
   SED_INPLACE    = ..\..\bin\WIN$(ARCH)\sed.exe -i''
   MV             = ren
   RM             = del
   SED_STRING = $(SED_INPLACE) 's/file ? (isatty/0;\/\/file ? (isatty/g' lex.dpuser2c.cpp
else
   ifeq ($(shell uname -m), x86_64)
      ARCH = 64
   else
      ARCH = 32
   endif

   ifeq ($(PLATFORM), LINUX)
      YACC        = ../../bin/LINUX$(ARCH)/yacc
      LEX         = flex -l
      SED_INPLACE = sed -i''
   endif
   ifeq ($(PLATFORM), MACOSX)
      YACC        = yacc
      LEX         = flex -l
      SED_INPLACE = sed -i ''
   endif
   SED_STRING = $(SED_INPLACE) 's/extern int isatty/\/\/extern int isatty/g' lex.dpuser2c.cpp
endif

################################################################################
##### creates parser and lexer #####
dpuser2c-parser: y.dpuser2c.cpp lex.dpuser2c.cpp

y.dpuser2c.cpp: dpuser2c.y
	$(YACC) -d $<
	$(MV) y.tab.c y.dpuser2c.cpp

lex.dpuser2c.cpp: dpuser2c.l
	$(LEX) $<
	$(MV) lex.yy.c lex.dpuser2c.cpp
# all occurences of yy and YY are replaced with dpuser2c and DPUSER2C, because the lex.yy.cpp uses the same names -> error when linking
	$(SED_INPLACE) "s/yy/dpuser2c/g" y.dpuser2c.cpp lex.dpuser2c.cpp y.tab.h
	$(SED_INPLACE) "s/YY/DPUSER2C/g" y.dpuser2c.cpp lex.dpuser2c.cpp y.tab.h
# resolve the isatty problem (then-part= LINUX/MAC, else-part: WIN)
	$(SED_INPLACE) "s/extern int isatty/\/\/extern int isatty/g" lex.dpuser2c.cpp
	$(SED_STRING)

################################################################################
# creates dpuser2c.h
#
# each sed-command works on one headerfile
# each sed-command has several sub-commands starting with -e
#    1st sub-command: strip data from beginning until 'BEGIN PARSE FOR DPUSER2C'-keysentence
#    2nd sub-command: strip data from 'END PARSE FOR DPUSER2C'-keysentence to the end
#    3rd sub-command: remove lines with comments (//)
#    4th sub-command: replace " with \" 
#    5th sub-command: insert " at the beginning of each line
#    6th sub-command: insert ", at the end of each line
header: dpuser2c.h

ifeq ($(PLATFORM), WIN)
dpuser2c.h: ../../utils/dpstring.h ../dpuser.h dpuserType.h functions.h procedures.h
	@echo char *header_str[] = { > dpuser2c.h
	$(SED) -e "1,/BEGIN PARSE FOR DPUSER2C/d" -e "/END PARSE FOR DPUSER2C/,$$d" -e "/^\/\//d" -e "s/\x22/\\\x22/g" -e "s/^/\x22 /" -e "s/$$/\x22,/" ../../utils/dpstring.h >> dpuser2c.h
	$(SED) -e "1,/BEGIN PARSE FOR DPUSER2C/d" -e "/END PARSE FOR DPUSER2C/,$$d" -e "/^\/\//d" -e "s/\x22/\\\x22/g" -e "s/^/\x22 /" -e "s/$$/\x22,/" ../dpuser.h >> dpuser2c.h
	$(SED) -e "1,/BEGIN PARSE FOR DPUSER2C/d" -e "/END PARSE FOR DPUSER2C/,$$d" -e "/^\/\//d" -e "s/\x22/\\\x22/g" -e "s/^/\x22 /" -e "s/$$/\x22,/" dpuserType.h >> dpuser2c.h
	$(SED) -e "1,/BEGIN PARSE FOR DPUSER2C/d" -e "/END PARSE FOR DPUSER2C/,$$d" -e "/^\/\//d" -e "s/\x22/\\\x22/g" -e "s/^/\x22 /" -e "s/$$/\x22,/" functions.h >> dpuser2c.h
	$(SED) -e "1,/BEGIN PARSE FOR DPUSER2C/d" -e "/END PARSE FOR DPUSER2C/,$$d" -e "/^\/\//d" -e "s/\x22/\\\x22/g" -e "s/^/\x22 /" -e "s/$$/\x22,/" procedures.h >> dpuser2c.h
	@echo "", >> dpuser2c.h
	@echo "" >> dpuser2c.h
	@echo }; >> dpuser2c.h
else
dpuser2c.h: ../../utils/dpstring.h ../dpuser.h dpuserType.h functions.h procedures.h
	@echo "char *header_str[] = {" > dpuser2c.h
	$(SED) -e '1,/BEGIN PARSE FOR DPUSER2C/d' -e '/END PARSE FOR DPUSER2C/,$$d' -e '/^\/\//d' -e 's/"/\\"/g' -e 's/^/" /' -e 's/$$/",/' ../../utils/dpstring.h >> dpuser2c.h
	$(SED) -e '1,/BEGIN PARSE FOR DPUSER2C/d' -e '/END PARSE FOR DPUSER2C/,$$d' -e '/^\/\//d' -e 's/"/\\"/g' -e 's/^/" /' -e 's/$$/",/' ../dpuser.h >> dpuser2c.h
	$(SED) -e '1,/BEGIN PARSE FOR DPUSER2C/d' -e '/END PARSE FOR DPUSER2C/,$$d' -e '/^\/\//d' -e 's/"/\\"/g' -e 's/^/" /' -e 's/$$/",/' dpuserType.h >> dpuser2c.h
	$(SED) -e '1,/BEGIN PARSE FOR DPUSER2C/d' -e '/END PARSE FOR DPUSER2C/,$$d' -e '/^\/\//d' -e 's/"/\\"/g' -e 's/^/" /' -e 's/$$/",/' functions.h >> dpuser2c.h
	$(SED) -e '1,/BEGIN PARSE FOR DPUSER2C/d' -e '/END PARSE FOR DPUSER2C/,$$d' -e '/^\/\//d' -e 's/"/\\"/g' -e 's/^/" /' -e 's/$$/",/' procedures.h >> dpuser2c.h
	@echo \"\", >> dpuser2c.h
	@echo \"\" >> dpuser2c.h
	@echo "};" >> dpuser2c.h
endif 

clean:
	$(RM) y.dpuser2c.cpp lex.dpuser2c.cpp y.tab.h y.tab.c lex.yy.c dpuser2c.h
