22// SPDX-FileCopyrightText: 2021–2025 grommunio GmbH
33// This file is part of Gromox.
44#include < algorithm>
5+ #include < cassert>
56#include < cerrno>
67#include < cstdio>
78#include < cstdlib>
@@ -1558,6 +1559,9 @@ static ical_time ical_next_rrule_itime(ical_rrule *pirrule,
15581559 case ical_frequency::second:
15591560 itime.add_second (req ? pirrule->interval : 1 );
15601561 break ;
1562+ default :
1563+ assert (false );
1564+ break ;
15611565 }
15621566 return itime;
15631567 }
@@ -1693,6 +1697,9 @@ static ical_time ical_next_rrule_itime(ical_rrule *pirrule,
16931697 case ical_frequency::second:
16941698 itime.add_second (1 );
16951699 break ;
1700+ default :
1701+ assert (false );
1702+ break ;
16961703 }
16971704 switch (pirrule->frequency ) {
16981705 case ical_frequency::year:
@@ -1723,6 +1730,9 @@ static ical_time ical_next_rrule_itime(ical_rrule *pirrule,
17231730 if (itime.second > pirrule->base_itime .second )
17241731 itime = pirrule->next_base_itime ;
17251732 break ;
1733+ default :
1734+ assert (false );
1735+ return {};
17261736 }
17271737 return itime;
17281738}
@@ -1768,9 +1778,25 @@ static void ical_next_rrule_base_itime(ical_rrule *pirrule)
17681778 case ical_frequency::second:
17691779 pirrule->next_base_itime .add_second (pirrule->interval );
17701780 break ;
1781+ default :
1782+ assert (false );
1783+ return ;
17711784 }
17721785}
17731786
1787+ static enum ical_frequency parse_freq (const char *s)
1788+ {
1789+ if (s == nullptr ) return ical_frequency::invalid;
1790+ else if (strcasecmp (s, " SECONDLY" ) == 0 ) return ical_frequency::second;
1791+ else if (strcasecmp (s, " MINUTELY" ) == 0 ) return ical_frequency::minute;
1792+ else if (strcasecmp (s, " HOURLY" ) == 0 ) return ical_frequency::hour;
1793+ else if (strcasecmp (s, " DAILY" ) == 0 ) return ical_frequency::day;
1794+ else if (strcasecmp (s, " WEEKLY" ) == 0 ) return ical_frequency::week;
1795+ else if (strcasecmp (s, " MONTHLY" ) == 0 ) return ical_frequency::month;
1796+ else if (strcasecmp (s, " YEARLY" ) == 0 ) return ical_frequency::year;
1797+ else return ical_frequency::invalid;
1798+ }
1799+
17741800/*
17751801 * @ptz_component: if NULL, represents UTC
17761802 *
@@ -1781,27 +1807,11 @@ const char *ical_parse_rrule(const ical_component *ptz_component,
17811807 ical_rrule *pirrule)
17821808{
17831809 *pirrule = {};
1784- auto pvalue = ical_get_first_subvalue_by_name_internal (pvalue_list, " FREQ" );
1785- if (pvalue == nullptr )
1786- return " E-2824: RRULE has no FREQ" ;
1787- if (strcasecmp (pvalue, " SECONDLY" ) == 0 )
1788- pirrule->frequency = ical_frequency::second;
1789- else if (strcasecmp (pvalue, " MINUTELY" ) == 0 )
1790- pirrule->frequency = ical_frequency::minute;
1791- else if (strcasecmp (pvalue, " HOURLY" ) == 0 )
1792- pirrule->frequency = ical_frequency::hour;
1793- else if (strcasecmp (pvalue, " DAILY" ) == 0 )
1794- pirrule->frequency = ical_frequency::day;
1795- else if (strcasecmp (pvalue, " WEEKLY" ) == 0 )
1796- pirrule->frequency = ical_frequency::week;
1797- else if (strcasecmp (pvalue, " MONTHLY" ) == 0 )
1798- pirrule->frequency = ical_frequency::month;
1799- else if (strcasecmp (pvalue, " YEARLY" ) == 0 )
1800- pirrule->frequency = ical_frequency::year;
1801- else
1802- return " E-2825: RRULE has invalid FREQ" ;
1810+ pirrule->frequency = parse_freq (ical_get_first_subvalue_by_name_internal (pvalue_list, " FREQ" ));
1811+ if (pirrule->frequency == ical_frequency::invalid)
1812+ return " E-2825" ;
18031813 pirrule->real_frequency = pirrule->frequency ;
1804- pvalue = ical_get_first_subvalue_by_name_internal (pvalue_list, " INTERVAL" );
1814+ auto pvalue = ical_get_first_subvalue_by_name_internal (pvalue_list, " INTERVAL" );
18051815 if (NULL == pvalue) {
18061816 pirrule->interval = 1 ;
18071817 } else {
@@ -2039,6 +2049,9 @@ const char *ical_parse_rrule(const ical_component *ptz_component,
20392049 return " E-2865" ;
20402050 }
20412051 break ;
2052+ default :
2053+ assert (false );
2054+ return " E-2824" ;
20422055 }
20432056 for (const auto &pnv2 : *psetpos_list) {
20442057 long tmp_int = LONG_MIN;
@@ -2124,6 +2137,9 @@ const char *ical_parse_rrule(const ical_component *ptz_component,
21242137 if (pbysecond_list != nullptr )
21252138 itime.second = 0 ;
21262139 break ;
2140+ default :
2141+ assert (false );
2142+ return nullptr ;
21272143 }
21282144 pirrule->base_itime = itime;
21292145 ical_next_rrule_base_itime (pirrule);
0 commit comments