1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-01 07:16:37 +02:00

core: move parsing of /wait delay in a separate function, with unit tests

This commit is contained in:
Sébastien Helleu
2019-03-29 20:17:26 +01:00
parent b3cf270d1d
commit fa5b1eed77
4 changed files with 128 additions and 43 deletions
+2 -42
View File
@@ -6545,8 +6545,7 @@ COMMAND_CALLBACK(version)
COMMAND_CALLBACK(wait)
{
char *pos, *str_number, *error;
long number, factor, delay;
long delay;
/* make C compiler happy */
(void) pointer;
@@ -6554,46 +6553,7 @@ COMMAND_CALLBACK(wait)
COMMAND_MIN_ARGS(3, "");
pos = argv[1];
while (pos[0] && isdigit ((unsigned char)pos[0]))
{
pos++;
}
/* default is seconds (1000 milliseconds) */
factor = 1000;
if ((pos != argv[1]) && pos[0])
{
str_number = string_strndup (argv[1], pos - argv[1]);
if (strcmp (pos, "ms") == 0)
factor = 1;
else if (strcmp (pos, "s") == 0)
factor = 1000;
else if (strcmp (pos, "m") == 0)
factor = 1000 * 60;
else if (strcmp (pos, "h") == 0)
factor = 1000 * 60 * 60;
else
COMMAND_ERROR;
}
else
str_number = strdup (argv[1]);
if (!str_number)
COMMAND_ERROR;
error = NULL;
number = strtol (str_number, &error, 10);
if (!error || error[0])
{
free (str_number);
COMMAND_ERROR;
}
free (str_number);
delay = number * factor;
delay = util_parse_delay (argv[1], 1000);
if (delay < 1)
COMMAND_ERROR;
+73 -1
View File
@@ -338,6 +338,78 @@ util_get_time_string (const time_t *date)
return text_time;
}
/*
* Parses a string with a delay and optional unit, returns the delay in
* milliseconds.
*
* The delay is a number followed by a unit which can be:
* - "ms": milliseconds
* - "s": seconds
* - "m": minutes
* - "h": hours
*
* The default factor sets the default unit:
* - 1: milliseconds
* - 1000: seconds
* - 60000: minutes
* - 3600000: hours
*
* Returns the delay in milliseconds, -1 if error.
*/
long
util_parse_delay (const char *string_delay, long default_factor)
{
const char *pos;
char *str_number, *error;
long factor, delay;
if (!string_delay || !string_delay[0] || (default_factor < 1))
return -1;
factor = default_factor;
pos = string_delay;
while (pos[0] && isdigit ((unsigned char)pos[0]))
{
pos++;
}
if ((pos > string_delay) && pos[0])
{
str_number = string_strndup (string_delay, pos - string_delay);
if (strcmp (pos, "ms") == 0)
factor = 1;
else if (strcmp (pos, "s") == 0)
factor = 1000;
else if (strcmp (pos, "m") == 0)
factor = 1000 * 60;
else if (strcmp (pos, "h") == 0)
factor = 1000 * 60 * 60;
else
return -1;
}
else
{
str_number = strdup (string_delay);
}
if (!str_number)
return -1;
error = NULL;
delay = strtol (str_number, &error, 10);
if (!error || error[0] || (delay < 0))
{
free (str_number);
return -1;
}
free (str_number);
return delay * factor;
}
/*
* Gets a signal number with a name; only some commonly used signal names are
* supported here (see declaration of util_signals[]).
@@ -909,7 +981,7 @@ util_version_number (const char *version)
}
/*
* Return uptime as number of days, hours, minutes, seconds.
* Returns uptime as number of days, hours, minutes, seconds.
*/
void
+4
View File
@@ -47,6 +47,10 @@ extern void util_timeval_add (struct timeval *tv, long long interval);
/* time */
extern const char *util_get_time_string (const time_t *date);
/* delay */
extern long util_parse_delay (const char *string_delay, long default_factor);
/* signal */
extern int util_signal_search (const char *name);
extern void util_catch_signal (int signum, void (*handler)(int));
+49
View File
@@ -93,6 +93,55 @@ TEST(CoreUtil, GetTimeString)
STRCMP_EQUAL("Sat, 01 Jan 2000 00:00:00", str_date);
}
/*
* Tests functions:
* util_parse_delay
*/
TEST(CoreUtil, ParseDelay)
{
/* error: no string */
LONGS_EQUAL(-1, util_parse_delay (NULL, -1));
LONGS_EQUAL(-1, util_parse_delay (NULL, 0));
LONGS_EQUAL(-1, util_parse_delay (NULL, 1));
LONGS_EQUAL(-1, util_parse_delay ("", -1));
LONGS_EQUAL(-1, util_parse_delay ("", 0));
LONGS_EQUAL(-1, util_parse_delay ("", 1));
/* error: bad default_factor */
LONGS_EQUAL(-1, util_parse_delay ("abcd", -1));
LONGS_EQUAL(-1, util_parse_delay ("abcd", 0));
LONGS_EQUAL(-1, util_parse_delay ("123", -1));
LONGS_EQUAL(-1, util_parse_delay ("123", 0));
/* error: bad unit */
LONGS_EQUAL(-1, util_parse_delay ("123a", 1));
LONGS_EQUAL(-1, util_parse_delay ("123ss", 1));
LONGS_EQUAL(-1, util_parse_delay ("123mss", 1));
/* error: bad number */
LONGS_EQUAL(-1, util_parse_delay ("abcd", 1));
/* tests with delay == 0 */
LONGS_EQUAL(0, util_parse_delay ("0", 1));
LONGS_EQUAL(0, util_parse_delay ("0s", 1));
LONGS_EQUAL(0, util_parse_delay ("0m", 1));
LONGS_EQUAL(0, util_parse_delay ("0h", 1));
/* tests with delay == 123, default_factor = 1 */
LONGS_EQUAL(123, util_parse_delay ("123", 1));
LONGS_EQUAL(123, util_parse_delay ("123", 1));
LONGS_EQUAL(123 * 1000, util_parse_delay ("123s", 1));
LONGS_EQUAL(123 * 1000 * 60, util_parse_delay ("123m", 1));
LONGS_EQUAL(123 * 1000 * 60 * 60, util_parse_delay ("123h", 1));
/* tests with delay == 123, default_factor = 1000 */
LONGS_EQUAL(123 * 1000, util_parse_delay ("123", 1000));
LONGS_EQUAL(123 * 1000, util_parse_delay ("123s", 1000));
LONGS_EQUAL(123 * 1000 * 60, util_parse_delay ("123m", 1000));
LONGS_EQUAL(123 * 1000 * 60 * 60, util_parse_delay ("123h", 1000));
}
/*
* Tests functions:
* util_signal_search