diff string.c @ 3:94c885692eb5

Partial set of fixes and enhancements from Linux box
author Mike Pavone <pavone@retrodev.com>
date Wed, 29 Apr 2009 03:21:23 -0400
parents 76568becd6d6
children 3cc5e4a42344
line wrap: on
line diff
--- a/string.c	Wed Apr 29 02:58:03 2009 -0400
+++ b/string.c	Wed Apr 29 03:21:23 2009 -0400
@@ -141,7 +141,8 @@
 	if(len < 0)
 		len = strlen(string);
 	output = new_datum(BUILTIN_TYPE_STRING, 1, len+1, prog);
-	memcpy(output->c.generic.data, string, len);
+	if(string)
+		memcpy(output->c.generic.data, string, len);
 	((char *)output->c.generic.data)[len] = '\0';
 	return output;
 }
@@ -313,6 +314,7 @@
 	else
 	{
 		ERRORPUTS("Second argument to Get DString@String must be either a String or a List");
+		print_stack_trace(worker_entry->instance);
 		release_ref(inputlist[0]);
 		release_ref(inputlist[1]);
 		return -1;
@@ -358,3 +360,57 @@
 	}
 	return 0;
 }
+
+int vis_string_lefttrim(datum ** params, queue_entry * entry)
+{
+	BOOL isatrimchar;
+	int i,j;
+	char *string,*trim_chars;
+	string = params[0]->c.generic.data;
+	trim_chars = params[1]->c.generic.data;
+	isatrimchar = TRUE;
+	for(i = 0; i < params[0]->c.generic.len-1; ++i)
+	{
+		isatrimchar = FALSE;
+		for(j = 0; j < params[1]->c.generic.len-1; ++j)
+			if(string[i] == trim_chars[j])
+			{
+				isatrimchar = TRUE;
+				break;
+			}
+		if(!isatrimchar)
+			break;
+	}
+	release_ref(params[1]);
+	params[1] = params[0];
+	params[0] = make_string(string+i, params[1]->c.generic.len-1-i, entry->instance->def->program);
+	release_ref(params[1]);
+	return 0;
+}
+
+int vis_string_righttrim(datum ** params, queue_entry * entry)
+{
+	BOOL isatrimchar;
+	int i,j;
+	char *string,*trim_chars;
+	string = params[0]->c.generic.data;
+	trim_chars = params[1]->c.generic.data;
+	isatrimchar = TRUE;
+	for(i = params[0]->c.generic.len-2; i >= 0 ; --i)
+	{
+		isatrimchar = FALSE;
+		for(j = 0; j < params[1]->c.generic.len-1; ++j)
+			if(string[i] == trim_chars[j])
+			{
+				isatrimchar = TRUE;
+				break;
+			}
+		if(!isatrimchar)
+			break;
+	}
+	release_ref(params[1]);
+	params[1] = params[0];
+	params[0] = make_string(string, i+1, entry->instance->def->program);
+	release_ref(params[1]);
+	return 0;
+}
\ No newline at end of file