static gint rlib_navigate_followers(rlib *r, gint my_leader, gint way) { gint i, rtn = TRUE; gint found = FALSE; for(i=0;i<r->resultset_followers_count;i++) { found = FALSE; if(r->followers[i].leader == my_leader) { if(r->followers[i].leader_code != NULL ) { struct rlib_value rval_leader, rval_follower; rlib_execute_pcode(r, &rval_leader, r->followers[i].leader_code, NULL); rlib_execute_pcode(r, &rval_follower, r->followers[i].follower_code, NULL); if( rvalcmp(&rval_leader,&rval_follower) == 0 ) { } else { rlib_value_free(&rval_follower); if(rlib_do_followers(r, i, way) == TRUE) { rlib_execute_pcode(r, &rval_follower, r->followers[i].follower_code, NULL); if( rvalcmp(&rval_leader,&rval_follower) == 0 ) { found = TRUE; } } if(found == FALSE) { r->results[r->followers[i].follower]->navigation_failed = FALSE; rlib_do_followers(r, i, RLIB_NAVIGATE_FIRST); do { rlib_execute_pcode(r, &rval_follower, r->followers[i].follower_code, NULL); if(rvalcmp(&rval_leader,&rval_follower) == 0 ) { found = TRUE; break; } rlib_value_free(&rval_follower); } while(rlib_do_followers(r, i, RLIB_NAVIGATE_NEXT) == TRUE); } if(!found) { r->results[r->followers[i].follower]->navigation_failed = TRUE; } } rlib_value_free(&rval_leader); rlib_value_free(&rval_follower); } else { rtn = rlib_do_followers(r, i, way); } } } rlib_process_input_metadata(r); return rtn; }
/* Footers are complicated.... I need to go in reverse order for footers... and if I find a match... I need to go back down the list and force breaks for everyone.. in reverse order.. ugh */ void rlib_handle_break_footers(rlib *r, struct rlib_part *part, struct rlib_report *report, gboolean precalculate) { struct rlib_element *e; struct rlib_break_fields *bf; if(report->breaks == NULL) return; for(e = report->breaks; e != NULL; e=e->next) { gint dobreak=1; struct rlib_report_break *rb = e->data; struct rlib_element *be; for(be = rb->fields; be != NULL; be=be->next) { struct rlib_value rval_tmp; RLIB_VALUE_TYPE_NONE(&rval_tmp); bf = be->data; if(dobreak) { if (INPUT(r, r->current_result)->isdone(INPUT(r, r->current_result), r->results[r->current_result].result)) { dobreak = 1; } else { struct rlib_value *tmp = rlib_execute_pcode(r, &rval_tmp, bf->code, NULL); if (rvalcmp(bf->rval, tmp)) { dobreak = 1; } else { dobreak = 0; } rlib_value_free(tmp); } } else { dobreak = 0; } } if(dobreak) { rlib_break_all_below_in_reverse_order(r, part, report, e, precalculate); break; } } }