This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-goldedplus/goldlib/gall/glog.cpp
2006-04-24 16:38:44 +00:00

199 lines
5.1 KiB
C++

// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 1990-1999 Odinn Sorensen
// Copyright (C) 2000 Alexander S. Aganichev
// ------------------------------------------------------------------
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307, USA
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// Log file class.
// ------------------------------------------------------------------
#include <cstdarg>
#include <gtimall.h>
#include <gstrall.h>
#include <gdbgerr.h>
#include <glog.h>
// ------------------------------------------------------------------
struct tm glog::time_now;
int glog::count = 0;
time32_t glog::secs_now;
char glog::timebuf[20];
// ------------------------------------------------------------------
glog::glog() {
bufsize = 0;
logtype = GLOG_FD;
progname = NULL;
status = GOLD_NO_ERROR;
storelines = -1;
}
// ------------------------------------------------------------------
glog::~glog() {
close();
}
// ------------------------------------------------------------------
int glog::open(const char* filename, const char* name, const char* shortname, int type, uint bufsz, int shflag)
{
fp.Fopen(filename, "at", shflag);
if (fp.status)
{
status = fp.status;
return status;
}
count++;
bufsize = bufsz;
fp.SetvBuf(NULL, bufsize ? _IOFBF : _IONBF, bufsize);
init(name, shortname, type);
return status;
}
// ------------------------------------------------------------------
void glog::close()
{
fp.Fclose();
count--;
}
// ------------------------------------------------------------------
void glog::init(const char* name, const char* shortname, int type) {
lineswritten = 0;
logtype = (type!=GLOG_NONE) ? type : logtype;
progname = name ? name : progname;
shortprogname = shortname ? shortname : (shortprogname ? shortprogname : progname);
}
// ------------------------------------------------------------------
void glog::printf(const char* format, ...) {
va_list argptr;
char buf[256];
char logbuf[256];
secs_now = gtime(NULL);
glocaltime(&time_now, &secs_now);
lineswritten++;
if(lineswritten == 1) {
switch(logtype) {
case GLOG_FD:
sprintf(logbuf, "\n---------- %s, %s\n", strftimei(timebuf, 20, "%a %d %b %y", &time_now), progname);
break;
case GLOG_MAX:
sprintf(logbuf, "\n+ %s %4.4s Begin, %s\n", strftimei(timebuf, 20, "%d %b %H:%M:%S", &time_now), shortprogname, progname);
break;
case GLOG_BINK:
sprintf(logbuf, "\n> %s %4.4s %s\n", strftimei(timebuf, 20, "%d-%b %H:%M:%S", &time_now), shortprogname, progname);
break;
case GLOG_QBBS:
sprintf(logbuf, "\n%s **************************************************\n%s %s\n", strftimei(timebuf, 20, "%d-%b-%y %H:%M", &time_now), timebuf, progname);
break;
case GLOG_DB:
sprintf(logbuf, "\n%s %s\n", strftimei(timebuf, 20, "%m/%d/%y %H:%M", &time_now), progname);
break;
}
if (fp.isopen())
fp.Printf("%s", logbuf);
}
*buf = NUL;
va_start(argptr, format);
vsprintf(buf, format, argptr);
va_end(argptr);
if(*buf == '!')
store();
switch(logtype) {
case GLOG_FD:
sprintf(logbuf, "%c %s %s", *buf, strftimei(timebuf, 10, "%H:%M:%S", &time_now), buf+2);
break;
case GLOG_MAX:
sprintf(logbuf, "%c %s %4.4s %s", *buf, strftimei(timebuf, 20, "%d %b %H:%M:%S", &time_now), shortprogname, buf+2);
break;
case GLOG_BINK:
sprintf(logbuf, "%c %s %4.4s %s", *buf, strftimei(timebuf, 20, "%d-%b %H:%M:%S", &time_now), shortprogname, buf+2);
break;
case GLOG_QBBS:
sprintf(logbuf, "%s %s", strftimei(timebuf, 20, "%d-%b-%y %H:%M", &time_now), buf+2);
break;
case GLOG_DB:
sprintf(logbuf, "%s %s", strftimei(timebuf, 20, "%m/%d/%y %H:%M", &time_now), buf+2);
break;
}
if (fp.isopen())
{
fp.Printf("%s\n", logbuf);
fp.Fflush();
}
if(storelines != -1) {
if(storelines < GLOG_STORELINES)
strxcpy(storeline[storelines], logbuf, 79);
storelines++;
}
}
// ------------------------------------------------------------------
void glog::store() {
if(storelines == -1)
storelines = 0;
}
// ------------------------------------------------------------------