X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata%2Ffile-handle-def.c;h=04f773452f89fe1ad7b2be248876aa26b230fbf7;hb=54b3aa8432383287c75b9baf954b7bf887126a0c;hp=716a029cc701a567d4c28c53ab0119fed66d003f;hpb=14e92ae17ea68adfe8d703b740e20c7f368138fb;p=pspp diff --git a/src/data/file-handle-def.c b/src/data/file-handle-def.c index 716a029cc7..04f773452f 100644 --- a/src/data/file-handle-def.c +++ b/src/data/file-handle-def.c @@ -25,6 +25,7 @@ #include "data/dataset.h" #include "data/variable.h" +#include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/compiler.h" #include "libpspp/hash-functions.h" @@ -204,9 +205,7 @@ fh_from_id (const char *id) HMAP_FOR_EACH_WITH_HASH (handle, struct file_handle, name_node, utf8_hash_case_string (id, 0), &named_handles) if (!utf8_strcasecmp (id, handle->id)) - { - return fh_ref (handle); - } + return fh_ref (handle); return NULL; } @@ -221,19 +220,18 @@ static struct file_handle * create_handle (const char *id, char *handle_name, enum fh_referent referent, const char *encoding) { - struct file_handle *handle = xzalloc (sizeof *handle); - - handle->ref_cnt = 1; - handle->id = id != NULL ? xstrdup (id) : NULL; - handle->name = handle_name; - handle->referent = referent; - handle->encoding = xstrdup (encoding); + struct file_handle *handle = xmalloc (sizeof *handle); + *handle = (struct file_handle) { + .ref_cnt = 1, + .id = xstrdup_if_nonnull (id), + .name = handle_name, + .referent = referent, + .encoding = xstrdup (encoding), + }; - if (id != NULL) - { - hmap_insert (&named_handles, &handle->name_node, - utf8_hash_case_string (handle->id, 0)); - } + if (id) + hmap_insert (&named_handles, &handle->name_node, + utf8_hash_case_string (handle->id, 0)); return handle; } @@ -255,13 +253,11 @@ struct file_handle * fh_create_file (const char *id, const char *file_name, const char *file_name_encoding, const struct fh_properties *properties) { - char *handle_name; - struct file_handle *handle; - - handle_name = id != NULL ? xstrdup (id) : xasprintf ("`%s'", file_name); - handle = create_handle (id, handle_name, FH_REF_FILE, properties->encoding); + char *handle_name = id ? xstrdup (id) : xasprintf ("`%s'", file_name); + struct file_handle *handle = create_handle (id, handle_name, FH_REF_FILE, + properties->encoding); handle->file_name = xstrdup (file_name); - handle->file_name_encoding = file_name_encoding ? xstrdup (file_name_encoding) : NULL; + handle->file_name_encoding = xstrdup_if_nonnull (file_name_encoding); handle->mode = properties->mode; handle->line_ends = properties->line_ends; handle->record_width = properties->record_width; @@ -392,6 +388,40 @@ fh_get_encoding (const struct file_handle *handle) return handle->encoding; } +/* Returns true if A and B refer to the same file or dataset, false + otherwise. */ +bool +fh_equal (const struct file_handle *a, const struct file_handle *b) +{ + if (a->referent != b->referent) + return false; + + switch (a->referent) + { + case FH_REF_FILE: + { + struct file_identity *a_id = fh_get_identity (a); + struct file_identity *b_id = fh_get_identity (b); + + int cmp = fh_compare_file_identities (a_id, b_id); + + fh_free_identity (a_id); + fh_free_identity (b_id); + + return cmp == 0; + } + + case FH_REF_INLINE: + return true; + + case FH_REF_DATASET: + return a->ds == b->ds; + + default: + NOT_REACHED (); + } +} + /* Returns the dataset handle associated with HANDLE. Applicable to only FH_REF_DATASET files. */ struct dataset *