finished switching over to new system, could probably use a little more cleanup still
This commit is contained in:
parent
77c9be21b7
commit
6064912b03
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
4coder_string.h - Version 1.0.80
|
4coder_string.h - Version 1.0.102
|
||||||
no warranty implied; use at your own risk
|
no warranty implied; use at your own risk
|
||||||
|
|
||||||
This software is in the public domain. Where that dedication is not
|
This software is in the public domain. Where that dedication is not
|
||||||
|
@ -669,14 +669,21 @@ match_ss(String a, String b){
|
||||||
#if defined(FSTRING_IMPLEMENTATION)
|
#if defined(FSTRING_IMPLEMENTATION)
|
||||||
FSTRING_LINK b32_4tech
|
FSTRING_LINK b32_4tech
|
||||||
match_part_ccl(char *a, char *b, i32_4tech *len){
|
match_part_ccl(char *a, char *b, i32_4tech *len){
|
||||||
|
if (a == 0){
|
||||||
|
a = "";
|
||||||
|
}
|
||||||
|
if (b == 0){
|
||||||
|
b = "";
|
||||||
|
}
|
||||||
|
|
||||||
i32_4tech i;
|
i32_4tech i;
|
||||||
for (i = 0; b[i] != 0; ++i){
|
for (i = 0; b[i] != 0; ++i){
|
||||||
if (a[i] != b[i]){
|
if (a[i] != b[i]){
|
||||||
return 0;
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*len = i;
|
*len = i;
|
||||||
return 1;
|
return(1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -684,14 +691,17 @@ match_part_ccl(char *a, char *b, i32_4tech *len){
|
||||||
#if defined(FSTRING_IMPLEMENTATION)
|
#if defined(FSTRING_IMPLEMENTATION)
|
||||||
FSTRING_LINK b32_4tech
|
FSTRING_LINK b32_4tech
|
||||||
match_part_scl(String a, char *b, i32_4tech *len){
|
match_part_scl(String a, char *b, i32_4tech *len){
|
||||||
|
if (b == 0){
|
||||||
|
b = "";
|
||||||
|
}
|
||||||
i32_4tech i;
|
i32_4tech i;
|
||||||
for (i = 0; b[i] != 0; ++i){
|
for (i = 0; b[i] != 0; ++i){
|
||||||
if (a.str[i] != b[i] || i == a.size){
|
if (i == a.size || a.str[i] != b[i]){
|
||||||
return 0;
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*len = i;
|
*len = i;
|
||||||
return 1;
|
return(1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -731,14 +741,14 @@ match_part_cs(char *a, String b){
|
||||||
FSTRING_LINK b32_4tech
|
FSTRING_LINK b32_4tech
|
||||||
match_part_ss(String a, String b){
|
match_part_ss(String a, String b){
|
||||||
if (a.size < b.size){
|
if (a.size < b.size){
|
||||||
return 0;
|
return(0);
|
||||||
}
|
}
|
||||||
for (i32_4tech i = 0; i < b.size; ++i){
|
for (i32_4tech i = 0; i < b.size; ++i){
|
||||||
if (a.str[i] != b.str[i]){
|
if (a.str[i] != b.str[i]){
|
||||||
return 0;
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return(1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -28,21 +28,57 @@ load_enriched_text(char *directory, char *filename){
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
struct Alternate_Name{
|
typedef u32 Mangle_Rule;
|
||||||
String macro;
|
|
||||||
String public_name;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Alternate_Names_Array{
|
|
||||||
Alternate_Name *names;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum{
|
enum{
|
||||||
AltName_Standard,
|
MangleRule_None,
|
||||||
AltName_Macro,
|
MangleRule_MacroSig,
|
||||||
AltName_Public_Name,
|
MangleRule_ToLower,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
internal Mangle_Rule
|
||||||
|
get_mangle_rule(String mangle){
|
||||||
|
Mangle_Rule result = MangleRule_None;
|
||||||
|
if (match(mangle, "macro sig")){
|
||||||
|
result = MangleRule_MacroSig;
|
||||||
|
}
|
||||||
|
else if (match(mangle, "to lower")){
|
||||||
|
result = MangleRule_ToLower;
|
||||||
|
}
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal String
|
||||||
|
apply_mangle_rule(String name, u32 mangle_rule){
|
||||||
|
String result = {0};
|
||||||
|
switch (mangle_rule){
|
||||||
|
case MangleRule_MacroSig:
|
||||||
|
{
|
||||||
|
result = str_alloc(name.size + 5);
|
||||||
|
fm_align();
|
||||||
|
copy(&result, name);
|
||||||
|
to_upper(&result);
|
||||||
|
append(&result, "_SIG");
|
||||||
|
terminate_with_null(&result);
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case MangleRule_ToLower:
|
||||||
|
{
|
||||||
|
result = str_alloc(name.size + 1);
|
||||||
|
fm_align();
|
||||||
|
copy(&result, name);
|
||||||
|
to_lower(&result);
|
||||||
|
terminate_with_null(&result);
|
||||||
|
}break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
result = name;
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
enum{
|
enum{
|
||||||
|
@ -88,8 +124,8 @@ struct Document_Item{
|
||||||
|
|
||||||
struct{
|
struct{
|
||||||
Meta_Unit *unit;
|
Meta_Unit *unit;
|
||||||
Alternate_Names_Array *alt_names;
|
//Alternate_Names_Array *alt_names;
|
||||||
i32 alt_name_type;
|
u32 mangle_rule;
|
||||||
} unit_elements;
|
} unit_elements;
|
||||||
|
|
||||||
struct{
|
struct{
|
||||||
|
@ -156,6 +192,7 @@ enum{
|
||||||
ItemType_Document,
|
ItemType_Document,
|
||||||
ItemType_Image,
|
ItemType_Image,
|
||||||
ItemType_GenericFile,
|
ItemType_GenericFile,
|
||||||
|
ItemType_MetaUnit,
|
||||||
//
|
//
|
||||||
ItemType_COUNT,
|
ItemType_COUNT,
|
||||||
};
|
};
|
||||||
|
@ -173,6 +210,9 @@ struct Abstract_Item{
|
||||||
float w_h_ratio;
|
float w_h_ratio;
|
||||||
float h_w_ratio;
|
float h_w_ratio;
|
||||||
Basic_List img_instantiations;
|
Basic_List img_instantiations;
|
||||||
|
|
||||||
|
// Meta parse members
|
||||||
|
Meta_Unit *unit;
|
||||||
};
|
};
|
||||||
global Abstract_Item null_abstract_item = {0};
|
global Abstract_Item null_abstract_item = {0};
|
||||||
|
|
||||||
|
@ -210,16 +250,24 @@ struct Image_Instantiation{
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Document_System{
|
struct Document_System{
|
||||||
|
char *code_dir;
|
||||||
|
char *asset_dir;
|
||||||
|
char *src_dir;
|
||||||
|
|
||||||
Basic_List doc_list;
|
Basic_List doc_list;
|
||||||
Basic_List img_list;
|
Basic_List img_list;
|
||||||
Basic_List file_list;
|
Basic_List file_list;
|
||||||
|
Basic_List meta_list;
|
||||||
|
|
||||||
Basic_List unresolved_includes;
|
Basic_List unresolved_includes;
|
||||||
};
|
};
|
||||||
|
|
||||||
internal Document_System
|
internal Document_System
|
||||||
create_document_system(){
|
create_document_system(char *code_dir, char *asset_dir, char *src_dir){
|
||||||
Document_System system = {0};
|
Document_System system = {0};
|
||||||
|
system.code_dir = code_dir;
|
||||||
|
system.asset_dir = asset_dir;
|
||||||
|
system.src_dir = src_dir;
|
||||||
return(system);
|
return(system);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,13 +328,53 @@ create_abstract_item(Basic_List *list, char *name){
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal char*
|
||||||
|
get_null_terminated_version(String str){
|
||||||
|
char *ptr = 0;
|
||||||
|
if (terminate_with_null(&str)){
|
||||||
|
ptr = str.str;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
String b = str_alloc(str.size + 1);
|
||||||
|
copy(&b, str);
|
||||||
|
terminate_with_null(&b);
|
||||||
|
ptr = b.str;
|
||||||
|
}
|
||||||
|
return(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal b32
|
||||||
|
create_meta_unit(Document_System *doc_system, String name_str, String file_str){
|
||||||
|
char *name = get_null_terminated_version(name_str);
|
||||||
|
char *file = get_null_terminated_version(file_str);
|
||||||
|
|
||||||
|
Abstract_Item *item = create_abstract_item(&doc_system->meta_list, name);
|
||||||
|
|
||||||
|
b32 result = false;
|
||||||
|
if (item != 0){
|
||||||
|
Meta_Unit *unit = fm_push_array(Meta_Unit, 1);
|
||||||
|
*unit = compile_meta_unit(doc_system->code_dir, file, ExpandArray(meta_keywords));
|
||||||
|
|
||||||
|
if (unit->count != 0){
|
||||||
|
result = true;
|
||||||
|
item->item_type = ItemType_MetaUnit;
|
||||||
|
item->name = name;
|
||||||
|
item->unit = unit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
internal Abstract_Item*
|
internal Abstract_Item*
|
||||||
add_generic_file(Document_System *system, char *source_file, char *extension, char *name){
|
add_generic_file(Document_System *system, char *source_file, char *extension, char *name){
|
||||||
Abstract_Item *item = create_abstract_item(&system->file_list, name);
|
Abstract_Item *item = create_abstract_item(&system->file_list, name);
|
||||||
if (item){
|
if (item){
|
||||||
|
char *full_file = fm_str(system->asset_dir, "/", source_file);
|
||||||
|
|
||||||
item->item_type = ItemType_GenericFile;
|
item->item_type = ItemType_GenericFile;
|
||||||
item->extension = extension;
|
item->extension = extension;
|
||||||
item->source_file = source_file;
|
item->source_file = full_file;
|
||||||
item->name = name;
|
item->name = name;
|
||||||
}
|
}
|
||||||
return(item);
|
return(item);
|
||||||
|
@ -296,15 +384,17 @@ internal Abstract_Item*
|
||||||
add_image_description(Document_System *system, char *source_file, char *extension, char *name){
|
add_image_description(Document_System *system, char *source_file, char *extension, char *name){
|
||||||
Abstract_Item *item = create_abstract_item(&system->img_list, name);
|
Abstract_Item *item = create_abstract_item(&system->img_list, name);
|
||||||
if (item != 0){
|
if (item != 0){
|
||||||
|
char *full_file = fm_str(system->asset_dir, "/", source_file);
|
||||||
|
|
||||||
item->item_type = ItemType_Image;
|
item->item_type = ItemType_Image;
|
||||||
item->extension = extension;
|
|
||||||
item->source_file = source_file;
|
|
||||||
item->name = name;
|
item->name = name;
|
||||||
|
item->extension = extension;
|
||||||
|
item->source_file = full_file;
|
||||||
|
|
||||||
i32 w = 0, h = 0, comp = 0;
|
i32 w = 0, h = 0, comp = 0;
|
||||||
i32 stbi_r = stbi_info(source_file, &w, &h, &comp);
|
i32 stbi_r = stbi_info(full_file, &w, &h, &comp);
|
||||||
if (!stbi_r){
|
if (!stbi_r){
|
||||||
fprintf(stdout, "Did not find file %s\n", source_file);
|
fprintf(stdout, "Did not find file %s\n", full_file);
|
||||||
item->w_h_ratio = 1.f;
|
item->w_h_ratio = 1.f;
|
||||||
item->h_w_ratio = 1.f;
|
item->h_w_ratio = 1.f;
|
||||||
}
|
}
|
||||||
|
@ -440,31 +530,17 @@ add_include(Document_System *doc_system, Document_Builder *builder, String text)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
add_element_list(Document_Builder *builder, Meta_Unit *unit){
|
add_doc_list(Document_Builder *builder, Meta_Unit *unit, Mangle_Rule mangle_rule){
|
||||||
Document_Item *item = doc_new_item(builder, Doc_DocList);
|
Document_Item *item = doc_new_item(builder, Doc_DocList);
|
||||||
item->unit_elements.unit = unit;
|
item->unit_elements.unit = unit;
|
||||||
|
item->unit_elements.mangle_rule = mangle_rule;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
add_element_list(Document_Builder *builder, Meta_Unit *unit, Alternate_Names_Array *alt_names, i32 alt_name_type){
|
add_doc_full(Document_Builder *builder, Meta_Unit *unit, Mangle_Rule mangle_rule){
|
||||||
Document_Item *item = doc_new_item(builder, Doc_DocList);
|
|
||||||
item->unit_elements.unit = unit;
|
|
||||||
item->unit_elements.alt_names = alt_names;
|
|
||||||
item->unit_elements.alt_name_type = alt_name_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
|
||||||
add_full_elements(Document_Builder *builder, Meta_Unit *unit){
|
|
||||||
Document_Item *item = doc_new_item(builder, Doc_DocFull);
|
Document_Item *item = doc_new_item(builder, Doc_DocFull);
|
||||||
item->unit_elements.unit = unit;
|
item->unit_elements.unit = unit;
|
||||||
}
|
item->unit_elements.mangle_rule = mangle_rule;
|
||||||
|
|
||||||
internal void
|
|
||||||
add_full_elements(Document_Builder *builder, Meta_Unit *unit, Alternate_Names_Array *alt_names, i32 alt_name_type){
|
|
||||||
Document_Item *item = doc_new_item(builder, Doc_DocFull);
|
|
||||||
item->unit_elements.unit = unit;
|
|
||||||
item->unit_elements.alt_names = alt_names;
|
|
||||||
item->unit_elements.alt_name_type = alt_name_type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
@ -500,10 +576,7 @@ add_end_style(Document_Builder *builder){
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
add_document_link(Document_Builder *builder, String text){
|
add_document_link(Document_Builder *builder, String text){
|
||||||
Document_Item *item = doc_new_item(builder, Doc_BeginStyle);
|
doc_new_item_strings(builder, Doc_DocumentLink, text, null_string);
|
||||||
item->string.string = str_alloc(text.size);
|
|
||||||
fm_align();
|
|
||||||
copy(&item->string.string, text);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
@ -577,6 +650,9 @@ enum Command_Types{
|
||||||
Cmd_TableOfContents,
|
Cmd_TableOfContents,
|
||||||
Cmd_Todo,
|
Cmd_Todo,
|
||||||
Cmd_Include,
|
Cmd_Include,
|
||||||
|
Cmd_MetaParse,
|
||||||
|
Cmd_DocList,
|
||||||
|
Cmd_DocFull,
|
||||||
// never below this
|
// never below this
|
||||||
Cmd_COUNT,
|
Cmd_COUNT,
|
||||||
};
|
};
|
||||||
|
@ -606,6 +682,9 @@ get_enriched_commands(){
|
||||||
enriched_commands_global_array[Cmd_TableOfContents] = make_lit_string("TABLE_OF_CONTENTS");
|
enriched_commands_global_array[Cmd_TableOfContents] = make_lit_string("TABLE_OF_CONTENTS");
|
||||||
enriched_commands_global_array[Cmd_Todo] = make_lit_string("TODO");
|
enriched_commands_global_array[Cmd_Todo] = make_lit_string("TODO");
|
||||||
enriched_commands_global_array[Cmd_Include] = make_lit_string("INCLUDE");
|
enriched_commands_global_array[Cmd_Include] = make_lit_string("INCLUDE");
|
||||||
|
enriched_commands_global_array[Cmd_MetaParse] = make_lit_string("META_PARSE");
|
||||||
|
enriched_commands_global_array[Cmd_DocList] = make_lit_string("DOC_LIST");
|
||||||
|
enriched_commands_global_array[Cmd_DocFull] = make_lit_string("DOC_FULL");
|
||||||
}
|
}
|
||||||
return(enriched_commands_global_array);
|
return(enriched_commands_global_array);
|
||||||
}
|
}
|
||||||
|
@ -867,6 +946,59 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
case Cmd_MetaParse:
|
||||||
|
{
|
||||||
|
String name = {0};
|
||||||
|
String file = {0};
|
||||||
|
if (extract_command_body(l, &i, &name)){
|
||||||
|
if (extract_command_body(l, &i, &file)){
|
||||||
|
if (!create_meta_unit(doc_system, name, file)){
|
||||||
|
char space[512];
|
||||||
|
String str = make_fixed_width_string(space);
|
||||||
|
append(&str, "parse failed for ");
|
||||||
|
append(&str, file);
|
||||||
|
add_error(&builder, str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
report_error_missing_body(&builder, command_string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
report_error_missing_body(&builder, command_string);
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case Cmd_DocList:
|
||||||
|
case Cmd_DocFull:
|
||||||
|
{
|
||||||
|
String name = {0};
|
||||||
|
if (extract_command_body(l, &i, &name)){
|
||||||
|
String mangle = {0};
|
||||||
|
extract_command_body(l, &i, &mangle);
|
||||||
|
|
||||||
|
Abstract_Item *item = get_item_by_name(doc_system->meta_list, name);
|
||||||
|
if (item != 0){
|
||||||
|
u32 mangle_rule = MangleRule_None;
|
||||||
|
if (match_part(mangle, "mangle:")){
|
||||||
|
String mangle_name = substr_tail(mangle, sizeof("mangle:")-1);
|
||||||
|
mangle_name = skip_chop_whitespace(mangle_name);
|
||||||
|
mangle_rule = get_mangle_rule(mangle_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (match_index == Cmd_DocList){
|
||||||
|
add_doc_list(&builder, item->unit, mangle_rule);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
add_doc_full(&builder, item->unit, mangle_rule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
report_error_missing_body(&builder, command_string);
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
char space[512];
|
char space[512];
|
||||||
|
@ -919,7 +1051,7 @@ get_unresolved_includes(Document_System *doc_system){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
resolve_all_includes(Document_System *doc_system, char *src_directory){
|
resolve_all_includes(Document_System *doc_system){
|
||||||
for (;doc_system->unresolved_includes.count > 0;){
|
for (;doc_system->unresolved_includes.count > 0;){
|
||||||
Unresolved_Include_Array includes = get_unresolved_includes(doc_system);
|
Unresolved_Include_Array includes = get_unresolved_includes(doc_system);
|
||||||
clear_list(&doc_system->unresolved_includes);
|
clear_list(&doc_system->unresolved_includes);
|
||||||
|
@ -932,7 +1064,7 @@ resolve_all_includes(Document_System *doc_system, char *src_directory){
|
||||||
if (inc_doc == 0){
|
if (inc_doc == 0){
|
||||||
String source_text = item->include.name;
|
String source_text = item->include.name;
|
||||||
Enriched_Text *text = fm_push_array(Enriched_Text, 1);
|
Enriched_Text *text = fm_push_array(Enriched_Text, 1);
|
||||||
*text = load_enriched_text(src_directory, source_text.str);
|
*text = load_enriched_text(doc_system->src_dir, source_text.str);
|
||||||
inc_doc = make_document_from_text(doc_system, source_text.str, source_text.str, text);
|
inc_doc = make_document_from_text(doc_system, source_text.str, source_text.str, text);
|
||||||
}
|
}
|
||||||
item->include.document = inc_doc;
|
item->include.document = inc_doc;
|
||||||
|
@ -1143,7 +1275,7 @@ output_begin_link(Document_System *doc_system, String *out, String l){
|
||||||
l.size--;
|
l.size--;
|
||||||
}
|
}
|
||||||
append(out, "href='");
|
append(out, "href='");
|
||||||
if (match_part_sc(l, "document:")){
|
if (match_part(l, "document:")){
|
||||||
String doc_name = substr_tail(l, sizeof("document:")-1);
|
String doc_name = substr_tail(l, sizeof("document:")-1);
|
||||||
Abstract_Item *doc_lookup = get_item_by_name(doc_system->doc_list, doc_name);
|
Abstract_Item *doc_lookup = get_item_by_name(doc_system->doc_list, doc_name);
|
||||||
if (doc_lookup){
|
if (doc_lookup){
|
||||||
|
@ -1181,7 +1313,7 @@ output_image(Document_System *doc_system, String *out, String l, String l2){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match_part_sc(l, "image:")){
|
if (match_part(l, "image:")){
|
||||||
String img_name = substr_tail(l, sizeof("image:")-1);
|
String img_name = substr_tail(l, sizeof("image:")-1);
|
||||||
Abstract_Item *img_lookup = get_item_by_name(doc_system->img_list, img_name);
|
Abstract_Item *img_lookup = get_item_by_name(doc_system->img_list, img_name);
|
||||||
|
|
||||||
|
@ -1210,7 +1342,7 @@ output_image(Document_System *doc_system, String *out, String l, String l2){
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
output_video(String *out, String l){
|
output_video(String *out, String l){
|
||||||
if (match_part_sc(l, "youtube:")){
|
if (match_part(l, "youtube:")){
|
||||||
i32 pixel_width = HTML_WIDTH;
|
i32 pixel_width = HTML_WIDTH;
|
||||||
i32 pixel_height = (i32)(pixel_width * 0.5625f);
|
i32 pixel_height = (i32)(pixel_width * 0.5625f);
|
||||||
|
|
||||||
|
@ -1288,200 +1420,6 @@ output_end_item(String *out){
|
||||||
append(out, "</li>");
|
append(out, "</li>");
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
|
||||||
write_enriched_text_html(String *out, Enriched_Text *text, Document_System *doc_system, Section_Counter *section_counter){
|
|
||||||
String source = text->source;
|
|
||||||
|
|
||||||
append(out, "<div>");
|
|
||||||
|
|
||||||
for (String line = get_first_double_line(source);
|
|
||||||
line.str;
|
|
||||||
line = get_next_double_line(source, line)){
|
|
||||||
String l = skip_chop_whitespace(line);
|
|
||||||
output_begin_paragraph(out);
|
|
||||||
|
|
||||||
i32 start = 0, i = 0;
|
|
||||||
for (; i < l.size; ++i){
|
|
||||||
char ch = l.str[i];
|
|
||||||
if (ch == '\\'){
|
|
||||||
output_plain_old_text(out, substr(l, start, i - start));
|
|
||||||
|
|
||||||
i32 command_start = i + 1;
|
|
||||||
i32 command_end = command_start;
|
|
||||||
for (; command_end < l.size; ++command_end){
|
|
||||||
if (!char_is_alpha_numeric(l.str[command_end])){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (command_end == command_start){
|
|
||||||
if (command_end < l.size && l.str[command_end] == '\\'){
|
|
||||||
++command_end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String command_string = substr(l, command_start, command_end - command_start);
|
|
||||||
|
|
||||||
String *enriched_commands = get_enriched_commands();
|
|
||||||
u32 enriched_commands_count = get_enriched_commands_count();
|
|
||||||
|
|
||||||
i = command_end;
|
|
||||||
|
|
||||||
i32 match_index = 0;
|
|
||||||
if (!string_set_match(enriched_commands, enriched_commands_count, command_string, &match_index)){
|
|
||||||
match_index = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (match_index){
|
|
||||||
case Cmd_BackSlash: append(out, "\\"); break;
|
|
||||||
|
|
||||||
case Cmd_BeginStyle:
|
|
||||||
{
|
|
||||||
String body_text = {0};
|
|
||||||
b32 has_body = extract_command_body(l, &i, &body_text);
|
|
||||||
if (has_body){
|
|
||||||
output_begin_style(out, body_text);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
report_error_html_missing_body(out, command_string);
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_EndStyle:
|
|
||||||
{
|
|
||||||
output_end_style(out);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
// TODO(allen): upgrade this bs
|
|
||||||
case Cmd_DocumentLink:
|
|
||||||
{
|
|
||||||
String body_text = {0};
|
|
||||||
b32 has_body = extract_command_body(l, &i, &body_text);
|
|
||||||
if (has_body){
|
|
||||||
output_document_link(out, body_text);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
report_error_html_missing_body(out, command_string);
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_BeginList:
|
|
||||||
{
|
|
||||||
output_begin_list(out);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_EndList:
|
|
||||||
{
|
|
||||||
output_end_list(out);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_BeginItem:
|
|
||||||
{
|
|
||||||
output_begin_item(out, section_counter);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_EndItem:
|
|
||||||
{
|
|
||||||
output_end_item(out);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_BeginLink:
|
|
||||||
{
|
|
||||||
String body_text = {0};
|
|
||||||
b32 has_body = extract_command_body(l, &i, &body_text);
|
|
||||||
if (has_body){
|
|
||||||
output_begin_link(doc_system, out, body_text);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
report_error_html_missing_body(out, command_string);
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_EndLink:
|
|
||||||
{
|
|
||||||
output_end_link(out);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_Image:
|
|
||||||
{
|
|
||||||
String body_text = {0};
|
|
||||||
b32 has_body = extract_command_body(l, &i, &body_text);
|
|
||||||
if (has_body){
|
|
||||||
String size_parameter = {0};
|
|
||||||
extract_command_body(l, &i, &size_parameter);
|
|
||||||
output_image(doc_system, out, body_text, size_parameter);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
report_error_html_missing_body(out, command_string);
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_Video:
|
|
||||||
{
|
|
||||||
String body_text = {0};
|
|
||||||
b32 has_body = extract_command_body(l, &i, &body_text);
|
|
||||||
if (has_body){
|
|
||||||
output_video(out, body_text);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
report_error_html_missing_body(out, command_string);
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_Section:
|
|
||||||
{
|
|
||||||
String body_text = {0};
|
|
||||||
b32 has_body = extract_command_body(l, &i, &body_text);
|
|
||||||
if (has_body){
|
|
||||||
String extra_text = {0};
|
|
||||||
extract_command_body(l, &i, &extra_text);
|
|
||||||
output_begin_section(out, section_counter, body_text, extra_text);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
report_error_html_missing_body(out, command_string);
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_EndSection:
|
|
||||||
{
|
|
||||||
output_end_section(out, section_counter);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_Version:
|
|
||||||
{
|
|
||||||
append(out, VERSION);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case Cmd_TableOfContents:
|
|
||||||
{
|
|
||||||
String str = make_lit_string("Cmd_TableOfContents does not work in this system");
|
|
||||||
output_error(out, str);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
char space[512];
|
|
||||||
String str = make_fixed_width_string(space);
|
|
||||||
append(&str, "unrecognized command ");
|
|
||||||
append(&str, command_string);
|
|
||||||
output_error(out, str);
|
|
||||||
}break;
|
|
||||||
}
|
|
||||||
|
|
||||||
start = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start != i){
|
|
||||||
output_plain_old_text(out, substr(l, start, i - start));
|
|
||||||
}
|
|
||||||
|
|
||||||
output_end_paragraph(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
append(out, "</div>");
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
print_item_in_list(String *out, String name, char *id_postfix){
|
print_item_in_list(String *out, String name, char *id_postfix){
|
||||||
append(out, "<li><a href='#");
|
append(out, "<li><a href='#");
|
||||||
|
@ -1851,22 +1789,10 @@ print_function_docs(String *out, String name, String doc_string){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
print_item_html(String *out, Used_Links *used, Item_Node *item, char *id_postfix, char *section, i32 I, Alternate_Name *alt_name, i32 alt_name_type){
|
print_item_html(String *out, Used_Links *used, Item_Node *item, char *id_postfix, char *section, i32 I, u32 mangle_rule){
|
||||||
Temp temp = fm_begin_temp();
|
Temp temp = fm_begin_temp();
|
||||||
|
|
||||||
String name = item->name;
|
String name = apply_mangle_rule(item->name, mangle_rule);
|
||||||
|
|
||||||
switch (alt_name_type){
|
|
||||||
case AltName_Macro:
|
|
||||||
{
|
|
||||||
name = alt_name->macro;
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case AltName_Public_Name:
|
|
||||||
{
|
|
||||||
name = alt_name->public_name;
|
|
||||||
}break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTE(allen):
|
/* NOTE(allen):
|
||||||
Open a div for the whole item.
|
Open a div for the whole item.
|
||||||
|
@ -2221,31 +2147,13 @@ doc_item_html(Document_Output_System sys, Document_Item *item, b32 head){
|
||||||
if (head){
|
if (head){
|
||||||
append(sys.out, "<ul>");
|
append(sys.out, "<ul>");
|
||||||
|
|
||||||
|
Mangle_Rule mangle_rule = item->unit_elements.mangle_rule;
|
||||||
Meta_Unit *unit = item->unit_elements.unit;
|
Meta_Unit *unit = item->unit_elements.unit;
|
||||||
Alternate_Names_Array *alt_names = item->unit_elements.alt_names;
|
|
||||||
i32 count = unit->set.count;
|
i32 count = unit->set.count;
|
||||||
|
|
||||||
switch (item->unit_elements.alt_name_type){
|
|
||||||
case AltName_Standard:
|
|
||||||
{
|
|
||||||
for (i32 i = 0; i < count; ++i){
|
for (i32 i = 0; i < count; ++i){
|
||||||
print_item_in_list(sys.out, unit->set.items[i].name, "_doc");
|
String name = apply_mangle_rule(unit->set.items[i].name, mangle_rule);
|
||||||
}
|
print_item_in_list(sys.out, name, "_doc");
|
||||||
}break;
|
|
||||||
|
|
||||||
case AltName_Macro:
|
|
||||||
{
|
|
||||||
for (i32 i = 0; i < count; ++i){
|
|
||||||
print_item_in_list(sys.out, alt_names->names[i].macro, "_doc");
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case AltName_Public_Name:
|
|
||||||
{
|
|
||||||
for (i32 i = 0; i < count; ++i){
|
|
||||||
print_item_in_list(sys.out, alt_names->names[i].public_name, "_doc");
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
append(sys.out, "</ul>");
|
append(sys.out, "</ul>");
|
||||||
|
@ -2255,8 +2163,8 @@ doc_item_html(Document_Output_System sys, Document_Item *item, b32 head){
|
||||||
case Doc_DocFull:
|
case Doc_DocFull:
|
||||||
{
|
{
|
||||||
if (head){
|
if (head){
|
||||||
|
Mangle_Rule mangle_rule = item->unit_elements.mangle_rule;
|
||||||
Meta_Unit *unit = item->unit_elements.unit;
|
Meta_Unit *unit = item->unit_elements.unit;
|
||||||
Alternate_Names_Array *alt_names = item->unit_elements.alt_names;
|
|
||||||
i32 count = unit->set.count;
|
i32 count = unit->set.count;
|
||||||
|
|
||||||
char section_space[32];
|
char section_space[32];
|
||||||
|
@ -2264,17 +2172,9 @@ doc_item_html(Document_Output_System sys, Document_Item *item, b32 head){
|
||||||
append_section_number_reduced(§ion_str, sys.section_counter, 1);
|
append_section_number_reduced(§ion_str, sys.section_counter, 1);
|
||||||
terminate_with_null(§ion_str);
|
terminate_with_null(§ion_str);
|
||||||
|
|
||||||
if (alt_names){
|
|
||||||
i32 I = 1;
|
i32 I = 1;
|
||||||
for (i32 i = 0; i < count; ++i, ++I){
|
for (i32 i = 0; i < count; ++i, ++I){
|
||||||
print_item_html(sys.out, sys.used_links, &unit->set.items[i], "_doc", section_str.str, I, &alt_names->names[i], item->unit_elements.alt_name_type);
|
print_item_html(sys.out, sys.used_links, &unit->set.items[i], "_doc", section_str.str, I, mangle_rule);
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
i32 I = 1;
|
|
||||||
for (i32 i = 0; i < count; ++i, ++I){
|
|
||||||
print_item_html(sys.out, sys.used_links, &unit->set.items[i], "_doc", section_str.str, I, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
|
|
|
@ -41,146 +41,10 @@
|
||||||
// Meta Parse Rules
|
// Meta Parse Rules
|
||||||
//
|
//
|
||||||
|
|
||||||
internal void
|
|
||||||
do_html_output(Document_System *doc_system, char *dst_directory, Abstract_Item *doc){
|
|
||||||
String out = make_string_cap(fm__push(10 << 20), 0, 10 << 20);
|
|
||||||
Assert(out.str != 0);
|
|
||||||
|
|
||||||
char doc_link[256];
|
|
||||||
if (doc_get_link_string(doc, doc_link, sizeof(doc_link))){
|
|
||||||
generate_document_html(&out, doc_system, doc);
|
|
||||||
char *name = fm_str(dst_directory, "/", doc_link);
|
|
||||||
fm_write_file(name, out.str, out.size);
|
|
||||||
out.size = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(allen): replace the documentation declaration system with a straight up enriched text system
|
|
||||||
internal Abstract_Item*
|
internal Abstract_Item*
|
||||||
generate_4coder_docs(Document_System *doc_system, char *code_directory, char *src_directory){
|
generate_page(Document_System *doc_system, char *source_text, char *big_title, char *small_name){
|
||||||
Meta_Unit *custom_types_unit = fm_push_array(Meta_Unit, 1);
|
|
||||||
Meta_Unit *lexer_funcs_unit = fm_push_array(Meta_Unit, 1);
|
|
||||||
Meta_Unit *lexer_types_unit = fm_push_array(Meta_Unit, 1);
|
|
||||||
Meta_Unit *string_unit = fm_push_array(Meta_Unit, 1);
|
|
||||||
Meta_Unit *custom_funcs_unit = fm_push_array(Meta_Unit, 1);
|
|
||||||
|
|
||||||
Enriched_Text *introduction = fm_push_array(Enriched_Text, 1);
|
|
||||||
Enriched_Text *lexer_introduction = fm_push_array(Enriched_Text, 1);
|
|
||||||
|
|
||||||
// NOTE(allen): Parse the code.
|
|
||||||
*custom_types_unit = compile_meta_unit(code_directory, "4coder_API/types.h", ExpandArray(meta_keywords));
|
|
||||||
Assert(custom_types_unit->count != 0);
|
|
||||||
|
|
||||||
*lexer_funcs_unit = compile_meta_unit(code_directory, "4cpp/4cpp_lexer.h", ExpandArray(meta_keywords));
|
|
||||||
Assert(lexer_funcs_unit->count != 0);
|
|
||||||
|
|
||||||
*lexer_types_unit = compile_meta_unit(code_directory, "4cpp/4cpp_lexer_types.h", ExpandArray(meta_keywords));
|
|
||||||
Assert(lexer_types_unit->count != 0);
|
|
||||||
|
|
||||||
*string_unit = compile_meta_unit(code_directory, "string/internal_4coder_string.cpp", ExpandArray(meta_keywords));
|
|
||||||
Assert(string_unit->count != 0);
|
|
||||||
|
|
||||||
*custom_funcs_unit = compile_meta_unit(code_directory, "4ed_api_implementation.cpp", ExpandArray(meta_keywords));
|
|
||||||
Assert(custom_funcs_unit->count != 0);
|
|
||||||
|
|
||||||
// NOTE(allen): Compute and store variations of the custom function names
|
|
||||||
Alternate_Names_Array *custom_func_names = fm_push_array(Alternate_Names_Array, 1);
|
|
||||||
i32 name_count = custom_funcs_unit->set.count;
|
|
||||||
custom_func_names->names = fm_push_array(Alternate_Name, name_count);
|
|
||||||
memset(custom_func_names->names, 0, sizeof(*custom_func_names->names)*name_count);
|
|
||||||
|
|
||||||
for (i32 i = 0; i < custom_funcs_unit->set.count; ++i){
|
|
||||||
String name_string = custom_funcs_unit->set.items[i].name;
|
|
||||||
String *macro = &custom_func_names->names[i].macro;
|
|
||||||
String *public_name = &custom_func_names->names[i].public_name;
|
|
||||||
|
|
||||||
*macro = str_alloc(name_string.size+4);
|
|
||||||
to_upper_ss(macro, name_string);
|
|
||||||
append_ss(macro, make_lit_string("_SIG"));
|
|
||||||
|
|
||||||
*public_name = str_alloc(name_string.size);
|
|
||||||
to_lower_ss(public_name, name_string);
|
|
||||||
|
|
||||||
fm_align();
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(allen): Load enriched text materials
|
|
||||||
*introduction = load_enriched_text(src_directory, "introduction.txt");
|
|
||||||
*lexer_introduction = load_enriched_text(src_directory, "lexer_introduction.txt");
|
|
||||||
|
|
||||||
// NOTE(allen): Put together the abstract document
|
|
||||||
Document_Builder builder = begin_document_description(doc_system, "4coder API Docs", "custom_docs", true);
|
|
||||||
|
|
||||||
add_table_of_contents(&builder);
|
|
||||||
|
|
||||||
begin_section(&builder, "Introduction", "introduction");
|
|
||||||
add_enriched_text(&builder, introduction);
|
|
||||||
end_section(&builder);
|
|
||||||
|
|
||||||
begin_section(&builder, "4coder Systems", "4coder_systems");
|
|
||||||
add_todo(&builder);
|
|
||||||
end_section(&builder);
|
|
||||||
|
|
||||||
begin_section(&builder, "Types and Functions", "types_and_functions");
|
|
||||||
{
|
|
||||||
begin_section(&builder, "Function List", 0);
|
|
||||||
add_element_list(&builder, custom_funcs_unit, custom_func_names, AltName_Public_Name);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "Type List", 0);
|
|
||||||
add_element_list(&builder, custom_types_unit);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "Function Descriptions", 0);
|
|
||||||
add_full_elements(&builder, custom_funcs_unit, custom_func_names, AltName_Public_Name);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "Type Descriptions", 0);
|
|
||||||
add_full_elements(&builder, custom_types_unit);
|
|
||||||
end_section(&builder);
|
|
||||||
}
|
|
||||||
end_section(&builder);
|
|
||||||
|
|
||||||
begin_section(&builder, "String Library", "string_library");
|
|
||||||
{
|
|
||||||
begin_section(&builder, "String Library Intro", 0);
|
|
||||||
add_todo(&builder);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "String Function List", 0);
|
|
||||||
add_element_list(&builder, string_unit);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "String Function Descriptions", 0);
|
|
||||||
add_full_elements(&builder, string_unit);
|
|
||||||
end_section(&builder);
|
|
||||||
}
|
|
||||||
end_section(&builder);
|
|
||||||
|
|
||||||
begin_section(&builder, "Lexer Library", "lexer_library");
|
|
||||||
{
|
|
||||||
begin_section(&builder, "Lexer Intro", 0);
|
|
||||||
add_enriched_text(&builder, lexer_introduction);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "Lexer Function List", 0);
|
|
||||||
add_element_list(&builder, lexer_funcs_unit);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "Lexer Type List", 0);
|
|
||||||
add_element_list(&builder, lexer_types_unit);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "Lexer Function Descriptions", 0);
|
|
||||||
add_full_elements(&builder, lexer_funcs_unit);
|
|
||||||
end_section(&builder);
|
|
||||||
begin_section(&builder, "Lexer Type Descriptions", 0);
|
|
||||||
add_full_elements(&builder, lexer_types_unit);
|
|
||||||
end_section(&builder);
|
|
||||||
}
|
|
||||||
end_section(&builder);
|
|
||||||
|
|
||||||
end_document_description(&builder);
|
|
||||||
|
|
||||||
return(builder.doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal Abstract_Item*
|
|
||||||
generate_page(Document_System *doc_system, char *code_directory, char *src_directory, char *source_text, char *big_title, char *small_name){
|
|
||||||
Enriched_Text *home = fm_push_array(Enriched_Text, 1);
|
Enriched_Text *home = fm_push_array(Enriched_Text, 1);
|
||||||
*home = load_enriched_text(src_directory, source_text);
|
*home = load_enriched_text(doc_system->src_dir, source_text);
|
||||||
|
|
||||||
Abstract_Item *doc = make_document_from_text(doc_system, big_title, small_name, home);
|
Abstract_Item *doc = make_document_from_text(doc_system, big_title, small_name, home);
|
||||||
if (doc == 0){
|
if (doc == 0){
|
||||||
|
@ -190,15 +54,6 @@ generate_page(Document_System *doc_system, char *code_directory, char *src_direc
|
||||||
return(doc);
|
return(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal String
|
|
||||||
push_string(i32 size){
|
|
||||||
String str = {0};
|
|
||||||
str.memory_size = size;
|
|
||||||
str.str = fm_push_array(char, size);
|
|
||||||
fm_align();
|
|
||||||
return(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
do_image_resize(char *src_file, char *dst_file, char *extension, i32 w, i32 h){
|
do_image_resize(char *src_file, char *dst_file, char *extension, i32 w, i32 h){
|
||||||
Temp temp = fm_begin_temp();
|
Temp temp = fm_begin_temp();
|
||||||
|
@ -223,72 +78,47 @@ internal void
|
||||||
generate_site(char *code_directory, char *asset_directory, char *src_directory, char *dst_directory){
|
generate_site(char *code_directory, char *asset_directory, char *src_directory, char *dst_directory){
|
||||||
fm_clear_folder(dst_directory);
|
fm_clear_folder(dst_directory);
|
||||||
|
|
||||||
Document_System doc_system = create_document_system();
|
Document_System doc_system = create_document_system(code_directory, asset_directory, src_directory);
|
||||||
|
|
||||||
struct Site_Asset{
|
add_image_description(&doc_system, "4coder_logo_low_green.png", "png", "4coder_logo");
|
||||||
char *filename;
|
add_image_description(&doc_system, "screen_1.png", "png", "screen_1");
|
||||||
char *extension;
|
add_image_description(&doc_system, "screen_2.png", "png", "screen_2");
|
||||||
char *name;
|
add_image_description(&doc_system, "screen_3.png", "png", "screen_3");
|
||||||
u32 type;
|
add_generic_file (&doc_system, "4coder_icon.ico", "ico", "4coder_icon");
|
||||||
};
|
|
||||||
enum Site_Asset_Type{
|
|
||||||
SiteAsset_None,
|
|
||||||
SiteAsset_Generic,
|
|
||||||
SiteAsset_Image,
|
|
||||||
};
|
|
||||||
|
|
||||||
Site_Asset asset_list[] = {
|
|
||||||
{"4coder_logo_low_green.png", "png", "4coder_logo", SiteAsset_Image },
|
|
||||||
{"screen_1.png", "png", "screen_1", SiteAsset_Image },
|
|
||||||
{"screen_2.png", "png", "screen_2", SiteAsset_Image },
|
|
||||||
{"screen_3.png", "png", "screen_3", SiteAsset_Image },
|
|
||||||
{"4coder_icon.ico", "ico", "4coder_icon", SiteAsset_Generic },
|
|
||||||
};
|
|
||||||
|
|
||||||
for (u32 i = 0; i < ArrayCount(asset_list); ++i){
|
|
||||||
Site_Asset *asset = &asset_list[i];
|
|
||||||
char *name = fm_str(asset_directory, "/", asset->filename);
|
|
||||||
switch (asset_list[i].type){
|
|
||||||
case SiteAsset_Generic:
|
|
||||||
{
|
|
||||||
add_generic_file(&doc_system, name, asset->extension, asset->name);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case SiteAsset_Image:
|
|
||||||
{
|
|
||||||
add_image_description(&doc_system, name, asset->extension, asset->name);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
default: InvalidCodePath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char *cdir = code_directory;
|
|
||||||
char *sdir = src_directory;
|
|
||||||
Document_System *docs = &doc_system;
|
Document_System *docs = &doc_system;
|
||||||
|
|
||||||
generate_4coder_docs(docs, cdir, sdir);
|
// TODO(allen): From the text file get "Big Title" and "smallname".
|
||||||
|
generate_page(docs, "home.txt" , "4coder Home" , "home" );
|
||||||
|
generate_page(docs, "docs.txt" , "4coder API Docs" , "custom_docs" );
|
||||||
|
generate_page(docs, "feature_list.txt", "4coder Feature List", "features" );
|
||||||
|
generate_page(docs, "binding_list.txt", "4coder Binding List", "bindings" );
|
||||||
|
generate_page(docs, "roadmap.txt" , "4coder Roadmap" , "roadmap" );
|
||||||
|
generate_page(docs, "tutorials.txt" , "4coder Tutorials" , "tutorials" );
|
||||||
|
|
||||||
// TODO(allen): From the text file get the "Big Title" and "smallname".
|
// NOTE(allen): Create a list of the primary documents to generate.
|
||||||
generate_page(docs, cdir, sdir, "home.txt" , "4coder Home" , "home" );
|
|
||||||
generate_page(docs, cdir, sdir, "docs.txt" , "4coder API Docs" , "custom_docs_2" );
|
|
||||||
generate_page(docs, cdir, sdir, "feature_list.txt", "4coder Feature List", "features" );
|
|
||||||
generate_page(docs, cdir, sdir, "binding_list.txt", "4coder Binding List", "bindings" );
|
|
||||||
generate_page(docs, cdir, sdir, "roadmap.txt" , "4coder Roadmap" , "roadmap" );
|
|
||||||
generate_page(docs, cdir, sdir, "tutorials.txt" , "4coder Tutorials" , "tutorials" );
|
|
||||||
|
|
||||||
// NOTE(allen): Create a list of the documents we want to generate.
|
|
||||||
Abstract_Item_Array original_documents = get_abstract_item_array(&doc_system.doc_list);
|
Abstract_Item_Array original_documents = get_abstract_item_array(&doc_system.doc_list);
|
||||||
|
|
||||||
// NOTE(allen): Cross link all the includes and pull in any non-primary documents.
|
// NOTE(allen): Cross link all the includes and pull in any non-primary documents.
|
||||||
resolve_all_includes(&doc_system, src_directory);
|
resolve_all_includes(&doc_system);
|
||||||
|
|
||||||
|
// NOTE(allen): Generate the html from the primary documents and publish them.
|
||||||
|
String out = make_string_cap(fm__push(10 << 20), 0, 10 << 20);
|
||||||
|
Assert(out.str != 0);
|
||||||
|
|
||||||
// NOTE(allen): Generate the html from the documents and publish them
|
|
||||||
Abstract_Item **doc_ptr = original_documents.items;
|
Abstract_Item **doc_ptr = original_documents.items;
|
||||||
for (u32 j = 0; j < original_documents.count; ++j, ++doc_ptr){
|
for (u32 j = 0; j < original_documents.count; ++j, ++doc_ptr){
|
||||||
Abstract_Item *doc = *doc_ptr;
|
Abstract_Item *doc = *doc_ptr;
|
||||||
Assert(doc->item_type == ItemType_Document);
|
Assert(doc->item_type == ItemType_Document);
|
||||||
do_html_output(&doc_system, dst_directory, doc);
|
|
||||||
|
char doc_link[256];
|
||||||
|
if (doc_get_link_string(doc, doc_link, sizeof(doc_link))){
|
||||||
|
generate_document_html(&out, &doc_system, doc);
|
||||||
|
|
||||||
|
char *name = fm_str(dst_directory, "/", doc_link);
|
||||||
|
fm_write_file(name, out.str, out.size);
|
||||||
|
out.size = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): Publish files
|
// NOTE(allen): Publish files
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
\SECTION{Types and Functions}{types_and_functions}
|
\SECTION{Types and Functions}{types_and_functions}
|
||||||
|
|
||||||
\SECTION{Function List}
|
\SECTION{Function List}
|
||||||
\DOC_LIST{custom_funcs}
|
\DOC_LIST{custom_funcs}{mangle:to lower}
|
||||||
\END_SECTION
|
\END_SECTION
|
||||||
|
|
||||||
\SECTION{Type List}
|
\SECTION{Type List}
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
\END_SECTION
|
\END_SECTION
|
||||||
|
|
||||||
\SECTION{Function Descriptions}
|
\SECTION{Function Descriptions}
|
||||||
\DOC_FULL{custom_funcs}
|
\DOC_FULL{custom_funcs}{mangle:to lower}
|
||||||
\END_SECTION
|
\END_SECTION
|
||||||
|
|
||||||
\SECTION{Type Descriptions}
|
\SECTION{Type Descriptions}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
1
|
1
|
||||||
0
|
0
|
||||||
102
|
103
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
// 4tech_standard_preamble.h
|
// 4ed_standard_preamble.h
|
||||||
#if !defined(FTECH_INTEGERS)
|
#if !defined(FTECH_INTEGERS)
|
||||||
#define FTECH_INTEGERS
|
#define FTECH_INTEGERS
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
typedef int8_t i8_4tech;
|
typedef int8_t i8_4ed;
|
||||||
typedef int16_t i16_4tech;
|
typedef int16_t i16_4ed;
|
||||||
typedef int32_t i32_4tech;
|
typedef int32_t i32_4ed;
|
||||||
typedef int64_t i64_4tech;
|
typedef int64_t i64_4ed;
|
||||||
|
|
||||||
typedef uint8_t u8_4tech;
|
typedef uint8_t u8_4ed;
|
||||||
typedef uint16_t u16_4tech;
|
typedef uint16_t u16_4ed;
|
||||||
typedef uint32_t u32_4tech;
|
typedef uint32_t u32_4ed;
|
||||||
typedef uint64_t u64_4tech;
|
typedef uint64_t u64_4ed;
|
||||||
|
|
||||||
#if defined(FTECH_32_BIT)
|
#if defined(FTECH_32_BIT)
|
||||||
typedef u32_4tech umem_4tech;
|
typedef u32_4ed umem_4ed;
|
||||||
#else
|
#else
|
||||||
typedef u64_4tech umem_4tech;
|
typedef u64_4ed umem_4ed;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef float f32_4tech;
|
typedef float f32_4ed;
|
||||||
typedef double f64_4tech;
|
typedef double f64_4ed;
|
||||||
|
|
||||||
typedef int8_t b8_4tech;
|
typedef int8_t b8_4ed;
|
||||||
typedef int32_t b32_4tech;
|
typedef int32_t b32_4ed;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(Assert)
|
#if !defined(Assert)
|
||||||
|
|
|
@ -19,7 +19,7 @@ internal_4coder_string.cpp - Base file for generating 4coder_string.h
|
||||||
FSTRING_BEGIN
|
FSTRING_BEGIN
|
||||||
// TOP
|
// TOP
|
||||||
|
|
||||||
#include "4tech_standard_preamble.h"
|
#include "4ed_standard_preamble.h"
|
||||||
|
|
||||||
#if !defined(FSTRING_LINK)
|
#if !defined(FSTRING_LINK)
|
||||||
# define FSTRING_LINK static
|
# define FSTRING_LINK static
|
||||||
|
@ -393,14 +393,21 @@ match_part_ccl(char *a, char *b, i32_4tech *len)/*
|
||||||
DOC_PARAM(len, If this call returns non-zero this parameter is used to output the length of b.)
|
DOC_PARAM(len, If this call returns non-zero this parameter is used to output the length of b.)
|
||||||
DOC(This call is similar to a match call, except that it is permitted for a to be longer than b.
|
DOC(This call is similar to a match call, except that it is permitted for a to be longer than b.
|
||||||
In other words this call returns non-zero if b is a prefix of a.) */{
|
In other words this call returns non-zero if b is a prefix of a.) */{
|
||||||
|
if (a == 0){
|
||||||
|
a = "";
|
||||||
|
}
|
||||||
|
if (b == 0){
|
||||||
|
b = "";
|
||||||
|
}
|
||||||
|
|
||||||
i32_4tech i;
|
i32_4tech i;
|
||||||
for (i = 0; b[i] != 0; ++i){
|
for (i = 0; b[i] != 0; ++i){
|
||||||
if (a[i] != b[i]){
|
if (a[i] != b[i]){
|
||||||
return 0;
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*len = i;
|
*len = i;
|
||||||
return 1;
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPP_NAME(match_part)
|
CPP_NAME(match_part)
|
||||||
|
@ -409,14 +416,17 @@ match_part_scl(String a, char *b, i32_4tech *len)/*
|
||||||
DOC_PARAM(len, If this call returns non-zero this parameter is used to output the length of b.)
|
DOC_PARAM(len, If this call returns non-zero this parameter is used to output the length of b.)
|
||||||
DOC(This call is similar to a match call, except that it is permitted for a to be longer than b.
|
DOC(This call is similar to a match call, except that it is permitted for a to be longer than b.
|
||||||
In other words this call returns non-zero if b is a prefix of a.) */{
|
In other words this call returns non-zero if b is a prefix of a.) */{
|
||||||
|
if (b == 0){
|
||||||
|
b = "";
|
||||||
|
}
|
||||||
i32_4tech i;
|
i32_4tech i;
|
||||||
for (i = 0; b[i] != 0; ++i){
|
for (i = 0; b[i] != 0; ++i){
|
||||||
if (a.str[i] != b[i] || i == a.size){
|
if (i == a.size || a.str[i] != b[i]){
|
||||||
return 0;
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*len = i;
|
*len = i;
|
||||||
return 1;
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPP_NAME(match_part)
|
CPP_NAME(match_part)
|
||||||
|
@ -457,14 +467,14 @@ match_part_ss(String a, String b)/*
|
||||||
DOC(This call is similar to a match call, except that it is permitted for a to be longer than b.
|
DOC(This call is similar to a match call, except that it is permitted for a to be longer than b.
|
||||||
In other words this call returns non-zero if b is a prefix of a.) */{
|
In other words this call returns non-zero if b is a prefix of a.) */{
|
||||||
if (a.size < b.size){
|
if (a.size < b.size){
|
||||||
return 0;
|
return(0);
|
||||||
}
|
}
|
||||||
for (i32_4tech i = 0; i < b.size; ++i){
|
for (i32_4tech i = 0; i < b.size; ++i){
|
||||||
if (a.str[i] != b.str[i]){
|
if (a.str[i] != b.str[i]){
|
||||||
return 0;
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPP_NAME(match_insensitive)
|
CPP_NAME(match_insensitive)
|
||||||
|
|
Loading…
Reference in New Issue