ncurses 6.1 - patch 20180825
[ncurses.git] / ncurses / trace / trace_buf.c
index 48f93d43d1ef1a45d204da0ca895346ad188dd6e..84a7a0ce076c03c16c484c069a32ec257417b3c5 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998 Free Software Foundation, Inc.                        *
+ * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -27,7 +27,7 @@
  ****************************************************************************/
 
 /****************************************************************************
- *  Author: Thomas E. Dickey <dickey@clark.net> 1997                        *
+ *  Author: Thomas E. Dickey                 1997-on                        *
  ****************************************************************************/
 /*
  *     trace_buf.c - Tracing/Debugging buffers (attributes)
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: trace_buf.c,v 1.7 1999/02/27 19:50:58 tom Exp $")
+MODULE_ID("$Id: trace_buf.c,v 1.20 2012/02/22 22:34:31 tom Exp $")
 
-typedef struct {
-       char *text;
-       size_t size;
-} LIST;
+#ifdef TRACE
 
-char * _nc_trace_buf(int bufnum, size_t want)
+#define MyList _nc_globals.tracebuf_ptr
+#define MySize _nc_globals.tracebuf_used
+
+static char *
+_nc_trace_alloc(int bufnum, size_t want)
 {
-       static LIST *list;
-       static size_t have;
+    char *result = 0;
+
+    if (bufnum >= 0) {
+       if ((size_t) (bufnum + 1) > MySize) {
+           size_t need = (size_t) (bufnum + 1) * 2;
+           if ((MyList = typeRealloc(TRACEBUF, need, MyList)) != 0) {
+               while (need > MySize)
+                   MyList[MySize++].text = 0;
+           }
+       }
 
+       if (MyList != 0) {
+           if (MyList[bufnum].text == 0
+               || want > MyList[bufnum].size) {
+               MyList[bufnum].text = typeRealloc(char, want, MyList[bufnum].text);
+               if (MyList[bufnum].text != 0)
+                   MyList[bufnum].size = want;
+           }
+           result = MyList[bufnum].text;
+       }
+    }
 #if NO_LEAKS
-       if (bufnum < 0) {
-               if (have) {
-                       while (have--) {
-                               free(list[have].text);
-                       }
-                       free(list);
+    else {
+       if (MySize) {
+           if (MyList) {
+               while (MySize--) {
+                   if (MyList[MySize].text != 0) {
+                       free(MyList[MySize].text);
+                   }
                }
-               return 0;
+               free(MyList);
+               MyList = 0;
+           }
+           MySize = 0;
        }
+    }
 #endif
+    return result;
+}
 
-       if ((size_t)(bufnum+1) > have) {
-               size_t need = (bufnum + 1) * 2;
-               if ((list = typeRealloc(LIST, need, list)) == 0)
-                       return(0);
-               while (need > have)
-                       list[have++].text = 0;
-       }
+/*
+ * (re)Allocate a buffer big enough for the caller's wants.
+ */
+NCURSES_EXPORT(char *)
+_nc_trace_buf(int bufnum, size_t want)
+{
+    char *result = _nc_trace_alloc(bufnum, want);
+    if (result != 0)
+       *result = '\0';
+    return result;
+}
 
-       if (list[bufnum].text == 0
-        || want > list[bufnum].size)
-       {
-               if ((list[bufnum].text = typeRealloc(char, want, list[bufnum].text)) != 0)
-                       list[bufnum].size = want;
-       }
+/*
+ * Append a new string to an existing buffer.
+ */
+NCURSES_EXPORT(char *)
+_nc_trace_bufcat(int bufnum, const char *value)
+{
+    char *buffer = _nc_trace_alloc(bufnum, (size_t) 0);
+    if (buffer != 0) {
+       size_t have = strlen(buffer);
+       size_t need = strlen(value) + have;
+
+       buffer = _nc_trace_alloc(bufnum, 1 + need);
+       if (buffer != 0)
+           _nc_STRCPY(buffer + have, value, need);
 
-       if (list[bufnum].text != 0)
-               *(list[bufnum].text) = '\0';
-       return list[bufnum].text;
+    }
+    return buffer;
 }
+#else
+EMPTY_MODULE(_nc_empty_trace_buf)
+#endif /* TRACE */