File: matrix_parser.cpp

package info (click to toggle)
dynare 4.4.3-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 41,356 kB
  • ctags: 15,842
  • sloc: cpp: 77,029; ansic: 29,056; pascal: 13,241; sh: 4,811; objc: 3,061; yacc: 3,013; makefile: 1,479; lex: 1,258; python: 162; lisp: 54; xml: 8
file content (101 lines) | stat: -rw-r--r-- 2,173 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright (C) 2006, Ondra Kamenik

// $Id: matrix_parser.cpp 2269 2008-11-23 14:33:22Z michel $

#include "parser_exception.h"
#include "matrix_parser.h"
#include "location.h"
#include "matrix_tab.hh"
#include <cstring>

using namespace ogp;

/** A global symbol for passing info to the MatrixParser from
 * matrix_parse(). */
MatrixParser* mparser;

/** The declaration of functions defined in matrix_ll.cc and
 * matrix_tab.cc generated from matrix.lex and matrix.y. */
void* matrix__scan_buffer(char*, size_t);
void matrix__destroy_buffer(void*);
int matrix_parse();
extern ogp::location_type matrix_lloc;

void MatrixParser::parse(int length, const char* stream)
{
	// reinitialize the object
	data.clear();
	row_lengths.clear();
	nc = 0;
	// allocate temporary buffer and parse
	char* buffer = new char[length+2];
	strncpy(buffer, stream, length);
	buffer[length] = '\0';
	buffer[length+1] = '\0';
	matrix_lloc.off = 0;
	matrix_lloc.ll = 0;
	void* p = matrix__scan_buffer(buffer, (unsigned int)length+2);
	mparser = this;
	matrix_parse();
	delete [] buffer;
	matrix__destroy_buffer(p);
}

void MatrixParser::add_item(double v)
{
	data.push_back(v);
	if (row_lengths.size() == 0)
		row_lengths.push_back(0);
	(row_lengths.back())++;
	if (row_lengths.back() > nc)
		nc = row_lengths.back();
}

void MatrixParser::start_row()
{
	row_lengths.push_back(0);
}

void MatrixParser::error(const char* mes) const
{
	throw ParserException(mes, matrix_lloc.off);
}

int MatrixParser::find_first_non_empty_row(int start) const
{
	int r = start;
	while (r < (int)row_lengths.size() && row_lengths[r] == 0)
		r++;
	return r;
}

MPIterator MatrixParser::begin() const
{
	MPIterator it(*this);
	return it;
}

MPIterator MatrixParser::end() const
{
	MPIterator it(*this, "end");
	return it;
}

MPIterator::MPIterator(const MatrixParser& mp)
	: p(&mp), i(0), c(0), r(mp.find_first_non_empty_row())
{}

MPIterator::MPIterator(const MatrixParser& mp, const char* dummy)
	: p(&mp), i(mp.data.size()), c(0), r(mp.row_lengths.size())
{}

MPIterator& MPIterator::operator++()
{
	i++;
	c++;
	if (p->row_lengths[r] <= c) {
		c = 0;
		r = p->find_first_non_empty_row(r+1);
	}
	return *this;
}