
#include <lcstring.h> char *strscntb(char *area, const char *str, int val);
strscntb builds a translate table that you use with the
strscan function to scan a character string for the first
occurrence of one of a set of characters. A translate table is an
array containing 1 byte for each of the 256 EBCDIC characters.
strscan scans its argument string for a character whose value in the
translate table is not 0.
area is either the address of a 256-byte array, or NULL. If
area is NULL, strscntb builds the translate table in a
static area, whose address is returned. If area is not NULL,
the table is built in the specified array.
str is a string of characters that are to be translated to the same
value. The table byte corresponding to each character in str has
the value specified by val, while all other characters have the
value of !val (that is, 1 if val is 0, and 0 otherwise). For
example, if str is "ab" and val is 0, bytes 129 and 130 (the
EBCDIC decimal values for a and b) in the translate table have the
value 0 and all other bytes (except for byte 0) have the value 1.
The table entry for the null character is a special case; this byte is
always nonzero and forces strscan to terminate its scan at the end of
the argument string.
When building the translate table with strscntb, you must consider
how you will use strscan. If you are going to use strscan to
search for the first occurrence of a character in str, val
should be nonzero. If you want to search for the first character not in
str, val should be 0.
strscntb returns a pointer to the translate table. If area is
NULL, this table may not be modified by the program.
strscntb is called with a NULL area value, the table
addressed by the return value is a static area. This area may be
modified by the next call to any of these functions: strscntb,
memscntb, memchr, strchr, strcspn, strspn, and
strpbrk.
strscntb is implemented as a built-in function. Inline code is
generated if str is a string literal and val is an integer
constant.
strscntb verifies that each string in an array
contains only alphabetic characters and English punctuation. Using
strscan rather than strspn is more efficient because a
translate table only needs to be built once:
#include <lcstring.h>
#include <stdio.h>
#define SIZE 500
char *strings[SIZE]; /* string to be tested for */
/* unacceptable characters */
int i;
char engtable[256]; /* translate table */
/* Build table to skip letters and punctuation. */
main()
{
strscntb(engtable, "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
" ,./?:;' !-", 0);
for (i = 0; i < SIZE; i++) {
/* If unacceptable character is found in */
/* string before null, print error message. */
if (*strscan(strings[i], engtable)) {
printf("String %d contains unacceptable character:n",
i);
}
}
}
memscntb, strchr, strcspn, strscan,
strspn
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.