1c4762a1bSJed Brown static char help[] = "Test PetscFormatConvertGetSize().\n";
2c4762a1bSJed Brown
3c4762a1bSJed Brown #include <petscsys.h>
4c4762a1bSJed Brown #include <petscviewer.h>
5c4762a1bSJed Brown
6c4762a1bSJed Brown PetscErrorCode TestPetscVSNPrintf(char *, size_t, size_t *, const char *, ...);
7c4762a1bSJed Brown
main(int argc,char ** argv)8d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
9d71ae5a4SJacob Faibussowitsch {
10c4762a1bSJed Brown size_t sz, fullLength;
11c4762a1bSJed Brown char *newformatstr, buffer[128], longstr[256], superlongstr[10000];
12c4762a1bSJed Brown const char *formatstr = "Greetings %D %3.2f %g\n";
13c4762a1bSJed Brown PetscInt i, twentytwo = 22;
14c4762a1bSJed Brown
15327415f7SBarry Smith PetscFunctionBeginUser;
16*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help));
17c4762a1bSJed Brown
18c4762a1bSJed Brown /* test that PetscFormatConvertGetSize() correctly counts needed amount of space */
199566063dSJacob Faibussowitsch PetscCall(PetscFormatConvertGetSize(formatstr, &sz));
2055ed0643SJacob Faibussowitsch if (PetscDefined(USE_64BIT_INDICES)) {
2108401ef6SPierre Jolivet PetscCheck(sz == 29, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 29", sz);
2255ed0643SJacob Faibussowitsch } else {
2308401ef6SPierre Jolivet PetscCheck(sz == 27, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Format size %zu should be 27", sz);
2455ed0643SJacob Faibussowitsch }
259566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(sz, &newformatstr));
269566063dSJacob Faibussowitsch PetscCall(PetscFormatConvert(formatstr, newformatstr));
279566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, newformatstr, twentytwo, 3.47, 3.0));
289566063dSJacob Faibussowitsch PetscCall(PetscFree(newformatstr));
29c4762a1bSJed Brown
30c4762a1bSJed Brown /* Test correct count is returned with %g format */
319566063dSJacob Faibussowitsch PetscCall(PetscSNPrintfCount(buffer, sizeof(buffer), "Test %g %g\n", &sz, 3.33, 2.7));
329566063dSJacob Faibussowitsch PetscCall(PetscStrlen(buffer, &fullLength));
3308401ef6SPierre Jolivet PetscCheck(sz == fullLength + 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscSNPrintfCount() count should be %d it is %d", (int)fullLength + 1, (int)sz);
34c4762a1bSJed Brown
35c4762a1bSJed Brown /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is long enough */
369566063dSJacob Faibussowitsch PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", "This is my string"));
379566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "buffer :%s: fullLength %d\n", buffer, (int)fullLength));
38c4762a1bSJed Brown
39c4762a1bSJed Brown /* test that TestPetscVSNPrintf() fullLength argument returns required space for the string when buffer is not long enough */
40ad540459SPierre Jolivet for (i = 0; i < 255; i++) longstr[i] = 's';
419371c9d4SSatish Balay longstr[255] = 0;
429566063dSJacob Faibussowitsch PetscCall(TestPetscVSNPrintf(buffer, sizeof(buffer), &fullLength, "Greetings %s", longstr));
439566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "longstr fullLength %d\n", (int)fullLength));
44c4762a1bSJed Brown
45c4762a1bSJed Brown /* test that PetscPrintf() works for strings longer than the default buffer size */
46ad540459SPierre Jolivet for (i = 0; i < 9998; i++) superlongstr[i] = 's';
479371c9d4SSatish Balay superlongstr[9998] = 't';
489371c9d4SSatish Balay superlongstr[9999] = 0;
499566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr));
50c4762a1bSJed Brown
51c4762a1bSJed Brown /* test that PetscSynchronizedPrintf() works for strings longer than the default buffer size */
529566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "Greetings %s", superlongstr));
539566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout));
54c4762a1bSJed Brown
55c4762a1bSJed Brown /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */
569566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedFPrintf(PETSC_COMM_WORLD, stdout, "Greetings %s", superlongstr));
579566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout));
58c4762a1bSJed Brown
59c4762a1bSJed Brown /* test that PetscSynchronizedFPrintf() works for strings longer than the default buffer size */
609566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
619566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "Greetings %s", superlongstr));
629566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
639566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
64c4762a1bSJed Brown
65c4762a1bSJed Brown /* add new line to end of file so that diff does not warn about it being missing */
669566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n"));
679566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
68b122ec5aSJacob Faibussowitsch return 0;
69c4762a1bSJed Brown }
70c4762a1bSJed Brown
TestPetscVSNPrintf(char * str,size_t l_str,size_t * fullLength,const char * format,...)71d71ae5a4SJacob Faibussowitsch PetscErrorCode TestPetscVSNPrintf(char *str, size_t l_str, size_t *fullLength, const char *format, ...)
72d71ae5a4SJacob Faibussowitsch {
73c4762a1bSJed Brown va_list Argp;
74c4762a1bSJed Brown
75c4762a1bSJed Brown PetscFunctionBegin;
76c4762a1bSJed Brown va_start(Argp, format);
779566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(str, l_str, format, fullLength, Argp));
783ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
79c4762a1bSJed Brown }
80c4762a1bSJed Brown /*TEST
81c4762a1bSJed Brown
82c4762a1bSJed Brown test:
83c4762a1bSJed Brown nsize: 2
84dfd57a17SPierre Jolivet requires: defined(PETSC_HAVE_VA_COPY)
85c4762a1bSJed Brown
86c4762a1bSJed Brown TEST*/
87