1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/inter/inter-module/Chapter 2/Bookmarks.w

114 lines
3.4 KiB
OpenEdge ABL
Raw Normal View History

2019-02-05 02:44:07 +02:00
[Inter::Bookmarks::] Bookmarks.
Write positions for inter code being generated.
@ =
2019-07-14 12:44:07 +03:00
typedef struct inter_bookmark {
2019-02-05 02:44:07 +02:00
struct inter_package *current_package;
struct inter_frame *R;
int placement_wrt_R;
2019-07-14 12:44:07 +03:00
} inter_bookmark;
2019-02-05 02:44:07 +02:00
@ =
inter_bookmark Inter::Bookmarks::at_start_of_this_repository(inter_tree *I) {
2019-07-14 12:44:07 +03:00
inter_bookmark IBM;
2019-07-23 01:34:28 +03:00
IBM.current_package = I->root_package;
IBM.R = I->root_definition_frame;
2019-07-14 12:44:07 +03:00
IBM.placement_wrt_R = AFTER_ICPLACEMENT;
return IBM;
2019-02-05 02:44:07 +02:00
}
2019-07-23 01:34:28 +03:00
inter_tree *Inter::Bookmarks::tree(inter_bookmark *IBM) {
if (IBM == NULL) return NULL;
if (IBM->current_package == NULL) internal_error("no package");
return IBM->current_package->stored_in;
}
inter_warehouse *Inter::Bookmarks::warehouse(inter_bookmark *IBM) {
return Inter::warehouse(Inter::Bookmarks::tree(IBM));
}
2019-07-14 12:44:07 +03:00
inter_bookmark Inter::Bookmarks::at_end_of_this_package(inter_package *pack) {
if (pack == NULL) internal_error("no package supplied");
inter_bookmark IBM;
IBM.current_package = pack;
IBM.R = Inter::Symbols::definition(pack->package_name);
2019-07-14 12:44:07 +03:00
IBM.placement_wrt_R = AS_LAST_CHILD_OF_ICPLACEMENT;
return IBM;
2019-02-05 02:44:07 +02:00
}
inter_bookmark Inter::Bookmarks::after_this_frame(inter_tree *I, inter_frame *D) {
if (D == NULL) internal_error("invalid frame supplied");
2019-07-14 12:44:07 +03:00
inter_bookmark IBM;
IBM.current_package = Inter::Packages::container(D);
2019-07-23 01:34:28 +03:00
if (IBM.current_package == NULL) IBM.current_package = I->root_package;
2019-07-14 12:44:07 +03:00
IBM.R = D;
IBM.placement_wrt_R = AFTER_ICPLACEMENT;
return IBM;
2019-02-05 02:44:07 +02:00
}
2019-07-14 12:44:07 +03:00
void Inter::Bookmarks::set_current_package(inter_bookmark *IBM, inter_package *P) {
if (IBM == NULL) internal_error("no bookmark supplied");
2019-07-23 01:34:28 +03:00
if (P == NULL) internal_error("invalid package supplied");
2019-07-14 12:44:07 +03:00
IBM->current_package = P;
2019-07-23 01:34:28 +03:00
if (Inter::Packages::is_rootlike(P)) {
IBM->R = P->stored_in->root_definition_frame;
IBM->placement_wrt_R = AS_LAST_CHILD_OF_ICPLACEMENT;
} else {
inter_frame *D = Inter::Symbols::definition(P->package_name);
IBM->R = D;
2019-07-23 01:34:28 +03:00
IBM->placement_wrt_R = AFTER_ICPLACEMENT;
}
2019-07-14 12:44:07 +03:00
}
int Inter::Bookmarks::get_placement(inter_bookmark *IBM) {
if (IBM == NULL) internal_error("no bookmark supplied");
return IBM->placement_wrt_R;
}
void Inter::Bookmarks::set_placement(inter_bookmark *IBM, int p) {
if (IBM == NULL) internal_error("no bookmark supplied");
IBM->placement_wrt_R = p;
2019-07-14 02:33:50 +03:00
}
inter_frame *Inter::Bookmarks::get_ref(inter_bookmark *IBM) {
2019-07-14 12:44:07 +03:00
if (IBM == NULL) internal_error("no bookmark supplied");
return IBM->R;
2019-07-14 02:33:50 +03:00
}
void Inter::Bookmarks::set_ref(inter_bookmark *IBM, inter_frame *F) {
2019-07-14 12:44:07 +03:00
if (IBM == NULL) internal_error("no bookmark supplied");
IBM->R = F;
}
inter_bookmark Inter::Bookmarks::snapshot(inter_bookmark *IBM) {
return *IBM;
}
int Inter::Bookmarks::baseline(inter_bookmark *IBM) {
if ((IBM) && (IBM->current_package))
return Inter::Packages::baseline(IBM->current_package);
return 0;
2019-02-05 02:44:07 +02:00
}
void Inter::Bookmarks::log(OUTPUT_STREAM, void *virs) {
2019-07-14 12:44:07 +03:00
inter_bookmark *IBM = (inter_bookmark *) virs;
if (IBM == NULL) WRITE("<null-bookmark>");
2019-02-05 02:44:07 +02:00
else {
LOG("<bookmark:");
2019-07-14 12:44:07 +03:00
if (IBM->current_package == NULL) LOG("--");
else LOG("$3", IBM->current_package->package_name);
LOG("(%d)>", Inter::Bookmarks::baseline(IBM));
2019-02-05 02:44:07 +02:00
}
}
2019-07-14 12:44:07 +03:00
inter_symbols_table *Inter::Bookmarks::scope(inter_bookmark *IBM) {
if ((IBM) && (IBM->current_package)) return Inter::Packages::scope(IBM->current_package);
2019-07-23 01:34:28 +03:00
return Inter::get_global_symbols(Inter::Bookmarks::tree(IBM));
2019-02-05 02:44:07 +02:00
}
2019-07-14 12:44:07 +03:00
inter_package *Inter::Bookmarks::package(inter_bookmark *IBM) {
if ((IBM) && (IBM->current_package)) return IBM->current_package;
2019-02-05 02:44:07 +02:00
return NULL;
}