src/utils.c: Introduce parse_{time,duration}()
These helpers can be used in a fashion similar to parse_date(). In addition to check_time(), parse_time() and parse_duration() support short forms such as "23:" (instead of "23:00") and ":45" (instead of "00:45"). Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
parent
d874f7ff97
commit
0acbc06c43
@ -904,6 +904,8 @@ const char *get_tempdir (void);
|
|||||||
char *new_tempfile (const char *, int);
|
char *new_tempfile (const char *, int);
|
||||||
int parse_date (const char *, enum datefmt, int *, int *, int *,
|
int parse_date (const char *, enum datefmt, int *, int *, int *,
|
||||||
struct date *);
|
struct date *);
|
||||||
|
int parse_time (const char *, unsigned *, unsigned *);
|
||||||
|
int parse_duration (const char *, unsigned *);
|
||||||
void str_toupper (char *);
|
void str_toupper (char *);
|
||||||
void file_close (FILE *, const char *);
|
void file_close (FILE *, const char *);
|
||||||
void psleep (unsigned);
|
void psleep (unsigned);
|
||||||
|
85
src/utils.c
85
src/utils.c
@ -689,6 +689,91 @@ parse_date (const char *date_string, enum datefmt datefmt, int *year,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Converts a time string into hours and minutes. Short forms like "23:"
|
||||||
|
* (23:00) or ":45" (0:45) are allowed.
|
||||||
|
*
|
||||||
|
* Returns 1 on success and 0 on failure.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
parse_time (const char *string, unsigned *hour, unsigned *minute)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
unsigned in[2] = {0, 0}, n = 0;
|
||||||
|
|
||||||
|
if (!string)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* parse string into in[], read up to two integers */
|
||||||
|
for (p = string; *p; p++)
|
||||||
|
{
|
||||||
|
if (*p == ':')
|
||||||
|
{
|
||||||
|
if ((++n) > 1)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if ((*p >= '0') && (*p <= '9'))
|
||||||
|
in[n] = in[n] * 10 + (int)(*p - '0');
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n != 1 || in[0] >= DAYINHOURS || in[1] >= HOURINMIN)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
*hour = in[0];
|
||||||
|
*minute = in[1];
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Converts a duration string into minutes. Both "hh:mm" (e.g. "23:42") and
|
||||||
|
* "mmm" (e.g. "100") formats are accepted. Short forms like "23:" (23:00) or
|
||||||
|
* ":45" (0:45) are allowed as well.
|
||||||
|
*
|
||||||
|
* Returns 1 on success and 0 on failure.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
parse_duration (const char *string, unsigned *duration)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
unsigned in[2] = {0, 0}, n = 0;
|
||||||
|
|
||||||
|
if (!string || *string == '\0')
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* parse string into in[], read up to two integers */
|
||||||
|
for (p = string; *p; p++)
|
||||||
|
{
|
||||||
|
if (*p == ':')
|
||||||
|
{
|
||||||
|
if ((++n) > 1)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if ((*p >= '0') && (*p <= '9'))
|
||||||
|
in[n] = in[n] * 10 + (int)(*p - '0');
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
{
|
||||||
|
if (in[0] > 999)
|
||||||
|
return 0;
|
||||||
|
*duration = in[0];
|
||||||
|
}
|
||||||
|
else if (n == 1)
|
||||||
|
{
|
||||||
|
if (in[0] > DAYINHOURS || in[1] >= HOURINMIN)
|
||||||
|
return 0;
|
||||||
|
*duration = in[0] * HOURINMIN + in[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
str_toupper (char *s)
|
str_toupper (char *s)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user