DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T m

⟦bcfa0877e⟧ TextFile

    Length: 3643 (0xe3b)
    Types: TextFile
    Names: »misc.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/sp/misc.c« 

TextFile

/* misc.c */

/* vi: set tabstop=4 : */

#include <ctype.h>
#include <stdio.h>

#include "sp.h"

/*
 * Special character map that determines what the second character of a word
 * can be; see sp.h
 * May be expanded to contain up to 12 entries plus the terminating entry
 * Must end with an entry of two null bytes
 */
struct spchar_map spchar_map[] = {
	'\'',	QUOTE_CHAR,
	'&',	AMPER_CHAR,
	'.',	PERIOD_CHAR,
	' ',	SPACE_CHAR,
	'\0',	'\0'
};

mk_key(key, soundex, count)
key_t *key;
int soundex;
int count;
{

	key[0] = soundex & 0377;
	key[1] = ((soundex & 037400) >> 8) | ((count & 03) << 6);
	key[2] = (count & 01774) >> 2;
#ifdef DEBUG
	if (ex_soundex(key) != soundex)
		fprintf(stderr, "mk_key: soundex failed\n");
	if (ex_count(key) != count)
		fprintf(stderr, "mk_key: count failed\n");
#endif DEBUG
}

ex_soundex(key)
key_t *key;
{
	register int soundex;

	soundex = key[0] & 0377;
	soundex |= (key[1] & 077) << 8;
	return(soundex);
}

ex_count(key)
key_t *key;
{
	register int count;

	count = (key[1] & 0300) >> 6;
	count |= ((key[2] & 0377) << 2);
	return(count);
}

/*
ex_char(key)
key_t *key;
{
	int ch;

	ch = (key[1] & 076) >> 1;
	return(ch + 'a');
}
*/

/*
 * Unpack a word given the retrieved word of length len and its soundex
 * Extract the first letter from the soundex code
 * If the length is 1 and if it is marked as a single character word
 * then the marked character will be overlaid with a null
 * otherwise a null will be appended to the string
 * Adjust for upper case leading character if necessary
 * Return address of the copy
 */
char *
mk_word(p, len, s)
char *p;
int len, s;
{
	register char *q, ch;
	static char word[MAXWORDLEN + 2];

	q = word;
	if (len == 1 && (*p & SINGLE_CHAR)) {
		*(q + 1) = '\0';
		len = 0;
	}
	else
		*(q + len + 1) = '\0';

	/*
	 * Extract the first character from the soundex and
	 * adjust case
	 */
	if (*p & UPPER_CHAR)
		ch = (s & 037) + 'A';
	else
		ch = (s & 037) + 'a';
	*q++ = ch;

	if (len != 0) {				/* if more than one char adjust second char */
		ch = *p & MASK_CHAR;
		if (ch < 26)
			ch += 'a';
		else if (ch < 52)
			ch = ch - 26 + 'A';
		else if ((ch = fromspchar(ch)) == '\0') {
			fprintf(stderr, "Bogus second char in mk_word\n");
			exit(1);
		}
		*q++ = ch;
		p++;
		len--;
	}

	while (len-- > 0)
		*q++ = *p++;
	return(word);
}

/*
 * Convert the second character of a word to a special character code
 * Return null if there is no mapping
 */
tospchar(ch)
char ch;
{
	register struct spchar_map *m;

	for (m = spchar_map; m->spchar != '\0'; m++)
		if (ch == m->spchar)
			break;
	return(m->code);
}

/*
 * Convert from the special character code to the ASCII code
 * Return null if there is no mapping
 */
fromspchar(ch)
char ch;
{
	register struct spchar_map *m;

	for (m = spchar_map; m->spchar != '\0'; m++)
		if (ch == m->code)
			break;
	return(m->spchar);
}

/*
 * Compare two strings, independent of case, given their lengths
 */
/*
strnmatch(str1, len1, str2, len2)
char *str1, *str2;
int len1, len2;
{
	register char ch1, ch2;

	if (len1 != len2)
		return(0);
	while (len1-- > 0) {
		ch1 = *str1++;
		ch2 = *str2++;
		if (ch1 != ch2) {
			if (isupper(ch1))
				ch1 = tolower(ch1);
			if (isupper(ch2))
				ch2 = tolower(ch2);
			if (ch1 != ch2)
				return(0);
		}
	}
	return(1);
}
*/

/*
 * Compare two strings, independent of case
 */
strmatch(p, q)
char *p, *q;
{
	register char ch1, ch2;

	while (1) {
		ch1 = *p++;
		ch2 = *q++;
		if (ch1 == '\0' || ch2 == '\0')
			break;
		if (ch1 != ch2) {
			if (isupper(ch1))
				ch1 = tolower(ch1);
			if (isupper(ch2))
				ch2 = tolower(ch2);
			if (ch1 != ch2)
				break;
		}
	}
	return(ch1 - ch2);
}