add unit tests and man page for scan_ldapescape
This commit is contained in:
parent
ac2df2bf20
commit
527e2e7c5b
33
textcode/scan_ldapescape.3
Normal file
33
textcode/scan_ldapescape.3
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
.TH scan_ldapescape 3
|
||||||
|
.SH NAME
|
||||||
|
scan_ldapescape \- parse LDIF escaped string
|
||||||
|
.SH SYNTAX
|
||||||
|
.B #include <libowfat/textcode.h>
|
||||||
|
|
||||||
|
size_t \fBscan_ldapescape\fP(const char *\fIsrc\fR,char *\fIdest\fR,size_t* \fIdestlen\fR);
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
scan_ldapescape parses LDIF escaped text from src into dest.
|
||||||
|
Parsing stops at the 0 terminator or invalid input characters.
|
||||||
|
|
||||||
|
This function will turn backslash escaped characters into their binary
|
||||||
|
equivalent, i.e. \0a to new-line and \5c to backslash.
|
||||||
|
|
||||||
|
scan_cescape will then write the number of bytes in dest into *destlen,
|
||||||
|
and return the number of bytes decoded from src.
|
||||||
|
|
||||||
|
dest can be NULL. destlen can be NULL.
|
||||||
|
|
||||||
|
To make sure dest is large enough, either allocate strlen(src)+1 bytes
|
||||||
|
or call scan_ldapescape twice, the first time with dest == NULL (*destlen
|
||||||
|
will still be written).
|
||||||
|
|
||||||
|
.SH "RETURN VALUE"
|
||||||
|
scan_ldapescape returns the number of bytes successfully parsed
|
||||||
|
from src.
|
||||||
|
|
||||||
|
.SH EXAMPLES
|
||||||
|
scan_ldapescape("test\5C\\");",buf,&i) -> return 7, i=5, buf="test\\" (C notation).
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
fmt_ldapescape(3), scan_cescape(3), scan_ldapescape(3)
|
@ -9,16 +9,32 @@ size_t scan_ldapescape(const char *src,char *dest,size_t *destlen) {
|
|||||||
if (s[i]=='\\') {
|
if (s[i]=='\\') {
|
||||||
int j=scan_fromhex(s[i+1]);
|
int j=scan_fromhex(s[i+1]);
|
||||||
if (j<0) break;
|
if (j<0) break;
|
||||||
dest[written]=j<<4;
|
if (dest) dest[written]=j<<4;
|
||||||
j=scan_fromhex(s[i+2]);
|
j=scan_fromhex(s[i+2]);
|
||||||
if (j<0) break;
|
if (j<0) break;
|
||||||
dest[written]|=j;
|
if (dest) dest[written]|=j;
|
||||||
i+=2;
|
i+=2;
|
||||||
} else {
|
} else {
|
||||||
dest[written]=s[i];
|
if (dest) dest[written]=s[i];
|
||||||
}
|
}
|
||||||
++written;
|
++written;
|
||||||
}
|
}
|
||||||
*destlen=written;
|
if (destlen) *destlen=written;
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef UNITTEST
|
||||||
|
#include <assert.h>
|
||||||
|
#undef UNITTEST
|
||||||
|
#include <scan/scan_fromhex.c>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
size_t dl;
|
||||||
|
char buf[100];
|
||||||
|
assert(scan_ldapescape("test\\n\");",buf,&dl)==4 && dl==4 && !memcmp(buf,"test",4));
|
||||||
|
/* check hex escaping */
|
||||||
|
assert(scan_ldapescape("test\\0afoo",buf,&dl)==10 && dl==8 && !memcmp(buf,"test\nfoo",8));
|
||||||
|
/* check that short sequences are rejected */
|
||||||
|
assert(scan_ldapescape("test\\ax",buf,&dl)==4 && dl==4 && !memcmp(buf,"test",4));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user