diff options
| author | Dmitry Antipov | 2014-05-15 10:01:46 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2014-05-15 10:01:46 +0400 |
| commit | c269148bf9a039edff92b1dd7a415d30c21d3087 (patch) | |
| tree | 00a599d3a6b51ddceb51faddce5ef704c6a74e3e /src | |
| parent | b8e11d4102870e70dc50796454fcdae658caadbb (diff) | |
| download | emacs-c269148bf9a039edff92b1dd7a415d30c21d3087.tar.gz emacs-c269148bf9a039edff92b1dd7a415d30c21d3087.zip | |
* src/fns.c (Freverse): Allow vectors, bool vectors and strings.
* doc/lispref/lists.texi (Building Cons Cells and Lists): Remove
description of `reverse' and generalize it...
* doc/lispref/sequences.texi (Sequences): ...for sequences here.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 4 | ||||
| -rw-r--r-- | src/fns.c | 64 |
2 files changed, 62 insertions, 6 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index e78a32c26ca..ce51b26cf43 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | 2014-05-15 Dmitry Antipov <dmantipov@yandex.ru> | ||
| 2 | |||
| 3 | * fns.c (Freverse): Allow vectors, bool vectors and strings. | ||
| 4 | |||
| 1 | 2014-05-14 Dmitry Antipov <dmantipov@yandex.ru> | 5 | 2014-05-14 Dmitry Antipov <dmantipov@yandex.ru> |
| 2 | 6 | ||
| 3 | Minor cleanup for terminal setup. | 7 | Minor cleanup for terminal setup. |
| @@ -1719,18 +1719,70 @@ Return the reversed list. Expects a properly nil-terminated list. */) | |||
| 1719 | } | 1719 | } |
| 1720 | 1720 | ||
| 1721 | DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0, | 1721 | DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0, |
| 1722 | doc: /* Reverse LIST, copying. Return the reversed list. | 1722 | doc: /* Return the reversed copy of list, vector, or string SEQ. |
| 1723 | See also the function `nreverse', which is used more often. */) | 1723 | See also the function `nreverse', which is used more often. */) |
| 1724 | (Lisp_Object list) | 1724 | (Lisp_Object seq) |
| 1725 | { | 1725 | { |
| 1726 | Lisp_Object new; | 1726 | Lisp_Object new; |
| 1727 | 1727 | ||
| 1728 | for (new = Qnil; CONSP (list); list = XCDR (list)) | 1728 | if (NILP (seq)) |
| 1729 | return Qnil; | ||
| 1730 | else if (CONSP (seq)) | ||
| 1729 | { | 1731 | { |
| 1730 | QUIT; | 1732 | for (new = Qnil; CONSP (seq); seq = XCDR (seq)) |
| 1731 | new = Fcons (XCAR (list), new); | 1733 | { |
| 1734 | QUIT; | ||
| 1735 | new = Fcons (XCAR (seq), new); | ||
| 1736 | } | ||
| 1737 | CHECK_LIST_END (seq, seq); | ||
| 1738 | } | ||
| 1739 | else if (VECTORP (seq)) | ||
| 1740 | { | ||
| 1741 | ptrdiff_t i, size = ASIZE (seq); | ||
| 1742 | |||
| 1743 | new = make_uninit_vector (size); | ||
| 1744 | for (i = 0; i < size; i++) | ||
| 1745 | ASET (new, i, AREF (seq, size - i - 1)); | ||
| 1732 | } | 1746 | } |
| 1733 | CHECK_LIST_END (list, list); | 1747 | else if (BOOL_VECTOR_P (seq)) |
| 1748 | { | ||
| 1749 | ptrdiff_t i; | ||
| 1750 | EMACS_INT nbits = bool_vector_size (seq); | ||
| 1751 | |||
| 1752 | new = make_uninit_bool_vector (nbits); | ||
| 1753 | for (i = 0; i < nbits; i++) | ||
| 1754 | bool_vector_set (new, i, bool_vector_bitref (seq, nbits - i - 1)); | ||
| 1755 | } | ||
| 1756 | else if (STRINGP (seq)) | ||
| 1757 | { | ||
| 1758 | ptrdiff_t size = SCHARS (seq), bytes = SBYTES (seq); | ||
| 1759 | |||
| 1760 | if (size == bytes) | ||
| 1761 | { | ||
| 1762 | ptrdiff_t i; | ||
| 1763 | |||
| 1764 | new = make_uninit_string (size); | ||
| 1765 | for (i = 0; i < size; i++) | ||
| 1766 | SSET (new, i, SREF (seq, size - i - 1)); | ||
| 1767 | } | ||
| 1768 | else | ||
| 1769 | { | ||
| 1770 | unsigned char *p, *q; | ||
| 1771 | |||
| 1772 | new = make_uninit_multibyte_string (size, bytes); | ||
| 1773 | p = SDATA (seq), q = SDATA (new) + bytes; | ||
| 1774 | while (q > SDATA (new)) | ||
| 1775 | { | ||
| 1776 | int ch, len; | ||
| 1777 | |||
| 1778 | ch = STRING_CHAR_AND_LENGTH (p, len); | ||
| 1779 | p += len, q -= len; | ||
| 1780 | CHAR_STRING (ch, q); | ||
| 1781 | } | ||
| 1782 | } | ||
| 1783 | } | ||
| 1784 | else | ||
| 1785 | wrong_type_argument (Qsequencep, seq); | ||
| 1734 | return new; | 1786 | return new; |
| 1735 | } | 1787 | } |
| 1736 | 1788 | ||