Esempio n. 1
0
int isl_args_parse(struct isl_args *args, int argc, char **argv, void *opt,
	unsigned flags)
{
	int a = -1;
	int skip = 0;
	int i;
	int n;
	struct isl_prefixes prefixes = { 0 };

	n = n_arg(args->args);

	for (i = 1; i < argc; ++i) {
		if ((strcmp(argv[i], "--version") == 0 ||
		     strcmp(argv[i], "-V") == 0) && any_version(args->args))
			print_version_and_exit(args->args);
	}

	while (argc > 1 + skip) {
		int parsed;
		if (argv[1 + skip][0] != '-') {
			a = next_arg(args->args, a);
			if (a >= 0) {
				char **p;
				p = (char **)(((char *)opt)+args->args[a].offset);
				free(*p);
				*p = strdup(argv[1 + skip]);
				argc = drop_argument(argc, argv, 1 + skip, 1);
				--n;
			} else if (ISL_FL_ISSET(flags, ISL_ARG_ALL)) {
				fprintf(stderr, "%s: extra argument: %s\n",
					    prog_name(argv[0]), argv[1 + skip]);
				exit(-1);
			} else
				++skip;
			continue;
		}
		check_help(args, argv[1 + skip], argv[0], opt, flags);
		parsed = parse_option(args->args, &argv[1 + skip],
					&prefixes, opt);
		if (parsed)
			argc = drop_argument(argc, argv, 1 + skip, parsed);
		else if (ISL_FL_ISSET(flags, ISL_ARG_ALL)) {
			fprintf(stderr, "%s: unrecognized option: %s\n",
					prog_name(argv[0]), argv[1 + skip]);
			exit(-1);
		} else
			++skip;
	}

	if (n > 0) {
		fprintf(stderr, "%s: expecting %d more argument(s)\n",
				prog_name(argv[0]), n);
		exit(-1);
	}

	return argc;
}
Esempio n. 2
0
 subpaving::var process_mul(app * t, unsigned depth, mpz & n, mpz & d) {
     unsigned num_args = t->get_num_args();
     if (num_args <= 1)
         found_non_simplified();
     rational k;
     expr * m;
     if (m_autil.is_numeral(t->get_arg(0), k)) {
         if (num_args != 2)
             found_non_simplified();
         qm().set(n, k.to_mpq().numerator());
         qm().set(d, k.to_mpq().denominator());
         m = t->get_arg(1);
     }
     else {
         qm().set(n, 1);
         qm().set(d, 1);
         m = t;
     }
     expr * const * margs;
     unsigned sz;
     if (m_autil.is_mul(m)) {
         margs = to_app(m)->get_args();
         sz    = to_app(m)->get_num_args();
     }
     else {
         margs = &m;
         sz    = 1;
     }
     scoped_mpz n_arg(qm());
     scoped_mpz d_arg(qm());
     sbuffer<subpaving::power> pws;
     for (unsigned i = 0; i < sz; i++) {
         expr * arg = margs[i];
         unsigned k; 
         as_power(arg, arg, k);
         subpaving::var x_arg = process(arg, depth+1, n_arg, d_arg);
         qm().power(n_arg, k, n_arg);
         qm().power(d_arg, k, d_arg);
         qm().mul(n, n_arg, n);
         qm().mul(d, d_arg, d);
         if (x_arg != subpaving::null_var)
             pws.push_back(subpaving::power(x_arg, k));
     }
     subpaving::var x;
     if (pws.empty())
         x = subpaving::null_var;
     else if (pws.size() == 1 && pws[0].degree() == 1)
         x = pws[0].get_var();
     else
         x = s().mk_monomial(pws.size(), pws.c_ptr());
     cache_result(t, x, n, d);
     return x;
 }
Esempio n. 3
0
 subpaving::var process_add(app * t, unsigned depth, mpz & n, mpz & d) {
     unsigned num_args = t->get_num_args();
     mpz_buffer ns(qm()), ds(qm());
     var_buffer xs;
     scoped_mpq c(qm()), c_arg(qm());
     scoped_mpz n_arg(qm()), d_arg(qm());
     for (unsigned i = 0; i < num_args; i++) {
         expr * arg           = t->get_arg(i);
         subpaving::var x_arg = process(arg, depth+1, n_arg, d_arg);
         if (x_arg == subpaving::null_var) {
             qm().set(c_arg, n_arg, d_arg);
             qm().add(c, c_arg, c);
         }
         else {
             xs.push_back(x_arg);
             ns.push_back(n_arg);
             ds.push_back(d_arg);
         }
     }
     qm().set(d,  c.get().denominator());
     unsigned sz = xs.size();
     for (unsigned i = 0; i < sz; i++) {
         qm().lcm(d, ds[i], d);
     }
     scoped_mpz & k = d_arg;
     qm().div(d, c.get().denominator(), k);
     scoped_mpz sum_c(qm());
     qm().mul(c.get().numerator(), k, sum_c);
     for (unsigned i = 0; i < sz; i++) {
         qm().div(d, ds[i], k);
         qm().mul(ns[i], k, ns[i]);
     }
     subpaving::var x;
     if (sz == 0) {
         qm().set(n, sum_c);
         x = subpaving::null_var;
     }
     else {
         x = s().mk_sum(sum_c, sz, ns.c_ptr(), xs.c_ptr());
         qm().set(n, 1);
     }
     cache_result(t, x, n, d);
     return x;
 }