home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Eudora 1.3.1 / source / log.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  4.6 KB  |  179 lines  |  [TEXT/MPS ]

  1. #define FILE_NUM 50
  2. /* Copyright (c) 1992 by Qualcomm, Inc */
  3. /**********************************************************************
  4.  * the log file
  5.  **********************************************************************/
  6. #pragma load EUDORA_LOAD
  7. #pragma segment Log
  8.  
  9. void OpenLog(void);
  10.  
  11. /************************************************************************
  12.  * ComposeLogR - compose a log file entry, using a resource for a format
  13.  ************************************************************************/
  14. UPtr ComposeLogR(short level,UPtr into,short format,...)
  15. {
  16.     Str255 locl;
  17.     UPtr reallyInto = into ? into : locl;
  18.     va_list args;
  19.     va_start(args,format);
  20.     (void) VaComposeRString(reallyInto,format,args);
  21.     va_end(args);
  22.     Log(level,reallyInto);
  23.     return(into);
  24. }
  25.  
  26. /************************************************************************
  27.  * ComposeLogS - compose a log file entry, using a string for a format
  28.  ************************************************************************/
  29. UPtr ComposeLogS(short level,UPtr into,UPtr format,...)
  30. {
  31.     Str255 locl;
  32.     UPtr reallyInto = into ? into : locl;
  33.     va_list args;
  34.     va_start(args,format);
  35.     (void) VaComposeString(reallyInto,format,args);
  36.     va_end(args);
  37.     Log(level,reallyInto);
  38.     return(into);
  39. }
  40.  
  41. /************************************************************************
  42.  * Log - log a string, if the current log level includes the current string
  43.  ************************************************************************/
  44. UPtr Log(short level,UPtr string)
  45. {
  46.     if ((level&LogLevel)!=0)
  47.     {
  48.         OpenLog();
  49.         if (LogRefN)
  50.         {
  51.             Str31 stamp;
  52.             long tickDiff = TickCount()-LogTicks;
  53.             FSWriteP(LogRefN,ComposeString(stamp,"\p%d:%d.%d.%d ",level,
  54.                                                             tickDiff/3600,(tickDiff/60)%60,tickDiff%60));
  55.             FSWriteP(LogRefN,string);
  56.             if (string[*string] != '\n') FSWriteP(LogRefN,"\p\n");
  57.         }
  58.     }
  59.     return(string);
  60. }
  61.  
  62. /************************************************************************
  63.  * CloseLog - close, rolling over if needed
  64.  ************************************************************************/
  65. void CloseLog(void)
  66. {
  67.     long eof=0;
  68.  
  69.     if (LogRefN)
  70.     {
  71.       eof = (GetEOF(LogRefN,&eof) || eof > 100K);
  72.         FSClose(LogRefN);
  73.         LogRefN = 0;
  74.     }
  75.     if (eof)
  76.     {
  77.         Str31 old,new;
  78.         GetRString(old,OLD_LOG);
  79.         GetRString(new,LOG_NAME);
  80.         HDelete(MyVRef,MyDirId,old);
  81.         HRename(MyVRef,MyDirId,new,old);
  82.     }
  83. }
  84.  
  85.  
  86. /************************************************************************
  87.  * OpenLog - open log file if needed, rolling over if needed
  88.  ************************************************************************/
  89. void OpenLog(void)
  90. {
  91.     long eof;
  92.     Str255 str;
  93.     Str15 ctext;
  94.     short err;
  95.     long creator;
  96.     
  97.     if (LogRefN && (GetEOF(LogRefN,&eof) || eof > 100K)) CloseLog();
  98.     if (!LogRefN)
  99.     {
  100.         GetRString(str,LOG_NAME);
  101.         if ((err=FSHOpen(str,MyVRef,MyDirId,&LogRefN,fsRdWrPerm))==fnfErr)
  102.         {
  103.             GetPref(ctext,PREF_CREATOR);
  104.             if (*ctext!=4) GetRString(ctext,TEXT_CREATOR);
  105.             BlockMove(ctext+1,&creator,4);
  106.             HCreate(MyVRef,MyDirId,str,creator,'TEXT');
  107.             err = FSHOpen(str,MyVRef,MyDirId,&LogRefN,fsRdWrPerm);
  108.       }
  109.         if (err) return;
  110.         SetFPos(LogRefN,fsFromLEOF,0);
  111.         LogTicks = TickCount();
  112.         LocalDateTimeStr(str);
  113.         FSWriteP(LogRefN,str);
  114.     }
  115. }
  116.  
  117. /************************************************************************
  118.  * 
  119.  ************************************************************************/
  120. void LogAlert(short template)
  121. {
  122.     ComposeLogS(LOG_ALRT,nil,"\pALRT %d",template);
  123. }
  124.  
  125. /************************************************************************
  126.  * 
  127.  ************************************************************************/
  128. void MyParamText(PStr p1,PStr p2,PStr p3,PStr p4)
  129. {
  130.     if (p1&&*p1) Log(LOG_ALRT,p1);
  131.     if (p2&&*p2) Log(LOG_ALRT,p2);
  132.     if (p3&&*p3) Log(LOG_ALRT,p3);
  133.     if (p4&&*p4) Log(LOG_ALRT,p4);
  134.     ParamText(p1,p2,p3,p4);
  135. }
  136.  
  137. /************************************************************************
  138.  * CarefulLog - log a potentially long and nasty string
  139.  ************************************************************************/
  140. void CarefulLog(short level,short format,UPtr data,short dSize)
  141. {
  142.     Byte logString[128];
  143.     UPtr to, dataEnd, logEnd;
  144.     
  145.     if (!(level&LogLevel)) return;
  146.     
  147.     dataEnd = data+dSize;
  148.     do
  149.     {
  150.         to = logString+1;
  151.         logEnd = to + sizeof(logString)-6;
  152.         while (data<dataEnd)
  153.         {
  154.             if (*data < ' ')
  155.             {
  156.                 *to++ = '\\';
  157.                 switch (*data)
  158.                 {
  159.                     case '\r': *to++ = 'n'; break;
  160.                     case '\n': *to++ = 'r'; break;
  161.                     case '\t': *to++ = 't'; break;
  162.                     default:
  163.                         *to++ = '0'+(*data/64)%8;
  164.                         *to++ = '0'+(*data/8)%8;
  165.                         *to++ = '0'+*data % 8;
  166.                         break;
  167.                 }
  168.             }
  169.             else
  170.                 *to++ = *data;
  171.             data++;
  172.             if (to>logEnd || data[-1]=='\r') break;
  173.         }
  174.         *logString = to-logString-1;
  175.         ComposeLogR(level,nil,format,logString);
  176.     }
  177.     while (data<dataEnd);
  178. }
  179.