aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/Gen_fmgrtab.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/Gen_fmgrtab.sh')
-rw-r--r--src/backend/utils/Gen_fmgrtab.sh267
1 files changed, 267 insertions, 0 deletions
diff --git a/src/backend/utils/Gen_fmgrtab.sh b/src/backend/utils/Gen_fmgrtab.sh
new file mode 100644
index 00000000000..12b36264262
--- /dev/null
+++ b/src/backend/utils/Gen_fmgrtab.sh
@@ -0,0 +1,267 @@
+#! /bin/sh
+#-------------------------------------------------------------------------
+#
+# Gen_fmgrtab.sh
+# shell script to generate fmgroids.h and fmgrtab.c from pg_proc.h
+#
+# Portions Copyright (c) 1996-2000, PostgreSQL, Inc
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+#
+# IDENTIFICATION
+# $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh,v 1.15 2000/07/01 21:16:44 petere Exp $
+#
+#-------------------------------------------------------------------------
+
+CMDNAME=`basename $0`
+
+: ${AWK='awk'}
+: ${CPP='cc -E'}
+
+cleanup(){
+ [ x"$noclean" != x"t" ] && rm -f "$CPPTMPFILE" "$RAWFILE"
+}
+
+BKIOPTS=
+noclean=
+
+#
+# Process command line switches.
+#
+while [ $# -gt 0 ]
+do
+ case $1 in
+ -D)
+ BKIOPTS="$BKIOPTS -D$2"
+ ;;
+ -D*)
+ BKIOPTS="$BKIOPTS $1"
+ shift;;
+ --noclean)
+ noclean=t
+ ;;
+ --help)
+ echo "$CMDNAME generates fmgroids.h and fmgrtab.c from pg_proc.h."
+ echo
+ echo "Usage:"
+ echo " $CMDNAME [ -D define [...] ]"
+ echo
+ echo "The environment variables CPP and AWK determine which C"
+ echo "preprocessor and Awk program to use. The defaults are"
+ echo "\`cc -E' and \`awk'."
+ echo
+ echo "Report bugs to <pgsql-bugs@postgresql.org>."
+ exit 0
+ ;;
+ --) shift; break;;
+ -*)
+ echo "$CMDNAME: invalid option: $1"
+ exit 1
+ ;;
+ *)
+ INFILE=$1
+ esac
+ shift
+done
+
+
+if [ x"$INFILE" = x ] ; then
+ echo "$CMDNAME: no input file"
+ exit 1
+fi
+
+CPPTMPFILE=fmgrtmp.c
+RAWFILE=fmgr.raw
+OIDSFILE=fmgroids.h
+TABLEFILE=fmgrtab.c
+
+
+trap 'echo "Caught signal." ; cleanup ; exit 1' 1 2 3 15
+
+
+#
+# Generate the file containing raw pg_proc tuple data
+# (but only for "internal" and "newinternal" language procedures...).
+#
+# Unlike genbki.sh, which can run through cpp last, we have to
+# deal with preprocessor statements first (before we sort the
+# function table by oid).
+#
+$AWK '
+BEGIN { raw = 0; }
+/^DATA/ { print; next; }
+/^BKI_BEGIN/ { raw = 1; next; }
+/^BKI_END/ { raw = 0; next; }
+raw == 1 { print; next; }' $INFILE | \
+sed -e 's/^.*OID[^=]*=[^0-9]*//' \
+ -e 's/(//g' \
+ -e 's/[ ]*).*$//' | \
+$AWK '
+/^#/ { print; next; }
+$4 == "11" { print; next; }
+$4 == "12" { print; next; }' > $CPPTMPFILE
+
+if [ $? -ne 0 ]; then
+ cleanup
+ echo "$CMDNAME failed"
+ exit 1
+fi
+
+$CPP $BKIOPTS $CPPTMPFILE | \
+egrep '^[0-9]' | \
+sort -n > $RAWFILE
+
+if [ $? -ne 0 ]; then
+ cleanup
+ echo "$CMDNAME failed"
+ exit 1
+fi
+
+
+cpp_define=`echo $OIDSFILE | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | sed -e 's/[^A-Z]/_/g'`
+
+#
+# Generate fmgroids.h
+#
+cat > "$OIDSFILE" <<FuNkYfMgRsTuFf
+/*-------------------------------------------------------------------------
+ *
+ * $OIDSFILE
+ * Macros that define the OIDs of built-in functions.
+ *
+ * These macros can be used to avoid a catalog lookup when a specific
+ * fmgr-callable function needs to be referenced.
+ *
+ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by $CMDNAME
+ * from $INFILE
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef $cpp_define
+#define $cpp_define
+
+/*
+ * Constant macros for the OIDs of entries in pg_proc.
+ *
+ * NOTE: macros are named after the prosrc value, ie the actual C name
+ * of the implementing function, not the proname which may be overloaded.
+ * For example, we want to be able to assign different macro names to both
+ * char_text() and int4_text() even though these both appear with proname
+ * 'text'. If the same C function appears in more than one pg_proc entry,
+ * its equivalent macro will be defined with the lowest OID among those
+ * entries.
+ */
+FuNkYfMgRsTuFf
+
+tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' < $RAWFILE | \
+$AWK '
+BEGIN { OFS = ""; }
+ { if (seenit[$(NF-1)]++ == 0) print "#define F_", $(NF-1), " ", $1; }' >> "$OIDSFILE"
+
+if [ $? -ne 0 ]; then
+ cleanup
+ echo "$CMDNAME failed"
+ exit 1
+fi
+
+cat >> "$OIDSFILE" <<FuNkYfMgRsTuFf
+
+#endif /* $cpp_define */
+FuNkYfMgRsTuFf
+
+#
+# Generate fmgr's built-in-function table.
+#
+# Print out the function declarations, then the table that refers to them.
+# NB: the function declarations are bogus in the case of old-style functions,
+# although they should be correct for new-style. Therefore we need to compile
+# this table definition as a separate C file that won't need to include any
+# "real" declarations for those functions!
+#
+cat > "$TABLEFILE" <<FuNkYfMgRtAbStUfF
+/*-------------------------------------------------------------------------
+ *
+ * $TABLEFILE
+ * The function manager's table of internal functions.
+ *
+ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ *
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by $CMDNAME
+ * from $INFILE
+ *
+ * We lie here to cc about the return type and arguments of old-style
+ * builtin functions; all ld cares about is the fact that it
+ * will need to resolve an external function reference.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/fmgrtab.h"
+
+FuNkYfMgRtAbStUfF
+
+$AWK '{ print "extern Datum", $(NF-1), "(PG_FUNCTION_ARGS);"; }' $RAWFILE >> "$TABLEFILE"
+
+if [ $? -ne 0 ]; then
+ cleanup
+ echo "$CMDNAME failed"
+ exit 1
+fi
+
+
+cat >> "$TABLEFILE" <<FuNkYfMgRtAbStUfF
+
+const FmgrBuiltin fmgr_builtins[] = {
+FuNkYfMgRtAbStUfF
+
+# Note: using awk arrays to translate from pg_proc values to fmgrtab values
+# may seem tedious, but avoid the temptation to write a quick x?y:z
+# conditional expression instead. Not all awks have conditional expressions.
+
+$AWK 'BEGIN {
+ Strict["t"] = "true"
+ Strict["f"] = "false"
+ OldStyle["11"] = "true"
+ OldStyle["12"] = "false"
+}
+{ printf (" { %d, \"%s\", %d, %s, %s, %s },\n"), \
+ $1, $(NF-1), $9, Strict[$8], OldStyle[$4], $(NF-1)
+}' $RAWFILE >> "$TABLEFILE"
+
+if [ $? -ne 0 ]; then
+ cleanup
+ echo "$CMDNAME failed"
+ exit 1
+fi
+
+cat >> "$TABLEFILE" <<FuNkYfMgRtAbStUfF
+ /* dummy entry is easier than getting rid of comma after last real one */
+ /* (not that there has ever been anything wrong with *having* a
+ comma after the last field in an array initializer) */
+ { 0, NULL, 0, false, false, (PGFunction) NULL }
+};
+
+/* Note fmgr_nbuiltins excludes the dummy entry */
+const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)) - 1;
+
+FuNkYfMgRtAbStUfF
+
+cleanup
+exit 0