fixed bug in jpeg2000 decoding
[swftools.git] / lib / log.c
index 6c705ee..e75148f 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
-/* log.c \r
-   Logging facilities for displaying information on screen, as well as\r
-   (optional) storing it to a file and transmitting it over the network.\r
-\r
-   Part of the swftools package.\r
-   \r
-   Copyright (c) 2001 Matthias Kramm <kramm@quiss.org> \r
-\r
-   This file is distributed under the GPL, see file COPYING for details */\r
-\r
-#ifdef __NT__\r
-#include "stdafx.h"\r
-#include <string.h>\r
-#include <winsock2.h>\r
-#include <stdlib.h>\r
-#include <malloc.h>\r
-#if _MSC_VER > 1000\r
-#pragma once\r
-#endif // _MSC_VER > 1000\r
-#else\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <stdarg.h>\r
-#include <string.h>\r
-#include <unistd.h>\r
-#endif\r
-\r
-#include "log.h"\r
-\r
-#define LOGLEVEL_FATAL 0\r
-#define LOGLEVEL_ERROR 1\r
-#define LOGLEVEL_WARNING 2\r
-#define LOGLEVEL_NOTICE 3\r
-#define LOGLEVEL_VERBOSE 4\r
-#define LOGLEVEL_DEBUG 5\r
-\r
-int screenloglevel;\r
-int fileloglevel;\r
-int socketloglevel;\r
-FILE *logFile = 0;\r
-#ifdef __NT__\r
-SOCKET logSocket;\r
-#else\r
-int logSocket = 0;\r
-#endif\r
-\r
-char bLogToSock = 0;\r
-\r
-void initlogSocket(char* servAddr, char* logPort);\r
-\r
-void initLog(char* pLogName, int fileloglevel, char* servAddr, char* logPort, int serverlevel, int screenlevel)\r
-{\r
-   screenloglevel = screenlevel;\r
-   fileloglevel = fileloglevel;\r
-   socketloglevel = screenlevel;\r
-   logFile = NULL;\r
-   bLogToSock = 0;\r
-\r
-   if (pLogName && fileloglevel>=0)\r
-   logFile = fopen(pLogName, "a+");\r
-   bLogToSock = (servAddr && logPort && (serverlevel>=0));\r
-   if(bLogToSock)\r
-       initlogSocket(servAddr, logPort);\r
-}\r
-\r
-void initlogSocket(char* servAddr, char* logPort)\r
-{\r
-#ifndef __NT__\r
-   bLogToSock = 0;\r
-#else\r
-   // init winsock\r
-   // check and prepare WinSock DLL\r
-   WORD wVersionRequested = MAKEWORD( 2, 2 );\r
-   WSADATA wsaData;\r
-   if ( WSAStartup(wVersionRequested, &wsaData) != 0 )\r
-   {\r
-      bLogToSock = false;\r
-      return;\r
-   }\r
-   // Confirm that the WinSock DLL supports 2.2.\r
-   // Note that if the DLL supports versions greater\r
-   // than 2.2 in addition to 2.2, it will still return\r
-   // 2.2 in wVersion since that is the version we\r
-   // requested.\r
-\r
-   if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )\r
-   {\r
-      bLogToSock = false;\r
-      return;\r
-   }\r
-\r
-   struct hostent *hp;\r
-   hp = gethostbyname(servAddr);\r
-   if (hp == NULL) // we don't know who this host is\r
-   {\r
-      bLogToSock = false;\r
-      return;\r
-   }\r
-\r
-   // connect socket\r
-   sockaddr_in SocketAddress;\r
-\r
-   memset(&SocketAddress, 0, sizeof(SocketAddress));\r
-   memcpy((char*)&SocketAddress.sin_addr, hp->h_addr, hp->h_length); // set address\r
-   SocketAddress.sin_family = hp->h_addrtype;\r
-   SocketAddress.sin_port = htons((u_short)atoi(logPort));\r
-\r
-   logSocket = socket(hp->h_addrtype, SOCK_STREAM, 0);\r
-   if (logSocket == INVALID_SOCKET)\r
-   {\r
-      bLogToSock = false;\r
-      return;\r
-   }\r
-\r
-   // try to connect to the specified socket\r
-   if ( connect(logSocket, (struct sockaddr*)&SocketAddress, sizeof (SocketAddress)) == SOCKET_ERROR) {\r
-      bLogToSock = false;\r
-      return;\r
-   }\r
-   bLogToSock = true;\r
-#endif\r
-}\r
-\r
-void exitLog()\r
-{\r
-   // close socket communication\r
-   if(bLogToSock)\r
-#ifndef __NT__\r
-     close(logSocket);\r
-#else\r
-     closesocket(logSocket);\r
-#endif\r
-   // close file\r
-   if(logFile != NULL)\r
-     fclose(logFile);\r
-}\r
-\r
-\r
-static char * logimportance[]= {"Fatal","Error","Warning","Notice","Verbose","Debug"};\r
-static int loglevels=6;\r
-static char * logimportance2[]= {"       ","FATAL  ","ERROR  ","WARNING","NOTICE ","VERBOSE","DEBUG  "};\r
-void log(char* logString)\r
-{\r
-   char timebuffer[32];\r
-   char* logBuffer;\r
-   char dbuffer[9];\r
-   char tbuffer[9];\r
-   int level;\r
-   char*lt;\r
-   char*gt;\r
-   int l;\r
-\r
-   logBuffer = (char*)malloc (strlen(logString) + 24 + 15);\r
-#ifndef __NT__\r
-   {\r
-     /*time_t t = time(0);\r
-     tm*t2 = localtime(t);\r
-     strftime(dbuffer, 8, "%m %d", t2);\r
-     strftime(tbuffer, 8, "%m %d", t2);\r
-     dbuffer[0]=0; //FIXME\r
-     tbuffer[0]=0;*/\r
-     time_t t = time(0);\r
-     char* a = ctime(&t);\r
-     int l = strlen(a);\r
-     while(a[l-1] == 13 || a[l-1] == 10)\r
-       l--;\r
-     a[l]=0;\r
-     sprintf(timebuffer, "%s", a);\r
-   }\r
-#else\r
-   _strdate( dbuffer );\r
-   _strtime( tbuffer );\r
-   sprintf(timebuffer, "%s - %s",dbuffer,tbuffer);\r
-#endif\r
-\r
-   // search for <level> field\r
-   level = -1;\r
-   lt=strchr(logString, '<');\r
-   gt=strchr(logString, '>');\r
-   if(lt && gt && lt<gt)\r
-   {\r
-       int t;\r
-       for(t=0;t<loglevels;t++)\r
-       {\r
-#ifndef __NT__\r
-          if(!strncasecmp(lt+1,logimportance[t],strlen(logimportance[t])))\r
-#else\r
-          if(!strnicmp(lt+1,logimportance[t],strlen(logimportance[t])))\r
-#endif\r
-          {\r
-              logString = gt+1;\r
-              while(logString[0]==' ') logString ++;\r
-              level = t;\r
-              break;\r
-          }\r
-       }\r
-   }\r
-   \r
-//   sprintf(logBuffer, "%s: %s %s", timebuffer, logimportance2[level + 1],logString);\r
-   sprintf(logBuffer, "%s %s", logimportance2[level + 1],logString);\r
-\r
-   // we always do exactly one newline.\r
-   \r
-   l=strlen(logBuffer)-1;\r
-   while((logBuffer[l]==13 || logBuffer[l]==10) && l>=0)\r
-   {\r
-       logBuffer[l]=0;\r
-       l--;\r
-   }\r
-\r
-   if (level <= screenloglevel)\r
-   {\r
-       printf("%s\n", logBuffer); \r
-       fflush(stdout);\r
-   }\r
-\r
-   if (level <= fileloglevel)\r
-   {\r
-       if (logFile != NULL)\r
-       {\r
-         fprintf(logFile, "%s\n", logBuffer); \r
-         fflush(logFile);\r
-       }\r
-   }\r
-\r
-   if (level <= socketloglevel)\r
-   {\r
-       if (bLogToSock)\r
-       {\r
-         // send data\r
-#ifndef __NT__\r
-         write(logSocket, logBuffer, strlen(logBuffer));\r
-#else\r
-         send(logSocket, logBuffer, strlen(logBuffer), 0);\r
-#endif\r
-       }\r
-   }\r
-   free (logBuffer);\r
-}\r
-\r
-void logf(const char* pszFormat, ...)\r
-{\r
-    char buf[1024];\r
-       va_list arglist;\r
-       va_start(arglist, pszFormat);\r
-    buf[0] = 0;\r
-    vsprintf(&buf[strlen(buf)], pszFormat, arglist);\r
-       va_end(arglist);\r
-    strcat(buf, "\n");\r
-    log(buf);\r
-}\r
-\r
+/* log.c 
+   Logging facilities for displaying information on screen, as well as
+   (optional) storing it to a file and transmitting it over the network.
+
+   Part of the swftools package.
+   
+   Copyright (c) 2001 Matthias Kramm <kramm@quiss.org> 
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#ifdef WIN32
+//#include "stdafx.h"
+#include <malloc.h>
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+#else
+#include <stdio.h>
+#include <unistd.h>
+#endif
+
+#include "log.h"
+
+static int screenloglevel = 1;
+static int fileloglevel = -1;
+static FILE *logFile = 0;
+static int maxloglevel = 1;
+
+int getScreenLogLevel()
+{
+    return screenloglevel;
+}
+int getLogLevel()
+{
+    return maxloglevel;
+}
+
+void setConsoleLogging(int level)
+{
+    if(level>maxloglevel)
+        maxloglevel=level;
+    screenloglevel = level;
+}
+void setFileLogging(char*filename, int level, char append)
+{
+    if(level>maxloglevel)
+        maxloglevel=level;
+    if(logFile) {
+        fclose(logFile);logFile=0;
+    }
+    if(filename && level>=0) {
+        logFile = fopen(filename, append?"ab+":"wb");
+        fileloglevel = level;
+    } else {
+        logFile = 0;
+        fileloglevel = 0;
+    }
+}
+/* deprecated */
+void initLog(char* filename, int filelevel, char* s00, char* s01, int s02, int screenlevel)
+{
+    setFileLogging(filename, filelevel, 0);
+    setConsoleLogging(screenlevel);
+}
+
+void exitLog()
+{
+   // close file
+   if(logFile != NULL) {
+     fclose(logFile);
+     logFile = 0;
+     fileloglevel = -1;
+     screenloglevel = 1;
+     maxloglevel = 1;
+   }
+}
+
+static char * logimportance[]= {"Fatal","Error","Warning","Notice","Verbose","Debug","Trace"};
+static int loglevels=7;
+static char * logimportance2[]= {"       ","FATAL  ","ERROR  ","WARNING","NOTICE ","VERBOSE","DEBUG  ", "TRACE  "};
+
+static inline void log_str(const char* logString)
+{
+   char timebuffer[32];
+   char* logBuffer;
+   char dbuffer[9];
+   char tbuffer[9];
+   int level;
+   char*lt;
+   char*gt;
+   int l;
+
+   logBuffer = (char*)malloc (strlen(logString) + 24 + 15);
+#ifndef __NT__
+   {
+     /*time_t t = time(0);
+     tm*t2 = localtime(t);
+     strftime(dbuffer, 8, "%m %d", t2);
+     strftime(tbuffer, 8, "%m %d", t2);
+     dbuffer[0]=0; //FIXME
+     tbuffer[0]=0;*/
+     time_t t = time(0);
+     char* a = ctime(&t);
+     int l = strlen(a);
+     while(a[l-1] == 13 || a[l-1] == 10)
+       l--;
+     a[l]=0;
+     sprintf(timebuffer, "%s", a);
+   }
+#else
+   _strdate( dbuffer );
+   _strtime( tbuffer );
+   sprintf(timebuffer, "%s - %s",dbuffer,tbuffer);
+#endif
+
+   // search for <level> field
+   level = -1;
+   lt=strchr(logString, '<');
+   gt=strchr(logString, '>');
+   if(lt && gt && lt<gt)
+   {
+       int t;
+       for(t=0;t<loglevels;t++)
+       {
+#ifndef __NT__
+          if(!strncasecmp(lt+1,logimportance[t],strlen(logimportance[t])))
+#else
+          if(!strnicmp(lt+1,logimportance[t],strlen(logimportance[t])))
+#endif
+          {
+              logString = gt+1;
+              while(logString[0]==' ') logString ++;
+              level = t;
+              break;
+          }
+       }
+   }
+   
+//   sprintf(logBuffer, "%s: %s %s", timebuffer, logimportance2[level + 1],logString);
+   sprintf(logBuffer, "%s %s", logimportance2[level + 1],logString);
+
+   // we always do exactly one newline.
+   
+   l=strlen(logBuffer)-1;
+   while((logBuffer[l]==13 || logBuffer[l]==10) && l>=0)
+   {
+       logBuffer[l]=0;
+       l--;
+   }
+
+   if (level <= screenloglevel)
+   {
+       printf("%s\n", logBuffer); 
+       fflush(stdout);
+   }
+
+   if (level <= fileloglevel)
+   {
+       if (logFile != NULL)
+       {
+         fprintf(logFile, "%s\r\n", logBuffer); 
+         fflush(logFile);
+       }
+   }
+
+   free (logBuffer);
+}
+
+void msg_str(const char* buf)
+{
+    if(buf[0]=='<') {
+       char*z = "fewnvdt";
+       char*x = strchr(z,buf[1]);
+       if(x && (x-z)>maxloglevel)
+               return;
+    }
+    log_str(buf);
+}
+void msg(const char* format, ...)
+{
+    char buf[1024];
+       va_list arglist;
+       va_start(arglist, format);
+    
+    /* speed up hack */
+    if(format[0]=='<') {
+       char*z = "fewnvdt";
+       char*x = strchr(z,format[1]);
+       if(x && (x-z)>maxloglevel)
+               return;
+    }
+
+    vsnprintf(buf, sizeof(buf)-1, format, arglist);
+       va_end(arglist);
+    strcat(buf, "\n");
+    log_str(buf);
+}
+