X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Ffile-handle-def.c;h=2b8e40ce347b7935b68589083dcda03030c07a74;hb=9ade26c8349b4434008c46cf09bc7473ec743972;hp=d025ff6a3a35b4a493b7f6b72f0d3ed61ff461e1;hpb=173d1687aea88e0e5e1b1d8615ed68ebefb15d08;p=pspp-builds.git diff --git a/src/data/file-handle-def.c b/src/data/file-handle-def.c index d025ff6a..2b8e40ce 100644 --- a/src/data/file-handle-def.c +++ b/src/data/file-handle-def.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,24 +16,24 @@ #include -#include "file-handle-def.h" +#include "data/file-handle-def.h" #include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "libpspp/compiler.h" +#include "libpspp/hmap.h" +#include "libpspp/i18n.h" +#include "libpspp/message.h" +#include "libpspp/str.h" +#include "libpspp/hash-functions.h" +#include "data/file-name.h" +#include "data/variable.h" +#include "data/scratch-handle.h" -#include "xalloc.h" +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -41,7 +41,7 @@ /* File handle. */ struct file_handle { - struct ll ll; /* Element in global list. */ + struct hmap_node name_node; /* Element in named_handles hmap. */ size_t ref_cnt; /* Number of references. */ char *id; /* Identifier token, NULL if none. */ char *name; /* User-friendly identifying name. */ @@ -60,14 +60,8 @@ struct file_handle struct scratch_handle *sh; /* Scratch file data. */ }; -static struct file_handle * -file_handle_from_ll (struct ll *ll) -{ - return ll_data (ll, struct file_handle, ll); -} - -/* List of all named handles. */ -static struct ll_list named_handles; +/* All "struct file_handle"s with nonnull 'id' member. */ +static struct hmap named_handles = HMAP_INITIALIZER (named_handles); /* Default file handle for DATA LIST, REREAD, REPEATING DATA commands. */ @@ -88,7 +82,6 @@ static struct hmap locks = HMAP_INITIALIZER (locks); void fh_init (void) { - ll_init (&named_handles); inline_file = create_handle ("INLINE", xstrdup ("INLINE"), FH_REF_INLINE); inline_file->record_width = 80; inline_file->tab_width = 8; @@ -98,8 +91,11 @@ fh_init (void) void fh_done (void) { - while (!ll_is_empty (&named_handles)) - unname_handle (file_handle_from_ll (ll_head (&named_handles))); + struct file_handle *handle, *next; + + HMAP_FOR_EACH_SAFE (handle, next, + struct file_handle, name_node, &named_handles) + unname_handle (handle); } /* Free HANDLE and remove it from the global list. */ @@ -108,7 +104,7 @@ free_handle (struct file_handle *handle) { /* Remove handle from global list. */ if (handle->id != NULL) - ll_remove (&handle->ll); + hmap_delete (&named_handles, &handle->name_node); /* Free data. */ free (handle->id); @@ -127,7 +123,7 @@ unname_handle (struct file_handle *handle) assert (handle->id != NULL); free (handle->id); handle->id = NULL; - ll_remove (&handle->ll); + hmap_delete (&named_handles, &handle->name_node); /* Drop the reference held by the named_handles table. */ fh_unref (handle); @@ -176,7 +172,8 @@ fh_from_id (const char *id) { struct file_handle *handle; - ll_for_each (handle, struct file_handle, ll, &named_handles) + HMAP_FOR_EACH_WITH_HASH (handle, struct file_handle, name_node, + hash_case_string (id, 0), &named_handles) if (!strcasecmp (id, handle->id)) { handle->ref_cnt++; @@ -205,7 +202,8 @@ create_handle (const char *id, char *handle_name, enum fh_referent referent) if (id != NULL) { assert (fh_from_id (id) == NULL); - ll_push_tail (&named_handles, &handle->ll); + hmap_insert (&named_handles, &handle->name_node, + hash_case_string (handle->id, 0)); handle->ref_cnt++; } @@ -222,10 +220,10 @@ fh_inline_file (void) return inline_file; } -/* Creates and returns a new file handle with the given ID, which - may be null. If it is non-null, it must be unique among - existing file identifiers. The new handle is associated with - file FILE_NAME and the given PROPERTIES. */ +/* Creates and returns a new file handle with the given ID, which may be null. + If it is non-null, it must be a UTF-8 encoded string that is unique among + existing file identifiers. The new handle is associated with file FILE_NAME + and the given PROPERTIES. */ struct file_handle * fh_create_file (const char *id, const char *file_name, const struct fh_properties *properties) @@ -260,7 +258,7 @@ const struct fh_properties * fh_default_properties (void) { static const struct fh_properties default_properties - = {FH_MODE_TEXT, 1024, 4, LEGACY_NATIVE}; + = {FH_MODE_TEXT, 1024, 4, C_ENCODING}; return &default_properties; } @@ -333,7 +331,7 @@ const char * fh_get_legacy_encoding (const struct file_handle *handle) { assert (handle->referent & (FH_REF_FILE | FH_REF_INLINE)); - return (handle->referent == FH_REF_FILE ? handle->encoding : LEGACY_NATIVE); + return (handle->referent == FH_REF_FILE ? handle->encoding : C_ENCODING); } /* Returns the scratch file handle associated with HANDLE.