Actual source code: xmlviewer.c

  1: /*************************************************************************************
  2:  *    M A R I T I M E  R E S E A R C H  I N S T I T U T E  N E T H E R L A N D S     *
  3:  *************************************************************************************
  4:  *    authors: Koos Huijssen, Christiaan M. Klaij                                    *
  5:  *************************************************************************************
  6:  *    content: Viewer for writing XML output                                         *
  7:  *************************************************************************************/
  8: #include <petscviewer.h>
  9: #include <petsc/private/logimpl.h>
 10: #include <petsc/private/fortranimpl.h>
 11: #include "../src/sys/logging/xmlviewer.h"

 13: #if defined(PETSC_USE_LOG)

 15: static int XMLSectionDepth = 0;

 17: PetscErrorCode PetscViewerXMLStartSection(PetscViewer viewer, const char *name, const char *desc)
 18: {
 19:   PetscFunctionBegin;
 20:   if (!desc) {
 21:     PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s>\n", XMLSectionDepth, "", name));
 22:   } else {
 23:     PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s desc=\"%s\">\n", XMLSectionDepth, "", name, desc));
 24:   }
 25:   XMLSectionDepth += 2;
 26:   PetscFunctionReturn(PETSC_SUCCESS);
 27: }

 29: /* Initialize a viewer to XML, and initialize the XMLDepth static parameter */
 30: PetscErrorCode PetscViewerInitASCII_XML(PetscViewer viewer)
 31: {
 32:   MPI_Comm comm;
 33:   char     PerfScript[PETSC_MAX_PATH_LEN + 40];

 35:   PetscFunctionBegin;
 36:   PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm));
 37:   PetscCall(PetscViewerASCIIPrintf(viewer, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"));
 38:   PetscCall(PetscStrreplace(comm, "<?xml-stylesheet type=\"text/xsl\" href=\"performance_xml2html.xsl\"?>", PerfScript, sizeof(PerfScript)));
 39:   PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", PerfScript));
 40:   XMLSectionDepth = 0;
 41:   PetscCall(PetscViewerXMLStartSection(viewer, "root", NULL));
 42:   PetscFunctionReturn(PETSC_SUCCESS);
 43: }

 45: /* Initialize a viewer to XML, and initialize the XMLDepth static parameter */
 46: PetscErrorCode PetscViewerFinalASCII_XML(PetscViewer viewer)
 47: {
 48:   PetscFunctionBegin;
 49:   PetscCall(PetscViewerXMLEndSection(viewer, "root"));
 50:   PetscFunctionReturn(PETSC_SUCCESS);
 51: }

 53: PetscErrorCode PetscViewerXMLEndSection(PetscViewer viewer, const char *name)
 54: {
 55:   PetscFunctionBegin;
 56:   XMLSectionDepth -= 2;
 57:   if (XMLSectionDepth < 0) XMLSectionDepth = 0;
 58:   PetscCall(PetscViewerASCIIPrintf(viewer, "%*s</%s>\n", XMLSectionDepth, "", name));
 59:   PetscFunctionReturn(PETSC_SUCCESS);
 60: }

 62: PetscErrorCode PetscViewerXMLPutString(PetscViewer viewer, const char *name, const char *desc, const char *value)
 63: {
 64:   PetscFunctionBegin;
 65:   if (!desc) {
 66:     PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s>%s</%s>\n", XMLSectionDepth, "", name, value, name));
 67:   } else {
 68:     PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s desc=\"%s\">%s</%s>\n", XMLSectionDepth, "", name, desc, value, name));
 69:   }
 70:   PetscFunctionReturn(PETSC_SUCCESS);
 71: }

 73: PetscErrorCode PetscViewerXMLPutInt(PetscViewer viewer, const char *name, const char *desc, int value)
 74: {
 75:   PetscFunctionBegin;
 76:   if (!desc) {
 77:     PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s>%d</%s>\n", XMLSectionDepth, "", name, value, name));
 78:   } else {
 79:     PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s desc=\"%s\">%d</%s>\n", XMLSectionDepth, "", name, desc, value, name));
 80:   }
 81:   PetscFunctionReturn(PETSC_SUCCESS);
 82: }

 84: PetscErrorCode PetscViewerXMLPutDouble(PetscViewer viewer, const char *name, const char *desc, PetscLogDouble value, const char *format)
 85: {
 86:   char buffer[1024];

 88:   PetscFunctionBegin;
 89:   if (!desc) {
 90:     PetscCall(PetscSNPrintf(buffer, sizeof(buffer), "%*s<%s>%s</%s>\n", XMLSectionDepth, "", name, format, name));
 91:   } else {
 92:     PetscCall(PetscSNPrintf(buffer, sizeof(buffer), "%*s<%s desc=\"%s\">%s</%s>\n", XMLSectionDepth, "", name, desc, format, name));
 93:   }
 94:   PetscCall(PetscViewerASCIIPrintf(viewer, buffer, value));
 95:   PetscFunctionReturn(PETSC_SUCCESS);
 96: }

 98: #endif