Actual source code: stringv.c
  2: #include <petsc/private/viewerimpl.h>
  4: typedef struct  {
  5:   char      *string;         /* string where info is stored */
  6:   char      *head;           /* pointer to begining of unused portion */
  7:   size_t    curlen,maxlen;
  8:   PetscBool ownstring;       /* string viewer is responsable for freeing the string */
  9: } PetscViewer_String;
 11: static PetscErrorCode PetscViewerDestroy_String(PetscViewer viewer)
 12: {
 13:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
 14:   PetscErrorCode     ierr;
 17:   if (vstr->ownstring) {
 18:     PetscFree(vstr->string);
 19:   }
 20:   PetscFree(vstr);
 21:   return(0);
 22: }
 24: /*@C
 25:     PetscViewerStringSPrintf - Prints information to a PetscViewer string.
 27:     Logically Collective on PetscViewer (Hmmm, each processor maintains a separate string)
 29:     Input Parameters:
 30: +   v - a string PetscViewer, formed by PetscViewerStringOpen()
 31: -   format - the format of the input
 33:     Level: developer
 35:     Fortran Note:
 36:     This routine is not supported in Fortran.
 38: .seealso: PetscViewerStringOpen(), PetscViewerStringGetStringRead(), PetscViewerStringSetString(), PETSCVIEWERSTRING
 39: @*/
 40: PetscErrorCode  PetscViewerStringSPrintf(PetscViewer viewer,const char format[],...)
 41: {
 42:   va_list            Argp;
 43:   size_t             fullLength;
 44:   size_t             shift,cshift;
 45:   PetscErrorCode     ierr;
 46:   PetscBool          isstring;
 47:   char               tmp[4096];
 48:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
 53:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);
 54:   if (!isstring) return(0);
 55:   if (!vstr->string) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerStringSetString() before using");
 57:   va_start(Argp,format);
 58:   PetscVSNPrintf(tmp,4096,format,&fullLength,Argp);
 59:   va_end(Argp);
 60:   PetscStrlen(tmp,&shift);
 61:   cshift = shift+1;
 62:   if (cshift >= vstr->maxlen - vstr->curlen - 1) cshift = vstr->maxlen - vstr->curlen - 1;
 63:   PetscStrncpy(vstr->head,tmp,cshift);
 64:   vstr->head   += shift;
 65:   vstr->curlen += shift;
 66:   return(0);
 67: }
 69: /*@C
 70:     PetscViewerStringOpen - Opens a string as a PetscViewer. This is a very
 71:     simple PetscViewer; information on the object is simply stored into
 72:     the string in a fairly nice way.
 74:     Collective
 76:     Input Parameters:
 77: +   comm - the communicator
 78: .   string - the string to use
 79: -   len    - the string length
 81:     Output Parameter:
 82: .   lab - the PetscViewer
 84:     Level: advanced
 86:     Fortran Note:
 87:     This routine is not supported in Fortran.
 89: .seealso: PetscViewerDestroy(), PetscViewerStringSPrintf(), PetscViewerStringGetStringRead(), PetscViewerStringSetString(), PETSCVIEWERSTRING
 90: @*/
 91: PetscErrorCode  PetscViewerStringOpen(MPI_Comm comm,char string[],size_t len,PetscViewer *lab)
 92: {
 96:   PetscViewerCreate(comm,lab);
 97:   PetscViewerSetType(*lab,PETSCVIEWERSTRING);
 98:   PetscViewerStringSetString(*lab,string,len);
 99:   return(0);
100: }
102: PetscErrorCode PetscViewerGetSubViewer_String(PetscViewer viewer,MPI_Comm comm,PetscViewer *sviewer)
103: {
104:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
105:   PetscErrorCode     ierr;
108:   PetscViewerStringOpen(PETSC_COMM_SELF,vstr->head,vstr->maxlen-vstr->curlen,sviewer);
109:   return(0);
110: }
112: PetscErrorCode PetscViewerRestoreSubViewer_String(PetscViewer viewer,MPI_Comm comm,PetscViewer *sviewer)
113: {
114:   PetscErrorCode     ierr;
115:   PetscViewer_String *iviewer = (PetscViewer_String*)(*sviewer)->data;
116:   PetscViewer_String *vstr    = (PetscViewer_String*)viewer->data;
119:   vstr->head    = iviewer->head;
120:   vstr->curlen += iviewer->curlen;
121:   PetscViewerDestroy(sviewer);
122:   return(0);
123: }
125: /*MC
126:    PETSCVIEWERSTRING - A viewer that writes to a string
129: .seealso:  PetscViewerStringOpen(), PetscViewerStringSPrintf(), PetscViewerSocketOpen(), PetscViewerDrawOpen(), PETSCVIEWERSOCKET,
130:            PetscViewerCreate(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PETSCVIEWERBINARY, PETSCVIEWERDRAW,
131:            PetscViewerMatlabOpen(), VecView(), DMView(), PetscViewerMatlabPutArray(), PETSCVIEWERASCII, PETSCVIEWERMATLAB,
132:            PetscViewerFileSetName(), PetscViewerFileSetMode(), PetscViewerFormat, PetscViewerType, PetscViewerSetType()
134:   Level: beginner
135: M*/
137: PETSC_EXTERN PetscErrorCode PetscViewerCreate_String(PetscViewer v)
138: {
139:   PetscViewer_String *vstr;
140:   PetscErrorCode     ierr;
143:   v->ops->destroy          = PetscViewerDestroy_String;
144:   v->ops->view             = NULL;
145:   v->ops->flush            = NULL;
146:   v->ops->getsubviewer     = PetscViewerGetSubViewer_String;
147:   v->ops->restoresubviewer = PetscViewerRestoreSubViewer_String;
148:   PetscNewLog(v,&vstr);
149:   v->data                  = (void*)vstr;
150:   vstr->string             = NULL;
151:   return(0);
152: }
154: /*@C
156:    PetscViewerStringGetStringRead - Returns the string that a string viewer uses
158:    Logically Collective on PetscViewer
160:   Input Parameter:
161: .   viewer - string viewer
163:   Output Parameters:
164: +    string - the string, optional use NULL if you do not need
165: -   len - the length of the string, optional use NULL if you do
167:   Notes: Do not write to the string nor free it
169:   Level: advanced
171: .seealso: PetscViewerStringOpen(), PETSCVIEWERSTRING, PetscViewerStringSetString(), PetscViewerStringSPrintf(),
172:           PetscViewerStringSetOwnString()
173: @*/
174: PetscErrorCode  PetscViewerStringGetStringRead(PetscViewer viewer,const char *string[],size_t *len)
175: {
176:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
177:   PetscErrorCode     ierr;
178:   PetscBool          isstring;
182:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);
183:   if (!isstring) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Only for PETSCVIEWERSTRING");
184:   if (string) *string = vstr->string;
185:   if (len)    *len    = vstr->maxlen;
186:   return(0);
187: }
189: /*@C
191:    PetscViewerStringSetString - sets the string that a string viewer will print to
193:    Logically Collective on PetscViewer
195:   Input Parameters:
196: +   viewer - string viewer you wish to attach string to
197: .   string - the string to print data into
198: -   len - the length of the string
200:   Notes: The function does not copy the string, it uses it directly therefore you cannot free
201:    the string until the viewer is destroyed. If you call PetscViewerStringSetOwnString() the ownership
202:    passes to the viewer and it will be responsable for freeing it. In this case the string must be
203:    obtained with PetscMalloc().
205:   Level: advanced
207: .seealso: PetscViewerStringOpen(), PETSCVIEWERSTRING, PetscViewerStringGetStringRead(), PetscViewerStringSPrintf(),
208:           PetscViewerStringSetOwnString()
209: @*/
210: PetscErrorCode  PetscViewerStringSetString(PetscViewer viewer,char string[],size_t len)
211: {
212:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
213:   PetscErrorCode     ierr;
214:   PetscBool          isstring;
219:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);
220:   if (!isstring) return(0);
221:   if (len <= 2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"String must have length at least 2");
223:   PetscArrayzero(string,len);
224:   vstr->string = string;
225:   vstr->head   = string;
226:   vstr->curlen = 0;
227:   vstr->maxlen = len;
228:   return(0);
229: }
231: /*@C
233:    PetscViewerStringSetOwnString - tells the viewer that it now owns the string and is responsible for freeing it
235:    Logically Collective on PetscViewer
237:   Input Parameters:
238: .   viewer - string viewer
240:   Notes: If you call this the string must have been obtained with PetscMalloc() and you cannot free the string
242:   Level: advanced
244: .seealso: PetscViewerStringOpen(), PETSCVIEWERSTRING, PetscViewerStringGetStringRead(), PetscViewerStringSPrintf(),
245:           PetscViewerStringSetString()
246: @*/
247: PetscErrorCode  PetscViewerStringSetOwnString(PetscViewer viewer)
248: {
249:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
250:   PetscErrorCode     ierr;
251:   PetscBool          isstring;
255:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);
256:   if (!isstring) return(0);
258:   vstr->ownstring = PETSC_TRUE;
259:   return(0);
260: }