xref: /petsc/src/sys/classes/viewer/impls/string/stringv.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /*I  "petscsys.h"  I*/
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith typedef struct {
55c6c1daeSBarry Smith   char     *string; /* string where info is stored */
6a5b23f4aSJose E. Roman   char     *head;   /* pointer to beginning of unused portion */
75c6c1daeSBarry Smith   size_t    curlen, maxlen;
836a9e3b9SBarry Smith   PetscBool ownstring; /* string viewer is responsable for freeing the string */
95c6c1daeSBarry Smith } PetscViewer_String;
105c6c1daeSBarry Smith 
11*9371c9d4SSatish Balay static PetscErrorCode PetscViewerDestroy_String(PetscViewer viewer) {
125c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String *)viewer->data;
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith   PetscFunctionBegin;
151baa6e33SBarry Smith   if (vstr->ownstring) PetscCall(PetscFree(vstr->string));
169566063dSJacob Faibussowitsch   PetscCall(PetscFree(vstr));
175c6c1daeSBarry Smith   PetscFunctionReturn(0);
185c6c1daeSBarry Smith }
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith /*@C
215c6c1daeSBarry Smith     PetscViewerStringSPrintf - Prints information to a PetscViewer string.
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith     Logically Collective on PetscViewer (Hmmm, each processor maintains a separate string)
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith     Input Parameters:
265c6c1daeSBarry Smith +   v - a string PetscViewer, formed by PetscViewerStringOpen()
275c6c1daeSBarry Smith -   format - the format of the input
285c6c1daeSBarry Smith 
295c6c1daeSBarry Smith     Level: developer
305c6c1daeSBarry Smith 
315c6c1daeSBarry Smith     Fortran Note:
325c6c1daeSBarry Smith     This routine is not supported in Fortran.
335c6c1daeSBarry Smith 
34db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PetscViewerStringGetStringRead()`, `PetscViewerStringSetString()`, `PETSCVIEWERSTRING`
355c6c1daeSBarry Smith @*/
36*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringSPrintf(PetscViewer viewer, const char format[], ...) {
375c6c1daeSBarry Smith   va_list             Argp;
385c6c1daeSBarry Smith   size_t              fullLength;
3989d949e2SBarry Smith   size_t              shift, cshift;
405c6c1daeSBarry Smith   PetscBool           isstring;
415c6c1daeSBarry Smith   char                tmp[4096];
425c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String *)viewer->data;
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith   PetscFunctionBegin;
455c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
465c6c1daeSBarry Smith   PetscValidCharPointer(format, 2);
479566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring));
485c6c1daeSBarry Smith   if (!isstring) PetscFunctionReturn(0);
4928b400f6SJacob Faibussowitsch   PetscCheck(vstr->string, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Must call PetscViewerStringSetString() before using");
505c6c1daeSBarry Smith 
515c6c1daeSBarry Smith   va_start(Argp, format);
529566063dSJacob Faibussowitsch   PetscCall(PetscVSNPrintf(tmp, 4096, format, &fullLength, Argp));
535c6c1daeSBarry Smith   va_end(Argp);
549566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tmp, &shift));
5589d949e2SBarry Smith   cshift = shift + 1;
5689d949e2SBarry Smith   if (cshift >= vstr->maxlen - vstr->curlen - 1) cshift = vstr->maxlen - vstr->curlen - 1;
579566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(vstr->head, tmp, cshift));
585c6c1daeSBarry Smith   vstr->head += shift;
595c6c1daeSBarry Smith   vstr->curlen += shift;
605c6c1daeSBarry Smith   PetscFunctionReturn(0);
615c6c1daeSBarry Smith }
625c6c1daeSBarry Smith 
635c6c1daeSBarry Smith /*@C
645c6c1daeSBarry Smith     PetscViewerStringOpen - Opens a string as a PetscViewer. This is a very
655c6c1daeSBarry Smith     simple PetscViewer; information on the object is simply stored into
665c6c1daeSBarry Smith     the string in a fairly nice way.
675c6c1daeSBarry Smith 
68d083f849SBarry Smith     Collective
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith     Input Parameters:
715c6c1daeSBarry Smith +   comm - the communicator
725c6c1daeSBarry Smith .   string - the string to use
735c6c1daeSBarry Smith -   len    - the string length
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith     Output Parameter:
765c6c1daeSBarry Smith .   lab - the PetscViewer
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith     Level: advanced
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith     Fortran Note:
815c6c1daeSBarry Smith     This routine is not supported in Fortran.
825c6c1daeSBarry Smith 
83db781477SPatrick Sanan .seealso: `PetscViewerDestroy()`, `PetscViewerStringSPrintf()`, `PetscViewerStringGetStringRead()`, `PetscViewerStringSetString()`, `PETSCVIEWERSTRING`
845c6c1daeSBarry Smith @*/
85*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringOpen(MPI_Comm comm, char string[], size_t len, PetscViewer *lab) {
865c6c1daeSBarry Smith   PetscFunctionBegin;
879566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, lab));
889566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*lab, PETSCVIEWERSTRING));
899566063dSJacob Faibussowitsch   PetscCall(PetscViewerStringSetString(*lab, string, len));
905c6c1daeSBarry Smith   PetscFunctionReturn(0);
915c6c1daeSBarry Smith }
925c6c1daeSBarry Smith 
93*9371c9d4SSatish Balay PetscErrorCode PetscViewerGetSubViewer_String(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) {
945c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String *)viewer->data;
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith   PetscFunctionBegin;
979566063dSJacob Faibussowitsch   PetscCall(PetscViewerStringOpen(PETSC_COMM_SELF, vstr->head, vstr->maxlen - vstr->curlen, sviewer));
985c6c1daeSBarry Smith   PetscFunctionReturn(0);
995c6c1daeSBarry Smith }
1005c6c1daeSBarry Smith 
101*9371c9d4SSatish Balay PetscErrorCode PetscViewerRestoreSubViewer_String(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) {
1025c6c1daeSBarry Smith   PetscViewer_String *iviewer = (PetscViewer_String *)(*sviewer)->data;
1035c6c1daeSBarry Smith   PetscViewer_String *vstr    = (PetscViewer_String *)viewer->data;
1045c6c1daeSBarry Smith 
1055c6c1daeSBarry Smith   PetscFunctionBegin;
1065c6c1daeSBarry Smith   vstr->head = iviewer->head;
1075c6c1daeSBarry Smith   vstr->curlen += iviewer->curlen;
1089566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(sviewer));
1095c6c1daeSBarry Smith   PetscFunctionReturn(0);
1105c6c1daeSBarry Smith }
1115c6c1daeSBarry Smith 
1128556b5ebSBarry Smith /*MC
1138556b5ebSBarry Smith    PETSCVIEWERSTRING - A viewer that writes to a string
1148556b5ebSBarry Smith 
115db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PetscViewerStringSPrintf()`, `PetscViewerSocketOpen()`, `PetscViewerDrawOpen()`, `PETSCVIEWERSOCKET`,
116db781477SPatrick Sanan           `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`, `PETSCVIEWERDRAW`,
117db781477SPatrick Sanan           `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`,
118db781477SPatrick Sanan           `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`
1198556b5ebSBarry Smith 
1201b266c99SBarry Smith   Level: beginner
1218556b5ebSBarry Smith M*/
1228556b5ebSBarry Smith 
123*9371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscViewerCreate_String(PetscViewer v) {
1245c6c1daeSBarry Smith   PetscViewer_String *vstr;
1255c6c1daeSBarry Smith 
1265c6c1daeSBarry Smith   PetscFunctionBegin;
1275c6c1daeSBarry Smith   v->ops->destroy          = PetscViewerDestroy_String;
12802c9f0b5SLisandro Dalcin   v->ops->view             = NULL;
12902c9f0b5SLisandro Dalcin   v->ops->flush            = NULL;
130559f443fSBarry Smith   v->ops->getsubviewer     = PetscViewerGetSubViewer_String;
131559f443fSBarry Smith   v->ops->restoresubviewer = PetscViewerRestoreSubViewer_String;
1329566063dSJacob Faibussowitsch   PetscCall(PetscNewLog(v, &vstr));
1335c6c1daeSBarry Smith   v->data      = (void *)vstr;
13402c9f0b5SLisandro Dalcin   vstr->string = NULL;
1355c6c1daeSBarry Smith   PetscFunctionReturn(0);
1365c6c1daeSBarry Smith }
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith /*@C
1395c6c1daeSBarry Smith 
14036a9e3b9SBarry Smith    PetscViewerStringGetStringRead - Returns the string that a string viewer uses
14136a9e3b9SBarry Smith 
14236a9e3b9SBarry Smith    Logically Collective on PetscViewer
14336a9e3b9SBarry Smith 
14436a9e3b9SBarry Smith   Input Parameter:
14536a9e3b9SBarry Smith .   viewer - string viewer
14636a9e3b9SBarry Smith 
147fd292e60Sprj-   Output Parameters:
14836a9e3b9SBarry Smith +    string - the string, optional use NULL if you do not need
14936a9e3b9SBarry Smith -   len - the length of the string, optional use NULL if you do
15036a9e3b9SBarry Smith 
15136a9e3b9SBarry Smith   Notes: Do not write to the string nor free it
15236a9e3b9SBarry Smith 
15336a9e3b9SBarry Smith   Level: advanced
15436a9e3b9SBarry Smith 
155db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PETSCVIEWERSTRING`, `PetscViewerStringSetString()`, `PetscViewerStringSPrintf()`,
156db781477SPatrick Sanan           `PetscViewerStringSetOwnString()`
15736a9e3b9SBarry Smith @*/
158*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringGetStringRead(PetscViewer viewer, const char *string[], size_t *len) {
15936a9e3b9SBarry Smith   PetscViewer_String *vstr = (PetscViewer_String *)viewer->data;
16036a9e3b9SBarry Smith   PetscBool           isstring;
16136a9e3b9SBarry Smith 
16236a9e3b9SBarry Smith   PetscFunctionBegin;
16336a9e3b9SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
1649566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring));
16528b400f6SJacob Faibussowitsch   PetscCheck(isstring, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Only for PETSCVIEWERSTRING");
16636a9e3b9SBarry Smith   if (string) *string = vstr->string;
16736a9e3b9SBarry Smith   if (len) *len = vstr->maxlen;
16836a9e3b9SBarry Smith   PetscFunctionReturn(0);
16936a9e3b9SBarry Smith }
17036a9e3b9SBarry Smith 
17136a9e3b9SBarry Smith /*@C
17236a9e3b9SBarry Smith 
1735c6c1daeSBarry Smith    PetscViewerStringSetString - sets the string that a string viewer will print to
1745c6c1daeSBarry Smith 
1755c6c1daeSBarry Smith    Logically Collective on PetscViewer
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith   Input Parameters:
1785c6c1daeSBarry Smith +   viewer - string viewer you wish to attach string to
1795c6c1daeSBarry Smith .   string - the string to print data into
1805c6c1daeSBarry Smith -   len - the length of the string
1815c6c1daeSBarry Smith 
182effebcafSBarry Smith   Notes: The function does not copy the string, it uses it directly therefore you cannot free
18336a9e3b9SBarry Smith    the string until the viewer is destroyed. If you call PetscViewerStringSetOwnString() the ownership
18436a9e3b9SBarry Smith    passes to the viewer and it will be responsable for freeing it. In this case the string must be
18536a9e3b9SBarry Smith    obtained with PetscMalloc().
18636a9e3b9SBarry Smith 
1875c6c1daeSBarry Smith   Level: advanced
1885c6c1daeSBarry Smith 
189db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PETSCVIEWERSTRING`, `PetscViewerStringGetStringRead()`, `PetscViewerStringSPrintf()`,
190db781477SPatrick Sanan           `PetscViewerStringSetOwnString()`
1915c6c1daeSBarry Smith @*/
192*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringSetString(PetscViewer viewer, char string[], size_t len) {
1935c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String *)viewer->data;
1945c6c1daeSBarry Smith   PetscBool           isstring;
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith   PetscFunctionBegin;
1975c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
1985c6c1daeSBarry Smith   PetscValidCharPointer(string, 2);
1999566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring));
2005c6c1daeSBarry Smith   if (!isstring) PetscFunctionReturn(0);
20108401ef6SPierre Jolivet   PetscCheck(len > 2, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "String must have length at least 2");
2025c6c1daeSBarry Smith 
2039566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(string, len));
2045c6c1daeSBarry Smith   vstr->string = string;
2055c6c1daeSBarry Smith   vstr->head   = string;
2065c6c1daeSBarry Smith   vstr->curlen = 0;
2075c6c1daeSBarry Smith   vstr->maxlen = len;
2085c6c1daeSBarry Smith   PetscFunctionReturn(0);
2095c6c1daeSBarry Smith }
2105c6c1daeSBarry Smith 
21136a9e3b9SBarry Smith /*@C
21236a9e3b9SBarry Smith 
21336a9e3b9SBarry Smith    PetscViewerStringSetOwnString - tells the viewer that it now owns the string and is responsible for freeing it
21436a9e3b9SBarry Smith 
21536a9e3b9SBarry Smith    Logically Collective on PetscViewer
21636a9e3b9SBarry Smith 
21736a9e3b9SBarry Smith   Input Parameters:
21836a9e3b9SBarry Smith .   viewer - string viewer
21936a9e3b9SBarry Smith 
22036a9e3b9SBarry Smith   Notes: If you call this the string must have been obtained with PetscMalloc() and you cannot free the string
22136a9e3b9SBarry Smith 
22236a9e3b9SBarry Smith   Level: advanced
22336a9e3b9SBarry Smith 
224db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PETSCVIEWERSTRING`, `PetscViewerStringGetStringRead()`, `PetscViewerStringSPrintf()`,
225db781477SPatrick Sanan           `PetscViewerStringSetString()`
22636a9e3b9SBarry Smith @*/
227*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringSetOwnString(PetscViewer viewer) {
22836a9e3b9SBarry Smith   PetscViewer_String *vstr = (PetscViewer_String *)viewer->data;
22936a9e3b9SBarry Smith   PetscBool           isstring;
23036a9e3b9SBarry Smith 
23136a9e3b9SBarry Smith   PetscFunctionBegin;
23236a9e3b9SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2339566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring));
23436a9e3b9SBarry Smith   if (!isstring) PetscFunctionReturn(0);
23536a9e3b9SBarry Smith 
23636a9e3b9SBarry Smith   vstr->ownstring = PETSC_TRUE;
23736a9e3b9SBarry Smith   PetscFunctionReturn(0);
23836a9e3b9SBarry Smith }
239