//#--------------------------------------------------------------------------- //# PKSmsg.cc: Message handling for the PKSIO classes. //#--------------------------------------------------------------------------- //# livedata - processing pipeline for single-dish, multibeam spectral data. //# Copyright (C) 2008-2009, Australia Telescope National Facility, CSIRO //# //# This file is part of livedata. //# //# livedata is free software: you can redistribute it and/or modify it under //# the terms of the GNU General Public License as published by the Free //# Software Foundation, either version 3 of the License, or (at your option) //# any later version. //# //# livedata is distributed in the hope that it will be useful, but WITHOUT //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for //# more details. //# //# You should have received a copy of the GNU General Public License along //# with livedata. If not, see . //# //# Correspondence concerning livedata may be directed to: //# Internet email: mcalabre@atnf.csiro.au //# Postal address: Dr. Mark Calabretta //# Australia Telescope National Facility, CSIRO //# PO Box 76 //# Epping NSW 1710 //# AUSTRALIA //# //# http://www.atnf.csiro.au/computing/software/livedata.html //# $Id: PKSmsg.cc,v 1.3 2009-09-29 07:33:38 cal103 Exp $ //#--------------------------------------------------------------------------- //# Original: 2008/09/18, Mark Calabretta, ATNF //#--------------------------------------------------------------------------- #include #include #include #include //------------------------------------------------------------- PKSmsg::PKSmsg // Default constructor. PKSmsg::PKSmsg() { initMsg(); } void PKSmsg::initMsg() { cMsgFD = stderr; cMsgLen = 0; cMsgBuff = 0x0; cMsgIdx = cMsgBuff; cNMsg = 0; } //------------------------------------------------------------ PKSmsg::~PKSmsg // Destructor. PKSmsg::~PKSmsg() { delete [] cMsgBuff; cMsgBuff = 0x0; cMsgIdx = cMsgBuff; } //------------------------------------------------------------- PKSmsg::setMsg // Set message disposition. If fd is non-zero messages will be written // to that file descriptor, else stored for retrieval by getMsg(). int PKSmsg::setMsg(FILE *fd) { cMsgFD = fd; if (cMsgFD == 0x0) { clearMsg(); } else { delete [] cMsgBuff; cMsgLen = 0; cMsgBuff = 0x0; cMsgIdx = cMsgBuff; } return 0; } //------------------------------------------------------------- PKSmsg::logMsg // Log a message. void PKSmsg::logMsg(const char *msg) { if (msg) { if (cMsgFD) { fprintf(cMsgFD, "%s\n", msg); } else { // Expand the message buffer if necessary. if (!cMsgBuff) { cMsgLen = 128; cMsgBuff = new char[cMsgLen]; cMsgIdx = cMsgBuff; clearMsg(); } int used = strlen(cMsgBuff); int free = cMsgLen - (used + 1); int xtra = 1 + strlen(msg); if (free < xtra) { if (xtra < 128) xtra = 128; cMsgLen += xtra; char *newBuff = new char[cMsgLen]; strcpy(newBuff, cMsgBuff); delete [] cMsgBuff; cMsgBuff = newBuff; cMsgIdx = cMsgBuff; } sprintf(cMsgBuff+used, "%s%s", ((cNMsg++)?"\n":""), msg); } } } //------------------------------------------------------------- PKSmsg::getMsg // Get a message string, or 0x0 if there is none. const char *PKSmsg::getMsg() { if (cMsgBuff && *cMsgBuff) { cMsgIdx = cMsgBuff; return cMsgBuff; } return 0x0; } // Get the next group of messages by type: ERROR, WARNING, or otherwise. const char *PKSmsg::getMsg(msgType &type) { if (cMsgIdx && *cMsgIdx) { if (strncmp(cMsgIdx, "ERROR", 5) == 0) { type = ERROR; } else if (strncmp(cMsgIdx, "WARNING", 7) == 0) { type = WARNING; } else { type = NORMAL; } // Gather multi-line messages. char *cp = cMsgIdx; while ((cMsgIdx = strchr(cMsgIdx, '\n'))) { cMsgIdx++; if (type == ERROR) { if (strncmp(cMsgIdx, "ERROR", 5) == 0 || strncmp(cMsgIdx, " ", 5) == 0) { continue; } } else if (type == WARNING) { if (strncmp(cMsgIdx, "WARNING", 7) == 0 || strncmp(cMsgIdx, " ", 7) == 0) { continue; } } else { if (strncmp(cMsgIdx, "ERROR", 5) || strncmp(cMsgIdx, "WARNING", 7)) { continue; } } *(cMsgIdx-1) = '\0'; break; } return cp; } return 0x0; } //----------------------------------------------------------- PKSmsg::clearMsg // Clear the message buffer. void PKSmsg::clearMsg(void) { if (cMsgBuff) *cMsgBuff = '\0'; cMsgIdx = cMsgBuff; cNMsg = 0; }