X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/5471d09ad63fc6216fb9c2a3b52ca9c93821a054..0622ea7168aa265db70be885fbffb050f29f0205:/misc.c diff --git a/misc.c b/misc.c index 4af00d62..cb894b3e 100644 --- a/misc.c +++ b/misc.c @@ -4,7 +4,53 @@ #include #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 * @@ -99,7 +145,7 @@ void bufchain_prefix(bufchain *ch, void **data, int *len) *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 @@ -333,8 +379,13 @@ static void *minefield_c_realloc(void *p, size_t size) #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); @@ -353,7 +404,14 @@ void *safemalloc(size_t size) 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); +#else + strcpy(str, "Out of memory!"); +#endif + MessageBox(NULL, str, "PuTTY Fatal Error", MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); exit(1); } @@ -381,7 +439,14 @@ void *saferealloc(void *ptr, size_t 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); +#else + strcpy(str, "Out of memory!"); +#endif + MessageBox(NULL, str, "PuTTY Fatal Error", MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); exit(1); } @@ -411,6 +476,10 @@ void safefree(void *ptr) #endif } +/* ---------------------------------------------------------------------- + * Debugging routines. + */ + #ifdef DEBUG static FILE *debug_fp = NULL; static int debug_got_console = 0;