PERFORCE change 11776 for review

[email protected] (Chris Nandor) Tue, 28 Aug 2001 23:19:56 -0400
Newsgroups perl.perl5.changes.mac
Message-ID <p05100311b7b20fd628fa@[10.0.1.177]>
Change 11776 by pudge@pudge-mobile on 2001/08/29 02:11:42

	Allow for platforms to override formatting of errors
	on output from Matthias Neeracher (Mac files)

Affected files ...

... //depot/maint-5.6/macperl/macos/macish.c#4 edit
... //depot/maint-5.6/macperl/macos/macish.h#4 edit

Differences ...

==== //depot/maint-5.6/macperl/macos/macish.c#4 (text) ====
Index: perl/macos/macish.c
--- perl/macos/macish.c.~1~	Tue Aug 28 20:15:05 2001
+++ perl/macos/macish.c	Tue Aug 28 20:15:05 2001
@@ -787,3 +787,88 @@
 	if (strEQ(env, "PERL5DB"))
 		gMacPerl_Perl5DB = val;
 }
+
+static const char * strnstr(const char * msg, const char * str, size_t len)
+{
+	char s1 = *str++;
+	
+	while (len--)
+		if (*msg++ == s1) {
+			const char * s = str;
+			const char * m = msg;
+			
+			while (*s && *s == *m)
+				++s, ++m;
+			
+			if (!*s)
+				return msg-1;
+		}
+	return NULL;
+}
+
+static void WriteMsgLn(PerlIO * io, const char * msg, size_t len, Boolean start)
+{
+	if (start)
+		PerlIO_write(io, "# ", 2);
+	PerlIO_write(io, msg, len);
+}
+
+static void WriteMsg(PerlIO * io, const char * msg, size_t len, Boolean start)
+{
+	const char * nl;
+	
+	while (nl = (const char *)memchr(msg, '\n', len)) {
+		WriteMsgLn(io, msg, nl-msg+1, start);
+		start 	= true;
+		len		= msg+len-nl-1;
+		msg 	= nl+1;
+	}
+	if (len)
+		WriteMsgLn(io, msg, len, start);
+}
+
+void MacPerl_WriteMsg(void * io, const char * msg, size_t len)
+{
+	const char * line= msg;
+	const char * at;
+	
+	/* Look for " line \d" */
+	while (line = strnstr(line+1, " line ", msg+len-line-1)) {
+		if (line[6] >= '0' && line[6] <= '9') {
+			/* Got line, now look for end of line number */
+			const char * endline = line+7;
+			
+			while (*endline >= '0' && *endline <= '9')
+				++endline;
+			if (*endline == ' ')
+				++endline;
+			/* Got it, now look for preceding " at ." length reduced by 1 because file name
+			 * must be at least 1 character long.
+			 */
+			at	= strnstr(msg, " at ", line-msg-1);
+	
+			if (at) {
+				const char * anotherat;
+				
+				/* Look for intervening "at". This part gives misleading results if the filename
+				 * itself contains an at.
+				 */
+				while (anotherat = strnstr(at+4, " at ", line-at-5))
+					at = anotherat;
+					
+				/* OK, we got them both, write the original message prefixed with # */
+				WriteMsg(io, msg, at-msg, true);
+				WriteMsg(io, endline, msg+len-endline, false);
+				PerlIO_write(io, "File \'", 6);
+				PerlIO_write(io, at+4, line-at-4);
+				PerlIO_write(io, "\'; Line ", 8);
+				PerlIO_write(io, line+6, endline-line-6);
+				PerlIO_write(io, "\n", 1);
+				
+				return;
+			}
+		}
+	}
+	/* No file/line found */
+	WriteMsg(io, msg, len, true);
+}

==== //depot/maint-5.6/macperl/macos/macish.h#4 (text) ====
Index: perl/macos/macish.h
--- perl/macos/macish.h.~1~	Tue Aug 28 20:15:05 2001
+++ perl/macos/macish.h	Tue Aug 28 20:15:05 2001
@@ -74,6 +74,7 @@
 char * GetSysErrText(short, char *);
 unsigned char * MacPerl_CopyC2P(const char * c, unsigned char * p);
 const char * MacPerl_CanonDir(const char * dir, char * buf);
+void MacPerl_WriteMsg(void * io, const char * msg, size_t len);
 
 /* These defined following should be defined in 5.8 in config.h */
 #define HAS_USLEEP
@@ -204,6 +205,8 @@
 #define PERL_SYS_TERM()		MALLOC_TERM
 #endif
 
+#define PERL_WRITE_MSG_TO_CONSOLE(io, msg, len) MacPerl_WriteMsg(io, msg, len)
+
 #define BIT_BUCKET "Dev:Null"
 
 #define dXSUB_SYS
End of Patch.