Line data Source code
1 : // System Includes
2 : #include <stdio.h> // vsnprintf
3 :
4 : // Internal Includes
5 : #include "kirke/string.h"
6 :
7 306 : static bool chars_are_equal( const char *first, const char *second ){
8 306 : if( *first == *second ){
9 286 : return true;
10 : }
11 :
12 20 : return false;
13 : }
14 :
15 1145 : ARRAY__DEFINE( String, string, char, chars_are_equal )
16 0 : ARRAY__DEFINE( Array__String, array__string, String, string__equals )
17 :
18 2 : void string__initialize__va_list( String* string, Allocator* allocator, const char* format, va_list args ){
19 : char c;
20 : va_list args_copy;
21 2 : va_copy( args_copy, args );
22 2 : int required_capacity = vsnprintf( &c, 1, format, args_copy ) + 1;
23 :
24 2 : string__initialize( string, allocator, required_capacity );
25 2 : string->length = vsnprintf( string->data, required_capacity, format, args );
26 2 : }
27 :
28 1 : void string__initialize__format( String* string, Allocator* allocator, const char* format, ... ){
29 : va_list args;
30 1 : va_start( args, format );
31 :
32 1 : string__initialize__va_list( string, allocator, format, args );
33 :
34 1 : va_end( args );
35 1 : }
36 :
37 4 : void string__append__va_list( String *string, Allocator *allocator, const char* format, va_list args ){
38 : va_list args_copy;
39 4 : va_copy( args_copy, args );
40 :
41 : char c;
42 4 : int additional_length = vsnprintf( &c, 1, format, args_copy ) + 1;
43 :
44 4 : if( string->capacity < string->length + additional_length ){
45 4 : string->data = allocator__realloc( allocator, string->data, string->length + additional_length );
46 4 : string->capacity = string->length + additional_length;
47 : }
48 :
49 4 : string->length += vsnprintf( string->data + string->length, additional_length, format, args );
50 4 : }
51 :
52 2 : void string__append__format( String *string, Allocator *allocator, const char* format, ... ){
53 : va_list args;
54 2 : va_start( args, format );
55 :
56 2 : string__append__va_list( string, allocator, format, args );
57 :
58 2 : va_end( args );
59 2 : }
|