converted portion of the HTML doc generator to string append instead of fprintf

master
Allen Webster 2016-09-04 01:08:36 -04:00
parent 8fdff026af
commit a80e99d575
3 changed files with 537 additions and 904 deletions

File diff suppressed because one or more lines are too long

View File

@ -47,347 +47,201 @@ typedef struct Offset_String{
#if !defined(FCODER_STRING_H) #if !defined(FCODER_STRING_H)
#define FCODER_STRING_H #define FCODER_STRING_H
FSTRING_INLINE fstr_bool char_is_slash(char c); FSTRING_INLINE fstr_bool char_is_slash(char c);
FSTRING_INLINE char char_to_upper(char c); FSTRING_INLINE char char_to_upper(char c);
FSTRING_INLINE char char_to_lower(char c); FSTRING_INLINE char char_to_lower(char c);
FSTRING_INLINE fstr_bool char_is_whitespace(char c); FSTRING_INLINE fstr_bool char_is_whitespace(char c);
FSTRING_INLINE fstr_bool char_is_alpha_numeric(char c); FSTRING_INLINE fstr_bool char_is_alpha_numeric(char c);
FSTRING_INLINE fstr_bool char_is_alpha_numeric_true(char c); FSTRING_INLINE fstr_bool char_is_alpha_numeric_true(char c);
FSTRING_INLINE fstr_bool char_is_alpha(char c); FSTRING_INLINE fstr_bool char_is_alpha(char c);
FSTRING_INLINE fstr_bool char_is_alpha_true(char c); FSTRING_INLINE fstr_bool char_is_alpha_true(char c);
FSTRING_INLINE fstr_bool char_is_hex(char c); FSTRING_INLINE fstr_bool char_is_hex(char c);
FSTRING_INLINE fstr_bool char_is_numeric(char c); FSTRING_INLINE fstr_bool char_is_numeric(char c);
FSTRING_INLINE String string_zero(void); FSTRING_INLINE String string_zero(void);
FSTRING_INLINE String make_string_cap(void *str, int32_t size, int32_t mem_size); FSTRING_INLINE String make_string_cap(void *str, int32_t size, int32_t mem_size);
FSTRING_INLINE String make_string(void *str, int32_t size); FSTRING_INLINE String make_string(void *str, int32_t size);
#ifndef make_lit_string #ifndef make_lit_string
# define make_lit_string(s) (make_string_cap((char*)(s), sizeof(s)-1, sizeof(s))) # define make_lit_string(s) (make_string_cap((char*)(s), sizeof(s)-1, sizeof(s)))
#endif #endif
#ifndef make_fixed_width_string #ifndef make_fixed_width_string
# define make_fixed_width_string(s) (make_string_cap((char*)(s), 0, sizeof(s))) # define make_fixed_width_string(s) (make_string_cap((char*)(s), 0, sizeof(s)))
#endif #endif
#ifndef expand_str #ifndef expand_str
# define expand_str(s) ((s).str), ((s).size) # define expand_str(s) ((s).str), ((s).size)
#endif
FSTRING_LINK int32_t str_size(char *str);
FSTRING_INLINE String make_string_slowly(void *str);
FSTRING_INLINE String substr_tail(String str, int32_t start);
FSTRING_INLINE String substr(String str, int32_t start, int32_t size);
FSTRING_LINK String skip_whitespace(String str);
FSTRING_LINK String chop_whitespace(String str);
FSTRING_LINK String skip_chop_whitespace(String str);
FSTRING_INLINE String tailstr(String str);
FSTRING_LINK fstr_bool match_cc(char *a, char *b);
FSTRING_LINK fstr_bool match_sc(String a, char *b);
FSTRING_INLINE fstr_bool match_cs(char *a, String b);
FSTRING_LINK fstr_bool match_ss(String a, String b);
FSTRING_LINK fstr_bool match_part_ccl(char *a, char *b, int32_t *len);
FSTRING_LINK fstr_bool match_part_scl(String a, char *b, int32_t *len);
FSTRING_INLINE fstr_bool match_part_cc(char *a, char *b);
FSTRING_INLINE fstr_bool match_part_sc(String a, char *b);
FSTRING_LINK fstr_bool match_part_cs(char *a, String b);
FSTRING_LINK fstr_bool match_part_ss(String a, String b);
FSTRING_LINK fstr_bool match_insensitive_cc(char *a, char *b);
FSTRING_LINK fstr_bool match_insensitive_sc(String a, char *b);
FSTRING_INLINE fstr_bool match_insensitive_cs(char *a, String b);
FSTRING_LINK fstr_bool match_insensitive_ss(String a, String b);
FSTRING_LINK fstr_bool match_part_insensitive_ccl(char *a, char *b, int32_t *len);
FSTRING_LINK fstr_bool match_part_insensitive_scl(String a, char *b, int32_t *len);
FSTRING_INLINE fstr_bool match_part_insensitive_cc(char *a, char *b);
FSTRING_INLINE fstr_bool match_part_insensitive_sc(String a, char *b);
FSTRING_LINK fstr_bool match_part_insensitive_cs(char *a, String b);
FSTRING_LINK fstr_bool match_part_insensitive_ss(String a, String b);
FSTRING_LINK int32_t compare_cc(char *a, char *b);
FSTRING_LINK int32_t compare_sc(String a, char *b);
FSTRING_INLINE int32_t compare_cs(char *a, String b);
FSTRING_LINK int32_t compare_ss(String a, String b);
FSTRING_LINK int32_t find_c_char(char *str, int32_t start, char character);
FSTRING_LINK int32_t find_s_char(String str, int32_t start, char character);
FSTRING_LINK int32_t rfind_s_char(String str, int32_t start, char character);
FSTRING_LINK int32_t find_c_chars(char *str, int32_t start, char *characters);
FSTRING_LINK int32_t find_s_chars(String str, int32_t start, char *characters);
FSTRING_LINK int32_t find_substr_c(char *str, int32_t start, String seek);
FSTRING_LINK int32_t find_substr_s(String str, int32_t start, String seek);
FSTRING_LINK int32_t rfind_substr_s(String str, int32_t start, String seek);
FSTRING_LINK int32_t find_substr_insensitive_c(char *str, int32_t start, String seek);
FSTRING_LINK int32_t find_substr_insensitive_s(String str, int32_t start, String seek);
FSTRING_INLINE fstr_bool has_substr_c(char *s, String seek);
FSTRING_INLINE fstr_bool has_substr_s(String s, String seek);
FSTRING_INLINE fstr_bool has_substr_insensitive_c(char *s, String seek);
FSTRING_INLINE fstr_bool has_substr_insensitive_s(String s, String seek);
FSTRING_LINK int32_t copy_fast_unsafe_cc(char *dest, char *src);
FSTRING_LINK int32_t copy_fast_unsafe_cs(char *dest, String src);
FSTRING_LINK fstr_bool copy_checked_ss(String *dest, String src);
FSTRING_LINK fstr_bool copy_partial_sc(String *dest, char *src);
FSTRING_LINK fstr_bool copy_partial_ss(String *dest, String src);
FSTRING_INLINE int32_t copy_cc(char *dest, char *src);
FSTRING_INLINE void copy_ss(String *dest, String src);
FSTRING_INLINE void copy_sc(String *dest, char *src);
FSTRING_LINK fstr_bool append_checked_ss(String *dest, String src);
FSTRING_LINK fstr_bool append_partial_sc(String *dest, char *src);
FSTRING_LINK fstr_bool append_partial_ss(String *dest, String src);
FSTRING_LINK fstr_bool append_s_char(String *dest, char c);
FSTRING_INLINE fstr_bool append_ss(String *dest, String src);
FSTRING_INLINE fstr_bool append_sc(String *dest, char *src);
FSTRING_LINK fstr_bool terminate_with_null(String *str);
FSTRING_LINK fstr_bool append_padding(String *dest, char c, int32_t target_size);
FSTRING_LINK void replace_char(String *str, char replace, char with);
FSTRING_LINK void to_lower_cc(char *src, char *dst);
FSTRING_LINK void to_lower_ss(String *dst, String src);
FSTRING_LINK void to_lower_s(String *str);
FSTRING_LINK void to_upper_cc(char *src, char *dst);
FSTRING_LINK void to_upper_ss(String *dst, String src);
FSTRING_LINK void to_upper_s(String *str);
FSTRING_LINK void to_camel_cc(char *src, char *dst);
FSTRING_LINK int32_t int_to_str_size(int32_t x);
FSTRING_LINK fstr_bool int_to_str(String *dest, int32_t x);
FSTRING_LINK fstr_bool append_int_to_str(String *dest, int32_t x);
FSTRING_LINK int32_t u64_to_str_size(uint64_t x);
FSTRING_LINK fstr_bool u64_to_str(String *dest, uint64_t x);
FSTRING_LINK fstr_bool append_u64_to_str(String *dest, uint64_t x);
FSTRING_LINK int32_t float_to_str_size(float x);
FSTRING_LINK fstr_bool append_float_to_str(String *dest, float x);
FSTRING_LINK fstr_bool float_to_str(String *dest, float x);
FSTRING_LINK int32_t str_is_int_c(char *str);
FSTRING_LINK fstr_bool str_is_int_s(String str);
FSTRING_LINK int32_t str_to_int_c(char *str);
FSTRING_LINK int32_t str_to_int_s(String str);
FSTRING_LINK int32_t hexchar_to_int(char c);
FSTRING_LINK char int_to_hexchar(int32_t x);
FSTRING_LINK uint32_t hexstr_to_int(String str);
FSTRING_LINK fstr_bool color_to_hexstr(String *s, uint32_t color);
FSTRING_LINK fstr_bool hexstr_to_color(String s, uint32_t *out);
FSTRING_LINK int32_t reverse_seek_slash_pos(String str, int32_t pos);
FSTRING_INLINE int32_t reverse_seek_slash(String str);
FSTRING_INLINE String front_of_directory(String dir);
FSTRING_INLINE String path_of_directory(String dir);
FSTRING_LINK fstr_bool set_last_folder_sc(String *dir, char *folder_name, char slash);
FSTRING_LINK fstr_bool set_last_folder_ss(String *dir, String folder_name, char slash);
FSTRING_LINK String file_extension(String str);
FSTRING_LINK fstr_bool remove_extension(String *str);
FSTRING_LINK fstr_bool remove_last_folder(String *str);
FSTRING_LINK fstr_bool string_set_match_table(void *str_set, int32_t item_size, int32_t count, String str, int32_t *match_index);
FSTRING_LINK fstr_bool string_set_match(String *str_set, int32_t count, String str, int32_t *match_index);
#if !defined(FSTRING_C)
// NOTE(allen): This section is here to enable nicer names
// for C++ users who can have overloaded functions. None of
// these functions add new features.
FSTRING_INLINE String make_string(void *str, int32_t size, int32_t mem_size);
FSTRING_INLINE String substr(String str, int32_t start);
FSTRING_INLINE fstr_bool match(char *a, char *b);
FSTRING_INLINE fstr_bool match(String a, char *b);
FSTRING_INLINE fstr_bool match(char *a, String b);
FSTRING_INLINE fstr_bool match(String a, String b);
FSTRING_INLINE fstr_bool match_part(char *a, char *b, int32_t *len);
FSTRING_INLINE fstr_bool match_part(String a, char *b, int32_t *len);
FSTRING_INLINE fstr_bool match_part(char *a, char *b);
FSTRING_INLINE fstr_bool match_part(String a, char *b);
FSTRING_INLINE fstr_bool match_part(char *a, String b);
FSTRING_INLINE fstr_bool match_part(String a, String b);
FSTRING_INLINE fstr_bool match_insensitive(char *a, char *b);
FSTRING_INLINE fstr_bool match_insensitive(String a, char *b);
FSTRING_INLINE fstr_bool match_insensitive(char *a, String b);
FSTRING_INLINE fstr_bool match_insensitive(String a, String b);
FSTRING_INLINE fstr_bool match_part_insensitive(char *a, char *b, int32_t *len);
FSTRING_INLINE fstr_bool match_part_insensitive(String a, char *b, int32_t *len);
FSTRING_INLINE fstr_bool match_part_insensitive(char *a, char *b);
FSTRING_INLINE fstr_bool match_part_insensitive(String a, char *b);
FSTRING_INLINE fstr_bool match_part_insensitive(char *a, String b);
FSTRING_INLINE fstr_bool match_part_insensitive(String a, String b);
FSTRING_INLINE int32_t compare(char *a, char *b);
FSTRING_INLINE int32_t compare(String a, char *b);
FSTRING_INLINE int32_t compare(char *a, String b);
FSTRING_INLINE int32_t compare(String a, String b);
FSTRING_INLINE int32_t find(char *str, int32_t start, char character);
FSTRING_INLINE int32_t find(String str, int32_t start, char character);
FSTRING_INLINE int32_t rfind(String str, int32_t start, char character);
FSTRING_INLINE int32_t find(char *str, int32_t start, char *characters);
FSTRING_INLINE int32_t find(String str, int32_t start, char *characters);
FSTRING_INLINE int32_t find_substr(char *str, int32_t start, String seek);
FSTRING_INLINE int32_t find_substr(String str, int32_t start, String seek);
FSTRING_INLINE int32_t rfind_substr(String str, int32_t start, String seek);
FSTRING_INLINE int32_t find_substr_insensitive(char *str, int32_t start, String seek);
FSTRING_INLINE int32_t find_substr_insensitive(String str, int32_t start, String seek);
FSTRING_INLINE fstr_bool has_substr(char *s, String seek);
FSTRING_INLINE fstr_bool has_substr(String s, String seek);
FSTRING_INLINE fstr_bool has_substr_insensitive(char *s, String seek);
FSTRING_INLINE fstr_bool has_substr_insensitive(String s, String seek);
FSTRING_INLINE int32_t copy_fast_unsafe(char *dest, char *src);
FSTRING_INLINE int32_t copy_fast_unsafe(char *dest, String src);
FSTRING_INLINE fstr_bool copy_checked(String *dest, String src);
FSTRING_INLINE fstr_bool copy_partial(String *dest, char *src);
FSTRING_INLINE fstr_bool copy_partial(String *dest, String src);
FSTRING_INLINE int32_t copy(char *dest, char *src);
FSTRING_INLINE void copy(String *dest, String src);
FSTRING_INLINE void copy(String *dest, char *src);
FSTRING_INLINE fstr_bool append_checked(String *dest, String src);
FSTRING_INLINE fstr_bool append_partial(String *dest, char *src);
FSTRING_INLINE fstr_bool append_partial(String *dest, String src);
FSTRING_INLINE fstr_bool append(String *dest, char c);
FSTRING_INLINE fstr_bool append(String *dest, String src);
FSTRING_INLINE fstr_bool append(String *dest, char *src);
FSTRING_INLINE void to_lower(char *src, char *dst);
FSTRING_INLINE void to_lower(String *dst, String src);
FSTRING_INLINE void to_lower(String *str);
FSTRING_INLINE void to_upper(char *src, char *dst);
FSTRING_INLINE void to_upper(String *dst, String src);
FSTRING_INLINE void to_upper(String *str);
FSTRING_INLINE void to_camel(char *src, char *dst);
FSTRING_INLINE int32_t str_is_int(char *str);
FSTRING_INLINE fstr_bool str_is_int(String str);
FSTRING_INLINE int32_t str_to_int(char *str);
FSTRING_INLINE int32_t str_to_int(String str);
FSTRING_INLINE int32_t reverse_seek_slash(String str, int32_t pos);
FSTRING_INLINE fstr_bool set_last_folder(String *dir, char *folder_name, char slash);
FSTRING_INLINE fstr_bool set_last_folder(String *dir, String folder_name, char slash);
FSTRING_INLINE fstr_bool string_set_match(void *str_set, int32_t item_size, int32_t count, String str, int32_t *match_index);
#endif #endif
FSTRING_LINK int32_t str_size(char *str);
FSTRING_INLINE String make_string_slowly(void *str);
FSTRING_INLINE String substr_tail(String str, int32_t start);
FSTRING_INLINE String substr(String str, int32_t start, int32_t size);
FSTRING_LINK String skip_whitespace(String str);
FSTRING_LINK String chop_whitespace(String str);
FSTRING_LINK String skip_chop_whitespace(String str);
FSTRING_INLINE String tailstr(String str);
FSTRING_LINK fstr_bool match_cc(char *a, char *b);
FSTRING_LINK fstr_bool match_sc(String a, char *b);
FSTRING_INLINE fstr_bool match_cs(char *a, String b);
FSTRING_LINK fstr_bool match_ss(String a, String b);
FSTRING_LINK fstr_bool match_part_ccl(char *a, char *b, int32_t *len);
FSTRING_LINK fstr_bool match_part_scl(String a, char *b, int32_t *len);
FSTRING_INLINE fstr_bool match_part_cc(char *a, char *b);
FSTRING_INLINE fstr_bool match_part_sc(String a, char *b);
FSTRING_LINK fstr_bool match_part_cs(char *a, String b);
FSTRING_LINK fstr_bool match_part_ss(String a, String b);
FSTRING_LINK fstr_bool match_insensitive_cc(char *a, char *b);
FSTRING_LINK fstr_bool match_insensitive_sc(String a, char *b);
FSTRING_INLINE fstr_bool match_insensitive_cs(char *a, String b);
FSTRING_LINK fstr_bool match_insensitive_ss(String a, String b);
FSTRING_LINK fstr_bool match_part_insensitive_ccl(char *a, char *b, int32_t *len);
FSTRING_LINK fstr_bool match_part_insensitive_scl(String a, char *b, int32_t *len);
FSTRING_INLINE fstr_bool match_part_insensitive_cc(char *a, char *b);
FSTRING_INLINE fstr_bool match_part_insensitive_sc(String a, char *b);
FSTRING_LINK fstr_bool match_part_insensitive_cs(char *a, String b);
FSTRING_LINK fstr_bool match_part_insensitive_ss(String a, String b);
FSTRING_LINK int32_t compare_cc(char *a, char *b);
FSTRING_LINK int32_t compare_sc(String a, char *b);
FSTRING_INLINE int32_t compare_cs(char *a, String b);
FSTRING_LINK int32_t compare_ss(String a, String b);
FSTRING_LINK int32_t find_c_char(char *str, int32_t start, char character);
FSTRING_LINK int32_t find_s_char(String str, int32_t start, char character);
FSTRING_LINK int32_t rfind_s_char(String str, int32_t start, char character);
FSTRING_LINK int32_t find_c_chars(char *str, int32_t start, char *characters);
FSTRING_LINK int32_t find_s_chars(String str, int32_t start, char *characters);
FSTRING_LINK int32_t find_substr_c(char *str, int32_t start, String seek);
FSTRING_LINK int32_t find_substr_s(String str, int32_t start, String seek);
FSTRING_LINK int32_t rfind_substr_s(String str, int32_t start, String seek);
FSTRING_LINK int32_t find_substr_insensitive_c(char *str, int32_t start, String seek);
FSTRING_LINK int32_t find_substr_insensitive_s(String str, int32_t start, String seek);
FSTRING_INLINE fstr_bool has_substr_c(char *s, String seek);
FSTRING_INLINE fstr_bool has_substr_s(String s, String seek);
FSTRING_INLINE fstr_bool has_substr_insensitive_c(char *s, String seek);
FSTRING_INLINE fstr_bool has_substr_insensitive_s(String s, String seek);
FSTRING_LINK int32_t copy_fast_unsafe_cc(char *dest, char *src);
FSTRING_LINK int32_t copy_fast_unsafe_cs(char *dest, String src);
FSTRING_LINK fstr_bool copy_checked_ss(String *dest, String src);
FSTRING_LINK fstr_bool copy_partial_sc(String *dest, char *src);
FSTRING_LINK fstr_bool copy_partial_ss(String *dest, String src);
FSTRING_INLINE int32_t copy_cc(char *dest, char *src);
FSTRING_INLINE void copy_ss(String *dest, String src);
FSTRING_INLINE void copy_sc(String *dest, char *src);
FSTRING_LINK fstr_bool append_checked_ss(String *dest, String src);
FSTRING_LINK fstr_bool append_partial_sc(String *dest, char *src);
FSTRING_LINK fstr_bool append_partial_ss(String *dest, String src);
FSTRING_LINK fstr_bool append_s_char(String *dest, char c);
FSTRING_INLINE fstr_bool append_ss(String *dest, String src);
FSTRING_INLINE fstr_bool append_sc(String *dest, char *src);
FSTRING_LINK fstr_bool terminate_with_null(String *str);
FSTRING_LINK fstr_bool append_padding(String *dest, char c, int32_t target_size);
FSTRING_LINK void replace_char(String *str, char replace, char with);
FSTRING_LINK void to_lower_cc(char *src, char *dst);
FSTRING_LINK void to_lower_ss(String *dst, String src);
FSTRING_LINK void to_lower_s(String *str);
FSTRING_LINK void to_upper_cc(char *src, char *dst);
FSTRING_LINK void to_upper_ss(String *dst, String src);
FSTRING_LINK void to_upper_s(String *str);
FSTRING_LINK void to_camel_cc(char *src, char *dst);
FSTRING_LINK int32_t int_to_str_size(int32_t x);
FSTRING_LINK fstr_bool int_to_str(String *dest, int32_t x);
FSTRING_LINK fstr_bool append_int_to_str(String *dest, int32_t x);
FSTRING_LINK int32_t u64_to_str_size(uint64_t x);
FSTRING_LINK fstr_bool u64_to_str(String *dest, uint64_t x);
FSTRING_LINK fstr_bool append_u64_to_str(String *dest, uint64_t x);
FSTRING_LINK int32_t float_to_str_size(float x);
FSTRING_LINK fstr_bool append_float_to_str(String *dest, float x);
FSTRING_LINK fstr_bool float_to_str(String *dest, float x);
FSTRING_LINK int32_t str_is_int_c(char *str);
FSTRING_LINK fstr_bool str_is_int_s(String str);
FSTRING_LINK int32_t str_to_int_c(char *str);
FSTRING_LINK int32_t str_to_int_s(String str);
FSTRING_LINK int32_t hexchar_to_int(char c);
FSTRING_LINK char int_to_hexchar(int32_t x);
FSTRING_LINK uint32_t hexstr_to_int(String str);
FSTRING_LINK fstr_bool color_to_hexstr(String *s, uint32_t color);
FSTRING_LINK fstr_bool hexstr_to_color(String s, uint32_t *out);
FSTRING_LINK int32_t reverse_seek_slash_pos(String str, int32_t pos);
FSTRING_INLINE int32_t reverse_seek_slash(String str);
FSTRING_INLINE String front_of_directory(String dir);
FSTRING_INLINE String path_of_directory(String dir);
FSTRING_LINK fstr_bool set_last_folder_sc(String *dir, char *folder_name, char slash);
FSTRING_LINK fstr_bool set_last_folder_ss(String *dir, String folder_name, char slash);
FSTRING_LINK String file_extension(String str);
FSTRING_LINK fstr_bool remove_extension(String *str);
FSTRING_LINK fstr_bool remove_last_folder(String *str);
FSTRING_LINK fstr_bool string_set_match_table(void *str_set, int32_t item_size, int32_t count, String str, int32_t *match_index);
FSTRING_LINK fstr_bool string_set_match(String *str_set, int32_t count, String str, int32_t *match_index);
#endif #endif
#if !defined(FSTRING_C) && !defined(FSTRING_GUARD) #if !defined(FSTRING_C) && !defined(FSTRING_GUARD)
FSTRING_INLINE String FSTRING_INLINE String make_string(void *str, int32_t size, int32_t mem_size){return(make_string_cap(str,size,mem_size));}
make_string(void *str, int32_t size, int32_t mem_size){return(make_string_cap(str,size,mem_size));} FSTRING_INLINE String substr(String str, int32_t start){return(substr_tail(str,start));}
FSTRING_INLINE String FSTRING_INLINE fstr_bool match(char *a, char *b){return(match_cc(a,b));}
substr(String str, int32_t start){return(substr_tail(str,start));} FSTRING_INLINE fstr_bool match(String a, char *b){return(match_sc(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match(char *a, String b){return(match_cs(a,b));}
match(char *a, char *b){return(match_cc(a,b));} FSTRING_INLINE fstr_bool match(String a, String b){return(match_ss(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match_part(char *a, char *b, int32_t *len){return(match_part_ccl(a,b,len));}
match(String a, char *b){return(match_sc(a,b));} FSTRING_INLINE fstr_bool match_part(String a, char *b, int32_t *len){return(match_part_scl(a,b,len));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match_part(char *a, char *b){return(match_part_cc(a,b));}
match(char *a, String b){return(match_cs(a,b));} FSTRING_INLINE fstr_bool match_part(String a, char *b){return(match_part_sc(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match_part(char *a, String b){return(match_part_cs(a,b));}
match(String a, String b){return(match_ss(a,b));} FSTRING_INLINE fstr_bool match_part(String a, String b){return(match_part_ss(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match_insensitive(char *a, char *b){return(match_insensitive_cc(a,b));}
match_part(char *a, char *b, int32_t *len){return(match_part_ccl(a,b,len));} FSTRING_INLINE fstr_bool match_insensitive(String a, char *b){return(match_insensitive_sc(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match_insensitive(char *a, String b){return(match_insensitive_cs(a,b));}
match_part(String a, char *b, int32_t *len){return(match_part_scl(a,b,len));} FSTRING_INLINE fstr_bool match_insensitive(String a, String b){return(match_insensitive_ss(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match_part_insensitive(char *a, char *b, int32_t *len){return(match_part_insensitive_ccl(a,b,len));}
match_part(char *a, char *b){return(match_part_cc(a,b));} FSTRING_INLINE fstr_bool match_part_insensitive(String a, char *b, int32_t *len){return(match_part_insensitive_scl(a,b,len));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match_part_insensitive(char *a, char *b){return(match_part_insensitive_cc(a,b));}
match_part(String a, char *b){return(match_part_sc(a,b));} FSTRING_INLINE fstr_bool match_part_insensitive(String a, char *b){return(match_part_insensitive_sc(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool match_part_insensitive(char *a, String b){return(match_part_insensitive_cs(a,b));}
match_part(char *a, String b){return(match_part_cs(a,b));} FSTRING_INLINE fstr_bool match_part_insensitive(String a, String b){return(match_part_insensitive_ss(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE int32_t compare(char *a, char *b){return(compare_cc(a,b));}
match_part(String a, String b){return(match_part_ss(a,b));} FSTRING_INLINE int32_t compare(String a, char *b){return(compare_sc(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE int32_t compare(char *a, String b){return(compare_cs(a,b));}
match_insensitive(char *a, char *b){return(match_insensitive_cc(a,b));} FSTRING_INLINE int32_t compare(String a, String b){return(compare_ss(a,b));}
FSTRING_INLINE fstr_bool FSTRING_INLINE int32_t find(char *str, int32_t start, char character){return(find_c_char(str,start,character));}
match_insensitive(String a, char *b){return(match_insensitive_sc(a,b));} FSTRING_INLINE int32_t find(String str, int32_t start, char character){return(find_s_char(str,start,character));}
FSTRING_INLINE fstr_bool FSTRING_INLINE int32_t rfind(String str, int32_t start, char character){return(rfind_s_char(str,start,character));}
match_insensitive(char *a, String b){return(match_insensitive_cs(a,b));} FSTRING_INLINE int32_t find(char *str, int32_t start, char *characters){return(find_c_chars(str,start,characters));}
FSTRING_INLINE fstr_bool FSTRING_INLINE int32_t find(String str, int32_t start, char *characters){return(find_s_chars(str,start,characters));}
match_insensitive(String a, String b){return(match_insensitive_ss(a,b));} FSTRING_INLINE int32_t find_substr(char *str, int32_t start, String seek){return(find_substr_c(str,start,seek));}
FSTRING_INLINE fstr_bool FSTRING_INLINE int32_t find_substr(String str, int32_t start, String seek){return(find_substr_s(str,start,seek));}
match_part_insensitive(char *a, char *b, int32_t *len){return(match_part_insensitive_ccl(a,b,len));} FSTRING_INLINE int32_t rfind_substr(String str, int32_t start, String seek){return(rfind_substr_s(str,start,seek));}
FSTRING_INLINE fstr_bool FSTRING_INLINE int32_t find_substr_insensitive(char *str, int32_t start, String seek){return(find_substr_insensitive_c(str,start,seek));}
match_part_insensitive(String a, char *b, int32_t *len){return(match_part_insensitive_scl(a,b,len));} FSTRING_INLINE int32_t find_substr_insensitive(String str, int32_t start, String seek){return(find_substr_insensitive_s(str,start,seek));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool has_substr(char *s, String seek){return(has_substr_c(s,seek));}
match_part_insensitive(char *a, char *b){return(match_part_insensitive_cc(a,b));} FSTRING_INLINE fstr_bool has_substr(String s, String seek){return(has_substr_s(s,seek));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool has_substr_insensitive(char *s, String seek){return(has_substr_insensitive_c(s,seek));}
match_part_insensitive(String a, char *b){return(match_part_insensitive_sc(a,b));} FSTRING_INLINE fstr_bool has_substr_insensitive(String s, String seek){return(has_substr_insensitive_s(s,seek));}
FSTRING_INLINE fstr_bool FSTRING_INLINE int32_t copy_fast_unsafe(char *dest, char *src){return(copy_fast_unsafe_cc(dest,src));}
match_part_insensitive(char *a, String b){return(match_part_insensitive_cs(a,b));} FSTRING_INLINE int32_t copy_fast_unsafe(char *dest, String src){return(copy_fast_unsafe_cs(dest,src));}
FSTRING_INLINE fstr_bool FSTRING_INLINE fstr_bool copy_checked(String *dest, String src){return(copy_checked_ss(dest,src));}
match_part_insensitive(String a, String b){return(match_part_insensitive_ss(a,b));} FSTRING_INLINE fstr_bool copy_partial(String *dest, char *src){return(copy_partial_sc(dest,src));}
FSTRING_INLINE int32_t FSTRING_INLINE fstr_bool copy_partial(String *dest, String src){return(copy_partial_ss(dest,src));}
compare(char *a, char *b){return(compare_cc(a,b));} FSTRING_INLINE int32_t copy(char *dest, char *src){return(copy_cc(dest,src));}
FSTRING_INLINE int32_t FSTRING_INLINE void copy(String *dest, String src){(copy_ss(dest,src));}
compare(String a, char *b){return(compare_sc(a,b));} FSTRING_INLINE void copy(String *dest, char *src){(copy_sc(dest,src));}
FSTRING_INLINE int32_t FSTRING_INLINE fstr_bool append_checked(String *dest, String src){return(append_checked_ss(dest,src));}
compare(char *a, String b){return(compare_cs(a,b));} FSTRING_INLINE fstr_bool append_partial(String *dest, char *src){return(append_partial_sc(dest,src));}
FSTRING_INLINE int32_t FSTRING_INLINE fstr_bool append_partial(String *dest, String src){return(append_partial_ss(dest,src));}
compare(String a, String b){return(compare_ss(a,b));} FSTRING_INLINE fstr_bool append(String *dest, char c){return(append_s_char(dest,c));}
FSTRING_INLINE int32_t FSTRING_INLINE fstr_bool append(String *dest, String src){return(append_ss(dest,src));}
find(char *str, int32_t start, char character){return(find_c_char(str,start,character));} FSTRING_INLINE fstr_bool append(String *dest, char *src){return(append_sc(dest,src));}
FSTRING_INLINE int32_t FSTRING_INLINE void to_lower(char *src, char *dst){(to_lower_cc(src,dst));}
find(String str, int32_t start, char character){return(find_s_char(str,start,character));} FSTRING_INLINE void to_lower(String *dst, String src){(to_lower_ss(dst,src));}
FSTRING_INLINE int32_t FSTRING_INLINE void to_lower(String *str){(to_lower_s(str));}
rfind(String str, int32_t start, char character){return(rfind_s_char(str,start,character));} FSTRING_INLINE void to_upper(char *src, char *dst){(to_upper_cc(src,dst));}
FSTRING_INLINE int32_t FSTRING_INLINE void to_upper(String *dst, String src){(to_upper_ss(dst,src));}
find(char *str, int32_t start, char *characters){return(find_c_chars(str,start,characters));} FSTRING_INLINE void to_upper(String *str){(to_upper_s(str));}
FSTRING_INLINE int32_t FSTRING_INLINE void to_camel(char *src, char *dst){(to_camel_cc(src,dst));}
find(String str, int32_t start, char *characters){return(find_s_chars(str,start,characters));} FSTRING_INLINE int32_t str_is_int(char *str){return(str_is_int_c(str));}
FSTRING_INLINE int32_t FSTRING_INLINE fstr_bool str_is_int(String str){return(str_is_int_s(str));}
find_substr(char *str, int32_t start, String seek){return(find_substr_c(str,start,seek));} FSTRING_INLINE int32_t str_to_int(char *str){return(str_to_int_c(str));}
FSTRING_INLINE int32_t FSTRING_INLINE int32_t str_to_int(String str){return(str_to_int_s(str));}
find_substr(String str, int32_t start, String seek){return(find_substr_s(str,start,seek));} FSTRING_INLINE int32_t reverse_seek_slash(String str, int32_t pos){return(reverse_seek_slash_pos(str,pos));}
FSTRING_INLINE int32_t FSTRING_INLINE fstr_bool set_last_folder(String *dir, char *folder_name, char slash){return(set_last_folder_sc(dir,folder_name,slash));}
rfind_substr(String str, int32_t start, String seek){return(rfind_substr_s(str,start,seek));} FSTRING_INLINE fstr_bool set_last_folder(String *dir, String folder_name, char slash){return(set_last_folder_ss(dir,folder_name,slash));}
FSTRING_INLINE int32_t FSTRING_INLINE fstr_bool string_set_match(void *str_set, int32_t item_size, int32_t count, String str, int32_t *match_index){return(string_set_match_table(str_set,item_size,count,str,match_index));}
find_substr_insensitive(char *str, int32_t start, String seek){return(find_substr_insensitive_c(str,start,seek));}
FSTRING_INLINE int32_t
find_substr_insensitive(String str, int32_t start, String seek){return(find_substr_insensitive_s(str,start,seek));}
FSTRING_INLINE fstr_bool
has_substr(char *s, String seek){return(has_substr_c(s,seek));}
FSTRING_INLINE fstr_bool
has_substr(String s, String seek){return(has_substr_s(s,seek));}
FSTRING_INLINE fstr_bool
has_substr_insensitive(char *s, String seek){return(has_substr_insensitive_c(s,seek));}
FSTRING_INLINE fstr_bool
has_substr_insensitive(String s, String seek){return(has_substr_insensitive_s(s,seek));}
FSTRING_INLINE int32_t
copy_fast_unsafe(char *dest, char *src){return(copy_fast_unsafe_cc(dest,src));}
FSTRING_INLINE int32_t
copy_fast_unsafe(char *dest, String src){return(copy_fast_unsafe_cs(dest,src));}
FSTRING_INLINE fstr_bool
copy_checked(String *dest, String src){return(copy_checked_ss(dest,src));}
FSTRING_INLINE fstr_bool
copy_partial(String *dest, char *src){return(copy_partial_sc(dest,src));}
FSTRING_INLINE fstr_bool
copy_partial(String *dest, String src){return(copy_partial_ss(dest,src));}
FSTRING_INLINE int32_t
copy(char *dest, char *src){return(copy_cc(dest,src));}
FSTRING_INLINE void
copy(String *dest, String src){(copy_ss(dest,src));}
FSTRING_INLINE void
copy(String *dest, char *src){(copy_sc(dest,src));}
FSTRING_INLINE fstr_bool
append_checked(String *dest, String src){return(append_checked_ss(dest,src));}
FSTRING_INLINE fstr_bool
append_partial(String *dest, char *src){return(append_partial_sc(dest,src));}
FSTRING_INLINE fstr_bool
append_partial(String *dest, String src){return(append_partial_ss(dest,src));}
FSTRING_INLINE fstr_bool
append(String *dest, char c){return(append_s_char(dest,c));}
FSTRING_INLINE fstr_bool
append(String *dest, String src){return(append_ss(dest,src));}
FSTRING_INLINE fstr_bool
append(String *dest, char *src){return(append_sc(dest,src));}
FSTRING_INLINE void
to_lower(char *src, char *dst){(to_lower_cc(src,dst));}
FSTRING_INLINE void
to_lower(String *dst, String src){(to_lower_ss(dst,src));}
FSTRING_INLINE void
to_lower(String *str){(to_lower_s(str));}
FSTRING_INLINE void
to_upper(char *src, char *dst){(to_upper_cc(src,dst));}
FSTRING_INLINE void
to_upper(String *dst, String src){(to_upper_ss(dst,src));}
FSTRING_INLINE void
to_upper(String *str){(to_upper_s(str));}
FSTRING_INLINE void
to_camel(char *src, char *dst){(to_camel_cc(src,dst));}
FSTRING_INLINE int32_t
str_is_int(char *str){return(str_is_int_c(str));}
FSTRING_INLINE fstr_bool
str_is_int(String str){return(str_is_int_s(str));}
FSTRING_INLINE int32_t
str_to_int(char *str){return(str_to_int_c(str));}
FSTRING_INLINE int32_t
str_to_int(String str){return(str_to_int_s(str));}
FSTRING_INLINE int32_t
reverse_seek_slash(String str, int32_t pos){return(reverse_seek_slash_pos(str,pos));}
FSTRING_INLINE fstr_bool
set_last_folder(String *dir, char *folder_name, char slash){return(set_last_folder_sc(dir,folder_name,slash));}
FSTRING_INLINE fstr_bool
set_last_folder(String *dir, String folder_name, char slash){return(set_last_folder_ss(dir,folder_name,slash));}
FSTRING_INLINE fstr_bool
string_set_match(void *str_set, int32_t item_size, int32_t count, String str, int32_t *match_index){return(string_set_match_table(str_set,item_size,count,str,match_index));}
#endif #endif

View File

@ -406,7 +406,7 @@ typedef struct Item_Node{
typedef struct Item_Set{ typedef struct Item_Set{
Item_Node *items; Item_Node *items;
int32_t count; int32_t count;
} Item_Set; } Item_Set;
typedef struct Parse{ typedef struct Parse{
String code; String code;
@ -722,7 +722,7 @@ doc_parse_last_parameter(String source, int32_t *pos){
} }
*pos = p; *pos = p;
return(result); return(result);
} }
static void static void
@ -1587,7 +1587,7 @@ compile_meta_unit(Partition *part, char **files, int32_t file_count,
++index; ++index;
} }
else{ else{
fprintf(stderr, "warning : invalid function signature\n"); fprintf(stderr, "warning: invalid function signature\n");
} }
}break; }break;
@ -1877,28 +1877,26 @@ print_str(FILE *file, String str){
} }
static void static void
print_function_body_code(FILE *file, int32_t *index, Cpp_Token **token_ptr, int32_t count, String *code, print_function_body_code(String *out, Parse_Context *context, int32_t start){
int32_t start){ String pstr = {0}, lexeme = {0};
int32_t i = *index; Cpp_Token *token = 0;
Cpp_Token *token = *token_ptr;
String pstr = {0};
int32_t do_print = 0;
int32_t nest_level = 0; int32_t nest_level = 0;
int32_t finish = false; int32_t finish = false;
int32_t do_whitespace_print = false; int32_t do_whitespace_print = false;
for (; i < count; ++i, ++token){ for (; (token = get_token(context)) != 0; get_next_token(context)){
if (do_whitespace_print){ if (do_whitespace_print){
pstr = str_start_end(code->str, start, token->start); pstr = str_start_end(context->data, start, token->start);
print_str(file, pstr); append_ss(out, pstr);
} }
else{ else{
do_whitespace_print = true; do_whitespace_print = true;
} }
int32_t do_print = true; do_print = true;
if (token->type == CPP_TOKEN_COMMENT){ if (token->type == CPP_TOKEN_COMMENT){
String lexeme = make_string(code->str + token->start, token->size); lexeme = get_lexeme(*token, context->data);
if (check_and_fix_docs(&lexeme)){ if (check_and_fix_docs(&lexeme)){
do_print = false; do_print = false;
} }
@ -1913,28 +1911,23 @@ print_function_body_code(FILE *file, int32_t *index, Cpp_Token **token_ptr, int3
} }
} }
if (i < count){ if (do_print){
if (do_print){ pstr = get_lexeme(*token, context->data);
pstr = make_string(code->str + token->start, token->size); append_ss(out, pstr);
print_str(file, pstr);
}
start = token->start + token->size;
} }
start = token->start + token->size;
if (finish){ if (finish){
break; break;
} }
} }
*index = i;
*token_ptr = token;
} }
static void static void
print_function_docs(FILE *file, Partition *part, String name, String doc_string){ print_function_docs(FILE *file, Partition *part, String name, String doc_string){
if (doc_string.size == 0){ if (doc_string.size == 0){
fprintf(file, "No documentation generated for this function, assume it is non-public.\n"); fprintf(file, "No documentation generated for this function.\n");
fprintf(stderr, "warning: no documentation string for %.*s\n", name.size, name.str); fprintf(stderr, "warning: no documentation string for %.*s\n", name.size, name.str);
} }
@ -2264,8 +2257,6 @@ generate_custom_headers(){
append_s_char(&out, '\n'); append_s_char(&out, '\n');
} }
dump_file_out(context);
for (int32_t i = main_api_count; i < os_api_count; ++i){ for (int32_t i = main_api_count; i < os_api_count; ++i){
append_sc(&out, "typedef "); append_sc(&out, "typedef ");
append_ss(&out, func_4ed_names.names[i].macro); append_ss(&out, func_4ed_names.names[i].macro);
@ -2281,8 +2272,6 @@ generate_custom_headers(){
} }
if (begin_file_out(&context, API_H, &out)){ if (begin_file_out(&context, API_H, &out)){
file = context.file;
for (int32_t i = 0; i < unit_custom.set.count; ++i){ for (int32_t i = 0; i < unit_custom.set.count; ++i){
append_sc(&out, "#define "); append_sc(&out, "#define ");
append_ss(&out, func_4ed_names.names[i].macro); append_ss(&out, func_4ed_names.names[i].macro);
@ -2333,345 +2322,282 @@ generate_custom_headers(){
end_file_out(context); end_file_out(context);
} }
else{
// TODO(allen): warning
}
// NOTE(allen): Documentation // NOTE(allen): String Library
{ if (begin_file_out(&context, STRING_H, &out)){
file = context.file;
// Cpp_Token *token = 0;
// Output 4coder_string.h int32_t start = 0;
//
file = fopen(STRING_H, "wb"); Parse parse = string_unit.parse[0];
Parse_Context pcontext = setup_parse_context(parse);
{ for (; (token = get_token(&pcontext)) != 0; get_next_token(&pcontext)){
String *code = &string_unit.parse[0].code; if (!(token->flags & CPP_TFLAG_PP_BODY) &&
Cpp_Token_Stack *token_stack = &string_unit.parse[0].tokens; token->type == CPP_TOKEN_IDENTIFIER){
String lexeme = get_lexeme(*token, pcontext.data);
int32_t start = 0; if (match_ss(lexeme, make_lit_string("FSTRING_BEGIN"))){
int32_t count = token_stack->count;
Cpp_Token *tokens = token_stack->tokens;
Cpp_Token *token = tokens;
int32_t i = 0;
for (i = 0; i < count; ++i, ++token){
if (token->type == CPP_TOKEN_IDENTIFIER &&
!(token->flags & CPP_TFLAG_PP_BODY)){
String lexeme = make_string(code->str + token->start, token->size);
if (match_ss(lexeme, make_lit_string("FSTRING_BEGIN"))){
start = token->start + token->size;
break;
}
}
}
String pstr = {0};
int32_t do_whitespace_print = true;
for(++i, ++token; i < count; ++i, ++token){
if (do_whitespace_print){
pstr = str_start_end(code->str, start, token->start);
print_str(file, pstr);
}
else{
do_whitespace_print = true;
}
String lexeme = get_lexeme(*token, code->str);
int32_t do_print = true;
if (match_ss(lexeme, make_lit_string("FSTRING_DECLS"))){
fprintf(file, "#if !defined(FCODER_STRING_H)\n#define FCODER_STRING_H\n\n");
do_print = false;
#define RETURN_PADDING 16
#define SIG_PADDING 30
for (int32_t j = 0; j < string_unit.set.count; ++j){
char line_space[2048];
String line = make_fixed_width_string(line_space);
Item_Node *item = string_unit.set.items + j;
if (item->t != Item_Macro){
String marker = item->marker;
String ret = item->ret;
String name = item->name;
String args = item->args;
append_ss(&line, marker);
append_padding(&line, ' ', RETURN_PADDING);
append_ss(&line, ret);
append_padding(&line, ' ', SIG_PADDING);
append_ss(&line, name);
append_ss(&line, args);
terminate_with_null(&line);
fprintf(file, "%s;\n", line.str);
}
else{
String name = item->name;
String args = item->args;
String body = item->body;
append_ss(&line, make_lit_string("#ifndef "));
append_padding(&line, ' ', 10);
append_ss(&line, name);
terminate_with_null(&line);
fprintf(file, "%s\n", line.str);
line.size = 0;
append_ss(&line, make_lit_string("# define "));
append_padding(&line, ' ', 10);
append_ss(&line, name);
append_ss(&line, args);
append_s_char(&line, ' ');
append_ss(&line, body);
terminate_with_null(&line);
fprintf(file, "%s\n", line.str);
line.size = 0;
append_ss(&line, make_lit_string("#endif"));
terminate_with_null(&line);
fprintf(file, "%s\n", line.str);
}
}
{
fprintf(file, "\n#if !defined(FSTRING_C)\n\n"
"// NOTE(allen): This section is here to enable nicer names\n"
"// for C++ users who can have overloaded functions. None of\n"
"// these functions add new features.\n");
for (int32_t j = 0; j < string_unit.set.count; ++j){
char line_space[2048];
String line = make_fixed_width_string(line_space);
Item_Node *item = &string_unit.set.items[j];
if (item->t != Item_Macro){
String cpp_name = item->cpp_name;
if (cpp_name.str != 0){
String ret = item->ret;
String args = item->args;
append_ss(&line, make_lit_string("FSTRING_INLINE"));
append_padding(&line, ' ', RETURN_PADDING);
append_ss(&line, ret);
append_padding(&line, ' ', SIG_PADDING);
append_ss(&line, cpp_name);
append_ss(&line, args);
terminate_with_null(&line);
fprintf(file, "%s;\n", line.str);
}
}
}
fprintf(file, "\n#endif\n");
}
fprintf(file, "\n#endif\n");
{
fprintf(file, "\n#if !defined(FSTRING_C) && !defined(FSTRING_GUARD)\n\n");
for (int32_t j = 0; j < string_unit.set.count; ++j){
char line_space[2048];
String line = make_fixed_width_string(line_space);
Item_Node *item = &string_unit.set.items[j];
if (item->t != Item_Macro){
String cpp_name = item->cpp_name;
if (cpp_name.str != 0){
String name = item->name;
String ret = item->ret;
String args = item->args;
Argument_Breakdown breakdown = item->breakdown;
append_ss(&line, make_lit_string("FSTRING_INLINE"));
append_s_char(&line, ' ');
append_ss(&line, ret);
append_s_char(&line, '\n');
append_ss(&line, cpp_name);
append_ss(&line, args);
if (match_ss(ret, make_lit_string("void"))){
append_ss(&line, make_lit_string("{("));
}
else{
append_ss(&line, make_lit_string("{return("));
}
append_ss(&line, name);
append_s_char(&line, '(');
if (breakdown.count > 0){
for (int32_t i = 0; i < breakdown.count; ++i){
if (i != 0){
append_s_char(&line, ',');
}
append_ss(&line, breakdown.args[i].param_name);
}
}
else{
append_ss(&line, make_lit_string("void"));
}
append_ss(&line, make_lit_string("));}"));
terminate_with_null(&line);
fprintf(file, "%s\n", line.str);
}
}
}
fprintf(file, "\n#endif\n");
}
}
else if (match_ss(lexeme, make_lit_string("DOC_EXPORT"))){
++i, ++token;
if (i < count && token->type == CPP_TOKEN_COMMENT){
++i, ++token;
if (i < count && token->type == CPP_PP_DEFINE){
++i, ++token;
for (; i < count; ++i, ++token){
if (!(token->flags & CPP_TFLAG_PP_BODY)){
break;
}
}
--i, --token;
do_print = false;
do_whitespace_print = false;
}
}
}
else if (match_ss(lexeme, make_lit_string("FSTRING_INLINE"))){
if (!(token->flags & CPP_TFLAG_PP_BODY)){
fprintf(file, "#if !defined(FSTRING_GUARD)\n");
print_function_body_code(file, &i, &token, count, code, start);
fprintf(file, "\n#endif");
do_print = false;
}
}
else if (match_ss(lexeme, make_lit_string("FSTRING_LINK"))){
if (!(token->flags & CPP_TFLAG_PP_BODY)){
fprintf(file, "#if defined(FSTRING_IMPLEMENTATION)\n");
print_function_body_code(file, &i, &token, count, code, start);
fprintf(file, "\n#endif");
do_print = false;
}
}
else if (match_ss(lexeme, make_lit_string("CPP_NAME"))){
Cpp_Token *token_start = token;
int32_t i_start = i;
int32_t has_cpp_name = false;
++i, ++token;
if (token->type == CPP_TOKEN_PARENTHESE_OPEN){
++i, ++token;
if (token->type == CPP_TOKEN_IDENTIFIER){
++i, ++token;
if (token->type == CPP_TOKEN_PARENTHESE_CLOSE){
has_cpp_name = true;
}
}
}
if (!has_cpp_name){
i = i_start;
token = token_start;
}
do_print = false;
}
else if (token->type == CPP_TOKEN_COMMENT){
lexeme = make_string(code->str + token->start, token->size);
if (check_and_fix_docs(&lexeme)){
do_print = false;
}
}
if (i < count){
if (do_print){
pstr = make_string(code->str + token->start, token->size);
print_str(file, pstr);
}
start = token->start + token->size; start = token->start + token->size;
break;
} }
} }
pstr = str_start_end(code->str, start, code->size);
print_str(file, pstr);
} }
fclose(file); String pstr = {0};
int32_t do_whitespace_print = true;
// for(;(token = get_next_token(&pcontext)) != 0;){
// Output Docs if (do_whitespace_print){
// pstr = str_start_end(pcontext.data, start, token->start);
append_ss(&out, pstr);
}
else{
do_whitespace_print = true;
}
String lexeme = get_lexeme(*token, pcontext.data);
int32_t do_print = true;
if (match_ss(lexeme, make_lit_string("FSTRING_DECLS"))){
append_sc(&out, "#if !defined(FCODER_STRING_H)\n#define FCODER_STRING_H\n\n");
do_print = false;
static int32_t RETURN_PADDING = 16;
static int32_t SIG_PADDING = 27;
for (int32_t j = 0; j < string_unit.set.count; ++j){
char line_[2048];
String line = make_fixed_width_string(line_);
Item_Node *item = string_unit.set.items + j;
if (item->t == Item_Function){
append_ss (&line, item->marker);
append_padding (&line, ' ', RETURN_PADDING);
append_ss (&line, item->ret);
append_padding (&line, ' ', SIG_PADDING);
append_ss (&line, item->name);
append_ss (&line, item->args);
append_sc (&line, ";\n");
}
else if (item->t == Item_Macro){
append_ss (&line, make_lit_string("#ifndef "));
append_padding (&line, ' ', 10);
append_ss (&line, item->name);
append_s_char (&line, '\n');
append_ss (&line, make_lit_string("# define "));
append_padding (&line, ' ', 10);
append_ss (&line, item->name);
append_ss (&line, item->args);
append_s_char (&line, ' ');
append_ss (&line, item->body);
append_s_char (&line, '\n');
append_ss (&line, make_lit_string("#endif"));
append_s_char (&line, '\n');
}
else{
InvalidPath;
}
append_ss(&out, line);
}
append_sc(&out, "\n#endif\n");
// NOTE(allen): C++ overload definitions
append_sc(&out, "\n#if !defined(FSTRING_C) && !defined(FSTRING_GUARD)\n\n");
for (int32_t j = 0; j < string_unit.set.count; ++j){
char line_space[2048];
String line = make_fixed_width_string(line_space);
Item_Node *item = &string_unit.set.items[j];
if (item->t == Item_Function){
String cpp_name = item->cpp_name;
if (cpp_name.str != 0){
Argument_Breakdown breakdown = item->breakdown;
append_ss (&line, make_lit_string("FSTRING_INLINE"));
append_padding(&line, ' ', RETURN_PADDING);
append_ss (&line, item->ret);
append_padding(&line, ' ', SIG_PADDING);
append_ss (&line, cpp_name);
append_ss (&line, item->args);
if (match_ss(item->ret, make_lit_string("void"))){
append_ss(&line, make_lit_string("{("));//}
}
else{
append_ss(&line, make_lit_string("{return("));//}
}
append_ss (&line, item->name);
append_s_char(&line, '(');
if (breakdown.count > 0){
for (int32_t i = 0; i < breakdown.count; ++i){
if (i != 0){
append_s_char(&line, ',');
}
append_ss(&line, breakdown.args[i].param_name);
}
}
else{
append_ss(&line, make_lit_string("void"));
}
//{
append_ss(&line, make_lit_string("));}\n"));
append_ss(&out, line);
}
}
}
append_sc(&out, "\n#endif\n");
}
else if (match_ss(lexeme, make_lit_string("DOC_EXPORT"))){
token = get_next_token(&pcontext);
if (token && token->type == CPP_TOKEN_COMMENT){
token = get_next_token(&pcontext);
if (token && token->type == CPP_PP_DEFINE){
for (;(token = get_next_token(&pcontext)) != 0;){
if (!(token->flags & CPP_TFLAG_PP_BODY)){
break;
}
}
if (token != 0){
get_prev_token(&pcontext);
}
do_print = false;
do_whitespace_print = false;
}
}
}
else if (match_ss(lexeme, make_lit_string("FSTRING_INLINE")) ||
match_ss(lexeme, make_lit_string("FSTRING_LINK"))){
if (!(token->flags & CPP_TFLAG_PP_BODY)){
if (match_ss(lexeme, make_lit_string("FSTRING_INLINE"))){
append_sc(&out, "#if !defined(FSTRING_GUARD)\n");
}
else{
append_sc(&out, "#if defined(FSTRING_IMPLEMENTATION)\n");
}
print_function_body_code(&out, &pcontext, start);
append_sc(&out, "\n#endif");
do_print = false;
}
}
else if (match_ss(lexeme, make_lit_string("CPP_NAME"))){
Cpp_Token *token_start = token;
int32_t has_cpp_name = false;
token = get_next_token(&pcontext);
if (token && token->type == CPP_TOKEN_PARENTHESE_OPEN){
token = get_next_token(&pcontext);
if (token && token->type == CPP_TOKEN_IDENTIFIER){
token = get_next_token(&pcontext);
if (token && token->type == CPP_TOKEN_PARENTHESE_CLOSE){
has_cpp_name = true;
do_print = false;
}
}
}
if (!has_cpp_name){
token = set_token(&pcontext, token_start);
}
}
else if (token->type == CPP_TOKEN_COMMENT){
if (check_and_fix_docs(&lexeme)){
do_print = false;
}
}
if ((token = get_token(&pcontext)) != 0){
if (do_print){
pstr = get_lexeme(*token, pcontext.data);
append_ss(&out, pstr);
}
start = token->start + token->size;
}
}
pstr = str_start_end(pcontext.data, start, parse.code.size);
append_ss(&out, pstr);
file = fopen(API_DOC, "wb"); end_file_out(context);
}
else{
// TODO(allen): warning
}
// Output Docs
if (begin_file_out(&context, API_DOC, &out)){
fprintf(file, append_sc(&out,
"<html lang=\"en-US\">\n" "<html lang=\"en-US\">"
"<head>\n" "<head>"
"<title>4coder API Docs</title>\n" "<title>4coder API Docs</title>"
"<style>\n" "<style>"
"body { " "body { "
"background: " BACK_COLOR "; " "background: " BACK_COLOR "; "
"color: " TEXT_COLOR "; " "color: " TEXT_COLOR "; "
"}\n" "}"
// H things // H things
"h1,h2,h3,h4 { " "h1,h2,h3,h4 { "
"color: " POP_COLOR_1 "; " "color: " POP_COLOR_1 "; "
"margin: 0; " "margin: 0; "
"}\n" "}"
"h2 { " "h2 { "
"margin-top: 6mm; " "margin-top: 6mm; "
"}\n" "}"
"h3 { " "h3 { "
"margin-top: 5mm; margin-bottom: 5mm; " "margin-top: 5mm; margin-bottom: 5mm; "
"}\n" "}"
"h4 { " "h4 { "
"font-size: 1.1em; " "font-size: 1.1em; "
"}\n" "}"
// ANCHORS // ANCHORS
"a { " "a { "
"color: " POP_COLOR_1 "; " "color: " POP_COLOR_1 "; "
"text-decoration: none; " "text-decoration: none; "
"}\n" "}"
"a:visited { " "a:visited { "
"color: " VISITED_LINK "; " "color: " VISITED_LINK "; "
"}\n" "}"
"a:hover { " "a:hover { "
"background: " POP_BACK_1 "; " "background: " POP_BACK_1 "; "
"}\n" "}"
// LIST // LIST
"ul { " "ul { "
"list-style: none; " "list-style: none; "
"padding: 0; " "padding: 0; "
"margin: 0; " "margin: 0; "
"}\n" "}"
"</style>\n" "</style>"
"</head>\n" "</head>\n"
"<body>\n" "<body>"
"<div style='font-family:Arial; margin: 0 auto; " "<div style='font-family:Arial; margin: 0 auto; "
"width: 800px; text-align: justify; line-height: 1.25;'>\n" "width: 800px; text-align: justify; line-height: 1.25;'>"
"<h1 style='margin-top: 5mm; margin-bottom: 5mm;'>4coder API</h1>\n" "<h1 style='margin-top: 5mm; margin-bottom: 5mm;'>4coder API</h1>"
); );
struct Section{ struct Section{
@ -2686,149 +2612,136 @@ generate_custom_headers(){
{"string_library", "String Library"} {"string_library", "String Library"}
}; };
fprintf(file, append_sc(&out,
"<h3 style='margin:0;'>Table of Contents</h3>\n" "<h3 style='margin:0;'>Table of Contents</h3>""<ul>");
"<ul>\n");
dump_file_out(context);
int32_t section_count = ArrayCount(sections); int32_t section_count = ArrayCount(sections);
for (int32_t i = 0; i < section_count; ++i){ for (int32_t i = 0; i < section_count; ++i){
fprintf(file, append_sc (&out, "<li><a href='#section_");
"<li><a href='#section_%s'>&sect;%d %s</a></li>", append_sc (&out, sections[i].id_string);
sections[i].id_string, append_sc (&out, "'>&sect;");
i+1, append_int_to_str (&out, i+1);
sections[i].display_string); append_s_char (&out, ' ');
append_sc (&out, sections[i].display_string);
append_sc (&out, "</a></li>");
} }
fprintf(file, append_sc(&out, "</ul>");
"</ul>\n"
);
#define MAJOR_SECTION "1" #define MAJOR_SECTION "1"
fprintf(file, append_sc(&out, "\n<h2 id='section_");
"<h2 id='section_%s'>&sect;"MAJOR_SECTION" %s</h2>\n" append_sc(&out, sections[0].id_string);
"<div>\n" append_sc(&out, "'>&sect;"MAJOR_SECTION" ");
append_sc(&out, sections[0].display_string);
"<p>\n" append_sc(&out,
"This is the documentation for " VERSION " The documentation is still under " "</h2>"
"construction so some of the links are linking to sections that have not " "<div>"
"been written yet. What is here should be correct and I suspect useful " "<p>This is the documentation for " VERSION " The documentation is still "
"even without some of the other sections. " "under construction so some of the links are linking to sections that "
"</p>\n" "have not been written yet. What is here should be correct and I suspect "
"useful even without some of the other sections.</p>"
"<p>\n" "<p>If you have questions or discover errors please contact "
"If you have questions or discover errors please contact " "<span style='"CODE_STYLE"'>editor@4coder.net</span> or "
"<span style='"CODE_STYLE"'>editor@4coder.net</span> or " "to get help from community members you can post on the "
"to get help from community members you can post on the " "4coder forums hosted on handmade.network at "
"4coder forums hosted on handmade.network at " "<span style='"CODE_STYLE"'>4coder.handmade.network</span></p>"
"<span style='"CODE_STYLE"'>4coder.handmade.network</span>" "</div>");
"</p>\n"
"</div>\n",
sections[0].id_string,
sections[0].display_string
);
#undef MAJOR_SECTION #undef MAJOR_SECTION
#define MAJOR_SECTION "2" #define MAJOR_SECTION "2"
// TODO(allen): Write the 4coder system descriptions. // TODO(allen): Write the 4coder system descriptions.
fprintf(file, append_sc(&out, "\n<h2 id='section_");
"<h2 id='section_%s'>&sect;"MAJOR_SECTION" %s</h2>\n", append_sc(&out, sections[1].id_string);
sections[1].id_string, append_sc(&out, "'>&sect;"MAJOR_SECTION" ");
sections[1].display_string); append_sc(&out, sections[1].display_string);
append_sc(&out, "</h2>");
{ append_sc(&out, "<div><i>Coming Soon</i><div>");
fprintf(file,
"<div><i>\n"
"Coming Soon"
"</i><div>\n");
}
#undef MAJOR_SECTION #undef MAJOR_SECTION
#define MAJOR_SECTION "3" #define MAJOR_SECTION "3"
fprintf(file, append_sc(&out, "\n<h2 id='section_");
"<h2 id='section_%s'>&sect;"MAJOR_SECTION" %s</h2>\n", append_sc(&out, sections[2].id_string);
sections[2].id_string, append_sc(&out, "'>&sect;"MAJOR_SECTION" ");
sections[2].display_string); append_sc(&out, sections[2].display_string);
{ append_sc(&out, "</h2>");
#undef SECTION #undef SECTION
#define SECTION MAJOR_SECTION".1" #define SECTION MAJOR_SECTION".1"
fprintf(file, append_sc(&out, "<h3>&sect;"SECTION" Function List</h3><ul>");
"<h3>&sect;"SECTION" Function List</h3>\n"
"<ul>\n"); for (int32_t i = 0; i < unit_custom.set.count; ++i){
String name = func_4ed_names.names[i].public_name;
for (int32_t i = 0; i < unit_custom.set.count; ++i){ append_sc(&out, "<li><a href='#");
String name = func_4ed_names.names[i].public_name; append_ss(&out, name);
fprintf(file, append_sc(&out, "_doc'>");
"<li>" append_ss(&out, name);
"<a href='#%.*s_doc'>%.*s</a>" append_sc(&out, "</a></li>");
"</li>\n", }
name.size, name.str, append_sc(&out, "</ul>");
name.size, name.str
);
}
fprintf(file, "</ul>\n");
#undef SECTION #undef SECTION
#define SECTION MAJOR_SECTION".2" #define SECTION MAJOR_SECTION".2"
fprintf(file, append_sc(&out, "<h3>&sect;"SECTION" Type List</h3><ul>");
"<h3>&sect;"SECTION" Type List</h3>\n"
"<ul>\n" for (int32_t i = 0; i < unit.set.count; ++i){
); String name = unit.set.items[i].name;
append_sc(&out, "<li><a href='#");
for (int32_t i = 0; i < unit.set.count; ++i){ append_ss(&out, name);
String name = unit.set.items[i].name; append_sc(&out, "_doc'>");
fprintf(file, append_ss(&out, name);
"<li>" append_sc(&out, "</a></li>");
"<a href='#%.*s_doc'>%.*s</a>" }
"</li>\n", append_sc(&out, "</ul>");
name.size, name.str,
name.size, name.str
);
}
fprintf(file, "</ul>\n");
#undef SECTION #undef SECTION
#define SECTION MAJOR_SECTION".3" #define SECTION MAJOR_SECTION".3"
append_sc(&out, "<h3>&sect;"SECTION" Function Descriptions</h3>\n");
for (int32_t i = 0; i < unit_custom.set.count; ++i){
String name = func_4ed_names.names[i].public_name;
fprintf(file, "<h3>&sect;"SECTION" Function Descriptions</h3>\n"); append_sc (&out, "<div id='");
for (int32_t i = 0; i < unit_custom.set.count; ++i){ append_ss (&out, name);
String name = func_4ed_names.names[i].public_name; append_sc (&out, "_doc' style='margin-bottom: 1cm;'><h4>&sect;"SECTION".");
append_int_to_str(&out, i+1);
fprintf(file, append_sc (&out, ": ");
"<div id='%.*s_doc' style='margin-bottom: 1cm;'>\n" append_ss (&out, name);
"<h4>&sect;"SECTION".%d: %.*s</h4>\n" append_sc (&out, "</h4><div style='"CODE_STYLE" "DESCRIPT_SECTION_STYLE"'>");
"<div style='"CODE_STYLE" "DESCRIPT_SECTION_STYLE"'>",
name.size, name.str, i+1,
name.size, name.str
);
print_function_html(file, unit_custom.set.items[i], name, "app->");
fprintf(file, "</div>\n");
String doc_string = unit_custom.set.items[i].doc_string;
print_function_docs(file, part, name, doc_string);
fprintf(file, "</div><hr>\n");
}
dump_file_out(context);
// TODO(allen): Continue converting this to the string system.
print_function_html(file, unit_custom.set.items[i], name, "app->");
fprintf(file, "</div>\n");
String doc_string = unit_custom.set.items[i].doc_string;
print_function_docs(file, part, name, doc_string);
fprintf(file, "</div><hr>\n");
}
#undef SECTION #undef SECTION
#define SECTION MAJOR_SECTION".4" #define SECTION MAJOR_SECTION".4"
fprintf(file, "<h3>&sect;"SECTION" Type Descriptions</h3>\n"); fprintf(file, "<h3>&sect;"SECTION" Type Descriptions</h3>\n");
int32_t I = 1; int32_t I = 1;
for (int32_t i = 0; i < unit.set.count; ++i, ++I){ for (int32_t i = 0; i < unit.set.count; ++i, ++I){
print_item(part, file, unit.set.items + i, SECTION, I); print_item(part, file, unit.set.items + i, SECTION, I);
}
} }
#undef MAJOR_SECTION #undef MAJOR_SECTION
#define MAJOR_SECTION "4" #define MAJOR_SECTION "4"
fprintf(file, fprintf(file,
"<h2 id='section_%s'>&sect;"MAJOR_SECTION" %s</h2>\n", "<h2 id='section_%s'>&sect;"MAJOR_SECTION" %s</h2>\n",
sections[3].id_string, sections[3].id_string,
sections[3].display_string); sections[3].display_string);
@ -2936,7 +2849,10 @@ generate_custom_headers(){
"</html>\n" "</html>\n"
); );
fclose(file); end_file_out(context);
}
else{
// TODO(allen): warning
} }
} }