1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-29 05:24:57 +03:00
inform7/inter/bytecode-module/Chapter 3/Metadata.w
2021-06-27 14:56:29 +01:00

119 lines
4.7 KiB
OpenEdge ABL

[Metadata::] Metadata.
Looking up metadata in special constants.
@ =
int Metadata::valid_key(text_stream *key) {
if (Str::get_at(key, 0) == '^') return TRUE;
return FALSE;
}
int Metadata::exists(inter_package *pack, text_stream *key) {
inter_symbol *md = InterSymbolsTables::symbol_from_name(Inter::Packages::scope(pack), key);
if (md == NULL) return FALSE;
inter_tree_node *D = md->definition;
if (D == NULL) return FALSE;
return TRUE;
}
inter_symbol *Metadata::read_symbol(inter_package *pack, text_stream *key) {
inter_symbol *md = InterSymbolsTables::symbol_from_name(Inter::Packages::scope(pack), key);
if (md == NULL) {
LOG("unable to find metadata key %S in package $6\n", key, pack);
Metadata::err("not found", pack, key);
}
inter_tree_node *D = md->definition;
if (D == NULL) Metadata::err("not defined", pack, key);
if (D->W.data[FORMAT_CONST_IFLD] != CONSTANT_DIRECT) {
LOG("%d\n", D->W.data[FORMAT_CONST_IFLD]);
Metadata::err("not direct", pack, key);
}
if (D->W.data[DATA_CONST_IFLD] != ALIAS_IVAL) Metadata::err("not symbol", pack, key);
inter_symbol *s = InterSymbolsTables::symbol_from_id(Inter::Packages::scope(pack),
D->W.data[DATA_CONST_IFLD + 1]);
if (s == NULL) Metadata::err("no symbol", pack, key);
return s;
}
inter_symbol *Metadata::read_optional_symbol(inter_package *pack, text_stream *key) {
inter_symbol *md = InterSymbolsTables::symbol_from_name(Inter::Packages::scope(pack), key);
if (md == NULL) return NULL;
inter_tree_node *D = md->definition;
if (D == NULL) Metadata::err("not defined", pack, key);
if (D->W.data[FORMAT_CONST_IFLD] != CONSTANT_DIRECT) {
LOG("%d\n", D->W.data[FORMAT_CONST_IFLD]);
Metadata::err("not direct", pack, key);
}
if (D->W.data[DATA_CONST_IFLD] != ALIAS_IVAL) Metadata::err("not symbol", pack, key);
inter_symbol *s = InterSymbolsTables::symbol_from_id(Inter::Packages::scope(pack),
D->W.data[DATA_CONST_IFLD + 1]);
if (s == NULL) Metadata::err("no symbol", pack, key);
return s;
}
inter_tree_node *Metadata::read_optional_list(inter_package *pack, text_stream *key) {
inter_symbol *md = InterSymbolsTables::symbol_from_name(Inter::Packages::scope(pack), key);
if (md == NULL) return NULL;
inter_tree_node *D = md->definition;
if (D == NULL) Metadata::err("not defined", pack, key);
if (D->W.data[FORMAT_CONST_IFLD] != CONSTANT_INDIRECT_LIST) {
LOG("%d\n", D->W.data[FORMAT_CONST_IFLD]);
Metadata::err("not a list", pack, key);
}
return D;
}
inter_ti Metadata::read_numeric(inter_package *pack, text_stream *key) {
inter_symbol *md = InterSymbolsTables::symbol_from_name(Inter::Packages::scope(pack), key);
if (md == NULL) Metadata::err("not found", pack, key);
inter_tree_node *D = md->definition;
if (D == NULL) Metadata::err("not defined", pack, key);
if (D->W.data[FORMAT_CONST_IFLD] != CONSTANT_DIRECT) Metadata::err("not direct", pack, key);
if (D->W.data[DATA_CONST_IFLD] != LITERAL_IVAL) Metadata::err("not literal", pack, key);
return D->W.data[DATA_CONST_IFLD + 1];
}
inter_ti Metadata::read_optional_numeric(inter_package *pack, text_stream *key) {
inter_symbol *md = InterSymbolsTables::symbol_from_name(Inter::Packages::scope(pack), key);
if (md == NULL) return 0;
inter_tree_node *D = md->definition;
if (D == NULL) Metadata::err("not defined", pack, key);
if (D->W.data[FORMAT_CONST_IFLD] != CONSTANT_DIRECT) Metadata::err("not direct", pack, key);
if (D->W.data[DATA_CONST_IFLD] != LITERAL_IVAL) Metadata::err("not literal", pack, key);
return D->W.data[DATA_CONST_IFLD + 1];
}
text_stream *Metadata::read_textual(inter_package *pack, text_stream *key) {
inter_symbol *md = InterSymbolsTables::symbol_from_name(Inter::Packages::scope(pack), key);
if (md == NULL) Metadata::err("not found", pack, key);
inter_tree_node *D = md->definition;
if (D == NULL) Metadata::err("not defined", pack, key);
if (D->W.data[FORMAT_CONST_IFLD] != CONSTANT_INDIRECT_TEXT) {
LOG("%d\n", D->W.data[FORMAT_CONST_IFLD]);
Metadata::err("not text", pack, key);
}
return Inode::ID_to_text(D, D->W.data[DATA_CONST_IFLD]);
}
text_stream *Metadata::read_optional_textual(inter_package *pack, text_stream *key) {
inter_symbol *md = InterSymbolsTables::symbol_from_name(Inter::Packages::scope(pack), key);
if (md == NULL) return NULL;
inter_tree_node *D = md->definition;
if (D == NULL) Metadata::err("not defined", pack, key);
if (D->W.data[FORMAT_CONST_IFLD] != CONSTANT_INDIRECT_TEXT) {
LOG("%d\n", D->W.data[FORMAT_CONST_IFLD]);
Metadata::err("not text", pack, key);
}
return Inode::ID_to_text(D, D->W.data[DATA_CONST_IFLD]);
}
void Metadata::err(char *err, inter_package *pack, text_stream *key) {
LOG("Error on metadata %S in $6\n", key, pack);
WRITE_TO(STDERR, "Error on metadata %S in ", key);
Inter::Packages::write_url_name(STDERR, pack);
WRITE_TO(STDERR, "\n");
internal_error(err);
}