/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#include "base/polygraph.h"
#include "xstd/h/sstream.h"
#include "xml/XmlTag.h"
#include "xml/XmlAttr.h"
#include "loganalyzers/SectionState.h"
SectionState::SectionState(): theLevels(4) {
theLevels.append(0);
}
void SectionState::reset() {
theLevels.reset();
theLevels.append(0);
}
int SectionState::level() const {
return theLevels.count();
}
// suggests section "number"
// no support for "level" attribute yet
String SectionState::begSection(const XmlTag &s, String &trueNum) {
theLevels.last()++;
const String numStr = curNum(s, trueNum);
theLevels.append(0);
return numStr;
}
void SectionState::endSection() {
if (theLevels.count() > 1) // be robust
theLevels.pop();
}
String SectionState::curNum(const XmlTag &s, String &trueNum) const {
ostringstream buf;
for (int i = 0; i < theLevels.count(); ++i) {
if (i)
buf << '.';
buf << theLevels[i];
}
if (theLevels.count() == 1)
buf << '.';
buf << ends;
trueNum = buf.str().c_str();
streamFreeze(buf, false);
if (const XmlAttr *a = s.attrs()->has("number"))
return a->value();
else
return trueNum;
}
syntax highlighted by Code2HTML, v. 0.9.1