xref: /petsc/src/sys/tests/ex37.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Test PetscFormatConvertGetSize().\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscsys.h>
5c4762a1bSJed Brown #include <petscviewer.h>
6c4762a1bSJed Brown 
7c4762a1bSJed Brown PetscErrorCode TestPetscVSNPrintf(char *, size_t, size_t *, const char *, ...);
8c4762a1bSJed Brown 
9d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
10d71ae5a4SJacob Faibussowitsch {
11c4762a1bSJed Brown   size_t      sz, fullLength;
12c4762a1bSJed Brown   char       *newformatstr, buffer[128], longstr[256], superlongstr[10000];
13c4762a1bSJed Brown   const char *formatstr = "Greetings %D %3.2f %g\n";
14c4762a1bSJed Brown   PetscInt    i, twentytwo = 22;
15c4762a1bSJed Brown 
16327415f7SBarry Smith   PetscFunctionBeginUser;
179566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
18c4762a1bSJed Brown 
19c4762a1bSJed Brown   /* test that PetscFormatConvertGetSize() correctly counts needed amount of space */
209566063dSJacob Faibussowitsch   PetscCall(PetscFormatConvertGetSize(formatstr, &sz));
2155ed0643SJacob Faibussowitsch   if (PetscDefined(USE_64BIT_INDICES)) {
2208401ef6SPierre Jolivet     PetscCheck(sz == 29, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 29", sz);
2355ed0643SJacob Faibussowitsch   } else {
2408401ef6SPierre Jolivet     PetscCheck(sz == 27, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 27", sz);
2555ed0643SJacob Faibussowitsch   }
269566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(sz, &newformatstr));
279566063dSJacob Faibussowitsch   PetscCall(PetscFormatConvert(formatstr, newformatstr));
289566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, newformatstr, twentytwo, 3.47, 3.0));
299566063dSJacob Faibussowitsch   PetscCall(PetscFree(newformatstr));
30c4762a1bSJed Brown 
31c4762a1bSJed Brown   /* Test correct count is returned with %g format */
329566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintfCount(buffer, sizeof(buffer), "Test %g %g\n", &sz, 3.33, 2.7));
339566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(buffer, &fullLength));
3408401ef6SPierre Jolivet   PetscCheck(sz == fullLength + 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscSNPrintfCount() count should be %d it is %d", (int)fullLength + 1, (int)sz);
35c4762a1bSJed Brown 
36c4762a1bSJed Brown   /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is long enough */
379566063dSJacob Faibussowitsch   PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", "This is my string"));
389566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "buffer :%s: fullLength %d\n", buffer, (int)fullLength));
39c4762a1bSJed Brown 
40c4762a1bSJed Brown   /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is not long enough */
41ad540459SPierre Jolivet   for (i = 0; i < 255; i++) longstr[i] = 's';
429371c9d4SSatish Balay   longstr[255] = 0;
439566063dSJacob Faibussowitsch   PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", longstr));
449566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "longstr fullLength %d\n", (int)fullLength));
45c4762a1bSJed Brown 
46c4762a1bSJed Brown   /* test that PetscPrintf() works for strings longer than the default buffer size */
47ad540459SPierre Jolivet   for (i = 0; i < 9998; i++) superlongstr[i] = 's';
489371c9d4SSatish Balay   superlongstr[9998] = 't';
499371c9d4SSatish Balay   superlongstr[9999] = 0;
509566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr));
51c4762a1bSJed Brown 
52c4762a1bSJed Brown   /* test that PetscSynchronizedPrintf() works for strings longer than the default buffer size */
539566063dSJacob Faibussowitsch   PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr));
549566063dSJacob Faibussowitsch   PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout));
55c4762a1bSJed Brown 
56c4762a1bSJed Brown   /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */
579566063dSJacob Faibussowitsch   PetscCall(PetscSynchronizedFPrintf(PETSC_COMM_WORLD, stdout, "Greetings %s", superlongstr));
589566063dSJacob Faibussowitsch   PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout));
59c4762a1bSJed Brown 
60c4762a1bSJed Brown   /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */
619566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
629566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "Greetings %s", superlongstr));
639566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
649566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
65c4762a1bSJed Brown 
66c4762a1bSJed Brown   /* add new line to end of file so that diff does not warn about it being missing */
679566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n"));
689566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
69b122ec5aSJacob Faibussowitsch   return 0;
70c4762a1bSJed Brown }
71c4762a1bSJed Brown 
72d71ae5a4SJacob Faibussowitsch PetscErrorCode TestPetscVSNPrintf(char *str, size_t l_str, size_t *fullLength, const char *format, ...)
73d71ae5a4SJacob Faibussowitsch {
74c4762a1bSJed Brown   va_list Argp;
75c4762a1bSJed Brown 
76c4762a1bSJed Brown   PetscFunctionBegin;
77c4762a1bSJed Brown   va_start(Argp, format);
789566063dSJacob Faibussowitsch   PetscCall(PetscVSNPrintf(str, l_str, format, fullLength, Argp));
79*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
80c4762a1bSJed Brown }
81c4762a1bSJed Brown /*TEST
82c4762a1bSJed Brown 
83c4762a1bSJed Brown    test:
84c4762a1bSJed Brown      nsize: 2
85dfd57a17SPierre Jolivet      requires: defined(PETSC_HAVE_VA_COPY)
86c4762a1bSJed Brown 
87c4762a1bSJed Brown TEST*/
88