* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) Jeremy Harris 2017 */
+/* Copyright (c) Jeremy Harris 1995 - 2018 */
+/* Copyright (c) The Exim Maintainers 2020 */
/* See the file NOTICE for conditions of use and distribution. */
/* Create a static data structure with the predefined macros, to be
#include "exim.h"
#include "macro_predef.h"
-tree_node * tree_macros = NULL;
-unsigned m_number = 1;
+unsigned mp_index = 0;
/* Global dummy variables */
void
builtin_macro_create_var(const uschar * name, const uschar * val)
{
-macro_create(name, val, FALSE);
+printf ("static macro_item p%d = { ", mp_index);
+if (mp_index == 0)
+ printf(".next=NULL,");
+else
+ printf(".next=&p%d,", mp_index-1);
+
+printf(" .command_line=FALSE, .namelen=%d, .replen=%d,"
+ " .name=US\"%s\", .replacement=US\"%s\" };\n",
+ Ustrlen(name), Ustrlen(val), CS name, CS val);
+mp_index++;
}
options_from_list(optionlist * opts, unsigned nopt,
const uschar * section, uschar * group)
{
-int i;
const uschar * s;
-uschar buf[64];
+uschar buf[EXIM_DRIVERNAME_MAX];
/* The 'previously-defined-substring' rule for macros in config file
lines is done thus for these builtin macros: we know that the table
macros that have substrings are always discovered first during
expansion. */
-for (i = 0; i < nopt; i++) if (*(s = US opts[i].name) && *s != '*')
+for (int i = 0; i < nopt; i++) if (*(s = US opts[i].name) && *s != '*')
{
if (group)
spf(buf, sizeof(buf), CUS"_OPT_%T_%T_%T", section, group, s);
#ifdef USE_TCP_WRAPPERS
builtin_macro_create(US"_HAVE_TCPWRAPPERS");
#endif
-#ifdef SUPPORT_TLS
+#ifndef DISABLE_TLS
builtin_macro_create(US"_HAVE_TLS");
# ifdef USE_GNUTLS
builtin_macro_create(US"_HAVE_GNUTLS");
#ifndef DISABLE_DKIM
builtin_macro_create(US"_HAVE_DKIM");
#endif
+#ifdef SUPPORT_DMARC
+ builtin_macro_create(US"_HAVE_DMARC");
+#endif
#ifndef DISABLE_DNSSEC
builtin_macro_create(US"_HAVE_DNSSEC");
#endif
#ifndef DISABLE_OCSP
builtin_macro_create(US"_HAVE_OCSP");
#endif
+#ifndef DISABLE_PIPE_CONNECT
+ builtin_macro_create(US"_HAVE_PIPE_CONNECT");
+#endif
#ifndef DISABLE_PRDR
builtin_macro_create(US"_HAVE_PRDR");
#endif
#ifdef SUPPORT_SPF
builtin_macro_create(US"_HAVE_SPF");
#endif
-#ifdef EXPERIMENTAL_SRS
+#if defined(EXPERIMENTAL_SRS) || defined(EXPERIMENTAL_SRS_NATIVE)
builtin_macro_create(US"_HAVE_SRS");
#endif
+#if defined(EXPERIMENTAL_SRS_NATIVE)
+ builtin_macro_create(US"_HAVE_NATIVE_SRS"); /* beware clash with _HAVE_SRS */
+#endif
+#ifdef EXPERIMENTAL_ARC
+ builtin_macro_create(US"_HAVE_ARC");
+#endif
#ifdef EXPERIMENTAL_BRIGHTMAIL
builtin_macro_create(US"_HAVE_BRIGHTMAIL");
#endif
-#ifdef EXPERIMENTAL_DANE
+#ifdef SUPPORT_DANE
builtin_macro_create(US"_HAVE_DANE");
#endif
#ifdef EXPERIMENTAL_DCC
builtin_macro_create(US"_HAVE_DCC");
#endif
-#ifdef EXPERIMENTAL_DMARC
- builtin_macro_create(US"_HAVE_DMARC");
-#endif
#ifdef EXPERIMENTAL_DSN_INFO
builtin_macro_create(US"_HAVE_DSN_INFO");
#endif
+#ifdef EXPERIMENTAL_TLS_RESUME
+ builtin_macro_create(US"_HAVE_TLS_RESUME");
+#endif
#ifdef LOOKUP_LSEARCH
builtin_macro_create(US"_HAVE_LOOKUP_LSEARCH");
#ifdef LOOKUP_IBASE
builtin_macro_create(US"_HAVE_LOOKUP_IBASE");
#endif
+#ifdef LOOKUP_LDAP
+ builtin_macro_create(US"_HAVE_LOOKUP_JSON");
+#endif
#ifdef LOOKUP_LDAP
builtin_macro_create(US"_HAVE_LOOKUP_LDAP");
#endif
#ifdef WITH_CONTENT_SCAN
features_malware();
#endif
+
+features_crypto();
}
options_routers();
options_transports();
options_auths();
+options_logging();
+#ifndef DISABLE_TLS
+options_tls();
+#endif
}
static void
}
-static unsigned
-macro_dump(macro_item * m)
-{
-int left = 0, right = 0;
-tree_node * t;
-macro_item_64 * m64;
-
-/* fprintf(stderr, "%s %p\n", __FUNCTION__, m); */
-
-if (!m) return 0;
-/* fprintf(stderr, "%s '%s' l %p r %p\n", __FUNCTION__, m->tnode.name, m->tnode.left, m->tnode.left); */
-if ((t = m->tnode.left)) left = macro_dump(tnode_to_mitem(m->tnode.left));
-if ((t = m->tnode.right)) right = macro_dump(tnode_to_mitem(m->tnode.right));
-
-printf ("static macro_item_64 p%u = { ", m->m_number);
-printf(" .command_line=FALSE,"
- " .namelen=%d,"
- " .replen=%d,"
- " .m_number=%u,"
- " .tnode={",
- Ustrlen(m->tnode.name), Ustrlen(m->tnode.data.ptr), m->m_number);
-printf(left ? " .left=&p%d.tnode," : " .left=NULL,", left);
-printf(right ? " .right=&p%d.tnode," : " .right=NULL,", right);
-printf(
- " .data.ptr=\"%s\","
- " .balance=%d,"
- " .name=\"%s\"}};\n",
- CS m->tnode.data.ptr,
- m->tnode.balance,
- CS m->tnode.name);
-
-if (Ustrlen(m->tnode.name) +1 > sizeof(m64->tnode.name))
- {
- printf("#error macro name too long for macro_item_64\n");
- exit(1);
- }
-return m->m_number;
-}
-
-
-
int
main(void)
{
-unsigned idx;
-
printf("#include \"exim.h\"\n");
features();
options();
params();
-idx = macro_dump(tnode_to_mitem(tree_macros));
-printf("tree_node * tree_macros = (tree_node *) &p%u.tnode;\n", idx);
-printf("unsigned m_number = %u;\n", m_number);
+printf("macro_item * macros = &p%d;\n", mp_index-1);
+printf("macro_item * mlast = &p0;\n");
exit(0);
}