V10/cmd/nupas/ns/translate.c

Compare this file to the similar file:
Show the results in this format:

#include <ctype.h>
#include <stdio.h>
#include "mail.h"
#include "string.h"
#include "aux.h"

/* imports */
extern char **getflds();
extern char *getenv();

/* predeclared */
string *getdbfiles();
int translate();
int lookup();
int compare();

/* loop through the names to be translated */
main(ac, av)
	int ac;
	char *av[];
{
	string *alias;		/* the alias for the name */
	char *thissys;		/* name of this system */
	string *files;		/* list of files to search */
	int i;

	/* get environmental info */
	thissys = sysname_read();
	files = getdbfiles();
	alias = s_new();

	/* loop through the names to be translated (from standard input) */
	for(i=1; i<ac; i++) {
		(void)translate(av[i], thissys, files, alias);
		if (*s_to_c(alias) == '\0')
			printf("local!%s\n", av[i]);
		else
			printf("%s\n", s_to_c(alias));
		fflush(stdout);
	}
	return 0;
}

/* get the list of dbfiles to search */
string *
getdbfiles()
{
	FILE *fp;
	string *files = s_new();

	/* system wide aliases */
	if (chdir(UPASROOT) < 0) {
		perror("translate(chdir):");
		return files;
	}
	if ((fp = fopen(SYSALIAS, "r")) != NULL) {
		while (s_gettoken(fp, files) != NULL)
			s_append(files, " ");
		fclose(fp);
	}

	return files;
}

/* loop through the translation files */
int
translate(name, thissys, files, alias)
	char *name;		/* name to translate */
	char *thissys;		/* name of this system */
	string *files;
	string *alias;		/* where to put the alias */
{
	string *file = s_new();
	string *fullname;
	char *home;

	/*
	printf("translate(%s, %s, %s, %s)\n", name, thissys,
		s_to_c(files), s_to_c(alias));
	*/
	/* create the full name to avoid loops (system!name) */
	fullname = s_copy(thissys);
	s_append(fullname, "!");
	s_append(fullname, name);

	/* look at user's local names */
	home = getenv("HOME");
	if (home != NULL) {
		s_append(file, home);
		s_append(file, USERALIAS);
		if (lookup(name, fullname, file, alias, thissys)==0) {
			s_free(fullname);
			s_free(file);
			return 0;
		}
	}

	/* look at system-wide names */
	s_restart(files);
	while (s_parse(files, s_restart(file)) != NULL) {
		if (lookup(name, fullname, file, alias, thissys)==0) {
			s_free(fullname);
			s_free(file);
			return 0;
		}
	}

	/* first look for mailbox */
	s_restart(file);
	abspath(name, MAILROOT, file);
	if (access(s_to_c(file), 0) == 0) {
		s_append(alias, "local");
		s_append(alias, "!");
		s_append(alias, name);
		s_free(file);
		return 0;
	}

	return -1;
}

/*  Loop through the entries in a translation file looking for a match.
 *  Return 0 if found, -1 otherwise.
 */
int
lookup(name, fullname, file, alias, thissys)
	char *name;
	string *fullname;
	string *file;
	string *alias;	/* returned string */
	char *thissys;
{
	FILE *fp;
	string *line = s_new();
	string *token = s_new();
	int rv = -1;
	char *cp;

/*
	printf("lookup(%s, %s, %s, %s)\n", name, s_to_c(fullname),
		s_to_c(file), s_to_c(alias));
*/
	s_reset(alias);
	if ((fp = fopen(s_to_c(file), "r")) == NULL)
		return -1;

	/* look for a match */
	while (s_getline(fp, s_restart(line))!=NULL) {
		if (s_parse(s_restart(line), s_restart(token))==NULL)
			continue;
		if (compare(token, name)!=0)
			continue;
		/* match found, get the alias */
		while(s_parse(line, s_restart(token))!=NULL) {
			/* avoid definition loops */
			if (compare(token, name)==0 ||
			    compare(token, s_to_c(fullname))==0){
				s_append(alias, "local");
				s_append(alias, "!");
				if(cp = strrchr(s_to_c(token), '!'))
					cp++;
				else
					cp = s_to_c(token);
				s_append(alias, cp);
			} else {
				s_append(alias, s_to_c(token));
			}
			s_append(alias, " ");
		}
		rv = 0;
		break;
	}
	s_free(line);
	s_free(token);
	return rv;
}

/* compare two strings (case insensitive) */
#define lower(c) (isupper(c)?c-('A'-'a'):c)
int
compare(s1, p2)
	string *s1;
	register char *p2;
{
	register char *p1 = s_to_c(s1);
	register int rv;

	while(1) {
		rv = lower(*p1) - lower(*p2);
		if (rv)
			return rv;
		if (*p1 == '\0')
			return 0;
		p1++;
		p2++;
	}
}