xref: /petsc/src/sys/tests/ex37.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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