mirror of
https://github.com/Ed94/metadesk.git
synced 2026-06-12 23:51:37 -07:00
0ab226f739
They'll be removed on demand in libgen repo
107 lines
2.7 KiB
C
107 lines
2.7 KiB
C
#ifdef INTELLISENSE_DIRECTIVES
|
|
# pragma once
|
|
# include "strings.h"
|
|
#endif
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Text 2D Coordinates & Ranges
|
|
|
|
typedef struct MD_TxtPt MD_TxtPt;
|
|
struct MD_TxtPt
|
|
{
|
|
MD_S64 line;
|
|
MD_S64 column;
|
|
};
|
|
|
|
typedef struct MD_TxtRng MD_TxtRng;
|
|
struct MD_TxtRng
|
|
{
|
|
MD_TxtPt md_min;
|
|
MD_TxtPt md_max;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: String Pair Types
|
|
|
|
typedef struct MD_String8TxtPtPair MD_String8TxtPtPair;
|
|
struct MD_String8TxtPtPair
|
|
{
|
|
MD_String8 string;
|
|
MD_TxtPt pt;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Text Path Helpers
|
|
|
|
MD_API MD_String8TxtPtPair md_str8_txt_pt_pair_from_string(MD_String8 string);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Text 2D Coordinate/Range Functions
|
|
|
|
inline MD_TxtPt md_txt_pt(MD_S64 line, MD_S64 column) { MD_TxtPt p = { line, column }; return p; }
|
|
|
|
inline MD_B32 md_txt_pt_match(MD_TxtPt a, MD_TxtPt b) { return a.line == b.line && a.column == b.column; }
|
|
inline MD_TxtPt md_txt_pt_min (MD_TxtPt a, MD_TxtPt b) { MD_TxtPt result = b; if (md_txt_pt_less_than(a, b)) { result = a; } return result; }
|
|
inline MD_TxtPt md_txt_pt_max (MD_TxtPt a, MD_TxtPt b) { MD_TxtPt result = a; if (md_txt_pt_less_than(a, b)) { result = b; } return result; }
|
|
|
|
MD_B32 md_txt_pt_less_than (MD_TxtPt a, MD_TxtPt b);
|
|
MD_TxtRng md_txt_rng (MD_TxtPt md_min, MD_TxtPt md_max);
|
|
MD_TxtRng md_txt_rng_intersect(MD_TxtRng a, MD_TxtRng b);
|
|
MD_TxtRng md_txt_rng_union (MD_TxtRng a, MD_TxtRng b);
|
|
MD_B32 md_txt_rng_contains (MD_TxtRng r, MD_TxtPt pt);
|
|
|
|
inline MD_B32
|
|
md_txt_pt_less_than(MD_TxtPt a, MD_TxtPt b)
|
|
{
|
|
MD_B32 result = 0;
|
|
if (a.line < b.line) {
|
|
result = 1;
|
|
}
|
|
else if (a.line == b.line) {
|
|
result = a.column < b.column;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
inline MD_TxtRng
|
|
md_txt_rng(MD_TxtPt md_min, MD_TxtPt md_max)
|
|
{
|
|
MD_TxtRng range = {0};
|
|
if(md_txt_pt_less_than(md_min, md_max)) {
|
|
range.md_min = md_min;
|
|
range.md_max = md_max;
|
|
}
|
|
else {
|
|
range.md_min = md_max;
|
|
range.md_max = md_min;
|
|
}
|
|
return range;
|
|
}
|
|
|
|
inline MD_TxtRng
|
|
md_txt_rng_intersect(MD_TxtRng a, MD_TxtRng b)
|
|
{
|
|
MD_TxtRng result = {0};
|
|
result.md_min = md_txt_pt_max(a.md_min, b.md_min);
|
|
result.md_max = md_txt_pt_min(a.md_max, b.md_max);
|
|
if (md_txt_pt_less_than(result.md_max, result.md_min)) {
|
|
MemoryZeroStruct(&result);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
inline MD_TxtRng
|
|
md_txt_rng_union(MD_TxtRng a, MD_TxtRng b)
|
|
{
|
|
MD_TxtRng result = {0};
|
|
result.md_min = md_txt_pt_min(a.md_min, b.md_min);
|
|
result.md_max = md_txt_pt_max(a.md_max, b.md_max);
|
|
return result;
|
|
}
|
|
|
|
inline MD_B32
|
|
md_txt_rng_contains(MD_TxtRng r, MD_TxtPt pt) {
|
|
MD_B32 result = ((md_txt_pt_less_than(r.md_min, pt) || md_txt_pt_match(r.md_min, pt)) && md_txt_pt_less_than(pt, r.md_max));
|
|
return result;
|
|
}
|