build: Don't include <config.h> in native programs when cross-compiling.
[bpt/guile.git] / libguile / macros.c
index b3fea93..fe33e7e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2003, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2003, 2006, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -64,9 +64,9 @@ scm_i_make_primitive_macro (const char *name, scm_t_macro_primitive fn)
 {
   SCM z = scm_words (scm_tc16_macro, 5);
   SCM_SET_SMOB_DATA_N (z, 1, (scm_t_bits)fn);
-  SCM_SET_SMOB_DATA_N (z, 2, scm_from_locale_symbol (name));
-  SCM_SET_SMOB_DATA_N (z, 3, SCM_BOOL_F);
-  SCM_SET_SMOB_DATA_N (z, 4, SCM_BOOL_F);
+  SCM_SET_SMOB_OBJECT_N (z, 2, scm_from_locale_symbol (name));
+  SCM_SET_SMOB_OBJECT_N (z, 3, SCM_BOOL_F);
+  SCM_SET_SMOB_OBJECT_N (z, 4, SCM_BOOL_F);
   return z;
 }
 
@@ -92,8 +92,8 @@ SCM_DEFINE (scm_make_syntax_transformer, "make-syntax-transformer", 3, 0, 0,
       SCM existing_var;
       
       SCM_VALIDATE_SYMBOL (1, name);
-      existing_var = scm_sym2var (name, scm_current_module_lookup_closure (),
-                                  SCM_BOOL_F);
+
+      existing_var = scm_module_variable (scm_current_module (), name);
       if (scm_is_true (existing_var)
           && scm_is_true (scm_variable_bound_p (existing_var))
           && SCM_MACROP (SCM_VARIABLE_REF (existing_var)))
@@ -104,9 +104,9 @@ SCM_DEFINE (scm_make_syntax_transformer, "make-syntax-transformer", 3, 0, 0,
 
   z = scm_words (scm_tc16_macro, 5);
   SCM_SET_SMOB_DATA_N (z, 1, prim);
-  SCM_SET_SMOB_DATA_N (z, 2, name);
-  SCM_SET_SMOB_DATA_N (z, 3, type);
-  SCM_SET_SMOB_DATA_N (z, 4, binding);
+  SCM_SET_SMOB_OBJECT_N (z, 2, name);
+  SCM_SET_SMOB_OBJECT_N (z, 3, type);
+  SCM_SET_SMOB_OBJECT_N (z, 4, binding);
   return z;
 }
 #undef FUNC_NAME
@@ -157,9 +157,8 @@ SCM_DEFINE (scm_macro_transformer, "macro-transformer", 1, 0, 0,
   /* here we rely on knowledge of how psyntax represents macro bindings, but
      hey, there is code out there that calls this function, and expects to get
      a procedure in return... */
-  if (scm_is_pair (SCM_MACRO_BINDING (m))
-      && scm_is_true (scm_procedure_p (scm_car (SCM_MACRO_BINDING (m)))))
-    return scm_car (SCM_MACRO_BINDING (m));
+  if (scm_is_true (scm_procedure_p (SCM_MACRO_BINDING (m))))
+    return SCM_MACRO_BINDING (m);
   else
     return SCM_BOOL_F;
 }
@@ -178,12 +177,46 @@ SCM_DEFINE (scm_macro_binding, "macro-binding", 1, 0, 0,
 #undef FUNC_NAME
 
 
+static SCM syntax_session_id;
+
+#define SESSION_ID_LENGTH      22  /* bytes */
+#define BASE64_RADIX_BITS  6
+#define BASE64_RADIX       (1 << (BASE64_RADIX_BITS))
+#define BASE64_MASK        (BASE64_RADIX - 1)
+
+static SCM
+fresh_syntax_session_id (void)
+{
+  static const char base64[BASE64_RADIX] =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$@";
+
+  unsigned char digit_buf[SESSION_ID_LENGTH];
+  char char_buf[SESSION_ID_LENGTH];
+  size_t i;
+
+  scm_i_random_bytes_from_platform (digit_buf, SESSION_ID_LENGTH);
+  for (i = 0; i < SESSION_ID_LENGTH; ++i)
+    char_buf[i] = base64[digit_buf[i] & BASE64_MASK];
+
+  return scm_from_latin1_stringn (char_buf, SESSION_ID_LENGTH);
+}
+
+static SCM
+scm_syntax_session_id (void)
+{
+  return syntax_session_id;
+}
+
+
 void
 scm_init_macros ()
 {
   scm_tc16_macro = scm_make_smob_type ("macro", 0);
   scm_set_smob_print (scm_tc16_macro, macro_print);
 #include "libguile/macros.x"
+
+  syntax_session_id = fresh_syntax_session_id();
+  scm_c_define_gsubr ("syntax-session-id", 0, 0, 0, scm_syntax_session_id);
 }
 
 /*