Changeset: 083a06f474a0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/083a06f474a0
Modified Files:
clients/Tests/exports.stable.out
clients/mapilib/mapi.c
clients/mapilib/mapi_intern.h
common/stream/rw.c
common/stream/stream.h
Branch: monetdburl
Log Message:
Get rid of mnstr_vprintf
diffs (171 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1687,7 +1687,6 @@ ssize_t mnstr_readline(stream *restrict
void mnstr_set_bigendian(stream *s, bool bigendian);
void mnstr_settimeout(stream *s, unsigned int ms, bool (*func)(void *), void
*data);
const char *mnstr_version(void);
-int mnstr_vprintf(stream *restrict s, _In_z_ _Printf_format_string_ const char
*restrict format, va_list ap) __attribute__((__format__(__printf__, 2, 0)));
ssize_t mnstr_write(stream *restrict s, const void *restrict buf, size_t
elmsize, size_t cnt);
int mnstr_writeBte(stream *s, int8_t val);
int mnstr_writeBteArray(stream *restrict s, const int8_t *restrict val, size_t
cnt);
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -693,6 +693,7 @@
#include "mcrypt.h"
#include "matomic.h"
#include "mstring.h"
+#include "mutils.h"
#include "mapi_intern.h"
@@ -1219,17 +1220,45 @@ mapi_log_header(Mapi mid, const char *fi
void
mapi_impl_log_record(Mapi mid, const char *filename, long line, const char
*mark, const char *fmt, ...)
{
+ va_list ap;
+
if (mid->tracelog == NULL)
return;
+ size_t needed = 128;
+ size_t to_print;
+ while (1) {
+ if (mid->tracebuffersize < needed) {
+ free(mid->tracebuffer);
+ mid->tracebuffer = malloc(needed);
+ if (mid->tracebuffer) {
+ mid->tracebuffersize = needed;
+ } else {
+ mid->tracebuffersize = 0;
+ to_print = 0;
+ break;
+ }
+ }
+ va_start(ap, fmt);
+ int n = vsnprintf(mid->tracebuffer, mid->tracebuffersize, fmt,
ap);
+ va_end(ap);
+ if (n < 0) {
+ to_print = 0;
+ break;
+ }
+ if ((size_t)n < mid->tracebuffersize) {
+ to_print = n;
+ break;
+ }
+ // need to reallocate
+ needed = n + 1;
+ }
+
mapi_log_header(mid, filename, line, mark);
-
- va_list ap;
- va_start(ap, fmt);
- mnstr_vprintf(mid->tracelog, fmt, ap);
- va_end(ap);
- mnstr_writeChr(mid->tracelog, '\n');
-
+ if (to_print > 0) {
+ mnstr_write(mid->tracelog, mid->tracebuffer, to_print, 1);
+ mnstr_writeChr(mid->tracelog, '\n');
+ }
mnstr_flush(mid->tracelog, MNSTR_FLUSH_DATA);
}
@@ -1920,16 +1949,14 @@ mapi_destroy(Mapi mid)
(void) mapi_disconnect(mid);
if (mid->tracelog)
close_stream(mid->tracelog);
- if (mid->blk.buf)
- free(mid->blk.buf);
+
+ free(mid->blk.buf);
+ free(mid->motd);
+ free(mid->server);
+ free(mid->uri);
+ free(mid->tracebuffer);
if (mid->errorstr && mid->errorstr != mapi_nomem)
free(mid->errorstr);
- if (mid->motd)
- free(mid->motd);
- if (mid->server)
- free(mid->server);
- if (mid->uri)
- free(mid->uri);
msettings_destroy(mid->settings);
diff --git a/clients/mapilib/mapi_intern.h b/clients/mapilib/mapi_intern.h
--- a/clients/mapilib/mapi_intern.h
+++ b/clients/mapilib/mapi_intern.h
@@ -246,6 +246,9 @@ struct MapiStruct {
char *redirects[MAXREDIR]; /* NULL-terminated list of redirects */
stream *tracelog; /* keep a log for inspection */
+ char *tracebuffer; /* used for formatting to tracelog */
+ size_t tracebuffersize; /* allocated size of tracebuffer */
+
stream *from, *to;
uint32_t index; /* to mark the log records */
void *filecontentprivate;
diff --git a/common/stream/rw.c b/common/stream/rw.c
--- a/common/stream/rw.c
+++ b/common/stream/rw.c
@@ -364,8 +364,9 @@ mnstr_writeHgeArray(stream *restrict s,
#endif
int
-mnstr_vprintf(stream *restrict s, const char *restrict format, va_list ap)
+mnstr_printf(stream *restrict s, const char *restrict format, ...)
{
+ va_list ap;
char buf[512], *bf = buf;
int i = 0;
size_t bfsz = sizeof(buf);
@@ -373,7 +374,9 @@ mnstr_vprintf(stream *restrict s, const
if (s == NULL || s->errkind != MNSTR_NO__ERROR)
return -1;
+ va_start(ap, format);
i = vsnprintf(bf, bfsz, format, ap);
+ va_end(ap);
while (i < 0 || (size_t) i >= bfsz) {
if (i >= 0) /* glibc 2.1 */
bfsz = (size_t) i + 1; /* precisely what is needed */
@@ -386,21 +389,12 @@ mnstr_vprintf(stream *restrict s, const
mnstr_set_error(s, MNSTR_WRITE_ERROR, "malloc failed");
return -1;
}
+ va_start(ap, format);
i = vsnprintf(bf, bfsz, format, ap);
+ va_end(ap);
}
s->write(s, (void *) bf, (size_t) i, (size_t) 1);
if (bf != buf)
free(bf);
return s->errkind == MNSTR_NO__ERROR ? i : -1;
}
-
-int
-mnstr_printf(stream *restrict s, const char *restrict format, ...)
-{
- int ret;
- va_list ap;
- va_start(ap, format);
- ret = mnstr_vprintf(s, format, ap);
- va_end(ap);
- return ret;
-}
diff --git a/common/stream/stream.h b/common/stream/stream.h
--- a/common/stream/stream.h
+++ b/common/stream/stream.h
@@ -137,8 +137,6 @@ stream_export int mnstr_writeLngArray(st
stream_export int mnstr_readHgeArray(stream *restrict s, hge *restrict val,
size_t cnt); // unused
stream_export int mnstr_writeHgeArray(stream *restrict s, const hge *restrict
val, size_t cnt); // unused
#endif
-stream_export int mnstr_vprintf(stream *restrict s, _In_z_
_Printf_format_string_ const char *restrict format, va_list ap)
- __attribute__(( __format__(__printf__, 2, 0)));
stream_export int mnstr_printf(stream *restrict s, _In_z_
_Printf_format_string_ const char *restrict format, ...) // USED all over
__attribute__((__format__(__printf__, 2, 3)));
stream_export ssize_t mnstr_read(stream *restrict s, void *restrict buf,
size_t elmsize, size_t cnt); // USED all over
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]