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;
|
2019-07-24 20:15:07 +03:00
|
|
|
struct inter_tree_node *R;
|
2019-07-11 11:15:57 +03:00
|
|
|
int placement_wrt_R;
|
2019-07-14 12:44:07 +03:00
|
|
|
} inter_bookmark;
|
2019-02-05 02:44:07 +02:00
|
|
|
|
|
|
|
@ =
|
2019-07-22 02:01:18 +03: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;
|
2019-07-24 20:15:07 +03:00
|
|
|
IBM.R = I->root_node;
|
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;
|
|
|
|
}
|
|
|
|
|
2019-07-23 22:07:01 +03:00
|
|
|
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;
|
2019-07-24 17:19:38 +03:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2019-07-24 20:15:07 +03:00
|
|
|
inter_bookmark Inter::Bookmarks::after_this_frame(inter_tree *I, inter_tree_node *D) {
|
2019-07-24 17:19:38 +03:00
|
|
|
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)) {
|
2019-07-24 20:15:07 +03:00
|
|
|
IBM->R = P->stored_in->root_node;
|
2019-07-23 01:34:28 +03:00
|
|
|
IBM->placement_wrt_R = AS_LAST_CHILD_OF_ICPLACEMENT;
|
|
|
|
} else {
|
2019-07-24 20:15:07 +03:00
|
|
|
inter_tree_node *D = Inter::Symbols::definition(P->package_name);
|
2019-07-24 17:19:38 +03:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2019-07-24 20:15:07 +03:00
|
|
|
inter_tree_node *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
|
|
|
}
|
|
|
|
|
2019-07-24 20:15:07 +03:00
|
|
|
void Inter::Bookmarks::set_ref(inter_bookmark *IBM, inter_tree_node *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;
|
|
|
|
}
|