Ejemplo n.º 1
0
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);
    }
  }
}