name = NULL;
else {
const char *quote = strchr(*encoding + 1, '"');
- if (quote == NULL) {
- printf("unterminated specific id type {%s}\n", *encoding - 10);
- _assert(false);
- } else if (!named || quote[1] == eos || quote[1] == '"') {
+ if (quote == NULL)
+ CYThrow("unterminated specific id type {%s}", *encoding - 10);
+ else if (!named || quote[1] == eos || quote[1] == '"') {
name = pool.strmemdup(*encoding + 1, quote - *encoding - 1);
*encoding = quote + 1;
} else {
case '[': {
size_t size(strtoul(*encoding, (char **) encoding, 10));
type = new(pool) Array(*Parse_(pool, encoding, eos, false, callback), size);
- if (**encoding != ']') {
- printf("']' != \"%s\"\n", *encoding);
- _assert(false);
- }
+ if (**encoding != ']')
+ CYThrow("']' != \"%s\"", *encoding);
++*encoding;
} break;
break;
case 'c': type = new(pool) Primitive<signed char>(); break;
+ case 'D': type = new(pool) Primitive<long double>(); break;
case 'd': type = new(pool) Primitive<double>(); break;
case 'f': type = new(pool) Primitive<float>(); break;
case 'i': type = new(pool) Primitive<signed int>(); break;
char end = next;
const char *begin = *encoding;
- do next = *(*encoding)++;
- while (
- next != '=' &&
- next != '}'
- );
+ do switch (next = *(*encoding)++) {
+ case '\0':
+ _assert(false);
+ case '}':
+ // XXX: this is actually a type reference
+ aggregate->signature.count = _not(size_t);
+ next = '='; // this is a "break". I'm sorry
+ } while (next != '=');
+
size_t length = *encoding - begin - 1;
if (strncmp(begin, "?", length) != 0)
aggregate->name = (char *) pool.strmemdup(begin, length);
- if (next == '=')
+ if (aggregate->signature.count == _not(size_t))
+ aggregate->signature.elements = NULL;
+ else
Parse_(pool, &aggregate->signature, encoding, end, callback);
// XXX: this is a hack to support trivial unions
break;
default:
- printf("invalid type character: '%c' {%s}\n", next, *encoding - 10);
- _assert(false);
+ CYThrow("invalid type character: '%c' {%s}", next, *encoding - 10);
}
type->flags = flags;
return "f";
}
+template <>
+const char *Primitive<long double>::Encode(CYPool &pool) const {
+ return "D";
+}
+
template <>
const char *Primitive<signed char>::Encode(CYPool &pool) const {
return "c";
}
const char *Aggregate::Encode(CYPool &pool) const {
- return pool.strcat(overlap ? "(" : "{", name == NULL ? "?" : name, "=", Unparse(pool, &signature), overlap ? ")" : "}", NULL);
+ bool reference(signature.count == _not(size_t));
+ return pool.strcat(overlap ? "(" : "{",
+ name == NULL ? "?" : name,
+ reference ? "" : "=",
+ reference ? "" : Unparse(pool, &signature),
+ overlap ? ")" : "}", NULL);
}
const char *Function::Encode(CYPool &pool) const {