X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Ffile-handle-def.c;h=0652501faa17fa27b19989b07e471b816731360c;hb=767a4e133dc7fc0f6e6b9cd8d115a4f5284f1a1b;hp=0f6b142a72cd170758b59912ecfa48dc47cc81fb;hpb=51d8c9b54d65bd0aa3944b8fb9d4460875048e14;p=pspp-builds.git diff --git a/src/data/file-handle-def.c b/src/data/file-handle-def.c index 0f6b142a..0652501f 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 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009 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 @@ -49,6 +49,7 @@ struct file_handle /* FH_REF_FILE only. */ char *file_name; /* File name as provided by user. */ enum fh_mode mode; /* File mode. */ + enum legacy_encoding encoding;/* File encoding. */ /* FH_REF_FILE and FH_REF_INLINE only. */ size_t record_width; /* Length of fixed-format records. */ @@ -234,6 +235,7 @@ fh_create_file (const char *id, const char *file_name, handle->mode = properties->mode; handle->record_width = properties->record_width; handle->tab_width = properties->tab_width; + handle->encoding = properties->encoding; return handle; } @@ -254,7 +256,7 @@ const struct fh_properties * fh_default_properties (void) { static const struct fh_properties default_properties - = {FH_MODE_TEXT, 1024, 4}; + = {FH_MODE_TEXT, 1024, 4, LEGACY_NATIVE}; return &default_properties; } @@ -322,6 +324,14 @@ fh_get_tab_width (const struct file_handle *handle) return handle->tab_width; } +/* Returns the encoding of characters read from HANDLE. */ +enum legacy_encoding +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); +} + /* Returns the scratch file handle associated with HANDLE. Applicable to only FH_REF_SCRATCH files. */ struct scratch_handle * @@ -582,10 +592,12 @@ static unsigned int hash_fh_lock (const void *lock_, const void *aux UNUSED) { const struct fh_lock *lock = lock_; - unsigned int hash = hsh_hash_int ((lock->referent << 3) | lock->access); + unsigned int basis; if (lock->referent == FH_REF_FILE) - hash ^= fn_hash_identity (lock->u.file); + basis = fn_hash_identity (lock->u.file); else if (lock->referent == FH_REF_SCRATCH) - hash ^= hsh_hash_int (lock->u.unique_id); - return hash; + basis = lock->u.unique_id; + else + basis = 0; + return hash_int ((lock->referent << 3) | lock->access, basis); }