Actual source code: stringv.c
petsc-3.10.5 2019-03-28
Report Typos and Errors

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

     10: static PetscErrorCode PetscViewerDestroy_String(PetscViewer viewer)
     11: {
     12:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
     13:   PetscErrorCode     ierr;

     16:   PetscFree(vstr);
     17:   return(0);
     18: }

     20: /*@C
     21:     PetscViewerStringSPrintf - Prints information to a PetscViewer string.

     23:     Logically Collective on PetscViewer (Hmmm, each processor maintains a separate string)

     25:     Input Parameters:
     26: +   v - a string PetscViewer, formed by PetscViewerStringOpen()
     27: -   format - the format of the input

     29:     Level: developer

     31:     Fortran Note:
     32:     This routine is not supported in Fortran.

     34:    Concepts: printing^to string

     36: .seealso: PetscViewerStringOpen()
     37: @*/
     38: PetscErrorCode  PetscViewerStringSPrintf(PetscViewer viewer,const char format[],...)
     39: {
     40:   va_list            Argp;
     41:   size_t             fullLength;
     42:   size_t             shift,cshift;
     43:   PetscErrorCode     ierr;
     44:   PetscBool          isstring;
     45:   char               tmp[4096];
     46:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;

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

     55:   va_start(Argp,format);
     56:   PetscVSNPrintf(tmp,4096,format,&fullLength,Argp);
     57:   va_end(Argp);
     58:   PetscStrlen(tmp,&shift);
     59:   cshift = shift+1;
     60:   if (cshift >= vstr->maxlen - vstr->curlen - 1) cshift = vstr->maxlen - vstr->curlen - 1;
     61:   PetscStrncpy(vstr->head,tmp,cshift);
     62:   vstr->head   += shift;
     63:   vstr->curlen += shift;
     64:   return(0);
     65: }

     67: /*@C
     68:     PetscViewerStringOpen - Opens a string as a PetscViewer. This is a very
     69:     simple PetscViewer; information on the object is simply stored into
     70:     the string in a fairly nice way.

     72:     Collective on MPI_Comm

     74:     Input Parameters:
     75: +   comm - the communicator
     76: .   string - the string to use
     77: -   len    - the string length

     79:     Output Parameter:
     80: .   lab - the PetscViewer

     82:     Level: advanced

     84:     Fortran Note:
     85:     This routine is not supported in Fortran.

     87:   Concepts: PetscViewerString^creating

     89: .seealso: PetscViewerDestroy(), PetscViewerStringSPrintf()
     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             = 0;
    145:   v->ops->flush            = 0;
    146:   v->ops->getsubviewer     = PetscViewerGetSubViewer_String;
    147:   v->ops->restoresubviewer = PetscViewerRestoreSubViewer_String;
    148:   PetscNewLog(v,&vstr);
    149:   v->data                  = (void*)vstr;
    150:   vstr->string             = 0;
    151:   return(0);
    152: }

    154: /*@C

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

    158:    Logically Collective on PetscViewer

    160:   Input Parameters:
    161: +   viewer - string viewer you wish to attach string to
    162: .   string - the string to print data into
    163: -   len - the length of the string

    165:   Level: advanced

    167: .seealso: PetscViewerStringOpen()
    168: @*/
    169: PetscErrorCode  PetscViewerStringSetString(PetscViewer viewer,char string[],PetscInt len)
    170: {
    171:   PetscViewer_String *vstr = (PetscViewer_String*)viewer->data;
    172:   PetscErrorCode     ierr;
    173:   PetscBool          isstring;

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

    182:   PetscMemzero(string,len*sizeof(char));
    183:   vstr->string = string;
    184:   vstr->head   = string;
    185:   vstr->curlen = 0;
    186:   vstr->maxlen = len;
    187:   return(0);
    188: }