changeset 1171:7d84776f902e

irccd: make lex/yacc more POSIX, closes #2538 @1h
author David Demelier <markand@malikania.fr>
date Thu, 28 Apr 2022 09:23:15 +0200
parents 16edffa8921b
children c958d796e771
files irccd/CMakeLists.txt irccd/conf.y irccd/lex.l
diffstat 3 files changed, 49 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/irccd/CMakeLists.txt	Sun Mar 06 11:07:37 2022 +0100
+++ b/irccd/CMakeLists.txt	Thu Apr 28 09:23:15 2022 +0200
@@ -64,16 +64,40 @@
 	)
 endif ()
 
-find_package(BISON REQUIRED)
-find_package(FLEX REQUIRED)
-find_package(Threads REQUIRED)
+find_program(LEX_EXECUTABLE lex flex)
+find_program(YACC_EXECUTABLE yacc bison)
+
+if (NOT LEX_EXECUTABLE)
+	message(FATAL_ERROR "No lex/flex tool available")
+endif ()
+if (NOT YACC_EXECUTABLE)
+	message(FATAL_ERROR "No yacc/bison tool available")
+endif ()
 
-bison_target(yacc ${irccd_SOURCE_DIR}/conf.y
-	${irccd_BINARY_DIR}/conf.c
-	DEFINES_FILE ${irccd_BINARY_DIR}/conf.h
+add_custom_command(
+	OUTPUT
+		${irccd_BINARY_DIR}/conf.tab.c
+		${irccd_BINARY_DIR}/conf.tab.h
+	DEPENDS ${irccd_SOURCE_DIR}/conf.y
+	COMMAND ${YACC_EXECUTABLE} -b conf -d ${irccd_SOURCE_DIR}/conf.y
+	WORKING_DIRECTORY ${irccd_BINARY_DIR}
 )
-flex_target(lex ${irccd_SOURCE_DIR}/lex.l ${irccd_BINARY_DIR}/lex.c)
-add_flex_bison_dependency(lex yacc)
+
+add_custom_command(
+	OUTPUT ${irccd_BINARY_DIR}/lex.yy.c
+	DEPENDS
+		${irccd_SOURCE_DIR}/lex.l
+		${irccd_BINARY_DIR}/conf.tab.h
+	COMMAND ${LEX_EXECUTABLE} ${irccd_SOURCE_DIR}/lex.l
+	WORKING_DIRECTORY ${irccd_BINARY_DIR}
+)
+
+if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
+	set_property(
+		SOURCE ${irccd_BINARY_DIR}/lex.yy.c
+		PROPERTY COMPILE_OPTIONS -Wno-unused-function
+	)
+endif ()
 
 if (IRCCD_WITH_HTTP AND IRCCD_WITH_JS)
 	find_package(CURL REQUIRED)
@@ -88,12 +112,14 @@
 # libirccd-static
 # -------------------------------------------------------------------
 #
+find_package(Threads REQUIRED)
+
 add_library(
 	irccd-static OBJECT
 	${SOURCES}
-	${irccd_BINARY_DIR}/lex.c
-	${irccd_BINARY_DIR}/conf.c
-	${irccd_BINARY_DIR}/conf.h
+	${irccd_BINARY_DIR}/lex.yy.c
+	${irccd_BINARY_DIR}/conf.tab.c
+	${irccd_BINARY_DIR}/conf.tab.h
 )
 target_include_directories(irccd-static
 	PRIVATE $<BUILD_INTERFACE:${irccd_SOURCE_DIR}>
--- a/irccd/conf.y	Sun Mar 06 11:07:37 2022 +0100
+++ b/irccd/conf.y	Thu Apr 28 09:23:15 2022 +0200
@@ -697,6 +697,12 @@
 	irc_util_die("%s:%d: %s\n", confpath, yylineno, err);
 }
 
+int
+yywrap(void)
+{
+	return 1;
+}
+
 void
 config_open(const char *path)
 {
--- a/irccd/lex.l	Sun Mar 06 11:07:37 2022 +0100
+++ b/irccd/lex.l	Thu Apr 28 09:23:15 2022 +0200
@@ -16,11 +16,6 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-%option noyywrap
-%option nounput
-%option noinput
-%option yylineno
-
 %{
 
 #include <sys/types.h>
@@ -28,7 +23,9 @@
 #include <irccd/limits.h>
 #include <irccd/rule.h>
 
-#include "conf.h"
+#include "conf.tab.h"
+
+int yylineno;
 
 void
 yyerror(const char *);
@@ -72,7 +69,8 @@
 comma           ,
 semicolon       ;
 
-ws              [ \t\n]+
+ws              [ \t]+
+nl              \n
 comment         #.*$
 number          [0-9]+
 word            [A-Za-z_][^{};,"\r\n\t ]*
@@ -82,6 +80,7 @@
 %%
 
 {ws}                    ;
+{nl}                    yylineno++;
 {comment}               ;
 
 {brace_close}           return T_BRACE_CLOSE;