You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
#include "file-handle.h"
#include "error.h"
#include "magic.h"
#include "var.h"
+#include "linked-list.h"
+
/* (headers) */
/* File handle. */
int open_cnt; /* 0=not open, otherwise # of openers. */
const char *type; /* If open, type of file. */
- const char *open_mode; /* "[rw][se]". */
+ char open_mode[3]; /* "[rw][se]". */
void *aux; /* Aux data pointer for owner if any. */
};
handle->tab_width = 4;
handle->open_cnt = 0;
handle->type = NULL;
- handle->open_mode = NULL;
handle->aux = NULL;
file_handles = handle;
return handle;
}
+static void
+destroy_file_handle(void *fh_, void *aux UNUSED)
+{
+ struct file_handle *fh = fh_;
+ free (fh->name);
+ free (fh->filename);
+ fn_free_identity (fh->identity);
+ free (fh);
+}
+
static const char *
mode_name (const char *mode)
{
modes the void * will necessarily be null only if no other
sharers are active.
- If successful, references to type and mode are retained, so
- they should probably be string literals. */
+ If successful, a reference to type is retained, so it should
+ probably be a string literal. */
void **
fh_open (struct file_handle *h, const char *type, const char *mode)
{
if (h->open_cnt != 0)
{
- if (strcmp (h->type, type))
- msg (SE, _("Can't open %s as a %s because it is "
- "already open as a %s"),
- handle_get_name (h), type, h->type);
- else if (strcmp (h->open_mode, mode))
- msg (SE, _("Can't open %s as a %s for %s because it is "
- "already open for %s"),
- handle_get_name (h), type,
- mode_name (mode), mode_name (h->open_mode));
+ if (strcmp (h->type, type))
+ {
+ msg (SE, _("Can't open %s as a %s because it is "
+ "already open as a %s"),
+ handle_get_name (h), type, h->type);
+ return NULL;
+ }
+ else if (strcmp (h->open_mode, mode))
+ {
+ msg (SE, _("Can't open %s as a %s for %s because it is "
+ "already open for %s"),
+ handle_get_name (h), type,
+ mode_name (mode), mode_name (h->open_mode));
+ return NULL;
+ }
else if (h->open_mode[1] == 'e')
- msg (SE, _("Can't re-open %s as a %s for %s"),
- handle_get_name (h), type, mode_name (mode));
+ {
+ msg (SE, _("Can't re-open %s as a %s for %s"),
+ handle_get_name (h), type, mode_name (mode));
+ return NULL;
+ }
}
else
{
h->type = type;
- h->open_mode = mode;
+ strcpy (h->open_mode, mode);
assert (h->aux == NULL);
}
h->open_cnt++;
if (h->open_cnt == 0)
{
h->type = NULL;
- h->open_mode = NULL;
h->aux = NULL;
}
return h->open_cnt;
}
+
+static struct linked_list *handle_list;
+
+
/* Parses a file handle name, which may be a filename as a string or
a file handle name as an identifier. Returns the file handle or
NULL on failure. */
char *handle_name = xmalloc (strlen (filename) + 3);
sprintf (handle_name, "\"%s\"", filename);
handle = create_file_handle (handle_name, filename);
+ ll_push_front(handle_list, handle);
free (handle_name);
}
lex_get ();
+
return handle;
}
return handle->tab_width;
}
+
+void
+fh_init(void)
+{
+ handle_list = ll_create(destroy_file_handle,0);
+}
+
+void
+fh_done(void)
+{
+ if ( handle_list )
+ {
+ ll_destroy(handle_list);
+ handle_list = 0;
+ }
+}
+
+
/*
Local variables:
mode: c