summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader
Unidiff
Diffstat (limited to 'noncore/apps/opie-reader') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-reader/chm_lib.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/noncore/apps/opie-reader/chm_lib.c b/noncore/apps/opie-reader/chm_lib.c
index ecf8278..7acd1d2 100644
--- a/noncore/apps/opie-reader/chm_lib.c
+++ b/noncore/apps/opie-reader/chm_lib.c
@@ -1555,167 +1555,168 @@ int chm_enumerate(struct chmFile *h,
1555 case CHM_ENUMERATOR_FAILURE: return 0; 1555 case CHM_ENUMERATOR_FAILURE: return 0;
1556 case CHM_ENUMERATOR_CONTINUE: break; 1556 case CHM_ENUMERATOR_CONTINUE: break;
1557 case CHM_ENUMERATOR_SUCCESS: return 1; 1557 case CHM_ENUMERATOR_SUCCESS: return 1;
1558 default: break; 1558 default: break;
1559 } 1559 }
1560 } 1560 }
1561 } 1561 }
1562 1562
1563 /* advance to next page */ 1563 /* advance to next page */
1564 curPage = header.block_next; 1564 curPage = header.block_next;
1565 } 1565 }
1566 1566
1567 return 1; 1567 return 1;
1568} 1568}
1569 1569
1570int chm_enumerate_dir(struct chmFile *h, 1570int chm_enumerate_dir(struct chmFile *h,
1571 const char *prefix, 1571 const char *prefix,
1572 int what, 1572 int what,
1573 CHM_ENUMERATOR e, 1573 CHM_ENUMERATOR e,
1574 void *context) 1574 void *context)
1575{ 1575{
1576 /* 1576 /*
1577 * XXX: do this efficiently (i.e. using the tree index) 1577 * XXX: do this efficiently (i.e. using the tree index)
1578 */ 1578 */
1579 1579
1580 Int32 curPage; 1580 Int32 curPage;
1581 1581
1582 /* buffer to hold whatever page we're looking at */ 1582 /* buffer to hold whatever page we're looking at */
1583#ifdef WIN32 1583#ifdef WIN32
1584 UChar *page_buf = alloca((unsigned int)h->block_len); 1584 UChar *page_buf = alloca((unsigned int)h->block_len);
1585#else 1585#else
1586 UChar page_buf[h->block_len]; 1586 UChar page_buf[h->block_len];
1587#endif 1587#endif
1588 struct chmPmglHeader header; 1588 struct chmPmglHeader header;
1589 UChar *end; 1589 UChar *end;
1590 UChar *cur; 1590 UChar *cur;
1591 unsigned long lenRemain; 1591 unsigned long lenRemain;
1592 1592
1593 /* set to 1 once we've started */ 1593 /* set to 1 once we've started */
1594 int it_has_begun=0; 1594 int it_has_begun=0;
1595 1595
1596 /* the current ui */ 1596 /* the current ui */
1597 struct chmUnitInfo ui; 1597 struct chmUnitInfo ui;
1598 int flag; 1598 int flag;
1599 1599
1600 /* the length of the prefix */ 1600 /* the length of the prefix */
1601 char prefixRectified[CHM_MAX_PATHLEN+1]; 1601 char prefixRectified[CHM_MAX_PATHLEN+1];
1602 int prefixLen; 1602 int prefixLen;
1603 char lastPath[CHM_MAX_PATHLEN]; 1603 char lastPath[CHM_MAX_PATHLEN+1];
1604 int lastPathLen; 1604 int lastPathLen;
1605 1605
1606 /* starting page */ 1606 /* starting page */
1607 curPage = h->index_head; 1607 curPage = h->index_head;
1608 1608
1609 /* initialize pathname state */ 1609 /* initialize pathname state */
1610 strncpy(prefixRectified, prefix, CHM_MAX_PATHLEN); 1610 strncpy(prefixRectified, prefix, CHM_MAX_PATHLEN);
1611 prefixLen = strlen(prefixRectified); 1611 prefixLen = strlen(prefixRectified);
1612 if (prefixLen != 0) 1612 if (prefixLen != 0)
1613 { 1613 {
1614 if (prefixRectified[prefixLen-1] != '/') 1614 if (prefixRectified[prefixLen-1] != '/')
1615 { 1615 {
1616 prefixRectified[prefixLen] = '/'; 1616 prefixRectified[prefixLen] = '/';
1617 prefixRectified[prefixLen+1] = '\0'; 1617 prefixRectified[prefixLen+1] = '\0';
1618 ++prefixLen; 1618 ++prefixLen;
1619 } 1619 }
1620 } 1620 }
1621 lastPath[0] = '\0'; 1621 lastPath[0] = '\0';
1622 lastPathLen = -1; 1622 lastPathLen = -1;
1623 1623
1624 /* until we have either returned or given up */ 1624 /* until we have either returned or given up */
1625 while (curPage != -1) 1625 while (curPage != -1)
1626 { 1626 {
1627 1627
1628 /* try to fetch the index page */ 1628 /* try to fetch the index page */
1629 if (_chm_fetch_bytes(h, 1629 if (_chm_fetch_bytes(h,
1630 page_buf, 1630 page_buf,
1631 (UInt64)h->dir_offset + (UInt64)curPage*h->block_len, 1631 (UInt64)h->dir_offset + (UInt64)curPage*h->block_len,
1632 h->block_len) != h->block_len) 1632 h->block_len) != h->block_len)
1633 return 0; 1633 return 0;
1634 1634
1635 /* figure out start and end for this page */ 1635 /* figure out start and end for this page */
1636 cur = page_buf; 1636 cur = page_buf;
1637 lenRemain = _CHM_PMGL_LEN; 1637 lenRemain = _CHM_PMGL_LEN;
1638 if (! _unmarshal_pmgl_header(&cur, &lenRemain, &header)) 1638 if (! _unmarshal_pmgl_header(&cur, &lenRemain, &header))
1639 return 0; 1639 return 0;
1640 end = page_buf + h->block_len - (header.free_space); 1640 end = page_buf + h->block_len - (header.free_space);
1641 1641
1642 /* loop over this page */ 1642 /* loop over this page */
1643 while (cur < end) 1643 while (cur < end)
1644 { 1644 {
1645 if (! _chm_parse_PMGL_entry(&cur, &ui)) 1645 if (! _chm_parse_PMGL_entry(&cur, &ui))
1646 return 0; 1646 return 0;
1647 1647
1648 /* check if we should start */ 1648 /* check if we should start */
1649 if (! it_has_begun) 1649 if (! it_has_begun)
1650 { 1650 {
1651 if (ui.length == 0 && strncmp(ui.path, prefixRectified, prefixLen) == 0) 1651 if (ui.length == 0 && strncmp(ui.path, prefixRectified, prefixLen) == 0)
1652 it_has_begun = 1; 1652 it_has_begun = 1;
1653 else 1653 else
1654 continue; 1654 continue;
1655 1655
1656 if (ui.path[prefixLen] == '\0') 1656 if (ui.path[prefixLen] == '\0')
1657 continue; 1657 continue;
1658 } 1658 }
1659 1659
1660 /* check if we should stop */ 1660 /* check if we should stop */
1661 else 1661 else
1662 { 1662 {
1663 if (strncmp(ui.path, prefixRectified, prefixLen) != 0) 1663 if (strncmp(ui.path, prefixRectified, prefixLen) != 0)
1664 return 1; 1664 return 1;
1665 } 1665 }
1666 1666
1667 /* check if we should include this path */ 1667 /* check if we should include this path */
1668 if (lastPathLen != -1) 1668 if (lastPathLen != -1)
1669 { 1669 {
1670 if (strncmp(ui.path, lastPath, lastPathLen) == 0) 1670 if (strncmp(ui.path, lastPath, lastPathLen) == 0)
1671 continue; 1671 continue;
1672 } 1672 }
1673 strcpy(lastPath, ui.path); 1673 strncpy(lastPath, ui.path, CHM_MAX_PATHLEN);
1674 lastPath[CHM_MAX_PATHLEN] = '\0';
1674 lastPathLen = strlen(lastPath); 1675 lastPathLen = strlen(lastPath);
1675 1676
1676 /* check for DIRS */ 1677 /* check for DIRS */
1677 if (ui.length == 0 && !(what & CHM_ENUMERATE_DIRS)) 1678 if (ui.length == 0 && !(what & CHM_ENUMERATE_DIRS))
1678 continue; 1679 continue;
1679 1680
1680 /* check for FILES */ 1681 /* check for FILES */
1681 if (ui.length != 0 && !(what & CHM_ENUMERATE_FILES)) 1682 if (ui.length != 0 && !(what & CHM_ENUMERATE_FILES))
1682 continue; 1683 continue;
1683 1684
1684 /* check for NORMAL vs. META */ 1685 /* check for NORMAL vs. META */
1685 if (ui.path[0] == '/') 1686 if (ui.path[0] == '/')
1686 { 1687 {
1687 1688
1688 /* check for NORMAL vs. SPECIAL */ 1689 /* check for NORMAL vs. SPECIAL */
1689 if (ui.path[1] == '#' || ui.path[1] == '$') 1690 if (ui.path[1] == '#' || ui.path[1] == '$')
1690 flag = CHM_ENUMERATE_SPECIAL; 1691 flag = CHM_ENUMERATE_SPECIAL;
1691 else 1692 else
1692 flag = CHM_ENUMERATE_NORMAL; 1693 flag = CHM_ENUMERATE_NORMAL;
1693 } 1694 }
1694 else 1695 else
1695 flag = CHM_ENUMERATE_META; 1696 flag = CHM_ENUMERATE_META;
1696 if (! (what & flag)) 1697 if (! (what & flag))
1697 continue; 1698 continue;
1698 1699
1699 /* call the enumerator */ 1700 /* call the enumerator */
1700 { 1701 {
1701 int status = (*e)(h, &ui, context); 1702 int status = (*e)(h, &ui, context);
1702 switch (status) 1703 switch (status)
1703 { 1704 {
1704 case CHM_ENUMERATOR_FAILURE: return 0; 1705 case CHM_ENUMERATOR_FAILURE: return 0;
1705 case CHM_ENUMERATOR_CONTINUE: break; 1706 case CHM_ENUMERATOR_CONTINUE: break;
1706 case CHM_ENUMERATOR_SUCCESS: return 1; 1707 case CHM_ENUMERATOR_SUCCESS: return 1;
1707 default: break; 1708 default: break;
1708 } 1709 }
1709 } 1710 }
1710 } 1711 }
1711 1712
1712 /* advance to next page */ 1713 /* advance to next page */
1713 curPage = header.block_next; 1714 curPage = header.block_next;
1714 } 1715 }
1715 1716
1716 return 1; 1717 return 1;
1717} 1718}
1718 1719
1719/* resolve a particular object from the archive */ 1720/* resolve a particular object from the archive */
1720int chm_resolve_location(struct chmFile *h, 1721int chm_resolve_location(struct chmFile *h,
1721 unsigned long pos, 1722 unsigned long pos,