CMS 3D CMS Logo

Classes | Functions
SimpleSAXParser.h File Reference
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>

Go to the source code of this file.

Classes

struct  SimpleSAXParser::Attribute
 
class  SimpleSAXParser::ParserError
 
class  SimpleSAXParser
 

Functions

bool fgettoken (std::istream &in, char **buffer, size_t *maxSize, const char *separators, int *firstChar)
 

Function Documentation

◆ fgettoken()

bool fgettoken ( std::istream &  in,
char **  buffer,
size_t *  maxSize,
const char *  separators,
int *  firstChar 
)

Helper function which gets a token delimited by separator from the file and write it, 0 terminated in the buffer found in buffer.

Notice that if the token is larger than maxSize, the buffer is reallocated and maxSize is updated to the new size.

The trailing separator after a token is not put in the token and is left in the buffer. If nextChar is not 0, the delimiter is put there.

in the input stream to be parsed.

buffer a pointer to the buffer where to put the tokens. The buffer will be redimensioned accordingly, if the token is larger of the buffer.

maxSize, a pointer to the size of the buffer. Notice that in case the buffer is reallocated to have more space, maxSize is updated with the new size.

firstChar a pointer with the first character in the buffer, notice that the first charater in the stream must be obtained separately!!!

Returns
whether or not we were able to get a (possibly empty) token from the file.

Definition at line 224 of file SimpleSAXParser.cc.

References edmScanValgrind::buffer, c, mps_fire::i, recoMuon::in, and reco_skim_cfg_mod::maxSize.

Referenced by SimpleSAXParser::getToken().

224  {
225  // if the passed first character is EOF or a separator,
226  // return an empty otherwise use it as first character
227  // of the buffer.
228  if (*firstChar == EOF || (int)separators[0] == *firstChar || strchr(separators + 1, *firstChar)) {
229  (*buffer)[0] = 0;
230  return true;
231  } else
232  (*buffer)[0] = (char)*firstChar;
233 
234  size_t i = 1;
235 
236  while (true) {
237  if (i >= *maxSize) {
238  *maxSize += 1024;
239  *buffer = (char *)realloc(*buffer, *maxSize);
240  if (!*buffer)
241  return false;
242  }
243 
244  int c = in.get();
245 
246  if (c == EOF) {
247  (*buffer)[i] = 0;
248  *firstChar = c;
249  return false;
250  }
251 
252  if (separators[0] == c || strchr(separators + 1, c)) {
253  (*buffer)[i] = 0;
254  *firstChar = c;
255  return true;
256  }
257 
258  (*buffer)[i++] = (char)c;
259  }
260 }