Files
SAPFOR/dvm/tools/pppa/branches/dvm4.07/src/statprintf.cpp
2023-09-15 08:30:58 +03:00

84 lines
1.9 KiB
C++

#include "statprintf.h"
#include <string.h>
#include <stdarg.h>
CStatPrintf::CStatPrintf(char *name,int lstr,char *mode)
//name -file name
//lstr - string length for sprintf,used only for compressed file
// mode -file mode,"wb0"- not compress out file
{
valid=TRUE;
ff=NULL;
lenstr=lstr;
pstr=new char[lstr];
if (pstr==NULL) throw("Out of memory\n");
if (strcmp(mode,"wb0")!=0) {// compress file
char *pname=new char[strlen(name)+4];
if (pname==NULL) throw("Out of memory\n");
strcpy(pname,name);
strcat(pname,".gz");
ffgz=gzopen(pname,mode);
if (ffgz==NULL) {
valid=FALSE;
sprintf(texterr,"Can't open file %s\n",name);
return;
}
} else {
ff=fopen(name,"w");
if (ff==NULL) {
valid=FALSE;
sprintf(texterr,"Can't open file %s\n",name);
return;
}
}
return;
}
//-------------------------------------------------
//return result of constructor execution
BOOL CStatPrintf::Valid()
{
return(valid);
}
//-------------------------------------------
// error message
void CStatPrintf::TextErr(char *p)
{
strcpy(p,texterr);
}
//------------------------------------------------
// change length of string, if it > lenstr
void CStatPrintf::ChangeLenStr(int lstr)
{
if (lstr<=lenstr) return;
char * ppstr=new char[lstr];
if (ppstr==NULL) throw("Out of memory\n");
delete []pstr;
pstr=ppstr;
lenstr=lstr;
return;
}
//---------------------------------------------------------
int CStatPrintf::StatPrintf(const char *format,...)
{
va_list arglist;
va_start(arglist,format);
if (ff==NULL) { // compress file
int len=vsprintf(pstr,format,arglist);
if (len<=0) return 1;
int ans=gzwrite(ffgz,pstr,unsigned(len));
if (ans!=len) return 1;
} else {
vfprintf(ff,format,arglist);
}
va_end(arglist);
return 0;
}
//----------------------------------------------------------
CStatPrintf::~CStatPrintf()
{
if (ff==NULL) {
delete []pstr;
gzclose(ffgz);
} else fclose (ff);
return;
}