fixing several bugs in string.find
so hard to get anything right the first time!
This commit is contained in:
		
							parent
							
								
									830e1c986c
								
							
						
					
					
						commit
						7e04bb948c
					
				| 
						 | 
					@ -248,15 +248,11 @@ value_t fl_string_find(value_t *args, u_int32_t nargs)
 | 
				
			||||||
    size_t len = cv_len((cvalue_t*)ptr(args[0]));
 | 
					    size_t len = cv_len((cvalue_t*)ptr(args[0]));
 | 
				
			||||||
    if (start > len)
 | 
					    if (start > len)
 | 
				
			||||||
        bounds_error("string.find", args[0], args[2]);
 | 
					        bounds_error("string.find", args[0], args[2]);
 | 
				
			||||||
    char *needle=NULL; size_t needlesz=0;
 | 
					    char *needle; size_t needlesz;
 | 
				
			||||||
    if (!iscvalue(args[1]))
 | 
					    if (!iscvalue(args[1]))
 | 
				
			||||||
        type_error("string.find", "string", args[1]);
 | 
					        type_error("string.find", "string", args[1]);
 | 
				
			||||||
    cvalue_t *cv = (cvalue_t*)ptr(args[1]);
 | 
					    cvalue_t *cv = (cvalue_t*)ptr(args[1]);
 | 
				
			||||||
    if (isstring(args[1])) {
 | 
					    if (cv_class(cv) == wchartype) {
 | 
				
			||||||
        needlesz = cv_len(cv);
 | 
					 | 
				
			||||||
        needle = (char*)cv_data(cv);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else if (cv_class(cv) == wchartype) {
 | 
					 | 
				
			||||||
        uint32_t c = *(uint32_t*)cv_data(cv);
 | 
					        uint32_t c = *(uint32_t*)cv_data(cv);
 | 
				
			||||||
        if (c <= 0x7f)
 | 
					        if (c <= 0x7f)
 | 
				
			||||||
            return mem_find_byte(s, (char)c, start, len);
 | 
					            return mem_find_byte(s, (char)c, start, len);
 | 
				
			||||||
| 
						 | 
					@ -266,14 +262,23 @@ value_t fl_string_find(value_t *args, u_int32_t nargs)
 | 
				
			||||||
    else if (cv_class(cv) == bytetype) {
 | 
					    else if (cv_class(cv) == bytetype) {
 | 
				
			||||||
        return mem_find_byte(s, *(char*)cv_data(cv), start, len);
 | 
					        return mem_find_byte(s, *(char*)cv_data(cv), start, len);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (needlesz == 0)
 | 
					    else if (isstring(args[1])) {
 | 
				
			||||||
        return fixnum(start);
 | 
					        needlesz = cv_len(cv);
 | 
				
			||||||
 | 
					        needle = (char*)cv_data(cv);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        type_error("string.find", "string", args[1]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (needlesz > len-start)
 | 
					    if (needlesz > len-start)
 | 
				
			||||||
        return NIL;
 | 
					        return NIL;
 | 
				
			||||||
 | 
					    else if (needlesz == 1)
 | 
				
			||||||
 | 
					        return mem_find_byte(s, needle[0], start, len);
 | 
				
			||||||
 | 
					    else if (needlesz == 0)
 | 
				
			||||||
 | 
					        return size_wrap(start);
 | 
				
			||||||
    size_t i;
 | 
					    size_t i;
 | 
				
			||||||
    for(i=start; i < len; i++) {
 | 
					    for(i=start; i < len-needlesz+1; i++) {
 | 
				
			||||||
        if (s[i] == needle[0]) {
 | 
					        if (s[i] == needle[0]) {
 | 
				
			||||||
            if (!memcmp(&s[i], needle, needlesz))
 | 
					            if (!memcmp(&s[i+1], needle+1, needlesz-1))
 | 
				
			||||||
                return size_wrap(i);
 | 
					                return size_wrap(i);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue