mirror of
https://github.com/NikitaIvanovV/ctpv.git
synced 2024-11-30 16:33:20 +01:00
Fix: error if preview type starts with a digit
This commit is contained in:
parent
e463c0c79b
commit
a45979244f
24
src/config.c
24
src/config.c
@ -180,10 +180,30 @@ static int preview_type_mime(char **type, char **subtype)
|
||||
return STAT_OK;
|
||||
}
|
||||
|
||||
static inline void num_is_text(void)
|
||||
{
|
||||
lexer_set_opts(lexer, LEX_OPT_NUMISTEXT);
|
||||
}
|
||||
|
||||
static inline void reset_lexer_opts(void)
|
||||
{
|
||||
lexer_set_opts(lexer, LEX_OPT_NONE);
|
||||
}
|
||||
|
||||
static int preview_type(char **type, char **subtype, char **ext)
|
||||
{
|
||||
CHECK_NULL(preview_type_ext(ext));
|
||||
return preview_type_mime(type, subtype);
|
||||
int ret;
|
||||
|
||||
num_is_text();
|
||||
|
||||
if ((ret = preview_type_ext(ext)) != STAT_NULL)
|
||||
goto exit;
|
||||
|
||||
ret = preview_type_mime(type, subtype);
|
||||
|
||||
exit:
|
||||
reset_lexer_opts();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct Option *get_option(char *name)
|
||||
|
24
src/lexer.c
24
src/lexer.c
@ -23,7 +23,8 @@ typedef struct {
|
||||
} TokenQueue;
|
||||
|
||||
struct Lexer {
|
||||
unsigned int line, col;
|
||||
enum LexerOpts opts;
|
||||
unsigned line, col;
|
||||
struct {
|
||||
unsigned int line, col;
|
||||
} tok_pos;
|
||||
@ -153,6 +154,7 @@ Lexer *lexer_init(FILE *f)
|
||||
}
|
||||
|
||||
init_input_buf(&ctx->input_buf, f);
|
||||
lexer_set_opts(ctx, LEX_OPT_NONE);
|
||||
ctx->text_buf = ulist_new(sizeof(char), 1024);
|
||||
ctx->line = ctx->col = 1;
|
||||
ctx->tok_queue.back = ctx->tok_queue.front = 0;
|
||||
@ -160,6 +162,11 @@ Lexer *lexer_init(FILE *f)
|
||||
return ctx;
|
||||
}
|
||||
|
||||
void lexer_set_opts(Lexer *ctx, enum LexerOpts flags)
|
||||
{
|
||||
ctx->opts = flags;
|
||||
}
|
||||
|
||||
void lexer_free(Lexer *ctx)
|
||||
{
|
||||
ulist_free(ctx->text_buf);
|
||||
@ -263,12 +270,23 @@ static inline Token read_int(Lexer *ctx)
|
||||
|
||||
record_text(ctx);
|
||||
read_while(ctx, isdigit, 1);
|
||||
int i = atoi(get_text(ctx));
|
||||
|
||||
Token tok;
|
||||
char *text = get_text(ctx);
|
||||
|
||||
/* If NUMISTEXT option is set, do not convert string to integer */
|
||||
if (ctx->opts & LEX_OPT_NUMISTEXT) {
|
||||
tok = get_tok(ctx, TOK_STR);
|
||||
tok.val.s = text;
|
||||
return tok;
|
||||
}
|
||||
|
||||
int i = atoi(text);
|
||||
|
||||
if (!positive)
|
||||
i *= -1;
|
||||
|
||||
Token tok = get_tok(ctx, TOK_INT);
|
||||
tok = get_tok(ctx, TOK_INT);
|
||||
tok.val.i = i;
|
||||
|
||||
return tok;
|
||||
|
@ -10,6 +10,11 @@
|
||||
|
||||
typedef struct Lexer Lexer;
|
||||
|
||||
enum LexerOpts {
|
||||
LEX_OPT_NONE = 0,
|
||||
LEX_OPT_NUMISTEXT = 1 << 0,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
unsigned int line, col;
|
||||
enum TokenType {
|
||||
@ -32,6 +37,7 @@ typedef struct {
|
||||
} Token;
|
||||
|
||||
Lexer *lexer_init(FILE *f);
|
||||
void lexer_set_opts(Lexer *ctx, enum LexerOpts flags);
|
||||
void lexer_free(Lexer *ctx);
|
||||
Token lexer_get_token(Lexer *ctx);
|
||||
char *lexer_token_type_str(enum TokenType type);
|
||||
|
Loading…
Reference in New Issue
Block a user