svn commit: samba r18046 - in branches/SAMBA_4_0/source/lib/replace: .

idra at samba.org idra at samba.org
Mon Sep 4 16:30:41 GMT 2006


Author: idra
Date: 2006-09-04 16:30:40 +0000 (Mon, 04 Sep 2006)
New Revision: 18046

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=18046

Log:

Add 'z' specifier support and a configure test.

Jeremy should I backport this to samba3 too?


Modified:
   branches/SAMBA_4_0/source/lib/replace/config.m4
   branches/SAMBA_4_0/source/lib/replace/snprintf.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/replace/config.m4
===================================================================
--- branches/SAMBA_4_0/source/lib/replace/config.m4	2006-09-04 13:47:57 UTC (rev 18045)
+++ branches/SAMBA_4_0/source/lib/replace/config.m4	2006-09-04 16:30:40 UTC (rev 18046)
@@ -91,7 +91,9 @@
 AC_CACHE_CHECK([for C99 vsnprintf],samba_cv_HAVE_C99_VSNPRINTF,[
 AC_TRY_RUN([
 #include <sys/types.h>
+#include <stdio.h>
 #include <stdarg.h>
+#include <stdlib.h>
 void foo(const char *format, ...) { 
        va_list ap;
        int len;
@@ -107,12 +109,14 @@
        va_start(ap, format);
        len = vsnprintf(0, 0, format, ap);
        va_end(ap);
-       if (len != 5) exit(1);
+       if (len != 5) exit(2);
 
-       if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(1);
+       if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(3);
 
-       if (snprintf(buf, 20, "%lld", l) != 12 || strcmp(buf, "123456789000") != 0) exit(1);
-       if (snprintf(buf, 20, "%s", 0) < 3) exit(1);
+       if (snprintf(buf, 20, "%lld", l) != 12 || strcmp(buf, "123456789000") != 0) exit(4);
+       if (snprintf(buf, 20, "%zu", 123456789) != 9 || strcmp(buf, "123456789") != 0) exit(5);
+       if (snprintf(buf, 20, "%2\$d %1\$d", 3, 4) != 3 || strcmp(buf, "4 3") != 0) exit(6);
+       if (snprintf(buf, 20, "%s", 0) < 3) exit(7);
 
        exit(0);
 }

Modified: branches/SAMBA_4_0/source/lib/replace/snprintf.c
===================================================================
--- branches/SAMBA_4_0/source/lib/replace/snprintf.c	2006-09-04 13:47:57 UTC (rev 18045)
+++ branches/SAMBA_4_0/source/lib/replace/snprintf.c	2006-09-04 16:30:40 UTC (rev 18046)
@@ -200,6 +200,7 @@
 #define DP_C_LONG    3
 #define DP_C_LDOUBLE 4
 #define DP_C_LLONG   5
+#define DP_C_SIZET   6
 
 /* Chunk types */
 #define CNK_FMT_STR 0
@@ -467,6 +468,10 @@
 				cnk->cflags = DP_C_LDOUBLE;
 				ch = *format++;
 				break;
+			case 'z':
+				cnk->cflags = DP_C_SIZET;
+				ch = *format++;
+				break;
 			default:
 				break;
 			}
@@ -575,6 +580,8 @@
 				cnk->value = va_arg (args, long int);
 			else if (cnk->cflags == DP_C_LLONG)
 				cnk->value = va_arg (args, LLONG);
+			else if (cnk->cflags == DP_C_SIZET)
+				cnk->value = va_arg (args, ssize_t);
 			else
 				cnk->value = va_arg (args, int);
 
@@ -592,6 +599,8 @@
 				cnk->value = (unsigned long int)va_arg (args, unsigned long int);
 			else if (cnk->cflags == DP_C_LLONG)
 				cnk->value = (LLONG)va_arg (args, unsigned LLONG);
+			else if (cnk->cflags == DP_C_SIZET)
+				cnk->value = (size_t)va_arg (args, size_t);
 			else
 				cnk->value = (unsigned int)va_arg (args, unsigned int);
 
@@ -644,6 +653,8 @@
 				cnk->pnum = va_arg (args, long int *);
 			else if (cnk->cflags == DP_C_LLONG)
 				cnk->pnum = va_arg (args, LLONG *);
+			else if (cnk->cflags == DP_C_SIZET)
+				cnk->pnum = va_arg (args, ssize_t *);
 			else
 				cnk->pnum = va_arg (args, int *);
 
@@ -725,6 +736,8 @@
 				*((long int *)(cnk->pnum)) = (long int)currlen;
 			else if (cnk->cflags == DP_C_LLONG)
 				*((LLONG *)(cnk->pnum)) = (LLONG)currlen;
+			else if (cnk->cflags == DP_C_SIZET)
+				*((ssize_t *)(cnk->pnum)) = (ssize_t)currlen;
 			else
 				*((int *)(cnk->pnum)) = (int)currlen;
 			break;
@@ -1258,6 +1271,7 @@
 #ifdef TEST_SNPRINTF
 
  int sprintf(char *str,const char *fmt,...);
+ int printf(const char *fmt,...);
 
  int main (void)
 {
@@ -1327,15 +1341,20 @@
 	int fail = 0;
 	int num = 0;
 	int l1, l2;
+	char *ss_fmt[] = {
+		"%zd",
+		"%zu",
+		NULL
+	};
+	size_t ss_nums[] = {134, 91340, 123456789, 0203, 1234567890, 0};
 
 	printf ("Testing snprintf format codes against system sprintf...\n");
 
 	for (x = 0; fp_fmt[x] ; x++) {
 		for (y = 0; fp_nums[y] != 0 ; y++) {
 			buf1[0] = buf2[0] = '\0';
-			l1 = snprintf(NULL, 0, fp_fmt[x], fp_nums[y]);
-			l2 = sprintf(buf1, fp_fmt[x], fp_nums[y]);
-			sprintf (buf2, fp_fmt[x], fp_nums[y]);
+			l1 = snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]);
+			l2 = sprintf (buf2, fp_fmt[x], fp_nums[y]);
 			buf1[1023] = buf2[1023] = '\0';
 			if (strcmp (buf1, buf2) || (l1 != l2)) {
 				printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", 
@@ -1349,9 +1368,8 @@
 	for (x = 0; int_fmt[x] ; x++) {
 		for (y = 0; int_nums[y] != 0 ; y++) {
 			buf1[0] = buf2[0] = '\0';
-			l1 = snprintf(NULL, 0, int_fmt[x], int_nums[y]);
-			l2 = sprintf(buf1, int_fmt[x], int_nums[y]);
-			sprintf (buf2, int_fmt[x], int_nums[y]);
+			l1 = snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]);
+			l2 = sprintf (buf2, int_fmt[x], int_nums[y]);
 			buf1[1023] = buf2[1023] = '\0';
 			if (strcmp (buf1, buf2) || (l1 != l2)) {
 				printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", 
@@ -1365,9 +1383,8 @@
 	for (x = 0; str_fmt[x] ; x++) {
 		for (y = 0; str_vals[y] != 0 ; y++) {
 			buf1[0] = buf2[0] = '\0';
-			l1 = snprintf(NULL, 0, str_fmt[x], str_vals[y]);
-			l2 = sprintf(buf1, str_fmt[x], str_vals[y]);
-			sprintf (buf2, str_fmt[x], str_vals[y]);
+			l1 = snprintf(buf1, sizeof(buf1), str_fmt[x], str_vals[y]);
+			l2 = sprintf (buf2, str_fmt[x], str_vals[y]);
 			buf1[1023] = buf2[1023] = '\0';
 			if (strcmp (buf1, buf2) || (l1 != l2)) {
 				printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", 
@@ -1382,9 +1399,8 @@
 	for (x = 0; ll_fmt[x] ; x++) {
 		for (y = 0; ll_nums[y] != 0 ; y++) {
 			buf1[0] = buf2[0] = '\0';
-			l1 = snprintf(NULL, 0, ll_fmt[x], ll_nums[y]);
-			l2 = sprintf(buf1, ll_fmt[x], ll_nums[y]);
-			sprintf (buf2, ll_fmt[x], ll_nums[y]);
+			l1 = snprintf(buf1, sizeof(buf1), ll_fmt[x], ll_nums[y]);
+			l2 = sprintf (buf2, ll_fmt[x], ll_nums[y]);
 			buf1[1023] = buf2[1023] = '\0';
 			if (strcmp (buf1, buf2) || (l1 != l2)) {
 				printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", 
@@ -1431,6 +1447,21 @@
 				"%4$*1$d %2$s %3$*1$.*1$f", l1, buf1, l2, buf2);
 		fail++;
 	}
+
+	for (x = 0; ss_fmt[x] ; x++) {
+		for (y = 0; ss_nums[y] != 0 ; y++) {
+			buf1[0] = buf2[0] = '\0';
+			l1 = snprintf(buf1, sizeof(buf1), ss_fmt[x], ss_nums[y]);
+			l2 = sprintf (buf2, ss_fmt[x], ss_nums[y]);
+			buf1[1023] = buf2[1023] = '\0';
+			if (strcmp (buf1, buf2) || (l1 != l2)) {
+				printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", 
+				       ss_fmt[x], l1, buf1, l2, buf2);
+				fail++;
+			}
+			num++;
+		}
+	}
 #if 0
 	buf1[0] = buf2[0] = '\0';
 	l1 = snprintf(buf1, sizeof(buf1), "%lld", (LLONG)1234567890);



More information about the samba-cvs mailing list