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 9d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 10d71ae5a4SJacob Faibussowitsch { 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 16327415f7SBarry Smith PetscFunctionBeginUser; 179566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 18c4762a1bSJed Brown 19c4762a1bSJed Brown /* test that PetscFormatConvertGetSize() correctly counts needed amount of space */ 209566063dSJacob Faibussowitsch PetscCall(PetscFormatConvertGetSize(formatstr, &sz)); 2155ed0643SJacob Faibussowitsch if (PetscDefined(USE_64BIT_INDICES)) { 2208401ef6SPierre Jolivet PetscCheck(sz == 29, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 29", sz); 2355ed0643SJacob Faibussowitsch } else { 2408401ef6SPierre Jolivet PetscCheck(sz == 27, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 27", sz); 2555ed0643SJacob Faibussowitsch } 269566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(sz, &newformatstr)); 279566063dSJacob Faibussowitsch PetscCall(PetscFormatConvert(formatstr, newformatstr)); 289566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, newformatstr, twentytwo, 3.47, 3.0)); 299566063dSJacob Faibussowitsch PetscCall(PetscFree(newformatstr)); 30c4762a1bSJed Brown 31c4762a1bSJed Brown /* Test correct count is returned with %g format */ 329566063dSJacob Faibussowitsch PetscCall(PetscSNPrintfCount(buffer, sizeof(buffer), "Test %g %g\n", &sz, 3.33, 2.7)); 339566063dSJacob Faibussowitsch PetscCall(PetscStrlen(buffer, &fullLength)); 3408401ef6SPierre Jolivet PetscCheck(sz == fullLength + 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscSNPrintfCount() count should be %d it is %d", (int)fullLength + 1, (int)sz); 35c4762a1bSJed Brown 36c4762a1bSJed Brown /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is long enough */ 379566063dSJacob Faibussowitsch PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", "This is my string")); 389566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "buffer :%s: fullLength %d\n", buffer, (int)fullLength)); 39c4762a1bSJed Brown 40c4762a1bSJed Brown /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is not long enough */ 41ad540459SPierre Jolivet for (i = 0; i < 255; i++) longstr[i] = 's'; 429371c9d4SSatish Balay longstr[255] = 0; 439566063dSJacob Faibussowitsch PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", longstr)); 449566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "longstr fullLength %d\n", (int)fullLength)); 45c4762a1bSJed Brown 46c4762a1bSJed Brown /* test that PetscPrintf() works for strings longer than the default buffer size */ 47ad540459SPierre Jolivet for (i = 0; i < 9998; i++) superlongstr[i] = 's'; 489371c9d4SSatish Balay superlongstr[9998] = 't'; 499371c9d4SSatish Balay superlongstr[9999] = 0; 509566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr)); 51c4762a1bSJed Brown 52c4762a1bSJed Brown /* test that PetscSynchronizedPrintf() works for strings longer than the default buffer size */ 539566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr)); 549566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout)); 55c4762a1bSJed Brown 56c4762a1bSJed Brown /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */ 579566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedFPrintf(PETSC_COMM_WORLD, stdout, "Greetings %s", superlongstr)); 589566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout)); 59c4762a1bSJed Brown 60c4762a1bSJed Brown /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */ 619566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD)); 629566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "Greetings %s", superlongstr)); 639566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD)); 649566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD)); 65c4762a1bSJed Brown 66c4762a1bSJed Brown /* add new line to end of file so that diff does not warn about it being missing */ 679566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n")); 689566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 69b122ec5aSJacob Faibussowitsch return 0; 70c4762a1bSJed Brown } 71c4762a1bSJed Brown 72d71ae5a4SJacob Faibussowitsch PetscErrorCode TestPetscVSNPrintf(char *str, size_t l_str, size_t *fullLength, const char *format, ...) 73d71ae5a4SJacob Faibussowitsch { 74c4762a1bSJed Brown va_list Argp; 75c4762a1bSJed Brown 76c4762a1bSJed Brown PetscFunctionBegin; 77c4762a1bSJed Brown va_start(Argp, format); 789566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(str, l_str, format, fullLength, Argp)); 79*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 80c4762a1bSJed Brown } 81c4762a1bSJed Brown /*TEST 82c4762a1bSJed Brown 83c4762a1bSJed Brown test: 84c4762a1bSJed Brown nsize: 2 85dfd57a17SPierre Jolivet requires: defined(PETSC_HAVE_VA_COPY) 86c4762a1bSJed Brown 87c4762a1bSJed Brown TEST*/ 88