X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fconcord.git;a=blobdiff_plain;f=cos.c;h=db92207e671db81b98a42da221c0be2deb4d0828;hp=42b66ddc585f43eeaaf14e55bd94e7e520677d4e;hb=5975522d9eea6235b7595304cfcfbc411440cb51;hpb=1ee0d66516cf8f0758dceebf2d360b4685cb4fa0 diff --git a/cos.c b/cos.c index 42b66dd..db92207 100644 --- a/cos.c +++ b/cos.c @@ -136,12 +136,11 @@ cos_release_object (COS_object obj) { if (COS_OBJECT_P (obj)) { + ((COS_Object)obj)->header.reference_count--; if ( ((COS_Object)obj)->header.reference_count <= 0 ) return (*COS_Object_release_function_table [((COS_Object)obj)->header.type - COS_FAT_OBJECT_TYPE_MIN])(obj); - else - ((COS_Object)obj)->header.reference_count--; } return 0; } @@ -386,6 +385,12 @@ cos_release_ds (COS_Object obj) return concord_close_ds ((COS_DS)obj); } +int +concord_ds_p (COS_object obj) +{ + return COS_OBJECT_DS_P (obj); +} + COS_Genre concord_get_genre (COS_object ds, COS_object genre) @@ -551,26 +556,21 @@ concord_decode_object (COS_object ds, COS_object genre, COS_object concord_object_get_feature_value (COS_object object, COS_object feature) { - char id_buf[256]; CONCORD_Genre gobj; CONCORD_Feature fobj; - CONCORD_String_Tank val_st; - size_t end; + COS_object ret; if (COS_OBJECT_CHAR_P (object)) { - cos_utf8_print_char (object, (unsigned char*)id_buf, 256); + if (!COS_OBJECT_DS_P (concord_current_env)) + { + concord_current_env = NULL; + return NULL; + } + gobj = concord_get_genre (concord_current_env, "character"); } else return NULL; - - if (!COS_OBJECT_DS_P (concord_current_env)) - { - concord_current_env = NULL; - return NULL; - } - - gobj = concord_get_genre (concord_current_env, "character"); if (gobj == NULL) return NULL; @@ -578,10 +578,38 @@ concord_object_get_feature_value (COS_object object, COS_object feature) if (fobj == NULL) return NULL; - if ( concord_obj_get_feature_value_string (id_buf, fobj, &val_st) ) - return NULL; + if ( fobj->value_table != NULL ) + { + ret = cos_hash_table_get (fobj->value_table, object); + if (ret != NULL) + return ret; + } + else + fobj->value_table = cos_make_hash_table (); + + { + char id_buf[256]; + CONCORD_String_Tank val_st; + size_t end; + + if (COS_OBJECT_CHAR_P (object)) + { + cos_utf8_print_char (object, (unsigned char*)id_buf, 256); + } + else + return NULL; + + if ( concord_obj_get_feature_value_string (id_buf, fobj, &val_st) ) + return NULL; + + ret = cos_read_object (CONCORD_String_data (&val_st), + CONCORD_String_size (&val_st), + 0, &end); + if ( ret == NULL ) + return NULL; - return cos_read_object (CONCORD_String_data (&val_st), - CONCORD_String_size (&val_st), - 0, &end); + cos_retain_object (ret); + cos_hash_table_put (fobj->value_table, object, ret); + return ret; + } }