Index: /cpp/common/framsg.cpp
===================================================================
--- /cpp/common/framsg.cpp	(revision 243)
+++ /cpp/common/framsg.cpp	(revision 244)
@@ -9,4 +9,33 @@
 
 const char* MSG_LEVEL[]={"DEBUG","INFO","WARN","ERROR","CRITICAL"};
+
+void FramMessage(const char *o, const char *m, const char *txt, int w)
+{
+	int line = 0; //all lines except the first one get the "..." prefix
+	const char* nextsep;
+	do
+	{
+		nextsep = strchr(txt, '\n');
+		if (nextsep == NULL) //last chunk, until the end
+			nextsep = strchr(txt, '\0');
+		if ((nextsep > txt) && (nextsep[-1] == '\r'))
+			nextsep--;
+		if (line == 0)
+		{
+			if (*nextsep == 0) //there was only one line! no need to modify it in any way.
+				_FramMessageSingleLine(o, m, txt, w);
+			else //first line from multi-line
+				_FramMessageSingleLine(o, m, string(txt, nextsep - txt).c_str(), w);
+		}
+		else //consecutive lines from multi-line
+			_FramMessageSingleLine(o, m, ("..." + string(txt, nextsep - txt)).c_str(), w); //could also add line numbers like ...(3)... but let's keep the prefix short and simple
+		line++;
+		if ((nextsep[0] == '\r') && (nextsep[1] == '\n'))
+			txt = nextsep + 2;
+		else if (*nextsep)
+			txt = nextsep + 1;
+	} while (*nextsep);
+}
+
 
 void FMprintf_va(const char *o,const char *m,int w,const char *bl,va_list va)
Index: /cpp/common/framsg.h
===================================================================
--- /cpp/common/framsg.h	(revision 243)
+++ /cpp/common/framsg.h	(revision 244)
@@ -13,5 +13,7 @@
 void FMprintf_va(const char *o,const char *m,int w,const char *bl,va_list va); //a different name than FMprintf - otherwise the compiler could confuse the "string" parameter with va_list and could call the wrong function
 void printFM(const char *bl,...); //a shorthand for printf (a different name again to avoid the risk of confusion with the two functions above. This would be unlikely but possible when the argument types would match)
-void FramMessage(const char *o,const char *m,const char *bl,int w);
+void FramMessage(const char *o,const char *m,const char *txt,int w);
+
+void _FramMessageSingleLine(const char *o,const char *m,const char *txt,int w); //don't call this directly - it is used internally
 
 #define FMLV_DEBUG -1
Index: /cpp/common/nonstd.h
===================================================================
--- /cpp/common/nonstd.h	(revision 243)
+++ /cpp/common/nonstd.h	(revision 244)
@@ -57,5 +57,5 @@
 #endif
 
-#ifdef MACOS
+#if defined MACOS || defined __ANDROID__
  #define stricmp(a,b) strcasecmp(a,b)
 #endif
Index: /cpp/frams/errmgr/errmanager.cpp
===================================================================
--- /cpp/frams/errmgr/errmanager.cpp	(revision 243)
+++ /cpp/frams/errmgr/errmanager.cpp	(revision 244)
@@ -6,7 +6,7 @@
 #include <common/stl-util.h>
 
-void FramMessage(const char *o,const char *m,const char *bl,int w)
+void _FramMessageSingleLine(const char *o, const char *m, const char *txt, int w)
 {
-tlsGetRef(errmgr_instance).send(o,m,bl,w);
+tlsGetRef(errmgr_instance).send(o,m,txt,w);
 }
 
Index: /cpp/frams/errmgr/stdouterr.cpp
===================================================================
--- /cpp/frams/errmgr/stdouterr.cpp	(revision 243)
+++ /cpp/frams/errmgr/stdouterr.cpp	(revision 244)
@@ -10,14 +10,14 @@
 #endif
 
-void StdoutErrorHandler::handle(const char *o,const char *m,const char *bl,int w)
+void StdoutErrorHandler::handle(const char *o, const char *m, const char *bl, int w)
 {
-if (w<-1) w=-1; else if (w>3) w=3;
+	if (w < -1) w = -1; else if (w>3) w = 3;
 #ifdef SHP
-AppLog("[%s] %s::%s - %s\n",MSG_LEVEL[w+1],o,m,bl);
+	AppLog("[%s] %s::%s - %s\n",MSG_LEVEL[w+1],o,m,bl);
 #else
-if (file)
-	file->printf("[%s] %s::%s - %s\n",MSG_LEVEL[w+1],o,m,bl);
-else
-	printf("[%s] %s::%s - %s\n",MSG_LEVEL[w+1],o,m,bl);
+	if (file)
+		file->printf("[%s] %s::%s - %s\n", MSG_LEVEL[w + 1], o, m, bl);
+	else
+		printf("[%s] %s::%s - %s\n", MSG_LEVEL[w + 1], o, m, bl);
 #endif
 }
