xref: /petsc/src/sys/tests/ex37.c (revision a69119a591a03a9d906b29c0a4e9802e4d7c9795)
1 
2 static char help[] = "Test PetscFormatConvertGetSize().\n";
3 
4 #include <petscsys.h>
5 #include <petscviewer.h>
6 
7 PetscErrorCode TestPetscVSNPrintf(char *, size_t, size_t *, const char *, ...);
8 
9 int main(int argc, char **argv) {
10   size_t      sz, fullLength;
11   char       *newformatstr, buffer[128], longstr[256], superlongstr[10000];
12   const char *formatstr = "Greetings %D %3.2f %g\n";
13   PetscInt    i, twentytwo = 22;
14 
15   PetscFunctionBeginUser;
16   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
17 
18   /* test that PetscFormatConvertGetSize() correctly counts needed amount of space */
19   PetscCall(PetscFormatConvertGetSize(formatstr, &sz));
20   if (PetscDefined(USE_64BIT_INDICES)) {
21     PetscCheck(sz == 29, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 29", sz);
22   } else {
23     PetscCheck(sz == 27, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 27", sz);
24   }
25   PetscCall(PetscMalloc1(sz, &newformatstr));
26   PetscCall(PetscFormatConvert(formatstr, newformatstr));
27   PetscCall(PetscPrintf(PETSC_COMM_WORLD, newformatstr, twentytwo, 3.47, 3.0));
28   PetscCall(PetscFree(newformatstr));
29 
30   /* Test correct count is returned with %g format */
31   PetscCall(PetscSNPrintfCount(buffer, sizeof(buffer), "Test %g %g\n", &sz, 3.33, 2.7));
32   PetscCall(PetscStrlen(buffer, &fullLength));
33   PetscCheck(sz == fullLength + 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscSNPrintfCount() count should be %d it is %d", (int)fullLength + 1, (int)sz);
34 
35   /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is long enough */
36   PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", "This is my string"));
37   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "buffer :%s: fullLength %d\n", buffer, (int)fullLength));
38 
39   /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is not long enough */
40   for (i = 0; i < 255; i++) longstr[i] = 's';
41   longstr[255] = 0;
42   PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", longstr));
43   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "longstr fullLength %d\n", (int)fullLength));
44 
45   /* test that PetscPrintf() works for strings longer than the default buffer size */
46   for (i = 0; i < 9998; i++) superlongstr[i] = 's';
47   superlongstr[9998] = 't';
48   superlongstr[9999] = 0;
49   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr));
50 
51   /* test that PetscSynchronizedPrintf() works for strings longer than the default buffer size */
52   PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr));
53   PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout));
54 
55   /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */
56   PetscCall(PetscSynchronizedFPrintf(PETSC_COMM_WORLD, stdout, "Greetings %s", superlongstr));
57   PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout));
58 
59   /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */
60   PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
61   PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "Greetings %s", superlongstr));
62   PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
63   PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
64 
65   /* add new line to end of file so that diff does not warn about it being missing */
66   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n"));
67   PetscCall(PetscFinalize());
68   return 0;
69 }
70 
71 PetscErrorCode TestPetscVSNPrintf(char *str, size_t l_str, size_t *fullLength, const char *format, ...) {
72   va_list Argp;
73 
74   PetscFunctionBegin;
75   va_start(Argp, format);
76   PetscCall(PetscVSNPrintf(str, l_str, format, fullLength, Argp));
77   PetscFunctionReturn(0);
78 }
79 /*TEST
80 
81    test:
82      nsize: 2
83      requires: defined(PETSC_HAVE_VA_COPY)
84 
85 TEST*/
86