- mp *m, *n;
- const char *p = buf;
- int i;
-
- static const char *fnames[] = {
- "prime", "binpoly", 0
- };
- static const char *ecnames[] = {
- "prime", "primeproj", "bin", "binproj", 0
- };
-
- switch (i = ckstring(&p, fnames), ckchar(&p, ':'), i) {
- case 0: m = getmp(&p); f = field_prime(m); mp_drop(m); break;
- case 1: m = getmp(&p); f = field_binpoly(m); mp_drop(m); break;
- default: abort();
- }
- ckchar(&p, '/');
-
- switch (i = ckstring(&p, ecnames), ckchar(&p, ':'), i) {
- case 0: m = getmp(&p); ckchar(&p, ','); n = getmp(&p);
- v = ec_prime(f, m, n); mp_drop(m); mp_drop(n); break;
- case 1: m = getmp(&p); ckchar(&p, ','); n = getmp(&p);
- v = ec_primeproj(f, m, n); mp_drop(m); mp_drop(n); break;
- case 2: m = getmp(&p); ckchar(&p, ','); n = getmp(&p);
- v = ec_bin(f, m, n); mp_drop(m); mp_drop(n); break;
- case 3: m = getmp(&p); ckchar(&p, ','); n = getmp(&p);
- v = ec_binproj(f, m, n); mp_drop(m); mp_drop(n); break;
- default: abort();
+ qd_parse qd;
+
+ qd.p = buf;
+ qd.e = 0;
+ if ((v = ec_curveparse(&qd)) == 0) {
+ fprintf(stderr, "bad curve `%.*s|%s': %s\n",
+ qd.p - buf, buf, qd.p, qd.e);
+ exit(1);