/************************************************************/ /* Spidcom Technologies FILE NAME : segment.c DESCRIPTION : segment descriptions HISTORY : -------------------------------------------------------------- DATE | AUTHOR | Version | Description -------------------------------------------------------------- 20/02/04 | Petillon | 1.0 | Creation */ /************************************************************/ #include #include "segment.h" #include "overlap.h" void segment_list_init(segment_list_t *segment_list) { segment_list->size = 0; } void segment_list_delete(segment_list_t *segment_list) { segment_list->size = 0; } void add_segment(segment_t *segment, segment_list_t *segment_list) { if (segment_list->sizesegments[segment_list->size++] = *segment; } int segment_overlap(segment_t *segment, const segment_list_t *segment_list) { int i; int test; i = 0; test = 0; while (isize && test==0) { if (overlap(segment->address,segment->size,segment_list->segments[i].address,segment_list->segments[i].size)) test = 1; else i++; } if (test) return i; else return -1; } int find_segment(caddr_t address, size_t size, segment_list_t *segment_list, segment_t *segment) { uint32_t i; int result; // test with the starting of the range segment->address = address; if (segment_overlap(segment,segment_list)<0) return 0; i = 0; result = -1; while (isize && result==-1) { segment->address = segment_list->segments[i].address+segment_list->segments[i].size; segment->address = (caddr_t)(((uint32_t)segment->address+0x0F) & 0xFFFFFFF0); /* align */ if (segment_overlap(segment,segment_list)<0) result = 0; i++; } if (result<0) // should never occur return -1; else { if (segment->address>=address && segment->size<=size) return 0; else return -1; } }