浏览代码

'$' at end of pattern was matching regular '$', too.

Roberto Ierusalimschy 26 年之前
父节点
当前提交
cc0f635ef7
共有 2 个文件被更改,包括 24 次插入7 次删除
  1. 17 2
      bugs
  2. 7 5
      lstrlib.c

+ 17 - 2
bugs

@@ -4,6 +4,7 @@ Tue Dec  2 10:45:48 EDT 1997
 >> started only in the 2nd line of a function.
 
 
+
 --- Version 3.1 alpha
 
 ** lua.c
@@ -13,7 +14,7 @@ Thu Jan 15 14:34:58 EDT 1998
 ** lbuiltin.c / lobject.h
 Thu Jan 15 14:34:58 EDT 1998
 >> MAX_WORD may be bigger than MAX_INT
-
+(by lhf)
 
 ** llex.c
 Mon Jan 19 18:17:18 EDT 1998
@@ -42,6 +43,7 @@ Mon May 18 19:20:00 EST 1998
 >> arguments for "format" 'x', 'X', 'o' and 'u' must be unsigned int.
 
 
+
 --- Version 3.1
 
 ** liolib.c / lauxlib.c
@@ -52,11 +54,13 @@ of view) when functions have upvalues.
 ** lstrlib.c
 Tue Nov 10 17:29:36 EDT 1998
 >> gsub/strfind do not check whether captures are properly finished.
+(by roberto/tomas)
 
 ** lbuiltin.c
 Fri Dec 18 11:22:55 EDT 1998
 >> "tonumber" goes crazy with negative numbers in other bases (not 10),
 because "strtol" returns long, not unsigned long.
+(by Visual C++)
 
 ** lstrlib.c
 Mon Jan  4 10:41:40 EDT 1999
@@ -70,8 +74,19 @@ lua_isnumber can modify it.
 ** lstrlib.c
 Thu Feb  4 17:08:50 EDT 1999
 >> format "%s" may break limit of "sprintf" on some machines.
-
+(by Marcelo Sales)
 
 ** lzio.c
 Thu Mar  4 11:49:37 EST 1999
 >> file stream cannot call fread after EOF.
+(by lhf)
+
+
+
+--- Version 3.2 (beta)
+
+** lstrlib.c
+Fri Apr 30 11:10:20 EST 1999
+>> '$' at end of pattern was matching regular '$', too.
+(by anna)
+

+ 7 - 5
lstrlib.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lstrlib.c,v 1.27 1999/02/25 19:13:56 roberto Exp roberto $
+** $Id: lstrlib.c,v 1.28 1999/02/26 15:49:53 roberto Exp roberto $
 ** Standard library for strings and pattern-matching
 ** See Copyright Notice in lua.h
 */
@@ -285,10 +285,12 @@ static char *match (char *s, char *p, struct Capture *cap) {
         cap->capture[l].len = -1;  /* undo capture */
       return res;
     }
-    case '\0': case '$':  /* (possibly) end of pattern */
-      if (*p == 0 || (*(p+1) == 0 && s == cap->src_end))
-        return s;
-      /* else go through */
+    case '\0':  /* end of pattern */
+      return s;  /* match succeeded */
+    case '$':
+      if (*(p+1) == '\0')  /* is the '$' the last char in pattern? */
+        return (s == cap->src_end) ? s : NULL;  /* check end of string */
+      /* else is a regular '$'; go through */
     default: {  /* it is a pattern item */
       char *ep;  /* will point to what is next */
       char *s1 = matchitem(s, p, cap, &ep);