#include <assert.h>
#include "putty.h"
-/*
+/* ----------------------------------------------------------------------
+ * String handling routines.
+ */
+
+char *dupstr(char *s)
+{
+ int len = strlen(s);
+ char *p = smalloc(len + 1);
+ strcpy(p, s);
+ return p;
+}
+
+/* Allocate the concatenation of N strings. Terminate arg list with NULL. */
+char *dupcat(char *s1, ...)
+{
+ int len;
+ char *p, *q, *sn;
+ va_list ap;
+
+ len = strlen(s1);
+ va_start(ap, s1);
+ while (1) {
+ sn = va_arg(ap, char *);
+ if (!sn)
+ break;
+ len += strlen(sn);
+ }
+ va_end(ap);
+
+ p = smalloc(len + 1);
+ strcpy(p, s1);
+ q = p + strlen(p);
+
+ va_start(ap, s1);
+ while (1) {
+ sn = va_arg(ap, char *);
+ if (!sn)
+ break;
+ strcpy(q, sn);
+ q += strlen(q);
+ }
+ va_end(ap);
+
+ return p;
+}
+
+/* ----------------------------------------------------------------------
* Generic routines to deal with send buffers: a linked list of
* smallish blocks, with the operations
*
*data = ch->head->buf + ch->head->bufpos;
}
-/*
+/* ----------------------------------------------------------------------
* My own versions of malloc, realloc and free. Because I want
* malloc and realloc to bomb out and exit the program if they run
* out of memory, realloc to reliably call malloc if passed a NULL
#ifdef MALLOC_LOG
static FILE *fp = NULL;
+static char *mlog_file = NULL;
+static int mlog_line = 0;
+
void mlog(char *file, int line)
{
+ mlog_file = file;
+ mlog_line = line;
if (!fp) {
fp = fopen("putty_mem.log", "w");
setvbuf(fp, NULL, _IONBF, BUFSIZ);
p = malloc(size);
#endif
if (!p) {
- MessageBox(NULL, "Out of memory!", "PuTTY Fatal Error",
+ char str[200];
+#ifdef MALLOC_LOG
+ sprintf(str, "Out of memory! (%s:%d, size=%d)",
+ mlog_file, mlog_line, size);
+ fprintf(fp, "*** %s\n", str);
+ fclose(fp);
+#else
+ strcpy(str, "Out of memory!");
+#endif
+ MessageBox(NULL, str, "PuTTY Fatal Error",
MB_SYSTEMMODAL | MB_ICONERROR | MB_OK);
- exit(1);
+ cleanup_exit(1);
}
#ifdef MALLOC_LOG
if (fp)
#endif
}
if (!p) {
- MessageBox(NULL, "Out of memory!", "PuTTY Fatal Error",
+ char str[200];
+#ifdef MALLOC_LOG
+ sprintf(str, "Out of memory! (%s:%d, size=%d)",
+ mlog_file, mlog_line, size);
+ fprintf(fp, "*** %s\n", str);
+ fclose(fp);
+#else
+ strcpy(str, "Out of memory!");
+#endif
+ MessageBox(NULL, str, "PuTTY Fatal Error",
MB_SYSTEMMODAL | MB_ICONERROR | MB_OK);
- exit(1);
+ cleanup_exit(1);
}
#ifdef MALLOC_LOG
if (fp)
#endif
}
+/* ----------------------------------------------------------------------
+ * Debugging routines.
+ */
+
#ifdef DEBUG
static FILE *debug_fp = NULL;
static int debug_got_console = 0;