ROOT logo
//*-- AUTHOR : Ilse Koenig
//*-- Created : 20/11/2002 by I.Koenig

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////////////
// HCondParAsciiFileIo
//
// Interface class to ASCII file for input/output of parameters derived
// from HParCond
//
//////////////////////////////////////////////////////////////////////////////

#include "hcondparasciifileio.h"
#include "hparcond.h"
#include "hparamlist.h"
#include "TClass.h"

ClassImp(HCondParAsciiFileIo)

HCondParAsciiFileIo::HCondParAsciiFileIo(fstream* f) : HDetParAsciiFileIo(f) {
  // constructor
  // sets the name of the I/O class "HCondParIo"
  // gets the pointer to the ASCII file
  fName="HCondParIo";
}

Bool_t HCondParAsciiFileIo::init(HParSet* pPar,Int_t* set) {
  // readCond(HParCond*)
  if (!pFile) return kFALSE; 
  if (pPar->InheritsFrom("HParCond"))
    return readCond((HParCond*)pPar);
  Error("HCondParAsciiFileIo::init(HParSet*,Int_t*)",
        "%s does not inherit from HParCond",pPar->GetName());
  return kFALSE;
}

Int_t HCondParAsciiFileIo::write(HParSet* pPar) {
  // calls writeCond(HParCond*)
  if (!pFile) return -1; 
  if (pPar->InheritsFrom("HParCond"))
    return writeCond((HParCond*)pPar);
  Error("HCondParAsciiFileIo::write(HParSet*)",
        "%s does not inherit from HParCond",pPar->GetName());
  return -1;
}

Bool_t HCondParAsciiFileIo::readCond(HParCond* pPar) {
  // reads condition-stype parameter containers from ASCII file
  if (!pFile) return kFALSE;
  pFile->clear();
  pFile->seekg(0,ios::beg);
  Text_t* name=(Char_t*)pPar->GetName();
  if (!findContainer(name)) return kFALSE;
  HParamList* paramList = new HParamList;
  const Int_t maxbuf=8000;
  Text_t buf[maxbuf];
  buf[0]='\0';
  TString s, pName, pVal, pType;
  Ssiz_t n, m;
  while (buf[0]!='#' && !pFile->eof()) {             
    pFile->getline(buf,maxbuf);
    if (buf[0]!='/' && buf[0]!='#') {
      s=buf;
      n=s.First(':');
      if (n==-1) {
        Error("readCond(HParCond*)",
              "%s:\n  Missing backslash for parameter %s",name,pName.Data());
        delete paramList;
        return  kFALSE;
      } 
      pName=s(0,n);
      s=s(n+1,s.Length()-n-1);
      s=s.Strip(s.kLeading);
      if (pName.CompareTo("author")==0 || pName.CompareTo("description")==0) {
        m=s.Last('\\');
        if (m<=0) {
          pVal=s;
        } else {
          pVal=s(0,m);
          pVal+="\n";
          while (m>0) {
            pFile->getline(buf,maxbuf);
            if (buf[0]!='/') {
              s=buf;
              m=s.Last('\\');
              if (m>0) {
                pVal+=s(0,m);
                pVal+="\n";
              } else {
                pVal+=s;
              }
            }
          }
	}
        if (pName.CompareTo("author")==0) {
          pPar->setAuthor(pVal.Data());
        } else if (pName.CompareTo("description")==0) {
          pPar->setDescription(pVal.Data());
        }
      } else {
        n=s.First(' ');
        pType=s(0,n);
        s=s(n+1,s.Length()-n-1);
        s=s.Strip(s.kLeading);
    	if (pType.CompareTo("Text_t")==0) {
          m=s.Last('\\');
          if (m<0) {
            pVal=s;
          } else {
            pVal="";
            while (m>=0) {
              pFile->getline(buf,maxbuf);
              if (buf[0]!='/') {
                s=buf;
                m=s.Last('\\');
                if (m>0) {
                  pVal+=s(0,m);
                  pVal+="\n";
                } else {
                  pVal+=s;
                }
              }
            }
          }
          pVal=pVal.Strip(pVal.kLeading);
          if (pVal.Length()>0) {
            paramList->add(pName.Data(),pVal.Data());
          }
        } else {
          UChar_t* val=0;
          Int_t length=0;
          if (pType.CompareTo("Int_t")==0) {
            Int_t v=0;
            val=readData(v,"%i",s,length);
          } else if (pType.CompareTo("UInt_t")==0) {
            UInt_t v=0;
            val=readData(v,"0x%x",s,length);
          } else if  (pType.CompareTo("Float_t")==0){
            Float_t v=0.F;
            val=readData(v,"%f",s,length);
          } else if (pType.CompareTo("Double_t")==0) {
            Double_t v=0.;
            val=readData(v,"%lf",s,length);
          } else if (pType.CompareTo("Char_t")==0) {
            Char_t v='0';
            val=readData(v,"%c",s,length);
          } else {
            Error("readCond(HParCond*)",
              "%s:\n  Parameter %s with unsupported type %s",
              name,pName.Data(),pType.Data());
            delete paramList;
            return kFALSE;
          }
          HParamObj* obj=new HParamObj(pName.Data());
          obj->setParamType(pType.Data());
          UChar_t* pValue=obj->setLength(length);
          memcpy(pValue,val,length);
          paramList->getList()->Add(obj);          
          if (val) delete [] val;
	}
      }
    }
  }
  Bool_t allFound=pPar->getParams(paramList);
  if (allFound) { 
    pPar->setInputVersion(1,inputNumber);
    pPar->setChanged();
    printf("%s initialized from Ascii file\n",name);
  } else pPar->setInputVersion(-1,inputNumber);
  delete paramList;
  return allFound;
}

template <class type> UChar_t* HCondParAsciiFileIo::readData(
              type t,const Char_t* format,TString& line, Int_t& length) {
  // reads c-type single data and arrays
  const Int_t st=sizeof(t);
  const Int_t maxbuf=8000;
  const Int_t bufSizeExt=10000*st;
  const Char_t d[]=" ";
  Text_t buf[maxbuf];
  TString s;
  Int_t l=0, bufSize=bufSizeExt;
  UChar_t* val=new UChar_t[bufSize];
  Ssiz_t m=line.Last('\\');
  if (m<0) {
    sscanf(line.Data(),format,&t);
    memcpy(&val[l],&t,st);
    length=st;
  } else {
    do {             
      pFile->getline(buf,maxbuf);
      if (buf[0]!='/' && buf[0]!='#') {
        TString s=buf;
        m=s.Last('\\');
        if (m>0) s=s(0,s.Length()-2);
        if ((bufSize-1000)<l) {
          bufSize+=bufSizeExt;
          UChar_t* va=new UChar_t[bufSize];
          memcpy(va,val,l);
          delete [] val;
          val=va;
        }
        Char_t* ss=strtok((Char_t*)s.Data(),d);
        while (ss!=0) {
          sscanf(ss,format,&t);
          memcpy(&val[l],&t,st);
          l+=st;
          ss=strtok(NULL,d);
        }
      }
    } while (buf[0]!='#' && !pFile->eof() && m>0);
    length=l;
  }
  return val;
}

Int_t HCondParAsciiFileIo::writeCond(HParCond* pPar) {
  // writes condition-stype parameter containers to ASCII file
  if (pFile) {
    const Text_t* name=pPar->GetName();
    const Text_t* context=pPar->getParamContext();
    *pFile<<sepLine;
    *pFile<<"# Class:   "<<pPar->IsA()->GetName()<<"\n# Context: "<<context<<"\n";
    *pFile<<sepLine;
    *pFile<<"["<<name<<"]\n";
    writeComment(pPar);
    *pFile<<"//-----------------------------------------------------------"
            "-----------------\n";
    HParamList* paramList = new HParamList;
    pPar->putParams(paramList);
    TList* pList=paramList->getList();
    TIter next(pList);
    HParamObj* po;
    while ((po=(HParamObj*)next())) {
      const Char_t* pType=po->getParamType();
      UChar_t* pValue=po->getParamValue();
      if (po->isBasicType()&&strcmp(pType,"UChar_t")!=0) {
        if (strcmp(pType,"Text_t")==0) {
          TString val((Char_t*)pValue,po->getLength());
          val.ReplaceAll("\n"," \\\n");
          *pFile<<po->GetName()<<":  "<<pType<<" \\\n  "<<val.Data()<<endl;
        } else {
          Int_t nParams=po->getNumParams();
          if (nParams==1) {
            *pFile<<po->GetName()<<":  "<<pType<<"  ";
          } else {
            *pFile<<po->GetName()<<":  "<<pType<<" \\\n  ";
          }
          if (strcmp(pType,"Char_t")==0) {
            writeData((Char_t*)pValue,nParams);
          } else if (strcmp(pType,"Int_t")==0) {
            writeData((Int_t*)pValue,nParams);
          } else if (strcmp(pType,"UInt_t")==0) {
            writeHexData((UInt_t*)pValue,nParams);
          } else if (strcmp(pType,"Float_t")==0) {
            writeData((Float_t*)pValue,nParams);
          } else if (strcmp(pType,"Double_t")==0) {
            writeData((Double_t*)pValue,nParams);
          }
        }
      } else {
        Error("writeCond(HParCond*)",
              "Type %s of parameter %s not supported by ASCII I/O",
              pType,po->GetName());
      }
    }
    *pFile<<sepLine;
    delete paramList;
    pPar->setChanged(kFALSE);
    return 1;
  }
  Error("writeCond(HParCond*)",
              "Output is not writable");
  return -1;
}  

template <class type> void HCondParAsciiFileIo::writeData(type* val, Int_t nParams) {
  // writes c-type arrays
  Int_t i=0, k=0;
  while (k<nParams) {
    if (i==10) {
      *pFile<<" \\\n  "; 
      i=0;
    }
    *pFile<<val[k]<<" ";
    i++;
    k++;
  }
  *pFile<<endl;
}

void HCondParAsciiFileIo::writeHexData(UInt_t* val, Int_t nParams) {
  // writes UInt_t data in HEX format with leading zeros, for example 0x0000ffff
  Text_t buf[11];
  Int_t i=0, k=0;
  while (k<nParams) {
    if (i==10) {
      *pFile<<" \\\n  "; 
      i=0;
    }
    sprintf(buf,"0x%08x",val[k]);
    *pFile<<buf<<" ";
    i++;
    k++;
  }
  *pFile<<endl;
}
 hcondparasciifileio.cc:1
 hcondparasciifileio.cc:2
 hcondparasciifileio.cc:3
 hcondparasciifileio.cc:4
 hcondparasciifileio.cc:5
 hcondparasciifileio.cc:6
 hcondparasciifileio.cc:7
 hcondparasciifileio.cc:8
 hcondparasciifileio.cc:9
 hcondparasciifileio.cc:10
 hcondparasciifileio.cc:11
 hcondparasciifileio.cc:12
 hcondparasciifileio.cc:13
 hcondparasciifileio.cc:14
 hcondparasciifileio.cc:15
 hcondparasciifileio.cc:16
 hcondparasciifileio.cc:17
 hcondparasciifileio.cc:18
 hcondparasciifileio.cc:19
 hcondparasciifileio.cc:20
 hcondparasciifileio.cc:21
 hcondparasciifileio.cc:22
 hcondparasciifileio.cc:23
 hcondparasciifileio.cc:24
 hcondparasciifileio.cc:25
 hcondparasciifileio.cc:26
 hcondparasciifileio.cc:27
 hcondparasciifileio.cc:28
 hcondparasciifileio.cc:29
 hcondparasciifileio.cc:30
 hcondparasciifileio.cc:31
 hcondparasciifileio.cc:32
 hcondparasciifileio.cc:33
 hcondparasciifileio.cc:34
 hcondparasciifileio.cc:35
 hcondparasciifileio.cc:36
 hcondparasciifileio.cc:37
 hcondparasciifileio.cc:38
 hcondparasciifileio.cc:39
 hcondparasciifileio.cc:40
 hcondparasciifileio.cc:41
 hcondparasciifileio.cc:42
 hcondparasciifileio.cc:43
 hcondparasciifileio.cc:44
 hcondparasciifileio.cc:45
 hcondparasciifileio.cc:46
 hcondparasciifileio.cc:47
 hcondparasciifileio.cc:48
 hcondparasciifileio.cc:49
 hcondparasciifileio.cc:50
 hcondparasciifileio.cc:51
 hcondparasciifileio.cc:52
 hcondparasciifileio.cc:53
 hcondparasciifileio.cc:54
 hcondparasciifileio.cc:55
 hcondparasciifileio.cc:56
 hcondparasciifileio.cc:57
 hcondparasciifileio.cc:58
 hcondparasciifileio.cc:59
 hcondparasciifileio.cc:60
 hcondparasciifileio.cc:61
 hcondparasciifileio.cc:62
 hcondparasciifileio.cc:63
 hcondparasciifileio.cc:64
 hcondparasciifileio.cc:65
 hcondparasciifileio.cc:66
 hcondparasciifileio.cc:67
 hcondparasciifileio.cc:68
 hcondparasciifileio.cc:69
 hcondparasciifileio.cc:70
 hcondparasciifileio.cc:71
 hcondparasciifileio.cc:72
 hcondparasciifileio.cc:73
 hcondparasciifileio.cc:74
 hcondparasciifileio.cc:75
 hcondparasciifileio.cc:76
 hcondparasciifileio.cc:77
 hcondparasciifileio.cc:78
 hcondparasciifileio.cc:79
 hcondparasciifileio.cc:80
 hcondparasciifileio.cc:81
 hcondparasciifileio.cc:82
 hcondparasciifileio.cc:83
 hcondparasciifileio.cc:84
 hcondparasciifileio.cc:85
 hcondparasciifileio.cc:86
 hcondparasciifileio.cc:87
 hcondparasciifileio.cc:88
 hcondparasciifileio.cc:89
 hcondparasciifileio.cc:90
 hcondparasciifileio.cc:91
 hcondparasciifileio.cc:92
 hcondparasciifileio.cc:93
 hcondparasciifileio.cc:94
 hcondparasciifileio.cc:95
 hcondparasciifileio.cc:96
 hcondparasciifileio.cc:97
 hcondparasciifileio.cc:98
 hcondparasciifileio.cc:99
 hcondparasciifileio.cc:100
 hcondparasciifileio.cc:101
 hcondparasciifileio.cc:102
 hcondparasciifileio.cc:103
 hcondparasciifileio.cc:104
 hcondparasciifileio.cc:105
 hcondparasciifileio.cc:106
 hcondparasciifileio.cc:107
 hcondparasciifileio.cc:108
 hcondparasciifileio.cc:109
 hcondparasciifileio.cc:110
 hcondparasciifileio.cc:111
 hcondparasciifileio.cc:112
 hcondparasciifileio.cc:113
 hcondparasciifileio.cc:114
 hcondparasciifileio.cc:115
 hcondparasciifileio.cc:116
 hcondparasciifileio.cc:117
 hcondparasciifileio.cc:118
 hcondparasciifileio.cc:119
 hcondparasciifileio.cc:120
 hcondparasciifileio.cc:121
 hcondparasciifileio.cc:122
 hcondparasciifileio.cc:123
 hcondparasciifileio.cc:124
 hcondparasciifileio.cc:125
 hcondparasciifileio.cc:126
 hcondparasciifileio.cc:127
 hcondparasciifileio.cc:128
 hcondparasciifileio.cc:129
 hcondparasciifileio.cc:130
 hcondparasciifileio.cc:131
 hcondparasciifileio.cc:132
 hcondparasciifileio.cc:133
 hcondparasciifileio.cc:134
 hcondparasciifileio.cc:135
 hcondparasciifileio.cc:136
 hcondparasciifileio.cc:137
 hcondparasciifileio.cc:138
 hcondparasciifileio.cc:139
 hcondparasciifileio.cc:140
 hcondparasciifileio.cc:141
 hcondparasciifileio.cc:142
 hcondparasciifileio.cc:143
 hcondparasciifileio.cc:144
 hcondparasciifileio.cc:145
 hcondparasciifileio.cc:146
 hcondparasciifileio.cc:147
 hcondparasciifileio.cc:148
 hcondparasciifileio.cc:149
 hcondparasciifileio.cc:150
 hcondparasciifileio.cc:151
 hcondparasciifileio.cc:152
 hcondparasciifileio.cc:153
 hcondparasciifileio.cc:154
 hcondparasciifileio.cc:155
 hcondparasciifileio.cc:156
 hcondparasciifileio.cc:157
 hcondparasciifileio.cc:158
 hcondparasciifileio.cc:159
 hcondparasciifileio.cc:160
 hcondparasciifileio.cc:161
 hcondparasciifileio.cc:162
 hcondparasciifileio.cc:163
 hcondparasciifileio.cc:164
 hcondparasciifileio.cc:165
 hcondparasciifileio.cc:166
 hcondparasciifileio.cc:167
 hcondparasciifileio.cc:168
 hcondparasciifileio.cc:169
 hcondparasciifileio.cc:170
 hcondparasciifileio.cc:171
 hcondparasciifileio.cc:172
 hcondparasciifileio.cc:173
 hcondparasciifileio.cc:174
 hcondparasciifileio.cc:175
 hcondparasciifileio.cc:176
 hcondparasciifileio.cc:177
 hcondparasciifileio.cc:178
 hcondparasciifileio.cc:179
 hcondparasciifileio.cc:180
 hcondparasciifileio.cc:181
 hcondparasciifileio.cc:182
 hcondparasciifileio.cc:183
 hcondparasciifileio.cc:184
 hcondparasciifileio.cc:185
 hcondparasciifileio.cc:186
 hcondparasciifileio.cc:187
 hcondparasciifileio.cc:188
 hcondparasciifileio.cc:189
 hcondparasciifileio.cc:190
 hcondparasciifileio.cc:191
 hcondparasciifileio.cc:192
 hcondparasciifileio.cc:193
 hcondparasciifileio.cc:194
 hcondparasciifileio.cc:195
 hcondparasciifileio.cc:196
 hcondparasciifileio.cc:197
 hcondparasciifileio.cc:198
 hcondparasciifileio.cc:199
 hcondparasciifileio.cc:200
 hcondparasciifileio.cc:201
 hcondparasciifileio.cc:202
 hcondparasciifileio.cc:203
 hcondparasciifileio.cc:204
 hcondparasciifileio.cc:205
 hcondparasciifileio.cc:206
 hcondparasciifileio.cc:207
 hcondparasciifileio.cc:208
 hcondparasciifileio.cc:209
 hcondparasciifileio.cc:210
 hcondparasciifileio.cc:211
 hcondparasciifileio.cc:212
 hcondparasciifileio.cc:213
 hcondparasciifileio.cc:214
 hcondparasciifileio.cc:215
 hcondparasciifileio.cc:216
 hcondparasciifileio.cc:217
 hcondparasciifileio.cc:218
 hcondparasciifileio.cc:219
 hcondparasciifileio.cc:220
 hcondparasciifileio.cc:221
 hcondparasciifileio.cc:222
 hcondparasciifileio.cc:223
 hcondparasciifileio.cc:224
 hcondparasciifileio.cc:225
 hcondparasciifileio.cc:226
 hcondparasciifileio.cc:227
 hcondparasciifileio.cc:228
 hcondparasciifileio.cc:229
 hcondparasciifileio.cc:230
 hcondparasciifileio.cc:231
 hcondparasciifileio.cc:232
 hcondparasciifileio.cc:233
 hcondparasciifileio.cc:234
 hcondparasciifileio.cc:235
 hcondparasciifileio.cc:236
 hcondparasciifileio.cc:237
 hcondparasciifileio.cc:238
 hcondparasciifileio.cc:239
 hcondparasciifileio.cc:240
 hcondparasciifileio.cc:241
 hcondparasciifileio.cc:242
 hcondparasciifileio.cc:243
 hcondparasciifileio.cc:244
 hcondparasciifileio.cc:245
 hcondparasciifileio.cc:246
 hcondparasciifileio.cc:247
 hcondparasciifileio.cc:248
 hcondparasciifileio.cc:249
 hcondparasciifileio.cc:250
 hcondparasciifileio.cc:251
 hcondparasciifileio.cc:252
 hcondparasciifileio.cc:253
 hcondparasciifileio.cc:254
 hcondparasciifileio.cc:255
 hcondparasciifileio.cc:256
 hcondparasciifileio.cc:257
 hcondparasciifileio.cc:258
 hcondparasciifileio.cc:259
 hcondparasciifileio.cc:260
 hcondparasciifileio.cc:261
 hcondparasciifileio.cc:262
 hcondparasciifileio.cc:263
 hcondparasciifileio.cc:264
 hcondparasciifileio.cc:265
 hcondparasciifileio.cc:266
 hcondparasciifileio.cc:267
 hcondparasciifileio.cc:268
 hcondparasciifileio.cc:269
 hcondparasciifileio.cc:270
 hcondparasciifileio.cc:271
 hcondparasciifileio.cc:272
 hcondparasciifileio.cc:273
 hcondparasciifileio.cc:274
 hcondparasciifileio.cc:275
 hcondparasciifileio.cc:276
 hcondparasciifileio.cc:277
 hcondparasciifileio.cc:278
 hcondparasciifileio.cc:279
 hcondparasciifileio.cc:280
 hcondparasciifileio.cc:281
 hcondparasciifileio.cc:282
 hcondparasciifileio.cc:283
 hcondparasciifileio.cc:284
 hcondparasciifileio.cc:285
 hcondparasciifileio.cc:286
 hcondparasciifileio.cc:287
 hcondparasciifileio.cc:288
 hcondparasciifileio.cc:289
 hcondparasciifileio.cc:290
 hcondparasciifileio.cc:291
 hcondparasciifileio.cc:292
 hcondparasciifileio.cc:293
 hcondparasciifileio.cc:294
 hcondparasciifileio.cc:295
 hcondparasciifileio.cc:296
 hcondparasciifileio.cc:297
 hcondparasciifileio.cc:298
 hcondparasciifileio.cc:299
 hcondparasciifileio.cc:300
 hcondparasciifileio.cc:301
 hcondparasciifileio.cc:302
 hcondparasciifileio.cc:303
 hcondparasciifileio.cc:304
 hcondparasciifileio.cc:305
 hcondparasciifileio.cc:306
 hcondparasciifileio.cc:307
 hcondparasciifileio.cc:308