|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T _
Length: 2200 (0x898)
Types: TextFile
Names: »_str2set.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦2fafebccf⟧ »EurOpenD3/mail/smail3.1.19.tar.Z«
└─⟦bcd2bc73f⟧
└─⟦this⟧ »pd/strlib/_str2set.c«
/* @(#)_str2set.c 1.1 5/6/88 04:41:44 */
/*
* File : _str2set.c
* Author : Richard A. O'Keefe.
* Updated: 20 April 1984
* Defines: _set_ctr, _set_vec[], _str2set().
* Purpose: Convert a character string to a set.
*/
/*
* The obvious way of representing a set of characters is as a
* vector of 0s and 1s. The snag with that is that to convert a
* string to such a vector, we have to clear all the elements to
* 0, and then set the elements corresponding to characters in
* the string to 1, so the cost is O(|alphabet|+|string|). This
* package uses another method, where there is a vector of small
* numbers and a counter. A character is in the current set if
* and only if the corresponding element of the vector is equal
* to the current value of the counter. Every so often the
* vector elements would overflow and we have to clear the
* vector, but the cost is reduced to O(|string|+1).
*
* Note that NUL ('\0') will never be in any set built by str2set.
*
* While this method reduces the cost of building a set, it would
* be useful to avoid it entirely. So when the "set" argument is
* NullS the set is not changed. Use NullS to mean "the same set
* as before." MaxPosChar is the largest integer value which can
* be stored in a "char". Although we might get a slightly wider
* range by using "unsigned char", "char" may be cheaper (as on a
* PDP-11). By all means change the number from 127 if your C is
* one of those that treats char as unsigned, but don't change it
* just because _AlphabetSize is 256, the two are unrelated. And
* don't dare change it on a VAX: it is built into the asm code!
*/
#include "strings.h"
#include "_str2set.h"
#if CharsAreSigned
#define MaxPosChar 127
#else
#define MaxPosChar 255
#endif
int _set_ctr = MaxPosChar;
char _set_vec[_AlphabetSize];
void
_str2set(set)
register char *set;
{
if (set == NullS) return;
if (++_set_ctr == MaxPosChar+1) {
#if VaxAsm
asm("movc5 $0,4(ap),$0,$128,__set_vec");
#else
register char *w = &_set_vec[_AlphabetSize];
do *--w = NUL; while (w != &_set_vec[0]);
#endif
_set_ctr = 1;
}
while (*set) _set_vec[*set++] = _set_ctr;
}