status.c
上传用户:jlteech
上传日期:2007-01-06
资源大小:349k
文件大小:6k
源码类别:

压缩解压

开发平台:

Visual C++

  1. /* Status.c -- the status module of WiZ
  2.  * Robert Heath. 1991.
  3.  *
  4.  * Modifications: 1995, 1996 Mike White
  5.  * Modified for WiZ
  6.  */
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <time.h>
  10. #include <string.h>
  11. #include <ctype.h>
  12. #include <io.h>
  13. #include <stdio.h>
  14. #include <stdarg.h>
  15. #include "wiz.h"
  16. /* displayed when edit control full */
  17. static char __based(__segname("STRINGS_TEXT")) szClearBufferMsg[] =
  18.             "Clearing Status window to make room for more information.";
  19. /* Globals */
  20. BOOL bRealTimeMsgUpdate = TRUE; /* update messages window in real-time.
  21.                                  * Reset by callers when update can be
  22.                                  * be deferred.
  23.                                  */
  24. LPSTR pszBuffer; /* Buffer used to feed the edit control */
  25. BOOL fSpool = FALSE;
  26. DWORD dwEditBufSize = EDIT_BUF_SIZE;
  27. #define CRLF_BUF_SIZE 0x200
  28. /* increased buffer size to map CR to CRLF */
  29. #ifdef WIN32
  30. #define FPRINTF_BUF_SIZE 0x4000
  31. #else
  32. #define FPRINTF_BUF_SIZE 0x2000
  33. #endif
  34. /* Map CR to CRLF is called by BufferOut below
  35.  * to guarantee that lines added to the Status window will be
  36.  * properly terminated DOS-style in case they are copied
  37.  * to the Windows clipboard.
  38.  * This converts the buffer in-place, provided it won't
  39.  * grow beyond the original buffer allocation.
  40.  */
  41. BOOL MapCRtoCRLF(LPSTR pszOrigBuffer);
  42. BOOL MapCRtoCRLF(LPSTR pszOrigBuffer)
  43. {
  44. LPSTR pC, pDest;
  45. UINT cBufLen = 0;  /* no. chars in buffer, including final null */
  46. UINT cLFs = 0;     /* no. LF's in string. n is linefeed */
  47. for (pC = pszOrigBuffer; *pC && (cBufLen < dwEditBufSize); pC++)
  48.    {
  49.    cBufLen++;
  50.    /* Take care of the case of a leading 'n' */
  51.    if ((cBufLen == 1) && (*pC == 'n'))
  52.       cLFs++;
  53.    else
  54.       {
  55.       if (*pC == 0x0C)   /* found a formfeed */
  56.          *pC = 'n';     /* Make a linefeed */
  57.       if ((*pC == 'n') && (*(pC-1) != 'r'))   /* found a linefeed */
  58.          cLFs++;
  59.       }
  60.    }
  61. cBufLen++;   /* buffer length includes final null */
  62. pC = &pszOrigBuffer[cBufLen-1]; /* point to old end's null char */
  63. if (cBufLen + cLFs > dwEditBufSize) /* room to add CR's ? */
  64.    return FALSE;             /* if not, don't bother */
  65. /* copy data back-to-front, effectively inserting CR before LF */
  66. pDest = &pszOrigBuffer[cBufLen+cLFs-1]; /* point to new end */
  67. for  (; cBufLen; pC--, cBufLen--)
  68.    {
  69.    *pDest-- = *pC ;    /* copy data byte */
  70.    if ((*pC == 'n') && ((*(pC-1)) != 'r'))    /* was that a linefeed? */
  71.       *pDest-- = 'r'; /* if so, insert CR */
  72.    }
  73. return TRUE;
  74. }
  75. LPSTR szTmpBuffer;
  76. HANDLE hMemory;
  77. /* BufferOut buffers the current output and counts the number of lines
  78.  * within it.  It makes sure there is enough space in the global
  79.  * buffer, then copies the buffered data to the global buffer.
  80.  */
  81. int __far __cdecl BufferOut(const char *format, ...)
  82. {
  83. va_list argptr;
  84. unsigned int len, txtlen;
  85. va_start(argptr, format);
  86. hMemory = LocalAlloc(LMEM_MOVEABLE, (FPRINTF_BUF_SIZE + CRLF_BUF_SIZE));
  87. WinAssert(hMemory);
  88. if (!hMemory)
  89.    {
  90.    return 0;
  91.    }
  92. szTmpBuffer = (LPSTR)LocalLock(hMemory);
  93. WinAssert(szTmpBuffer);
  94. vsprintf(szTmpBuffer, format, argptr);
  95. va_end(argptr);
  96. MapCRtoCRLF(szTmpBuffer);
  97. len = lstrlen(szTmpBuffer);
  98. /* WM_GETTEXTLENGTH returns the length of the text in the edit control, but
  99.    does not include the terminating NULL, hence, add 1.
  100.    Get the text in the edit control in case the user has added or deleted
  101.    text.
  102.  */
  103. txtlen = (unsigned int)SendMessage(hWndEdit, WM_GETTEXTLENGTH, 0, 0);
  104. if (txtlen != 0)
  105.    txtlen++;
  106. SendMessage(hWndEdit, WM_GETTEXT, txtlen, (LPARAM)pszBuffer);
  107. if ((unsigned long)(len + txtlen) > EDIT_BUF_SIZE-1)
  108.    {
  109.    MessageBox (hWndMain, szClearBufferMsg,
  110.       "Note", MB_ICONINFORMATION | MB_OK);
  111.    lstrcpy(pszBuffer, szTmpBuffer);
  112.    }
  113. else
  114.    lstrcat(pszBuffer, szTmpBuffer);
  115. SendMessage(hWndEdit, WM_SETTEXT, (WPARAM)0, (LPARAM)pszBuffer);
  116. UpdateWindow(hWndEdit);
  117. LocalUnlock(hMemory);
  118. LocalFree(hMemory);
  119. /* Return the actual number of bytes being printed */
  120. return len;
  121. }
  122. int WINAPI DisplayBuf(char far *buf, unsigned long size)
  123. {
  124. static BOOL fDump = FALSE;
  125. unsigned int i, txtlen;
  126. char *p;
  127. /* Just a sanity check - size should normally not exceed 32K */
  128. if (size > (EDIT_BUF_SIZE-1))
  129.    size = EDIT_BUF_SIZE-1;
  130. /* The fQuiet flag is only set if we are displaying to the edit window.
  131.    This simply sends any "messages" to the display window
  132.  */
  133. if (!lpDCL->fQuiet)
  134.    {
  135.    BufferOut("%s", buf);
  136.    return (unsigned int) size;
  137.    }
  138. if (!fSpool) /* Are we just starting a dump to memory? */
  139.    {
  140.    fDump = FALSE;
  141. #ifdef WIN32
  142.    memset(pszBuffer, '', dwEditBufSize);
  143. #else
  144.    _fmemset(pszBuffer, '', (unsigned int)dwEditBufSize);
  145. #endif
  146.    }
  147. /* Have we already started sending data to display? If so, then just
  148.    throw away anything other than the first dwEditBufSize characters
  149.  */
  150. if (fDump)
  151.    {
  152.    return 0;
  153.    }
  154. fSpool = TRUE; /* Flag that we have started dumping to memory */
  155. txtlen = lstrlen(pszBuffer);
  156. #ifdef WIN32
  157. if ((txtlen+size) > (dwEditBufSize - 1))
  158.    {
  159.    HGLOBAL hTemp;
  160.    GlobalUnlock(hEditor);
  161.    hTemp = GlobalReAlloc(hEditor, (DWORD)dwEditBufSize + size + 0x1000,
  162.       GMEM_MOVEABLE);
  163.    if (!hTemp)
  164.       {
  165.       MessageBox((HWND)NULL,
  166.          "Could not re-allocate memory, File too large. Truncating file.",
  167.          szAppName, MB_ICONSTOP | MB_OK);
  168.       fDump = TRUE; /* Okay, start throwing away data */
  169.       size = dwEditBufSize - txtlen - 1;
  170.       }
  171.    else
  172.       {
  173.       dwEditBufSize = dwEditBufSize + size + 0x1000;
  174.       SendMessage(hWndEdit, EM_EXLIMITTEXT, (WPARAM)0, (LPARAM)dwEditBufSize);
  175.       hEditor = hTemp;
  176.       }
  177.    pszBuffer = (LPSTR)GlobalLock(hEditor);
  178.    }
  179. #else
  180. if ((txtlen+size) > (dwEditBufSize - 1))
  181.    {
  182.    fDump = TRUE; /* Okay, start throwing away data */
  183.    size = dwEditBufSize - txtlen - 1;
  184.    MessageBox(hWndMain, "File too large for memory, truncating file",
  185.          "Warning", MB_OK);
  186.    }
  187. #endif
  188. p = &pszBuffer[txtlen];
  189. memcpy(p, buf, (unsigned int)size);
  190. pszBuffer[(unsigned int)(txtlen+size+1)] = '';
  191. i = lstrlen(pszBuffer);
  192. while (!MapCRtoCRLF(pszBuffer) && (i != 0))
  193.    {
  194.    pszBuffer[--i] = '';
  195.    }
  196. SendMessage(hWndEdit, WM_SETTEXT, 0, (LPARAM)(LPCSTR)pszBuffer);
  197. return (unsigned int) size;
  198. }