+ * We need this to be separate from elog_finish because there's no other
+ * portable way to deal with inserting extra arguments into the elog call.
+ * (If macros with variable numbers of arguments were portable, it'd be
+ * easy, but they aren't.)
+ */
+void
+elog_start(const char *filename, int lineno, const char *funcname)
+{
+ ErrorData *edata;
+
+ if (++errordata_stack_depth >= ERRORDATA_STACK_SIZE)
+ {
+ /*
+ * Wups, stack not big enough. We treat this as a PANIC condition
+ * because it suggests an infinite loop of errors during error
+ * recovery.
+ */
+ errordata_stack_depth = -1; /* make room on stack */
+ ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));
+ }
+
+ edata = &errordata[errordata_stack_depth];
+ edata->filename = filename;
+ edata->lineno = lineno;
+ edata->funcname = funcname;
+ /* errno is saved now so that error parameter eval can't change it */
+ edata->saved_errno = errno;
+}
+
+/*
+ * elog_finish --- finish up for old-style API