Next: Conversion to and from External Data, Previous: Character-Related Data Types, Up: Coding for Mule
Now that we have defined the basic character-related types, we can look at the macros and functions designed for work with them and for conversion between them. Most of these macros are defined in buffer.h, and we don't discuss all of them here, but only the most important ones. Examining the existing code is the best way to learn about them.
MAX_EMCHAR_LEN {
Charcount cclen;
...
{
/* Allocate place for cclen characters. */
Bufbyte *buf = (Bufbyte *)alloca (cclen * MAX_EMCHAR_LEN);
...
If you followed the previous section, you can guess that, logically,
multiplying a Charcount value with MAX_EMCHAR_LEN produces
a Bytecount value.
In the current Mule implementation, MAX_EMCHAR_LEN equals 4.
Without Mule, it is 1.
charptr_emcharset_charptr_emcharcharptr_emchar macro takes a Bufbyte pointer and
returns the Emchar stored at that position. If it were a
function, its prototype would be:
Emchar charptr_emchar (Bufbyte *p);
set_charptr_emchar stores an Emchar to the specified byte
position. It returns the number of bytes stored:
Bytecount set_charptr_emchar (Bufbyte *p, Emchar c);
It is important to note that set_charptr_emchar is safe only for
appending a character at the end of a buffer, not for overwriting a
character in the middle. This is because the width of characters
varies, and set_charptr_emchar cannot resize the string if it
writes, say, a two-byte character where a single-byte character used to
reside.
A typical use of set_charptr_emchar can be demonstrated by this
example, which copies characters from buffer buf to a temporary
string of Bufbytes.
{
Bufpos pos;
for (pos = beg; pos < end; pos++)
{
Emchar c = BUF_FETCH_CHAR (buf, pos);
p += set_charptr_emchar (buf, c);
}
}
Note how set_charptr_emchar is used to store the Emchar
and increment the counter, at the same time.
INC_CHARPTRDEC_CHARPTRBufbyte pointer,
respectively. They will adjust the pointer by the appropriate number of
bytes according to the byte length of the character stored there. Both
macros assume that the memory address is located at the beginning of a
valid character.
Without Mule support, INC_CHARPTR (p) and DEC_CHARPTR (p)
simply expand to p++ and p--, respectively.
bytecount_to_charcountCharcount bytecount_to_charcount (Bufbyte *p, Bytecount bc);
charcount_to_bytecountBytecount charcount_to_bytecount (Bufbyte *p, Charcount cc);
charptr_n_addrBufbyte *charptr_n_addr (Bufbyte *p, Charcount cc);