(cos_retain_symbol): Don't retain recursively.
[chise/concord.git] / symbol.c
index bf544f7..bf6f2ce 100644 (file)
--- a/symbol.c
+++ b/symbol.c
@@ -25,6 +25,37 @@ unsigned long cos_hash_c_string_n (const unsigned char *ptr, size_t size);
 unsigned long cos_symbol_hash_string (COS_String string);
 
 
+COS_String_ent cos_string_ent_nil = { {COS_OBJECT_PREFIX_OBJECT,
+                                      COS_Object_Type_String,
+                                      1},
+                                     3, "nil"};
+
+COS_Symbol_ent cos_symbol_ent_nil = { {COS_OBJECT_PREFIX_OBJECT,
+                                      COS_Object_Type_Symbol,
+                                      1},
+                                     &cos_string_ent_nil,
+                                     NULL};
+
+COS_Symbol cos_Qnil = &cos_symbol_ent_nil;
+
+
+COS_String_ent cos_string_ent_t = { {COS_OBJECT_PREFIX_OBJECT,
+                                    COS_Object_Type_String,
+                                    1},
+                                   1, "t"};
+
+COS_Symbol_ent cos_symbol_ent_t = { {COS_OBJECT_PREFIX_OBJECT,
+                                    COS_Object_Type_Symbol,
+                                    1},
+                                   &cos_string_ent_t,
+                                   NULL};
+
+COS_Symbol cos_Qt = &cos_symbol_ent_t;
+
+
+COS_Symbol_Table cos_default_symbol_table = NULL;
+
+
 COS_Symbol
 cos_make_symbol (COS_String string)
 {
@@ -35,10 +66,19 @@ cos_make_symbol (COS_String string)
 
   obj->name = string;
   obj->value = NULL;
+  cos_retain_object (string);
   return obj;
 }
 
 int
+cos_retain_symbol (COS_Object obj)
+{
+  //cos_retain_object (((COS_Symbol)obj)->value);
+  //cos_retain_object (((COS_Symbol)obj)->name);
+  return 0;
+}
+
+int
 cos_release_symbol (COS_Object obj)
 {
   if (obj == NULL)
@@ -52,6 +92,12 @@ cos_release_symbol (COS_Object obj)
   return 0;
 }
 
+int
+cos_symbol_p (COS_object obj)
+{
+  return COS_OBJECT_SYMBOL_P (obj);
+}
+
 COS_Symbol
 cos_symbol_table_intern (COS_Symbol_Table table, COS_object name)
 {
@@ -83,10 +129,13 @@ cos_symbol_table_intern (COS_Symbol_Table table, COS_object name)
          table->data[i] = entry;
          return entry;
        }
-      else if ( (entry->name->size == key_string->size)
+      else if ( COS_OBJECT_SYMBOL_P (entry)
+               && COS_OBJECT_STRING_P (entry->name)
+               && (entry->name->size == key_string->size)
                && (memcmp (entry->name->data,
                            key_string->data, key_string->size) == 0) )
        {
+         cos_retain_object ((COS_object)entry);
          return entry;
        }
     }
@@ -102,8 +151,6 @@ cos_symbol_name (COS_Symbol symbol)
 }
 
 
-COS_Symbol_Table cos_default_symbol_table = NULL;
-
 COS_Symbol_Table cos_make_symbol_table_0 (size_t size);
 void cos_destroy_symbol_table_0 (COS_Symbol_Table hash);
 
@@ -196,8 +243,11 @@ COS_Symbol
 cos_intern (COS_object name)
 {
   if (cos_default_symbol_table == NULL)
-    cos_default_symbol_table = cos_make_symbol_table();
-
+    {
+      cos_default_symbol_table = cos_make_symbol_table();
+      cos_symbol_table_set (cos_default_symbol_table, cos_Qnil);
+      cos_symbol_table_set (cos_default_symbol_table, cos_Qt);
+    }
   return cos_symbol_table_intern (cos_default_symbol_table, name);
 }
 
@@ -232,6 +282,26 @@ cos_symbol_table_set (COS_Symbol_Table table, COS_Symbol symbol)
 }
 
 int
+cos_print_symbol_table (COS_Symbol_Table table)
+{
+  int i;
+  COS_Symbol entry;
+
+  if (table == NULL)
+    table = cos_default_symbol_table;
+
+  printf ("#[symbol_table %lX\tsize = %d", table->size);
+  for (i = 0; i < table->size; i++)
+    {
+      entry = table->data[i];
+      printf ("\n\t%d : ", i);
+      cos_print_object (entry);
+    }
+  printf ("\t]\n");
+  return 0;
+}
+
+int
 cos_symbol_table_grow (COS_Symbol_Table table)
 {
   COS_Symbol_Table new_table
@@ -242,6 +312,8 @@ cos_symbol_table_grow (COS_Symbol_Table table)
   if (new_table == NULL)
     return -1;
 
+  //printf ("\n(old table is ");
+  //cos_print_symbol_table (table);
   for (i = 0; i < table->size; i++)
     {
       COS_Symbol entry = table->data[i];
@@ -257,8 +329,12 @@ cos_symbol_table_grow (COS_Symbol_Table table)
            }
        }
     }
+  free (table->data);
   table->size = new_table->size;
   table->data = new_table->data;
   free (new_table);
+  //printf ("\t)\n(new table is ");
+  //cos_print_symbol_table (table);
+  //printf ("\t)\n");
   return 0;
 }