blob: 9a5935f6e6edd60f6cf363ab72e6e65eb2e6018f (
plain)
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
102
103
104
105
106
107
108
109
110
111
|
// *********************(c)*2004*********************>
// -holzilib--holzilib--holzilib--holzilib--holzilib->
// ++++PD-External++by+Georg+Holzmann++grh@gmx.at++++>
//
// PDContainer:
// this is a port of the containers from the C++ STL
// (Standard Template Library)
// for usage see the documentation and PD help files
// for license see readme.txt
//
// HList.cpp
#include "include/HList.h"
//----------------------------------------------------
/* reads from an input file and adds the data to
* the current namespace
* Fileformat: see saveToFile
* returns true on success
*/
bool HList::readFromFile(string filename)
{
makeIterator();
ifstream infile;
infile.open(filename.c_str());
if(!infile)
return false;
Element key;
string line;
bool go_on = false;
char type;
string symbol;
t_float number;
int key_count;
while (getline(infile, line))
{
// first parse the instream, to get the number of atoms
// (= size of the list)
istringstream instream(line);
ostringstream key_str("");
go_on = false; key_count = 0;
while(!go_on)
{
instream >> type;
if (instream.eof())
{
go_on = true;
break;
}
if (type == 's')
{
key_count++;
instream >> symbol;
key_str << "s " << symbol;
}
if (type == 'f')
{
key_count++;
instream >> number;
key_str << "f " << number;
}
if (instream.eof())
go_on = true;
key_str << " ";
}
// now objects, parse again the data
// into the objects and add them to the container
t_atom *key_atom = (t_atom*)getbytes(key_count*sizeof(t_atom));
if(key_atom == NULL)
post("Fatal Error Out Of Memory (%s-readFromFile)",dataname_.c_str());
istringstream key_istr(key_str.str());
for(int i = 0; i < key_count; i++)
{
key_istr >> type;
if (type == 's')
{
key_istr >> symbol;
SETSYMBOL(&key_atom[i],gensym(const_cast<char*>(symbol.c_str())));
}
if (type == 'f')
{
key_istr >> number;
SETFLOAT(&key_atom[i],number);
}
}
key.setAtoms(key_count,key_atom);
// insert the data
data_[h_namespace_].insert(iter_,key);
freebytes(key_atom, key_count*sizeof(t_atom));
}
infile.close();
return true;
}
|