|
root / base / usr / src / cmd / mailx / translate.c
translate.c C 108 lines 2.7 KB
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
/*	  All Rights Reserved  	*/


/*
 * University Copyright- Copyright (c) 1982, 1986, 1988
 * The Regents of the University of California
 * All Rights Reserved
 *
 * University Acknowledgment- Portions of this document are derived from
 * software developed by the University of California, Berkeley, and its
 * contributors.
 */

#include "rcv.h"

struct name *
translate(struct name *np)
{
	struct name	*n, *t, *x;
	void	(*sigint)(int), (*sigquit)(int);
	char	*xl = value("translate");
	char	line[LINESIZE];
	char	postmark[256];
	char	*cmd;
	FILE	*pp;
	int	i;

	if (!xl)
		return np;
	askme = 0;
	postmark[0] = 0;
	i = strlen(xl) + 1;
	for (n = np; n; n = n->n_flink)
		if (! (n->n_type & GDEL))
			i += strlen(n->n_name) + 3;
	cmd = (char *)salloc((unsigned)i);
	strcpy(cmd, xl);
	for (n = np; n; n = n->n_flink)
		if (! (n->n_type & GDEL)) {
			strcat(cmd, " \"");
			strcat(cmd, n->n_name);
			strcat(cmd, "\"");
		}
	if ((pp = npopen(cmd, "r")) == NULL) {
		perror(xl);
		senderr++;
		return np;
	}
	sigint = sigset(SIGINT, SIG_IGN);
	sigquit = sigset(SIGQUIT, SIG_IGN);
	fgets(postmark, sizeof postmark, pp);
	if (postmark[0])
		{
		postmark[strlen(postmark)-1] = 0;
		assign("postmark", postmark);
		}
	for (n = np; n; n = n->n_flink) {
		if (n->n_type & GDEL)
			continue;
		if (fgets(line, sizeof line, pp) == NULL)
			break;
		line[strlen(line)-1] = 0;
		if (!strcmp(line, n->n_name))
			continue;
		x = extract(line, n->n_type);
		n->n_type |= GDEL;
		n->n_name = "";
		if (x && !x->n_flink && strpbrk(n->n_full, "(<"))
			x->n_full = splice(x->n_name, n->n_full);
		if (x) {
			t = tailof(x);
			cat(t, n->n_flink);
			n->n_flink = NULL;
			cat(n, x);
			n = t;
		}
	}
	if (getc(pp) == 'y')
		askme++;
	if (npclose(pp) != 0 || n)
		senderr++;
	sigset(SIGINT, sigint);
	sigset(SIGQUIT, sigquit);
	return np;
}