+
+/*
+ * Concatenate a string (str) onto a pool memory buffer pm
+ * Returns: length of concatenated string
+ */
+int pm_strcat(POOLMEM **pm, const char *str)
+{
+ int pmlen = strlen(*pm);
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
+ *pm = check_pool_memory_size(*pm, pmlen + len);
+ memcpy(*pm+pmlen, str, len);
+ return pmlen + len - 1;
+}
+
+int pm_strcat(POOLMEM *&pm, const char *str)
+{
+ int pmlen = strlen(pm);
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
+ pm = check_pool_memory_size(pm, pmlen + len);
+ memcpy(pm+pmlen, str, len);
+ return pmlen + len - 1;
+}
+
+int pm_strcat(POOLMEM *&pm, POOL_MEM &str)
+{
+ int pmlen = strlen(pm);
+ int len = strlen(str.c_str()) + 1;
+
+ pm = check_pool_memory_size(pm, pmlen + len);
+ memcpy(pm+pmlen, str.c_str(), len);
+ return pmlen + len - 1;
+}
+
+int pm_strcat(POOL_MEM &pm, const char *str)
+{
+ int pmlen = strlen(pm.c_str());
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
+ pm.check_size(pmlen + len);
+ memcpy(pm.c_str()+pmlen, str, len);
+ return pmlen + len - 1;
+}
+
+/*
+ * Copy a string (str) into a pool memory buffer pm
+ * Returns: length of string copied
+ */
+int pm_strcpy(POOLMEM **pm, const char *str)
+{
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
+ *pm = check_pool_memory_size(*pm, len);
+ memcpy(*pm, str, len);
+ return len - 1;
+}
+
+int pm_strcpy(POOLMEM *&pm, const char *str)
+{
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
+ pm = check_pool_memory_size(pm, len);
+ memcpy(pm, str, len);
+ return len - 1;
+}
+
+int pm_strcpy(POOLMEM *&pm, POOL_MEM &str)
+{
+ int len = strlen(str.c_str()) + 1;
+
+ pm = check_pool_memory_size(pm, len);
+ memcpy(pm, str.c_str(), len);
+ return len - 1;
+}
+
+int pm_strcpy(POOL_MEM &pm, const char *str)
+{
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
+ pm.check_size(len);
+ memcpy(pm.c_str(), str, len);
+ return len - 1;
+}
+
+/*
+ * Copy data into a pool memory buffer pm
+ * Returns: length of data copied
+ */
+int pm_memcpy(POOLMEM **pm, const char *data, int32_t n)
+{
+ *pm = check_pool_memory_size(*pm, n);
+ memcpy(*pm, data, n);
+ return n;
+}
+
+int pm_memcpy(POOLMEM *&pm, const char *data, int32_t n)
+{
+ pm = check_pool_memory_size(pm, n);
+ memcpy(pm, data, n);
+ return n;
+}
+
+int pm_memcpy(POOLMEM *&pm, POOL_MEM &data, int32_t n)
+{
+ pm = check_pool_memory_size(pm, n);
+ memcpy(pm, data.c_str(), n);
+ return n;
+}
+
+int pm_memcpy(POOL_MEM &pm, const char *data, int32_t n)
+{
+ pm.check_size(n);
+ memcpy(pm.c_str(), data, n);
+ return n;
+}
+
+/* ============== CLASS POOL_MEM ============== */
+
+/* Return the size of a memory buffer */
+int32_t POOL_MEM::max_size()
+{
+ int32_t size;
+ char *cp = mem;
+ cp -= HEAD_SIZE;
+ size = ((struct abufhead *)cp)->ablen;
+ Dmsg1(900, "max_size=%d\n", size);
+ return size;
+}
+
+void POOL_MEM::realloc_pm(int32_t size)
+{
+ char *cp = mem;
+ char *buf;
+ int pool;
+
+ P(mutex);
+ cp -= HEAD_SIZE;
+ buf = (char *)realloc(cp, size+HEAD_SIZE);
+ if (buf == NULL) {
+ V(mutex);
+ Emsg1(M_ABORT, 0, _("Out of memory requesting %d bytes\n"), size);
+ }
+ Dmsg2(900, "Old buf=%p new buf=%p\n", cp, buf);
+ ((struct abufhead *)buf)->ablen = size;
+ pool = ((struct abufhead *)buf)->pool;
+ if (size > pool_ctl[pool].max_allocated) {
+ pool_ctl[pool].max_allocated = size;
+ }
+ mem = buf+HEAD_SIZE;
+ V(mutex);
+ Dmsg3(900, "Old buf=%p new buf=%p mem=%p\n", cp, buf, mem);
+}
+
+int POOL_MEM::strcat(const char *str)
+{
+ int pmlen = strlen(mem);
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
+ check_size(pmlen + len);
+ memcpy(mem+pmlen, str, len);
+ return pmlen + len - 1;
+}
+
+int POOL_MEM::strcpy(const char *str)
+{
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
+ check_size(len);
+ memcpy(mem, str, len);
+ return len - 1;
+}