@@ -1268,14 +1268,10 @@ defmodule Base do
1268
1268
pad? = Keyword . get ( opts , :padding , true )
1269
1269
1270
1270
case Keyword . get ( opts , :case , :upper ) do
1271
- :upper -> validate32upper! ( string , pad? )
1272
- :lower -> validate32lower! ( string , pad? )
1273
- :mixed -> validate32mixed! ( string , pad? )
1271
+ :upper -> validate32upper? ( string , pad? )
1272
+ :lower -> validate32lower? ( string , pad? )
1273
+ :mixed -> validate32mixed? ( string , pad? )
1274
1274
end
1275
-
1276
- true
1277
- rescue
1278
- ArgumentError -> false
1279
1275
end
1280
1276
1281
1277
@ doc """
@@ -1406,14 +1402,10 @@ defmodule Base do
1406
1402
pad? = Keyword . get ( opts , :padding , true )
1407
1403
1408
1404
case Keyword . get ( opts , :case , :upper ) do
1409
- :upper -> validate32hexupper! ( string , pad? )
1410
- :lower -> validate32hexlower! ( string , pad? )
1411
- :mixed -> validate32hexmixed! ( string , pad? )
1405
+ :upper -> validate32hexupper? ( string , pad? )
1406
+ :lower -> validate32hexlower? ( string , pad? )
1407
+ :mixed -> validate32hexmixed? ( string , pad? )
1412
1408
end
1413
-
1414
- true
1415
- rescue
1416
- ArgumentError -> false
1417
1409
end
1418
1410
1419
1411
upper = Enum . with_index ( b32_alphabet )
@@ -1428,96 +1420,112 @@ defmodule Base do
1428
1420
hexmixed: to_mixed_dec . ( hexupper )
1429
1421
] do
1430
1422
decode_name = :"decode32#{ base } !"
1431
- validate_name = :"validate32#{ base } !"
1423
+ validate_name = :"validate32#{ base } ?"
1424
+ validate_main_name = :"validate_main32#{ validate_name } ?"
1425
+ valid_char_name = :"valid_char32#{ base } ?"
1432
1426
{ min , decoded } = to_decode_list . ( alphabet )
1433
1427
1434
- defp unquote ( validate_name ) ( << >> , _pad? ) do
1435
- :ok
1428
+ defp unquote ( validate_main_name ) ( << >> ) , do: true
1429
+
1430
+ defp unquote ( validate_main_name ) (
1431
+ << c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 , c5 :: 8 , c6 :: 8 , c7 :: 8 , c8 :: 8 , rest :: binary >>
1432
+ ) do
1433
+ unquote ( valid_char_name ) ( c1 ) and
1434
+ unquote ( valid_char_name ) ( c2 ) and
1435
+ unquote ( valid_char_name ) ( c3 ) and
1436
+ unquote ( valid_char_name ) ( c4 ) and
1437
+ unquote ( valid_char_name ) ( c5 ) and
1438
+ unquote ( valid_char_name ) ( c6 ) and
1439
+ unquote ( valid_char_name ) ( c7 ) and
1440
+ unquote ( valid_char_name ) ( c8 ) and
1441
+ unquote ( validate_main_name ) ( rest )
1436
1442
end
1437
1443
1444
+ defp unquote ( validate_name ) ( << >> , _pad? ) , do: true
1445
+
1438
1446
defp unquote ( validate_name ) ( string , pad? ) do
1439
1447
segs = div ( byte_size ( string ) + 7 , 8 ) - 1
1440
1448
<< main :: size ( ^ segs ) - binary - unit ( 64 ) , rest :: binary >> = string
1441
-
1442
- for << c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 , c5 :: 8 , c6 :: 8 , c7 :: 8 , c8 :: 8 <- main >> do
1443
- unquote ( decode_name ) ( c1 )
1444
- unquote ( decode_name ) ( c2 )
1445
- unquote ( decode_name ) ( c3 )
1446
- unquote ( decode_name ) ( c4 )
1447
- unquote ( decode_name ) ( c5 )
1448
- unquote ( decode_name ) ( c6 )
1449
- unquote ( decode_name ) ( c7 )
1450
- unquote ( decode_name ) ( c8 )
1451
- end
1449
+ main_valid? = unquote ( validate_main_name ) ( main )
1452
1450
1453
1451
case rest do
1452
+ _ when not main_valid? ->
1453
+ false
1454
+
1454
1455
<< c1 :: 8 , c2 :: 8 , ?= , ?= , ?= , ?= , ?= , ?= >> ->
1455
- unquote ( decode_name ) ( c1 )
1456
- unquote ( decode_name ) ( c2 )
1456
+ unquote ( valid_char_name ) ( c1 ) and
1457
+ unquote ( valid_char_name ) ( c2 )
1457
1458
1458
1459
<< c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 , ?= , ?= , ?= , ?= >> ->
1459
- unquote ( decode_name ) ( c1 )
1460
- unquote ( decode_name ) ( c2 )
1461
- unquote ( decode_name ) ( c3 )
1462
- unquote ( decode_name ) ( c4 )
1460
+ unquote ( valid_char_name ) ( c1 ) and
1461
+ unquote ( valid_char_name ) ( c2 ) and
1462
+ unquote ( valid_char_name ) ( c3 ) and
1463
+ unquote ( valid_char_name ) ( c4 )
1463
1464
1464
1465
<< c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 , c5 :: 8 , ?= , ?= , ?= >> ->
1465
- unquote ( decode_name ) ( c1 )
1466
- unquote ( decode_name ) ( c2 )
1467
- unquote ( decode_name ) ( c3 )
1468
- unquote ( decode_name ) ( c4 )
1469
- unquote ( decode_name ) ( c5 )
1466
+ unquote ( valid_char_name ) ( c1 ) and
1467
+ unquote ( valid_char_name ) ( c2 ) and
1468
+ unquote ( valid_char_name ) ( c3 ) and
1469
+ unquote ( valid_char_name ) ( c4 ) and
1470
+ unquote ( valid_char_name ) ( c5 )
1470
1471
1471
1472
<< c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 , c5 :: 8 , c6 :: 8 , c7 :: 8 , ?= >> ->
1472
- unquote ( decode_name ) ( c1 )
1473
- unquote ( decode_name ) ( c2 )
1474
- unquote ( decode_name ) ( c3 )
1475
- unquote ( decode_name ) ( c4 )
1476
- unquote ( decode_name ) ( c5 )
1477
- unquote ( decode_name ) ( c6 )
1478
- unquote ( decode_name ) ( c7 )
1473
+ unquote ( valid_char_name ) ( c1 ) and
1474
+ unquote ( valid_char_name ) ( c2 ) and
1475
+ unquote ( valid_char_name ) ( c3 ) and
1476
+ unquote ( valid_char_name ) ( c4 ) and
1477
+ unquote ( valid_char_name ) ( c5 ) and
1478
+ unquote ( valid_char_name ) ( c6 ) and
1479
+ unquote ( valid_char_name ) ( c7 )
1479
1480
1480
1481
<< c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 , c5 :: 8 , c6 :: 8 , c7 :: 8 , c8 :: 8 >> ->
1481
- unquote ( decode_name ) ( c1 )
1482
- unquote ( decode_name ) ( c2 )
1483
- unquote ( decode_name ) ( c3 )
1484
- unquote ( decode_name ) ( c4 )
1485
- unquote ( decode_name ) ( c5 )
1486
- unquote ( decode_name ) ( c6 )
1487
- unquote ( decode_name ) ( c7 )
1488
- unquote ( decode_name ) ( c8 )
1482
+ unquote ( valid_char_name ) ( c1 ) and
1483
+ unquote ( valid_char_name ) ( c2 ) and
1484
+ unquote ( valid_char_name ) ( c3 ) and
1485
+ unquote ( valid_char_name ) ( c4 ) and
1486
+ unquote ( valid_char_name ) ( c5 ) and
1487
+ unquote ( valid_char_name ) ( c6 ) and
1488
+ unquote ( valid_char_name ) ( c7 ) and
1489
+ unquote ( valid_char_name ) ( c8 )
1489
1490
1490
1491
<< c1 :: 8 , c2 :: 8 >> when not pad? ->
1491
- unquote ( decode_name ) ( c1 )
1492
- unquote ( decode_name ) ( c2 )
1492
+ unquote ( valid_char_name ) ( c1 ) and
1493
+ unquote ( valid_char_name ) ( c2 )
1493
1494
1494
1495
<< c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 >> when not pad? ->
1495
- unquote ( decode_name ) ( c1 )
1496
- unquote ( decode_name ) ( c2 )
1497
- unquote ( decode_name ) ( c3 )
1498
- unquote ( decode_name ) ( c4 )
1496
+ unquote ( valid_char_name ) ( c1 ) and
1497
+ unquote ( valid_char_name ) ( c2 ) and
1498
+ unquote ( valid_char_name ) ( c3 ) and
1499
+ unquote ( valid_char_name ) ( c4 )
1499
1500
1500
1501
<< c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 , c5 :: 8 >> when not pad? ->
1501
- unquote ( decode_name ) ( c1 )
1502
- unquote ( decode_name ) ( c2 )
1503
- unquote ( decode_name ) ( c3 )
1504
- unquote ( decode_name ) ( c4 )
1505
- unquote ( decode_name ) ( c5 )
1502
+ unquote ( valid_char_name ) ( c1 ) and
1503
+ unquote ( valid_char_name ) ( c2 ) and
1504
+ unquote ( valid_char_name ) ( c3 ) and
1505
+ unquote ( valid_char_name ) ( c4 ) and
1506
+ unquote ( valid_char_name ) ( c5 )
1506
1507
1507
1508
<< c1 :: 8 , c2 :: 8 , c3 :: 8 , c4 :: 8 , c5 :: 8 , c6 :: 8 , c7 :: 8 >> when not pad? ->
1508
- unquote ( decode_name ) ( c1 )
1509
- unquote ( decode_name ) ( c2 )
1510
- unquote ( decode_name ) ( c3 )
1511
- unquote ( decode_name ) ( c4 )
1512
- unquote ( decode_name ) ( c5 )
1513
- unquote ( decode_name ) ( c6 )
1514
- unquote ( decode_name ) ( c7 )
1509
+ unquote ( valid_char_name ) ( c1 ) and
1510
+ unquote ( valid_char_name ) ( c2 ) and
1511
+ unquote ( valid_char_name ) ( c3 ) and
1512
+ unquote ( valid_char_name ) ( c4 ) and
1513
+ unquote ( valid_char_name ) ( c5 ) and
1514
+ unquote ( valid_char_name ) ( c6 ) and
1515
+ unquote ( valid_char_name ) ( c7 )
1515
1516
1516
1517
_ ->
1517
- raise ArgumentError , "incorrect padding"
1518
+ false
1518
1519
end
1519
1520
end
1520
1521
1522
+ @ compile { :inline , [ { valid_char_name , 1 } ] }
1523
+ defp unquote ( valid_char_name ) ( char )
1524
+ when elem ( { unquote_splicing ( decoded ) } , char - unquote ( min ) ) != nil ,
1525
+ do: true
1526
+
1527
+ defp unquote ( valid_char_name ) ( _char ) , do: false
1528
+
1521
1529
defp unquote ( decode_name ) ( char ) do
1522
1530
index = char - unquote ( min )
1523
1531
0 commit comments