2019-12-08 02:53:01 +00:00
|
|
|
/*
|
|
|
|
* Mr. 4th Dimention - Allen Webster
|
|
|
|
*
|
|
|
|
* 04.12.2019
|
|
|
|
*
|
|
|
|
* Definition of information contained in 4coder documentation.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
// TOP
|
|
|
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
function Doc_Date
|
|
|
|
doc_date_now(void){
|
|
|
|
time_t t = time(0);
|
|
|
|
tm *time = localtime(&t);
|
|
|
|
Doc_Date date = {};
|
|
|
|
date.day = time->tm_mday;
|
|
|
|
date.month = time->tm_mon + 1;
|
2019-12-13 05:02:40 +00:00
|
|
|
date.year = 1900 + time->tm_year;
|
2019-12-08 02:53:01 +00:00
|
|
|
return(date);
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
|
|
|
|
function Doc_Content*
|
|
|
|
doc_content_push(Arena *arena, Doc_Content_List *list, String_Const_u8 text, Doc_Content_Emphasis emphasis){
|
|
|
|
Doc_Content *content = push_array_zero(arena, Doc_Content, 1);
|
|
|
|
sll_queue_push(list->first, list->last, content);
|
|
|
|
list->total_size += text.size;
|
|
|
|
list->node_count += 1;
|
|
|
|
content->text = text;
|
|
|
|
content->emphasis = emphasis;
|
|
|
|
return(content);
|
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Content*
|
|
|
|
doc_content_push(Arena *arena, Doc_Content_List *list, String_Const_u8 text){
|
|
|
|
return(doc_content_push(arena, list, text, DocContentEmphasis_Normal));
|
|
|
|
}
|
|
|
|
|
|
|
|
function void
|
|
|
|
doc_code_list_push(Arena *arena, Doc_Code_Sample_List *list, String_Const_u8 contents, Doc_Code_Language language){
|
|
|
|
Doc_Code_Sample *sample = push_array_zero(arena, Doc_Code_Sample, 1);
|
|
|
|
sll_queue_push(list->first, list->last, sample);
|
|
|
|
list->count += 1;
|
|
|
|
sample->contents = contents;
|
|
|
|
sample->language = language;
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
|
|
|
|
function Doc_Cluster*
|
|
|
|
new_doc_cluster(Arena *arena, char *title, char *name, Doc_Date *date){
|
|
|
|
Doc_Cluster *result = push_array_zero(arena, Doc_Cluster, 1);
|
|
|
|
result->title = SCu8(title);
|
|
|
|
result->name = SCu8(name);
|
|
|
|
result->gen_date = *date;
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Cluster*
|
|
|
|
new_doc_cluster(Arena *arena, char *title, char *name){
|
|
|
|
Doc_Date date = doc_date_now();
|
|
|
|
return(new_doc_cluster(arena, title, name, &date));
|
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Page*
|
|
|
|
new_doc_page(Arena *arena, Doc_Cluster *cluster, char *title, char *name){
|
|
|
|
Doc_Page *result = push_array_zero(arena, Doc_Page, 1);
|
|
|
|
|
|
|
|
result->owner = cluster;
|
|
|
|
sll_queue_push(cluster->first_page, cluster->last_page, result);
|
|
|
|
cluster->page_count += 1;
|
|
|
|
|
|
|
|
result->title = SCu8(title);
|
|
|
|
result->name = SCu8(name);
|
|
|
|
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Page*
|
|
|
|
new_doc_page_normal_title(Arena *arena, Doc_Cluster *cluster, char *title, char *name){
|
|
|
|
String_Const_u8 full_title = push_u8_stringf(arena, "%s - %.*s", title, string_expand(cluster->title));
|
|
|
|
return(new_doc_page(arena, cluster, (char*)full_title.str, name));
|
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Page*
|
|
|
|
new_doc_page_function(Arena *arena, Doc_Cluster *cluster, char *name){
|
2019-12-13 00:03:21 +00:00
|
|
|
return(new_doc_page_normal_title(arena, cluster, name, name));
|
2019-12-08 02:53:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Page*
|
|
|
|
new_doc_page_function(Arena *arena, Doc_Cluster *cluster, String_Const_u8 name){
|
|
|
|
name = push_string_copy(arena, name);
|
|
|
|
char *c_name = (char*)name.str;
|
|
|
|
return(new_doc_page_function(arena, cluster, c_name));
|
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Block*
|
|
|
|
new_doc_block(Arena *arena, Doc_Page *page, char *name){
|
|
|
|
Doc_Block *result = push_array_zero(arena, Doc_Block, 1);
|
|
|
|
result->owner = page;
|
|
|
|
sll_queue_push(page->first_block, page->last_block, result);
|
|
|
|
page->block_count += 1;
|
|
|
|
result->name = SCu8(name);
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
function void
|
|
|
|
new_doc_block_jump(Arena *arena, Doc_Page *page, Doc_Block *block){
|
|
|
|
Doc_Block_Ptr *node = push_array_zero(arena, Doc_Block_Ptr, 1);
|
|
|
|
sll_queue_push(page->quick_jumps.first, page->quick_jumps.last, node);
|
|
|
|
page->quick_jumps.count += 1;
|
|
|
|
node->block = block;
|
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Paragraph*
|
|
|
|
new_doc_par(Arena *arena, Doc_Block *block){
|
|
|
|
Doc_Paragraph *result = push_array_zero(arena, Doc_Paragraph, 1);
|
|
|
|
sll_queue_push(block->first_par, block->last_par, result);
|
|
|
|
block->par_count += 1;
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
function void
|
|
|
|
new_doc_par_single_code(Arena *arena, Doc_Block *block, String_Const_u8 contents, Doc_Code_Language language){
|
|
|
|
Doc_Paragraph *paragraph = new_doc_par(arena, block);
|
|
|
|
paragraph->kind = DocParagraphKind_Code;
|
|
|
|
doc_code_list_push(arena, ¶graph->code, contents, language);
|
|
|
|
}
|
|
|
|
|
2019-12-17 08:11:31 +00:00
|
|
|
function Doc_Paragraph*
|
|
|
|
new_doc_par_table(Arena *arena, Doc_Block *block){
|
|
|
|
Doc_Paragraph *result = new_doc_par(arena, block);
|
|
|
|
result->kind = DocParagraphKind_Table;
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
2019-12-08 02:53:01 +00:00
|
|
|
////////////////////////////////
|
|
|
|
|
|
|
|
function void
|
|
|
|
doc_log(Arena *arena, Doc_Cluster *cluster, String_Const_u8 string){
|
|
|
|
Doc_Log *log = push_array_zero(arena, Doc_Log, 1);
|
|
|
|
sll_queue_push(cluster->first_log, cluster->last_log, log);
|
|
|
|
log->content = string;
|
|
|
|
}
|
|
|
|
|
|
|
|
function void
|
|
|
|
doc_log(Arena *arena, Doc_Cluster *cluster, char *str){
|
|
|
|
doc_log(arena, cluster, SCu8(str));
|
|
|
|
}
|
|
|
|
|
|
|
|
function void
|
|
|
|
doc_logfv(Arena *arena, Doc_Cluster *cluster, char *format, va_list args){
|
|
|
|
String_Const_u8 str = push_u8_stringfv(arena, format, args);
|
|
|
|
doc_log(arena, cluster, str);
|
|
|
|
}
|
|
|
|
|
|
|
|
function void
|
|
|
|
doc_logf(Arena *arena, Doc_Cluster *cluster, char *format, ...){
|
|
|
|
va_list args;
|
|
|
|
va_start(args, format);
|
|
|
|
doc_logfv(arena, cluster, format, args);
|
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define doc_warning(a,c) doc_log(a),(c), "warning: ")
|
|
|
|
#define doc_error(a,c) doc_log(a),(c), "error: ")
|
|
|
|
#define doc_note(a,c) doc_log(a),(c), "note: ")
|
|
|
|
|
|
|
|
#define doc_warningf(a,c,f,...) doc_logf((a),(c), "warning: " f, __VA_ARGS__)
|
|
|
|
#define doc_errorf(a,c,f,...) doc_logf((a),(c), "error: " f, __VA_ARGS__)
|
|
|
|
#define doc_notef(a,c,f,...) doc_logf((a),(c), "note: " f, __VA_ARGS__)
|
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
|
2019-12-17 08:11:31 +00:00
|
|
|
function Doc_Content*
|
2019-12-08 02:53:01 +00:00
|
|
|
doc_text(Arena *arena, Doc_Block *block, char *str){
|
|
|
|
Doc_Paragraph *par = block->last_par;
|
|
|
|
if (par != 0){
|
|
|
|
if (par->kind != DocParagraphKind_Text){
|
|
|
|
par = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (par == 0){
|
|
|
|
par = new_doc_par(arena, block);
|
|
|
|
par->kind = DocParagraphKind_Text;
|
|
|
|
}
|
|
|
|
|
2019-12-17 08:11:31 +00:00
|
|
|
return(doc_content_push(arena, &par->text, SCu8(str)));
|
|
|
|
}
|
|
|
|
|
|
|
|
function Doc_Content*
|
|
|
|
doc_text(Arena *arena, Doc_Content_List *list, char *string){
|
|
|
|
return(doc_content_push(arena, list, SCu8(string)));
|
2019-12-08 02:53:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function void
|
|
|
|
doc_paragraph(Arena *arena, Doc_Block *block){
|
|
|
|
Doc_Paragraph *par = new_doc_par(arena, block);
|
|
|
|
par->kind = DocParagraphKind_Text;
|
|
|
|
}
|
|
|
|
|
|
|
|
// BOTTOM
|
|
|
|
|