Actual source code: stringv.c

petsc-3.3-p7 2013-05-11
  2: #include <petsc-private/viewerimpl.h>   /*I  "petscsys.h"  I*/
  3: #include <stdarg.h>
  4: #if defined(PETSC_HAVE_STDLIB_H)
  5: #include <stdlib.h>
  6: #endif

  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:     Logically Collective on PetscViewer (Hmmm, each processor maintains a separate 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             fullLength;
 50:   size_t             shift;
 51:   PetscErrorCode     ierr;
 52:   PetscBool          isstring;
 53:   char               tmp[4096];
 54:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;

 59:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);
 60:   if (!isstring) return(0);
 61:   if (!vstr->string) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerStringSetString() before using");

 63:   va_start(Argp,format);
 64:   PetscVSNPrintf(tmp,4096,format,&fullLength,Argp);
 65:   va_end(Argp);

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

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

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

 83:     Collective on MPI_Comm

 85:     Input Parameters:
 86: +   comm - the communicator
 87: .   string - the string to use
 88: -   len    - the string length

 90:     Output Parameter:
 91: .   lab - the PetscViewer

 93:     Level: advanced

 95:     Fortran Note:
 96:     This routine is not supported in Fortran.

 98:   Concepts: PetscViewerString^creating

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

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

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

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

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

140: EXTERN_C_BEGIN
143: PetscErrorCode  PetscViewerCreate_String(PetscViewer v)
144: {
145:   PetscViewer_String *vstr;
146:   PetscErrorCode     ierr;

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

163: /*@C

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

167:    Logically Collective on PetscViewer

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

174:   Level: advanced

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

187:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);
188:   if (!isstring)  return(0);
189:   if (len <= 2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"String must have length at least 2");

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