@@ -1483,66 +1483,55 @@ def mailbox_data__search
1483
1483
end
1484
1484
alias sort_data mailbox_data__search
1485
1485
1486
+ # RFC5256: THREAD
1487
+ # thread-data = "THREAD" [SP 1*thread-list]
1486
1488
def thread_data
1487
- token = match ( T_ATOM )
1488
- name = token . value . upcase
1489
- token = lookahead
1490
-
1491
- if token . symbol == T_SPACE
1492
- threads = [ ]
1493
-
1494
- while true
1495
- shift_token
1496
- token = lookahead
1497
-
1498
- case token . symbol
1499
- when T_LPAR
1500
- threads << thread_branch ( token )
1501
- when T_CRLF
1502
- break
1503
- end
1504
- end
1505
- else
1506
- # no member
1507
- threads = [ ]
1489
+ name = label ( "THREAD" )
1490
+ threads = [ ]
1491
+ if SP?
1492
+ threads << thread_list while lookahead_thread_list?
1508
1493
end
1509
-
1510
- return UntaggedResponse . new ( name , threads , @str )
1494
+ UntaggedResponse . new ( name , threads , @str )
1511
1495
end
1512
1496
1513
- def thread_branch ( token )
1514
- rootmember = nil
1515
- lastmember = nil
1497
+ alias lookahead_thread_list? lookahead_lpar?
1498
+ alias lookahead_thread_nested? lookahead_thread_list?
1516
1499
1517
- while true
1518
- shift_token # ignore first T_LPAR
1519
- token = lookahead
1520
-
1521
- case token . symbol
1522
- when T_NUMBER
1523
- # new member
1524
- newmember = ThreadMember . new ( number , [ ] )
1525
- if rootmember . nil?
1526
- rootmember = newmember
1527
- else
1528
- lastmember . children << newmember
1529
- end
1530
- lastmember = newmember
1531
- when T_SPACE
1532
- # do nothing
1533
- when T_LPAR
1534
- if rootmember . nil?
1535
- # dummy member
1536
- lastmember = rootmember = ThreadMember . new ( nil , [ ] )
1537
- end
1500
+ # RFC5256: THREAD
1501
+ # thread-list = "(" (thread-members / thread-nested) ")"
1502
+ def thread_list
1503
+ lpar
1504
+ thread = if lookahead_thread_nested?
1505
+ ThreadMember . new ( nil , thread_nested )
1506
+ else
1507
+ thread_members
1508
+ end
1509
+ rpar
1510
+ thread
1511
+ end
1538
1512
1539
- lastmember . children << thread_branch ( token )
1540
- when T_RPAR
1541
- break
1513
+ # RFC5256: THREAD
1514
+ # thread-members = nz-number *(SP nz-number) [SP thread-nested]
1515
+ def thread_members
1516
+ members = [ ]
1517
+ members << nz_number # thread root
1518
+ while SP?
1519
+ case lookahead! ( T_NUMBER , T_LPAR ) . symbol
1520
+ when T_NUMBER then members << nz_number
1521
+ else nested = thread_nested ; break
1542
1522
end
1543
1523
end
1524
+ members . reverse . inject ( nested || [ ] ) { |subthreads , number |
1525
+ [ ThreadMember . new ( number , subthreads ) ]
1526
+ } . first
1527
+ end
1544
1528
1545
- return rootmember
1529
+ # RFC5256: THREAD
1530
+ # thread-nested = 2*thread-list
1531
+ def thread_nested
1532
+ nested = [ thread_list , thread_list ]
1533
+ while lookahead_thread_list? do nested << thread_list end
1534
+ nested
1546
1535
end
1547
1536
1548
1537
# mailbox-data =/ "STATUS" SP mailbox SP "(" [status-att-list] ")"
0 commit comments