aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDmitry Antipov2014-05-15 10:01:46 +0400
committerDmitry Antipov2014-05-15 10:01:46 +0400
commitc269148bf9a039edff92b1dd7a415d30c21d3087 (patch)
tree00a599d3a6b51ddceb51faddce5ef704c6a74e3e /src
parentb8e11d4102870e70dc50796454fcdae658caadbb (diff)
downloademacs-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/ChangeLog4
-rw-r--r--src/fns.c64
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 @@
12014-05-15 Dmitry Antipov <dmantipov@yandex.ru>
2
3 * fns.c (Freverse): Allow vectors, bool vectors and strings.
4
12014-05-14 Dmitry Antipov <dmantipov@yandex.ru> 52014-05-14 Dmitry Antipov <dmantipov@yandex.ru>
2 6
3 Minor cleanup for terminal setup. 7 Minor cleanup for terminal setup.
diff --git a/src/fns.c b/src/fns.c
index 53819ed23aa..8f9734cd7cc 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -1719,18 +1719,70 @@ Return the reversed list. Expects a properly nil-terminated list. */)
1719} 1719}
1720 1720
1721DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0, 1721DEFUN ("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.
1723See also the function `nreverse', which is used more often. */) 1723See 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