From 0eded6940b00e6523d7a0a7f76e40c70324f85d2 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 5 Dec 2021 21:13:00 -0800 Subject: [PATCH] file-handle-def: New function fh_equal(). This will have its first user in an upcoming commit. --- src/data/file-handle-def.c | 35 +++++++++++++++++++++++++++++++++++ src/data/file-handle-def.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/src/data/file-handle-def.c b/src/data/file-handle-def.c index de09ae39a7..09340833be 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" @@ -392,6 +393,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 * diff --git a/src/data/file-handle-def.h b/src/data/file-handle-def.h index 2f944ed1c2..df9a757835 100644 --- a/src/data/file-handle-def.h +++ b/src/data/file-handle-def.h @@ -96,6 +96,8 @@ const char *fh_get_name (const struct file_handle *); enum fh_referent fh_get_referent (const struct file_handle *); const char *fh_get_encoding (const struct file_handle *); +bool fh_equal (const struct file_handle *, const struct file_handle *); + /* Properties of FH_REF_FILE file handles. */ const char *fh_get_file_name (const struct file_handle *); const char *fh_get_file_name_encoding (const struct file_handle *handle); -- 2.30.2