12
12
* C runtime and essential libraries.
13
13
*/
14
14
15
+ #include <stdbool.h>
15
16
#include <stdio.h>
16
17
#include <stdlib.h>
18
+ #include <string.h>
17
19
18
20
#define MAX_LINE_LEN 200
19
- #define MAX_SIZE 65536
21
+ #define DEFAULT_SOURCE_SIZE 65536
20
22
21
- char * SOURCE ;
22
- int source_idx ;
23
+ #define write_char ( c ) source_push( SOURCE, c)
24
+ #define write_str ( s ) source_push_str(SOURCE, s)
23
25
24
- void write_char (char c )
26
+ typedef struct {
27
+ int size ;
28
+ int capacity ;
29
+ char * elements ;
30
+ } source_t ;
31
+
32
+ source_t * SOURCE ;
33
+
34
+ source_t * source_create (int init_capacity )
35
+ {
36
+ source_t * array = malloc (sizeof (source_t ));
37
+ if (!array )
38
+ return NULL ;
39
+
40
+ array -> size = 0 ;
41
+ array -> capacity = init_capacity ;
42
+ array -> elements = malloc (array -> capacity * sizeof (char ));
43
+ if (!array -> elements ) {
44
+ free (array );
45
+ return NULL ;
46
+ }
47
+
48
+ return array ;
49
+ }
50
+
51
+ bool source_extend (source_t * src , int len )
52
+ {
53
+ int new_size = src -> size + len ;
54
+
55
+ if (new_size < src -> capacity )
56
+ return true;
57
+
58
+ if (new_size > src -> capacity << 1 )
59
+ src -> capacity = new_size ;
60
+ else
61
+ src -> capacity <<= 1 ;
62
+
63
+ char * new_arr = malloc (src -> capacity * sizeof (char ));
64
+
65
+ if (!new_arr )
66
+ return false;
67
+
68
+ memcpy (new_arr , src -> elements , src -> size * sizeof (char ));
69
+
70
+ free (src -> elements );
71
+ src -> elements = new_arr ;
72
+
73
+ return true;
74
+ }
75
+
76
+ bool source_push (source_t * src , char value )
25
77
{
26
- SOURCE [source_idx ++ ] = c ;
78
+ if (!source_extend (src , 1 ))
79
+ return false;
80
+
81
+ src -> elements [src -> size ] = value ;
82
+ src -> size ++ ;
83
+
84
+ return true;
27
85
}
28
86
29
- void write_str ( char * str )
87
+ bool source_push_str ( source_t * src , char * value )
30
88
{
31
- for (int i = 0 ; str [i ]; i ++ )
32
- write_char (str [i ]);
89
+ int len = strlen (value );
90
+
91
+ if (!source_extend (src , len ))
92
+ return false;
93
+
94
+ strncpy (src -> elements + src -> size , value , len );
95
+ src -> size += len ;
96
+
97
+ return true;
98
+ }
99
+
100
+ void source_free (source_t * src )
101
+ {
102
+ if (!src )
103
+ return ;
104
+
105
+ free (src -> elements );
106
+ free (src );
33
107
}
34
108
35
109
void write_line (char * src )
@@ -66,8 +140,8 @@ void load_from(char *file)
66
140
void save_to (char * file )
67
141
{
68
142
FILE * f = fopen (file , "wb" );
69
- for (int i = 0 ; i < source_idx ; i ++ )
70
- fputc (SOURCE [i ], f );
143
+ for (int i = 0 ; i < SOURCE -> size ; i ++ )
144
+ fputc (SOURCE -> elements [i ], f );
71
145
fclose (f );
72
146
}
73
147
@@ -78,8 +152,7 @@ int main(int argc, char *argv[])
78
152
return -1 ;
79
153
}
80
154
81
- source_idx = 0 ;
82
- SOURCE = malloc (MAX_SIZE );
155
+ SOURCE = source_create (DEFAULT_SOURCE_SIZE );
83
156
84
157
write_str ("/* Created by tools/inliner - DO NOT EDIT. */\n" );
85
158
@@ -94,14 +167,14 @@ int main(int argc, char *argv[])
94
167
* __c("}\n");
95
168
*/
96
169
write_str ("void __c(char *src) {\n" );
97
- write_str (" for (int i = 0; src[i]; i++)\n" );
98
- write_str (" source_push(SOURCE, src[i]);\n" );
170
+ write_str (" source_push_str(SOURCE, src);\n" );
99
171
write_str ("}\n" );
100
172
101
173
write_str ("void libc_generate() {\n" );
102
174
load_from (argv [1 ]);
103
175
write_str ("}\n" );
104
176
save_to (argv [2 ]);
177
+ source_free (SOURCE );
105
178
106
179
return 0 ;
107
180
}
0 commit comments