diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h index 468f1de0b1f425a80c35adaa113893a1092aa75e..f5a3209085b35d737e6533afefe815e883b2b4bd 100644 --- a/inc/lektor/macro.h +++ b/inc/lektor/macro.h @@ -64,3 +64,11 @@ #define GOTO_UNLESS(cond, msg, label) GOTO_IF(!(cond), msg, ret) #define RETURN_UNLESS(cond, msg, ret) RETURN_IF(!(cond), msg, ret) #define NOTHING /* Usefull to return nothing. */ + +#define STRTOL(ret, str, endptr, err_flag) \ +{ \ + err_flag = 0; \ + errno = 0; \ + ret = str == NULL ? 0 : strtol(str, &(endptr), 0); \ + err_flag = errno != 0 || endptr == str; \ +} diff --git a/src/mkv/write.c b/src/mkv/write.c index 08d2764f35d3cdb983140dbdda555f93d90a343b..4ebd6b9cc5f84903e83db2c6acb2fab6c366a534 100644 --- a/src/mkv/write.c +++ b/src/mkv/write.c @@ -147,6 +147,7 @@ metadata_from_path(char *const mkvfile, struct kara_metadata *meta) regmatch_t pmatch[nmatch]; int reti, sta = false; char msgbuf[LEKTOR_TAG_MAX]; + char *endptr; static const char *rgx = "^/(.+)/(vo|va|amv|cdg|autres|vocaloid)/" @@ -178,10 +179,8 @@ metadata_from_path(char *const mkvfile, struct kara_metadata *meta) goto error; } - if (msgbuf[0] != '\0') { - meta->song_number = atoi(msgbuf); /* TODO: Use strtol */ - meta->song_number = MAX(1, meta->song_number); - } else + STRTOL(meta->song_number, msgbuf, endptr, reti); + if (reti || meta->song_number <= 0) meta->song_number = 1; sta = true;