mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-06 15:48:47 +00:00
robustify against /W4 on MSVC
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
cl>-nologo
|
cl>-nologo
|
||||||
cl>-FC
|
cl>-FC
|
||||||
cl>-MP
|
cl>-MP
|
||||||
|
cl>-W4 -wd4201 -wd4996 -wd4505
|
||||||
|
|
||||||
|
|
||||||
###### Clang Compiler #########################################################
|
###### Clang Compiler #########################################################
|
||||||
|
|||||||
+32
-20
@@ -210,7 +210,9 @@ MD_WIN32_FileIterNext(MD_Arena *arena, MD_FileIter *it)
|
|||||||
MD_u16 *filename_base = (MD_u16*)find_data->cFileName;
|
MD_u16 *filename_base = (MD_u16*)find_data->cFileName;
|
||||||
MD_u16 *ptr = filename_base;
|
MD_u16 *ptr = filename_base;
|
||||||
for (;*ptr != 0; ptr += 1);
|
for (;*ptr != 0; ptr += 1);
|
||||||
MD_String16 filename16 = {filename_base, (MD_u64)(ptr - filename_base)};
|
MD_String16 filename16 = {0};
|
||||||
|
filename16.str = filename_base;
|
||||||
|
filename16.size = (MD_u64)(ptr - filename_base);
|
||||||
result.filename = MD_S8FromS16(arena, filename16);
|
result.filename = MD_S8FromS16(arena, filename16);
|
||||||
result.file_size = ((((MD_u64)find_data->nFileSizeHigh) << 32) |
|
result.file_size = ((((MD_u64)find_data->nFileSizeHigh) << 32) |
|
||||||
((MD_u64)find_data->nFileSizeLow));
|
((MD_u64)find_data->nFileSizeLow));
|
||||||
@@ -266,6 +268,7 @@ MD_WIN32_Decommit(void *ptr, MD_u64 size)
|
|||||||
static void
|
static void
|
||||||
MD_WIN32_Release(void *ptr, MD_u64 size)
|
MD_WIN32_Release(void *ptr, MD_u64 size)
|
||||||
{
|
{
|
||||||
|
(void)size;
|
||||||
VirtualFree(ptr, 0, MEM_RELEASE);
|
VirtualFree(ptr, 0, MEM_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,6 +577,7 @@ MD_ArenaDefaultPopTo(MD_ArenaDefault *arena, MD_u64 pos)
|
|||||||
{
|
{
|
||||||
// pop chunks in the chain
|
// pop chunks in the chain
|
||||||
MD_u64 pos_clamped = MD_ClampBot(MD_IMPL_ArenaMinPos, pos);
|
MD_u64 pos_clamped = MD_ClampBot(MD_IMPL_ArenaMinPos, pos);
|
||||||
|
(void)pos_clamped;
|
||||||
{
|
{
|
||||||
MD_ArenaDefault *node = arena->current;
|
MD_ArenaDefault *node = arena->current;
|
||||||
for (MD_ArenaDefault *prev = 0;
|
for (MD_ArenaDefault *prev = 0;
|
||||||
@@ -1024,7 +1028,7 @@ MD_S8FmtV(MD_Arena *arena, char *fmt, va_list args)
|
|||||||
result.str = MD_PushArray(arena, MD_u8, needed_bytes);
|
result.str = MD_PushArray(arena, MD_u8, needed_bytes);
|
||||||
result.size = needed_bytes - 1;
|
result.size = needed_bytes - 1;
|
||||||
result.str[needed_bytes-1] = 0;
|
result.str[needed_bytes-1] = 0;
|
||||||
MD_IMPL_Vsnprintf((char*)result.str, needed_bytes, fmt, args2);
|
MD_IMPL_Vsnprintf((char*)result.str, (int)needed_bytes, fmt, args2);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1358,7 +1362,9 @@ MD_DecodeCodepointFromUtf8(MD_u8 *str, MD_u64 max)
|
|||||||
{
|
{
|
||||||
if (3 <= max)
|
if (3 <= max)
|
||||||
{
|
{
|
||||||
MD_u8 cont_byte[2] = {str[1], str[2]};
|
MD_u8 cont_byte[2] = {0};
|
||||||
|
cont_byte[0] = str[1];
|
||||||
|
cont_byte[1] = str[2];
|
||||||
if (md_utf8_class[cont_byte[0] >> 3] == 0 &&
|
if (md_utf8_class[cont_byte[0] >> 3] == 0 &&
|
||||||
md_utf8_class[cont_byte[1] >> 3] == 0)
|
md_utf8_class[cont_byte[1] >> 3] == 0)
|
||||||
{
|
{
|
||||||
@@ -1374,7 +1380,10 @@ MD_DecodeCodepointFromUtf8(MD_u8 *str, MD_u64 max)
|
|||||||
{
|
{
|
||||||
if (4 <= max)
|
if (4 <= max)
|
||||||
{
|
{
|
||||||
MD_u8 cont_byte[3] = {str[1], str[2], str[3]};
|
MD_u8 cont_byte[3] = {0};
|
||||||
|
cont_byte[0] = str[1];
|
||||||
|
cont_byte[1] = str[2];
|
||||||
|
cont_byte[2] = str[3];
|
||||||
if (md_utf8_class[cont_byte[0] >> 3] == 0 &&
|
if (md_utf8_class[cont_byte[0] >> 3] == 0 &&
|
||||||
md_utf8_class[cont_byte[1] >> 3] == 0 &&
|
md_utf8_class[cont_byte[1] >> 3] == 0 &&
|
||||||
md_utf8_class[cont_byte[2] >> 3] == 0)
|
md_utf8_class[cont_byte[2] >> 3] == 0)
|
||||||
@@ -1460,7 +1469,7 @@ MD_Utf16FromCodepoint(MD_u16 *out, MD_u32 codepoint)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
MD_u64 v = codepoint - 0x10000;
|
MD_u64 v = codepoint - 0x10000;
|
||||||
out[0] = 0xD800 + (v >> 10);
|
out[0] = (MD_u16)(0xD800 + (v >> 10));
|
||||||
out[1] = 0xDC00 + (v & MD_bitmask10);
|
out[1] = 0xDC00 + (v & MD_bitmask10);
|
||||||
advance = 2;
|
advance = 2;
|
||||||
}
|
}
|
||||||
@@ -1504,7 +1513,9 @@ MD_S16FromS8(MD_Arena *arena, MD_String8 in)
|
|||||||
}
|
}
|
||||||
str[size] = 0;
|
str[size] = 0;
|
||||||
MD_ArenaPutBack(arena, 2*(cap - size)); // := 2*((cap + 1) - (size + 1))
|
MD_ArenaPutBack(arena, 2*(cap - size)); // := 2*((cap + 1) - (size + 1))
|
||||||
MD_String16 result = {str, size};
|
MD_String16 result = {0};
|
||||||
|
result.str = str;
|
||||||
|
result.size = size;
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1516,7 +1527,6 @@ MD_S8FromS32(MD_Arena *arena, MD_String32 in)
|
|||||||
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;
|
||||||
MD_DecodedCodepoint consume;
|
|
||||||
for (;ptr < opl; ptr += 1)
|
for (;ptr < opl; ptr += 1)
|
||||||
{
|
{
|
||||||
size += MD_Utf8FromCodepoint(str + size, *ptr);
|
size += MD_Utf8FromCodepoint(str + size, *ptr);
|
||||||
@@ -1544,7 +1554,9 @@ MD_S32FromS8(MD_Arena *arena, MD_String8 in)
|
|||||||
}
|
}
|
||||||
str[size] = 0;
|
str[size] = 0;
|
||||||
MD_ArenaPutBack(arena, 4*(cap - size)); // := 4*((cap + 1) - (size + 1))
|
MD_ArenaPutBack(arena, 4*(cap - size)); // := 4*((cap + 1) - (size + 1))
|
||||||
MD_String32 result = {str, size};
|
MD_String32 result = {0};
|
||||||
|
result.str = str;
|
||||||
|
result.size = size;
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1681,7 +1693,7 @@ MD_StringIsCStyleInt(MD_String8 string)
|
|||||||
for (;ptr < opl && (*ptr == '+' || *ptr == '-'); ptr += 1);
|
for (;ptr < opl && (*ptr == '+' || *ptr == '-'); ptr += 1);
|
||||||
|
|
||||||
// radix from prefix
|
// radix from prefix
|
||||||
MD_u64 radix = 10;
|
MD_u32 radix = 10;
|
||||||
if (ptr < opl)
|
if (ptr < opl)
|
||||||
{
|
{
|
||||||
MD_u8 c0 = *ptr;
|
MD_u8 c0 = *ptr;
|
||||||
@@ -1749,7 +1761,7 @@ MD_CStyleIntFromString(MD_String8 string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// radix from prefix
|
// radix from prefix
|
||||||
MD_u64 radix = 10;
|
MD_u32 radix = 10;
|
||||||
if (p < string.size)
|
if (p < string.size)
|
||||||
{
|
{
|
||||||
MD_u8 c0 = string.str[p];
|
MD_u8 c0 = string.str[p];
|
||||||
@@ -3398,7 +3410,7 @@ MD_NodeDeepMatch(MD_Node *a, MD_Node *b, MD_MatchFlags flags)
|
|||||||
|
|
||||||
MD_FUNCTION void
|
MD_FUNCTION void
|
||||||
MD_ExprOprPush(MD_Arena *arena, MD_ExprOprList *list,
|
MD_ExprOprPush(MD_Arena *arena, MD_ExprOprList *list,
|
||||||
MD_ExprOprKind kind, MD_u64 precedence, MD_String8 string,
|
MD_ExprOprKind kind, MD_u32 precedence, MD_String8 string,
|
||||||
MD_u32 op_id, void *op_ptr)
|
MD_u32 op_id, void *op_ptr)
|
||||||
{
|
{
|
||||||
MD_ExprOpr *op = MD_PushArrayZero(arena, MD_ExprOpr, 1);
|
MD_ExprOpr *op = MD_PushArrayZero(arena, MD_ExprOpr, 1);
|
||||||
@@ -3512,11 +3524,11 @@ MD_ExprBakeOprTableFromList(MD_Arena *arena, MD_ExprOprList *list)
|
|||||||
// save list
|
// save list
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MD_ExprOprList *list = result.table + op_kind;
|
MD_ExprOprList *saved_list = result.table + op_kind;
|
||||||
MD_ExprOpr *op_node_copy = MD_PushArray(arena, MD_ExprOpr, 1);
|
MD_ExprOpr *op_node_copy = MD_PushArray(arena, MD_ExprOpr, 1);
|
||||||
*op_node_copy = *op;
|
*op_node_copy = *op;
|
||||||
MD_QueuePush(list->first, list->last, op_node_copy);
|
MD_QueuePush(saved_list->first, saved_list->last, op_node_copy);
|
||||||
list->count += 1;
|
saved_list->count += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3780,12 +3792,12 @@ MD_ExprParse_MinPrecedence(MD_Arena *arena, MD_ExprParseCtx *ctx,
|
|||||||
i_op < MD_ArrayCount(ctx->accel.postfix_set_ops);
|
i_op < MD_ArrayCount(ctx->accel.postfix_set_ops);
|
||||||
++i_op)
|
++i_op)
|
||||||
{
|
{
|
||||||
MD_ExprOpr *op = ctx->accel.postfix_set_ops[i_op];
|
MD_ExprOpr *op2 = ctx->accel.postfix_set_ops[i_op];
|
||||||
if(op && op->precedence >= min_precedence &&
|
if(op2 && op2->precedence >= min_precedence &&
|
||||||
node->flags == ctx->accel.postfix_set_flags[i_op])
|
node->flags == ctx->accel.postfix_set_flags[i_op])
|
||||||
{
|
{
|
||||||
*iter = MD_NodeNextWithLimit(*iter, opl);
|
*iter = MD_NodeNextWithLimit(*iter, opl);
|
||||||
result = MD_Expr_NewOpr(arena, op, node, result, 0);
|
result = MD_Expr_NewOpr(arena, op2, node, result, 0);
|
||||||
found_postfix_setlike_operator = 1;
|
found_postfix_setlike_operator = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3852,7 +3864,7 @@ MD_S8ListPush(arena, out, indent_string);\
|
|||||||
MD_S8ListPush(arena, out, tag->string);
|
MD_S8ListPush(arena, out, tag->string);
|
||||||
if(flags & MD_GenerateFlag_TagArguments && !MD_NodeIsNil(tag->first_child))
|
if(flags & MD_GenerateFlag_TagArguments && !MD_NodeIsNil(tag->first_child))
|
||||||
{
|
{
|
||||||
int tag_arg_indent = indent + 1 + tag->string.size + 1;
|
int tag_arg_indent = (int)(indent + 1 + tag->string.size + 1);
|
||||||
MD_S8ListPush(arena, out, MD_S8Lit("("));
|
MD_S8ListPush(arena, out, MD_S8Lit("("));
|
||||||
for(MD_EachNode(child, tag->first_child))
|
for(MD_EachNode(child, tag->first_child))
|
||||||
{
|
{
|
||||||
@@ -3891,7 +3903,7 @@ MD_S8ListPush(arena, out, indent_string);\
|
|||||||
MD_PrintIndent(indent);
|
MD_PrintIndent(indent);
|
||||||
MD_ArenaTemp scratch = MD_GetScratch(&arena, 1);
|
MD_ArenaTemp scratch = MD_GetScratch(&arena, 1);
|
||||||
MD_String8List flag_strs = MD_StringListFromNodeFlags(scratch.arena, node->flags);
|
MD_String8List flag_strs = MD_StringListFromNodeFlags(scratch.arena, node->flags);
|
||||||
MD_StringJoin join = { MD_S8Lit(""), MD_S8Lit("|"), MD_S8Lit("") };
|
MD_StringJoin join = { MD_S8LitComp(""), MD_S8LitComp("|"), MD_S8LitComp("") };
|
||||||
MD_String8 flag_str = MD_S8ListJoin(arena, flag_strs, &join);
|
MD_String8 flag_str = MD_S8ListJoin(arena, flag_strs, &join);
|
||||||
MD_S8ListPush(arena, out, MD_S8Lit("// flags: \""));
|
MD_S8ListPush(arena, out, MD_S8Lit("// flags: \""));
|
||||||
MD_S8ListPush(arena, out, flag_str);
|
MD_S8ListPush(arena, out, flag_str);
|
||||||
@@ -4019,7 +4031,7 @@ MD_S8ListPush(arena, out, indent_string);\
|
|||||||
MD_S8ListPush(arena, out, tag->string);
|
MD_S8ListPush(arena, out, tag->string);
|
||||||
if(!MD_NodeIsNil(tag->first_child))
|
if(!MD_NodeIsNil(tag->first_child))
|
||||||
{
|
{
|
||||||
int tag_arg_indent = indent + 1 + tag->string.size + 1;
|
int tag_arg_indent = (int)(indent + 1 + tag->string.size + 1);
|
||||||
MD_S8ListPush(arena, out, MD_S8Lit("("));
|
MD_S8ListPush(arena, out, MD_S8Lit("("));
|
||||||
MD_u32 last_line = MD_CodeLocFromNode(tag).line;
|
MD_u32 last_line = MD_CodeLocFromNode(tag).line;
|
||||||
for(MD_EachNode(child, tag->first_child))
|
for(MD_EachNode(child, tag->first_child))
|
||||||
|
|||||||
+1
-1
@@ -1181,7 +1181,7 @@ MD_FUNCTION MD_b32 MD_NodeDeepMatch(MD_Node *a, MD_Node *b, MD_MatchFlags flags)
|
|||||||
//~ Expression Parsing
|
//~ Expression Parsing
|
||||||
|
|
||||||
MD_FUNCTION void MD_ExprOprPush(MD_Arena *arena, MD_ExprOprList *list,
|
MD_FUNCTION void MD_ExprOprPush(MD_Arena *arena, MD_ExprOprList *list,
|
||||||
MD_ExprOprKind kind, MD_u64 precedence,
|
MD_ExprOprKind kind, MD_u32 precedence,
|
||||||
MD_String8 op_string,
|
MD_String8 op_string,
|
||||||
MD_u32 op_id, void *op_ptr);
|
MD_u32 op_id, void *op_ptr);
|
||||||
|
|
||||||
|
|||||||
@@ -585,7 +585,7 @@ cl = lg; \
|
|||||||
//- rjf: get string length
|
//- rjf: get string length
|
||||||
s = (char *)str.str;
|
s = (char *)str.str;
|
||||||
sn = (const char *)(str.str + str.size);
|
sn = (const char *)(str.str + str.size);
|
||||||
l = str.size;
|
l = (int)str.size;
|
||||||
|
|
||||||
//- rjf: clamp to precision
|
//- rjf: clamp to precision
|
||||||
lead[0] = 0;
|
lead[0] = 0;
|
||||||
|
|||||||
+30
-30
@@ -3,7 +3,7 @@
|
|||||||
#include "md.h"
|
#include "md.h"
|
||||||
#include "md.c"
|
#include "md.c"
|
||||||
|
|
||||||
MD_Arena *arena = 0;
|
MD_Arena *g_arena = 0;
|
||||||
|
|
||||||
typedef enum{
|
typedef enum{
|
||||||
ExpressionErrorKind_Null,
|
ExpressionErrorKind_Null,
|
||||||
@@ -233,7 +233,7 @@ static void reset_global_messages()
|
|||||||
static void bake_operator_error_handler(MD_MessageKind kind, MD_String8 s)
|
static void bake_operator_error_handler(MD_MessageKind kind, MD_String8 s)
|
||||||
{
|
{
|
||||||
// NOTE: Append error to global error list
|
// NOTE: Append error to global error list
|
||||||
MD_Message *message = MD_PushArrayZero(arena, MD_Message, 1);
|
MD_Message *message = MD_PushArrayZero(g_arena, MD_Message, 1);
|
||||||
message->kind = kind;
|
message->kind = kind;
|
||||||
message->string = s;
|
message->string = s;
|
||||||
MD_MessageListPush(&global_message_list, message);
|
MD_MessageListPush(&global_message_list, message);
|
||||||
@@ -249,7 +249,7 @@ operator_array[Op_##name].op = (MD_ExprOpr){ .op_id = Op_##name, .kind = MD_Expr
|
|||||||
OPERATORS
|
OPERATORS
|
||||||
#undef X
|
#undef X
|
||||||
|
|
||||||
arena = MD_ArenaAlloc();
|
g_arena = MD_ArenaAlloc();
|
||||||
|
|
||||||
/* NOTE: Operator table bake errors */
|
/* NOTE: Operator table bake errors */
|
||||||
{
|
{
|
||||||
@@ -259,79 +259,79 @@ operator_array[Op_##name].op = (MD_ExprOpr){ .op_id = Op_##name, .kind = MD_Expr
|
|||||||
MD_String8 plus = MD_S8Lit("+");
|
MD_String8 plus = MD_S8Lit("+");
|
||||||
MD_String8 minus = MD_S8Lit("-");
|
MD_String8 minus = MD_S8Lit("-");
|
||||||
MD_String8 cast = MD_S8Lit("()");
|
MD_String8 cast = MD_S8Lit("()");
|
||||||
MD_Node *plus_node = MD_MakeNode(arena, MD_NodeKind_Main, plus, plus, 0);
|
MD_Node *plus_node = MD_MakeNode(g_arena, MD_NodeKind_Main, plus, plus, 0);
|
||||||
MD_Node *cast_node = MD_MakeNode(arena, MD_NodeKind_Main, cast, cast, 0);
|
MD_Node *cast_node = MD_MakeNode(g_arena, MD_NodeKind_Main, cast, cast, 0);
|
||||||
MD_Node *minus_node = MD_MakeNode(arena, MD_NodeKind_Main, minus, minus, 0);
|
MD_Node *minus_node = MD_MakeNode(g_arena, MD_NodeKind_Main, minus, minus, 0);
|
||||||
MD_Node *plus_node_bis = MD_MakeNode(arena, MD_NodeKind_Main, plus, plus, 0);
|
MD_Node *plus_node_bis = MD_MakeNode(g_arena, MD_NodeKind_Main, plus, plus, 0);
|
||||||
|
|
||||||
MD_ExprSetBakeOperatorErrorHandler(bake_operator_error_handler);
|
MD_ExprSetBakeOperatorErrorHandler(bake_operator_error_handler);
|
||||||
|
|
||||||
// NOTE: Wrong operator kind
|
// NOTE: Wrong operator kind
|
||||||
reset_global_messages();
|
reset_global_messages();
|
||||||
operator_list = (MD_ExprOprList){0};
|
operator_list = (MD_ExprOprList){0};
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Null, 1, MD_S8Lit("+"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Null, 1, MD_S8Lit("+"),
|
||||||
Op_Addition, plus_node);
|
Op_Addition, plus_node);
|
||||||
op_table = MD_ExprBakeOprTableFromList(arena, &operator_list);
|
op_table = MD_ExprBakeOprTableFromList(g_arena, &operator_list);
|
||||||
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
||||||
global_message_list.node_count == 1);
|
global_message_list.node_count == 1);
|
||||||
|
|
||||||
// NOTE: () not as unary postfix
|
// NOTE: () not as unary postfix
|
||||||
operator_list = (MD_ExprOprList){0};
|
operator_list = (MD_ExprOprList){0};
|
||||||
reset_global_messages();
|
reset_global_messages();
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Prefix, 1, MD_S8Lit("()"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Prefix, 1, MD_S8Lit("()"),
|
||||||
23 /* arbitrary MD_ExprOprKind */, cast_node);
|
23 /* arbitrary MD_ExprOprKind */, cast_node);
|
||||||
op_table = MD_ExprBakeOprTableFromList(arena, &operator_list);
|
op_table = MD_ExprBakeOprTableFromList(g_arena, &operator_list);
|
||||||
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
||||||
global_message_list.node_count == 1);
|
global_message_list.node_count == 1);
|
||||||
|
|
||||||
// NOTE: Repeat operator
|
// NOTE: Repeat operator
|
||||||
operator_list = (MD_ExprOprList){0};
|
operator_list = (MD_ExprOprList){0};
|
||||||
reset_global_messages();
|
reset_global_messages();
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Binary, 1, MD_S8Lit("+"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Binary, 1, MD_S8Lit("+"),
|
||||||
Op_Addition, plus_node);
|
Op_Addition, plus_node);
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Binary, 1, MD_S8Lit("+"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Binary, 1, MD_S8Lit("+"),
|
||||||
Op_Addition, plus_node_bis);
|
Op_Addition, plus_node_bis);
|
||||||
op_table = MD_ExprBakeOprTableFromList(arena, &operator_list);
|
op_table = MD_ExprBakeOprTableFromList(g_arena, &operator_list);
|
||||||
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
||||||
global_message_list.node_count == 1);
|
global_message_list.node_count == 1);
|
||||||
|
|
||||||
operator_list = (MD_ExprOprList){0};
|
operator_list = (MD_ExprOprList){0};
|
||||||
reset_global_messages();
|
reset_global_messages();
|
||||||
// NOTE: Binary-postfix operator conflict
|
// NOTE: Binary-postfix operator conflict
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Binary, 1, MD_S8Lit("+"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Binary, 1, MD_S8Lit("+"),
|
||||||
Op_Addition, plus_node);
|
Op_Addition, plus_node);
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Postfix, 1, MD_S8Lit("+"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Postfix, 1, MD_S8Lit("+"),
|
||||||
Op_Addition, plus_node_bis);
|
Op_Addition, plus_node_bis);
|
||||||
op_table = MD_ExprBakeOprTableFromList(arena, &operator_list);
|
op_table = MD_ExprBakeOprTableFromList(g_arena, &operator_list);
|
||||||
MD_Assert(global_max_message_kind == MD_MessageKind_Warning
|
MD_Assert(global_max_message_kind == MD_MessageKind_Warning
|
||||||
&& global_message_list.node_count == 1);
|
&& global_message_list.node_count == 1);
|
||||||
|
|
||||||
operator_list = (MD_ExprOprList){0};
|
operator_list = (MD_ExprOprList){0};
|
||||||
reset_global_messages();
|
reset_global_messages();
|
||||||
// NOTE: Same precedence difference associativity conflict
|
// NOTE: Same precedence difference associativity conflict
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Binary, 1, MD_S8Lit("+"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Binary, 1, MD_S8Lit("+"),
|
||||||
Op_Addition, plus_node);
|
Op_Addition, plus_node);
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_BinaryRightAssociative, 1, MD_S8Lit("-"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_BinaryRightAssociative, 1, MD_S8Lit("-"),
|
||||||
Op_Addition, minus_node);
|
Op_Addition, minus_node);
|
||||||
op_table = MD_ExprBakeOprTableFromList(arena, &operator_list);
|
op_table = MD_ExprBakeOprTableFromList(g_arena, &operator_list);
|
||||||
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
||||||
global_message_list.node_count == 1);
|
global_message_list.node_count == 1);
|
||||||
|
|
||||||
// NOTE: Multitoken operator
|
// NOTE: Multitoken operator
|
||||||
reset_global_messages();
|
reset_global_messages();
|
||||||
operator_list = (MD_ExprOprList){0};
|
operator_list = (MD_ExprOprList){0};
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Prefix, 1, MD_S8Lit("+ +"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Prefix, 1, MD_S8Lit("+ +"),
|
||||||
23 /* arbitrary MD_ExprOprKind */, plus_node);
|
23 /* arbitrary MD_ExprOprKind */, plus_node);
|
||||||
op_table = MD_ExprBakeOprTableFromList(arena, &operator_list);
|
op_table = MD_ExprBakeOprTableFromList(g_arena, &operator_list);
|
||||||
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
||||||
global_message_list.node_count == 1);
|
global_message_list.node_count == 1);
|
||||||
|
|
||||||
// NOTE: Wrong token kind operator
|
// NOTE: Wrong token kind operator
|
||||||
reset_global_messages();
|
reset_global_messages();
|
||||||
operator_list = (MD_ExprOprList){0};
|
operator_list = (MD_ExprOprList){0};
|
||||||
MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Prefix, 1, MD_S8Lit("123"),
|
MD_ExprOprPush(g_arena, &operator_list, MD_ExprOprKind_Prefix, 1, MD_S8Lit("123"),
|
||||||
23 /* arbitrary MD_ExprOprKind */, plus_node);
|
23 /* arbitrary MD_ExprOprKind */, plus_node);
|
||||||
op_table = MD_ExprBakeOprTableFromList(arena, &operator_list);
|
op_table = MD_ExprBakeOprTableFromList(g_arena, &operator_list);
|
||||||
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
MD_Assert(global_max_message_kind == MD_MessageKind_Warning &&
|
||||||
global_message_list.node_count == 1);
|
global_message_list.node_count == 1);
|
||||||
}
|
}
|
||||||
@@ -341,12 +341,12 @@ operator_array[Op_##name].op = (MD_ExprOpr){ .op_id = Op_##name, .kind = MD_Expr
|
|||||||
for(Op op = Op_Null+1; op < Op_COUNT; ++op)
|
for(Op op = Op_Null+1; op < Op_COUNT; ++op)
|
||||||
{
|
{
|
||||||
OperatorDescription *desc = operator_array + op;
|
OperatorDescription *desc = operator_array + op;
|
||||||
MD_Node *node = MD_MakeNode(arena, MD_NodeKind_Main, desc->s, desc->s, 0);
|
MD_Node *node = MD_MakeNode(g_arena, MD_NodeKind_Main, desc->s, desc->s, 0);
|
||||||
MD_ExprOprPush(arena, &operator_list, desc->op.kind, desc->op.precedence, desc->s,
|
MD_ExprOprPush(g_arena, &operator_list, desc->op.kind, desc->op.precedence, desc->s,
|
||||||
op, node);
|
op, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
MD_ExprOprTable op_table = MD_ExprBakeOprTableFromList(arena, &operator_list);
|
MD_ExprOprTable op_table = MD_ExprBakeOprTableFromList(g_arena, &operator_list);
|
||||||
|
|
||||||
// NOTE(mal): I'm trying something different for expression parser tests. Normally one would take the
|
// NOTE(mal): I'm trying something different for expression parser tests. Normally one would take the
|
||||||
// output of MD_ExprParse and compare it against the expected output expression tree.
|
// output of MD_ExprParse and compare it against the expected output expression tree.
|
||||||
@@ -417,13 +417,13 @@ operator_array[Op_##name].op = (MD_ExprOpr){ .op_id = Op_##name, .kind = MD_Expr
|
|||||||
MD_String8 q = MD_S8CString(test.q);
|
MD_String8 q = MD_S8CString(test.q);
|
||||||
MD_String8 a = MD_S8CString(test.a);
|
MD_String8 a = MD_S8CString(test.a);
|
||||||
|
|
||||||
MD_ParseResult parse = MD_ParseWholeString(arena, MD_S8Lit("test"), q);
|
MD_ParseResult parse = MD_ParseWholeString(g_arena, MD_S8Lit("test"), q);
|
||||||
if(parse.errors.max_message_kind == MD_MessageKind_Null)
|
if(parse.errors.max_message_kind == MD_MessageKind_Null)
|
||||||
{
|
{
|
||||||
MD_ExprParseResult expr_parse = MD_ExprParse(arena, &op_table, parse.node->first_child, MD_NilNode());
|
MD_ExprParseResult expr_parse = MD_ExprParse(g_arena, &op_table, parse.node->first_child, MD_NilNode());
|
||||||
if(expr_parse.errors.max_message_kind == MD_MessageKind_Null)
|
if(expr_parse.errors.max_message_kind == MD_MessageKind_Null)
|
||||||
{
|
{
|
||||||
MD_String8 parser_answer = parenthesize(arena, operator_array, expr_parse.expr);
|
MD_String8 parser_answer = parenthesize(g_arena, operator_array, expr_parse.expr);
|
||||||
if(!MD_S8Match(parser_answer, a, 0))
|
if(!MD_S8Match(parser_answer, a, 0))
|
||||||
{
|
{
|
||||||
printf("Example %d : Expected answer for %.*s is %.*s. Got %.*s\n",
|
printf("Example %d : Expected answer for %.*s is %.*s. Got %.*s\n",
|
||||||
|
|||||||
+26
-26
@@ -15,13 +15,13 @@ test_ctx;
|
|||||||
static void
|
static void
|
||||||
BeginTest(char *name)
|
BeginTest(char *name)
|
||||||
{
|
{
|
||||||
int length = MD_CalculateCStringLength(name);
|
MD_u64 length = MD_CalculateCStringLength(name);
|
||||||
int spaces = 25 - length;
|
MD_u64 spaces = 25 - length;
|
||||||
if(spaces < 0)
|
if(spaces < 0)
|
||||||
{
|
{
|
||||||
spaces = 0;
|
spaces = 0;
|
||||||
}
|
}
|
||||||
printf("\"%s\" %.*s [", name, spaces, "------------------------------");
|
printf("\"%s\" %.*s [", name, (int)spaces, "------------------------------");
|
||||||
test_ctx.number_of_tests = 0;
|
test_ctx.number_of_tests = 0;
|
||||||
test_ctx.number_passed = 0;
|
test_ctx.number_passed = 0;
|
||||||
}
|
}
|
||||||
@@ -389,7 +389,7 @@ int main(void)
|
|||||||
|
|
||||||
Test("Errors")
|
Test("Errors")
|
||||||
{
|
{
|
||||||
struct { char *s; int columns[2]; } tests[] = {
|
struct { char *s; MD_u64 columns[2]; } tests[] = {
|
||||||
{"{", {1}},
|
{"{", {1}},
|
||||||
{"}", {1}},
|
{"}", {1}},
|
||||||
{"'", {1}},
|
{"'", {1}},
|
||||||
@@ -438,9 +438,9 @@ int main(void)
|
|||||||
{
|
{
|
||||||
MD_String8 key_strings[] =
|
MD_String8 key_strings[] =
|
||||||
{
|
{
|
||||||
MD_S8Lit("\xed\x80\x73\x71\x78\xba\xff\xd6\x87\x83\xcd\x20\x28\xf7\x1c\xc1\x5f\xca\x98\x9c\x5a\xab\x0c\xae\x9a\x60\x57\x03\xeb\x1f\xde\x99"),
|
MD_S8LitComp("\xed\x80\x73\x71\x78\xba\xff\xd6\x87\x83\xcd\x20\x28\xf7\x1c\xc1\x5f\xca\x98\x9c\x5a\xab\x0c\xae\x9a\x60\x57\x03\xeb\x1f\xde\x99"),
|
||||||
MD_S8Lit("\x4c\x80\xb7\x8b\xbf\x65\x5a\x4b\xc1\x2a\xc3\x5f\xe1\x66\xfb\x0d\x72\x83\x1c\x63\xba\xb5\x97\x02\x3f\x6a\xe0\x2a\x1b\x82\x07\x76"),
|
MD_S8LitComp("\x4c\x80\xb7\x8b\xbf\x65\x5a\x4b\xc1\x2a\xc3\x5f\xe1\x66\xfb\x0d\x72\x83\x1c\x63\xba\xb5\x97\x02\x3f\x6a\xe0\x2a\x1b\x82\x07\x76"),
|
||||||
MD_S8Lit("\xd8\xfd\x11\x4b\x04\xdf\xe5\x20\x5b\xd6\x4f\x87\x00\x70\x6a\xc8\xde\xed\xc7\x79\xdb\x87\x24\x36\xa8\x7a\x31\x41\x00\x57\xbd\x8d"),
|
MD_S8LitComp("\xd8\xfd\x11\x4b\x04\xdf\xe5\x20\x5b\xd6\x4f\x87\x00\x70\x6a\xc8\xde\xed\xc7\x79\xdb\x87\x24\x36\xa8\x7a\x31\x41\x00\x57\xbd\x8d"),
|
||||||
};
|
};
|
||||||
|
|
||||||
MD_MapKey keys[MD_ArrayCount(key_strings)*2];
|
MD_MapKey keys[MD_ArrayCount(key_strings)*2];
|
||||||
@@ -479,12 +479,12 @@ int main(void)
|
|||||||
Test("String Inner & Outer")
|
Test("String Inner & Outer")
|
||||||
{
|
{
|
||||||
MD_String8 samples[6] = {
|
MD_String8 samples[6] = {
|
||||||
MD_S8Lit("'foo-bar'"),
|
MD_S8LitComp("'foo-bar'"),
|
||||||
MD_S8Lit("'''foo-bar'''"),
|
MD_S8LitComp("'''foo-bar'''"),
|
||||||
MD_S8Lit("\"foo-bar\""),
|
MD_S8LitComp("\"foo-bar\""),
|
||||||
MD_S8Lit("\"\"\"foo-bar\"\"\""),
|
MD_S8LitComp("\"\"\"foo-bar\"\"\""),
|
||||||
MD_S8Lit("`foo-bar`"),
|
MD_S8LitComp("`foo-bar`"),
|
||||||
MD_S8Lit("```foo-bar```"),
|
MD_S8LitComp("```foo-bar```"),
|
||||||
};
|
};
|
||||||
|
|
||||||
MD_Node *nodes[MD_ArrayCount(samples)];
|
MD_Node *nodes[MD_ArrayCount(samples)];
|
||||||
@@ -716,10 +716,10 @@ int main(void)
|
|||||||
MD_String8 file_name = MD_S8Lit("raw_text");
|
MD_String8 file_name = MD_S8Lit("raw_text");
|
||||||
|
|
||||||
MD_String8 test_strings[] = {
|
MD_String8 test_strings[] = {
|
||||||
MD_S8Lit("0765"),
|
MD_S8LitComp("0765"),
|
||||||
MD_S8Lit("0xABC"),
|
MD_S8LitComp("0xABC"),
|
||||||
MD_S8Lit("0x123"),
|
MD_S8LitComp("0x123"),
|
||||||
MD_S8Lit("0b010"),
|
MD_S8LitComp("0b010"),
|
||||||
};
|
};
|
||||||
|
|
||||||
MD_String8 *string = test_strings;
|
MD_String8 *string = test_strings;
|
||||||
@@ -737,15 +737,15 @@ int main(void)
|
|||||||
MD_String8 file_name = MD_S8Lit("raw_text");
|
MD_String8 file_name = MD_S8Lit("raw_text");
|
||||||
|
|
||||||
MD_String8 test_strings[] = {
|
MD_String8 test_strings[] = {
|
||||||
MD_S8Lit("0"),
|
MD_S8LitComp("0"),
|
||||||
MD_S8Lit("1"),
|
MD_S8LitComp("1"),
|
||||||
MD_S8Lit("0.5"),
|
MD_S8LitComp("0.5"),
|
||||||
MD_S8Lit("1e2"),
|
MD_S8LitComp("1e2"),
|
||||||
MD_S8Lit("1e+2"),
|
MD_S8LitComp("1e+2"),
|
||||||
MD_S8Lit("1e-2"),
|
MD_S8LitComp("1e-2"),
|
||||||
MD_S8Lit("1.5e2"),
|
MD_S8LitComp("1.5e2"),
|
||||||
MD_S8Lit("1.5e+2"),
|
MD_S8LitComp("1.5e+2"),
|
||||||
MD_S8Lit("1.5e-2"),
|
MD_S8LitComp("1.5e-2"),
|
||||||
};
|
};
|
||||||
|
|
||||||
MD_String8 *string = test_strings;
|
MD_String8 *string = test_strings;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ int main(void)
|
|||||||
// TODO(allen): throw more at this.
|
// TODO(allen): throw more at this.
|
||||||
|
|
||||||
char test_string_c[] = "Foo bar; test the unicode\n\t\0Etc";
|
char test_string_c[] = "Foo bar; test the unicode\n\t\0Etc";
|
||||||
MD_String8 test_string = MD_S8(test_string_c, sizeof(test_string_c) - 1);
|
MD_String8 test_string = MD_S8((MD_u8 *)test_string_c, sizeof(test_string_c) - 1);
|
||||||
|
|
||||||
run_test_on_string(test_string);
|
run_test_on_string(test_string);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user