summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--doc/index.html2
-rw-r--r--doc/license.html2
-rw-r--r--doc/upgrade.html5
-rw-r--r--package/info2
-rw-r--r--src/libstddjb/ip6_scan.c96
6 files changed, 88 insertions, 25 deletions
diff --git a/NEWS b/NEWS
index a4a36e8..b9e080f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,11 @@
Changelog for skalibs.
+In 2.14.0.1
+-----------
+
+ - Bugfixes.
+
+
In 2.14.0.0
-----------
diff --git a/doc/index.html b/doc/index.html
index ae3e433..aa52de9 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -60,7 +60,7 @@ with a standard C development environment </li>
<h3> Download </h3>
<ul>
- <li> The current released version of skalibs is <a href="skalibs-2.14.0.0.tar.gz">2.14.0.0</a>. </li>
+ <li> The current released version of skalibs is <a href="skalibs-2.14.0.1.tar.gz">2.14.0.1</a>. </li>
<li> Alternatively, you can checkout a copy of the
<a href="//git.skarnet.org/cgi-bin/cgit.cgi/skalibs/">skalibs
git repository</a>:
diff --git a/doc/license.html b/doc/license.html
index c34533f..4d9df3d 100644
--- a/doc/license.html
+++ b/doc/license.html
@@ -74,7 +74,7 @@ color, or different text font. </li>
<p>
<em>I am aware that the previous restrictions sound completely
ridiculous while the official skalibs documentation is incomplete.
-As of 2.14.0.0, I'm not going to enforce those restrictions, but if you're
+As of 2.14.0.1, I'm not going to enforce those restrictions, but if you're
going to provide documentation for skalibs, don't keep it to yourself,
please send it to me instead. :-) </em>
</p>
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 8add0dc..767feda 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -16,6 +16,11 @@
<a href="//skarnet.org/">skarnet.org</a>
</p>
+<h2> in 2.14.0.1 </h2>
+
+<ul>
+ <li> No functional changes. </li>
+</ul>
<h2> in 2.14.0.0 </h2>
diff --git a/package/info b/package/info
index 9ed35f7..9a16833 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
package=skalibs
-version=2.14.0.0
+version=2.14.0.1
category=prog
package_macro_name=SKALIBS
diff --git a/src/libstddjb/ip6_scan.c b/src/libstddjb/ip6_scan.c
index b0e5b56..d2cdad6 100644
--- a/src/libstddjb/ip6_scan.c
+++ b/src/libstddjb/ip6_scan.c
@@ -1,37 +1,89 @@
/* ISC license. */
-#include <errno.h>
+#include <stdint.h>
#include <skalibs/uint16.h>
#include <skalibs/fmtscan.h>
+
+/* IPv6 scanner
+
+class | 0 1 2 3
+st\ev | other hex : .
+
+START | m
+00 | X LIMB COLON1 X
+
+COLON1 | p
+01 | X X NEW X
+
+NEW | m
+02 | END LIMB X X
+
+LIMB | h h
+03 | END LIMB COLON V4
+
+COLON | m p
+04 | X LIMB NEW X
+
+
+END = 05
+V4 = 06
+X = 07
+
+0x10 m mark
+0x20 p set doublecolon pos
+0x40 h scan hex, next limb
+
+*/
+
size_t ip6_scan (char const *s, char *ip6)
{
- static unsigned char const class[256] = "2222222222222222222222222222222222222222222222220000000000122222200000022222222222222222222222222000000222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" ;
- static unsigned char const table[5][3] = { "\024#\005", "\024\"\005", "\024\005\006", "\005\002\005", "\024\t\016" } ;
- uint16_t tmp[8] = { 0, 0, 0, 0, 0, 0, 0, 0 } ;
- size_t i = 0 ;
- unsigned int pos = 8, j = 0, state = 0 ;
+ static unsigned char const class[256] = "0000000000000000000000000000000000000000000000301111111111200000011111100000000000000000000000000111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ;
+ static uint8_t const table[5][4] =
+ {
+ { 0x07, 0x13, 0x01, 0x07 },
+ { 0x07, 0x07, 0x22, 0x07 },
+ { 0x05, 0x13, 0x07, 0x07 },
+ { 0x45, 0x03, 0x44, 0x06 },
+ { 0x07, 0x13, 0x22, 0x07 }
+ } ;
+ size_t i = 0, mark = 0 ;
+ uint16_t limb[8] = { 0, 0, 0, 0, 0, 0, 0, 0 } ;
+ uint8_t pos = 8, j = 0, state = 0 ;
- while (state < 5)
+ for (; state < 0x05 ; i++)
{
- unsigned char c = table[state][class[(unsigned char)s[i]] - '0'] ;
- state = c & 7 ;
- if (c & 0x20) { if (pos < 8) state = 5 ; else pos = j ; }
- if (c & 0x10)
+ uint8_t c = table[state][class[(unsigned char)s[i]] - '0'] ;
+ state = c & 0x07 ;
+ if (c & 0x10) mark = i ;
+ if (c & 0x20) { if (pos < 8) state = 0x07 ; else pos = j ; }
+ if (c & 0x40)
+ if (j >= 8 || uint16_xscan(s + mark, limb + j++) != i - mark) state = 0x07 ;
+ }
+
+ switch (state)
+ {
+ case 0x05:
+ if (pos == 8 && j < 8 || (pos < 8 && j > 6)) return 0 ;
+ i-- ;
+ break ;
+ case 0x06:
{
- if (tmp[j] & 0xf000) state = 5 ;
- else tmp[j] = (tmp[j] << 4) + fmtscan_num(s[i], 16) ;
+ uint32_t ip4 ;
+ if (pos == 8 && j != 6 || (pos < 8 && j > 4)) return 0 ;
+ i = ip4_scanu32(s + mark, &ip4) ;
+ if (!i) return 0 ;
+ limb[j++] = ip4 >> 16 ;
+ limb[j++] = ip4 & 0xffff ;
+ i += mark ;
+ break ;
}
- if (c & 0x08) if ((++j > 7) && (state < 5)) state = 5 ;
- i++ ;
+ default : return 0 ;
}
- if (((pos < 8) && (j > 6)) || ((pos == 8) && (j < 8))) state = 5 ;
- if (state == 5) return (errno = EINVAL, 0) ;
- for (state = j ; state > pos ; state--) tmp[state - j + 7] = tmp[state - 1] ;
- for (; state < pos + 8 - j ; state++) tmp[state] = 0 ;
-
- for (j = 0 ; j < 8 ; j++) uint16_pack_big(ip6 + (j<<1), tmp[j]) ;
- return i - 1 ;
+ for (state = j ; state > pos ; state--) limb[state - j + 7] = limb[state - 1] ;
+ for (; state < pos + 8 - j ; state++) limb[state] = 0 ;
+ for (j = 0 ; j < 8 ; j++) uint16_pack_big(ip6 + (j<<1), limb[j]) ;
+ return i ;
}