|
|
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.