xref: /petsc/src/sys/classes/viewer/impls/string/stringv.c (revision 3f08860eea72c60ab5998520c0bd5a036e7e882e)
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 */
65c6c1daeSBarry Smith   char   *head;           /* pointer to begining of unused portion */
75c6c1daeSBarry Smith   size_t curlen,maxlen;
85c6c1daeSBarry Smith } PetscViewer_String;
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith #undef __FUNCT__
115c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_String"
125c6c1daeSBarry Smith static PetscErrorCode PetscViewerDestroy_String(PetscViewer viewer)
135c6c1daeSBarry Smith {
145c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
155c6c1daeSBarry Smith   PetscErrorCode     ierr;
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith   PetscFunctionBegin;
185c6c1daeSBarry Smith   ierr = PetscFree(vstr);CHKERRQ(ierr);
195c6c1daeSBarry Smith   PetscFunctionReturn(0);
205c6c1daeSBarry Smith }
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith #undef __FUNCT__
235c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringSPrintf"
245c6c1daeSBarry Smith /*@C
255c6c1daeSBarry Smith     PetscViewerStringSPrintf - Prints information to a PetscViewer string.
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith     Logically Collective on PetscViewer (Hmmm, each processor maintains a separate string)
285c6c1daeSBarry Smith 
295c6c1daeSBarry Smith     Input Parameters:
305c6c1daeSBarry Smith +   v - a string PetscViewer, formed by PetscViewerStringOpen()
315c6c1daeSBarry Smith -   format - the format of the input
325c6c1daeSBarry Smith 
335c6c1daeSBarry Smith     Level: developer
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith     Fortran Note:
365c6c1daeSBarry Smith     This routine is not supported in Fortran.
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith    Concepts: printing^to string
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith .seealso: PetscViewerStringOpen()
415c6c1daeSBarry Smith @*/
425c6c1daeSBarry Smith PetscErrorCode  PetscViewerStringSPrintf(PetscViewer viewer,const char format[],...)
435c6c1daeSBarry Smith {
445c6c1daeSBarry Smith   va_list            Argp;
455c6c1daeSBarry Smith   size_t             fullLength;
4689d949e2SBarry Smith   size_t             shift,cshift;
475c6c1daeSBarry Smith   PetscErrorCode     ierr;
485c6c1daeSBarry Smith   PetscBool          isstring;
495c6c1daeSBarry Smith   char               tmp[4096];
505c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
515c6c1daeSBarry Smith 
525c6c1daeSBarry Smith   PetscFunctionBegin;
535c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
545c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
555c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);CHKERRQ(ierr);
565c6c1daeSBarry Smith   if (!isstring) PetscFunctionReturn(0);
575c6c1daeSBarry Smith   if (!vstr->string) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerStringSetString() before using");
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith   va_start(Argp,format);
605c6c1daeSBarry Smith   ierr = PetscVSNPrintf(tmp,4096,format,&fullLength,Argp);CHKERRQ(ierr);
615c6c1daeSBarry Smith   va_end(Argp);
625c6c1daeSBarry Smith   ierr = PetscStrlen(tmp,&shift);CHKERRQ(ierr);
6389d949e2SBarry Smith   cshift = shift+1;
6489d949e2SBarry Smith   if (cshift >= vstr->maxlen - vstr->curlen - 1) cshift = vstr->maxlen - vstr->curlen - 1;
6589d949e2SBarry Smith   ierr = PetscStrncpy(vstr->head,tmp,cshift);CHKERRQ(ierr);
665c6c1daeSBarry Smith   vstr->head   += shift;
675c6c1daeSBarry Smith   vstr->curlen += shift;
685c6c1daeSBarry Smith   PetscFunctionReturn(0);
695c6c1daeSBarry Smith }
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith #undef __FUNCT__
725c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringOpen"
735c6c1daeSBarry Smith /*@C
745c6c1daeSBarry Smith     PetscViewerStringOpen - Opens a string as a PetscViewer. This is a very
755c6c1daeSBarry Smith     simple PetscViewer; information on the object is simply stored into
765c6c1daeSBarry Smith     the string in a fairly nice way.
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith     Collective on MPI_Comm
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith     Input Parameters:
815c6c1daeSBarry Smith +   comm - the communicator
825c6c1daeSBarry Smith .   string - the string to use
835c6c1daeSBarry Smith -   len    - the string length
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith     Output Parameter:
865c6c1daeSBarry Smith .   lab - the PetscViewer
875c6c1daeSBarry Smith 
885c6c1daeSBarry Smith     Level: advanced
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith     Fortran Note:
915c6c1daeSBarry Smith     This routine is not supported in Fortran.
925c6c1daeSBarry Smith 
935c6c1daeSBarry Smith   Concepts: PetscViewerString^creating
945c6c1daeSBarry Smith 
955c6c1daeSBarry Smith .seealso: PetscViewerDestroy(), PetscViewerStringSPrintf()
965c6c1daeSBarry Smith @*/
9789d949e2SBarry Smith PetscErrorCode  PetscViewerStringOpen(MPI_Comm comm,char string[],size_t len,PetscViewer *lab)
985c6c1daeSBarry Smith {
995c6c1daeSBarry Smith   PetscErrorCode ierr;
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith   PetscFunctionBegin;
1025c6c1daeSBarry Smith   ierr = PetscViewerCreate(comm,lab);CHKERRQ(ierr);
1035c6c1daeSBarry Smith   ierr = PetscViewerSetType(*lab,PETSCVIEWERSTRING);CHKERRQ(ierr);
1045c6c1daeSBarry Smith   ierr = PetscViewerStringSetString(*lab,string,len);CHKERRQ(ierr);
1055c6c1daeSBarry Smith   PetscFunctionReturn(0);
1065c6c1daeSBarry Smith }
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith #undef __FUNCT__
109*3f08860eSBarry Smith #define __FUNCT__ "PetscViewerGetSubViewer_String"
110*3f08860eSBarry Smith PetscErrorCode PetscViewerGetSubViewer_String(PetscViewer viewer,MPI_Comm comm,PetscViewer *sviewer)
1115c6c1daeSBarry Smith {
1125c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
1135c6c1daeSBarry Smith   PetscErrorCode     ierr;
1145c6c1daeSBarry Smith 
1155c6c1daeSBarry Smith   PetscFunctionBegin;
1165c6c1daeSBarry Smith   ierr = PetscViewerStringOpen(PETSC_COMM_SELF,vstr->head,vstr->maxlen-vstr->curlen,sviewer);CHKERRQ(ierr);
1175c6c1daeSBarry Smith   PetscFunctionReturn(0);
1185c6c1daeSBarry Smith }
1195c6c1daeSBarry Smith 
1205c6c1daeSBarry Smith #undef __FUNCT__
121*3f08860eSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubViewer_String"
122*3f08860eSBarry Smith PetscErrorCode PetscViewerRestoreSubViewer_String(PetscViewer viewer,MPI_Comm comm,PetscViewer *sviewer)
1235c6c1daeSBarry Smith {
1245c6c1daeSBarry Smith   PetscErrorCode     ierr;
1255c6c1daeSBarry Smith   PetscViewer_String *iviewer = (PetscViewer_String*)(*sviewer)->data;
1265c6c1daeSBarry Smith   PetscViewer_String *vstr    = (PetscViewer_String*)viewer->data;
1275c6c1daeSBarry Smith 
1285c6c1daeSBarry Smith   PetscFunctionBegin;
1295c6c1daeSBarry Smith   vstr->head    = iviewer->head;
1305c6c1daeSBarry Smith   vstr->curlen += iviewer->curlen;
1315c6c1daeSBarry Smith   ierr          = PetscViewerDestroy(sviewer);CHKERRQ(ierr);
1325c6c1daeSBarry Smith   PetscFunctionReturn(0);
1335c6c1daeSBarry Smith }
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith #undef __FUNCT__
1365c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_String"
1378cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_String(PetscViewer v)
1385c6c1daeSBarry Smith {
1395c6c1daeSBarry Smith   PetscViewer_String *vstr;
1405c6c1daeSBarry Smith   PetscErrorCode     ierr;
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith   PetscFunctionBegin;
1435c6c1daeSBarry Smith   v->ops->destroy          = PetscViewerDestroy_String;
1445c6c1daeSBarry Smith   v->ops->view             = 0;
1455c6c1daeSBarry Smith   v->ops->flush            = 0;
146*3f08860eSBarry Smith   v->ops->getsubcomm       = PetscViewerGetSubViewer_String;
147*3f08860eSBarry Smith   v->ops->restoresubcomm   = PetscViewerRestoreSubViewer_String;
148b00a9115SJed Brown   ierr                     = PetscNewLog(v,&vstr);CHKERRQ(ierr);
1495c6c1daeSBarry Smith   v->data                  = (void*)vstr;
1505c6c1daeSBarry Smith   vstr->string             = 0;
1515c6c1daeSBarry Smith   PetscFunctionReturn(0);
1525c6c1daeSBarry Smith }
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith #undef __FUNCT__
1555c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringSetString"
1565c6c1daeSBarry Smith /*@C
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith    PetscViewerStringSetString - sets the string that a string viewer will print to
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith    Logically Collective on PetscViewer
1615c6c1daeSBarry Smith 
1625c6c1daeSBarry Smith   Input Parameters:
1635c6c1daeSBarry Smith +   viewer - string viewer you wish to attach string to
1645c6c1daeSBarry Smith .   string - the string to print data into
1655c6c1daeSBarry Smith -   len - the length of the string
1665c6c1daeSBarry Smith 
1675c6c1daeSBarry Smith   Level: advanced
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith .seealso: PetscViewerStringOpen()
1705c6c1daeSBarry Smith @*/
1715c6c1daeSBarry Smith PetscErrorCode  PetscViewerStringSetString(PetscViewer viewer,char string[],PetscInt len)
1725c6c1daeSBarry Smith {
1735c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
1745c6c1daeSBarry Smith   PetscErrorCode     ierr;
1755c6c1daeSBarry Smith   PetscBool          isstring;
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith   PetscFunctionBegin;
1785c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
1795c6c1daeSBarry Smith   PetscValidCharPointer(string,2);
1805c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);CHKERRQ(ierr);
1815c6c1daeSBarry Smith   if (!isstring) PetscFunctionReturn(0);
1825c6c1daeSBarry Smith   if (len <= 2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"String must have length at least 2");
1835c6c1daeSBarry Smith 
1845c6c1daeSBarry Smith   ierr         = PetscMemzero(string,len*sizeof(char));CHKERRQ(ierr);
1855c6c1daeSBarry Smith   vstr->string = string;
1865c6c1daeSBarry Smith   vstr->head   = string;
1875c6c1daeSBarry Smith   vstr->curlen = 0;
1885c6c1daeSBarry Smith   vstr->maxlen = len;
1895c6c1daeSBarry Smith   PetscFunctionReturn(0);
1905c6c1daeSBarry Smith }
1915c6c1daeSBarry Smith 
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith 
1945c6c1daeSBarry Smith 
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith 
197