| 550 | } |
| 551 | |
| 552 | static const struct poptOption * |
| 553 | findOption(const struct poptOption * opt, |
| 554 | const char * longName, size_t longNameLen, |
| 555 | char shortName, |
| 556 | poptCallbackType * callback, |
| 557 | const void ** callbackData, |
| 558 | unsigned int argInfo) |
| 559 | { |
| 560 | const struct poptOption * cb = NULL; |
| 561 | poptArg cbarg = { .ptr = NULL }; |
| 562 | |
| 563 | /* This happens when a single - is given */ |
| 564 | if (LF_ISSET(ONEDASH) && !shortName && (longName && *longName == '\0')) |
| 565 | shortName = '-'; |
| 566 | |
| 567 | for (; opt->longName || opt->shortName || opt->arg; opt++) { |
| 568 | poptArg arg = { .ptr = opt->arg }; |
| 569 | |
| 570 | switch (poptArgType(opt)) { |
| 571 | case POPT_ARG_INCLUDE_TABLE: /* Recurse on included sub-tables. */ |
| 572 | { const struct poptOption * opt2; |
| 573 | |
| 574 | poptSubstituteHelpI18N(arg.opt); /* XXX side effects */ |
| 575 | if (arg.ptr == NULL) continue; /* XXX program error */ |
| 576 | opt2 = findOption(arg.opt, longName, longNameLen, shortName, callback, |
| 577 | callbackData, argInfo); |
| 578 | if (opt2 == NULL) continue; |
| 579 | /* Sub-table data will be inheirited if no data yet. */ |
| 580 | if (callback && *callback |
| 581 | && callbackData && *callbackData == NULL) |
| 582 | *callbackData = opt->descrip; |
| 583 | return opt2; |
| 584 | } break; |
| 585 | case POPT_ARG_CALLBACK: |
| 586 | cb = opt; |
| 587 | cbarg.ptr = opt->arg; |
| 588 | continue; |
| 589 | break; |
| 590 | default: |
| 591 | break; |
| 592 | } |
| 593 | |
| 594 | if (longName != NULL && opt->longName != NULL && |
| 595 | (!LF_ISSET(ONEDASH) || F_ISSET(opt, ONEDASH)) && |
| 596 | longOptionStrcmp(opt, longName, longNameLen)) |
| 597 | { |
| 598 | break; |
| 599 | } else if (shortName && shortName == opt->shortName) { |
| 600 | break; |
| 601 | } |
| 602 | } |
| 603 | |
| 604 | if (opt->longName == NULL && !opt->shortName) |
| 605 | return NULL; |
| 606 | |
| 607 | if (callback) |
| 608 | *callback = (cb ? cbarg.cb : NULL); |
| 609 | if (callbackData) |
no test coverage detected