5 #define VG_STATIC static
11 #include "vg_stdint.h"
13 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
15 typedef unsigned int uint
;
30 typedef struct vg_tex2d vg_tex2d
;
38 #define vg_static_assert _Static_assert
39 #define vg_list_size( A ) (sizeof(A)/sizeof(A[0]))
40 #define VG_MUST_USE_RESULT __attribute__((warn_unused_result))
54 enum strncpy_behaviour
{
55 k_strncpy_always_add_null
= 0,
56 k_strncpy_allow_cutoff
= 1,
57 k_strncpy_overflow_fatal
= 2
60 VG_STATIC
void vg_fatal_error( const char *fmt
, ... );
61 VG_STATIC u32
vg_strncpy( const char *src
, char *dst
, u32 len
,
62 enum strncpy_behaviour behaviour
)
64 for( u32 i
=0; i
<len
; i
++ ){
67 if( !src
[i
] ) return i
;
70 if( behaviour
== k_strncpy_always_add_null
){
74 else if( behaviour
== k_strncpy_overflow_fatal
){
75 vg_fatal_error( "Strncpy dest exceeded buffer length\n" );
83 typedef struct vg_str vg_str
;
89 VG_STATIC
void vg_strnull( vg_str
*str
, char *buffer
, u32 len
)
92 str
->buffer
[0] = '\0';
97 VG_STATIC
void vg_strcat( vg_str
*str
, const char *append
)
100 for( u32 i
=0; str
->i
< str
->len
; i
++, str
->i
++ ){
101 str
->buffer
[ str
->i
] = append
[i
];
103 if( append
[i
] == '\0' ) return;
107 VG_STATIC
int vg_strgood( vg_str
*str
)
109 if( str
->i
== str
->len
){
110 if( str
->buffer
[str
->i
-1] == '\0' ) return 1;
116 VG_STATIC
char *vg_strch( vg_str
*str
, char c
)
119 for( u32 i
=0; i
<str
->i
; i
++ ){
120 if( str
->buffer
[i
] == c
)
127 VG_STATIC u32
vg_strdjb2( const char *str
)
131 while( (c
= *str
++) )
132 hash
= ((hash
<< 5) + hash
) + c
; /* hash * 33 + c */
137 VG_STATIC
int vg_strdjb2_eq( const char *s1
, u32 h1
,
138 const char *s2
, u32 h2
)
141 if(!strcmp(s1
, s2
)) return 1;
146 #define VG_STRDJB2_EQ( CS1, S2, H2 ) \
147 vg_strdjb2_eq( CS1, vg_strdjb2(CS1), S2, H2 )
150 #define VG_MIN( A, B ) ((A)<(B)?(A):(B))
151 #define VG_MAX( A, B ) ((A)>(B)?(A):(B))