[Debburn-changes] r460 - in cdrkit/trunk: genisoimage icedax

Eduard Bloch blade at alioth.debian.org
Fri Nov 24 01:39:07 CET 2006


Author: blade
Date: 2006-11-24 01:39:06 +0100 (Fri, 24 Nov 2006)
New Revision: 460

Modified:
   cdrkit/trunk/genisoimage/genisoimage.h
   cdrkit/trunk/icedax/toc.c
Log:
Lorinders code, actually...

Modified: cdrkit/trunk/genisoimage/genisoimage.h
===================================================================
--- cdrkit/trunk/genisoimage/genisoimage.h	2006-11-24 00:16:11 UTC (rev 459)
+++ cdrkit/trunk/genisoimage/genisoimage.h	2006-11-24 00:39:06 UTC (rev 460)
@@ -548,7 +548,7 @@
 extern	void	convert_to_unicode	(unsigned char *buffer,
 			int size, char *source, struct unls_table *inls);
 #   endif
-extern	int	joliet_strlen		__PR((const char *string, struct unls_table *inls));
+extern	int	joliet_strlen	(const char *string, struct unls_table *inls);
 #endif
 extern unsigned char conv_charset(unsigned char, struct unls_table *,
 											 struct unls_table *);

Modified: cdrkit/trunk/icedax/toc.c
===================================================================
--- cdrkit/trunk/icedax/toc.c	2006-11-24 00:16:11 UTC (rev 459)
+++ cdrkit/trunk/icedax/toc.c	2006-11-24 00:39:06 UTC (rev 460)
@@ -1556,35 +1556,65 @@
 "ÿ",
 };
 
-static char *ascii2html(unsigned char *inp);
-
 static char *ascii2html(unsigned char *inp)
 {
-	static unsigned char outline[300];
-	unsigned char *outp = outline;
+	static size_t buflen = 256;
+	static char *outline = 0;
+	size_t pos = 0;
 
-#define copy_translation(a,b) else if (*inp == (a)) \
-{ strcpy((char *)outp, (b)); outp += sizeof((b))-1; }
+	/* init */
+	if(!outline) {
+		outline = malloc(buflen);
+		if(outline == 0) {
+			fprintf(stderr, "error: memory exhausted\n");
+			_exit(EXIT_FAILURE);
+		}
+	}
 
+	outline[pos] = '\0';
+
 	while (*inp != '\0') {
-		if (0) ;
-		copy_translation('"', """)
-		copy_translation('&', "&")
-		copy_translation('<', "&lt;")
-		copy_translation('>', "&gt;")
-		copy_translation(160, "&nbsp;")
-		else if (*inp < 192) {
-			*outp++ = *inp;
-		} else {
-			strcpy((char *)outp, a2h[*inp-192]);
-			outp += strlen(a2h[*inp-192]);
+
+		/* Pick the sequence to insert */
+		const char *insert;
+		char b[2];
+		const int c = (unsigned char)*inp;
+		switch(c) {
+			case '"':	insert = "&quot;";	break;
+			case '&':	insert = "&amp;";	break;
+			case '<':	insert = "&lt;";	break;
+			case '>':	insert = "&gt;";	break;
+			case 160:	insert = "&nbsp;";	break;
+			default: {
+					 if(c < 192) {
+						 b[0] = c;
+						 b[1] = '\0';
+						 insert = b;
+					 } else {
+						 insert = a2h[c - 192];
+					 }
+				 }
+		};
+
+		/* Resize buffer */
+		const size_t l = strlen(insert);
+		while(pos + l + 1 >= buflen) {
+			outline = realloc(outline, buflen *= 2);
+			if(outline == 0) {
+				fprintf(stderr, "error: memory exhausted\n");
+				_exit(EXIT_FAILURE);
+			}
 		}
-		inp++;
+
+		/* Copy in */
+		strcpy(&outline[pos], insert);
+		pos += l;
+
+		++inp;
 	}
-	*outp = '\0';
-	return (char *) outline;
+
+	return outline;
 }
-#undef copy_translation
 
 static void emit_cdindex_form(char *fname_baseval)
 {




More information about the Debburn-changes mailing list