emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r116918: * fns.c (Fsubstring, Fsubstring_no_properti


From: Dmitry Antipov
Subject: [Emacs-diffs] trunk r116918: * fns.c (Fsubstring, Fsubstring_no_properties, secure_hash):
Date: Mon, 31 Mar 2014 12:07:27 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 116918
revision-id: address@hidden
parent: address@hidden
committer: Dmitry Antipov <address@hidden>
branch nick: trunk
timestamp: Mon 2014-03-31 16:06:34 +0400
message:
  * fns.c (Fsubstring, Fsubstring_no_properties, secure_hash):
  Move common substring range checking code to...
  (validate_substring): ...this function.
modified:
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/fns.c                      fns.c-20091113204419-o5vbwnq5f7feedwu-203
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2014-03-31 07:13:58 +0000
+++ b/src/ChangeLog     2014-03-31 12:06:34 +0000
@@ -3,6 +3,9 @@
        * search.c (Freplace_match): Use make_specified_string.
        * xterm.c, w32term.c (x_set_glyph_string_gc): Use emacs_abort
        to catch bogus override face of glyph strings.
+       * fns.c (Fsubstring, Fsubstring_no_properties, secure_hash):
+       Move common substring range checking code to...
+       (validate_substring): ...this function.
 
 2014-03-31  Jan Djärv  <address@hidden>
 

=== modified file 'src/fns.c'
--- a/src/fns.c 2014-03-23 21:58:19 +0000
+++ b/src/fns.c 2014-03-31 12:06:34 +0000
@@ -1127,7 +1127,39 @@
   return alist;
 }
 
-DEFUN ("substring", Fsubstring, Ssubstring, 2, 3, 0,
+/* True if [FROM..TO) specifies a valid substring of SIZE-characters string.
+   If FROM is nil, 0 assumed.  If TO is nil, SIZE assumed.  Negative
+   values are counted from the end.  *FROM_CHAR and *TO_CHAR are updated
+   with corresponding C values of TO and FROM.  */
+
+static bool
+validate_substring (Lisp_Object from, Lisp_Object to, ptrdiff_t size,
+                   EMACS_INT *from_char, EMACS_INT *to_char)
+{
+  if (NILP (from))
+    *from_char = 0;
+  else
+    {
+      CHECK_NUMBER (from);
+      *from_char = XINT (from);
+      if (*from_char < 0)
+       *from_char += size;
+    }
+
+  if (NILP (to))
+    *to_char = size;
+  else
+    {
+      CHECK_NUMBER (to);
+      *to_char = XINT (to);
+      if (*to_char < 0)
+       *to_char += size;
+    }
+
+  return (0 <= *from_char && *from_char <= *to_char && *to_char <= size);
+}
+
+DEFUN ("substring", Fsubstring, Ssubstring, 1, 3, 0,
        doc: /* Return a new string whose contents are a substring of STRING.
 The returned string consists of the characters between index FROM
 \(inclusive) and index TO (exclusive) of STRING.  FROM and TO are
@@ -1137,36 +1169,23 @@
 
 The STRING argument may also be a vector.  In that case, the return
 value is a new vector that contains the elements between index FROM
-\(inclusive) and index TO (exclusive) of that vector argument.  */)
-  (Lisp_Object string, register Lisp_Object from, Lisp_Object to)
+\(inclusive) and index TO (exclusive) of that vector argument.
+
+With one argument, just copy STRING (with properties, if any).  */)
+  (Lisp_Object string, Lisp_Object from, Lisp_Object to)
 {
   Lisp_Object res;
   ptrdiff_t size;
   EMACS_INT from_char, to_char;
 
-  CHECK_VECTOR_OR_STRING (string);
-  CHECK_NUMBER (from);
-
   if (STRINGP (string))
     size = SCHARS (string);
-  else
+  else if (VECTORP (string))
     size = ASIZE (string);
-
-  if (NILP (to))
-    to_char = size;
   else
-    {
-      CHECK_NUMBER (to);
-
-      to_char = XINT (to);
-      if (to_char < 0)
-       to_char += size;
-    }
-
-  from_char = XINT (from);
-  if (from_char < 0)
-    from_char += size;
-  if (!(0 <= from_char && from_char <= to_char && to_char <= size))
+    wrong_type_argument (Qarrayp, string);
+  
+  if (!validate_substring (from, to, size, &from_char, &to_char))
     args_out_of_range_3 (string, make_number (from_char),
                         make_number (to_char));
 
@@ -1206,27 +1225,7 @@
 
   size = SCHARS (string);
 
-  if (NILP (from))
-    from_char = 0;
-  else
-    {
-      CHECK_NUMBER (from);
-      from_char = XINT (from);
-      if (from_char < 0)
-       from_char += size;
-    }
-
-  if (NILP (to))
-    to_char = size;
-  else
-    {
-      CHECK_NUMBER (to);
-      to_char = XINT (to);
-      if (to_char < 0)
-       to_char += size;
-    }
-
-  if (!(0 <= from_char && from_char <= to_char && to_char <= size))
+  if (!validate_substring (from, to, size, &from_char, &to_char))
     args_out_of_range_3 (string, make_number (from_char),
                         make_number (to_char));
 
@@ -4614,29 +4613,7 @@
 
       size = SCHARS (object);
 
-      if (!NILP (start))
-       {
-         CHECK_NUMBER (start);
-
-         start_char = XINT (start);
-
-         if (start_char < 0)
-           start_char += size;
-       }
-
-      if (NILP (end))
-       end_char = size;
-      else
-       {
-         CHECK_NUMBER (end);
-
-         end_char = XINT (end);
-
-         if (end_char < 0)
-           end_char += size;
-       }
-
-      if (!(0 <= start_char && start_char <= end_char && end_char <= size))
+      if (!validate_substring (start, end, size, &start_char, &end_char))
        args_out_of_range_3 (object, make_number (start_char),
                             make_number (end_char));
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]