da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Bell Laboratories
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * generate 14 char lookup key for lang path in key
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * based on 32-bit checksum on path
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if key==0 then space is malloc'd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if attr != 0 then attribute var assignments placed here:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ATTRIBUTES list of attribute names
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpathkey(char* key, char* attr, const char* lang, const char* tool, const char* apath)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* k;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned long n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * trailing flags in path
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fs3d(FS3D_TEST) && (c = mount(path, tmp, FS3D_GET|FS3D_ALL|FS3D_SIZE(PATH_MAX), NiL)) > 1 && c < PATH_MAX)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin k = s + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (attr && (getpreroot(attr, path) || getpreroot(attr, NiL)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * universe
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * environment
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ${PROBE_ATTRIBUTES} || ${VERSION_ENVIRONMENT} : list of alternate env vars
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ${VERSION_ENVIRONMENT} : list of alternate env vars
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ${VERSION_<lang>}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ${VERSION_<base(path)>}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ${<toupper(base(path))>VER}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ${OBJTYPE}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * cuteness never pays
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 'B';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 'B';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 'B';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 'U';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (islower(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (p = environ; *p; p++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = "VERSION_";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (k = *p; *k && *k == *s; k++, s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*k && !*s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (t = k; *t && *t != '=' && *t++ == *s; s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (k = *p; *k && *s++ == *k; k++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((s - buf) > 2 && k[0] == 'V' && k[1] == 'E' && k[2] == 'R' && k[3] == '=')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (k = *p; *k && *k == *s; k++, s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (k = env[c])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*k && *k++ != '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (k = env[c])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * now the normal stuff
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(key, 15, "%08lX", memsum(path, s - path, n));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (--s < t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *--k = *s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *--k = '.';