4
4
#include <stdio.h>
5
5
#include <stdlib.h>
6
6
#include <string.h>
7
+ #include <errno.h>
7
8
8
9
#include "utils.h"
9
10
13
14
* \param _file The file to open
14
15
* \param _prog Return value for the Brainfuck code string
15
16
* \param _len Return value for length of the Brainfuck code string
16
- * \return Error 1, Success 0
17
+ * \return 0 = Success, 1 = Err
17
18
*/
18
19
int loadProgr (const char * _file , char * * _prog , size_t * _len );
19
20
20
21
Command cmds [] = {
21
- // Informatical args like help or version come before all other to quit the program before making anything else
22
22
{"yacbfi" , 0 , COMMAND_NO_ARG , "[options]" , 0 },
23
23
{"help" , 'h' , COMMAND_NO_ARG , "Shows this message" , 'h' },
24
24
{"version" , 'v' , COMMAND_NO_ARG , "Show the current version number" , 'v' },
25
25
{"file" , 'f' , COMMAND_HAS_ARG , "Brainf*ck File to use" , 'f' },
26
26
{NULL , 0 , 0 , NULL , 0 }
27
27
};
28
28
29
- #define ALLOC_MEM (size_t)5
29
+ #define ALLOC_MEM (size_t)512
30
30
#define REALLOC_MEM (size_t)1024
31
31
32
32
int main (int argc , char const * argv []) {
33
33
const char * filename ;
34
34
char * program ;
35
35
size_t program_len ;
36
36
37
- size_t memory_size = ALLOC_MEM ;
38
- unsigned char * memory = (char * ) calloc (sizeof (unsigned char ), memory_size ); ERR_ALLOC (memory )
37
+ size_t memory_length = ALLOC_MEM ;
38
+ unsigned char * memory = (char * ) calloc (memory_length , sizeof (unsigned char ));
39
+ if (memory == NULL ) { ERR_ALLOC (); }
40
+
39
41
size_t mem_ptr = 0 ;
40
- unsigned char current_instr ;
41
42
42
43
int err = handleArgs (argc , argv , cmds , & filename );
43
- if (err == 1 ) { ERR ("Failed to Initialize!\n" ) }
44
+ if (err == 1 ) { ERR ("Failed to Initialize!" ); }
44
45
if (err == 2 ) { return 0 ; }
45
46
else if (filename == NULL ) {
46
47
printf ("Input your programm (max. 1000 chars): " );
47
- program = (char * ) malloc (sizeof (char ) * 1024 ); ERR_ALLOC (program )
48
+ program = (char * ) malloc (sizeof (char ) * 1024 );
49
+ if (program == NULL ) { ERR_ALLOC (); }
50
+
48
51
fgets (program , 1024 , stdin );
49
52
program_len = strlen (program );
50
53
} else {
@@ -54,16 +57,16 @@ int main(int argc, char const *argv[]) {
54
57
55
58
for (int i = 0 ; i < program_len ; i ++ ) {
56
59
// Dynamicly alloc if the Memory gets too small
57
- if (mem_ptr >= memory_size ) {
58
- unsigned char * new_memory = ( unsigned char * ) calloc ( sizeof ( unsigned char ), ( memory_size ) + REALLOC_MEM ); ERR_ALLOC ( new_memory )
59
- memcpy ( new_memory , memory , memory_size );
60
- memory_size += REALLOC_MEM ;
61
- free ( memory );
62
- memory = new_memory ;
60
+ if (mem_ptr >= memory_length ) {
61
+ int reerr = recallocMem (( void * * ) & memory , memory_length ,
62
+ sizeof ( unsigned char ), ( memory_length + REALLOC_MEM ) );
63
+ if ( reerr != 0 ) { ERR_ALLOC (); }
64
+
65
+ memory_length += REALLOC_MEM ;
63
66
}
64
67
65
- current_instr = program [ i ];
66
- switch (current_instr ) {
68
+ // Process the current instruction
69
+ switch (program [ i ] ) {
67
70
case '+' :
68
71
memory [mem_ptr ] += 1 ;
69
72
break ;
@@ -122,16 +125,18 @@ int main(int argc, char const *argv[]) {
122
125
123
126
int loadProgr (const char * _file_name , char * * _prog , size_t * _len ) {
124
127
FILE * _fp = fopen (_file_name , "rb" );
125
- ERR_FOPEN (_fp , _file_name )
128
+ if (_fp == NULL ) { ERR_FOPEN ( _file_name ); return 1 ; }
126
129
127
130
fseek (_fp , 0 , SEEK_END );
128
131
long _flen = ftell (_fp );
129
132
rewind (_fp );
130
133
* _len = _flen + 1 ;
131
134
132
- * _prog = (char * ) malloc (sizeof (char ) * (_flen + 1 )); ERR_ALLOC (* _prog )
135
+ * _prog = (char * ) malloc (sizeof (char ) * (_flen + 1 ));
136
+ if (* _prog == NULL ) { ERR_ALLOC (); return 1 ; }
133
137
134
138
fread (* _prog , sizeof (char ), _flen , _fp );
139
+ // Set 0 Terminator
135
140
(* _prog )[_flen ] = '\0' ;
136
141
137
142
fclose (_fp );
0 commit comments