Minor refactor in tcpip code
[yaz-moved-to-github.git] / client / fhistory.c
index 21f9b6f..03081e5 100644 (file)
@@ -1,16 +1,19 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2008 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
 /** \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
@@ -67,13 +70,15 @@ int file_history_load(file_history_t 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;
@@ -87,7 +92,21 @@ int file_history_save(file_history_t fh)
     }
     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))
@@ -99,11 +118,11 @@ int file_history_save(file_history_t fh)
 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')
@@ -123,6 +142,7 @@ int file_history_trav(file_history_t fh, void *client_data,
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab