aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fontconfig/Makefile.am1
-rw-r--r--fontconfig/config-fixups.h4
-rw-r--r--fontconfig/configure.ac1
-rw-r--r--mesalib/src/gallium/auxiliary/util/u_blitter.c46
-rw-r--r--mesalib/src/gallium/auxiliary/util/u_blitter.h5
-rw-r--r--mesalib/src/gallium/auxiliary/util/u_tile.c36
-rw-r--r--mesalib/src/mapi/glapi/gen/glX_proto_send.py35
-rw-r--r--mesalib/src/mesa/state_tracker/st_cb_texture.c10
-rw-r--r--xorg-server/dix/getevents.c18
-rw-r--r--xorg-server/include/misc.h1
-rw-r--r--xorg-server/mi/mipointer.c2
-rw-r--r--xorg-server/os/log.c48
-rw-r--r--xorg-server/os/utils.c14
-rw-r--r--xorg-server/test/signal-logging.c210
14 files changed, 393 insertions, 38 deletions
diff --git a/fontconfig/Makefile.am b/fontconfig/Makefile.am
index 4e664ffea..f4203d6a2 100644
--- a/fontconfig/Makefile.am
+++ b/fontconfig/Makefile.am
@@ -27,6 +27,7 @@ SUBDIRS=fontconfig fc-case fc-lang fc-glyphname src \
conf.d $(DOCSRC) test
AUTOMAKE_OPTIONS = dist-bzip2
+ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = \
fontconfig.pc.in \
diff --git a/fontconfig/config-fixups.h b/fontconfig/config-fixups.h
index 0e708462e..93ebf5bb3 100644
--- a/fontconfig/config-fixups.h
+++ b/fontconfig/config-fixups.h
@@ -20,8 +20,6 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
-#ifndef _CONFIG_FIXUPS_H_
-#define _CONFIG_FIXUPS_H_
/* This header file is supposed to be included in config.h */
@@ -40,5 +38,3 @@
# define ALIGNOF_DOUBLE 4
# endif
#endif
-
-#endif /* _CONFIG_FIXUPS_H_ */
diff --git a/fontconfig/configure.ac b/fontconfig/configure.ac
index 4de2d089c..1270ba5bf 100644
--- a/fontconfig/configure.ac
+++ b/fontconfig/configure.ac
@@ -57,6 +57,7 @@ AC_SUBST(LIBT_CURRENT_MINUS_AGE)
dnl ==========================================================================
AC_CONFIG_HEADERS(config.h)
+AC_CONFIG_MACRO_DIR([m4])
AC_PROG_CC
AC_PROG_INSTALL
diff --git a/mesalib/src/gallium/auxiliary/util/u_blitter.c b/mesalib/src/gallium/auxiliary/util/u_blitter.c
index a95e1b535..ad4ccd9eb 100644
--- a/mesalib/src/gallium/auxiliary/util/u_blitter.c
+++ b/mesalib/src/gallium/auxiliary/util/u_blitter.c
@@ -1515,6 +1515,7 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter,
pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE));
+ pipe->set_sample_mask(pipe, (1ull << MAX2(1, src->nr_samples)) - 1);
memset(&surf_tmpl, 0, sizeof(surf_tmpl));
surf_tmpl.format = dst->format;
@@ -1552,3 +1553,48 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter,
pipe_surface_reference(&srcsurf, NULL);
pipe_surface_reference(&dstsurf, NULL);
}
+
+void util_blitter_custom_color(struct blitter_context *blitter,
+ struct pipe_surface *dstsurf,
+ void *custom_blend)
+{
+ struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
+ struct pipe_context *pipe = ctx->base.pipe;
+ struct pipe_framebuffer_state fb_state;
+
+ assert(dstsurf->texture);
+ if (!dstsurf->texture)
+ return;
+
+ /* check the saved state */
+ blitter_set_running_flag(ctx);
+ blitter_check_saved_vertex_states(ctx);
+ blitter_check_saved_fragment_states(ctx);
+ blitter_check_saved_fb_state(ctx);
+
+ /* bind states */
+ pipe->bind_blend_state(pipe, custom_blend);
+ pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
+ pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE));
+ pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
+ pipe->set_sample_mask(pipe, (1ull << MAX2(1, dstsurf->texture->nr_samples)) - 1);
+
+ /* set a framebuffer state */
+ fb_state.width = dstsurf->width;
+ fb_state.height = dstsurf->height;
+ fb_state.nr_cbufs = 1;
+ fb_state.cbufs[0] = dstsurf;
+ fb_state.zsbuf = 0;
+ pipe->set_framebuffer_state(pipe, &fb_state);
+ pipe->set_sample_mask(pipe, ~0);
+
+ blitter_set_common_draw_rect_state(ctx);
+ blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
+ blitter->draw_rectangle(blitter, 0, 0, dstsurf->width, dstsurf->height,
+ 0, 0, NULL);
+
+ blitter_restore_vertex_states(ctx);
+ blitter_restore_fragment_states(ctx);
+ blitter_restore_fb_state(ctx);
+ blitter_unset_running_flag(ctx);
+}
diff --git a/mesalib/src/gallium/auxiliary/util/u_blitter.h b/mesalib/src/gallium/auxiliary/util/u_blitter.h
index f227902c1..e06e8b12d 100644
--- a/mesalib/src/gallium/auxiliary/util/u_blitter.h
+++ b/mesalib/src/gallium/auxiliary/util/u_blitter.h
@@ -308,6 +308,11 @@ void util_blitter_custom_depth_stencil(struct blitter_context *blitter,
unsigned sample_mask,
void *dsa_stage, float depth);
+/* Used by r600g for color decompression. */
+void util_blitter_custom_color(struct blitter_context *blitter,
+ struct pipe_surface *dstsurf,
+ void *custom_blend);
+
/* Used by r600g for MSAA color resolve. */
void util_blitter_custom_resolve_color(struct blitter_context *blitter,
struct pipe_resource *dst,
diff --git a/mesalib/src/gallium/auxiliary/util/u_tile.c b/mesalib/src/gallium/auxiliary/util/u_tile.c
index ea4b91f95..48e73c40b 100644
--- a/mesalib/src/gallium/auxiliary/util/u_tile.c
+++ b/mesalib/src/gallium/auxiliary/util/u_tile.c
@@ -679,6 +679,28 @@ pipe_get_tile_z(struct pipe_context *pipe,
}
}
break;
+ case PIPE_FORMAT_Z32_FLOAT:
+ {
+ const float *ptrc = (const float *)(map + y * pt->stride + x*4);
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ /* convert float Z to 32-bit Z */
+ if (ptrc[j] <= 0.0) {
+ pDest[j] = 0;
+ }
+ else if (ptrc[j] >= 1.0) {
+ pDest[j] = 0xffffffff;
+ }
+ else {
+ double z = ptrc[j] * 0xffffffff;
+ pDest[j] = (uint) z;
+ }
+ }
+ pDest += dstStride;
+ ptrc += pt->stride/4;
+ }
+ }
+ break;
default:
assert(0);
}
@@ -786,6 +808,20 @@ pipe_put_tile_z(struct pipe_context *pipe,
}
}
break;
+ case PIPE_FORMAT_Z32_FLOAT:
+ {
+ float *pDest = (float *) (map + y * pt->stride + x*2);
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ /* convert 32-bit integer Z to float Z */
+ const double scale = 1.0 / 0xffffffffU;
+ pDest[j] = ptrc[j] * scale;
+ }
+ pDest += pt->stride/4;
+ ptrc += srcStride;
+ }
+ }
+ break;
default:
assert(0);
}
diff --git a/mesalib/src/mapi/glapi/gen/glX_proto_send.py b/mesalib/src/mapi/glapi/gen/glX_proto_send.py
index ca3a79056..c53359240 100644
--- a/mesalib/src/mapi/glapi/gen/glX_proto_send.py
+++ b/mesalib/src/mapi/glapi/gen/glX_proto_send.py
@@ -681,16 +681,31 @@ generic_%u_byte( GLint rop, const void * ptr )
if f.needs_reply():
print ' %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
- if output and f.reply_always_array:
- print ' (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
-
- elif output and not f.reply_always_array:
- if not output.is_image():
- print ' if (%s_data_length(reply) == 0)' % (xcb_name)
- print ' (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
- print ' else'
- print ' (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
-
+ if output:
+ if output.is_image():
+ [dim, w, h, d, junk] = output.get_dimensions()
+ if f.dimensions_in_reply:
+ w = "reply->width"
+ h = "reply->height"
+ d = "reply->depth"
+ if dim < 2:
+ h = "1"
+ else:
+ print ' if (%s == 0) { %s = 1; }' % (h, h)
+ if dim < 3:
+ d = "1"
+ else:
+ print ' if (%s == 0) { %s = 1; }' % (d, d)
+
+ print ' __glEmptyImage(gc, 3, %s, %s, %s, %s, %s, %s_data(reply), %s);' % (w, h, d, output.img_format, output.img_type, xcb_name, output.name)
+ else:
+ if f.reply_always_array:
+ print ' (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
+ else:
+ print ' if (%s_data_length(reply) == 0)' % (xcb_name)
+ print ' (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
+ print ' else'
+ print ' (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
if f.return_type != 'void':
print ' retval = reply->ret_val;'
diff --git a/mesalib/src/mesa/state_tracker/st_cb_texture.c b/mesalib/src/mesa/state_tracker/st_cb_texture.c
index 3de96adf3..ed3bbc725 100644
--- a/mesalib/src/mesa/state_tracker/st_cb_texture.c
+++ b/mesalib/src/mesa/state_tracker/st_cb_texture.c
@@ -989,6 +989,16 @@ st_CopyTexSubImage(struct gl_context *ctx, GLuint dims,
goto fallback;
}
+ if (texImage->TexObject->Target == GL_TEXTURE_1D_ARRAY) {
+ /* 1D arrays might be thought of as 2D images but the actual layout
+ * might not be that way. At some points, we convert OpenGL's 1D
+ * array 'height' into gallium 'layers' and that prevents the blit
+ * utility code from doing the right thing. Simpy use the memcpy-based
+ * fallback.
+ */
+ goto fallback;
+ }
+
if (matching_base_formats &&
src_format == dest_format &&
!do_flip) {
diff --git a/xorg-server/dix/getevents.c b/xorg-server/dix/getevents.c
index 9a350388b..04e1d6b7e 100644
--- a/xorg-server/dix/getevents.c
+++ b/xorg-server/dix/getevents.c
@@ -1348,6 +1348,7 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
RawDeviceEvent *raw;
double screenx = 0.0, screeny = 0.0; /* desktop coordinate system */
double devx = 0.0, devy = 0.0; /* desktop-wide in device coords */
+ int sx, sy; /* for POINTER_SCREEN */
ValuatorMask mask;
ScreenPtr scr;
@@ -1390,8 +1391,11 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
/* valuators are in driver-native format (rel or abs) */
if (flags & POINTER_ABSOLUTE) {
- if (flags & POINTER_SCREEN) /* valuators are in screen coords */
+ if (flags & POINTER_SCREEN) { /* valuators are in screen coords */
+ sx = valuator_mask_get(&mask, 0);
+ sy = valuator_mask_get(&mask, 1);
scale_from_screen(pDev, &mask);
+ }
transformAbsolute(pDev, &mask);
clipAbsolute(pDev, &mask);
@@ -1409,6 +1413,18 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
/* valuators are in device coordinate system in absolute coordinates */
scale_to_desktop(pDev, &mask, &devx, &devy, &screenx, &screeny);
+
+ /* #53037 XWarpPointer's scaling back and forth between screen and
+ device may leave us with rounding errors. End result is that the
+ pointer doesn't end up on the pixel it should.
+ Avoid this by forcing screenx/screeny back to what the input
+ coordinates were.
+ */
+ if (flags & POINTER_SCREEN) {
+ screenx = sx;
+ screeny = sy;
+ }
+
scr = positionSprite(pDev, (flags & POINTER_ABSOLUTE) ? Absolute : Relative,
&mask, &devx, &devy, &screenx, &screeny);
diff --git a/xorg-server/include/misc.h b/xorg-server/include/misc.h
index 406ced8af..9ed54b1a8 100644
--- a/xorg-server/include/misc.h
+++ b/xorg-server/include/misc.h
@@ -257,6 +257,7 @@ padding_for_int32(const int bytes)
extern char **xstrtokenize(const char *str, const char *separators);
+extern void FormatInt64(int64_t num, char *string);
extern void FormatUInt64(uint64_t num, char *string);
extern void FormatUInt64Hex(uint64_t num, char *string);
diff --git a/xorg-server/mi/mipointer.c b/xorg-server/mi/mipointer.c
index a56838ead..4defaf5ec 100644
--- a/xorg-server/mi/mipointer.c
+++ b/xorg-server/mi/mipointer.c
@@ -575,7 +575,7 @@ miPointerSetPosition(DeviceIntPtr pDev, int mode, double *screenx,
miPointerPtr pPointer;
- if (!pDev || !pDev->coreEvents)
+ if (!pDev)
return NULL;
pPointer = MIPOINTER(pDev);
diff --git a/xorg-server/os/log.c b/xorg-server/os/log.c
index de7aaade7..9c83175c5 100644
--- a/xorg-server/os/log.c
+++ b/xorg-server/os/log.c
@@ -296,6 +296,7 @@ pnprintf(char *string, size_t size, const char *f, va_list args)
int p_len;
int i;
uint64_t ui;
+ int64_t si;
for (; f_idx < f_len && s_idx < size - 1; f_idx++) {
if (f[f_idx] != '%') {
@@ -320,6 +321,15 @@ pnprintf(char *string, size_t size, const char *f, va_list args)
for (i = 0; i < p_len && s_idx < size - 1; i++)
string[s_idx++] = number[i];
break;
+ case 'i':
+ case 'd':
+ si = va_arg(args, int);
+ FormatInt64(si, number);
+ p_len = strlen_sigsafe(number);
+
+ for (i = 0; i < p_len && s_idx < size - 1; i++)
+ string[s_idx++] = number[i];
+ break;
case 'p':
string[s_idx++] = '0';
@@ -463,6 +473,7 @@ LogMessageTypeVerbString(MessageType type, int verb)
void
LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
{
+ static unsigned int warned;
const char *type_str;
char buf[1024];
const size_t size = sizeof(buf);
@@ -470,13 +481,17 @@ LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
size_t len = 0;
if (inSignalContext) {
- BUG_WARN_MSG(inSignalContext,
- "Warning: attempting to log data in a signal unsafe "
- "manner while in signal context. Please update to check "
- "inSignalContext and/or use LogMessageVerbSigSafe() or "
- "ErrorFSigSafe(). The offending log format message is:\n"
- "%s\n", format);
- return;
+ if (warned < 3) {
+ BUG_WARN_MSG(inSignalContext,
+ "Warning: attempting to log data in a signal unsafe "
+ "manner while in signal context.\nPlease update to check "
+ "inSignalContext and/or use LogMessageVerbSigSafe() or "
+ "ErrorFSigSafe().\nThe offending log format message is:\n"
+ "%s\n", format);
+ warned++;
+ if (warned == 3)
+ LogMessageVerbSigSafe(X_WARNING, -1, "Warned %u times about sigsafe logging. Will be quiet now.\n", warned);
+ }
}
type_str = LogMessageTypeVerbString(type, verb);
@@ -562,6 +577,7 @@ void
LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
va_list msg_args, const char *hdr_format, va_list hdr_args)
{
+ static unsigned int warned;
const char *type_str;
char buf[1024];
const size_t size = sizeof(buf);
@@ -569,13 +585,17 @@ LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
size_t len = 0;
if (inSignalContext) {
- BUG_WARN_MSG(inSignalContext,
- "Warning: attempting to log data in a signal unsafe "
- "manner while in signal context. Please update to check "
- "inSignalContext and/or use LogMessageVerbSigSafe(). The "
- "offending header and log message formats are:\n%s %s\n",
- hdr_format, msg_format);
- return;
+ if (warned < 3) {
+ BUG_WARN_MSG(inSignalContext,
+ "Warning: attempting to log data in a signal unsafe "
+ "manner while in signal context.\nPlease update to check "
+ "inSignalContext and/or use LogMessageVerbSigSafe().\nThe "
+ "offending header and log message formats are:\n%s %s\n",
+ hdr_format, msg_format);
+ warned++;
+ if (warned == 3)
+ LogMessageVerbSigSafe(X_WARNING, -1, "Warned %u times about sigsafe logging. Will be quiet now.\n", warned);
+ }
}
type_str = LogMessageTypeVerbString(type, verb);
diff --git a/xorg-server/os/utils.c b/xorg-server/os/utils.c
index 3e3d97011..43842c067 100644
--- a/xorg-server/os/utils.c
+++ b/xorg-server/os/utils.c
@@ -1987,6 +1987,20 @@ xstrtokenize(const char *str, const char *separators)
return NULL;
}
+/* Format a signed number into a string in a signal safe manner. The string
+ * should be at least 21 characters in order to handle all int64_t values.
+ */
+void
+FormatInt64(int64_t num, char *string)
+{
+ if (num < 0) {
+ string[0] = '-';
+ num *= -1;
+ string++;
+ }
+ FormatUInt64(num, string);
+}
+
/* Format a number into a string in a signal safe manner. The string should be
* at least 21 characters in order to handle all uint64_t values. */
void
diff --git a/xorg-server/test/signal-logging.c b/xorg-server/test/signal-logging.c
index 8aab0dd58..3206ddefa 100644
--- a/xorg-server/test/signal-logging.c
+++ b/xorg-server/test/signal-logging.c
@@ -26,6 +26,7 @@
#endif
#include <stdint.h>
+#include <unistd.h>
#include "assert.h"
#include "misc.h"
@@ -35,6 +36,26 @@ struct number_format_test {
char hex_string[17];
};
+struct signed_number_format_test {
+ int64_t number;
+ char string[21];
+};
+
+static Bool
+check_signed_number_format_test(const struct signed_number_format_test *test)
+{
+ char string[21];
+
+ FormatInt64(test->number, string);
+ if(strncmp(string, test->string, 21) != 0) {
+ fprintf(stderr, "Failed to convert %jd to decimal string (%s vs %s)\n",
+ test->number, test->string, string);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static Bool
check_number_format_test(const struct number_format_test *test)
{
@@ -57,11 +78,11 @@ check_number_format_test(const struct number_format_test *test)
return TRUE;
}
-static Bool
+static void
number_formatting(void)
{
int i;
- struct number_format_test tests[] = {
+ struct number_format_test unsigned_tests[] = {
{ /* Zero */
0,
"0",
@@ -99,17 +120,190 @@ number_formatting(void)
},
};
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
- if (!check_number_format_test(tests + i))
- return FALSE;
+ struct signed_number_format_test signed_tests[] = {
+ { /* Zero */
+ 0,
+ "0",
+ },
+ { /* Single digit number */
+ 5,
+ "5",
+ },
+ { /* Two digit decimal number */
+ 12,
+ "12",
+ },
+ { /* Two digit hex number */
+ 37,
+ "37",
+ },
+ { /* Large < 32 bit number */
+ 0xC90B2,
+ "823474",
+ },
+ { /* Large > 32 bit number */
+ 0x15D027BF211B37A,
+ "98237498237498234",
+ },
+ { /* Maximum 64-bit signed number */
+ 0x7FFFFFFFFFFFFFFF,
+ "9223372036854775807",
+ },
+ { /* Single digit number */
+ -1,
+ "-1",
+ },
+ { /* Two digit decimal number */
+ -12,
+ "-12",
+ },
+ { /* Large < 32 bit number */
+ -0xC90B2,
+ "-823474",
+ },
+ { /* Large > 32 bit number */
+ -0x15D027BF211B37A,
+ "-98237498237498234",
+ },
+ { /* Maximum 64-bit number */
+ -0x7FFFFFFFFFFFFFFF,
+ "-9223372036854775807",
+ },
+ };
+
+ for (i = 0; i < sizeof(unsigned_tests) / sizeof(unsigned_tests[0]); i++)
+ assert(check_number_format_test(unsigned_tests + i));
- return TRUE;
+ for (i = 0; i < sizeof(unsigned_tests) / sizeof(signed_tests[0]); i++)
+ assert(check_signed_number_format_test(signed_tests + i));
+}
+
+static void logging_format(void)
+{
+ const char *log_file_path = "/tmp/Xorg-logging-test.log";
+ const char *str = "%s %d %u %% %p %i";
+ char buf[1024];
+ int i;
+ unsigned int ui;
+ FILE *f;
+ char read_buf[2048];
+ char *logmsg;
+ uintptr_t ptr;
+
+ /* set up buf to contain ".....end" */
+ memset(buf, '.', sizeof(buf));
+ strcpy(&buf[sizeof(buf) - 4], "end");
+
+ LogInit(log_file_path, NULL);
+ assert(f = fopen(log_file_path, "r"));
+
+#define read_log_msg(msg) \
+ fgets(read_buf, sizeof(read_buf), f); \
+ msg = strchr(read_buf, ']') + 2; /* advance past [time.stamp] */
+
+ /* boring test message */
+ LogMessageVerbSigSafe(X_ERROR, -1, "test message\n");
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, "(EE) test message\n") == 0);
+
+ /* long buf is truncated to "....en\n" */
+#pragma GCC diagnostic ignored "-Wformat-security"
+ LogMessageVerbSigSafe(X_ERROR, -1, buf);
+#pragma GCC diagnostic pop "-Wformat-security"
+ read_log_msg(logmsg);
+ assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
+
+ /* same thing, this time as string substitution */
+ LogMessageVerbSigSafe(X_ERROR, -1, "%s", buf);
+ read_log_msg(logmsg);
+ assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
+
+ /* strings containing placeholders should just work */
+ LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", str);
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, "(EE) %s %d %u %% %p %i\n") == 0);
+
+ /* string substitution */
+ LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", "substituted string");
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, "(EE) substituted string\n") == 0);
+
+ /* number substitution */
+ ui = 0;
+ do {
+ char expected[30];
+ sprintf(expected, "(EE) %u\n", ui);
+ LogMessageVerbSigSafe(X_ERROR, -1, "%u\n", ui);
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, expected) == 0);
+ if (ui == 0)
+ ui = 1;
+ else
+ ui <<= 1;
+ } while(ui);
+
+ /* signed number substitution */
+ i = 0;
+ do {
+ char expected[30];
+ sprintf(expected, "(EE) %d\n", i);
+ LogMessageVerbSigSafe(X_ERROR, -1, "%d\n", i);
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, expected) == 0);
+
+
+ sprintf(expected, "(EE) %d\n", i | INT_MIN);
+ LogMessageVerbSigSafe(X_ERROR, -1, "%d\n", i | INT_MIN);
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, expected) == 0);
+
+ if (i == 0)
+ i = 1;
+ else
+ i <<= 1;
+ } while(i > INT_MIN);
+
+ /* hex number substitution */
+ ui = 0;
+ do {
+ char expected[30];
+ sprintf(expected, "(EE) %x\n", ui);
+ LogMessageVerbSigSafe(X_ERROR, -1, "%x\n", ui);
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, expected) == 0);
+ if (ui == 0)
+ ui = 1;
+ else
+ ui <<= 1;
+ } while(ui);
+
+ /* pointer substitution */
+ /* we print a null-pointer differently to printf */
+ LogMessageVerbSigSafe(X_ERROR, -1, "%p\n", NULL);
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, "(EE) 0x0\n") == 0);
+
+ ptr = 1;
+ do {
+ char expected[30];
+ sprintf(expected, "(EE) %p\n", (void*)ptr);
+ LogMessageVerbSigSafe(X_ERROR, -1, "%p\n", (void*)ptr);
+ read_log_msg(logmsg);
+ assert(strcmp(logmsg, expected) == 0);
+ ptr <<= 1;
+ } while(ptr);
+
+ LogClose(EXIT_NO_ERROR);
+ unlink(log_file_path);
+
+#undef read_log_msg
}
int
main(int argc, char **argv)
{
- int ok = number_formatting();
+ number_formatting();
+ logging_format();
- return ok ? 0 : 1;
+ return 0;
}