| 296 | } |
| 297 | |
| 298 | static const char *rune_alt_single(const tal_t *ctx, |
| 299 | const struct rune_altern *alt, |
| 300 | const char *fieldval_str, |
| 301 | size_t fieldval_strlen, |
| 302 | const s64 *fieldval_int) |
| 303 | { |
| 304 | char strfield[STR_MAX_CHARS(s64) + 1]; |
| 305 | s64 runeval_int = 0 /* gcc v9.4.0 gets upset with uninitiaized var at -O3 */; |
| 306 | const char *err; |
| 307 | |
| 308 | /* Caller can't set both! */ |
| 309 | if (fieldval_int) { |
| 310 | assert(!fieldval_str); |
| 311 | sprintf(strfield, "%"PRIi64, *fieldval_int); |
| 312 | fieldval_str = strfield; |
| 313 | fieldval_strlen = strlen(strfield); |
| 314 | } |
| 315 | |
| 316 | switch (alt->condition) { |
| 317 | case RUNE_COND_IF_MISSING: |
| 318 | if (!fieldval_str) |
| 319 | return NULL; |
| 320 | return tal_fmt(ctx, "%s is present", alt->fieldname); |
| 321 | case RUNE_COND_EQUAL: |
| 322 | if (!fieldval_str) |
| 323 | return tal_fmt(ctx, "%s not present", alt->fieldname); |
| 324 | return cond_test(ctx, alt, "is not equal to", |
| 325 | memeqstr(fieldval_str, fieldval_strlen, alt->value)); |
| 326 | case RUNE_COND_NOT_EQUAL: |
| 327 | if (!fieldval_str) |
| 328 | return tal_fmt(ctx, "%s not present", alt->fieldname); |
| 329 | return cond_test(ctx, alt, "is equal to", |
| 330 | !memeqstr(fieldval_str, fieldval_strlen, alt->value)); |
| 331 | case RUNE_COND_BEGINS: |
| 332 | if (!fieldval_str) |
| 333 | return tal_fmt(ctx, "%s not present", alt->fieldname); |
| 334 | return cond_test(ctx, alt, "does not start with", |
| 335 | memstarts_str(fieldval_str, fieldval_strlen, alt->value)); |
| 336 | case RUNE_COND_ENDS: |
| 337 | if (!fieldval_str) |
| 338 | return tal_fmt(ctx, "%s not present", alt->fieldname); |
| 339 | return cond_test(ctx, alt, "does not end with", |
| 340 | memends_str(fieldval_str, fieldval_strlen, alt->value)); |
| 341 | case RUNE_COND_CONTAINS: |
| 342 | if (!fieldval_str) |
| 343 | return tal_fmt(ctx, "%s not present", alt->fieldname); |
| 344 | return cond_test(ctx, alt, "does not contain", |
| 345 | memmem(fieldval_str, fieldval_strlen, |
| 346 | alt->value, strlen(alt->value))); |
| 347 | case RUNE_COND_INT_LESS: |
| 348 | err = integer_compare_valid(ctx, fieldval_int, |
| 349 | alt, &runeval_int); |
| 350 | if (err) |
| 351 | return err; |
| 352 | return cond_test(ctx, alt, "is greater or equal to", |
| 353 | *fieldval_int < runeval_int); |
| 354 | case RUNE_COND_INT_GREATER: |
| 355 | err = integer_compare_valid(ctx, fieldval_int, |
no test coverage detected