Index: src/table.c
===================================================================
--- src/table.c	(revision 1512)
+++ src/table.c	(working copy)
@@ -30,16 +30,11 @@
 #include "table.h"
 
 /* Table info. */
-#ifdef TABLE_MAIN
-#define VTE_TABLE_MAX_NUMERIC_DEPTH 5
-#else
-#define VTE_TABLE_MAX_NUMERIC_DEPTH 16
-#endif
 #define VTE_TABLE_MAX_LITERAL (128 + 32)
 #define _vte_table_map_literal(__c) \
 	(((__c) < (VTE_TABLE_MAX_LITERAL)) ? (__c) : 0)
 #define _vte_table_is_numeric(__c) \
-	(((__c) >= '0') && ((__c) <= '9'))
+	((((__c) >= '0') && ((__c) <= '9')) || (__c) == ';')
 
 struct _vte_table {
 	struct _vte_matcher_impl impl;
@@ -200,34 +195,14 @@
 						b->len - initial,
 						result, quark, inc);
 			}
-			for (i = 1;
-			     i <= VTE_TABLE_MAX_NUMERIC_DEPTH;
-			     i++) {
-				g_byte_array_set_size(b, 0);
-				g_byte_array_append(b, original, initial);
-				for (j = 1; j <= i; j++) {
-					if (j > 1) {
-						g_byte_array_append(b, ";", 1);
-					}
-					g_byte_array_append(b, "%d", 2);
-				}
-				g_byte_array_append(b, pattern + 2, length - 2);
-				_vte_table_addi(table,
-						b->data, b->len,
-						b->data + initial, b->len - initial,
-						result, quark, inc);
-				g_byte_array_set_size(b, 0);
-				g_byte_array_append(b, original, initial);
-				for (j = 1; j <= i; j++) {
-					g_byte_array_append(b, ";", 1);
-					g_byte_array_append(b, "%d", 2);
-				}
-				g_byte_array_append(b, pattern + 2, length - 2);
-				_vte_table_addi(table,
-						b->data, b->len,
-						b->data + initial, b->len - initial,
-						result, quark, inc);
-			}
+			g_byte_array_set_size(b, 0);
+			g_byte_array_append(b, original, initial);
+			g_byte_array_append(b, "%d", 2);
+			g_byte_array_append(b, pattern + 2, length - 2);
+			_vte_table_addi(table,
+					b->data, b->len,
+					b->data + initial, b->len - initial,
+					result, quark, inc);
 			g_byte_array_free(b, TRUE);
 			return;
 		}
@@ -449,39 +424,32 @@
 {
 	GValue value = {0,};
 	GString *tmp;
-	char **vals;
-	int i, j;
+	char *str;
+	int i;
 	long total;
 
 	tmp = g_string_new(NULL);
 	for (i = 0; i < arginfo->length; i++) {
 		tmp = g_string_append_unichar(tmp, arginfo->start[i]);
 	}
+	str = g_string_free(tmp, FALSE);
 
-	vals = g_strsplit(tmp->str, ";", -1);
-
-	if (vals != NULL) {
-		g_value_init(&value, G_TYPE_LONG);
-
-		for (i = 0; vals[i] != NULL; i++) {
-			if (*array == NULL) {
-				*array = g_value_array_new(1);
-			}
-			for (total = 0, j = 0; vals[i][j] != '\0'; j++) {
-				total *= 10;
-				total += g_unichar_digit_value(vals[i][j]) == -1 ?
-					 0 : g_unichar_digit_value(vals[i][j]);
-			}
-			g_value_set_long(&value, total);
-			g_value_array_append(*array, &value);
+	g_value_init(&value, G_TYPE_LONG);
+	i = 0;
+	do {
+		for (total = 0; !(str[i] == '\0' || str[i] == ';'); i++) {
+			total *= 10;
+			total += g_unichar_digit_value(str[i]) == -1 ?
+				0 : g_unichar_digit_value(str[i]);
 		}
+		if (*array == NULL) {
+			*array = g_value_array_new(1);
+		}
+		g_value_set_long(&value, total);
+		g_value_array_append(*array, &value);
+	} while (str[i++] != '\0');
 
-		g_strfreev(vals);
-
-		g_value_unset(&value);
-	}
-
-	g_string_free(tmp, TRUE);
+	g_value_unset(&value);
 }
 
 static void
