This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Backport #34126
[metaconfig.git] / U / perl / d_sprintf_len.U
1 ?RCS: Copyright (c) 2005-2008 H.Merijn Brand
2 ?RCS:
3 ?RCS: You may distribute under the terms of either the GNU General Public
4 ?RCS: License or the Artistic License, as specified in the README file.
5 ?RCS:
6 ?MAKE:d_sprintf_returns_strlen: Compile cat rm_try run i_stdlib i_string i_math echo
7 ?MAKE:  -pick add $@ %<
8 ?S:d_sprintf_returns_strlen:
9 ?S:     This variable defines whether sprintf returns the length of the string
10 ?S:     (as per the ANSI spec). Some C libraries retain compatibility with
11 ?S:     pre-ANSI C and return a pointer to the passed in buffer; for these
12 ?S:     this variable will be undef.
13 ?S:.
14 ?C:SPRINTF_RETURNS_STRLEN:
15 ?C:     This variable defines whether sprintf returns the length of the string
16 ?C:     (as per the ANSI spec). Some C libraries retain compatibility with
17 ?C:     pre-ANSI C and return a pointer to the passed in buffer; for these
18 ?C:     this variable will be undef.
19 ?C:.
20 ?H:#$d_sprintf_returns_strlen SPRINTF_RETURNS_STRLEN    /**/
21 ?H:.
22 ?T:xxx
23 ?F:!try
24 : see if sprintf returns the length of the string in the buffer as per ANSI
25 $echo "Checking whether sprintf returns the length of the string..." >&4
26 $cat <<EOP >try.c
27 #include <stdio.h>
28 #$i_stdlib I_STDLIB
29 #ifdef I_STDLIB
30 #include <stdlib.h>
31 #endif
32 #$i_string I_STRING
33 #ifdef I_STRING
34 #  include <string.h>
35 #else
36 #  include <strings.h>
37 #endif
38 #$i_math I_MATH
39 #ifdef I_MATH
40 #include <math.h>
41 #endif
42
43 char buffer[256];
44
45 int check (size_t expect, int test) {
46   size_t got = strlen(buffer);
47   if (expect == got)
48     return 0;
49
50   printf("expected %ld, got %ld in test %d '%s'\n", (long) expect, (long) got,
51        test, buffer);
52   exit (test);
53 }
54
55 int main(int argc, char **argv) {
56   int test = 0;
57
58   check(sprintf(buffer, ""), ++test);
59   check(sprintf(buffer, "%s %s", "perl", "rules"), ++test);
60   check(sprintf(buffer, "I like %g", atan2(0,-1)), ++test);
61
62   return 0;
63 }
64 EOP
65 set try
66
67 if eval $compile; then
68     xxx="`$run ./try`"
69     case "$?" in
70         0) cat >&4 <<EOM
71 sprintf returns the length of the string (as ANSI says it should)
72 EOM
73         d_sprintf_returns_strlen="$define"
74         ;;
75         *) cat >&4 <<EOM
76 sprintf does not return the length of the string (how old is this system?)
77 EOM
78         d_sprintf_returns_strlen="$undef"
79         ;;
80     esac
81 else
82     echo "(I can't seem to compile the test program--assuming it doesn't)" >&4
83     d_sprintf_returns_strlen="$undef"
84 fi
85 $rm_try
86