string2 = SYMBOL_NAME (string2);
CHECK_STRING (string1);
CHECK_STRING (string2);
+ return string_version_cmp (string1, string2) < 0 ? Qt : Qnil;
+}
+/* Return negative, 0, positive if STRING1 is <, =, > STRING2 as per
+ string-version-lessp. */
+int
+string_version_cmp (Lisp_Object string1, Lisp_Object string2)
+{
char *p1 = SSDATA (string1);
char *p2 = SSDATA (string2);
char *lim1 = p1 + SBYTES (string1);
/* If the strings are identical through their first NUL bytes,
skip past identical prefixes and try again. */
ptrdiff_t size = strlen (p1) + 1;
+ eassert (size == strlen (p2) + 1);
p1 += size;
p2 += size;
- if (lim1 < p1)
- return lim2 < p2 ? Qnil : Qt;
- if (lim2 < p2)
- return Qnil;
+ bool more1 = p1 <= lim1;
+ bool more2 = p2 <= lim2;
+ if (!more1)
+ return more2;
+ if (!more2)
+ return -1;
}
- return cmp < 0 ? Qt : Qnil;
+ return cmp;
}
DEFUN ("string-collate-lessp", Fstring_collate_lessp, Sstring_collate_lessp, 2, 4, 0,
if (SYMBOLP (a->event) && SYMBOLP (b->event))
/* Sort the keystroke names in the "natural" way, with (for
instance) "<f2>" coming between "<f1>" and "<f11>". */
- return (!NILP (Fstring_version_lessp (a->event, b->event)) ? -1
- : !NILP (Fstring_version_lessp (b->event, a->event)) ? 1
- : 0);
+ return string_version_cmp (SYMBOL_NAME (a->event), SYMBOL_NAME (b->event));
return 0;
}
ptrdiff_t, ptrdiff_t);
extern Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object);
extern Lisp_Object do_yes_or_no_p (Lisp_Object);
+extern int string_version_cmp (Lisp_Object, Lisp_Object);
extern Lisp_Object concat2 (Lisp_Object, Lisp_Object);
extern Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
extern bool equal_no_quit (Lisp_Object, Lisp_Object);