NAME
escall_fmt, escall_scan, esc_fmt, esc_scan - (un)escape given text/data
SYNOPSIS
#include <limb/esc.h>
int escall_fmt(char *dst, size_t dlen, const char *sce, size_t slen, size_t *w, size_t *r) int escall_scan(char *dst, size_t dlen, const char *sce, size_t slen, size_t *w, size_t *r) ssize_t esc_fmt(char *dst, size_t dlen, const char *sce, size_t slen) ssize_t esc_scan(char *dst, size_t dlen, const char *sce, size_t slen)
DESCRIPTION
The escall_fmt() function will write the content of sce of length slen
bytes, starting at offset pointed by r (usually 0), into the memory area
pointed by dst starting at position w (usually 0) and never going past
dlen, whilst taking care of escaping characters as needed. This means more
characters might be written into dst than present in sce.
The values pointed to by r and w are updated accordingly to reflect the
positions of the last read in sce and write in dst, respectively.
Specifically, if a byte couldn't be escaped for lack of space in dst, the
value pointed to by r would remain on the last successfully processed byte,
and no "partial write" would have occurred in dst.
If dst is NULL then nothing is written, the data in sce is still processed
and both r and w (both mandatory) updated accordingly.
The esc_fmt() function is similar, only without the r and w arguments, and
different return values.
The escall_scan() function will read the data pointed to be sce of length
slen bytes, starting at offset pointed by r (usually 0), and write in the
memory area pointed by dst (up to dlen bytes) starting at offset pointed by
w the result of unescaping said data, expected by have been previously
escaped via escall_fmt().
Similarly to escall_fmt() the values pointed to by r and w are updated
accordingly.
It is possible to use escall_scan() without having the full data stream yet.
That is, if it is not possible to perform an unescaping it will fail with
ENODATA and both r and w will be updated as expected.
That is notably r will be set to the offset of the last byte actually read
and successfully processed, and w the corresponding last byte written.
The esc_scan() function is similar to escall_scan() only without the r and
w argument, and different return values.
The escall_scan() function supports the same memory location given in sce
and dst with different offsets in r and w.
Similarly, the esc_scan() function supports overlapping memory locations in
sce and dst.
ESCAPING
The escaping performed is intended to have the written value inside double-quotes. Bytes with special escaping are as follow :
double-quote (")
Escaped by prefixing with a backslash (\)
backslash (\)
Escaped by prefixing with a backslash (\)
bell (0x07)
Escaped as \a
backspace (0x08)
Escaped as \b
tabulation (0x09)
Escaped as \t
line feed (0x0a)
Escaped as \n
vertical tabulation (0x0b)
Escaped as \v
form feed (0x0c)
Escaped as \f
carriage return (0x0d)
Escaped as \r
Anything else will either be written as-in if recognized as a printable
character in the current locale, else escaped in hex-mode, that is \x followed
by the hexadecimal code of the byte. (For example, character 127 would be
escaped as \x7f)
RETURN VALUE
The escall_fmt() and escall_scan() functions return 1 on success. Otherwise
they return 0 and set errno to indicate the error.
In either case, values pointed to by r and w will have been updated to
reflect the positions of the last read in sce and write in dst,
respectively.
The esc_fmt() and esc_scan() functions return the number of bytes written
into dst on success. Otherwise they return -1 and set errno to indicate the
error.
ERRORS
The escall_fmt(), esc_fmt(), escall_scan() and esc_scan() function may
fail if :
ENOBUFS
Not enough space in dst.
The escall_fmt() and escall_scan() functions may also fail if :
EINVAL
Either r or w was too high (more than slen or dlen, respectively).
The escall_scan() and esc_scan() functions may also fail if :
EINVAL
Data in sce is malformed/invalid. E.g. a backslash followed by other than
an allowed byte or a non-escaped quote.
ENODATA
Not enough data available in sce. E.g. a backslash as last byte, or
followed by an x and less than 2 bytes.
NOTES
The behavior of the escall_fmt() and esc_fmt() functions depend on the
LC_CTYPE category of the current locale.