Actual source code: stringv.c
petsc-3.14.6 2021-03-30
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: }