session: Fix two memory leaks.
[pspp] / src / data / file-handle-def.c
index 9a46bfad43c851b4d87759c8d9dca1ab3ee4fbaf..9c853e5e983d7968bf427e0a01765680c1cec0e0 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013 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
@@ -51,6 +51,7 @@ struct file_handle
     /* FH_REF_FILE only. */
     char *file_name;           /* File name as provided by user. */
     enum fh_mode mode;         /* File mode. */
+    enum fh_line_ends line_ends; /* Line ends for text files. */
 
     /* FH_REF_FILE and FH_REF_INLINE only. */
     size_t record_width;        /* Length of fixed-format records. */
@@ -176,11 +177,10 @@ fh_from_id (const char *id)
   struct file_handle *handle;
 
   HMAP_FOR_EACH_WITH_HASH (handle, struct file_handle, name_node,
-                           hash_case_string (id, 0), &named_handles)
-    if (!strcasecmp (id, handle->id))
+                           utf8_hash_case_string (id, 0), &named_handles)
+    if (!utf8_strcasecmp (id, handle->id))
       {
-        handle->ref_cnt++;
-        return handle;
+       return fh_ref (handle);
       }
 
   return NULL;
@@ -206,10 +206,8 @@ create_handle (const char *id, char *handle_name, enum fh_referent referent,
 
   if (id != NULL)
     {
-      assert (fh_from_id (id) == NULL);
       hmap_insert (&named_handles, &handle->name_node,
-                   hash_case_string (handle->id, 0));
-      handle->ref_cnt++;
+                   utf8_hash_case_string (handle->id, 0));
     }
 
   return handle;
@@ -221,7 +219,6 @@ create_handle (const char *id, char *handle_name, enum fh_referent referent,
 struct file_handle *
 fh_inline_file (void)
 {
-  fh_ref (inline_file);
   return inline_file;
 }
 
@@ -240,6 +237,7 @@ fh_create_file (const char *id, const char *file_name,
   handle = create_handle (id, handle_name, FH_REF_FILE, properties->encoding);
   handle->file_name = xstrdup (file_name);
   handle->mode = properties->mode;
+  handle->line_ends = properties->line_ends;
   handle->record_width = properties->record_width;
   handle->tab_width = properties->tab_width;
   return handle;
@@ -267,8 +265,14 @@ fh_create_dataset (struct dataset *ds)
 const struct fh_properties *
 fh_default_properties (void)
 {
+#if defined _WIN32 || defined __WIN32__
+#define DEFAULT_LINE_ENDS FH_END_CRLF
+#else
+#define DEFAULT_LINE_ENDS FH_END_LF
+#endif
+
   static const struct fh_properties default_properties
-    = {FH_MODE_TEXT, 1024, 4, (char *) "Auto"};
+    = {FH_MODE_TEXT, DEFAULT_LINE_ENDS, 1024, 4, (char *) "Auto"};
   return &default_properties;
 }
 
@@ -318,6 +322,15 @@ fh_get_mode (const struct file_handle *handle)
   return handle->mode;
 }
 
+/* Returns the line ends of HANDLE, which must be a handle associated with a
+   file. */
+enum fh_line_ends
+fh_get_line_ends (const struct file_handle *handle)
+{
+  assert (handle->referent == FH_REF_FILE);
+  return handle->line_ends;
+}
+
 /* Returns the width of a logical record on HANDLE. */
 size_t
 fh_get_record_width (const struct file_handle *handle)
@@ -356,7 +369,7 @@ fh_get_dataset (const struct file_handle *handle)
 struct file_handle *
 fh_get_default_handle (void)
 {
-  return default_handle ? fh_ref (default_handle) : fh_inline_file ();
+  return default_handle ? default_handle : fh_inline_file ();
 }
 
 /* Sets NEW_DEFAULT_HANDLE as the default handle. */
@@ -365,7 +378,7 @@ fh_set_default_handle (struct file_handle *new_default_handle)
 {
   assert (new_default_handle == NULL
           || (new_default_handle->referent & (FH_REF_INLINE | FH_REF_FILE)));
-  if (default_handle != NULL)
+  if (default_handle != NULL && default_handle != inline_file)
     fh_unref (default_handle);
   default_handle = new_default_handle;
   if (default_handle != NULL)