Vocoder: Separate order from amount of bands -> Isolation, remove unneccessary contro...
[calf.git] / src / utils.cpp
blob24d6733c4f4469a5fca3bd6979e68a74c2f6c92d
1 /* Calf DSP Library
2 * Various utility functions.
3 * Copyright (C) 2007 Krzysztof Foltman
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this program; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301 USA
20 #include <config.h>
21 #include <calf/osctl.h>
22 #include <calf/utils.h>
23 #include <stdio.h>
24 #include <sstream>
26 using namespace std;
27 using namespace osctl;
29 namespace calf_utils {
31 string encode_map(const dictionary &data)
33 osctl::string_buffer sb;
34 osc_stream<osctl::string_buffer> str(sb);
35 str << (uint32_t)data.size();
36 for(dictionary::const_iterator i = data.begin(); i != data.end(); i++)
38 str << i->first << i->second;
40 return sb.data;
43 void decode_map(dictionary &data, const string &src)
45 osctl::string_buffer sb(src);
46 osc_stream<osctl::string_buffer> str(sb);
47 uint32_t count = 0;
48 str >> count;
49 string tmp, tmp2;
50 data.clear();
51 for (uint32_t i = 0; i < count; i++)
53 str >> tmp;
54 str >> tmp2;
55 data[tmp] = tmp2;
59 std::string xml_escape(const std::string &src)
61 string dest;
62 for (size_t i = 0; i < src.length(); i++) {
63 // XXXKF take care of string encoding
64 if (src[i] < 0 || src[i] == '"' || src[i] == '<' || src[i] == '>' || src[i] == '&')
65 dest += "&"+i2s((uint8_t)src[i])+";";
66 else
67 dest += src[i];
69 return dest;
72 std::string to_xml_attr(const std::string &key, const std::string &value)
74 return " " + key + "=\"" + xml_escape(value) + "\"";
77 std::string load_file(const std::string &src)
79 std::string str;
80 FILE *f = fopen(src.c_str(), "rb");
81 if (!f)
82 throw file_exception(src);
83 while(!feof(f))
85 char buffer[1024];
86 int len = fread(buffer, 1, sizeof(buffer), f);
87 if (len < 0)
88 throw file_exception(src);
89 str += string(buffer, len);
91 return str;
94 std::string i2s(int value)
96 char buf[32];
97 snprintf(buf, sizeof(buf), "%d", value);
99 return std::string(buf);
102 std::string f2s(double value)
104 stringstream ss;
105 ss << value;
106 return ss.str();
109 std::string ff2s(double value)
111 string s = f2s(value);
112 if (s.find('.') == string::npos)
113 s += ".0";
114 return s;
117 std::string indent(const std::string &src, const std::string &indent)
119 std::string dest;
120 size_t pos = 0;
121 do {
122 size_t epos = src.find("\n", pos);
123 if (epos == string::npos)
124 break;
125 dest += indent + src.substr(pos, epos - pos) + "\n";
126 pos = epos + 1;
127 } while(pos < src.length());
128 if (pos < src.length())
129 dest += indent + src.substr(pos);
130 return dest;
133 //////////////////////////////////////////////////////////////////////////////////
135 file_exception::file_exception(const std::string &f)
136 : message(strerror(errno))
137 , filename(f)
138 , container(filename + ":" + message)
140 text = container.c_str();
143 file_exception::file_exception(const std::string &f, const std::string &t)
144 : message(t)
145 , filename(f)
146 , container(filename + ":" + message)
148 text = container.c_str();