Changeset: 627126094562 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=627126094562
Modified Files:
monetdb5/modules/mal/mal_io.mx
Branch: Aug2011
Log Message:
mal_io: do not use alloca
diffs (82 lines):
diff --git a/monetdb5/modules/mal/mal_io.mx b/monetdb5/modules/mal/mal_io.mx
--- a/monetdb5/modules/mal/mal_io.mx
+++ b/monetdb5/modules/mal/mal_io.mx
@@ -343,17 +343,30 @@
}
@= sprintf
if (width > adds) {
- adds = width+10;
- add = (str) alloca((int)adds);
+ str newadd;
+ newadd = GDKrealloc(add, width + 10);
+ if (newadd != NULL) {
+ adds = width + 10;
+ add = newadd;
+ }
}
- n = snprintf( add, adds, meta, @1 );
+ n = snprintf(add, adds, meta, @1);
while (n < 0 || (size_t) n >= adds) {
- if (n >= 0) /* glibc 2.1 */
- adds = n+1; /* precisely what is needed */
- else /* glibc 2.0 */
- adds *= 2; /* twice the old size */
- add = (str) alloca ((int)adds);
- n = snprintf( add, adds, meta, @1 );
+ size_t newadds;
+ str newadd;
+
+ if (n >= 0) /* glibc 2.1 */
+ newadds = n + 1; /* precisely what is needed */
+ else /* glibc 2.0 */
+ newadds = n * 2; /* twice the old size */
+
+ newadd = GDKrealloc(add, newadds);
+ if (newadd == NULL)
+ break;
+
+ adds = newadds;
+ add = newadd;
+ n = snprintf(add, adds, meta, @1);
}
@
@c
@@ -362,7 +375,7 @@
static char type_error[80] = OPERATION_FAILED " Illegal type in param %d.\n";
#define return_error(x)\
- GDKfree(buf); throw(MAL,"io.printf", x,argc);
+ GDKfree(buf); GDKfree(add); throw(MAL,"io.printf", x,argc);
static char niltext[4] = "nil";
@@ -374,7 +387,7 @@
int prec = 0, dotseen = 0, escaped = 0, type, size, argc = 1;
size_t adds = 100, width = 0;
- char addbuf[100], *add = addbuf, *dst, *buf, *cur, *paramseen = NULL;
+ char *add, *dst, *buf, *cur, *paramseen = NULL;
char *p;
if (format == NULL) {
@@ -388,6 +401,12 @@
throw(MAL,"io.printf",MAL_MALLOC_FAIL);
*res = NULL;
+ add = GDKmalloc(adds);
+ if (add == NULL) {
+ GDKfree(buf);
+ throw(MAL,"io.printf",MAL_MALLOC_FAIL);
+ }
+
va_start(ap,format);
for (cur = format; *cur; cur++) {
if (paramseen) {
@@ -581,6 +600,7 @@
@:writemem(1)@
*dst = 0;
*res = buf;
+ GDKfree(add);
return MAL_SUCCEED;
}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list