@@ -240,14 +240,42 @@ ban_add_spec(struct ban_proto *bp, const struct pvar *pv, int op, const char *a3
240240 return (ban_parse_regexp (bp , a3 ));
241241}
242242
243+ static const char *
244+ ban_add_double (struct ban_proto * bp , const struct pvar * pv , int op , double darg )
245+ {
246+ uint64_t dtmp ;
247+ uint8_t denc [sizeof darg ];
248+
249+ assert (BANS_HAS_ARG2_DOUBLE (pv -> tag ));
250+ assert (sizeof darg == sizeof dtmp );
251+ assert (sizeof dtmp == sizeof denc );
252+ memcpy (& dtmp , & darg , sizeof dtmp );
253+ vbe64enc (denc , dtmp );
254+
255+ ban_add_lump (bp , denc , sizeof denc );
256+ VSB_putc (bp -> vsb , op );
257+ return (NULL );
258+ }
259+
260+ static const char *
261+ ban_add_duration (struct ban_proto * bp , const struct pvar * pv , int op , const char * a3 )
262+ {
263+ double darg ;
264+
265+ assert (pv -> flag & BANS_FLAG_DURATION );
266+ darg = VNUM_duration (a3 );
267+ if (isnan (darg )) {
268+ return (ban_error (bp ,
269+ "expected duration <n.nn>[ms|s|m|h|d|w|y] got \"%s\"" , a3 ));
270+ }
271+ return (ban_add_double (bp , pv , op , darg ));
272+ }
273+
243274const char *
244275BAN_AddTest (struct ban_proto * bp ,
245276 const char * a1 , const char * a2 , const char * a3 )
246277{
247278 const struct pvar * pv ;
248- double darg ;
249- uint64_t dtmp ;
250- uint8_t denc [sizeof darg ];
251279 int op ;
252280
253281 CHECK_OBJ_NOTNULL (bp , BAN_PROTO_MAGIC );
@@ -290,23 +318,8 @@ BAN_AddTest(struct ban_proto *bp,
290318
291319 if ((pv -> flag & BANS_FLAG_DURATION ) == 0 )
292320 return (ban_add_spec (bp , pv , op , a3 ));
293-
294- assert (pv -> flag & BANS_FLAG_DURATION );
295- assert (BANS_HAS_ARG2_DOUBLE (pv -> tag ));
296- darg = VNUM_duration (a3 );
297- if (isnan (darg )) {
298- return (ban_error (bp ,
299- "expected duration <n.nn>[ms|s|m|h|d|w|y] got \"%s\"" , a3 ));
300- }
301-
302- assert (sizeof darg == sizeof dtmp );
303- assert (sizeof dtmp == sizeof denc );
304- memcpy (& dtmp , & darg , sizeof dtmp );
305- vbe64enc (denc , dtmp );
306-
307- ban_add_lump (bp , denc , sizeof denc );
308- VSB_putc (bp -> vsb , op );
309- return (NULL );
321+ else
322+ return (ban_add_duration (bp , pv , op , a3 ));
310323}
311324
312325/*--------------------------------------------------------------------
0 commit comments