"""This module contains miscellaneous support code.


Functions:
open_handle_or_file   Search for a handle, filename, or datafile and open it.

"""
import os

from Extracto import datafile

def open_handle_or_file(handle_or_file, mode="r"):
    """open_handle_or_file(handle_or_file[, mode]) -> handle"""
    if hasattr(handle_or_file, 'read'):
        return handle_or_file
    if "w" in mode or "a" in mode:
        # If a full path name was given, then use this name.
        # Otherwise, put it into the data directory.
        h, t = os.path.split(handle_or_file)
        if h:
            filename = handle_or_file
        else:
            filename = datafile.make(handle_or_file)
        handle = open(filename, mode)
    else:
        if os.path.exists(handle_or_file):
            filename = handle_or_file
        else:
            filename = datafile.find(handle_or_file)
            if not filename:
                raise IOError, "I could not find %s" % handle_or_file
        handle = open(filename, mode)
    return handle

