ftp.nice.ch/pub/next/developer/languages/smalltalk/smalltalk.1.2.alpha5.s.tar.gz#/smalltalk-1.2.alpha5/objc/objclib/MiscTBMK.h

This is MiscTBMK.h in view mode; [Download] [Up]

/*  A variation on Hume & Sunday's Tuned Boyer-Moore algorithm
 *  for searching for a literal string pattern in a text.
 *
 *  References:
 *    Hume, A., D.M. Sunday. "Fast String Searching."
 *        _Software--Practice and Experience_. Vol. 21.
 *        No. 11. p. 1221-48. November 1991.
 *
 *  Copyright (c) 1994 Christopher J. Kane.
 *
 *  Version 1.2 (March 22, 1994)
 */

#ifndef _MISC_TBMK_H
#define _MISC_TBMK_H

/* The type Misc_TBMKpattern is a pointer to a structure used to hold
 * a compiled pattern. Create a compiled pattern by using the function
 * Misc_TBMKpattern_alloc(), destroy it with Misc_TBMKpattern_free().
 * The members of the structure should never be accessed directly. */

typedef struct Misc_tbmk_pattern * Misc_TBMKpattern;


/* Creates and compiles a pattern structure from the parameters, and
 * returns a pointer to it. The search is for a fixed-length sequence of
 * characters; the pattern can contain embedded \0 characters. To change
 * the case sensitivity of a search or the direction, the pattern must
 * be recompiled. Returns NULL if 'pattern_length' is zero, or memory
 * couldn't be allocated. Note that if the parameter 'nocases' is true,
 * searches with the returned pattern will be case insensitive. */

Misc_TBMKpattern
Misc_TBMKpattern_alloc(const unsigned char *pattern,
                       unsigned int pattern_length,
                       unsigned char reverse,
                       unsigned char nocases);


/* Destroys a pattern structure created with Misc_TBMKpattern_alloc().
 * Note that a *pointer* to the value returned by that function is
 * passed as the paramter. On return, the value pointed to by 'pattern'
 * has been set to NULL. This function does nothing if 'pattern' or the
 * address 'pattern' points to is NULL, or does not point to a valid
 * Misc_TBMKpattern. */

void
Misc_TBMKpattern_free(Misc_TBMKpattern *pattern);


/* Both of these search function search a source of characters for a
 * literal text as compiled into a Misc_TBMKpattern structure. The first,
 * Misc_TBMKsearch_memory(), uses a contiguous block of memory as the
 * source of characters; the parameter 'text' points to the first
 * character that might possibly be examined by the search. The second
 * function, Misc_TBMKsearch_stream() gets its characters from the
 * NXStream 'stream'; searching begins at the current position of the
 * stream. The search encompasses at most 'text_extent' characters from
 * (and including) the character pointed to by 'text'. 'text_extent' is
 * positive for forward searches, negative for reverse searches (as
 * specified when the pattern was compiled). If 'all_matches' is true,
 * the entire extent is searched and the total number of matches is
 * returned; otherwise, the search stops at the first match. The number
 * of non-overlapping matches is returned (zero if no matches found), and
 * the offset from 'text' of the last match is returned by reference in
 * 'match_position' (for reverse searches, the 'match_position' will be
 * negative). Both functions return -1 if 'pattern' is clearly not a
 * valid pattern, or the sign of 'text_extent' is not valid for the
 * direction of the search specified when the pattern was compiled.
 *
 * Additionally, for Misc_TBMKsearch_stream(): When searching a stream,
 * if the end of stream arrives before 'text_extent' is reached, the
 * function returns as it does when 'text_extent' is reached. Note that
 * since seeks on a stream that is writable extend the size of the
 * stream, the write flag of the stream is turned off while this function
 * is executing; this may impact, for instance, signal handlers which are
 * called during the search. The flag is restored before the function
 * returns or upon the generation of an exception (before an non-handled
 * exeption is propogated outside the function). In addition to the
 * errors named above, -1 is returned if the stream is not readable or
 * not seekable. Exceptions other than NX_illegalSeek are propogated up
 * the function call stack as usual; NX_illegalSeek exceptions cause a
 * normal return. Finally, the function guarentees nothing about the
 * current position of the stream when the function returns. */

int
Misc_TBMKsearch_memory(const Misc_TBMKpattern pattern,
                       const unsigned char *text,
                       int text_extent,
                       unsigned char all_matches,
                       int *match_position);

#if defined(NeXT)
#include <streams/streams.h>

int
Misc_TBMKsearch_stream(const Misc_TBMKpattern pattern,
                       NXStream *stream,
                       int text_extent,
                       unsigned char all_matches,
                       int *match_position);

#endif /* defined(NeXT) */

/* For compatibility with version 1.0 of this module. */
#define Misc_TBMKsearch Misc_TBMKsearch_memory

#endif /* _MISC_TBMK_H */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.