author | erik <erik> | 2007-01-26 20:24:07 (UTC) |
---|---|---|
committer | erik <erik> | 2007-01-26 20:24:07 (UTC) |
commit | cc5b326a212414a612838b0041e6077477ebbc70 (patch) (unidiff) | |
tree | fd69c302a511c3bc715ff0e160181b9ad1cbf82d | |
parent | 53d630c9c4813142ee13e6843c30476a5db26e78 (diff) | |
download | opie-cc5b326a212414a612838b0041e6077477ebbc70.zip opie-cc5b326a212414a612838b0041e6077477ebbc70.tar.gz opie-cc5b326a212414a612838b0041e6077477ebbc70.tar.bz2 |
A couple of places where a string is overrun. This fixes both of them.
-rw-r--r-- | noncore/apps/opie-reader/chm_lib.c | 5 | ||||
-rw-r--r-- | noncore/settings/sysinfo/contrib/dhry.c | 4 |
2 files changed, 5 insertions, 4 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 | |||
@@ -1507,263 +1507,264 @@ int chm_enumerate(struct chmFile *h, | |||
1507 | /* try to fetch the index page */ | 1507 | /* try to fetch the index page */ |
1508 | if (_chm_fetch_bytes(h, | 1508 | if (_chm_fetch_bytes(h, |
1509 | page_buf, | 1509 | page_buf, |
1510 | (UInt64)h->dir_offset + (UInt64)curPage*h->block_len, | 1510 | (UInt64)h->dir_offset + (UInt64)curPage*h->block_len, |
1511 | h->block_len) != h->block_len) | 1511 | h->block_len) != h->block_len) |
1512 | return 0; | 1512 | return 0; |
1513 | 1513 | ||
1514 | /* figure out start and end for this page */ | 1514 | /* figure out start and end for this page */ |
1515 | cur = page_buf; | 1515 | cur = page_buf; |
1516 | lenRemain = _CHM_PMGL_LEN; | 1516 | lenRemain = _CHM_PMGL_LEN; |
1517 | if (! _unmarshal_pmgl_header(&cur, &lenRemain, &header)) | 1517 | if (! _unmarshal_pmgl_header(&cur, &lenRemain, &header)) |
1518 | return 0; | 1518 | return 0; |
1519 | end = page_buf + h->block_len - (header.free_space); | 1519 | end = page_buf + h->block_len - (header.free_space); |
1520 | 1520 | ||
1521 | /* loop over this page */ | 1521 | /* loop over this page */ |
1522 | while (cur < end) | 1522 | while (cur < end) |
1523 | { | 1523 | { |
1524 | if (! _chm_parse_PMGL_entry(&cur, &ui)) | 1524 | if (! _chm_parse_PMGL_entry(&cur, &ui)) |
1525 | return 0; | 1525 | return 0; |
1526 | 1526 | ||
1527 | /* check for DIRS */ | 1527 | /* check for DIRS */ |
1528 | if (ui.length == 0 && !(what & CHM_ENUMERATE_DIRS)) | 1528 | if (ui.length == 0 && !(what & CHM_ENUMERATE_DIRS)) |
1529 | continue; | 1529 | continue; |
1530 | 1530 | ||
1531 | /* check for FILES */ | 1531 | /* check for FILES */ |
1532 | if (ui.length != 0 && !(what & CHM_ENUMERATE_FILES)) | 1532 | if (ui.length != 0 && !(what & CHM_ENUMERATE_FILES)) |
1533 | continue; | 1533 | continue; |
1534 | 1534 | ||
1535 | /* check for NORMAL vs. META */ | 1535 | /* check for NORMAL vs. META */ |
1536 | if (ui.path[0] == '/') | 1536 | if (ui.path[0] == '/') |
1537 | { | 1537 | { |
1538 | 1538 | ||
1539 | /* check for NORMAL vs. SPECIAL */ | 1539 | /* check for NORMAL vs. SPECIAL */ |
1540 | if (ui.path[1] == '#' || ui.path[1] == '$') | 1540 | if (ui.path[1] == '#' || ui.path[1] == '$') |
1541 | flag = CHM_ENUMERATE_SPECIAL; | 1541 | flag = CHM_ENUMERATE_SPECIAL; |
1542 | else | 1542 | else |
1543 | flag = CHM_ENUMERATE_NORMAL; | 1543 | flag = CHM_ENUMERATE_NORMAL; |
1544 | } | 1544 | } |
1545 | else | 1545 | else |
1546 | flag = CHM_ENUMERATE_META; | 1546 | flag = CHM_ENUMERATE_META; |
1547 | if (! (what & flag)) | 1547 | if (! (what & flag)) |
1548 | continue; | 1548 | continue; |
1549 | 1549 | ||
1550 | /* call the enumerator */ | 1550 | /* call the enumerator */ |
1551 | { | 1551 | { |
1552 | int status = (*e)(h, &ui, context); | 1552 | int status = (*e)(h, &ui, context); |
1553 | switch (status) | 1553 | switch (status) |
1554 | { | 1554 | { |
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 | ||
1570 | int chm_enumerate_dir(struct chmFile *h, | 1570 | int 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 */ |
1720 | int chm_resolve_location(struct chmFile *h, | 1721 | int chm_resolve_location(struct chmFile *h, |
1721 | unsigned long pos, | 1722 | unsigned long pos, |
1722 | struct chmUnitInfo *ui) | 1723 | struct chmUnitInfo *ui) |
1723 | { | 1724 | { |
1724 | /* | 1725 | /* |
1725 | * XXX: implement caching scheme for dir pages | 1726 | * XXX: implement caching scheme for dir pages |
1726 | */ | 1727 | */ |
1727 | 1728 | ||
1728 | Int32 curPage; | 1729 | Int32 curPage; |
1729 | 1730 | ||
1730 | /* buffer to hold whatever page we're looking at */ | 1731 | /* buffer to hold whatever page we're looking at */ |
1731 | #ifdef WIN32 | 1732 | #ifdef WIN32 |
1732 | UChar *page_buf = alloca(h->block_len); | 1733 | UChar *page_buf = alloca(h->block_len); |
1733 | #else | 1734 | #else |
1734 | UChar page_buf[h->block_len]; | 1735 | UChar page_buf[h->block_len]; |
1735 | #endif | 1736 | #endif |
1736 | 1737 | ||
1737 | /* starting page */ | 1738 | /* starting page */ |
1738 | curPage = h->index_root; | 1739 | curPage = h->index_root; |
1739 | 1740 | ||
1740 | /* until we have either returned or given up */ | 1741 | /* until we have either returned or given up */ |
1741 | while (curPage != -1) | 1742 | while (curPage != -1) |
1742 | { | 1743 | { |
1743 | 1744 | ||
1744 | /* try to fetch the index page */ | 1745 | /* try to fetch the index page */ |
1745 | if (_chm_fetch_bytes(h, page_buf, | 1746 | if (_chm_fetch_bytes(h, page_buf, |
1746 | (UInt64)h->dir_offset + (UInt64)curPage*h->block_len, | 1747 | (UInt64)h->dir_offset + (UInt64)curPage*h->block_len, |
1747 | h->block_len) != h->block_len) | 1748 | h->block_len) != h->block_len) |
1748 | return CHM_RESOLVE_FAILURE; | 1749 | return CHM_RESOLVE_FAILURE; |
1749 | 1750 | ||
1750 | /* now, if it is a leaf node: */ | 1751 | /* now, if it is a leaf node: */ |
1751 | if (memcmp(page_buf, _chm_pmgl_marker, 4) == 0) | 1752 | if (memcmp(page_buf, _chm_pmgl_marker, 4) == 0) |
1752 | { | 1753 | { |
1753 | /* scan block */ | 1754 | /* scan block */ |
1754 | /* UChar *pEntry = _chm_find_in_PMGL(page_buf, h->block_len, objPath);*/ | 1755 | /* UChar *pEntry = _chm_find_in_PMGL(page_buf, h->block_len, objPath);*/ |
1755 | { | 1756 | { |
1756 | /* XXX: modify this to do a binary search using the nice index structure | 1757 | /* XXX: modify this to do a binary search using the nice index structure |
1757 | * that is provided for us. | 1758 | * that is provided for us. |
1758 | */ | 1759 | */ |
1759 | struct chmPmglHeader header; | 1760 | struct chmPmglHeader header; |
1760 | UInt32 hremain; | 1761 | UInt32 hremain; |
1761 | UChar *end; | 1762 | UChar *end; |
1762 | UChar *cur; | 1763 | UChar *cur; |
1763 | UChar *temp; | 1764 | UChar *temp; |
1764 | /* | 1765 | /* |
1765 | UInt64 strLen; | 1766 | UInt64 strLen; |
1766 | char buffer[CHM_MAX_PATHLEN+1]; | 1767 | char buffer[CHM_MAX_PATHLEN+1]; |
1767 | */ | 1768 | */ |
1768 | /* figure out where to start and end */ | 1769 | /* figure out where to start and end */ |
1769 | cur = page_buf; | 1770 | cur = page_buf; |
diff --git a/noncore/settings/sysinfo/contrib/dhry.c b/noncore/settings/sysinfo/contrib/dhry.c index 20b627c..07fd1c0 100644 --- a/noncore/settings/sysinfo/contrib/dhry.c +++ b/noncore/settings/sysinfo/contrib/dhry.c | |||
@@ -402,193 +402,193 @@ double dtime() | |||
402 | /************************************************/ | 402 | /************************************************/ |
403 | #ifdef POSIX | 403 | #ifdef POSIX |
404 | #include <sys/time.h> | 404 | #include <sys/time.h> |
405 | #include <sys/resource.h> | 405 | #include <sys/resource.h> |
406 | #include <sys/rusage.h> | 406 | #include <sys/rusage.h> |
407 | 407 | ||
408 | #ifdef __hpux | 408 | #ifdef __hpux |
409 | #include <sys/syscall.h> | 409 | #include <sys/syscall.h> |
410 | #endif | 410 | #endif |
411 | 411 | ||
412 | struct rusage rusage; | 412 | struct rusage rusage; |
413 | 413 | ||
414 | double dtime() | 414 | double dtime() |
415 | { | 415 | { |
416 | double q; | 416 | double q; |
417 | 417 | ||
418 | getrusage(RUSAGE_SELF,&rusage); | 418 | getrusage(RUSAGE_SELF,&rusage); |
419 | 419 | ||
420 | q = (double)(rusage.ru_utime.tv_sec); | 420 | q = (double)(rusage.ru_utime.tv_sec); |
421 | q = q + (double)(rusage.ru_utime.tv_nsec) * 1.0e-09; | 421 | q = q + (double)(rusage.ru_utime.tv_nsec) * 1.0e-09; |
422 | 422 | ||
423 | return q; | 423 | return q; |
424 | } | 424 | } |
425 | #endif | 425 | #endif |
426 | 426 | ||
427 | 427 | ||
428 | /****************************************************/ | 428 | /****************************************************/ |
429 | /* Windows NT (32 bit) dtime() routine */ | 429 | /* Windows NT (32 bit) dtime() routine */ |
430 | /* Provided by: Piers Haken, piersh@microsoft.com */ | 430 | /* Provided by: Piers Haken, piersh@microsoft.com */ |
431 | /****************************************************/ | 431 | /****************************************************/ |
432 | #ifdef WIN32 | 432 | #ifdef WIN32 |
433 | #include <windows.h> | 433 | #include <windows.h> |
434 | 434 | ||
435 | double dtime(void) | 435 | double dtime(void) |
436 | { | 436 | { |
437 | double q; | 437 | double q; |
438 | 438 | ||
439 | q = (double)GetTickCount() * 1.0e-03; | 439 | q = (double)GetTickCount() * 1.0e-03; |
440 | 440 | ||
441 | return q; | 441 | return q; |
442 | } | 442 | } |
443 | #endif | 443 | #endif |
444 | 444 | ||
445 | /*****************************************************/ | 445 | /*****************************************************/ |
446 | /* Time according to POSIX.1 - <J.Pelan@qub.ac.uk> */ | 446 | /* Time according to POSIX.1 - <J.Pelan@qub.ac.uk> */ |
447 | /* Ref: "POSIX Programmer's Guide" O'Reilly & Assoc.*/ | 447 | /* Ref: "POSIX Programmer's Guide" O'Reilly & Assoc.*/ |
448 | /*****************************************************/ | 448 | /*****************************************************/ |
449 | #ifdef POSIX1 | 449 | #ifdef POSIX1 |
450 | #define _POSIX_SOURCE 1 | 450 | #define _POSIX_SOURCE 1 |
451 | #include <unistd.h> | 451 | #include <unistd.h> |
452 | #include <limits.h> | 452 | #include <limits.h> |
453 | #include <sys/times.h> | 453 | #include <sys/times.h> |
454 | 454 | ||
455 | struct tms tms; | 455 | struct tms tms; |
456 | 456 | ||
457 | double dtime() | 457 | double dtime() |
458 | { | 458 | { |
459 | double q; | 459 | double q; |
460 | times(&tms); | 460 | times(&tms); |
461 | q = (double)tms.tms_utime / (double)CLK_TCK; | 461 | q = (double)tms.tms_utime / (double)CLK_TCK; |
462 | return q; | 462 | return q; |
463 | } | 463 | } |
464 | #endif | 464 | #endif |
465 | /* | 465 | /* |
466 | ************************************************************************* | 466 | ************************************************************************* |
467 | * | 467 | * |
468 | * "DHRYSTONE" Benchmark Program | 468 | * "DHRYSTONE" Benchmark Program |
469 | * ----------------------------- | 469 | * ----------------------------- |
470 | * | 470 | * |
471 | * Version: C, Version 2.1 | 471 | * Version: C, Version 2.1 |
472 | * | 472 | * |
473 | * File: dhry_1.c (part 2 of 3) | 473 | * File: dhry_1.c (part 2 of 3) |
474 | * | 474 | * |
475 | * Date: May 25, 1988 | 475 | * Date: May 25, 1988 |
476 | * | 476 | * |
477 | * Author: Reinhold P. Weicker | 477 | * Author: Reinhold P. Weicker |
478 | * | 478 | * |
479 | ************************************************************************* | 479 | ************************************************************************* |
480 | */ | 480 | */ |
481 | 481 | ||
482 | #include <stdio.h> | 482 | #include <stdio.h> |
483 | #include <stdlib.h> | 483 | #include <stdlib.h> |
484 | #include <string.h> | 484 | #include <string.h> |
485 | #include "dhry.h" | 485 | #include "dhry.h" |
486 | 486 | ||
487 | /* Global Variables: */ | 487 | /* Global Variables: */ |
488 | 488 | ||
489 | Rec_Pointer Ptr_Glob, | 489 | Rec_Pointer Ptr_Glob, |
490 | Next_Ptr_Glob; | 490 | Next_Ptr_Glob; |
491 | int Int_Glob; | 491 | int Int_Glob; |
492 | Boolean Bool_Glob; | 492 | Boolean Bool_Glob; |
493 | char Ch_1_Glob, | 493 | char Ch_1_Glob, |
494 | Ch_2_Glob; | 494 | Ch_2_Glob; |
495 | int Arr_1_Glob [50]; | 495 | int Arr_1_Glob [50]; |
496 | int Arr_2_Glob [50] [50]; | 496 | int Arr_2_Glob [50] [50]; |
497 | 497 | ||
498 | char Reg_Define[] = "Register option selected."; | 498 | char Reg_Define[32] = "Register option selected."; |
499 | 499 | ||
500 | //extern char *malloc (); | 500 | //extern char *malloc (); |
501 | Enumeration Func_1 (); | 501 | Enumeration Func_1 (); |
502 | /* | 502 | /* |
503 | forward declaration necessary since Enumeration may not simply be int | 503 | forward declaration necessary since Enumeration may not simply be int |
504 | */ | 504 | */ |
505 | 505 | ||
506 | #ifndef ROPT | 506 | #ifndef ROPT |
507 | #define REG | 507 | #define REG |
508 | /* REG becomes defined as empty */ | 508 | /* REG becomes defined as empty */ |
509 | /* i.e. no register variables */ | 509 | /* i.e. no register variables */ |
510 | #else | 510 | #else |
511 | #define REG register | 511 | #define REG register |
512 | #endif | 512 | #endif |
513 | 513 | ||
514 | 514 | ||
515 | /* variables for time measurement: */ | 515 | /* variables for time measurement: */ |
516 | 516 | ||
517 | #define Too_Small_Time 2 | 517 | #define Too_Small_Time 2 |
518 | /* Measurements should last at least 2 seconds */ | 518 | /* Measurements should last at least 2 seconds */ |
519 | 519 | ||
520 | double Begin_Time, | 520 | double Begin_Time, |
521 | End_Time, | 521 | End_Time, |
522 | User_Time; | 522 | User_Time; |
523 | 523 | ||
524 | double Microseconds, | 524 | double Microseconds, |
525 | Dhrystones_Per_Second, | 525 | Dhrystones_Per_Second, |
526 | Vax_Mips; | 526 | Vax_Mips; |
527 | 527 | ||
528 | /* end of variables for time measurement */ | 528 | /* end of variables for time measurement */ |
529 | 529 | ||
530 | /**********************************************************************************************/ | 530 | /**********************************************************************************************/ |
531 | 531 | ||
532 | 532 | ||
533 | Proc_1 (Ptr_Val_Par) | 533 | Proc_1 (Ptr_Val_Par) |
534 | /******************/ | 534 | /******************/ |
535 | 535 | ||
536 | REG Rec_Pointer Ptr_Val_Par; | 536 | REG Rec_Pointer Ptr_Val_Par; |
537 | /* executed once */ | 537 | /* executed once */ |
538 | { | 538 | { |
539 | REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; | 539 | REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; |
540 | /* == Ptr_Glob_Next */ | 540 | /* == Ptr_Glob_Next */ |
541 | /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ | 541 | /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ |
542 | /* corresponds to "rename" in Ada, "with" in Pascal */ | 542 | /* corresponds to "rename" in Ada, "with" in Pascal */ |
543 | 543 | ||
544 | structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); | 544 | structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); |
545 | Ptr_Val_Par->variant.var_1.Int_Comp = 5; | 545 | Ptr_Val_Par->variant.var_1.Int_Comp = 5; |
546 | Next_Record->variant.var_1.Int_Comp | 546 | Next_Record->variant.var_1.Int_Comp |
547 | = Ptr_Val_Par->variant.var_1.Int_Comp; | 547 | = Ptr_Val_Par->variant.var_1.Int_Comp; |
548 | Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; | 548 | Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; |
549 | Proc_3 (&Next_Record->Ptr_Comp); | 549 | Proc_3 (&Next_Record->Ptr_Comp); |
550 | /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp | 550 | /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp |
551 | == Ptr_Glob->Ptr_Comp */ | 551 | == Ptr_Glob->Ptr_Comp */ |
552 | if (Next_Record->Discr == Ident_1) | 552 | if (Next_Record->Discr == Ident_1) |
553 | /* then, executed */ | 553 | /* then, executed */ |
554 | { | 554 | { |
555 | Next_Record->variant.var_1.Int_Comp = 6; | 555 | Next_Record->variant.var_1.Int_Comp = 6; |
556 | Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, | 556 | Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, |
557 | &Next_Record->variant.var_1.Enum_Comp); | 557 | &Next_Record->variant.var_1.Enum_Comp); |
558 | Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; | 558 | Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; |
559 | Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, | 559 | Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, |
560 | &Next_Record->variant.var_1.Int_Comp); | 560 | &Next_Record->variant.var_1.Int_Comp); |
561 | } | 561 | } |
562 | else /* not executed */ | 562 | else /* not executed */ |
563 | structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); | 563 | structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); |
564 | } /* Proc_1 */ | 564 | } /* Proc_1 */ |
565 | 565 | ||
566 | 566 | ||
567 | Proc_2 (Int_Par_Ref) | 567 | Proc_2 (Int_Par_Ref) |
568 | /******************/ | 568 | /******************/ |
569 | /* executed once */ | 569 | /* executed once */ |
570 | /* *Int_Par_Ref == 1, becomes 4 */ | 570 | /* *Int_Par_Ref == 1, becomes 4 */ |
571 | 571 | ||
572 | One_Fifty *Int_Par_Ref; | 572 | One_Fifty *Int_Par_Ref; |
573 | { | 573 | { |
574 | One_Fifty Int_Loc; | 574 | One_Fifty Int_Loc; |
575 | Enumeration Enum_Loc; | 575 | Enumeration Enum_Loc; |
576 | 576 | ||
577 | Int_Loc = *Int_Par_Ref + 10; | 577 | Int_Loc = *Int_Par_Ref + 10; |
578 | do /* executed once */ | 578 | do /* executed once */ |
579 | if (Ch_1_Glob == 'A') | 579 | if (Ch_1_Glob == 'A') |
580 | /* then, executed */ | 580 | /* then, executed */ |
581 | { | 581 | { |
582 | Int_Loc -= 1; | 582 | Int_Loc -= 1; |
583 | *Int_Par_Ref = Int_Loc - Int_Glob; | 583 | *Int_Par_Ref = Int_Loc - Int_Glob; |
584 | Enum_Loc = Ident_1; | 584 | Enum_Loc = Ident_1; |
585 | } /* if */ | 585 | } /* if */ |
586 | while (Enum_Loc != Ident_1); /* true */ | 586 | while (Enum_Loc != Ident_1); /* true */ |
587 | } /* Proc_2 */ | 587 | } /* Proc_2 */ |
588 | 588 | ||
589 | 589 | ||
590 | Proc_3 (Ptr_Ref_Par) | 590 | Proc_3 (Ptr_Ref_Par) |
591 | /******************/ | 591 | /******************/ |
592 | /* executed once */ | 592 | /* executed once */ |
593 | /* Ptr_Ref_Par becomes Ptr_Glob */ | 593 | /* Ptr_Ref_Par becomes Ptr_Glob */ |
594 | 594 | ||
@@ -890,121 +890,121 @@ double dhry_main( int n ) | |||
890 | Proc_1 (Ptr_Glob); | 890 | Proc_1 (Ptr_Glob); |
891 | for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) | 891 | for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) |
892 | /* loop body executed twice */ | 892 | /* loop body executed twice */ |
893 | { | 893 | { |
894 | if (Enum_Loc == Func_1 (Ch_Index, 'C')) | 894 | if (Enum_Loc == Func_1 (Ch_Index, 'C')) |
895 | /* then, not executed */ | 895 | /* then, not executed */ |
896 | { | 896 | { |
897 | Proc_6 (Ident_1, &Enum_Loc); | 897 | Proc_6 (Ident_1, &Enum_Loc); |
898 | strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); | 898 | strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); |
899 | Int_2_Loc = Run_Index; | 899 | Int_2_Loc = Run_Index; |
900 | Int_Glob = Run_Index; | 900 | Int_Glob = Run_Index; |
901 | } | 901 | } |
902 | } | 902 | } |
903 | /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ | 903 | /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ |
904 | Int_2_Loc = Int_2_Loc * Int_1_Loc; | 904 | Int_2_Loc = Int_2_Loc * Int_1_Loc; |
905 | Int_1_Loc = Int_2_Loc / Int_3_Loc; | 905 | Int_1_Loc = Int_2_Loc / Int_3_Loc; |
906 | Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; | 906 | Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; |
907 | /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ | 907 | /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ |
908 | Proc_2 (&Int_1_Loc); | 908 | Proc_2 (&Int_1_Loc); |
909 | /* Int_1_Loc == 5 */ | 909 | /* Int_1_Loc == 5 */ |
910 | 910 | ||
911 | } /* loop "for Run_Index" */ | 911 | } /* loop "for Run_Index" */ |
912 | 912 | ||
913 | /**************/ | 913 | /**************/ |
914 | /* Stop timer */ | 914 | /* Stop timer */ |
915 | /**************/ | 915 | /**************/ |
916 | 916 | ||
917 | End_Time = dtime(); | 917 | End_Time = dtime(); |
918 | 918 | ||
919 | /* | 919 | /* |
920 | printf ("Execution ends\n"); | 920 | printf ("Execution ends\n"); |
921 | printf ("\n"); | 921 | printf ("\n"); |
922 | printf ("Final values of the variables used in the benchmark:\n"); | 922 | printf ("Final values of the variables used in the benchmark:\n"); |
923 | printf ("\n"); | 923 | printf ("\n"); |
924 | printf ("Int_Glob: %d\n", Int_Glob); | 924 | printf ("Int_Glob: %d\n", Int_Glob); |
925 | printf (" should be: %d\n", 5); | 925 | printf (" should be: %d\n", 5); |
926 | printf ("Bool_Glob: %d\n", Bool_Glob); | 926 | printf ("Bool_Glob: %d\n", Bool_Glob); |
927 | printf (" should be: %d\n", 1); | 927 | printf (" should be: %d\n", 1); |
928 | printf ("Ch_1_Glob: %c\n", Ch_1_Glob); | 928 | printf ("Ch_1_Glob: %c\n", Ch_1_Glob); |
929 | printf (" should be: %c\n", 'A'); | 929 | printf (" should be: %c\n", 'A'); |
930 | printf ("Ch_2_Glob: %c\n", Ch_2_Glob); | 930 | printf ("Ch_2_Glob: %c\n", Ch_2_Glob); |
931 | printf (" should be: %c\n", 'B'); | 931 | printf (" should be: %c\n", 'B'); |
932 | printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); | 932 | printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); |
933 | printf (" should be: %d\n", 7); | 933 | printf (" should be: %d\n", 7); |
934 | printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); | 934 | printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); |
935 | printf (" should be: Number_Of_Runs + 10\n"); | 935 | printf (" should be: Number_Of_Runs + 10\n"); |
936 | printf ("Ptr_Glob->\n"); | 936 | printf ("Ptr_Glob->\n"); |
937 | printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); | 937 | printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); |
938 | printf (" should be: (implementation-dependent)\n"); | 938 | printf (" should be: (implementation-dependent)\n"); |
939 | printf (" Discr: %d\n", Ptr_Glob->Discr); | 939 | printf (" Discr: %d\n", Ptr_Glob->Discr); |
940 | printf (" should be: %d\n", 0); | 940 | printf (" should be: %d\n", 0); |
941 | printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); | 941 | printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); |
942 | printf (" should be: %d\n", 2); | 942 | printf (" should be: %d\n", 2); |
943 | printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); | 943 | printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); |
944 | printf (" should be: %d\n", 17); | 944 | printf (" should be: %d\n", 17); |
945 | printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); | 945 | printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); |
946 | printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); | 946 | printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); |
947 | printf ("Next_Ptr_Glob->\n"); | 947 | printf ("Next_Ptr_Glob->\n"); |
948 | printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); | 948 | printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); |
949 | printf (" should be: (implementation-dependent), same as above\n"); | 949 | printf (" should be: (implementation-dependent), same as above\n"); |
950 | printf (" Discr: %d\n", Next_Ptr_Glob->Discr); | 950 | printf (" Discr: %d\n", Next_Ptr_Glob->Discr); |
951 | printf (" should be: %d\n", 0); | 951 | printf (" should be: %d\n", 0); |
952 | printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); | 952 | printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); |
953 | printf (" should be: %d\n", 1); | 953 | printf (" should be: %d\n", 1); |
954 | printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); | 954 | printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); |
955 | printf (" should be: %d\n", 18); | 955 | printf (" should be: %d\n", 18); |
956 | printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); | 956 | printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); |
957 | printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); | 957 | printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); |
958 | printf ("Int_1_Loc: %d\n", Int_1_Loc); | 958 | printf ("Int_1_Loc: %d\n", Int_1_Loc); |
959 | printf (" should be: %d\n", 5); | 959 | printf (" should be: %d\n", 5); |
960 | printf ("Int_2_Loc: %d\n", Int_2_Loc); | 960 | printf ("Int_2_Loc: %d\n", Int_2_Loc); |
961 | printf (" should be: %d\n", 13); | 961 | printf (" should be: %d\n", 13); |
962 | printf ("Int_3_Loc: %d\n", Int_3_Loc); | 962 | printf ("Int_3_Loc: %d\n", Int_3_Loc); |
963 | printf (" should be: %d\n", 7); | 963 | printf (" should be: %d\n", 7); |
964 | printf ("Enum_Loc: %d\n", Enum_Loc); | 964 | printf ("Enum_Loc: %d\n", Enum_Loc); |
965 | printf (" should be: %d\n", 1); | 965 | printf (" should be: %d\n", 1); |
966 | printf ("Str_1_Loc: %s\n", Str_1_Loc); | 966 | printf ("Str_1_Loc: %s\n", Str_1_Loc); |
967 | printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); | 967 | printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); |
968 | printf ("Str_2_Loc: %s\n", Str_2_Loc); | 968 | printf ("Str_2_Loc: %s\n", Str_2_Loc); |
969 | printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); | 969 | printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); |
970 | printf ("\n"); | 970 | printf ("\n"); |
971 | */ | 971 | */ |
972 | User_Time = End_Time - Begin_Time; | 972 | User_Time = End_Time - Begin_Time; |
973 | 973 | ||
974 | if (User_Time < Too_Small_Time) return -1; | 974 | if (User_Time < Too_Small_Time) return -1; |
975 | else | 975 | else |
976 | { | 976 | { |
977 | Microseconds = User_Time * Mic_secs_Per_Second | 977 | Microseconds = User_Time * Mic_secs_Per_Second |
978 | / (double) Number_Of_Runs; | 978 | / (double) Number_Of_Runs; |
979 | Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time; | 979 | Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time; |
980 | Vax_Mips = Dhrystones_Per_Second / 1757.0; | 980 | Vax_Mips = Dhrystones_Per_Second / 1757.0; |
981 | 981 | ||
982 | #ifdef ROPT | 982 | #ifdef ROPT |
983 | //printf ("Register option selected? YES\n"); | 983 | //printf ("Register option selected? YES\n"); |
984 | #else | 984 | #else |
985 | //printf ("Register option selected? NO\n"); | 985 | //printf ("Register option selected? NO\n"); |
986 | strcpy(Reg_Define, "Register option not selected."); | 986 | strncpy(Reg_Define, "Register option not selected.", 30); |
987 | #endif | 987 | #endif |
988 | printf ("Microseconds for one run through Dhrystone: "); | 988 | printf ("Microseconds for one run through Dhrystone: "); |
989 | printf ("%7.1lf \n", Microseconds); | 989 | printf ("%7.1lf \n", Microseconds); |
990 | printf ("Dhrystones per Second: "); | 990 | printf ("Dhrystones per Second: "); |
991 | printf ("%10.1lf \n", Dhrystones_Per_Second); | 991 | printf ("%10.1lf \n", Dhrystones_Per_Second); |
992 | printf ("VAX MIPS rating = %10.3lf \n",Vax_Mips); | 992 | printf ("VAX MIPS rating = %10.3lf \n",Vax_Mips); |
993 | printf ("\n"); | 993 | printf ("\n"); |
994 | 994 | ||
995 | return Dhrystones_Per_Second; | 995 | return Dhrystones_Per_Second; |
996 | 996 | ||
997 | /* | 997 | /* |
998 | 998 | ||
999 | fprintf(Ap,"\n"); | 999 | fprintf(Ap,"\n"); |
1000 | fprintf(Ap,"Dhrystone Benchmark, Version 2.1 (Language: C)\n"); | 1000 | fprintf(Ap,"Dhrystone Benchmark, Version 2.1 (Language: C)\n"); |
1001 | fprintf(Ap,"%s\n",Reg_Define); | 1001 | fprintf(Ap,"%s\n",Reg_Define); |
1002 | fprintf(Ap,"Microseconds for one loop: %7.1lf\n",Microseconds); | 1002 | fprintf(Ap,"Microseconds for one loop: %7.1lf\n",Microseconds); |
1003 | fprintf(Ap,"Dhrystones per second: %10.1lf\n",Dhrystones_Per_Second); | 1003 | fprintf(Ap,"Dhrystones per second: %10.1lf\n",Dhrystones_Per_Second); |
1004 | fprintf(Ap,"VAX MIPS rating: %10.3lf\n",Vax_Mips); | 1004 | fprintf(Ap,"VAX MIPS rating: %10.3lf\n",Vax_Mips); |
1005 | fclose(Ap); | 1005 | fclose(Ap); |
1006 | */ | 1006 | */ |
1007 | 1007 | ||
1008 | } | 1008 | } |
1009 | 1009 | ||
1010 | } | 1010 | } |