File:  [Research Unix] / researchv10dc / cmd / post / main.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:33 2018 UTC (8 years, 3 months ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Dan Cross

#include <stdio.h>
#include <string.h>

#define USAGE	"usage: pq [-l] [-a attr] [-m mods] [-o fmt] [queries...]\n"

typedef char	*strings[512];
typedef char	buffer[BUFSIZ];

extern char	emp_def[], emp_fmt[], loc_def[], loc_fmt[];
extern char	*pq_open();

main(argc, argv)
int	argc;
char	*argv[];
{
	extern char	*optarg;
	extern int	optind;
	char	*attr = emp_def, *mods = "", *ofmt = emp_fmt;
	strings	vars, vals, defs;
	buffer	prog, out;
	int	rv = 0;
	int	c, v, r;
	char	*pq;

	while ((c = getopt(argc, argv, "a:m:o:l")) != EOF)
		switch (c) {
		case 'a':
			attr = optarg;
			break;
		case 'm':
			mods = optarg;
			break;
		case 'o':
			ofmt = optarg;
			break;
		case 'l':
			attr = loc_def;
	 		ofmt = loc_fmt;
			break;
		default:
			fputs(USAGE, stderr);
			return 1;
		}

	strvec(mods, vals, " \t\n");
	if ((pq = pq_open(vals)) == 0)
		return pqerr();

	fmtcomp(prog, ofmt, vars);
	for (v = 0; vars[v]; v++);
	strvec(attr, defs, "/:");

	if (optind == argc)
		argv[argc++] = "";
	while (optind < argc) {
		strvec(argv[optind++], vars + v, "/:");
		if (!dodef(vars + v, defs))
			continue;
		c = 0;
		if ((r = pq_write(pq, vars)) != -1)
			while ((r = pq_read(pq, vals)) > 0) {
				fmtexec(out, prog, vals);
				fputs(out, stdout);
				fflush(stdout);
				c++;
			}
		if (r == -1)
			rv += pqerr();
		if (c == 0)
			rv++;
	}
	if (pq_close(pq) == -1)
		rv += pqerr();
	return rv;
}

dodef(vars, defs)
strings	vars, defs;
{
	static buffer	buf;
	register char	*bp = buf;
	int	i, m, n;

	for (m = 0; defs[m]; m++);
	for (i = 0; vars[i]; i++)
		if (!strchr(vars[i], '='))
			if (i < m) {
				n = sprintf(bp, "%s=%s", defs[i], vars[i]);
				vars[i] = bp;
				bp += n + 1;
			} else {
				fprintf(stderr, "pq: %s: No attribute\n",
							vars[i]);
				return 0;
			}
	return 1;
}

pqerr()
{
	extern char pq_error[];
	fprintf(stderr, "pq: %s\n", pq_error);
	return 1;
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.