Builtin macros for sha3-hash and ed25519-signing support
[exim.git] / src / src / macro_predef.c
index 502bfc7ee8dd7f8f713b0baa97a8ed6df748acb2..2485072f4edd3272be89612957fe4f70ff0def13 100644 (file)
@@ -11,7 +11,8 @@ included in the main Exim build */
 #include "exim.h"
 #include "macro_predef.h"
 
-unsigned mp_index = 0;
+tree_node * tree_macros = NULL;
+unsigned m_number = 1;
 
 /* Global dummy variables */
 
@@ -20,19 +21,21 @@ uschar * syslog_facility_str;
 
 /******************************************************************************/
 
+void
+builtin_macro_create_var(const uschar * name, const uschar * val)
+{
+macro_create(name, val, FALSE);
+}
+
+
 void
 builtin_macro_create(const uschar * name)
 {
-printf ("static macro_item p%d = { ", mp_index);
-if (mp_index == 0)
-  printf("NULL,");
-else
-  printf("&p%d,", mp_index-1);
-
-printf(" FALSE, %d, 1, US\"%s\", US\"y\" };\n", Ustrlen(name), CS name);
-mp_index++;
+builtin_macro_create_var(name, US"y");
 }
 
+
+/* restricted snprintf */
 void
 spf(uschar * buf, int len, const uschar * fmt, ...)
 {
@@ -163,7 +166,7 @@ due to conflicts with other common macros. */
 #ifdef EXPERIMENTAL_LMDB
   builtin_macro_create(US"_HAVE_LMDB");
 #endif
-#ifdef EXPERIMENTAL_SPF
+#ifdef SUPPORT_SPF
   builtin_macro_create(US"_HAVE_SPF");
 #endif
 #ifdef EXPERIMENTAL_SRS
@@ -251,6 +254,12 @@ due to conflicts with other common macros. */
   builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MBX");
 # endif
 #endif
+
+#ifdef WITH_CONTENT_SCAN
+features_malware();
+#endif
+
+features_crypto();
 }
 
 
@@ -263,15 +272,68 @@ options_transports();
 options_auths();
 }
 
+static void
+params(void)
+{
+#ifndef DISABLE_DKIM
+params_dkim();
+#endif
+}
+
+
+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();
 
-printf("macro_item * macros = &p%d;\n", mp_index-1);
-printf("macro_item * mlast = &p0;\n");
+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);
 exit(0);
 }