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