Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | TIP #586 implementation: C String Parsing Support for binary scan |
|---|---|
| Timelines: | family | ancestors | descendants | both | core-8-branch |
| Files: | files | file ages | folders |
| SHA3-256: |
5aa764a7959cbf9b15b49825a280f0d3 |
| User & Date: | jan.nijtmans 2020-11-16 10:53:58.605 |
| Original Comment: | TIP #586 implementation: C String Parsing Support for binary scanjan.nijtmans |
Context
|
2020-11-16
| ||
| 12:55 | Merge 8.6 check-in: 855fa5fea3 user: jan.nijtmans tags: core-8-branch | |
| 11:05 | Merge 8.7 check-in: dc11880006 user: jan.nijtmans tags: trunk, main | |
| 10:53 | TIP #586 implementation: C String Parsing Support for binary scan check-in: 5aa764a795 user: jan.nijtmans tags: core-8-branch | |
| 10:06 | Merge 8.6 check-in: c2dc6753fa user: dkf tags: core-8-branch | |
|
2020-10-30
| ||
| 15:13 | Merge 8.7 Closed-Leaf check-in: 2c1ee70bdc user: jan.nijtmans tags: tip-586-binary-scan-c-string | |
Changes
Changes to doc/binary.n.
| ︙ | ︙ | |||
758 759 760 761 762 763 764 765 766 767 768 769 770 771 | .CS \fBbinary scan\fR \ex70\ex87\ex05 B5B* var1 var2 .CE .PP will return \fB2\fR with \fB01110\fR stored in \fIvar1\fR and \fB1000011100000101\fR stored in \fIvar2\fR. .RE .IP \fBH\fR 5 The data is turned into a string of \fIcount\fR hexadecimal digits in high-to-low order represented as a sequence of characters in the set .QW 0123456789abcdef . The data bytes are scanned in first to last order with the hex digits being taken in high-to-low order within each byte. Any extra bits in the last byte are ignored. If \fIcount\fR is | > > > > > > > > > | 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 | .CS \fBbinary scan\fR \ex70\ex87\ex05 B5B* var1 var2 .CE .PP will return \fB2\fR with \fB01110\fR stored in \fIvar1\fR and \fB1000011100000101\fR stored in \fIvar2\fR. .RE .IP \fBC\fR 5 This form is similar to \fBA\fR, except that it scans the data from start and terminates at the first null (C string semantics). For example, .RS .CS \fBbinary scan\fR "abc\e000efghi" C* var1 .CE will return \fB1\fR with \fBabc\fR stored in \fIvar1\fR. .RE .IP \fBH\fR 5 The data is turned into a string of \fIcount\fR hexadecimal digits in high-to-low order represented as a sequence of characters in the set .QW 0123456789abcdef . The data bytes are scanned in first to last order with the hex digits being taken in high-to-low order within each byte. Any extra bits in the last byte are ignored. If \fIcount\fR is |
| ︙ | ︙ |
Changes to generic/tclBinary.c.
| ︙ | ︙ | |||
1514 1515 1516 1517 1518 1519 1520 |
str = format;
flags = 0;
if (!GetFormatSpec(&format, &cmd, &count, &flags)) {
goto done;
}
switch (cmd) {
case 'a':
| > | | 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 |
str = format;
flags = 0;
if (!GetFormatSpec(&format, &cmd, &count, &flags)) {
goto done;
}
switch (cmd) {
case 'a':
case 'A':
case 'C': {
unsigned char *src;
if (arg >= objc) {
DeleteScanNumberCache(numberCachePtr);
goto badIndex;
}
if (count == BINARY_ALL) {
|
| ︙ | ︙ | |||
1536 1537 1538 1539 1540 1541 1542 | } } src = buffer + offset; size = count; /* | > | | > > > > > > > | 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 |
}
}
src = buffer + offset;
size = count;
/*
* Apply C string semantics or trim trailing
* nulls and spaces, if necessary.
*/
if (cmd == 'C') {
for (i = 0; i < size; i++) {
if (src[i] == '\0') {
size = i;
break;
}
}
} else if (cmd == 'A') {
while (size > 0) {
if (src[size - 1] != '\0' && src[size - 1] != ' ') {
break;
}
size--;
}
}
|
| ︙ | ︙ |
Changes to tests/binary.test.
| ︙ | ︙ | |||
755 756 757 758 759 760 761 |
list [binary scan "abc def \x00 " A* arg1] $arg1
} -result {1 {abc def}}
test binary-21.12 {Tcl_BinaryObjCmd: scan} -setup {
unset -nocomplain arg1
} -body {
list [binary scan "abc def \x00ghi " A* arg1] $arg1
} -result [list 1 "abc def \x00ghi"]
| | > > > > > > > > > | 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 |
list [binary scan "abc def \x00 " A* arg1] $arg1
} -result {1 {abc def}}
test binary-21.12 {Tcl_BinaryObjCmd: scan} -setup {
unset -nocomplain arg1
} -body {
list [binary scan "abc def \x00ghi " A* arg1] $arg1
} -result [list 1 "abc def \x00ghi"]
test binary-21.13 {Tcl_BinaryObjCmd: scan} -setup {
unset -nocomplain arg1
} -body {
list [binary scan "abc def \x00 " C* arg1] $arg1
} -result {1 {abc def }}
test binary-21.12 {Tcl_BinaryObjCmd: scan} -setup {
unset -nocomplain arg1
} -body {
list [binary scan "abc def \x00ghi" C* arg1] $arg1
} -result {1 {abc def }}
test binary-22.1 {Tcl_BinaryObjCmd: scan} -returnCodes error -body {
binary scan abc b
} -result {not enough arguments for all format specifiers}
test binary-22.2 {Tcl_BinaryObjCmd: scan} {
unset -nocomplain arg1
list [binary scan \x52\x53 b* arg1] $arg1
} {1 0100101011001010}
|
| ︙ | ︙ |