-/*
- * Copyright (C) 1995-2007, Index Data ApS
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) Index Data
* See the file LICENSE for details.
- *
- * $Id: fhistory.c,v 1.2 2007-01-24 23:09:48 adam Exp $
*/
/** \file fhistory.c
* \brief file history implementation
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <stdio.h>
+#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
-#include <ctype.h>
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
file_history_t file_history_new()
{
- file_history_t fh = xmalloc(sizeof(*fh));
+ file_history_t fh = (file_history_t) xmalloc(sizeof(*fh));
fh->wr = wrbuf_alloc();
return fh;
}
return ret;
}
+#define FILE_SAVE_HISTORY_MAX 16384
+
int file_history_save(file_history_t fh)
{
FILE *f;
char* homedir = getenv("HOME");
char fname[1024];
int ret = 0;
- int sz = wrbuf_len(fh->wr);
+ size_t sz = wrbuf_len(fh->wr);
if (!sz)
return 0;
}
else
{
- size_t w = fwrite(wrbuf_buf(fh->wr), 1, sz, f);
+ size_t w;
+ const char *start = wrbuf_buf(fh->wr);
+ if (sz > FILE_SAVE_HISTORY_MAX)
+ {
+ const char *nl = strchr(
+ wrbuf_buf(fh->wr) + sz - FILE_SAVE_HISTORY_MAX,
+ '\n');
+ if (nl)
+ {
+ nl++;
+ sz = sz - (nl - start);
+ start = nl;
+ }
+ }
+ w = fwrite(start, 1, sz, f);
if (w != sz)
ret = -1;
if (fclose(f))
int file_history_trav(file_history_t fh, void *client_data,
void (*callback)(void *client_data, const char *line))
{
- int off = 0;
+ size_t off = 0;
while (off < wrbuf_len(fh->wr))
{
- int i;
+ size_t i;
for (i = off; i < wrbuf_len(fh->wr); i++)
{
if (wrbuf_buf(fh->wr)[i] == '\n')
{
wrbuf_buf(fh->wr)[i] = '\0';
- callback(client_data, wrbuf_buf(fh->wr) + off);
+ callback(client_data, wrbuf_cstr(fh->wr) + off);
wrbuf_buf(fh->wr)[i] = '\n';
i++;
break;
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab