https://github.com/root-project/root
Tip revision: 7924f76520e73237e735baf807bfa85bf349f805 authored by Fons Rademakers on 31 March 2010, 13:58:06 UTC
tag patch release v5-22-00i.
tag patch release v5-22-00i.
Tip revision: 7924f76
ReadF.C
/* -*- C++ -*- */
/*************************************************************************
* Copyright(c) 1995~2005 Masaharu Goto (cint@pcroot.cern.ch)
*
* For the licensing terms see the file COPYING
*
************************************************************************/
/*****************************************************************************
* ReadFile.C
*****************************************************************************/
#ifdef __CINT__
#pragma security level0
#endif
#include "ReadF.h"
/*****************************************************************************
* Constructors and destructors
*****************************************************************************/
ReadFile::ReadFile(const char *filename)
{
fp = fopen(filename,"r");
initialize();
if(fp) {
openflag=1;
}
else {
fprintf(stderr,"ReadFile: can not open %s\n",filename);
}
}
ReadFile::ReadFile(FILE *fpin)
{
fp = fpin;
openflag=0;
initialize();
if((FILE*)NULL==fpin) {
fprintf(stderr,"ReadFile: NULL pointer is given\n");
}
}
ReadFile::~ReadFile()
{
if(openflag && fp) fclose(fp);
fp = (FILE*)NULL;
}
/*****************************************************************************
* set routines
*****************************************************************************/
void ReadFile::initialize()
{
line = 0;
argc = 0;
setseparator(" \t\v");
setendofline("");
}
void ReadFile::setseparator(const char *separatorin)
{
strcpy(separator,separatorin);
lenseparator = strlen(separator);
}
#ifndef G__OLDIMPLEMENTATION1960
void ReadFile::setdelimitor(const char *delimitorin)
{
strcpy(delimitor,delimitorin);
lendelimitor = strlen(delimitor);
}
#endif
void ReadFile::setendofline(const char *endoflinein)
{
strcpy(endofline,endoflinein);
lenendofline = strlen(endofline);
}
/*****************************************************************************
* Reading one line
*****************************************************************************/
int ReadFile::read()
{
char *null_fgets;
if(!fp) return(0);
null_fgets=fgets(buf,MAX_LINE_LENGTH,fp);
if(null_fgets!=NULL) {
++line;
separatearg();
}
else {
buf[0]='\0';;
argbuf[0]='\0';
argc=0;
argv[0]=buf;
}
if(null_fgets==NULL) return(0);
else return(1);
}
/*****************************************************************************
* Reading one word
*****************************************************************************/
int ReadFile::readword()
{
int c;
int i=0;
int flag;
if(!fp) return(0);
flag = 1;
while(flag) {
c = fgetc(fp);
if(EOF==c) return(c);
if(isendofline(c)||isseparator(c)) {
flag=1;
}
else {
buf[i++]=c;
flag=0;
}
}
flag = 1;
while(flag) {
c = fgetc(fp);
if(isendofline(c)||isseparator(c)) {
buf[i]='\0';
flag=0;
}
else {
buf[i]=c;
}
++i;
}
argv[0]=buf;
argc=i;
return(c);
}
#ifdef G__NEVER
/*****************************************************************************
* Separate argument
*****************************************************************************/
int ReadFile::regex(char *pattern,char *string)
{
int i;
regex_t re;
if((char*)NULL==string) string = argv[0];
i=regcomp(&re,pattern,REG_EXTENDED|REG_NOSUB);
if(i!=0) return(0);
i=regexec(&re,string,(size_t)0,(regmatch_t*)NULL,0);
regfree(&re);
if(i!=0) return(0);
return(1); /* match */
}
#endif
/*****************************************************************************
* Separate argument
*****************************************************************************/
void ReadFile::separatearg(void)
{
char *p;
int i;
int c;
// change \n to \0
p=strchr(buf,'\n');
if(p) *p='\0';
// if user defined end of line
for(i=0;i<lenendofline;i++) {
p=strchr(buf,endofline[i]);
if(p) *p='\0';
}
argv[0] = buf;
strcpy(argbuf,buf);
// separate argument
argc = 0;
p = argbuf;
do {
while(isseparator((c = *p)) && c) ++p;
if(c) {
argv[++argc] = p;
#ifndef G__OLDIMPLEMENTATION1960
while(!isseparator((c = *p)) && !isdelimitor(c) && c) ++p;
#else
while(!isseparator((c = *p)) && c) ++p;
#endif
*p = '\0';
++p;
}
} while(c) ;
}
/*****************************************************************************
* isendofline()
*****************************************************************************/
int ReadFile::isendofline(int c)
{
int i;
if('\n'==c || EOF==c) return(1);
for(i=0;i<lenendofline;i++) {
if(c==endofline[i]) return(1);
}
return(0);
}
/*****************************************************************************
* isseparator()
*****************************************************************************/
int ReadFile::isseparator(int c)
{
int i;
for(i=0;i<lenseparator;i++) {
if(c==separator[i]) return(1);
}
return(0);
}
#ifndef G__OLDIMPLEMENTATION1960
/*****************************************************************************
* isdelimitor()
*****************************************************************************/
int ReadFile::isdelimitor(int c)
{
int i;
for(i=0;i<lendelimitor;i++) {
if(c==delimitor[i]) return(1);
}
return(0);
}
#endif
/*****************************************************************************
* disp()
*****************************************************************************/
void ReadFile::disp()
{
int i;
printf("%4d %3d ",line,argc);
for(i=1;i<=argc;i++) {
printf("| %s ",argv[i]);
}
printf("\n");
}