mirror of
https://github.com/ascii-boxes/boxes.git
synced 2025-06-20 09:48:12 +02:00
Move code on shape lines from parser.y to parsecode.c
This commit is contained in:
parent
286ec99c6d
commit
771f78874e
@ -1013,4 +1013,98 @@ int action_add_regex_rule(pass_to_bison *bison_args, char *type, reprule_t **rul
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int action_first_shape_line(pass_to_bison *bison_args, bxstr_t *line, sentry_t *shape)
|
||||||
|
{
|
||||||
|
sentry_t rval = SENTRY_INITIALIZER;
|
||||||
|
|
||||||
|
#ifdef PARSER_DEBUG
|
||||||
|
fprintf(stderr, "Initializing a shape entry with first line\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
size_t error_pos = 0;
|
||||||
|
if (!bxs_valid_in_shape(line, &error_pos)) {
|
||||||
|
yyerror(bison_args, "invalid character in shape line at position %d", (int) error_pos);
|
||||||
|
return RC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rval.width = line->num_columns;
|
||||||
|
rval.height = 1;
|
||||||
|
|
||||||
|
rval.chars = (char **) malloc(sizeof(char *));
|
||||||
|
if (rval.chars == NULL) {
|
||||||
|
perror(PROJECT ": shape_lines21");
|
||||||
|
return RC_ABORT;
|
||||||
|
}
|
||||||
|
rval.chars[0] = (char *) strdup(line->ascii);
|
||||||
|
if (rval.chars[0] == NULL) {
|
||||||
|
perror(PROJECT ": shape_lines22");
|
||||||
|
return RC_ABORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
rval.mbcs = (bxstr_t **) malloc(sizeof(bxstr_t *));
|
||||||
|
if (rval.mbcs == NULL) {
|
||||||
|
perror(PROJECT ": shape_lines23");
|
||||||
|
return RC_ABORT;
|
||||||
|
}
|
||||||
|
rval.mbcs[0] = bxs_strdup(line);
|
||||||
|
if (rval.mbcs[0] == NULL) {
|
||||||
|
perror(PROJECT ": shape_lines24");
|
||||||
|
return RC_ABORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(shape, &rval, sizeof(sentry_t));
|
||||||
|
return RC_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int action_add_shape_line(pass_to_bison *bison_args, sentry_t *shape, bxstr_t *line)
|
||||||
|
{
|
||||||
|
#ifdef PARSER_DEBUG
|
||||||
|
fprintf(stderr, "Extending a shape entry\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
size_t slen = line->num_columns;
|
||||||
|
if (slen != shape->width) {
|
||||||
|
yyerror(bison_args, "all elements of a shape spec must be of equal length");
|
||||||
|
return RC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t error_pos = 0;
|
||||||
|
if (!bxs_valid_in_shape(line, &error_pos)) {
|
||||||
|
yyerror(bison_args, "invalid character in shape line at position %d", (int) error_pos);
|
||||||
|
return RC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
shape->height++;
|
||||||
|
|
||||||
|
char **tmp = (char **) realloc(shape->chars, shape->height * sizeof(char *));
|
||||||
|
if (tmp == NULL) {
|
||||||
|
perror(PROJECT ": shape_lines11");
|
||||||
|
return RC_ABORT;
|
||||||
|
}
|
||||||
|
shape->chars = tmp;
|
||||||
|
shape->chars[shape->height - 1] = (char *) strdup(line->ascii);
|
||||||
|
if (shape->chars[shape->height - 1] == NULL) {
|
||||||
|
perror(PROJECT ": shape_lines12");
|
||||||
|
return RC_ABORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
bxstr_t **mtmp = (bxstr_t **) realloc(shape->mbcs, shape->height * sizeof(bxstr_t *));
|
||||||
|
if (mtmp == NULL) {
|
||||||
|
perror(PROJECT ": shape_lines13");
|
||||||
|
return RC_ABORT;
|
||||||
|
}
|
||||||
|
shape->mbcs = mtmp;
|
||||||
|
shape->mbcs[shape->height - 1] = bxs_strdup(line);
|
||||||
|
if (shape->mbcs[shape->height - 1] == NULL) {
|
||||||
|
perror(PROJECT ": shape_lines14");
|
||||||
|
return RC_ABORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RC_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* vim: set cindent sw=4: */
|
/* vim: set cindent sw=4: */
|
||||||
|
@ -163,12 +163,36 @@ int tag_record(pass_to_bison *bison_args, bxstr_t *tag);
|
|||||||
* @param bison_args the parser state
|
* @param bison_args the parser state
|
||||||
* @param sample the sample block content (non-empty when this is invoked)
|
* @param sample the sample block content (non-empty when this is invoked)
|
||||||
* @return 0: success;
|
* @return 0: success;
|
||||||
* 1: YYERROR must be invoked
|
* 1: YYERROR must be invoked;
|
||||||
* 2: YYABORT must be invoked
|
* 2: YYABORT must be invoked
|
||||||
*/
|
*/
|
||||||
int action_sample_block(pass_to_bison *bison_args, bxstr_t *sample);
|
int action_sample_block(pass_to_bison *bison_args, bxstr_t *sample);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start a new shape by adding its first line.
|
||||||
|
* @param bison_args the parser state
|
||||||
|
* @param line the first line of the new shape
|
||||||
|
* @param shape the address where the new shape shall be stored
|
||||||
|
* @return 0: success;
|
||||||
|
* 1: YYERROR must be invoked;
|
||||||
|
* 2: YYABORT must be invoked
|
||||||
|
*/
|
||||||
|
int action_first_shape_line(pass_to_bison *bison_args, bxstr_t *line, sentry_t *shape);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extend a shape by adding another line.
|
||||||
|
* @param bison_args the parser state
|
||||||
|
* @param shape the address of the shape to be extended
|
||||||
|
* @param line the new line
|
||||||
|
* @return 0: success;
|
||||||
|
* 1: YYERROR must be invoked;
|
||||||
|
* 2: YYABORT must be invoked
|
||||||
|
*/
|
||||||
|
int action_add_shape_line(pass_to_bison *bison_args, sentry_t *shape, bxstr_t *line);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*EOF*/ /* vim: set cindent sw=4: */
|
/*EOF*/ /* vim: set cindent sw=4: */
|
||||||
|
84
src/parser.y
84
src/parser.y
@ -390,91 +390,15 @@ shape_def: '(' shape_lines ')'
|
|||||||
|
|
||||||
shape_lines: shape_lines ',' STRING
|
shape_lines: shape_lines ',' STRING
|
||||||
{
|
{
|
||||||
sentry_t rval = $1; // TODO move this to parsecode.c
|
sentry_t rval = $1;
|
||||||
size_t slen = $3->num_columns;
|
invoke_action(action_add_shape_line(bison_args, &rval, $3));
|
||||||
|
|
||||||
#ifdef PARSER_DEBUG
|
|
||||||
fprintf (stderr, "Extending a shape entry\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (slen != rval.width) {
|
|
||||||
yyerror(bison_args, "all elements of a shape spec must be of equal length");
|
|
||||||
YYERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t error_pos = 0;
|
|
||||||
if (!bxs_valid_in_shape($3, &error_pos)) {
|
|
||||||
yyerror(bison_args, "invalid character in shape line at position %d", (int) error_pos);
|
|
||||||
YYERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
rval.height++;
|
|
||||||
|
|
||||||
char **tmp = (char **) realloc(rval.chars, rval.height * sizeof(char *));
|
|
||||||
if (tmp == NULL) {
|
|
||||||
perror (PROJECT": shape_lines11");
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
rval.chars = tmp;
|
|
||||||
rval.chars[rval.height - 1] = (char *) strdup ($3->ascii);
|
|
||||||
if (rval.chars[rval.height-1] == NULL) {
|
|
||||||
perror (PROJECT": shape_lines12");
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
bxstr_t **mtmp = (bxstr_t **) realloc(rval.mbcs, rval.height * sizeof(bxstr_t *));
|
|
||||||
if (mtmp == NULL) {
|
|
||||||
perror (PROJECT": shape_lines13");
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
rval.mbcs = mtmp;
|
|
||||||
rval.mbcs[rval.height - 1] = bxs_strdup($3);
|
|
||||||
if (rval.mbcs[rval.height - 1] == NULL) {
|
|
||||||
perror (PROJECT": shape_lines14");
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
$$ = rval;
|
$$ = rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
| STRING
|
| STRING
|
||||||
{
|
{
|
||||||
sentry_t rval = SENTRY_INITIALIZER;
|
sentry_t rval;
|
||||||
|
invoke_action(action_first_shape_line(bison_args, $1, &rval));
|
||||||
#ifdef PARSER_DEBUG
|
|
||||||
fprintf (stderr, "Initializing a shape entry with first line\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size_t error_pos = 0;
|
|
||||||
if (!bxs_valid_in_shape($1, &error_pos)) {
|
|
||||||
yyerror(bison_args, "invalid character in shape line at position %d", (int) error_pos);
|
|
||||||
YYERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
rval.width = $1->num_columns;
|
|
||||||
rval.height = 1;
|
|
||||||
|
|
||||||
rval.chars = (char **) malloc (sizeof(char*));
|
|
||||||
if (rval.chars == NULL) {
|
|
||||||
perror (PROJECT": shape_lines21");
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
rval.chars[0] = (char *) strdup ($1->ascii);
|
|
||||||
if (rval.chars[0] == NULL) {
|
|
||||||
perror (PROJECT": shape_lines22");
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
rval.mbcs = (bxstr_t **) malloc(sizeof(bxstr_t *));
|
|
||||||
if (rval.mbcs == NULL) {
|
|
||||||
perror (PROJECT": shape_lines23");
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
rval.mbcs[0] = bxs_strdup($1);
|
|
||||||
if (rval.mbcs[0] == NULL) {
|
|
||||||
perror (PROJECT": shape_lines24");
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
$$ = rval;
|
$$ = rval;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user