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 PetscFunctionBeginUser; 17 PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 18 19 /* test that PetscFormatConvertGetSize() correctly counts needed amount of space */ 20 PetscCall(PetscFormatConvertGetSize(formatstr, &sz)); 21 if (PetscDefined(USE_64BIT_INDICES)) { 22 PetscCheck(sz == 29, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 29", sz); 23 } else { 24 PetscCheck(sz == 27, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 27", sz); 25 } 26 PetscCall(PetscMalloc1(sz, &newformatstr)); 27 PetscCall(PetscFormatConvert(formatstr, newformatstr)); 28 PetscCall(PetscPrintf(PETSC_COMM_WORLD, newformatstr, twentytwo, 3.47, 3.0)); 29 PetscCall(PetscFree(newformatstr)); 30 31 /* Test correct count is returned with %g format */ 32 PetscCall(PetscSNPrintfCount(buffer, sizeof(buffer), "Test %g %g\n", &sz, 3.33, 2.7)); 33 PetscCall(PetscStrlen(buffer, &fullLength)); 34 PetscCheck(sz == fullLength + 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscSNPrintfCount() count should be %d it is %d", (int)fullLength + 1, (int)sz); 35 36 /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is long enough */ 37 PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", "This is my string")); 38 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "buffer :%s: fullLength %d\n", buffer, (int)fullLength)); 39 40 /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is not long enough */ 41 for (i = 0; i < 255; i++) longstr[i] = 's'; 42 longstr[255] = 0; 43 PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", longstr)); 44 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "longstr fullLength %d\n", (int)fullLength)); 45 46 /* test that PetscPrintf() works for strings longer than the default buffer size */ 47 for (i = 0; i < 9998; i++) superlongstr[i] = 's'; 48 superlongstr[9998] = 't'; 49 superlongstr[9999] = 0; 50 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr)); 51 52 /* test that PetscSynchronizedPrintf() works for strings longer than the default buffer size */ 53 PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "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(PetscSynchronizedFPrintf(PETSC_COMM_WORLD, stdout, "Greetings %s", superlongstr)); 58 PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout)); 59 60 /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */ 61 PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD)); 62 PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "Greetings %s", superlongstr)); 63 PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD)); 64 PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD)); 65 66 /* add new line to end of file so that diff does not warn about it being missing */ 67 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n")); 68 PetscCall(PetscFinalize()); 69 return 0; 70 } 71 72 PetscErrorCode TestPetscVSNPrintf(char *str, size_t l_str, size_t *fullLength, const char *format, ...) 73 { 74 va_list Argp; 75 76 PetscFunctionBegin; 77 va_start(Argp, format); 78 PetscCall(PetscVSNPrintf(str, l_str, format, fullLength, Argp)); 79 PetscFunctionReturn(PETSC_SUCCESS); 80 } 81 /*TEST 82 83 test: 84 nsize: 2 85 requires: defined(PETSC_HAVE_VA_COPY) 86 87 TEST*/ 88