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