xref: /petsc/src/sys/classes/viewer/impls/string/stringv.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith #include <petsc-private/viewerimpl.h>   /*I  "petscsys.h"  I*/
3*5c6c1daeSBarry Smith #include <stdarg.h>
4*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_STDLIB_H)
5*5c6c1daeSBarry Smith #include <stdlib.h>
6*5c6c1daeSBarry Smith #endif
7*5c6c1daeSBarry Smith 
8*5c6c1daeSBarry Smith typedef struct  {
9*5c6c1daeSBarry Smith   char         *string;   /* string where info is stored */
10*5c6c1daeSBarry Smith   char         *head;     /* pointer to begining of unused portion */
11*5c6c1daeSBarry Smith   size_t       curlen,maxlen;
12*5c6c1daeSBarry Smith } PetscViewer_String;
13*5c6c1daeSBarry Smith 
14*5c6c1daeSBarry Smith #undef __FUNCT__
15*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_String"
16*5c6c1daeSBarry Smith static PetscErrorCode PetscViewerDestroy_String(PetscViewer viewer)
17*5c6c1daeSBarry Smith {
18*5c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String *)viewer->data;
19*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
20*5c6c1daeSBarry Smith 
21*5c6c1daeSBarry Smith   PetscFunctionBegin;
22*5c6c1daeSBarry Smith   ierr = PetscFree(vstr);CHKERRQ(ierr);
23*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
24*5c6c1daeSBarry Smith }
25*5c6c1daeSBarry Smith 
26*5c6c1daeSBarry Smith #undef __FUNCT__
27*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringSPrintf"
28*5c6c1daeSBarry Smith /*@C
29*5c6c1daeSBarry Smith     PetscViewerStringSPrintf - Prints information to a PetscViewer string.
30*5c6c1daeSBarry Smith 
31*5c6c1daeSBarry Smith     Logically Collective on PetscViewer (Hmmm, each processor maintains a separate string)
32*5c6c1daeSBarry Smith 
33*5c6c1daeSBarry Smith     Input Parameters:
34*5c6c1daeSBarry Smith +   v - a string PetscViewer, formed by PetscViewerStringOpen()
35*5c6c1daeSBarry Smith -   format - the format of the input
36*5c6c1daeSBarry Smith 
37*5c6c1daeSBarry Smith     Level: developer
38*5c6c1daeSBarry Smith 
39*5c6c1daeSBarry Smith     Fortran Note:
40*5c6c1daeSBarry Smith     This routine is not supported in Fortran.
41*5c6c1daeSBarry Smith 
42*5c6c1daeSBarry Smith    Concepts: printing^to string
43*5c6c1daeSBarry Smith 
44*5c6c1daeSBarry Smith .seealso: PetscViewerStringOpen()
45*5c6c1daeSBarry Smith @*/
46*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerStringSPrintf(PetscViewer viewer,const char format[],...)
47*5c6c1daeSBarry Smith {
48*5c6c1daeSBarry Smith   va_list            Argp;
49*5c6c1daeSBarry Smith   size_t             fullLength;
50*5c6c1daeSBarry Smith   size_t             shift;
51*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
52*5c6c1daeSBarry Smith   PetscBool          isstring;
53*5c6c1daeSBarry Smith   char               tmp[4096];
54*5c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
55*5c6c1daeSBarry Smith 
56*5c6c1daeSBarry Smith   PetscFunctionBegin;
57*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
58*5c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
59*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);CHKERRQ(ierr);
60*5c6c1daeSBarry Smith   if (!isstring) PetscFunctionReturn(0);
61*5c6c1daeSBarry Smith   if (!vstr->string) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerStringSetString() before using");
62*5c6c1daeSBarry Smith 
63*5c6c1daeSBarry Smith   va_start(Argp,format);
64*5c6c1daeSBarry Smith   ierr = PetscVSNPrintf(tmp,4096,format,&fullLength,Argp);CHKERRQ(ierr);
65*5c6c1daeSBarry Smith   va_end(Argp);
66*5c6c1daeSBarry Smith 
67*5c6c1daeSBarry Smith   ierr = PetscStrlen(tmp,&shift);CHKERRQ(ierr);
68*5c6c1daeSBarry Smith   if (shift >= vstr->maxlen - vstr->curlen - 1) shift = vstr->maxlen - vstr->curlen - 1;
69*5c6c1daeSBarry Smith   ierr = PetscStrncpy(vstr->head,tmp,shift);CHKERRQ(ierr);
70*5c6c1daeSBarry Smith 
71*5c6c1daeSBarry Smith   vstr->head   += shift;
72*5c6c1daeSBarry Smith   vstr->curlen += shift;
73*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
74*5c6c1daeSBarry Smith }
75*5c6c1daeSBarry Smith 
76*5c6c1daeSBarry Smith #undef __FUNCT__
77*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringOpen"
78*5c6c1daeSBarry Smith /*@C
79*5c6c1daeSBarry Smith     PetscViewerStringOpen - Opens a string as a PetscViewer. This is a very
80*5c6c1daeSBarry Smith     simple PetscViewer; information on the object is simply stored into
81*5c6c1daeSBarry Smith     the string in a fairly nice way.
82*5c6c1daeSBarry Smith 
83*5c6c1daeSBarry Smith     Collective on MPI_Comm
84*5c6c1daeSBarry Smith 
85*5c6c1daeSBarry Smith     Input Parameters:
86*5c6c1daeSBarry Smith +   comm - the communicator
87*5c6c1daeSBarry Smith .   string - the string to use
88*5c6c1daeSBarry Smith -   len    - the string length
89*5c6c1daeSBarry Smith 
90*5c6c1daeSBarry Smith     Output Parameter:
91*5c6c1daeSBarry Smith .   lab - the PetscViewer
92*5c6c1daeSBarry Smith 
93*5c6c1daeSBarry Smith     Level: advanced
94*5c6c1daeSBarry Smith 
95*5c6c1daeSBarry Smith     Fortran Note:
96*5c6c1daeSBarry Smith     This routine is not supported in Fortran.
97*5c6c1daeSBarry Smith 
98*5c6c1daeSBarry Smith   Concepts: PetscViewerString^creating
99*5c6c1daeSBarry Smith 
100*5c6c1daeSBarry Smith .seealso: PetscViewerDestroy(), PetscViewerStringSPrintf()
101*5c6c1daeSBarry Smith @*/
102*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerStringOpen(MPI_Comm comm,char string[],PetscInt len,PetscViewer *lab)
103*5c6c1daeSBarry Smith {
104*5c6c1daeSBarry Smith   PetscErrorCode ierr;
105*5c6c1daeSBarry Smith 
106*5c6c1daeSBarry Smith   PetscFunctionBegin;
107*5c6c1daeSBarry Smith   ierr = PetscViewerCreate(comm,lab);CHKERRQ(ierr);
108*5c6c1daeSBarry Smith   ierr = PetscViewerSetType(*lab,PETSCVIEWERSTRING);CHKERRQ(ierr);
109*5c6c1daeSBarry Smith   ierr = PetscViewerStringSetString(*lab,string,len);CHKERRQ(ierr);
110*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
111*5c6c1daeSBarry Smith }
112*5c6c1daeSBarry Smith 
113*5c6c1daeSBarry Smith #undef __FUNCT__
114*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_String"
115*5c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_String(PetscViewer viewer,PetscViewer *sviewer)
116*5c6c1daeSBarry Smith {
117*5c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
118*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
119*5c6c1daeSBarry Smith 
120*5c6c1daeSBarry Smith   PetscFunctionBegin;
121*5c6c1daeSBarry Smith   ierr = PetscViewerStringOpen(PETSC_COMM_SELF,vstr->head,vstr->maxlen-vstr->curlen,sviewer);CHKERRQ(ierr);
122*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
123*5c6c1daeSBarry Smith }
124*5c6c1daeSBarry Smith 
125*5c6c1daeSBarry Smith #undef __FUNCT__
126*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_String"
127*5c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_String(PetscViewer viewer,PetscViewer *sviewer)
128*5c6c1daeSBarry Smith {
129*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
130*5c6c1daeSBarry Smith   PetscViewer_String *iviewer = (PetscViewer_String*)(*sviewer)->data;
131*5c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
132*5c6c1daeSBarry Smith 
133*5c6c1daeSBarry Smith   PetscFunctionBegin;
134*5c6c1daeSBarry Smith   vstr->head    = iviewer->head;
135*5c6c1daeSBarry Smith   vstr->curlen += iviewer->curlen;
136*5c6c1daeSBarry Smith   ierr = PetscViewerDestroy(sviewer);CHKERRQ(ierr);
137*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
138*5c6c1daeSBarry Smith }
139*5c6c1daeSBarry Smith 
140*5c6c1daeSBarry Smith EXTERN_C_BEGIN
141*5c6c1daeSBarry Smith #undef __FUNCT__
142*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_String"
143*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerCreate_String(PetscViewer v)
144*5c6c1daeSBarry Smith {
145*5c6c1daeSBarry Smith   PetscViewer_String *vstr;
146*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
147*5c6c1daeSBarry Smith 
148*5c6c1daeSBarry Smith   PetscFunctionBegin;
149*5c6c1daeSBarry Smith   v->ops->destroy          = PetscViewerDestroy_String;
150*5c6c1daeSBarry Smith   v->ops->view             = 0;
151*5c6c1daeSBarry Smith   v->ops->flush            = 0;
152*5c6c1daeSBarry Smith   v->ops->getsingleton     = PetscViewerGetSingleton_String;
153*5c6c1daeSBarry Smith   v->ops->restoresingleton = PetscViewerRestoreSingleton_String;
154*5c6c1daeSBarry Smith   ierr                     = PetscNewLog(v,PetscViewer_String,&vstr);CHKERRQ(ierr);
155*5c6c1daeSBarry Smith   v->data                  = (void*)vstr;
156*5c6c1daeSBarry Smith   vstr->string             = 0;
157*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
158*5c6c1daeSBarry Smith }
159*5c6c1daeSBarry Smith EXTERN_C_END
160*5c6c1daeSBarry Smith 
161*5c6c1daeSBarry Smith #undef __FUNCT__
162*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringSetString"
163*5c6c1daeSBarry Smith /*@C
164*5c6c1daeSBarry Smith 
165*5c6c1daeSBarry Smith    PetscViewerStringSetString - sets the string that a string viewer will print to
166*5c6c1daeSBarry Smith 
167*5c6c1daeSBarry Smith    Logically Collective on PetscViewer
168*5c6c1daeSBarry Smith 
169*5c6c1daeSBarry Smith   Input Parameters:
170*5c6c1daeSBarry Smith +   viewer - string viewer you wish to attach string to
171*5c6c1daeSBarry Smith .   string - the string to print data into
172*5c6c1daeSBarry Smith -   len - the length of the string
173*5c6c1daeSBarry Smith 
174*5c6c1daeSBarry Smith   Level: advanced
175*5c6c1daeSBarry Smith 
176*5c6c1daeSBarry Smith .seealso: PetscViewerStringOpen()
177*5c6c1daeSBarry Smith @*/
178*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerStringSetString(PetscViewer viewer,char string[],PetscInt len)
179*5c6c1daeSBarry Smith {
180*5c6c1daeSBarry Smith   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
181*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
182*5c6c1daeSBarry Smith   PetscBool          isstring;
183*5c6c1daeSBarry Smith 
184*5c6c1daeSBarry Smith   PetscFunctionBegin;
185*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
186*5c6c1daeSBarry Smith   PetscValidCharPointer(string,2);
187*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);CHKERRQ(ierr);
188*5c6c1daeSBarry Smith   if (!isstring)  PetscFunctionReturn(0);
189*5c6c1daeSBarry Smith   if (len <= 2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"String must have length at least 2");
190*5c6c1daeSBarry Smith 
191*5c6c1daeSBarry Smith   ierr = PetscMemzero(string,len*sizeof(char));CHKERRQ(ierr);
192*5c6c1daeSBarry Smith   vstr->string      = string;
193*5c6c1daeSBarry Smith   vstr->head        = string;
194*5c6c1daeSBarry Smith   vstr->curlen      = 0;
195*5c6c1daeSBarry Smith   vstr->maxlen      = len;
196*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
197*5c6c1daeSBarry Smith }
198*5c6c1daeSBarry Smith 
199*5c6c1daeSBarry Smith 
200*5c6c1daeSBarry Smith 
201*5c6c1daeSBarry Smith 
202*5c6c1daeSBarry Smith 
203*5c6c1daeSBarry Smith 
204