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.sh265
1 files changed, 265 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..f6af3aa80d4
--- /dev/null
+++ b/src/backend/utils/Gen_fmgrtab.sh
@@ -0,0 +1,265 @@
+#!/bin/sh
+#-------------------------------------------------------------------------
+#
+# Gen_fmgrtab.sh--
+# shell script to generate fmgr.h and fmgrtab.c from pg_proc.h
+#
+# Copyright (c) 1994, Regents of the University of California
+#
+#
+# IDENTIFICATION
+# $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh,v 1.1.1.1 1996/07/09 06:22:00 scrappy Exp $
+#
+# NOTES
+# Passes any -D options on to cpp prior to generating the list
+# of internal functions. These come from BKIOPTS.
+#
+#-------------------------------------------------------------------------
+
+# cpp is usually in one of these places...
+PATH=/usr/lib:/lib:/usr/ccs/lib:$PATH
+
+BKIOPTS=''
+if [ $? != 0 ]
+then
+ echo `basename $0`: Bad option
+ exit 1
+fi
+
+#
+# Pass on any -D declarations, throwing away any other command
+# line switches.
+#
+for opt in $*
+do
+ case $opt in
+ -D) BKIOPTS="$BKIOPTS -D$2"; shift; shift;;
+ -D*) BKIOPTS="$BKIOPTS $1";shift;;
+ --) shift; break;;
+ -*) shift;;
+ esac
+done
+
+INFILE=$1
+RAWFILE=fmgr.raw
+HFILE=fmgr.h
+TABCFILE=fmgrtab.c
+
+#
+# Generate the file containing raw pg_proc tuple data
+# (but only for "internal" 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; }' | \
+cpp $BKIOPTS | \
+egrep '^[0-9]' | \
+sort -n > $RAWFILE
+
+#
+# Generate fmgr.h
+#
+cat > $HFILE <<FuNkYfMgRsTuFf
+/*-------------------------------------------------------------------------
+ *
+ * $HFILE--
+ * Definitions for using internal procedures.
+ *
+ *
+ * Copyright (c) 1994, Regents of the University of California
+ *
+ * $Id: Gen_fmgrtab.sh,v 1.1.1.1 1996/07/09 06:22:00 scrappy Exp $
+ *
+ * NOTES
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by $0
+ * from $1
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef FMGR_H
+#define FMGR_H
+
+#include "postgres.h" /* for some prototype typedefs */
+
+/*
+ * Maximum number of arguments for a built-in function.
+ *
+ * XXX note that you cannot call a function with more than 8
+ * arguments from the user level since the catalogs only
+ * store 8 argument type values for type-checking ...
+ */
+#define MAXFMGRARGS 9
+
+typedef struct {
+ char *data[MAXFMGRARGS];
+} FmgrValues;
+
+/*
+ * defined in fmgr.c
+ */
+extern char *fmgr_c(func_ptr user_fn, Oid func_id, int n_arguments,
+ FmgrValues *values, bool *isNull);
+extern void fmgr_info(Oid procedureId, func_ptr *function, int *nargs);
+extern char *fmgr(Oid procedureId, ... );
+extern char *fmgr_ptr(func_ptr user_fn, Oid func_id, ... );
+extern char *fmgr_array_args(Oid procedureId, int nargs,
+ char *args[], bool *isNull);
+
+/*
+ * defined in dfmgr.c
+ */
+extern func_ptr fmgr_dynamic(Oid procedureId, int *pronargs);
+extern void load_file(char *filename);
+
+
+/*
+ * For performance reasons, we often want to simply jump through a
+ * a function pointer (if it's valid, that is). These calls have
+ * been macroized so we can run them through a routine that does
+ * sanity-checking (and so we can track them down more easily when
+ * we must).
+ */
+#ifdef TRACE_FMGR_PTR
+#define FMGR_PTR2(FP, FID, ARG1, ARG2) \
+ fmgr_ptr(FP, FID, 2, ARG1, ARG2)
+#else
+#define FMGR_PTR2(FP, FID, ARG1, ARG2) \
+ ((FP) ? (*((func_ptr)(FP)))(ARG1, ARG2) : fmgr(FID, ARG1, ARG2))
+#endif
+
+/*
+ * Flags for the builtin oprrest selectivity routines.
+ */
+#define SEL_CONSTANT 1 /* constant does not vary (not a parameter) */
+#define SEL_RIGHT 2 /* constant appears to right of operator */
+
+FuNkYfMgRsTuFf
+awk '{ print $2, $1; }' $RAWFILE | \
+tr '[a-z]' '[A-Z]' | \
+sed -e 's/^/#define F_/' >> $HFILE
+cat >> $HFILE <<FuNkYfMgRsTuFf
+
+#endif /* FMGR_H */
+FuNkYfMgRsTuFf
+
+#
+# Generate fmgr function table file.
+#
+# Print out the bogus function declarations, then the table that
+# refers to them.
+#
+cat > $TABCFILE <<FuNkYfMgRtAbStUfF
+/*-------------------------------------------------------------------------
+ *
+ * $TABCFILE--
+ * The function manager's table of internal functions.
+ *
+ * Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh,v 1.1.1.1 1996/07/09 06:22:00 scrappy Exp $
+ *
+ * NOTES
+ *
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by $0
+ * from $1
+ *
+ * We lie here to cc about the return type and arguments of the
+ * builtin functions; all ld cares about is the fact that it
+ * will need to resolve an external function reference.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef WIN32
+#include <limits.h>
+#else
+# if defined(PORTNAME_BSD44_derived) || defined(PORTNAME_bsdi)
+# include <machine/limits.h>
+# define MAXINT INT_MAX
+# else
+# include <values.h> /* for MAXINT */
+# endif /* PORTNAME_BSD44_derived || PORTNAME_bsdi */
+#endif /* WIN32 */
+
+#include "utils/fmgrtab.h"
+
+FuNkYfMgRtAbStUfF
+awk '{ print "extern char *" $2 "();"; }' $RAWFILE >> $TABCFILE
+cat >> $TABCFILE <<FuNkYfMgRtAbStUfF
+
+static FmgrCall fmgr_builtins[] = {
+FuNkYfMgRtAbStUfF
+awk '{ printf (" {%d , %d , %s, \"%s\" },\n"), $1, $8, $2, $2 }' $RAWFILE >> $TABCFILE
+cat >> $TABCFILE <<FuNkYfMgRtAbStUfF
+ /* guardian value */
+#ifndef WIN32
+ { MAXINT, 0, (func_ptr) NULL }
+#else
+ { INT_MAX, 0, (func_ptr) NULL }
+#endif /* WIN32 */
+};
+
+static int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrCall)) - 1;
+
+FmgrCall *fmgr_isbuiltin(Oid id)
+{
+ register int i;
+ int low = 0;
+ int high = fmgr_nbuiltins;
+
+ low = 0;
+ high = fmgr_nbuiltins;
+ while (low <= high) {
+ i = low + (high - low) / 2;
+ if (id == fmgr_builtins[i].proid)
+ break;
+ else if (id > fmgr_builtins[i].proid)
+ low = i + 1;
+ else
+ high = i - 1;
+ }
+ if (id == fmgr_builtins[i].proid)
+ return(&fmgr_builtins[i]);
+ return((FmgrCall *) NULL);
+}
+
+func_ptr fmgr_lookupByName(char *name)
+{
+ int i;
+ for (i=0;i<fmgr_nbuiltins;i++) {
+ if (strcmp(name,fmgr_builtins[i].funcName) == 0)
+ return(fmgr_builtins[i].func);
+ }
+ return((func_ptr) NULL);
+}
+
+FuNkYfMgRtAbStUfF
+
+rm -f $RAWFILE
+
+# ----------------
+# all done
+# ----------------
+exit 0