139 lines
3.2 KiB
C++
139 lines
3.2 KiB
C++
|
/*
|
||
|
* Mr. 4th Dimention - Allen Webster
|
||
|
*
|
||
|
* 09.02.2016
|
||
|
*
|
||
|
* Shared system functions
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
// TOP
|
||
|
|
||
|
internal void
|
||
|
sysshared_filter_real_files(char **files, i32 *file_count){
|
||
|
i32 i, j;
|
||
|
i32 end;
|
||
|
|
||
|
end = *file_count;
|
||
|
for (i = 0, j = 0; i < end; ++i){
|
||
|
if (system_file_can_be_made(files[i])){
|
||
|
files[j] = files[i];
|
||
|
++j;
|
||
|
}
|
||
|
}
|
||
|
*file_count = j;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
ex__file_insert(File_Slot *pos, File_Slot *file){
|
||
|
file->next = pos->next;
|
||
|
file->next->prev = file;
|
||
|
file->prev = pos;
|
||
|
pos->next = file;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
ex__insert_range(File_Slot *start, File_Slot *end, File_Slot *pos){
|
||
|
end->next->prev = start->prev;
|
||
|
start->prev->next = end->next;
|
||
|
|
||
|
end->next = pos->next;
|
||
|
start->prev = pos;
|
||
|
pos->next->prev = end;
|
||
|
pos->next = start;
|
||
|
}
|
||
|
|
||
|
internal void
|
||
|
ex__check_file(File_Slot *pos){
|
||
|
File_Slot *file = pos;
|
||
|
|
||
|
Assert(pos == pos->next->prev);
|
||
|
|
||
|
for (pos = pos->next;
|
||
|
file != pos;
|
||
|
pos = pos->next){
|
||
|
Assert(pos == pos->next->prev);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal void
|
||
|
ex__check(File_Exchange *file_exchange){
|
||
|
ex__check_file(&file_exchange->available);
|
||
|
ex__check_file(&file_exchange->active);
|
||
|
ex__check_file(&file_exchange->free_list);
|
||
|
}
|
||
|
|
||
|
internal void
|
||
|
sysshared_init_file_exchange(
|
||
|
Exchange *exchange, File_Slot *slots, i32 max,
|
||
|
char **filename_space_out){
|
||
|
char *filename_space;
|
||
|
i32 i;
|
||
|
|
||
|
exchange->file.max = max;
|
||
|
exchange->file.available = {};
|
||
|
exchange->file.available.next = &exchange->file.available;
|
||
|
exchange->file.available.prev = &exchange->file.available;
|
||
|
|
||
|
exchange->file.active = {};
|
||
|
exchange->file.active.next = &exchange->file.active;
|
||
|
exchange->file.active.prev = &exchange->file.active;
|
||
|
|
||
|
exchange->file.free_list = {};
|
||
|
exchange->file.free_list.next = &exchange->file.free_list;
|
||
|
exchange->file.free_list.prev = &exchange->file.free_list;
|
||
|
|
||
|
exchange->file.files = slots;
|
||
|
memset(slots, 0, sizeof(File_Slot)*max);
|
||
|
|
||
|
filename_space = (char*)
|
||
|
system_get_memory(FileNameMax*exchange->file.max);
|
||
|
|
||
|
File_Slot *slot = slots;
|
||
|
for (i = 0; i < exchange->file.max; ++i, ++slot){
|
||
|
ex__file_insert(&exchange->file.available, slot);
|
||
|
slot->filename = filename_space;
|
||
|
filename_space += FileNameMax;
|
||
|
}
|
||
|
|
||
|
if (filename_space_out) *filename_space_out = filename_space;
|
||
|
}
|
||
|
|
||
|
internal void
|
||
|
fnt__remove(Font_Load_Parameters *params){
|
||
|
params->next->prev = params->prev;
|
||
|
params->prev->next = params->next;
|
||
|
}
|
||
|
|
||
|
internal void
|
||
|
fnt__insert(Font_Load_Parameters *pos, Font_Load_Parameters *params){
|
||
|
params->next = pos->next;
|
||
|
pos->next->prev = params;
|
||
|
pos->next = params;
|
||
|
params->prev = pos;
|
||
|
}
|
||
|
|
||
|
internal void
|
||
|
sysshared_init_font_params(
|
||
|
Font_Load_System *fnt, Font_Load_Parameters *params, i32 max){
|
||
|
Font_Load_Parameters *param;
|
||
|
i32 i;
|
||
|
|
||
|
fnt->params = params;
|
||
|
fnt->max = max;
|
||
|
|
||
|
fnt->free_param.next = &fnt->free_param;
|
||
|
fnt->free_param.prev = &fnt->free_param;
|
||
|
|
||
|
fnt->used_param.next = &fnt->free_param;
|
||
|
fnt->used_param.prev = &fnt->free_param;
|
||
|
|
||
|
param = params;
|
||
|
for (i = 0; i < max; ++i, ++param){
|
||
|
fnt__insert(&fnt->free_param, param);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// BOTTOM
|
||
|
|