cleanup; map interface idea

This commit is contained in:
Allen Webster
2021-05-21 17:53:20 -07:00
parent 78c9d8467d
commit b7252121fe
3 changed files with 72 additions and 56 deletions
+18 -1
View File
@@ -561,6 +561,13 @@ struct MD_FileIter
#define MD_StaticAssert(c,label) MD_u8 MD_static_assert_##label[(c)?(1):(-1)] #define MD_StaticAssert(c,label) MD_u8 MD_static_assert_##label[(c)?(1):(-1)]
#define MD_ArrayCount(a) (sizeof(a) / sizeof((a)[0])) #define MD_ArrayCount(a) (sizeof(a) / sizeof((a)[0]))
//~ Memory Operations
MD_FUNCTION void MD_MemoryZero(void *memory, MD_u64 size);
MD_FUNCTION void MD_MemoryCopy(void *dst, void *src, MD_u64 size);
MD_FUNCTION void* MD_AllocZero(MD_u64 size);
#define MD_PushArray(T,c) (T*)MD_AllocZero(sizeof(T)*(c))
//~ Characters //~ Characters
MD_FUNCTION MD_b32 MD_CharIsAlpha(MD_u8 c); MD_FUNCTION MD_b32 MD_CharIsAlpha(MD_u8 c);
MD_FUNCTION MD_b32 MD_CharIsAlphaUpper(MD_u8 c); MD_FUNCTION MD_b32 MD_CharIsAlphaUpper(MD_u8 c);
@@ -631,6 +638,17 @@ MD_FUNCTION MD_String16 MD_S16FromS8(MD_String8 str);
MD_FUNCTION MD_String8 MD_S8FromS32(MD_String32 str); MD_FUNCTION MD_String8 MD_S8FromS32(MD_String32 str);
MD_FUNCTION MD_String32 MD_S32FromS8(MD_String8 str); MD_FUNCTION MD_String32 MD_S32FromS8(MD_String8 str);
//~ Allen's Map Proposoal
#if 0
MD_FUNCTION void MD_MapInit(MD_Map *map);
MD_FUNCTION MD_MapSlot* MD_MapLookupString(MD_Map *map, MD_String8 key);
MD_FUNCTION MD_MapSlot* MD_MapLookupPtr(MD_Map *map, void *key);
MD_FUNCTION MD_b32 MD_MapInsertString(MD_Map *map, MD_String8 key, void *val);
MD_FUNCTION MD_b32 MD_MapInsertPtr(MD_Map *map, void *key, void *val);
MD_FUNCTION MD_MapSlot* MD_MapNextString(MD_MapSlot *slot, MD_String8 key);
MD_FUNCTION MD_MapSlot* MD_MapNextPtr(MD_MapSlot *slot, void *key);
#endif
//~ String-To-Pointer Table //~ String-To-Pointer Table
MD_FUNCTION MD_MapSlot * MD_StringMap_Lookup(MD_Map *table, MD_String8 string); MD_FUNCTION MD_MapSlot * MD_StringMap_Lookup(MD_Map *table, MD_String8 string);
MD_FUNCTION MD_b32 MD_StringMap_Insert(MD_Map *table, MD_MapCollisionRule collision_rule, MD_String8 string, void *value); MD_FUNCTION MD_b32 MD_StringMap_Insert(MD_Map *table, MD_MapCollisionRule collision_rule, MD_String8 string, void *value);
@@ -712,7 +730,6 @@ MD_FUNCTION MD_b32 MD_NodeDeepMatch(MD_Node *a, MD_Node *b, MD_MatchFlags node_f
//~ Generation //~ Generation
MD_FUNCTION void MD_OutputTree(FILE *file, MD_Node *node); MD_FUNCTION void MD_OutputTree(FILE *file, MD_Node *node);
// TODO(allen): needs another pass
//~ Command Line Argument Helper //~ Command Line Argument Helper
MD_FUNCTION MD_CommandLine MD_CommandLine_Start(int argument_count, char **arguments); MD_FUNCTION MD_CommandLine MD_CommandLine_Start(int argument_count, char **arguments);
MD_FUNCTION MD_b32 MD_CommandLine_Flag(MD_CommandLine *cmdln, MD_String8 string); MD_FUNCTION MD_b32 MD_CommandLine_Flag(MD_CommandLine *cmdln, MD_String8 string);
+1 -1
View File
@@ -173,7 +173,7 @@ MD_C_ExprPrecFromExprKind(MD_C_ExprKind kind)
MD_FUNCTION_IMPL MD_C_Expr * MD_FUNCTION_IMPL MD_C_Expr *
MD_C_MakeExpr(MD_Node *node, MD_C_ExprKind kind, MD_C_Expr *left, MD_C_Expr *right) MD_C_MakeExpr(MD_Node *node, MD_C_ExprKind kind, MD_C_Expr *left, MD_C_Expr *right)
{ {
MD_C_Expr *expr = _MD_PushArray(MD_C_Expr, 1); MD_C_Expr *expr = MD_PushArray(MD_C_Expr, 1);
if(left == 0) left = MD_C_NilExpr(); if(left == 0) left = MD_C_NilExpr();
if(right == 0) right = MD_C_NilExpr(); if(right == 0) right = MD_C_NilExpr();
expr->node = node; expr->node = node;
+53 -54
View File
@@ -2,7 +2,7 @@
#define MD_FUNCTION_IMPL MD_FUNCTION #define MD_FUNCTION_IMPL MD_FUNCTION
#define MD_PRIVATE_FUNCTION_IMPL MD_FUNCTION_IMPL #define MD_PRIVATE_FUNCTION_IMPL MD_FUNCTION_IMPL
#define _MD_MAX_UNTERMINATED_TOKEN_ERROR_LEN 20 #define MD_UNTERMINATED_TOKEN_LEN_CAP 20
//~ //~
@@ -33,41 +33,32 @@ static MD_Node _md_nil_node =
&_md_nil_node, // ref_target &_md_nil_node, // ref_target
}; };
//~ Memory Operations
MD_PRIVATE_FUNCTION_IMPL void MD_PRIVATE_FUNCTION_IMPL void
_MD_MemoryZero(void *memory, MD_u64 size) MD_MemoryZero(void *memory, MD_u64 size)
{ {
memset(memory, 0, size); memset(memory, 0, size);
} }
MD_PRIVATE_FUNCTION_IMPL void MD_PRIVATE_FUNCTION_IMPL void
_MD_MemoryCopy(void *dest, void *src, MD_u64 size) MD_MemoryCopy(void *dest, void *src, MD_u64 size)
{ {
memcpy(dest, src, size); memcpy(dest, src, size);
} }
MD_PRIVATE_FUNCTION_IMPL void
_MD_WriteStringToBuffer(MD_String8 string, MD_u64 max, void *dest)
{
MD_u64 write_size = string.size;
if(write_size > max-1) write_size = max-1;
_MD_MemoryCopy(dest, string.str, write_size);
((MD_u8 *)dest)[write_size] = 0;
}
MD_PRIVATE_FUNCTION_IMPL void * MD_PRIVATE_FUNCTION_IMPL void *
_MD_AllocZero(MD_u64 size) MD_AllocZero(MD_u64 size)
{ {
#if !defined(MD_IMPL_Alloc) #if !defined(MD_IMPL_Alloc)
# error Missing implementation detail MD_IMPL_Alloc # error Missing implementation detail MD_IMPL_Alloc
#else #else
void *result = MD_IMPL_Alloc(size); void *result = MD_IMPL_Alloc(size);
_MD_MemoryZero(result, size); MD_MemoryZero(result, size);
return(result); return(result);
#endif #endif
} }
#define _MD_PushArray(type, count) (type *)_MD_AllocZero(sizeof(type)*(count)) //~ Characters
MD_FUNCTION_IMPL MD_b32 MD_FUNCTION_IMPL MD_b32
MD_CharIsAlpha(MD_u8 c) MD_CharIsAlpha(MD_u8 c)
{ {
@@ -135,6 +126,7 @@ MD_CorrectSlash(MD_u8 c)
return (c == '\\' ? '/' : c); return (c == '\\' ? '/' : c);
} }
//~ Strings
MD_FUNCTION_IMPL MD_String8 MD_FUNCTION_IMPL MD_String8
MD_S8(MD_u8 *str, MD_u64 size) MD_S8(MD_u8 *str, MD_u64 size)
{ {
@@ -306,9 +298,9 @@ MD_PushStringCopy(MD_String8 string)
{ {
MD_String8 res; MD_String8 res;
res.size = string.size; res.size = string.size;
res.str = _MD_PushArray(MD_u8, string.size+1); res.str = MD_PushArray(MD_u8, string.size + 1);
_MD_MemoryCopy(res.str, string.str, string.size); MD_MemoryCopy(res.str, string.str, string.size);
return res; return(res);
} }
MD_FUNCTION_IMPL MD_String8 MD_FUNCTION_IMPL MD_String8
@@ -318,7 +310,7 @@ MD_PushStringFV(char *fmt, va_list args)
va_list args2; va_list args2;
va_copy(args2, args); va_copy(args2, args);
MD_u64 needed_bytes = vsnprintf(0, 0, fmt, args)+1; MD_u64 needed_bytes = vsnprintf(0, 0, fmt, args)+1;
result.str = _MD_PushArray(MD_u8, needed_bytes); result.str = MD_PushArray(MD_u8, needed_bytes);
result.size = needed_bytes-1; result.size = needed_bytes-1;
vsnprintf((char*)result.str, needed_bytes, fmt, args2); vsnprintf((char*)result.str, needed_bytes, fmt, args2);
return result; return result;
@@ -341,7 +333,7 @@ MD_PushStringToList(MD_String8List *list, MD_String8 string)
list->node_count += 1; list->node_count += 1;
list->total_size += string.size; list->total_size += string.size;
MD_String8Node *node = _MD_PushArray(MD_String8Node, 1); MD_String8Node *node = MD_PushArray(MD_String8Node, 1);
node->next = 0; node->next = 0;
node->string = string; node->string = string;
if(list->last == 0) if(list->last == 0)
@@ -373,7 +365,7 @@ MD_PushStringListToList(MD_String8List *list, MD_String8List *to_push)
list->last = to_push->last; list->last = to_push->last;
} }
} }
_MD_MemoryZero(to_push, sizeof(*to_push)); MD_MemoryZero(to_push, sizeof(*to_push));
} }
MD_FUNCTION_IMPL MD_String8List MD_FUNCTION_IMPL MD_String8List
@@ -431,14 +423,14 @@ MD_JoinStringList(MD_String8List list, MD_String8 separator)
} }
MD_String8 string = MD_ZERO_STRUCT; MD_String8 string = MD_ZERO_STRUCT;
string.size = list.total_size + (list.node_count - 1)*separator.size; string.size = list.total_size + (list.node_count - 1)*separator.size;
string.str = _MD_PushArray(MD_u8, string.size); string.str = MD_PushArray(MD_u8, string.size);
MD_u64 write_pos = 0; MD_u64 write_pos = 0;
for(MD_String8Node *node = list.first; node; node = node->next) for(MD_String8Node *node = list.first; node; node = node->next)
{ {
_MD_MemoryCopy(string.str + write_pos, node->string.str, node->string.size); MD_MemoryCopy(string.str + write_pos, node->string.str, node->string.size);
write_pos += node->string.size; write_pos += node->string.size;
if (node != list.last){ if (node != list.last){
_MD_MemoryCopy(string.str + write_pos, separator.str, separator.size); MD_MemoryCopy(string.str + write_pos, separator.str, separator.size);
write_pos += separator.size; write_pos += separator.size;
} }
} }
@@ -486,8 +478,13 @@ MD_FUNCTION_IMPL MD_f64
MD_F64FromString(MD_String8 string) MD_F64FromString(MD_String8 string)
{ {
char str[64]; char str[64];
_MD_WriteStringToBuffer(string, sizeof(str), str); MD_u64 str_size = string.size;
return atof(str); if (str_size > sizeof(str) - 1){
str_size = sizeof(str) - 1;
}
MD_MemoryCopy(str, string.str, str_size);
str[str_size] = 0;
return(atof(str));
} }
MD_FUNCTION_IMPL MD_u64 MD_FUNCTION_IMPL MD_u64
@@ -570,7 +567,7 @@ MD_StyledStringFromString(MD_String8 string, MD_WordStyle word_style, MD_String8
{ {
result.size += separator.size*(words.node_count-1); result.size += separator.size*(words.node_count-1);
} }
result.str = _MD_PushArray(MD_u8, result.size); result.str = MD_PushArray(MD_u8, result.size);
{ {
MD_u64 write_pos = 0; MD_u64 write_pos = 0;
@@ -579,7 +576,7 @@ MD_StyledStringFromString(MD_String8 string, MD_WordStyle word_style, MD_String8
// NOTE(rjf): Write word string to result. // NOTE(rjf): Write word string to result.
{ {
_MD_MemoryCopy(result.str + write_pos, node->string.str, node->string.size); MD_MemoryCopy(result.str + write_pos, node->string.str, node->string.size);
// NOTE(rjf): Transform string based on word style. // NOTE(rjf): Transform string based on word style.
switch(word_style) switch(word_style)
@@ -626,7 +623,7 @@ MD_StyledStringFromString(MD_String8 string, MD_WordStyle word_style, MD_String8
if(node->next) if(node->next)
{ {
_MD_MemoryCopy(result.str + write_pos, separator.str, separator.size); MD_MemoryCopy(result.str + write_pos, separator.str, separator.size);
write_pos += separator.size; write_pos += separator.size;
} }
} }
@@ -851,7 +848,7 @@ MD_FUNCTION MD_String8
MD_S8FromS16(MD_String16 in) MD_S8FromS16(MD_String16 in)
{ {
MD_u64 cap = in.size*3; MD_u64 cap = in.size*3;
MD_u8 *str = _MD_PushArray(MD_u8, cap + 1); MD_u8 *str = MD_PushArray(MD_u8, cap + 1);
MD_u16 *ptr = in.str; MD_u16 *ptr = in.str;
MD_u16 *opl = ptr + in.size; MD_u16 *opl = ptr + in.size;
MD_u64 size = 0; MD_u64 size = 0;
@@ -870,7 +867,7 @@ MD_FUNCTION MD_String16
MD_S16FromS8(MD_String8 in) MD_S16FromS8(MD_String8 in)
{ {
MD_u64 cap = in.size*2; MD_u64 cap = in.size*2;
MD_u16 *str = _MD_PushArray(MD_u16, (cap + 1)); MD_u16 *str = MD_PushArray(MD_u16, (cap + 1));
MD_u8 *ptr = in.str; MD_u8 *ptr = in.str;
MD_u8 *opl = ptr + in.size; MD_u8 *opl = ptr + in.size;
MD_u64 size = 0; MD_u64 size = 0;
@@ -890,7 +887,7 @@ MD_FUNCTION MD_String8
MD_S8FromS32(MD_String32 in) MD_S8FromS32(MD_String32 in)
{ {
MD_u64 cap = in.size*4; MD_u64 cap = in.size*4;
MD_u8 *str = _MD_PushArray(MD_u8, cap + 1); MD_u8 *str = MD_PushArray(MD_u8, cap + 1);
MD_u32 *ptr = in.str; MD_u32 *ptr = in.str;
MD_u32 *opl = ptr + in.size; MD_u32 *opl = ptr + in.size;
MD_u64 size = 0; MD_u64 size = 0;
@@ -907,7 +904,7 @@ MD_FUNCTION MD_String32
MD_S32FromS8(MD_String8 in) MD_S32FromS8(MD_String8 in)
{ {
MD_u64 cap = in.size; MD_u64 cap = in.size;
MD_u32 *str = _MD_PushArray(MD_u32, (cap + 1)); MD_u32 *str = MD_PushArray(MD_u32, (cap + 1));
MD_u8 *ptr = in.str; MD_u8 *ptr = in.str;
MD_u8 *opl = ptr + in.size; MD_u8 *opl = ptr + in.size;
MD_u64 size = 0; MD_u64 size = 0;
@@ -932,7 +929,7 @@ _MD_Map_Initialize(MD_Map *map)
if(map->table_size == 0) if(map->table_size == 0)
{ {
map->table_size = 4096; map->table_size = 4096;
map->table = _MD_PushArray(MD_MapSlot *, map->table_size); map->table = MD_PushArray(MD_MapSlot *, map->table_size);
} }
} }
@@ -978,7 +975,7 @@ MD_StringMap_Insert(MD_Map *map, MD_MapCollisionRule collision_rule, MD_String8
if(slot == 0 || (slot != 0 && collision_rule == MD_MapCollisionRule_Chain)) if(slot == 0 || (slot != 0 && collision_rule == MD_MapCollisionRule_Chain))
{ {
slot = _MD_PushArray(MD_MapSlot, 1); slot = MD_PushArray(MD_MapSlot, 1);
if(slot) if(slot)
{ {
slot->next = 0; slot->next = 0;
@@ -1004,7 +1001,7 @@ MD_StringMap_Insert(MD_Map *map, MD_MapCollisionRule collision_rule, MD_String8
{ {
slot->value = value; slot->value = value;
slot->hash = hash; slot->hash = hash;
MD_String8 *string_copy = _MD_PushArray(MD_String8, 1); MD_String8 *string_copy = MD_PushArray(MD_String8, 1);
*string_copy = MD_PushStringCopy(string); *string_copy = MD_PushStringCopy(string);
slot->key = string_copy; slot->key = string_copy;
} }
@@ -1051,7 +1048,6 @@ MD_PtrMap_Lookup(MD_Map *map, void *key)
_MD_Map_Initialize(map); _MD_Map_Initialize(map);
MD_MapSlot *slot = 0; MD_MapSlot *slot = 0;
MD_u64 hash = MD_HashPointer(key); MD_u64 hash = MD_HashPointer(key);
MD_u64 index = hash % map->table_size; MD_u64 index = hash % map->table_size;
for(MD_MapSlot *candidate = map->table[index]; candidate; candidate = candidate->next) for(MD_MapSlot *candidate = map->table[index]; candidate; candidate = candidate->next)
@@ -1086,7 +1082,7 @@ MD_PtrMap_Insert(MD_Map *map, MD_MapCollisionRule collision_rule, void *key, voi
if(slot == 0 || (slot != 0 && collision_rule == MD_MapCollisionRule_Chain)) if(slot == 0 || (slot != 0 && collision_rule == MD_MapCollisionRule_Chain))
{ {
slot = _MD_PushArray(MD_MapSlot, 1); slot = MD_PushArray(MD_MapSlot, 1);
if(slot) if(slot)
{ {
slot->next = 0; slot->next = 0;
@@ -1167,7 +1163,7 @@ _MD_TokenizerScanEscaped(MD_u8 *at, MD_u8 *one_past_last, MD_u8 c)
else at += 1; else at += 1;
} }
if (*at == c) at += 1; if (at < one_past_last && *at == c) at += 1;
return at; return at;
} }
@@ -1215,7 +1211,7 @@ MD_FUNCTION_IMPL MD_Token
MD_Parse_LexNext(MD_ParseCtx *ctx) MD_Parse_LexNext(MD_ParseCtx *ctx)
{ {
MD_Token token; MD_Token token;
_MD_MemoryZero(&token, sizeof(token)); MD_MemoryZero(&token, sizeof(token));
MD_u8 *one_past_last = ctx->file_contents.str + ctx->file_contents.size; MD_u8 *one_past_last = ctx->file_contents.str + ctx->file_contents.size;
MD_u8 *first = ctx->at; MD_u8 *first = ctx->at;
@@ -1407,7 +1403,7 @@ MD_Parse_PeekSkipSome(MD_ParseCtx *ctx, MD_TokenGroups skip_groups)
MD_b32 skip_regular = (skip_groups & MD_TokenGroup_Regular); MD_b32 skip_regular = (skip_groups & MD_TokenGroup_Regular);
MD_Token result; MD_Token result;
_MD_MemoryZero(&result, sizeof(result)); MD_MemoryZero(&result, sizeof(result));
loop: loop:
{ {
@@ -1509,7 +1505,7 @@ _MD_Error(MD_ParseCtx *ctx, MD_Node *node, MD_MessageKind kind, char *fmt, ...)
// NOTE(mal): Ignore errors after first catastrophic error // NOTE(mal): Ignore errors after first catastrophic error
if(ctx->error_level < MD_MessageKind_CatastrophicError || !prev_error || prev_error->next) if(ctx->error_level < MD_MessageKind_CatastrophicError || !prev_error || prev_error->next)
{ {
MD_Error *error = _MD_PushArray(MD_Error, 1); MD_Error *error = MD_PushArray(MD_Error, 1);
error->node = node; error->node = node;
error->kind = kind; error->kind = kind;
va_list args; va_list args;
@@ -1547,7 +1543,7 @@ MD_MakeNode(MD_NodeKind kind, MD_String8 string,
MD_String8 whole_string, MD_String8 filename, MD_String8 whole_string, MD_String8 filename,
MD_u8 *file_contents, MD_u8 *at) MD_u8 *file_contents, MD_u8 *at)
{ {
MD_Node *node = _MD_PushArray(MD_Node, 1); MD_Node *node = MD_PushArray(MD_Node, 1);
node->kind = kind; node->kind = kind;
node->string = string; node->string = string;
node->whole_string = whole_string; node->whole_string = whole_string;
@@ -1620,7 +1616,7 @@ MD_ParseOneNodeFromCtx(MD_ParseCtx *ctx)
MD_Error *ctx_last_error = ctx->last_error; MD_Error *ctx_last_error = ctx->last_error;
MD_Token token; MD_Token token;
_MD_MemoryZero(&token, sizeof(token)); MD_MemoryZero(&token, sizeof(token));
MD_Node *first_tag = 0; MD_Node *first_tag = 0;
MD_Node *last_tag = 0; MD_Node *last_tag = 0;
@@ -1647,7 +1643,7 @@ MD_ParseOneNodeFromCtx(MD_ParseCtx *ctx)
} }
else if(MD_Parse_RequireKind(ctx, MD_TokenKind_Newline, 0)) else if(MD_Parse_RequireKind(ctx, MD_TokenKind_Newline, 0))
{ {
_MD_MemoryZero(&comment_token, sizeof(comment_token)); MD_MemoryZero(&comment_token, sizeof(comment_token));
} }
} }
else if(MD_TokenKindIsWhitespace(token.kind)) else if(MD_TokenKindIsWhitespace(token.kind))
@@ -1662,8 +1658,9 @@ MD_ParseOneNodeFromCtx(MD_ParseCtx *ctx)
comment_before = comment_token.string; comment_before = comment_token.string;
if(!_MD_CommentIsSyntacticallyCorrect(comment_token)) if(!_MD_CommentIsSyntacticallyCorrect(comment_token))
{ {
_MD_TokenError(ctx, comment_token, MD_MessageKind_CatastrophicError, "Unterminated comment \"%.*s\"", MD_String8 capped = MD_StringPrefix(comment_token.outer_string, MD_UNTERMINATED_TOKEN_LEN_CAP);
MD_StringExpand(MD_StringPrefix(comment_token.outer_string, _MD_MAX_UNTERMINATED_TOKEN_ERROR_LEN))); _MD_TokenError(ctx, comment_token, MD_MessageKind_CatastrophicError,
"Unterminated comment \"%.*s\"", MD_StringExpand(capped));
} }
} }
@@ -1702,8 +1699,9 @@ MD_ParseOneNodeFromCtx(MD_ParseCtx *ctx)
{ {
if(!_MD_StringLiteralIsBalanced(token)) if(!_MD_StringLiteralIsBalanced(token))
{ {
_MD_Error(ctx, result.node, MD_MessageKind_CatastrophicError, "Unterminated text literal \"%.*s\"", MD_String8 capped = MD_StringPrefix(token.outer_string, MD_UNTERMINATED_TOKEN_LEN_CAP);
MD_StringExpand(MD_StringPrefix(token.outer_string, _MD_MAX_UNTERMINATED_TOKEN_ERROR_LEN))); _MD_Error(ctx, result.node, MD_MessageKind_CatastrophicError,
"Unterminated text literal \"%.*s\"", MD_StringExpand(capped));
} }
} }
else if(token.kind == MD_TokenKind_Symbol && token.string.size == 1 && MD_CharIsReservedSymbol(token.string.str[0])) else if(token.kind == MD_TokenKind_Symbol && token.string.size == 1 && MD_CharIsReservedSymbol(token.string.str[0]))
@@ -1785,8 +1783,9 @@ MD_ParseOneNodeFromCtx(MD_ParseCtx *ctx)
comment_after = comment_token.string; comment_after = comment_token.string;
if(!_MD_CommentIsSyntacticallyCorrect(comment_token)) if(!_MD_CommentIsSyntacticallyCorrect(comment_token))
{ {
_MD_TokenError(ctx, comment_token, MD_MessageKind_CatastrophicError, "Unterminated comment \"%.*s\"", MD_String8 capped = MD_StringPrefix(comment_token.outer_string, MD_UNTERMINATED_TOKEN_LEN_CAP);
MD_StringExpand(MD_StringPrefix(comment_token.outer_string, _MD_MAX_UNTERMINATED_TOKEN_ERROR_LEN))); _MD_TokenError(ctx, comment_token, MD_MessageKind_CatastrophicError,
"Unterminated comment \"%.*s\"", MD_StringExpand(capped));
} }
} }
@@ -2486,7 +2485,7 @@ MD_FUNCTION_IMPL MD_CommandLine
MD_CommandLine_Start(int argument_count, char **arguments) MD_CommandLine_Start(int argument_count, char **arguments)
{ {
MD_CommandLine cmdln = MD_ZERO_STRUCT; MD_CommandLine cmdln = MD_ZERO_STRUCT;
cmdln.arguments = _MD_PushArray(MD_String8, argument_count-1); cmdln.arguments = MD_PushArray(MD_String8, argument_count-1);
for(int i = 1; i < argument_count; i += 1) for(int i = 1; i < argument_count; i += 1)
{ {
cmdln.arguments[i-1] = MD_PushStringF("%s", arguments[i]); cmdln.arguments[i-1] = MD_PushStringF("%s", arguments[i]);
@@ -2620,7 +2619,7 @@ MD_LoadEntireFile(MD_String8 filename)
fseek(file, 0, SEEK_END); fseek(file, 0, SEEK_END);
MD_u64 file_size = ftell(file); MD_u64 file_size = ftell(file);
fseek(file, 0, SEEK_SET); fseek(file, 0, SEEK_SET);
file_contents.str = _MD_PushArray(MD_u8, file_size+1); file_contents.str = MD_PushArray(MD_u8, file_size+1);
if(file_contents.str) if(file_contents.str)
{ {
file_contents.size = file_size; file_contents.size = file_size;