diff -Nru clearsilver-0.9.8/Makefile clearsilver-0.9.9/Makefile
--- clearsilver-0.9.8/Makefile	Mon Jan  5 02:36:11 2004
+++ clearsilver-0.9.9/Makefile	Fri May 14 17:37:39 2004
@@ -107,10 +107,15 @@
 		mkdir -p $$mdir; \
 	done
 
-CS_DISTDIR = clearsilver-0.9.7
-CS_LABEL = CLEARSILVER-0_9_7
+CS_DISTDIR = clearsilver-0.9.9
+CS_LABEL = CLEARSILVER-0_9_9
 CS_FILES = README README.python INSTALL LICENSE CS_LICENSE rules.mk.in Makefile util cs cgi python scripts mod_ecs imd java-jni perl ruby dso csharp acconfig.h autogen.sh config.guess config.sub configure.in cs_config.h.in mkinstalldirs install-sh ClearSilver.h ports contrib
 cs_dist:
+	@if cvs log Makefile | grep "${CS_LABEL}"; then \
+	  echo "release ${CS_LABEL} already exists"; \
+	  echo "   to rebuild, type:  cvs tag -d -F ${CS_LABEL} Makefile "; \
+	  exit 1; \
+	fi; 
 	rm -rf $(CS_DISTDIR)
 	cvs -q tag -F $(CS_LABEL) $(CS_FILES)
 	mkdir -p $(CS_DISTDIR)
diff -Nru clearsilver-0.9.8/cgi/html.c clearsilver-0.9.9/cgi/html.c
--- clearsilver-0.9.8/cgi/html.c	Thu Sep 11 19:02:40 2003
+++ clearsilver-0.9.9/cgi/html.c	Fri May 14 17:34:41 2004
@@ -435,7 +435,12 @@
 	}
 	err = string_append (out, "\">");
 	if (err != STATUS_OK) break;
-	err = html_escape_alloc(src + x, parts[i].end - x - suffix, &esc);
+        if (opts->link_name) {
+          err = html_escape_alloc(opts->link_name, strlen(opts->link_name), 
+              &esc);
+        } else {
+          err = html_escape_alloc(src + x, parts[i].end - x - suffix, &esc);
+        }
 	if (err != STATUS_OK) break;
 	err = string_append (out, esc);
 	free(esc);
diff -Nru clearsilver-0.9.8/cgi/html.h clearsilver-0.9.9/cgi/html.h
--- clearsilver-0.9.8/cgi/html.h	Thu Sep 11 18:33:02 2003
+++ clearsilver-0.9.9/cgi/html.h	Fri May 14 17:34:41 2004
@@ -27,6 +27,7 @@
     int newlines_convert;
     int longline_width;
     int check_ascii_art;
+    char *link_name;
 } HTML_CONVERT_OPTS;
 
 NEOERR *convert_text_html_alloc (unsigned char *src, int slen, unsigned char **out);
diff -Nru clearsilver-0.9.8/configure.in clearsilver-0.9.9/configure.in
--- clearsilver-0.9.8/configure.in	Tue Mar 16 01:43:46 2004
+++ clearsilver-0.9.9/configure.in	Tue Apr 20 10:10:27 2004
@@ -241,7 +241,7 @@
   AC_MSG_CHECKING(for python includes)
   python_inc=no
   python_search_path="/neo/opt /usr/local /usr /c"
-  python_versions="2.2 2.1 2.0 1.5 22 21 20 15"
+  python_versions="2.3 2.2 2.1 2.0 1.5 22 21 20 15"
   if test $cs_cv_python_path != "no" -a -x $cs_cv_python_path; then
     python_bin=$cs_cv_python_path
     vers=`$python_bin -c "import sys; print sys.version[[:3]]"`
diff -Nru clearsilver-0.9.8/python/neo_cgi.c clearsilver-0.9.9/python/neo_cgi.c
--- clearsilver-0.9.8/python/neo_cgi.c	Tue Mar 16 01:40:59 2004
+++ clearsilver-0.9.9/python/neo_cgi.c	Fri May 14 17:34:43 2004
@@ -412,7 +412,7 @@
   PyObject *rv;
   int len;
   HTML_CONVERT_OPTS opts;
-  static char *kwlist[] = {"text", "bounce_url", "url_class", "url_target", "mailto_class", "long_lines", "space_convert", "newlines_convert", "longline_width", "check_ascii_art", NULL};
+  static char *kwlist[] = {"text", "bounce_url", "url_class", "url_target", "mailto_class", "long_lines", "space_convert", "newlines_convert", "longline_width", "check_ascii_art", "link_name", NULL};
 
   /* These defaults all come from the old version */
   opts.bounce_url = NULL;
@@ -424,12 +424,13 @@
   opts.newlines_convert = 1;
   opts.longline_width = 75; /* This hasn't been used in a while, actually */
   opts.check_ascii_art = 1;
+  opts.link_name = NULL;
 
-  if (!PyArg_ParseTupleAndKeywords(args, keywds, "s#|ssssiiiii:text2html(text)", 
+  if (!PyArg_ParseTupleAndKeywords(args, keywds, "s#|ssssiiiiis:text2html(text)", 
 	kwlist, 
 	&s, &len, &(opts.bounce_url), &(opts.url_class), &(opts.url_target), 
 	&(opts.mailto_class), &(opts.long_lines), &(opts.space_convert), 
-	&(opts.newlines_convert), &(opts.longline_width), &(opts.check_ascii_art)))
+	&(opts.newlines_convert), &(opts.longline_width), &(opts.check_ascii_art)), &(opts.link_name))
     return NULL;
 
   err = convert_text_html_alloc_options (s, len, &esc, &opts);
diff -Nru clearsilver-0.9.8/util/neo_files.c clearsilver-0.9.9/util/neo_files.c
--- clearsilver-0.9.8/util/neo_files.c	Wed Apr  2 15:07:36 2003
+++ clearsilver-0.9.9/util/neo_files.c	Tue Apr 20 10:10:07 2004
@@ -62,7 +62,7 @@
   return STATUS_OK;
 }
 
-NEOERR *ne_load_file (char *path, char **str)
+NEOERR *ne_load_file_len (char *path, char **str, int *out_len)
 {
   struct stat s;
   int fd;
@@ -70,6 +70,7 @@
   int bytes_read;
 
   *str = NULL;
+  if (out_len) *out_len = 0;
 
   if (stat(path, &s) == -1)
   {
@@ -101,8 +102,13 @@
 
   (*str)[bytes_read] = '\0';
   close(fd);
+  if (out_len) *out_len = bytes_read;
 
   return STATUS_OK;
+}
+
+NEOERR *ne_load_file (char *path, char **str) {
+  return ne_load_file_len (path, str, NULL);
 }
 
 NEOERR *ne_save_file (char *path, char *str)
diff -Nru clearsilver-0.9.8/util/neo_files.h clearsilver-0.9.9/util/neo_files.h
--- clearsilver-0.9.8/util/neo_files.h	Wed Apr  2 15:07:36 2003
+++ clearsilver-0.9.9/util/neo_files.h	Tue Apr 20 10:10:08 2004
@@ -23,6 +23,7 @@
 
 NEOERR *ne_mkdirs (char *path, mode_t mode);
 NEOERR *ne_load_file (char *path, char **str);
+NEOERR *ne_load_file_len (char *path, char **str, int *len);
 NEOERR *ne_save_file (char *path, char *str);
 NEOERR *ne_remove_dir (char *path);
 NEOERR *ne_listdir(char *path, ULIST **files);
