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