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: }