#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.