00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef lint
00022 static const char rcsid[] = "$Id: memutil.c,v 1.22 2006-01-05 20:42:42 sven Exp $";
00023 #endif
00024
00025 #include <eggdrop/eggdrop.h>
00026
00027 void str_redup(char **str, const char *newstr)
00028 {
00029 int len;
00030
00031 if (!newstr) {
00032 if (*str) free(*str);
00033 *str = NULL;
00034 return;
00035 }
00036 len = strlen(newstr) + 1;
00037 *str = realloc(*str, len);
00038 memcpy(*str, newstr, len);
00039 }
00040
00041 char *egg_mprintf(const char *format, ...)
00042 {
00043 va_list args;
00044 char *ptr;
00045
00046 va_start(args, format);
00047 ptr = egg_mvsprintf(NULL, 0, NULL, format, args);
00048 va_end(args);
00049 return(ptr);
00050 }
00051
00052 char *egg_msprintf(char *buf, int len, int *final_len, const char *format, ...)
00053 {
00054 va_list args;
00055 char *ptr;
00056
00057 va_start(args, format);
00058 ptr = egg_mvsprintf(buf, len, final_len, format, args);
00059 va_end(args);
00060 return(ptr);
00061 }
00062
00063 char *egg_mvsprintf(char *buf, int len, int *final_len, const char *format, va_list args)
00064 {
00065 char *output;
00066 int n;
00067
00068 if (buf && len > 10) output = buf;
00069 else {
00070 output = malloc(512);
00071 len = 512;
00072 }
00073 while (1) {
00074 va_list temp_args;
00075
00076 len -= 10;
00077 va_copy(temp_args, args);
00078 n = vsnprintf(output, len, format, temp_args);
00079 va_end(temp_args);
00080 if (n > -1 && n < len) break;
00081 if (n > len) len = n+1;
00082 else len *= 2;
00083 len += 10;
00084 if (output == buf) output = malloc(len);
00085 else output = realloc(output, len);
00086 if (!output) return(NULL);
00087 }
00088 if (final_len) {
00089 if (!(n % 1024)) n = strlen(output);
00090 *final_len = n;
00091 }
00092 if (output != buf && len - n > 256) output = realloc(output, n+20);
00093 return(output);
00094 }