xref: /petsc/src/sys/tests/ex37.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
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 
9c4762a1bSJed Brown int main(int argc,char **argv)
10c4762a1bSJed Brown {
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 
16*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc,&argv,(char*)0,help));
17c4762a1bSJed Brown 
18c4762a1bSJed Brown   /* test that PetscFormatConvertGetSize() correctly counts needed amount of space */
195f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFormatConvertGetSize(formatstr,&sz));
2055ed0643SJacob Faibussowitsch   if (PetscDefined(USE_64BIT_INDICES)) {
212c71b3e2SJacob Faibussowitsch     PetscCheckFalse(sz != 29,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Format size %zu should be 29",sz);
2255ed0643SJacob Faibussowitsch   } else {
232c71b3e2SJacob Faibussowitsch     PetscCheckFalse(sz != 27,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Format size %zu should be 27",sz);
2455ed0643SJacob Faibussowitsch   }
255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(sz,&newformatstr));
265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFormatConvert(formatstr,newformatstr));
275f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,newformatstr,twentytwo,3.47,3.0));
285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(newformatstr));
29c4762a1bSJed Brown 
30c4762a1bSJed Brown   /* Test correct count is returned with %g format */
315f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSNPrintfCount(buffer,sizeof(buffer),"Test %g %g\n",&sz,3.33,2.7));
325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(buffer,&fullLength));
332c71b3e2SJacob Faibussowitsch   PetscCheckFalse(sz != fullLength+1,PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscSNPrintfCount() count should be %d it is %d",(int)fullLength+1,(int)sz);
34c4762a1bSJed Brown 
35c4762a1bSJed Brown   /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is long enough */
365f80ce2aSJacob Faibussowitsch   CHKERRQ(TestPetscVSNPrintf(buffer,sizeof(buffer),&fullLength,"Greetings %s","This is my string"));
375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"buffer :%s: fullLength %d\n",buffer,(int)fullLength));
38c4762a1bSJed Brown 
39c4762a1bSJed Brown   /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is not long enough */
40c4762a1bSJed Brown   for (i=0; i<255; i++) {longstr[i] = 's';} longstr[255] = 0;
415f80ce2aSJacob Faibussowitsch   CHKERRQ(TestPetscVSNPrintf(buffer,sizeof(buffer),&fullLength,"Greetings %s",longstr));
425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"longstr fullLength %d\n",(int)fullLength));
43c4762a1bSJed Brown 
44c4762a1bSJed Brown   /* test that PetscPrintf() works for strings longer than the default buffer size */
45c4762a1bSJed Brown   for (i=0; i<9998; i++) {superlongstr[i] = 's';} superlongstr[9998] = 't'; superlongstr[9999] = 0;
465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Greetings %s",superlongstr));
47c4762a1bSJed Brown 
48c4762a1bSJed Brown   /* test that PetscSynchronizedPrintf() works for strings longer than the default buffer size */
495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSynchronizedPrintf(PETSC_COMM_WORLD,"Greetings %s",superlongstr));
505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSynchronizedFlush(PETSC_COMM_WORLD,stdout));
51c4762a1bSJed Brown 
52c4762a1bSJed Brown   /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */
535f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSynchronizedFPrintf(PETSC_COMM_WORLD,stdout,"Greetings %s",superlongstr));
545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSynchronizedFlush(PETSC_COMM_WORLD,stdout));
55c4762a1bSJed Brown 
56c4762a1bSJed Brown   /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */
575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD,"Greetings %s",superlongstr));
595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
61c4762a1bSJed Brown 
62c4762a1bSJed Brown   /* add new line to end of file so that diff does not warn about it being missing */
635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"\n"));
64*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
65*b122ec5aSJacob Faibussowitsch   return 0;
66c4762a1bSJed Brown }
67c4762a1bSJed Brown 
68c4762a1bSJed Brown PetscErrorCode TestPetscVSNPrintf(char *str,size_t l_str,size_t *fullLength,const char* format,...)
69c4762a1bSJed Brown {
70c4762a1bSJed Brown   va_list        Argp;
71c4762a1bSJed Brown 
72c4762a1bSJed Brown   PetscFunctionBegin;
73c4762a1bSJed Brown   va_start(Argp,format);
745f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscVSNPrintf(str,l_str,format,fullLength,Argp));
75c4762a1bSJed Brown   PetscFunctionReturn(0);
76c4762a1bSJed Brown }
77c4762a1bSJed Brown /*TEST
78c4762a1bSJed Brown 
79c4762a1bSJed Brown    test:
80c4762a1bSJed Brown      nsize: 2
81dfd57a17SPierre Jolivet      requires: defined(PETSC_HAVE_VA_COPY)
82c4762a1bSJed Brown 
83c4762a1bSJed Brown TEST*/
84