Compare commits

..

No commits in common. "c30a23669bc4b193ca4501e220a82a33417c19df" and "918588e0e4ae4a1cb39e9874359d89fc7494803b" have entirely different histories.

28 changed files with 194 additions and 493 deletions

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="PROJECT_FILES" />
<option name="description" value="" />
</component>
</project>

View File

@ -1,102 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BackendCodeEditorSettings">
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/FREE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
</component>
</project>

View File

@ -1,6 +1,29 @@
<component name="InspectionProjectProfileManager"> <component name="InspectionProjectProfileManager">
<profile version="1.0"> <profile version="1.0">
<option name="myName" value="Project Default" /> <option name="myName" value="Project Default" />
<inspection_tool class="CodeBlock2Expr" enabled="true" level="TEXT ATTRIBUTES" enabled_by_default="true" editorAttributes="CONSIDERATION_ATTRIBUTES" /> <inspection_tool class="ClangTidy" enabled="true" level="WARNING" enabled_by_default="true">
<option name="clangTidyCheckOptions">
<list>
<ClangTidyCheckOption />
</list>
</option>
<option name="clangTidyChecks" value="-*,bugprone-argument-comment,bugprone-assert-side-effect,bugprone-bad-signal-to-kill-thread,bugprone-branch-clone,bugprone-copy-constructor-init,bugprone-dangling-handle,bugprone-dynamic-static-initializers,bugprone-fold-init-type,bugprone-forward-declaration-namespace,bugprone-forwarding-reference-overload,bugprone-inaccurate-erase,bugprone-incorrect-roundings,bugprone-integer-division,bugprone-lambda-function-name,bugprone-macro-repeated-side-effects,bugprone-misplaced-operator-in-strlen-in-alloc,bugprone-misplaced-pointer-arithmetic-in-alloc,bugprone-misplaced-widening-cast,bugprone-move-forwarding-reference,bugprone-multiple-statement-macro,bugprone-no-escape,bugprone-not-null-terminated-result,bugprone-parent-virtual-call,bugprone-posix-return,bugprone-sizeof-container,bugprone-sizeof-expression,bugprone-spuriously-wake-up-functions,bugprone-string-constructor,bugprone-string-integer-assignment,bugprone-string-literal-with-embedded-nul,bugprone-suspicious-enum-usage,bugprone-suspicious-include,bugprone-suspicious-memory-comparison,bugprone-suspicious-memset-usage,bugprone-suspicious-missing-comma,bugprone-suspicious-semicolon,bugprone-suspicious-string-compare,bugprone-swapped-arguments,bugprone-terminating-continue,bugprone-throw-keyword-missing,bugprone-too-small-loop-variable,bugprone-undefined-memory-manipulation,bugprone-undelegated-constructor,bugprone-unhandled-self-assignment,bugprone-unused-raii,bugprone-unused-return-value,bugprone-use-after-move,bugprone-virtual-near-miss,cert-dcl21-cpp,cert-dcl58-cpp,cert-err34-c,cert-err52-cpp,cert-err58-cpp,cert-err60-cpp,cert-flp30-c,cert-msc50-cpp,cert-msc51-cpp,cert-str34-c,cppcoreguidelines-interfaces-global-init,cppcoreguidelines-narrowing-conversions,cppcoreguidelines-pro-type-member-init,cppcoreguidelines-pro-type-static-cast-downcast,cppcoreguidelines-slicing,google-default-arguments,google-explicit-constructor,google-runtime-operator,hicpp-exception-baseclass,hicpp-multiway-paths-covered,misc-misplaced-const,misc-new-delete-overloads,misc-no-recursion,misc-non-copyable-objects,misc-throw-by-value-catch-by-reference,misc-unconventional-assign-operator,misc-uniqueptr-reset-release,modernize-avoid-bind,modernize-concat-nested-namespaces,modernize-deprecated-headers,modernize-deprecated-ios-base-aliases,modernize-loop-convert,modernize-make-shared,modernize-make-unique,modernize-pass-by-value,modernize-raw-string-literal,modernize-redundant-void-arg,modernize-replace-auto-ptr,modernize-replace-disallow-copy-and-assign-macro,modernize-replace-random-shuffle,modernize-return-braced-init-list,modernize-shrink-to-fit,modernize-unary-static-assert,modernize-use-auto,modernize-use-bool-literals,modernize-use-emplace,modernize-use-equals-default,modernize-use-equals-delete,modernize-use-nodiscard,modernize-use-noexcept,modernize-use-nullptr,modernize-use-override,modernize-use-transparent-functors,modernize-use-uncaught-exceptions,mpi-buffer-deref,mpi-type-mismatch,openmp-use-default-none,performance-faster-string-find,performance-for-range-copy,performance-implicit-conversion-in-loop,performance-inefficient-algorithm,performance-inefficient-string-concatenation,performance-inefficient-vector-operation,performance-move-const-arg,performance-move-constructor-init,performance-no-automatic-move,performance-noexcept-move-constructor,performance-trivially-destructible,performance-type-promotion-in-math-fn,performance-unnecessary-copy-initialization,performance-unnecessary-value-param,portability-simd-intrinsics,readability-avoid-const-params-in-decls,readability-const-return-type,readability-container-size-empty,readability-convert-member-functions-to-static,readability-delete-null-pointer,readability-deleted-default,readability-inconsistent-declaration-parameter-name,readability-make-member-function-const,readability-misleading-indentation,readability-misplaced-array-index,readability-non-const-parameter,readability-redundant-control-flow,readability-redundant-declaration,readability-redundant-function-ptr-dereference,readability-redundant-smartptr-get,readability-redundant-string-cstr,readability-redundant-string-init,readability-simplify-subscript-expr,readability-static-accessed-through-instance,readability-static-definition-in-anonymous-namespace,readability-string-compare,readability-uniqueptr-delete-release,readability-use-anyofallof" />
</inspection_tool>
<inspection_tool class="ClangdErrorsAndWarnings" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="EmptyDeclOrStmt" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="GrazieInspection" enabled="false" level="TYPO" enabled_by_default="false" />
<inspection_tool class="LanguageDetectionInspection" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="Misra" enabled="false" level="WARNING" enabled_by_default="false">
<option name="myMisraCPPChecks" value="clion-misra-cpp2008-*,-clion-misra-cpp2008-11-0-1" />
</inspection_tool>
<inspection_tool class="OCUnusedGlobalDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="ShellCheck" enabled="false" level="ERROR" enabled_by_default="false">
<shellcheck_settings value="SC2034,SC2035,SC2059,SC2061,SC2091,SC2155" />
</inspection_tool>
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
</profile> </profile>
</component> </component>

View File

@ -2,6 +2,5 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/cbuild" vcs="Git" />
</component> </component>
</project> </project>

2
cbuild

@ -1 +1 @@
Subproject commit 574ce6eab3b65e05888adad95a0211f532dd1125 Subproject commit c20e1e8f1c3e92e7f980a74942352b0a3744edcd

View File

@ -44,10 +44,16 @@ Maybe ERROR_WRONGCHAR(const char c, char* _text, char* text_first, const char* s
if(!_c) break; if(!_c) break;
} }
char errmsg[1024]; char errmsg[1024];
ksprintf(errmsg,1024, "unexpected <%c> at:\n" IFMSC(
" \"%s\"\n" sprintf_s(errmsg,1024, "unexpected <%c> at:\n"
"\\___[%s:%d] %s()", " \"%s\"\n"
c,errBuf, srcfile,line,funcname); "\\___[%s:%d] %s()",
c,errBuf, srcfile,line,funcname),
sprintf(errmsg, "unexpected <%c> at:\n"
" \"%s\"\n"
" \\___[%s:%d] %s()",
c,errBuf, srcfile,line,funcname)
);
safethrow(errmsg,;); safethrow(errmsg,;);
} }
#define safethrow_wrongchar(C, freeMem) { freeMem; return ERROR_WRONGCHAR(C, text, shared->sh_text_first, __FILE__,__LINE__,__func__); } #define safethrow_wrongchar(C, freeMem) { freeMem; return ERROR_WRONGCHAR(C, text, shared->sh_text_first, __FILE__,__LINE__,__func__); }
@ -186,7 +192,10 @@ Maybe __ParseValue(DeserializeSharedData* shared, string str){
char* _c=string_extract(str); char* _c=string_extract(str);
if(sscanf(_c, IFWIN("%llu", "%lu"), &lu)!=1){ if(sscanf(_c, IFWIN("%llu", "%lu"), &lu)!=1){
char err[64]; char err[64];
ksprintf(err,64,"can't parse to int: <%s>",_c); IFMSC(
sprintf_s(err,64,"can't parse to int: <%s>",_c),
sprintf(err,"can't parse to int: <%s>",_c)
);
safethrow(err,free(_c)); safethrow(err,free(_c));
} }
free(_c); free(_c);
@ -199,7 +208,10 @@ Maybe __ParseValue(DeserializeSharedData* shared, string str){
char* _c=string_extract(str); char* _c=string_extract(str);
if(sscanf(_c, IFWIN("%lli", "%li"), &li)!=1){ if(sscanf(_c, IFWIN("%lli", "%li"), &li)!=1){
char err[64]; char err[64];
ksprintf(err,64,"can't parse to int: <%s>",_c); IFMSC(
sprintf_s(err,64,"can't parse to int: <%s>",_c),
sprintf(err,"can't parse to int: <%s>",_c)
);
safethrow(err,free(_c)); safethrow(err,free(_c));
} }
free(_c); free(_c);

View File

@ -36,7 +36,9 @@ Maybe dir_create(const char* path){
#endif #endif
{ {
char err[512]; char err[512];
ksprintf(err, 512, "can't create dicectory <%s>", path); IFWIN(
sprintf_s(err, 512, "can't create dicectory <%s>", path),
sprintf(err, "can't create dicectory <%s>", path));
safethrow(err,;); safethrow(err,;);
} }

View File

@ -25,12 +25,12 @@ char* __path_concat(u32 n, ...){
// copying content of all strings to result // copying content of all strings to result
u16 k=0; u16 k=0;
for(; k<n-1; k++){ for(; k<n-1; k++){
memcpy(totality, parts[k], lengths[k]); memcopy(parts[k], totality, lengths[k]);
totality+=lengths[k]; totality+=lengths[k];
*totality=path_sep; *totality=path_sep;
totality++; totality++;
} }
memcpy(totality, parts[k], lengths[k]); memcopy(parts[k], totality, lengths[k]);
free(parts); free(parts);
free(lengths); free(lengths);

View File

@ -1,7 +1,7 @@
#include "network_types.h" #include "network_types.h"
char* __knIPV4Address_toString(void* p, u32 f){ return knIPV4Address_toString(*(knIPV4Address*)p); } char* __knIPV4Address_toString(void* p, u32 f){ return knIPV4Address_toString(p); }
char* __knIPV4Endpoint_toString(void* p, u32 f){ return knIPV4Endpoint_toString(*(knIPV4Endpoint*)p); } char* __knIPV4Endpoint_toString(void* p, u32 f){ return knIPV4Endpoint_toString(p); }
kt_define(knIPV4Address, NULL, __knIPV4Address_toString); kt_define(knIPV4Address, NULL, __knIPV4Address_toString);
kt_define(knIPV4Endpoint, NULL, __knIPV4Endpoint_toString); kt_define(knIPV4Endpoint, NULL, __knIPV4Endpoint_toString);
@ -42,7 +42,8 @@ Maybe knIPV4Address_fromStr(char* addrStr, knIPV4Address* addrVal){
default: default:
u32 errmsgL=cptr_length(addrStr) + 80; u32 errmsgL=cptr_length(addrStr) + 80;
char* errmsg=malloc(errmsgL); char* errmsg=malloc(errmsgL);
ksprintf(errmsg, errmsgL, "wrong ip address string: %s\n %s", addrStr_src, errmsg_extra); IFMSC(sprintf_s(errmsg, errmsgL, "wrong ip address string: %s\n %s", addrStr_src, errmsg_extra),
sprintf( errmsg, "wrong ip address string: %s\n %s", addrStr_src, errmsg_extra));
safethrow(errmsg,;); safethrow(errmsg,;);
break; break;
} }
@ -52,11 +53,11 @@ Maybe knIPV4Address_fromStr(char* addrStr, knIPV4Address* addrVal){
return MaybeNull; return MaybeNull;
} }
char* knIPV4Address_toString(knIPV4Address address) { char* knIPV4Address_toString(knIPV4Address* address) {
char* a = toString_u64(address.bytes[0], 0, 0); char* a = toString_u64(address->bytes[0], 0, 0);
char* b = toString_u64(address.bytes[1], 0, 0); char* b = toString_u64(address->bytes[1], 0, 0);
char* c = toString_u64(address.bytes[2], 0, 0); char* c = toString_u64(address->bytes[2], 0, 0);
char* d = toString_u64(address.bytes[3], 0, 0); char* d = toString_u64(address->bytes[3], 0, 0);
char* s = cptr_concat(a,".",b,".",c,".",d); char* s = cptr_concat(a,".",b,".",c,".",d);
free(a); free(a);
free(b); free(b);
@ -70,24 +71,21 @@ Maybe knIPV4Endpoint_fromStr(char* endStr, knIPV4Endpoint* endVal){
i32 sep_i = cptr_seekChar(endStr, ':', 0, 48); i32 sep_i = cptr_seekChar(endStr, ':', 0, 48);
if(sep_i < 7) if(sep_i < 7)
safethrow(cptr_concat("can't find ':' in '", endStr, "'"), ;); safethrow(cptr_concat("can't find ':' in '", endStr, "'"), ;);
const char* portBegin = endStr+sep_i+1; char* portBegin = endStr+sep_i+1;
u64 port = knPort_INVALID; u64 port = knPort_INVALID;
if(sscanf(portBegin, IFWIN("%llu", "%lu"), &port)!=1) if(sscanf(portBegin, IFWIN("%llu", "%lu"), &port)!=1)
safethrow(cptr_concat("can't recognise port number in '", portBegin, "'"), ;) safethrow(cptr_concat("can't recognise port number in '", portBegin, "'"), ;)
knIPV4Address addr = knIPV4Address_INVALID; knIPV4Address addr = knIPV4Address_INVALID;
char* addrStr = cptr_copy(endStr); try(knIPV4Address_fromStr(endStr, &addr), _m865, ;);
addrStr[sep_i] = 0;
try(knIPV4Address_fromStr(addrStr, &addr), _m865, ;);
free(addrStr);
*endVal = knIPV4Endpoint_create(addr, port); *endVal = knIPV4Endpoint_create(addr, port);
return MaybeNull; return MaybeNull;
} }
char* knIPV4Endpoint_toString(knIPV4Endpoint end) { char* knIPV4Endpoint_toString(knIPV4Endpoint* end) {
char* a = knIPV4Address_toString(end.address); char* a = knIPV4Address_toString(&end->address);
char* p = toString_u64(end.port, 0, 0); char* p = toString_u64(end->port, 0, 0);
char* s = cptr_concat(a,":",p); char* s = cptr_concat(a,":",p);
free(a); free(a);
free(p); free(p);

View File

@ -12,7 +12,7 @@ typedef u16 knPort;
typedef union knIPV4Address { typedef union knIPV4Address {
u32 UintBigEndian; u32 UintBigEndian;
u8 bytes[4]; char bytes[4];
} knIPV4Address; } knIPV4Address;
kt_declare(knIPV4Address); kt_declare(knIPV4Address);
@ -23,12 +23,12 @@ kt_declare(knIPV4Address);
#define knIPV4Address_ANY knIPV4Address_fromBytes(0,0,0,0) #define knIPV4Address_ANY knIPV4Address_fromBytes(0,0,0,0)
#define knIPV4Address_LOOPBACK knIPV4Address_fromBytes(127,0,0,1) #define knIPV4Address_LOOPBACK knIPV4Address_fromBytes(127,0,0,1)
#define knIPV4Address_INVALID knIPV4Address_fromBytes(255,255,255,255) #define knIPV4Address_INVALID knIPV4Address_fromBytes(255,255,255,255)
#define knIPV4Address_isINVALID(ADDR) (ADDR.UintBigEndian == (u32)~0) #define knIPV4Address_isINVALID(ADDR) (ADDR.UintBigEndian == ~0)
///@return Maybe<null> ///@return Maybe<null>
Maybe knIPV4Address_fromStr(char* addrStr, knIPV4Address* addrPtr); Maybe knIPV4Address_fromStr(char* addrStr, knIPV4Address* addrPtr);
char* knIPV4Address_toString(knIPV4Address address); char* knIPV4Address_toString(knIPV4Address* address);
STRUCT(knIPV4Endpoint, STRUCT(knIPV4Endpoint,
@ -44,7 +44,7 @@ STRUCT(knIPV4Endpoint,
///@return Maybe<null> ///@return Maybe<null>
Maybe knIPV4Endpoint_fromStr(char* endStr, knIPV4Endpoint* endVal); Maybe knIPV4Endpoint_fromStr(char* endStr, knIPV4Endpoint* endVal);
char* knIPV4Endpoint_toString(knIPV4Endpoint end); char* knIPV4Endpoint_toString(knIPV4Endpoint* end);
typedef enum knShutdownType { typedef enum knShutdownType {

View File

@ -15,8 +15,8 @@ Maybe knSocketTCP_open(bool allowReuse){
// set value of REUSEADDR socket option // set value of REUSEADDR socket option
int opt_val = allowReuse; int opt_val = allowReuse;
if(setsockopt(newSocket->socketfd, SOL_SOCKET, SO_REUSEADDR, (void*)&opt_val, sizeof(opt_val)) != 0) if(setsockopt(newSocket->socketfd, SOL_SOCKET, SO_REUSEADDR, (void*)&opt_val, sizeof(opt_val)) != 0)
safethrow("can't set socket options", knSocketTCP_close(newSocket)); safethrow("can't set socket options", free(newSocket));
return SUCCESS(UniHeapPtr(knSocketTCP, newSocket)); return SUCCESS(UniHeapPtr(knSocketTCP, newSocket));
} }
@ -31,67 +31,54 @@ Maybe knSocketTCP_close(knSocketTCP* socket){
return MaybeNull; return MaybeNull;
} }
Maybe knSocketTCP_bind(knSocketTCP* socket, knIPV4Endpoint localEndp){ Maybe knSocketTCP_bindAndListen(knSocketTCP* socket, knIPV4Endpoint localEndp){
struct sockaddr_in servaddr = knIPV4Endpoint_toSockaddr(localEndp); struct sockaddr_in servaddr = knIPV4Endpoint_toSockaddr(localEndp);
if(bind(socket->socketfd, (void*)&servaddr, sizeof(servaddr)) != 0) if(bind(socket->socketfd, (void*)&servaddr, sizeof(servaddr)) != 0)
safethrow("socket bind failed", ;); safethrow("socket bind failed", ;);
if(listen(socket->socketfd, 1024) != 0)
safethrow("socket listen failed", ;);
socket->localEndpoint = localEndp; socket->localEndpoint = localEndp;
return MaybeNull; return MaybeNull;
} }
Maybe knSocketTCP_listen(knSocketTCP* socket){
if(listen(socket->socketfd, 1024) != 0)
safethrow("socket listen failed", ;);
return MaybeNull;
}
Maybe knSocketTCP_connect(knSocketTCP* socket, knIPV4Endpoint remoteEnd){ Maybe knSocketTCP_connect(knSocketTCP* socket, knIPV4Endpoint remoteEnd){
struct sockaddr_in localAddr = {0}; struct sockaddr_in servaddr = knIPV4Endpoint_toSockaddr(remoteEnd);
struct sockaddr_in remoteAddr = knIPV4Endpoint_toSockaddr(remoteEnd);
u64 sockaddr_size = sizeof(localAddr);
if(connect(socket->socketfd, (struct sockaddr*)&remoteAddr, sizeof(remoteAddr)) != 0) if(connect(socket->socketfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) !=0)
safethrow("socket connect failed", ;); safethrow("socket connect failed",;);
if(getsockname(socket->socketfd, (struct sockaddr*)&localAddr, (void*)&sockaddr_size) != 0) socket->remoteEndpoint=remoteEnd;
safethrow("can't get connected socket local address", ;);
socket->localEndpoint = knIPV4Endpoint_fromSockaddr(localAddr);
socket->remoteEndpoint = remoteEnd;
return MaybeNull; return MaybeNull;
} }
Maybe knSocketTCP_accept(knSocketTCP* socket){ Maybe knSocketTCP_accept(knSocketTCP* socket){
struct sockaddr_in localAddr = {0};
struct sockaddr_in remoteAddr = {0}; struct sockaddr_in remoteAddr = {0};
u64 sockaddr_size = sizeof(localAddr); u64 remoteAddrSize = sizeof(remoteAddr);
i64 client_fd = accept(socket->socketfd, (struct sockaddr*)&remoteAddr, (void*)&sockaddr_size); i64 client_fd = accept(socket->socketfd, (struct sockaddr*)&remoteAddr, (void*)&remoteAddrSize);
if(client_fd == -1 || client_fd == ~0) if(client_fd == -1 || client_fd == ~0)
safethrow("can't accept client connection", ;); safethrow("can't accept client connection", ;);
if(getsockname(client_fd, (struct sockaddr*)&localAddr, (void*)&sockaddr_size) != 0)
safethrow("can't get accepted socket local address", __kn_StdSocket_close(client_fd));
// if accept() didn't set remoteAddr for some reason // if accept() didn't set remoteAddr for some reason
if(remoteAddr.sin_addr.s_addr == 0 && remoteAddr.sin_port == 0 && remoteAddr.sin_family == 0){ if(remoteAddr.sin_addr.s_addr == 0 && remoteAddr.sin_port == 0 && remoteAddr.sin_family == 0){
if(getpeername(client_fd, (struct sockaddr*)&remoteAddr, (void*)&sockaddr_size) != 0) if(getpeername(client_fd, (struct sockaddr*)&remoteAddr, (void*)&remoteAddrSize) != 0)
safethrow("can't get accepted socket remote address", __kn_StdSocket_close(client_fd)); safethrow("can't get connected client address", ;);
} }
knSocketTCP* clientSocket = malloc(sizeof(knSocketTCP)); knSocketTCP* clientSocket = malloc(sizeof(knSocketTCP));
clientSocket->socketfd = client_fd; clientSocket->socketfd = client_fd;
clientSocket->localEndpoint = knIPV4Endpoint_fromSockaddr(localAddr); clientSocket->localEndpoint = socket->localEndpoint;
clientSocket->remoteEndpoint = knIPV4Endpoint_fromSockaddr(remoteAddr); clientSocket->remoteEndpoint = knIPV4Endpoint_fromSockaddr(remoteAddr);
return SUCCESS(UniHeapPtr(knSocketTCP, clientSocket)); return SUCCESS(UniHeapPtr(knSocketTCP, clientSocket));
} }
Maybe knSocketTCP_send(knSocketTCP* socket, void* _buf, u32 dataLength){ Maybe knSocketTCP_send(knSocketTCP* socket, char* buffer, u32 dataLength){
char* buf = _buf;
u32 sentTotal = 0; u32 sentTotal = 0;
while(sentTotal < dataLength){ while(sentTotal < dataLength){
int sentCount = send(socket->socketfd, buf+sentTotal, dataLength-sentTotal, 0); int sentCount = send(socket->socketfd, buffer+sentTotal, dataLength-sentTotal, 0);
if(sentCount == -1){ if(sentCount == -1){
safethrow( safethrow(
cptr_concat("can't send ", toString_u64(dataLength-sentTotal,0,0), cptr_concat("can't send ", toString_u64(dataLength-sentTotal,0,0),
@ -106,24 +93,10 @@ Maybe knSocketTCP_send(knSocketTCP* socket, void* _buf, u32 dataLength){
return MaybeNull; return MaybeNull;
} }
Maybe knSocketTCP_receive(knSocketTCP* socket, void* _buf, u32 bufferLength){ Maybe knSocketTCP_receive(knSocketTCP* socket, char* buffer, u32 bufferLength){
char* buf = _buf; int receivedCount = recv(socket->socketfd, buffer, bufferLength, 0);
int receivedCount = recv(socket->socketfd, buf, bufferLength, 0);
if(receivedCount == -1 || receivedCount == 0) if(receivedCount == -1 || receivedCount == 0)
safethrow("can't receive data from socket", ;) safethrow("can't receive data from socket", ;)
return SUCCESS(UniUInt64(receivedCount)); return SUCCESS(UniUInt64(receivedCount));
} }
Maybe knSocketTCP_receiveN(knSocketTCP* socket, void* _buf, u32 bufsize, u32 n){
char* buf = _buf;
if(bufsize < n)
safethrow(ERR_UNEXPECTEDVAL, ;);
u32 receivedTotal = 0;
while(receivedTotal < n) {
try(knSocketTCP_receive(socket, buf+receivedTotal, n-receivedTotal), m_receivedCount, ;);
receivedTotal += m_receivedCount.value.UInt64;
}
return MaybeNull;
}

View File

@ -27,13 +27,9 @@ Maybe knSocketTCP_shutdown(knSocketTCP* socket, knShutdownType direction);
///@return Maybe<void> error or nothing ///@return Maybe<void> error or nothing
Maybe knSocketTCP_close(knSocketTCP* socket); Maybe knSocketTCP_close(knSocketTCP* socket);
/// binds socket to a local endpoint /// binds socket to a local endpoint and starts listening for incoming TCP connections
///@return Maybe<void> error or nothing
Maybe knSocketTCP_bind(knSocketTCP* socket, knIPV4Endpoint localEndp);
/// begins listening for incoming TCP connections
Maybe knSocketTCP_listen(knSocketTCP* socket);
///@return Maybe<void> error or nothing ///@return Maybe<void> error or nothing
Maybe knSocketTCP_bindAndListen(knSocketTCP* socket, knIPV4Endpoint localEndp);
/// establishes TCP connection with a remote endpoint /// establishes TCP connection with a remote endpoint
///@return Maybe<void> error or nothing ///@return Maybe<void> error or nothing
@ -46,18 +42,14 @@ Maybe knSocketTCP_accept(knSocketTCP* socket);
///@param buffer buffer for receiving data ///@param buffer buffer for receiving data
///@param dataLength 0-4294967295 ///@param dataLength 0-4294967295
///@return Maybe<void> ///@return Maybe<void>
Maybe knSocketTCP_send(knSocketTCP* socket, void* buffer, u32 dataLength); Maybe knSocketTCP_send(knSocketTCP* socket, char* buffer, u32 dataLength);
/// receives a package of any size /// receives a package of any size
/// (by TCP 32 bytes han be sent as 32x1byte, 4x8byte, 32x1byte or in any other combination) /// (by TCP 32 bytes han be sent as 32x1byte, 4x8byte, 32x1byte or in any other combination)
///@param buffer buffer for receiving data ///@param buffer buffer for receiving data
///@param bufferLength 0-4294967295 ///@param bufferLength 0-4294967295
///@return Maybe<u64> received bytes amount ///@return Maybe<u64> received bytes amount
Maybe knSocketTCP_receive(knSocketTCP* socket, void* buffer, u32 bufferLength); Maybe knSocketTCP_receive(knSocketTCP* socket, char* buffer, u32 bufferLength);
/// receives a package of size n
///@return Maybe<void>
Maybe knSocketTCP_receiveN(knSocketTCP* socket, void* buf, u32 bufsize, u32 n);
#if __cplusplus #if __cplusplus
} }

View File

@ -14,7 +14,7 @@ Maybe knSocketUDP_open(bool allowReuse){
// set value of REUSEADDR socket option // set value of REUSEADDR socket option
int opt_val = allowReuse; int opt_val = allowReuse;
if(setsockopt(newSocket->socketfd, SOL_SOCKET, SO_REUSEADDR, (void*)&opt_val, sizeof(opt_val)) != 0) if(setsockopt(newSocket->socketfd, SOL_SOCKET, SO_REUSEADDR, (void*)&opt_val, sizeof(opt_val)) != 0)
safethrow("can't set socket options", knSocketUDP_close(newSocket)); safethrow("can't set socket options", free(newSocket));
return SUCCESS(UniHeapPtr(knSocketUDP, newSocket)); return SUCCESS(UniHeapPtr(knSocketUDP, newSocket));
} }
@ -63,14 +63,6 @@ Maybe knSocketUDP_sendTo(knSocketUDP* socket, char* buffer, u32 dataLength, knIP
;); ;);
} }
struct sockaddr_in localAddr = {0};
u64 sockaddr_size = sizeof(localAddr);
if(getsockname(socket->socketfd, (struct sockaddr*)&localAddr, (void*)&sockaddr_size) != 0)
safethrow("can't get implicitely bound socket local address", ;);
socket->localEndpoint = knIPV4Endpoint_fromSockaddr(localAddr);
return MaybeNull; return MaybeNull;
} }

View File

@ -139,6 +139,9 @@ void StringBuilder_append_u64(StringBuilder* b, u64 a){
void StringBuilder_append_f64(StringBuilder* b, f64 a){ void StringBuilder_append_f64(StringBuilder* b, f64 a){
try_complete_buf(b); try_complete_buf(b);
char buf[32]; char buf[32];
ksprintf(buf,32,"%lf",a); IFMSC(
sprintf_s(buf,32,"%lf",a),
sprintf(buf,"%lf",a)
);
curr_buf_add_string(b, (string){.ptr=buf, .length=cptr_length(buf)}); curr_buf_add_string(b, (string){.ptr=buf, .length=cptr_length(buf)});
} }

View File

@ -131,6 +131,13 @@ i32 cptr_seekCharReverse(const char* src, char fragment, u32 startIndex, u32 see
return -1; return -1;
} }
void memcopy(void* from, void* to, u32 size){
if(from==NULL || to==NULL)
throw(ERR_NULLPTR);
for(u32 i=0; i<size; i++)
((char*)to)[i]=((char*)from)[i];
}
char* __cptr_concat(u32 n, ...){ char* __cptr_concat(u32 n, ...){
char** strs=(char**)malloc(n*sizeof(char*)); char** strs=(char**)malloc(n*sizeof(char*));
u32* lengths=malloc(n*sizeof(u32)); u32* lengths=malloc(n*sizeof(u32));
@ -155,7 +162,7 @@ char* __cptr_concat(u32 n, ...){
// copying content of all strings to result // copying content of all strings to result
for(u16 k=0; k<n; k++){ for(u16 k=0; k<n; k++){
memcpy(totality, strs[k], lengths[k]); memcopy(strs[k], totality, lengths[k]);
totality+=lengths[k]; totality+=lengths[k];
} }

View File

@ -63,12 +63,10 @@ static inline i32 cptr_lastIndexOfChar(const char* src, char fragment)
static inline bool cptr_contains(const char* src, const char* fragment){ static inline bool cptr_contains(const char* src, const char* fragment){
return cptr_seek(src, fragment, 0, -1) != -1; return cptr_seek(src, fragment, 0, -1) +1;
} }
static inline bool cptr_containsChar(const char* src, char c){ void memcopy(void* from, void* to, u32 size);
return cptr_seekChar(src, c, 0, -1) != -1;
}
char* __cptr_concat(u32 n, ...); char* __cptr_concat(u32 n, ...);
#define cptr_concat(STR...) __cptr_concat(count_args(STR), STR) #define cptr_concat(STR...) __cptr_concat(count_args(STR), STR)

View File

@ -1,4 +1,7 @@
#include "base.h" #include "std.h"
#include "errors.h"
#include "cptr.h"
#include "../kprint/kprintf.h"
char* errname(ErrorId err){ char* errname(ErrorId err){
switch(err){ switch(err){
@ -18,19 +21,25 @@ char* errname(ErrorId err){
} }
} }
#define ERRMSG_MAXLENGTH 4096 #define ERRMSG_MAXLENGTH 1024
char* __genErrMsg(const char* errmsg, const char* srcfile, i32 line, const char* funcname){ char* __genErrMsg(const char* errmsg, const char* srcfile, i32 line, const char* funcname){
size_t bufsize=ERRMSG_MAXLENGTH; size_t bufsize=ERRMSG_MAXLENGTH;
char* result=malloc(bufsize); char* result=malloc(bufsize);
ksprintf(result,bufsize,"[%s:%d] %s() throwed error: %s",srcfile,line,funcname,errmsg); IFMSC(
sprintf_s(result,bufsize,"[%s:%d] %s() throwed error: %s",srcfile,line,funcname,errmsg),
sprintf(result,"[%s:%d] %s() throwed error: %s",srcfile,line,funcname,errmsg)
);
return result; return result;
} }
char* __extendErrMsg(const char* errmsg, const char* srcfile, i32 line, const char* funcname){ char* __extendErrMsg(const char* errmsg, const char* srcfile, i32 line, const char* funcname){
size_t bufsize=cptr_length(errmsg)+ERRMSG_MAXLENGTH; size_t bufsize=cptr_length(errmsg)+ERRMSG_MAXLENGTH;
char* result=malloc(bufsize); char* result=malloc(bufsize);
ksprintf(result,bufsize,"%s\n \\___[%s:%d] %s()",errmsg,srcfile,line,funcname); IFMSC(
sprintf_s(result,bufsize,"%s\n \\___[%s:%d] %s()",errmsg,srcfile,line,funcname),
sprintf(result,"%s\n \\___[%s:%d] %s()",errmsg,srcfile,line,funcname)
);
free(errmsg); free(errmsg);
return result; return result;
} }

View File

@ -81,7 +81,6 @@ char* __unknownErr( );
#endif #endif
#define tryLast(_funcCall, _result, ON_EXIT) Maybe _result=_funcCall; if(_result.errmsg){ \ #define tryLast(_funcCall, _result, ON_EXIT) Maybe _result=_funcCall; if(_result.errmsg){ \
ON_EXIT; \
_result.errmsg=__extendErrMsg(_result.errmsg, __FILE__,__LINE__,__func__); \ _result.errmsg=__extendErrMsg(_result.errmsg, __FILE__,__LINE__,__func__); \
__EXIT(_result.errmsg); \ __EXIT(_result.errmsg); \
} }

View File

@ -14,7 +14,6 @@ extern "C" {
#include <setjmp.h> #include <setjmp.h>
#include <signal.h> #include <signal.h>
#include <math.h> #include <math.h>
#include <string.h>
typedef int8_t i8; typedef int8_t i8;
typedef uint8_t u8; typedef uint8_t u8;

View File

@ -70,7 +70,10 @@ char* toString_u64(u64 n, bool withPostfix, bool uppercase){
throw("too big precision"); \ throw("too big precision"); \
if(precision==0) \ if(precision==0) \
precision=toString_float_default_precision; \ precision=toString_float_default_precision; \
i32 cn = sprintf_s(str, bufsize, "%.*f", precision, n); \ i32 cn=IFMSC( \
sprintf_s(str, bufsize, "%.*f", precision, n), \
sprintf(str, "%.*f", precision, n) \
); \
/* remove trailing zeroes except .0*/ \ /* remove trailing zeroes except .0*/ \
while(str[cn-1]=='0' && str[cn-2]!='.') \ while(str[cn-1]=='0' && str[cn-2]!='.') \
cn--; \ cn--; \

View File

@ -45,219 +45,111 @@ WORD unixColorToWin(u8 c){
} }
#endif #endif
i32 _kprintf(const char* format, const i32 args_count, ...){ void kprintf(const char* format, ...){
va_list vl; va_list vl;
va_start(vl, args_count); va_start(vl, format);
i32 i = 0; u32 i=0;
i32 args_left = args_count; for(char c=format[i++]; c!=0; c=format[i++]){
for(char c = format[i++]; c != 0; c = format[i++]){
// value format specifiers // value format specifiers
if(c == '%'){ if(c=='%'){
if(args_left-- == 0) char* argstr=NULL;
return kprintf_NOT_ENOUGH_ARGUMENTS; bool l=false;
c=format[i++];
char* argstr = NULL;
bool l = false;
c = format[i++];
format_escape_seq: format_escape_seq:
switch (c) { switch (c) {
case 'u': case 'u':
argstr = toString_u64( argstr=toString_u64(
l ? va_arg(vl, u64) : va_arg(vl, u32) l ? va_arg(vl, u64) : va_arg(vl, u32)
,0,0); ,0,0);
break; break;
case 'i': case 'd': case 'i': case 'd':
argstr = toString_i64( argstr=toString_i64(
l ? va_arg(vl, i64) : va_arg(vl, i32) l ? va_arg(vl, i64) : va_arg(vl, i32)
); );
break; break;
case 'f': case 'f':
// f32 is promoted to f64 when passed through '...' // f32 is promoted to f64 when passed through '...'
argstr = toString_f64(va_arg(vl, f64), toString_float_default_precision,0,0); argstr=toString_f64(va_arg(vl, f64), toString_float_default_precision,0,0);
break; break;
case 'l': case 'l':
l = true; l=true;
if((c = format[i++])) if((c=format[i++]))
goto format_escape_seq; goto format_escape_seq;
break; break;
case 'p': ; case 'p': ;
void* phex = va_arg(vl, void*); void* phex=va_arg(vl, void*);
argstr = toString_hex(&phex,getEndian() == LittleEndian,sizeof(phex),1,0); argstr=toString_hex(&phex,getEndian()==LittleEndian,sizeof(phex),1,0);
break; break;
case 'x': ; case 'x': ;
if(l){ if(l){
u64 xhex = va_arg(vl, u64); u64 xhex=va_arg(vl, u64);
argstr = toString_hex(&xhex,getEndian() == LittleEndian,sizeof(xhex),0,1); argstr=toString_hex(&xhex,getEndian()==LittleEndian,sizeof(xhex),0,1);
} }
else { else {
u32 xhex = va_arg(vl, u32); u32 xhex=va_arg(vl, u32);
argstr = toString_hex(&xhex,getEndian() == LittleEndian,sizeof(xhex),0,1); argstr=toString_hex(&xhex,getEndian()==LittleEndian,sizeof(xhex),0,1);
} }
break; break;
case 's': ; case 's': ;
char* cptr = va_arg(vl,char*); char* cptr=va_arg(vl,char*);
if(!cptr) if(!cptr)
cptr = "<nullstr>"; cptr="<nullstr>";
if(*cptr) if(*cptr)
fputs(cptr, stdout); fputs(cptr, stdout);
break; break;
case 'c': case 'c':
putc((char)va_arg(vl,int), stdout); argstr=malloc(2);
argstr[0]=(char)va_arg(vl,int);
argstr[1]=0;
break; break;
default: default:
fputs("<INCORRECT FORMAT STRING>", stdout); putc('\n',stdout);
return kprintf_INVALID_FORMAT; putc('<',stdout);
putc(c,stdout);
putc('>',stdout);
throw(ERR_FORMAT);
} }
if(argstr){ if(argstr){
fputs(argstr, stdout); fputs(argstr, stdout);
free(argstr); free(argstr);
} }
} }
// escape sequences // escape sequences
else if(c == '\e'){ else if(c=='\e'){
//////////////////// WINDOWS //////////////////// IFWIN(
#if defined(_WIN64) || defined(_WIN32) /* WINDOWS */
if((c = format[i++]) == '['){ ({
u8 colorUnix = 0; if((c=format[i++])=='['){
for(i8 n = 0; n<6 && c != 0; n++){ u8 colorUnix=0;
c = format[i++]; for(i8 n=0; n<6 && c!=0; n++){
switch (c){ c=format[i++];
case '0': case '1': case '2': case '3': case '4': switch (c){
case '5': case '6': case '7': case '8': case '9': case '0': case '1': case '2': case '3': case '4':
colorUnix = colorUnix*10+c-'0'; case '5': case '6': case '7': case '8': case '9':
break; colorUnix=colorUnix*10+c-'0';
case 'm': ; break;
WORD colorWin = unixColorToWin(colorUnix); case 'm': ;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); WORD colorWin=unixColorToWin(colorUnix);
SetConsoleTextAttribute(hConsole, colorWin); HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
goto end_iteration; SetConsoleTextAttribute(hConsole, colorWin);
default: goto end_iteration;
goto end_iteration; default:
goto end_iteration;
}
} }
} }
} }),
////////////////////// UNIX ////////////////////// /* UNIX */
#else
putc(c,stdout); putc(c,stdout);
#endif );
} }
// common characters // common characters
else { else {
putc(c,stdout); putc(c,stdout);
} }
#if defined(_WIN64) || defined(_WIN32) #if defined(_WIN64) || defined(_WIN32)
end_iteration:; end_iteration:;
#endif #endif
} }
va_end(vl); va_end(vl);
return i;
}
i32 _ksprintf(char* buffer, i32 buffer_size, const char* format, const i32 args_count, ...){
if(buffer == NULL)
return kprintf_BUFFER_IS_NULL;
va_list vl;
va_start(vl, args_count);
i32 i = 0;
i32 written = 0;
i32 args_left = args_count;
for(char c = format[i++]; c != 0; c = format[i++]){
// value format specifiers
if(c == '%'){
if(args_left-- == 0)
return kprintf_NOT_ENOUGH_ARGUMENTS;
char* argstr = NULL;
bool l = false;
c = format[i++];
format_escape_seq:
switch (c) {
case 'u':
argstr = toString_u64(
l ? va_arg(vl, u64) : va_arg(vl, u32)
,0,0);
break;
case 'i': case 'd':
argstr = toString_i64(
l ? va_arg(vl, i64) : va_arg(vl, i32)
);
break;
case 'f':
// f32 is promoted to f64 when passed through '...'
argstr = toString_f64(va_arg(vl, f64), toString_float_default_precision,0,0);
break;
case 'l':
l = true;
if((c = format[i++]))
goto format_escape_seq;
break;
case 'p': ;
void* phex = va_arg(vl, void*);
argstr = toString_hex(&phex,getEndian() == LittleEndian,sizeof(phex),1,0);
break;
case 'x': ;
if(l){
u64 xhex = va_arg(vl, u64);
argstr = toString_hex(&xhex,getEndian() == LittleEndian,sizeof(xhex),0,1);
}
else {
u32 xhex = va_arg(vl, u32);
argstr = toString_hex(&xhex,getEndian() == LittleEndian,sizeof(xhex),0,1);
}
break;
case 's': ;
char* cptr = va_arg(vl,char*);
if(!cptr)
cptr = "<nullstr>";
if(*cptr){
i32 str_length = cptr_length(cptr);
if(written + str_length > buffer_size)
return kprintf_BUFFER_IS_TOO_SMALL;
memcpy(buffer + written, cptr, str_length);
written += str_length;
}
break;
case 'c': ;
char ch = (char)va_arg(vl,int);
if(written > buffer_size)
return kprintf_BUFFER_IS_TOO_SMALL;
buffer[written++] = ch;
break;
default:
const char errformat_str[] = "<INCORRECT FORMAT STRING>";
if(written + (i32)sizeof(errformat_str) <= buffer_size)
memcpy(buffer + written, errformat_str, sizeof(errformat_str));
return kprintf_INVALID_FORMAT;
}
if(argstr){
i32 str_length = cptr_length(argstr);
if(written + str_length > buffer_size)
return kprintf_BUFFER_IS_TOO_SMALL;
memcpy(buffer + written, argstr, str_length);
written += str_length;
free(argstr);
}
}
// common characters
else {
if(written > buffer_size)
return kprintf_BUFFER_IS_TOO_SMALL;
buffer[written++] = c;
}
}
va_end(vl);
if(written > buffer_size)
return kprintf_BUFFER_IS_TOO_SMALL;
buffer[written] = '\0';
return i;
} }

View File

@ -6,20 +6,8 @@ extern "C" {
#include "../base/type_system/base_toString.h" #include "../base/type_system/base_toString.h"
#define kprintf_INVALID_FORMAT -1 // cross-platform printf analog
#define kprintf_NOT_ENOUGH_ARGUMENTS -2 void kprintf(const char* format, ...);
#define kprintf_BUFFER_IS_TOO_SMALL -3
#define kprintf_BUFFER_IS_NULL -4
/// cross-platform printf analog
///@return number of processed format string characters or error code
i32 _kprintf(const char* format, const i32 args_count, ...);
#define kprintf(FORMAT, ARGS... ) _kprintf(FORMAT, count_args(ARGS) ,##ARGS)
/// @return number of processed format string characters or error code
i32 _ksprintf(char* buffer, i32 buffer_size, const char* format, const i32 args_count, ...);
#define ksprintf(BUFFER, BUFFER_SIZE, FORMAT, ARGS... ) _ksprintf(BUFFER, BUFFER_SIZE, FORMAT, count_args(ARGS) ,##ARGS)
// printf format terminal color sequence // printf format terminal color sequence
#define _PRINTF_COLOR(N) "\e["#N"m" #define _PRINTF_COLOR(N) "\e["#N"m"

View File

@ -57,8 +57,8 @@ static inline i32 krand_next32(krand_statePtr state, i32 from, i32 to) __krand_n
static inline i64 krand_next64(krand_statePtr state, i64 from, i64 to) __krand_next_definition(64) static inline i64 krand_next64(krand_statePtr state, i64 from, i64 to) __krand_next_definition(64)
// divides random number by 2^64 to return a value between 0 and 1 // divides random number by 2^64 to return a value between 0 and 1
static inline f32 krand_nextFloat32(krand_statePtr state) {return (f32)KRAND_ALG32_next(state) / (u32)(-1); } static inline f32 krand_nextFloat32(krand_statePtr state) {return (u32)KRAND_ALG32_next(state)/0xffffffff; }
static inline f64 krand_nextFloat64(krand_statePtr state) {return (f64)KRAND_ALG64_next(state) / (u64)(-1); } static inline f64 krand_nextFloat64(krand_statePtr state) {return KRAND_ALG64_next(state)/0xffffffff; }
///@param chance (0-1.0) is probability of success ///@param chance (0-1.0) is probability of success

View File

@ -1,48 +0,0 @@
// posix version definition to use clock_gettime
#ifndef _XOPEN_SOURCE
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif
#endif
#include "time.h"
#include <time.h>
#define K 1000
#define M 1000000
#define G 1000000000
nsec_t getTimeNsec(){
struct timespec t;
if(clock_gettime(CLOCK_REALTIME, &t) != 0)
throw(ERR_UNEXPECTEDVAL);
u64 n = t.tv_sec * G + t.tv_nsec;
return n;
}
usec_t getTimeUsec(){
struct timespec t;
if(clock_gettime(CLOCK_REALTIME, &t) != 0)
throw(ERR_UNEXPECTEDVAL);
u64 n = t.tv_sec * M + t.tv_nsec / K;
return n;
}
void sleepNsec(nsec_t time){
struct timespec t = {
.tv_sec = time / G,
.tv_nsec = time % G
};
if(nanosleep(&t, NULL) != 0)
throw(ERR_UNEXPECTEDVAL);
}
void sleepUsec(usec_t time){
sleepNsec(time * K);
}
void sleepMsec(msec_t time){
sleepNsec(time * M);
}

View File

@ -1,30 +0,0 @@
#pragma once
#if __cplusplus
extern "C" {
#endif
#include "../base/base.h"
/// nanoseconds
typedef u64 nsec_t;
/// microseconds
typedef u64 usec_t;
/// miliseconds
typedef u64 msec_t;
/// system time now in nanoseconds
///@return u64 will overflow in 13 years
nsec_t getTimeNsec();
/// system time now in microseconds
///@return u64 will overflow in 58494 years
usec_t getTimeUsec();
void sleepNsec(nsec_t time);
void sleepUsec(usec_t time);
void sleepMsec(msec_t time);
#if __cplusplus
}
#endif

View File

@ -38,7 +38,10 @@ void printrowgraph(Hashtable* ht){
char* genkey(u32 i){ char* genkey(u32 i){
char* key=malloc(12); char* key=malloc(12);
ksprintf(key,12,"key_%u",i); IFMSC(
sprintf_s(key,12,"key_%u",i),
sprintf(key,"key_%u",i)
);
return key; return key;
} }

View File

@ -47,12 +47,8 @@ typedef struct {
void* tcp_client_connect_async(void* _data){ void* tcp_client_connect_async(void* _data){
tcp_client_connect_async_data* data = _data; tcp_client_connect_async_data* data = _data;
tryLast(knSocketTCP_connect(data->socket_client, data->serverEnd), _m8531,;); tryLast(knSocketTCP_connect(data->socket_client, data->serverEnd), _m8531,;);
kprintf_safe("\e[92mclient socket connected to server\n");
char* adrstr = knIPV4Endpoint_toString(data->socket_client->localEndpoint);
kprintf("\e[92mclient socket was implicitely bound to %s\n\e[94m", adrstr);
free(adrstr);
kprintf_safe("\e[92mclient socket connected to server\n");
free(data); free(data);
return NULL; return NULL;
} }
@ -67,8 +63,7 @@ static void test_tcp(){
socket_server=m_socketS.value.VoidPtr; socket_server=m_socketS.value.VoidPtr;
kprintf("\e[92mTCP server socket created\n"); kprintf("\e[92mTCP server socket created\n");
tryLast(knSocketTCP_bind(socket_server, serverEnd), _m81775, ;) tryLast(knSocketTCP_bindAndListen(socket_server, serverEnd), _m81775, ;)
tryLast(knSocketTCP_listen(socket_server), _m88775, ;)
kprintf("\e[92mserver socket is listening\n"); kprintf("\e[92mserver socket is listening\n");
} }
// client // client
@ -166,10 +161,6 @@ void test_udp(){
const char client_msg[] = "ping"; const char client_msg[] = "ping";
tryLast(knSocketUDP_sendTo(socket_client, client_msg, sizeof(client_msg), serverEnd), _mu75q2, ;); tryLast(knSocketUDP_sendTo(socket_client, client_msg, sizeof(client_msg), serverEnd), _mu75q2, ;);
kprintf("\e[92mmessage sent to server\n\e[94m"); kprintf("\e[92mmessage sent to server\n\e[94m");
char* adrstr = knIPV4Endpoint_toString(socket_client->localEndpoint);
kprintf("\e[92mclient socket was implicitely bound to %s\n\e[94m", adrstr);
free(adrstr);
} }
// server // server
{ {
@ -185,7 +176,7 @@ void test_udp(){
const char server_msg[] = "pong"; const char server_msg[] = "pong";
tryLast(knSocketUDP_sendTo(socket_server, server_msg, sizeof(server_msg), clientEnd), _mu75q2, ;); tryLast(knSocketUDP_sendTo(socket_server, server_msg, sizeof(server_msg), clientEnd), _mu75q2, ;);
char* adrstr = knIPV4Endpoint_toString(clientEnd); char* adrstr = knIPV4Endpoint_toString(&clientEnd);
kprintf("\e[92mmessage sent to client (%s)\n\e[94m", adrstr); kprintf("\e[92mmessage sent to client (%s)\n\e[94m", adrstr);
free(adrstr); free(adrstr);
fflush(stdout); fflush(stdout);
@ -200,7 +191,7 @@ void test_udp(){
fputc('\n', stdout); fputc('\n', stdout);
if(!cptr_equals(received_server_msg, "pong")) if(!cptr_equals(received_server_msg, "pong"))
throw("received_server_msg != \"pong\""); throw("received_server_msg != \"pong\"");
char* adrstr = knIPV4Endpoint_toString(serverEnd); char* adrstr = knIPV4Endpoint_toString(&serverEnd);
kprintf("\e[92mmessage received by client (%s)\n", adrstr); kprintf("\e[92mmessage received by client (%s)\n", adrstr);
free(adrstr); free(adrstr);
fflush(stdout); fflush(stdout);