Skip to content

Commit 5932f0b

Browse files
gdtknightclaude
andcommitted
refactor(parser): simplify error handling and clarify naming
- Remove redundant NULL guards in internal functions (skip_whitespace, at_line_end, line_reader_next, line_reader_init, error_context_init) - Rename dispatch functions for clarity: dispatch_element → dispatch_line, dispatch_elements → dispatch_scene_element, dispatch_objects → dispatch_object - Use precise error codes: PARSE_ERR_FORMAT → PARSE_ERR_OVERFLOW for allocation failures (object_list_add, bump_path, line malloc) - Replace io_error boolean with error field carrying specific t_parse_result codes (PARSE_ERR_IO, PARSE_ERR_OVERFLOW) - Remove error_context_set_line/error_context_set_element wrappers, assign fields directly - Simplify line_reader_init to void (cannot fail) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3298d19 commit 5932f0b

11 files changed

Lines changed: 24 additions & 67 deletions

includes/parser.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ typedef struct s_line_reader
5555
int buf_len;
5656
int line_num;
5757
int line_too_long;
58-
int io_error;
58+
int error;
5959
} t_line_reader;
6060

6161
/*
@@ -73,7 +73,7 @@ typedef struct s_error_context
7373
* Line Reader API
7474
*/
7575

76-
int line_reader_init(t_line_reader *reader, int fd);
76+
void line_reader_init(t_line_reader *reader, int fd);
7777
char *line_reader_next(t_line_reader *reader);
7878
int line_reader_get_line_num(t_line_reader *reader);
7979

@@ -99,9 +99,6 @@ int at_line_end(const char *str);
9999
*/
100100

101101
void error_context_init(t_error_context *ctx);
102-
void error_context_set_line(t_error_context *ctx, int line);
103-
void error_context_set_element(t_error_context *ctx,
104-
const char *type);
105102
void error_context_print(t_error_context *ctx);
106103
void error_write_int(int n);
107104
const char *get_error_message(t_parse_result code);
@@ -129,7 +126,7 @@ t_parse_result validate_coordinate_range(const t_vec3 *vec);
129126
* @return 1 on success, 0 on error
130127
*/
131128
int parse_scene(const char *filename, t_scene *scene);
132-
t_parse_result dispatch_element(char *line, t_scene *scene,
129+
t_parse_result dispatch_line(char *line, t_scene *scene,
133130
t_error_context *ctx);
134131
int validate_extension(const char *filename);
135132

src/parser/parse_bonus_options.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ static t_parse_result parse_bump_opt(const char *str, t_object *obj,
5454
free(obj->bump_path);
5555
obj->bump_path = ft_substr(start, 0, len);
5656
if (!obj->bump_path)
57-
return (PARSE_ERR_FORMAT);
57+
return (PARSE_ERR_OVERFLOW);
5858
*end = start + len;
5959
return (PARSE_OK);
6060
}

src/parser/parse_cone.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,5 @@ t_parse_result parse_cone(char *line, t_scene *scene)
8888
if (object_list_add(&scene->objects, &obj))
8989
return (PARSE_OK);
9090
free(obj.bump_path);
91-
return (PARSE_ERR_FORMAT);
91+
return (PARSE_ERR_OVERFLOW);
9292
}

src/parser/parse_cylinder.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,5 @@ t_parse_result parse_cylinder(char *line, t_scene *scene)
114114
if (object_list_add(&scene->objects, &obj))
115115
return (PARSE_OK);
116116
free(obj.bump_path);
117-
return (PARSE_ERR_FORMAT);
117+
return (PARSE_ERR_OVERFLOW);
118118
}

src/parser/parse_error.c

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,39 +20,11 @@
2020
*/
2121
void error_context_init(t_error_context *ctx)
2222
{
23-
if (!ctx)
24-
return ;
2523
ctx->line_num = 0;
2624
ctx->element_type = NULL;
2725
ctx->error_code = PARSE_OK;
2826
}
2927

30-
/**
31-
* @brief Set the line number in error context.
32-
*
33-
* @param ctx Error context to update.
34-
* @param line Line number (1-based).
35-
*/
36-
void error_context_set_line(t_error_context *ctx, int line)
37-
{
38-
if (!ctx)
39-
return ;
40-
ctx->line_num = line;
41-
}
42-
43-
/**
44-
* @brief Set the element type in error context.
45-
*
46-
* @param ctx Error context to update.
47-
* @param type Element type string or NULL.
48-
*/
49-
void error_context_set_element(t_error_context *ctx, const char *type)
50-
{
51-
if (!ctx)
52-
return ;
53-
ctx->element_type = type;
54-
}
55-
5628
/**
5729
* @brief Print error message with context to stderr.
5830
*

src/parser/parse_line_reader.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static int refill_buffer(t_line_reader *reader)
2727
reader->buf_pos = 0;
2828
if (reader->buf_len < 0)
2929
{
30-
reader->io_error = 1;
30+
reader->error = PARSE_ERR_IO;
3131
reader->buf_len = 0;
3232
}
3333
return (reader->buf_len);
@@ -101,7 +101,7 @@ static char *finalize_line(char *line, int len, t_line_reader *reader)
101101
result = malloc(len + 1);
102102
if (!result)
103103
{
104-
reader->io_error = 1;
104+
reader->error = PARSE_ERR_OVERFLOW;
105105
return (NULL);
106106
}
107107
ft_strlcpy(result, line, len + 1);
@@ -120,8 +120,6 @@ char *line_reader_next(t_line_reader *reader)
120120
int pos;
121121
int status;
122122

123-
if (!reader)
124-
return (NULL);
125123
reader->line_num++;
126124
reader->line_too_long = 0;
127125
pos = 0;

src/parser/parse_objects.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ t_parse_result parse_sphere(char *line, t_scene *scene)
100100
if (object_list_add(&scene->objects, &obj))
101101
return (PARSE_OK);
102102
free(obj.bump_path);
103-
return (PARSE_ERR_FORMAT);
103+
return (PARSE_ERR_OVERFLOW);
104104
}
105105

106106
/**
@@ -165,5 +165,5 @@ t_parse_result parse_plane(char *line, t_scene *scene)
165165
if (object_list_add(&scene->objects, &obj))
166166
return (PARSE_OK);
167167
free(obj.bump_path);
168-
return (PARSE_ERR_FORMAT);
168+
return (PARSE_ERR_OVERFLOW);
169169
}

src/parser/parse_token.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ static int is_whitespace(char c)
3131
*/
3232
const char *skip_whitespace(const char *str)
3333
{
34-
if (!str)
35-
return (NULL);
3634
while (is_whitespace(*str))
3735
str++;
3836
return (str);
@@ -49,8 +47,6 @@ const char *skip_whitespace(const char *str)
4947
*/
5048
int at_line_end(const char *str)
5149
{
52-
if (!str)
53-
return (1);
5450
str = skip_whitespace(str);
5551
return (*str == '\0' || *str == '\n' || *str == '#');
5652
}

src/parser/parser.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static int parse_line(char *line, t_scene *scene, t_error_context *ctx)
3333
t_parse_result result;
3434

3535
ctx->element_type = NULL;
36-
result = dispatch_element(line, scene, ctx);
36+
result = dispatch_line(line, scene, ctx);
3737
if (result != PARSE_OK)
3838
{
3939
ctx->error_code = result;
@@ -75,7 +75,7 @@ static int check_line_too_long(t_line_reader *reader, t_error_context *ctx)
7575
{
7676
if (reader->line_too_long)
7777
{
78-
error_context_set_line(ctx, reader->line_num);
78+
ctx->line_num = reader->line_num;
7979
ctx->error_code = PARSE_ERR_LINE_TOO_LONG;
8080
error_context_print(ctx);
8181
return (1);
@@ -105,15 +105,15 @@ static int process_lines(t_line_reader *reader, t_scene *scene,
105105
return (0);
106106
if (line == NULL)
107107
break ;
108-
error_context_set_line(ctx, reader->line_num);
108+
ctx->line_num = reader->line_num;
109109
success = parse_line(line, scene, ctx);
110110
free(line);
111111
line = line_reader_next(reader);
112112
}
113113
free(line);
114-
if (reader->io_error)
114+
if (reader->error)
115115
{
116-
ctx->error_code = PARSE_ERR_IO;
116+
ctx->error_code = reader->error;
117117
error_context_print(ctx);
118118
return (0);
119119
}
@@ -145,11 +145,7 @@ int parse_scene(const char *filename, t_scene *scene)
145145
if (fd < 0)
146146
return (error_print(ERR_FILE_OPEN), 0);
147147
error_context_init(&ctx);
148-
if (!line_reader_init(&reader, fd))
149-
{
150-
close(fd);
151-
return (error_print(ERR_MALLOC), 0);
152-
}
148+
line_reader_init(&reader, fd);
153149
success = process_lines(&reader, scene, &ctx);
154150
close(fd);
155151
if (success)

src/parser/parser_dispatch.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static int matches_prefix(char *line, const char *prefix, int len)
4343
* @param ctx Error context.
4444
* @return t_parse_result Result code.
4545
*/
46-
static t_parse_result dispatch_objects(char *line, t_scene *scene,
46+
static t_parse_result dispatch_object(char *line, t_scene *scene,
4747
t_error_context *ctx)
4848
{
4949
if (matches_prefix(line, "sp", 2))
@@ -77,7 +77,8 @@ static t_parse_result dispatch_objects(char *line, t_scene *scene,
7777
* @param ctx Error context.
7878
* @return t_parse_result Result code or -1 for objects.
7979
*/
80-
static int dispatch_elements(char *line, t_scene *scene, t_error_context *ctx)
80+
static int dispatch_scene_element(char *line, t_scene *scene,
81+
t_error_context *ctx)
8182
{
8283
if (matches_prefix(line, "A", 1))
8384
{
@@ -105,16 +106,16 @@ static int dispatch_elements(char *line, t_scene *scene, t_error_context *ctx)
105106
* @param ctx Error context for reporting.
106107
* @return t_parse_result PARSE_OK or error code.
107108
*/
108-
t_parse_result dispatch_element(char *line, t_scene *scene,
109+
t_parse_result dispatch_line(char *line, t_scene *scene,
109110
t_error_context *ctx)
110111
{
111112
int result;
112113

113114
line = (char *)skip_whitespace(line);
114115
if (*line == '\0' || *line == '\n' || *line == '#')
115116
return (PARSE_OK);
116-
result = dispatch_elements(line, scene, ctx);
117+
result = dispatch_scene_element(line, scene, ctx);
117118
if (result >= 0)
118119
return ((t_parse_result)result);
119-
return (dispatch_objects(line, scene, ctx));
120+
return (dispatch_object(line, scene, ctx));
120121
}

0 commit comments

Comments
 (0)