parser.cc 2.36 KB
Newer Older
Robert Ricci's avatar
Robert Ricci committed
1
/*
2
 * Copyright (c) 2002-2006 University of Utah and the Flux Group.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * 
 * {{{EMULAB-LICENSE
 * 
 * This file is part of the Emulab network testbed software.
 * 
 * This file is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or (at
 * your option) any later version.
 * 
 * This file is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
 * License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this file.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * }}}
Robert Ricci's avatar
Robert Ricci committed
22 23
 */

24 25
static const char rcsid[] = "$Id: parser.cc,v 1.9 2009-05-20 18:06:08 tarunp Exp $";

26 27
#include "parser.h"

28
#include <iostream>
29 30
#include <string>
using namespace std;
31

32 33 34 35 36
#ifdef DEBUG_PARSER
#define DEBUG(x) x
#else
#define DEBUG(x)
#endif
37

38
string_vector split_line(string line,char split_char)
39 40
{
  string_vector parsed;
41 42 43
  
  size_t prev_space, next_space;
  prev_space = 0;
44

45 46
  DEBUG(cerr << "Parsing line " << line << endl;)

47
  while ((next_space = line.find(' ',prev_space)) != string::npos) {
48
    if (next_space != prev_space) { // Skip multiple spaces
49 50 51
      parsed.push_back(line.substr(prev_space,(next_space - prev_space)).c_str());
      DEBUG(cerr << "Pushing string: " <<
              line.substr(prev_space,(next_space - prev_space)) << endl;)
52
    }
53 54
    prev_space = ++next_space;
  }
55 56 57 58 59
  if ((prev_space != next_space) && (prev_space < line.size()) &&
      (line[prev_space] != '\0')) {
    parsed.push_back(line.substr(prev_space,(next_space - prev_space)).c_str());
    DEBUG(cerr << "Pushing string: " <<
            line.substr(prev_space,(next_space - prev_space)) << endl;)
60
  }
61 62 63 64
  
  return parsed;
}

65
int split_two(string line,char split_char,string &a,string &b,string default_b)
66
{
67 68
  size_t space = line.find(split_char);
  if (space != string::npos) {
69 70 71
    a = line.substr(0, space).c_str();
    ++space;
    b = line.substr(space, line.length() - space).c_str();
72 73
    return 0;
  } else {
74
    a = line.c_str();
75 76 77 78 79
    b = default_b;
    return 1;
  }
}

80
int split_two(string line,char split_char,string &a,string &b)
81 82 83
{
  return split_two(line,split_char,a,b,"");
}