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 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';} longstr[255] = 0; 41 PetscCall(TestPetscVSNPrintf(buffer,sizeof(buffer),&fullLength,"Greetings %s",longstr)); 42 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"longstr fullLength %d\n",(int)fullLength)); 43 44 /* test that PetscPrintf() works for strings longer than the default buffer size */ 45 for (i=0; i<9998; i++) {superlongstr[i] = 's';} superlongstr[9998] = 't'; superlongstr[9999] = 0; 46 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Greetings %s",superlongstr)); 47 48 /* test that PetscSynchronizedPrintf() works for strings longer than the default buffer size */ 49 PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD,"Greetings %s",superlongstr)); 50 PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD,stdout)); 51 52 /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */ 53 PetscCall(PetscSynchronizedFPrintf(PETSC_COMM_WORLD,stdout,"Greetings %s",superlongstr)); 54 PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD,stdout)); 55 56 /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */ 57 PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD)); 58 PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD,"Greetings %s",superlongstr)); 59 PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD)); 60 PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD)); 61 62 /* add new line to end of file so that diff does not warn about it being missing */ 63 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n")); 64 PetscCall(PetscFinalize()); 65 return 0; 66 } 67 68 PetscErrorCode TestPetscVSNPrintf(char *str,size_t l_str,size_t *fullLength,const char* format,...) 69 { 70 va_list Argp; 71 72 PetscFunctionBegin; 73 va_start(Argp,format); 74 PetscCall(PetscVSNPrintf(str,l_str,format,fullLength,Argp)); 75 PetscFunctionReturn(0); 76 } 77 /*TEST 78 79 test: 80 nsize: 2 81 requires: defined(PETSC_HAVE_VA_COPY) 82 83 TEST*/ 84