7 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
9 typedef unsigned int uint
;
24 typedef struct vg_tex2d vg_tex2d
;
32 #define vg_static_assert _Static_assert
33 #define vg_list_size( A ) (sizeof(A)/sizeof(A[0]))
34 #define VG_MUST_USE_RESULT __attribute__((warn_unused_result))
48 enum strncpy_behaviour
{
49 k_strncpy_always_add_null
= 0,
50 k_strncpy_allow_cutoff
= 1,
51 k_strncpy_overflow_fatal
= 2
54 static void vg_fatal_error( const char *fmt
, ... );
55 static u32
vg_strncpy( const char *src
, char *dst
, u32 len
,
56 enum strncpy_behaviour behaviour
)
58 for( u32 i
=0; i
<len
; i
++ ){
61 if( !src
[i
] ) return i
;
64 if( behaviour
== k_strncpy_always_add_null
){
68 else if( behaviour
== k_strncpy_overflow_fatal
){
69 vg_fatal_error( "Strncpy dest exceeded buffer length\n" );
77 typedef struct vg_str vg_str
;
83 static void vg_strnull( vg_str
*str
, char *buffer
, i32 len
){
85 str
->buffer
[0] = '\0';
92 static void vg_strcat( vg_str
*str
, const char *append
){
94 if( str
->i
== -1 ) return;
96 for( u32 i
=0; str
->i
< str
->len
; str
->i
++, i
++ ){
97 str
->buffer
[ str
->i
] = append
[ i
];
99 if( append
[ i
] == '\0' )
104 str
->buffer
[ str
->len
-1 ] = '\0';
108 static void vg_strcati32( vg_str
*str
, i32 value
){
112 while( value
&& (i
<31) ){
113 temp
[ i
++ ] = '0' + (value
% 10);
118 for( int j
=0; j
<i
; j
++ )
119 reverse
[j
] = temp
[ i
-1-j
];
122 vg_strcat( str
, reverse
);
125 vg_strcat( str
, "0" );
128 static void vg_strcati32r( vg_str
*str
, i32 value
, i32 n
, char alt
){
135 temp
[ n
-1 - (i
++) ] = '0' + (value
% 10);
140 temp
[ n
-1 - i
] = alt
;
143 vg_strcat( str
, temp
);
146 static int vg_strgood( vg_str
*str
){
147 if( str
->i
== -1 ) return 0;
151 static char *vg_strch( vg_str
*str
, char c
){
153 for( i32 i
=0; i
<str
->i
; i
++ ){
154 if( str
->buffer
[i
] == c
)
161 static u32
vg_strdjb2( const char *str
){
164 while( (c
= *str
++) )
165 hash
= ((hash
<< 5) + hash
) + c
; /* hash * 33 + c */
170 static int vg_strdjb2_eq( const char *s1
, u32 h1
,
171 const char *s2
, u32 h2
)
174 if(!strcmp(s1
, s2
)) return 1;
179 #define VG_STRDJB2_EQ( CS1, S2, H2 ) \
180 vg_strdjb2_eq( CS1, vg_strdjb2(CS1), S2, H2 )
183 #define VG_MIN( A, B ) ((A)<(B)?(A):(B))
184 #define VG_MAX( A, B ) ((A)>(B)?(A):(B))