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