summaryrefslogtreecommitdiff
path: root/tools/generator_utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/generator_utils.cpp')
-rw-r--r--tools/generator_utils.cpp270
1 files changed, 137 insertions, 133 deletions
diff --git a/tools/generator_utils.cpp b/tools/generator_utils.cpp
index 0e9ed24..2ccf313 100644
--- a/tools/generator_utils.cpp
+++ b/tools/generator_utils.cpp
@@ -42,136 +42,140 @@ const char *dbus_includes = "\n\
#include <cassert>\n\
";
-void underscorize(string &str)
-{
- for (unsigned int i = 0; i < str.length(); ++i)
- {
- if (!isalpha(str[i]) && !isdigit(str[i])) str[i] = '_';
- }
-}
-
-string stub_name(string name)
-{
- underscorize(name);
-
- return "_" + name + "_stub";
-}
-
-const char *atomic_type_to_string(char t)
-{
- static struct { char type; const char *name; } atos[] =
- {
- { 'y', "uint8_t" },
- { 'b', "bool" },
- { 'n', "int16_t" },
- { 'q', "uint16_t" },
- { 'i', "int32_t" },
- { 'u', "uint32_t" },
- { 'x', "int64_t" },
- { 't', "uint64_t" },
- { 'd', "double" },
- { 's', "std::string" },
- { 'o', "::DBus::Path" },
- { 'g', "::DBus::Signature" },
- { 'v', "::DBus::Variant" },
- { '\0', "" }
- };
- int i;
-
- for (i = 0; atos[i].type; ++i)
- {
- if (atos[i].type == t) break;
- }
- return atos[i].name;
-}
-
-static void _parse_signature(const string &signature, string &type, unsigned int &i, bool only_once = false)
-{
- /*cout << "signature: " << signature << endl;
- cout << "type: " << type << endl;
- cout << "i: " << i << ", signature[i]: " << signature[i] << endl;*/
-
- for (; i < signature.length(); ++i)
- {
- switch (signature[i])
- {
- case 'a':
- {
- switch (signature[++i])
- {
- case '{':
- {
- type += "std::map< ";
- ++i;
- _parse_signature(signature, type, i);
- type += " >";
-
- break;
- }
- case '(':
- {
- type += "std::vector< ::DBus::Struct< ";
- ++i;
- _parse_signature(signature, type, i);
- type += " > >";
-
- break;
- }
- default:
- {
- type += "std::vector< ";
- _parse_signature(signature, type, i, true);
-
- type += " >";
-
- break;
- }
- }
- break;
- }
- case '(':
- {
- type += "::DBus::Struct< ";
- ++i;
-
- _parse_signature(signature, type, i);
-
- type += " >";
- break;
- }
- case ')':
- case '}':
- {
- return;
- }
- default:
- {
- const char *atom = atomic_type_to_string(signature[i]);
- if (!atom)
- {
- cerr << "invalid signature" << endl;
- exit(-1);
- }
- type += atom;
-
- break;
- }
- }
-
- if (only_once)
- return;
-
- if (i+1 < signature.length() && signature[i+1] != ')' && signature[i+1] != '}')
- {
- type += ", ";
- }
- }
-}
-
-string signature_to_type(const string &signature)
-{
- string type;
- unsigned int i = 0;
- _parse_signature(signature, type, i);
- return type;
-}
+ void underscorize(string &str)
+ {
+ for (unsigned int i = 0; i < str.length(); ++i)
+ {
+ if (!isalpha(str[i]) && !isdigit(str[i])) str[i] = '_';
+ }
+ }
+
+ string stub_name(string name)
+ {
+ underscorize(name);
+
+ return "_" + name + "_stub";
+ }
+
+ const char *atomic_type_to_string(char t)
+ {
+ static struct
+ {
+ char type;
+ const char *name;
+ } atos[] =
+ {
+ { 'y', "uint8_t" },
+ { 'b', "bool" },
+ { 'n', "int16_t" },
+ { 'q', "uint16_t" },
+ { 'i', "int32_t" },
+ { 'u', "uint32_t" },
+ { 'x', "int64_t" },
+ { 't', "uint64_t" },
+ { 'd', "double" },
+ { 's', "std::string" },
+ { 'o', "::DBus::Path" },
+ { 'g', "::DBus::Signature" },
+ { 'v', "::DBus::Variant" },
+ { '\0', "" }
+ };
+ int i;
+
+ for (i = 0; atos[i].type; ++i)
+ {
+ if (atos[i].type == t) break;
+ }
+ return atos[i].name;
+ }
+
+ static void _parse_signature(const string &signature, string &type, unsigned int &i, bool only_once = false)
+ {
+ /*cout << "signature: " << signature << endl;
+ cout << "type: " << type << endl;
+ cout << "i: " << i << ", signature[i]: " << signature[i] << endl;*/
+
+ for (; i < signature.length(); ++i)
+ {
+ switch (signature[i])
+ {
+ case 'a':
+ {
+ switch (signature[++i])
+ {
+ case '{':
+ {
+ type += "std::map< ";
+ ++i;
+ _parse_signature(signature, type, i);
+ type += " >";
+
+ break;
+ }
+ case '(':
+ {
+ type += "std::vector< ::DBus::Struct< ";
+ ++i;
+ _parse_signature(signature, type, i);
+ type += " > >";
+
+ break;
+ }
+ default:
+ {
+ type += "std::vector< ";
+ _parse_signature(signature, type, i, true);
+
+ type += " >";
+
+ break;
+ }
+ }
+ break;
+ }
+ case '(':
+ {
+ type += "::DBus::Struct< ";
+ ++i;
+
+ _parse_signature(signature, type, i);
+
+ type += " >";
+ break;
+ }
+ case ')':
+ case '}':
+ {
+ return;
+ }
+ default:
+ {
+ const char *atom = atomic_type_to_string(signature[i]);
+ if (!atom)
+ {
+ cerr << "invalid signature" << endl;
+ exit(-1);
+ }
+ type += atom;
+
+ break;
+ }
+ }
+
+ if (only_once)
+ return;
+
+ if (i + 1 < signature.length() && signature[i + 1] != ')' && signature[i + 1] != '}')
+ {
+ type += ", ";
+ }
+ }
+ }
+
+ string signature_to_type(const string &signature)
+ {
+ string type;
+ unsigned int i = 0;
+ _parse_signature(signature, type, i);
+ return type;
+ }