str: Add function xstrdup_if_nonnull() and introduce many users.
[pspp] / src / data / file-handle-def.c
index 4546a9ca0c4a137571878b2dab9086d4b63134c0..075f7b07901c79150e84b1b27014ca7202270d53 100644 (file)
@@ -115,12 +115,17 @@ fh_done (void)
   HMAP_FOR_EACH_SAFE (handle, next,
                       struct file_handle, name_node, &named_handles)
     unname_handle (handle);
+
+  free_handle (inline_file);
 }
 
 /* Free HANDLE and remove it from the global list. */
 static void
 free_handle (struct file_handle *handle)
 {
+  if (handle == NULL)
+    return;
+
   /* Remove handle from global list. */
   if (handle->id != NULL)
     hmap_delete (&named_handles, &handle->name_node);
@@ -153,6 +158,8 @@ unname_handle (struct file_handle *handle)
 struct file_handle *
 fh_ref (struct file_handle *handle)
 {
+  if (handle == fh_inline_file ())
+    return handle;
   assert (handle->ref_cnt > 0);
   handle->ref_cnt++;
   return handle;
@@ -165,6 +172,8 @@ fh_unref (struct file_handle *handle)
 {
   if (handle != NULL)
     {
+      if (handle == fh_inline_file ())
+        return;
       assert (handle->ref_cnt > 0);
       if (--handle->ref_cnt == 0)
         free_handle (handle);
@@ -215,7 +224,7 @@ create_handle (const char *id, char *handle_name, enum fh_referent referent,
   struct file_handle *handle = xzalloc (sizeof *handle);
 
   handle->ref_cnt = 1;
-  handle->id = id != NULL ? xstrdup (id) : NULL;
+  handle->id = xstrdup_if_nonnull (id);
   handle->name = handle_name;
   handle->referent = referent;
   handle->encoding = xstrdup (encoding);
@@ -252,7 +261,7 @@ fh_create_file (const char *id, const char *file_name, const char *file_name_enc
   handle_name = id != NULL ? xstrdup (id) : xasprintf ("`%s'", file_name);
   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;
@@ -409,7 +418,7 @@ fh_set_default_handle (struct file_handle *new_default_handle)
     fh_unref (default_handle);
   default_handle = new_default_handle;
   if (default_handle != NULL)
-    fh_ref (default_handle);
+    default_handle = fh_ref (default_handle);
 }
 \f
 /* Information about a file handle's readers or writers. */