Actual source code: stringv.c

  1: #include "src/sys/src/viewer/viewerimpl.h"   /*I  "petsc.h"  I*/
  2: #include <stdarg.h>
  3: #if defined(PETSC_HAVE_STDLIB_H)
  4: #include <stdlib.h>
  5: #endif
  6: #include "petscfix.h"

  8: typedef struct  {
  9:   char         *string;   /* string where info is stored */
 10:   char         *head;     /* pointer to begining of unused portion */
 11:   size_t       curlen,maxlen;
 12: } PetscViewer_String;

 16: static PetscErrorCode PetscViewerDestroy_String(PetscViewer viewer)
 17: {
 18:   PetscViewer_String *vstr = (PetscViewer_String *)viewer->data;
 19:   PetscErrorCode     ierr;

 22:   PetscFree(vstr);
 23:   return(0);
 24: }

 28: /*@C
 29:     PetscViewerStringSPrintf - Prints information to a PetscViewer string.

 31:     Collective on PetscViewer (Hmmm, each processor maintains a seperate string)

 33:     Input Parameters:
 34: +   v - a string PetscViewer, formed by PetscViewerStringOpen()
 35: -   format - the format of the input

 37:     Level: developer

 39:     Fortran Note:
 40:     This routine is not supported in Fortran.

 42:    Concepts: printing^to string

 44: .seealso: PetscViewerStringOpen()
 45: @*/
 46: PetscErrorCode PetscViewerStringSPrintf(PetscViewer viewer,const char format[],...)
 47: {
 48:   va_list            Argp;
 49:   size_t             shift;
 50:   PetscErrorCode     ierr;
 51:   PetscTruth         isstring;
 52:   char               tmp[4096];
 53:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;

 58:   PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);
 59:   if (!isstring) return(0);
 60:   if (!vstr->string) SETERRQ(PETSC_ERR_ORDER,"Must call PetscViewerStringSetString() before using");

 62:   va_start(Argp,format);
 63:   PetscVSNPrintf(tmp,4096,format,Argp);
 64:   va_end(Argp);

 66:   PetscStrlen(tmp,&shift);
 67:   if (shift >= vstr->maxlen - vstr->curlen - 1) shift = vstr->maxlen - vstr->curlen - 1;
 68:   PetscStrncpy(vstr->head,tmp,shift);

 70:   vstr->head   += shift;
 71:   vstr->curlen += shift;
 72:   return(0);
 73: }

 77: /*@C
 78:     PetscViewerStringOpen - Opens a string as a PetscViewer. This is a very 
 79:     simple PetscViewer; information on the object is simply stored into 
 80:     the string in a fairly nice way.

 82:     Collective on MPI_Comm

 84:     Input Parameters:
 85: +   comm - the communicator
 86: -   string - the string to use

 88:     Output Parameter:
 89: .   lab - the PetscViewer

 91:     Level: advanced

 93:     Fortran Note:
 94:     This routine is not supported in Fortran.

 96:   Concepts: PetscViewerString^creating

 98: .seealso: PetscViewerDestroy(), PetscViewerStringSPrintf()
 99: @*/
100: PetscErrorCode PetscViewerStringOpen(MPI_Comm comm,char string[],PetscInt len,PetscViewer *lab)
101: {
103: 
105:   PetscViewerCreate(comm,lab);
106:   PetscViewerSetType(*lab,PETSC_VIEWER_STRING);
107:   PetscViewerStringSetString(*lab,string,len);
108:   return(0);
109: }

113: PetscErrorCode PetscViewerGetSingleton_String(PetscViewer viewer,PetscViewer *sviewer)
114: {
115:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
116:   PetscErrorCode     ierr;

119:   PetscViewerStringOpen(PETSC_COMM_SELF,vstr->head,vstr->maxlen-vstr->curlen,sviewer);
120:   return(0);
121: }

125: PetscErrorCode PetscViewerRestoreSingleton_String(PetscViewer viewer,PetscViewer *sviewer)
126: {
127:   PetscErrorCode     ierr;
128:   PetscViewer_String *iviewer = (PetscViewer_String*)(*sviewer)->data;
129:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;

132:   vstr->head    = iviewer->head;
133:   vstr->curlen += iviewer->curlen;
134:   PetscViewerDestroy(*sviewer);
135:   return(0);
136: }

141: PetscErrorCode PetscViewerCreate_String(PetscViewer v)
142: {
143:   PetscViewer_String *vstr;
144:   PetscErrorCode     ierr;

147:   v->ops->destroy          = PetscViewerDestroy_String;
148:   v->ops->view             = 0;
149:   v->ops->flush            = 0;
150:   v->ops->getsingleton     = PetscViewerGetSingleton_String;
151:   v->ops->restoresingleton = PetscViewerRestoreSingleton_String;
152:   PetscNew(PetscViewer_String,&vstr);
153:   v->data                  = (void*)vstr;
154:   vstr->string             = 0;
155:   return(0);
156: }

161: /*@C

163:    PetscViewerStringSetString - sets the string that a string viewer will print to

165:    Collective on PetscViewer

167:   Input Parameters:
168: +   viewer - string viewer you wish to attach string to
169: .   string - the string to print data into
170: -   len - the length of the string

172:   Level: advanced

174: .seealso: PetscViewerStringOpen()
175: @*/
176: PetscErrorCode PetscViewerStringSetString(PetscViewer viewer,char string[],PetscInt len)
177: {
178:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
179:   PetscErrorCode     ierr;
180:   PetscTruth         isstring;

185:   PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);
186:   if (!isstring)  return(0);
187:   if (len <= 2) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"String must have length at least 2");

189:   PetscMemzero(string,len*sizeof(char));
190:   vstr->string      = string;
191:   vstr->head        = string;
192:   vstr->curlen      = 0;
193:   vstr->maxlen      = len;
194:   return(0);
195: }