#include <lcstring.h> char *memscntb(char *area, const char *chars, int val, size_t len);
memscntb
builds a translate table that is used with the
memscan
function to scan a block of memory 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. memscan
scans its argument area 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
, memscntb
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.
chars
is an array of characters that are to be translated to the
same value. The len
argument specifies the number of characters in
the chars
array. The table byte corresponding to each character in
the first len
bytes of the chars
array 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
chars
is "ab", len
is 2, and val
is 0, then bytes 129 and
130 (the EBCDIC decimal values for a and b) in the translate table
have the value 0, and all other bytes have the value 1.
The null character is treated like any other character and must be
present in the chars
array if the corresponding table entry (the
first byte) is to contain the value of val
.
When building a translate table with memscntb
, you must consider
how you will use memscan
. If you are going to search for the
first occurrence of a character in chars
, val
should be
nonzero. If you want to search for the first character not in
chars
, val
should be 0.
memscntb
returns a pointer to the translate table. If area
is
NULL
, this table cannot be modified by the program.
memscntb
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: memchr
,
memscntb
, strchr
, strcspn
, strpbrk
, strscntb
,
and strspn
.
memscntb
is implemented as a built-in function. Inline code is
generated if str
is a string literal and val
is an integer
constant.
memscntb
:
#include <lcstring.h> #include <stdio.h> #include <ctype.h> #define LEN 100 main() { char area[LEN]; char *digitp, *start; size_t len_left = LEN - 1; char *digtable; /* Build a translate table with nonzero entries for digits. */ digtable = memscntb(NULL, "0123456789", 1, 10); for (start = area; ; start = digitp + 1) { /* Find next digit. */ digitp = memscan(start, digtable, len_left); if (!digitp) break; if (isalpha(*(digitp + 1))) { printf("Invalid sequence: %.2sn", digitp); break; } } }
memscan
, strscntb
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.