|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <string.h> ! 3: ! 4: #define USAGE "usage: pq [-l] [-a attr] [-m mods] [-o fmt] [queries...]\n" ! 5: ! 6: typedef char *strings[512]; ! 7: typedef char buffer[BUFSIZ]; ! 8: ! 9: extern char emp_def[], emp_fmt[], loc_def[], loc_fmt[]; ! 10: extern char *pq_open(); ! 11: ! 12: main(argc, argv) ! 13: int argc; ! 14: char *argv[]; ! 15: { ! 16: extern char *optarg; ! 17: extern int optind; ! 18: char *attr = emp_def, *mods = "", *ofmt = emp_fmt; ! 19: strings vars, vals, defs; ! 20: buffer prog, out; ! 21: int rv = 0; ! 22: int c, v, r; ! 23: char *pq; ! 24: ! 25: while ((c = getopt(argc, argv, "a:m:o:l")) != EOF) ! 26: switch (c) { ! 27: case 'a': ! 28: attr = optarg; ! 29: break; ! 30: case 'm': ! 31: mods = optarg; ! 32: break; ! 33: case 'o': ! 34: ofmt = optarg; ! 35: break; ! 36: case 'l': ! 37: attr = loc_def; ! 38: ofmt = loc_fmt; ! 39: break; ! 40: default: ! 41: fputs(USAGE, stderr); ! 42: return 1; ! 43: } ! 44: ! 45: strvec(mods, vals, " \t\n"); ! 46: if ((pq = pq_open(vals)) == 0) ! 47: return pqerr(); ! 48: ! 49: fmtcomp(prog, ofmt, vars); ! 50: for (v = 0; vars[v]; v++); ! 51: strvec(attr, defs, "/:"); ! 52: ! 53: if (optind == argc) ! 54: argv[argc++] = ""; ! 55: while (optind < argc) { ! 56: strvec(argv[optind++], vars + v, "/:"); ! 57: if (!dodef(vars + v, defs)) ! 58: continue; ! 59: c = 0; ! 60: if ((r = pq_write(pq, vars)) != -1) ! 61: while ((r = pq_read(pq, vals)) > 0) { ! 62: fmtexec(out, prog, vals); ! 63: fputs(out, stdout); ! 64: fflush(stdout); ! 65: c++; ! 66: } ! 67: if (r == -1) ! 68: rv += pqerr(); ! 69: if (c == 0) ! 70: rv++; ! 71: } ! 72: if (pq_close(pq) == -1) ! 73: rv += pqerr(); ! 74: return rv; ! 75: } ! 76: ! 77: dodef(vars, defs) ! 78: strings vars, defs; ! 79: { ! 80: static buffer buf; ! 81: register char *bp = buf; ! 82: int i, m, n; ! 83: ! 84: for (m = 0; defs[m]; m++); ! 85: for (i = 0; vars[i]; i++) ! 86: if (!strchr(vars[i], '=')) ! 87: if (i < m) { ! 88: n = sprintf(bp, "%s=%s", defs[i], vars[i]); ! 89: vars[i] = bp; ! 90: bp += n + 1; ! 91: } else { ! 92: fprintf(stderr, "pq: %s: No attribute\n", ! 93: vars[i]); ! 94: return 0; ! 95: } ! 96: return 1; ! 97: } ! 98: ! 99: pqerr() ! 100: { ! 101: extern char pq_error[]; ! 102: fprintf(stderr, "pq: %s\n", pq_error); ! 103: return 1; ! 104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.