void UsageImp::fetchArguments(UsageLine &ul, int a, int b, int &argc, char *argv[]) { assert(0 <= a && a <= b && b < ul.getCount()); int i; for (i = a; i <= b; i++) { if (ul[i] == &bra || ul[i]->isMultiArgument()) break; if (ul[i]->isArgument()) { Argument *argument = dynamic_cast<Argument *>(ul[i]); assert(argument); argument->fetch(1, argc, argv); argument->select(); } } if (i > b) { } else if (ul[i] == &bra) { int n = 0; int j; for (j = b; j > i && ul[j] != &ket; j--) if (ul[j]->isArgument()) n++; assert(j > i + 1); if (argc - 1 > n) fetchArguments(ul, i + 1, j - 1, argc, argv); if (j + 1 <= b) fetchArguments(ul, j + 1, b, argc, argv); } else if (ul[i]->isMultiArgument()) { MultiArgument *argument = dynamic_cast<MultiArgument *>(ul[i]); assert(argument); int n = 0; for (int j = i + 1; j <= b; j++) if (ul[j]->isArgument()) n++; int oldArgc = argc; argc -= n; argument->fetch(1, argc, argv); argument->select(); argc += n; if (n > 0) { if (argc < oldArgc) for (int j = n; j > 0; j--) argv[argc - j] = argv[oldArgc - j]; fetchArguments(ul, i + 1, b, argc, argv); } } }