From d687b826a302c0aa7123b1f6bebdef3b9a75d443 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 12:00:33 +0700
Subject: [PATCH v3 10/11] Build segscan.c standalone

---
 contrib/seg/.gitignore           |  1 +
 contrib/seg/Makefile             | 15 +++++++++++----
 contrib/seg/segparse.y           |  3 ---
 contrib/seg/segscan.l            | 28 ++++++++++++++++++----------
 src/tools/pginclude/headerscheck |  1 +
 5 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/contrib/seg/.gitignore b/contrib/seg/.gitignore
index 69e73d2096..fa247a4e67 100644
--- a/contrib/seg/.gitignore
+++ b/contrib/seg/.gitignore
@@ -1,3 +1,4 @@
+/segparse.h
 /segparse.c
 /segscan.c
 # Generated subdirectories
diff --git a/contrib/seg/Makefile b/contrib/seg/Makefile
index bb63e83506..c6c134b8f1 100644
--- a/contrib/seg/Makefile
+++ b/contrib/seg/Makefile
@@ -4,7 +4,8 @@ MODULE_big = seg
 OBJS = \
 	$(WIN32RES) \
 	seg.o \
-	segparse.o
+	segparse.o \
+	segscan.o
 
 EXTENSION = seg
 DATA = seg--1.1.sql seg--1.1--1.2.sql seg--1.2--1.3.sql seg--1.3--1.4.sql \
@@ -29,10 +30,16 @@ include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
 
-# segscan is compiled as part of segparse
-segparse.o: segscan.c
+# See notes in src/backend/parser/Makefile about the following two rules
+segparse.h: segparse.c
+	touch $@
+
+segparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+segparse.o segscan.o: segparse.h
 
 distprep: segparse.c segscan.c
 
 maintainer-clean:
-	rm -f segparse.c segscan.c
+	rm -f segparse.h segparse.c segscan.c
diff --git a/contrib/seg/segparse.y b/contrib/seg/segparse.y
index 33e3a9f35f..637eacd1a6 100644
--- a/contrib/seg/segparse.y
+++ b/contrib/seg/segparse.y
@@ -160,6 +160,3 @@ seg_atof(const char *value)
 	datum = DirectFunctionCall1(float4in, CStringGetDatum(value));
 	return DatumGetFloat4(datum);
 }
-
-
-#include "segscan.c"
diff --git a/contrib/seg/segscan.l b/contrib/seg/segscan.l
index 5f6595e9eb..4744fd5e9e 100644
--- a/contrib/seg/segscan.l
+++ b/contrib/seg/segscan.l
@@ -1,8 +1,18 @@
-%{
+%top{
 /*
  * A scanner for EMP-style numeric ranges
  */
+#include "postgres.h"
+
+/*
+ * NB: include segparse.h only AFTER including segdata.h, because segdata.h
+ * contains the definition for SEG.
+ */
+#include "segdata.h"
+#include "segparse.h"
+}
 
+%{
 /* LCOV_EXCL_START */
 
 /* No reason to constrain amount of data slurped */
@@ -21,7 +31,6 @@ fprintf_to_ereport(const char *fmt, const char *msg)
 /* Handles to the buffer that the lexer uses internally */
 static YY_BUFFER_STATE scanbufhandle;
 static char *scanbuf;
-static int	scanbuflen;
 %}
 
 %option 8bit
@@ -42,12 +51,12 @@ float        ({integer}|{real})([eE]{integer})?
 
 %%
 
-{range}      yylval.text = yytext; return RANGE;
-{plumin}     yylval.text = yytext; return PLUMIN;
-{float}      yylval.text = yytext; return SEGFLOAT;
-\<           yylval.text = "<"; return EXTENSION;
-\>           yylval.text = ">"; return EXTENSION;
-\~           yylval.text = "~"; return EXTENSION;
+{range}      seg_yylval.text = yytext; return RANGE;
+{plumin}     seg_yylval.text = yytext; return PLUMIN;
+{float}      seg_yylval.text = yytext; return SEGFLOAT;
+\<           seg_yylval.text = "<"; return EXTENSION;
+\>           seg_yylval.text = ">"; return EXTENSION;
+\~           seg_yylval.text = "~"; return EXTENSION;
 [ \t\n\r\f]+ /* discard spaces */
 .            return yytext[0]; /* alert parser of the garbage */
 
@@ -56,7 +65,7 @@ float        ({integer}|{real})([eE]{integer})?
 /* LCOV_EXCL_STOP */
 
 void
-yyerror(SEG *result, const char *message)
+seg_yyerror(SEG *result, const char *message)
 {
 	if (*yytext == YY_END_OF_BUFFER_CHAR)
 	{
@@ -94,7 +103,6 @@ seg_scanner_init(const char *str)
 	/*
 	 * Make a scan buffer with special termination needed by flex.
 	 */
-	scanbuflen = slen;
 	scanbuf = palloc(slen + 2);
 	memcpy(scanbuf, str, slen);
 	scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index a778067570..203703afa7 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -116,6 +116,7 @@ do
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
 	test "$f" = contrib/cube/cubeparse.h && continue
+	test "$f" = contrib/seg/segparse.h && continue
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-- 
2.36.1

