Fix range error (doc and impl of re_search disagreed!)
Use getargs() function.
Drop re_string from re object.
diff --git a/Modules/regexmodule.c b/Modules/regexmodule.c
index 1fb3573..c6d559e 100644
--- a/Modules/regexmodule.c
+++ b/Modules/regexmodule.c
@@ -41,7 +41,6 @@
 
 typedef struct {
 	OB_HEAD
-	object *re_string;	/* The string (for printing) */
 	struct re_pattern_buffer re_patbuf; /* The compiled expression */
 	struct re_registers re_regs; /* The registers from the last match */
 	int re_regs_valid;	/* Nonzero if the registers are valid */
@@ -54,7 +53,6 @@
 reg_dealloc(re)
 	regexobject *re;
 {
-	XDECREF(re->re_string);
 	XDEL(re->re_patbuf.buffer);
 	XDEL(re->re_patbuf.translate);
 	DEL(re);
@@ -91,18 +89,19 @@
 {
 	object *v;
 	char *buffer;
+	int size;
 	int offset;
 	int result;
-	if (args != NULL && is_stringobject(args)) {
-		v = args;
+	if (getargs(args, "s#", &buffer, &size)) {
 		offset = 0;
 	}
-	else if (!getstrintarg(args, &v, &offset))
-		return NULL;
-	buffer = getstringvalue(v);
+	else {
+		err_clear();
+		if (!getargs(args, "(s#i)", &buffer, &size, &offset))
+			return NULL;
+	}
 	re->re_regs_valid = 0;
-	result = re_match(&re->re_patbuf, buffer, getstringsize(v),
-			  offset, &re->re_regs);
+	result = re_match(&re->re_patbuf, buffer, size, offset, &re->re_regs);
 	if (result < -1) {
 		/* Failure like stack overflow */
 		err_setstr(RegexError, "match failure");
@@ -111,6 +110,7 @@
 	re->re_regs_valid = result >= 0;
 	return newintobject((long)result); /* Length of the match or -1 */
 }
+
 static object *
 reg_search(re, args)
 	regexobject *re;
@@ -122,18 +122,23 @@
 	int offset;
 	int range;
 	int result;
-	if (args != NULL && is_stringobject(args)) {
-		v = args;
+	
+	if (getargs(args, "s#", &buffer, &size)) {
 		offset = 0;
 	}
-	else if (!getstrintarg(args, &v, &offset))
-		return NULL;
-	buffer = getstringvalue(v);
-	size = getstringsize(v);
+	else {
+		err_clear();
+		if (!getargs(args, "(s#i)", &buffer, &size, &offset))
+			return NULL;
+	}
 	if (offset < 0 || offset > size) {
 		err_setstr(RegexError, "search offset out of range");
 		return NULL;
 	}
+	/* NB: In Emacs 18.57, the documentation for re_search[_2] and
+	   the implementation don't match: the documentation states that
+	   |range| positions are tried, while the code tries |range|+1
+	   positions.  It seems more productive to believe the code! */
 	range = size - offset;
 	re->re_regs_valid = 0;
 	result = re_search(&re->re_patbuf, buffer, size, offset, range,
@@ -184,31 +189,28 @@
 	0,			/*tp_repr*/
 };
 
-static regexobject *
-newregexobject(string)
-	object *string;
+static object *
+newregexobject(pat, size)
+	char *pat;
+	int size;
 {
 	regexobject *re;
 	re = NEWOBJ(regexobject, &Regextype);
 	if (re != NULL) {
 		char *error;
-		INCREF(string);
-		re->re_string = string;
 		re->re_patbuf.buffer = NULL;
 		re->re_patbuf.allocated = 0;
 		re->re_patbuf.fastmap = re->re_fastmap;
 		re->re_patbuf.translate = NULL;
 		re->re_regs_valid = 0;
-		error = re_compile_pattern(getstringvalue(string),
-					   getstringsize(string),
-					   &re->re_patbuf);
+		error = re_compile_pattern(pat, size, &re->re_patbuf);
 		if (error != NULL) {
 			err_setstr(RegexError, error);
 			DECREF(re);
 			re = NULL;
 		}
 	}
-	return re;
+	return (object *)re;
 }
 
 static object *
@@ -216,10 +218,11 @@
 	object *self;
 	object *args;
 {
-	object *string;
-	if (!getstrarg(args, &string))
+	char *pat;
+	int size;
+	if (!getargs(args, "s#", &pat, &size))
 		return NULL;
-	return (object *)newregexobject(string);
+	return newregexobject(pat, size);
 }
 
 static object *cache_pat;
@@ -248,7 +251,7 @@
 	object *args;
 {
 	object *pat, *string;
-	if (!getstrstrarg(args, &pat, &string))
+	if (!getStrStrarg(args, &pat, &string))
 		return NULL;
 	if (update_cache(pat) < 0)
 		return NULL;
@@ -261,7 +264,7 @@
 	object *args;
 {
 	object *pat, *string;
-	if (!getstrstrarg(args, &pat, &string))
+	if (!getStrStrarg(args, &pat, &string))
 		return NULL;
 	if (update_cache(pat) < 0)
 		return NULL;