home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / NOTEPAD2.ZIP / NPFILE.C < prev    next >
C/C++ Source or Header  |  1989-02-08  |  5KB  |  201 lines

  1. /***************************************************************************\
  2. * npfile.c - notepad file processing
  3. *
  4. * Created by Microsoft Corporation, 1989
  5. \***************************************************************************/
  6.  
  7. #define INCL_WIN
  8. #define INCL_DOS
  9. #include <os2.h>
  10. #include <string.h>
  11. #include <opendlg.h>
  12. #include "notepad.h"
  13. #include "npcmd.h"
  14.  
  15. /**************** Module Global variables */
  16.  
  17. DLF dlf;
  18.  
  19. /* Forward declarations */
  20. VOID NPLoadFile(SHANDLE FAR *);
  21.  
  22. /************* PROCEDURE DECLARATIONS   */
  23.  
  24. VOID NPClear(VOID)
  25. {
  26.     WinSendMsg(hwndNPEdit,
  27.         EM_DELETE,
  28.         MPFROMSHORT(0),
  29.         WinSendMsg(hwndNPEdit,
  30.             EM_QTL,
  31.             NULL,
  32.             NULL));
  33.     ClearChanged();
  34.     SetTitle(szMsgs[MS_UNTITLED]);
  35. }
  36.  
  37. BOOL NPOpenRead(VOID)
  38. {
  39.     int rtc;
  40.     SHANDLE hFile;
  41.  
  42.     dlf.rgbAction = DLG_HELP | DLG_OPENDLG;
  43.     dlf.rgbFlags = ATTRDIRLIST;
  44.     dlf.phFile = &hFile;
  45.     dlf.pszExt = szMsgs[MS_DFLEXT];
  46.     dlf.pszAppName = szTitle;
  47.     dlf.pszInstructions = NULL;
  48.     dlf.pszTitle = szMsgs[MS_OPENFILE];
  49.  
  50.     rtc = DlgFile(hwndNP,&dlf);
  51.     switch(rtc) {
  52.     case TDF_ERRMEM:        /* error messages ! */
  53.     case TDF_INVALID:
  54.     case TDF_NOOPEN:
  55.         return(FALSE);
  56.  
  57.     case TDF_NEWOPEN:
  58.         NPClear();
  59.         break;
  60.  
  61.     case TDF_OLDOPEN:
  62.         NPClear();
  63.         NPLoadFile(dlf.phFile);
  64.         break;
  65.     }
  66.  
  67.     lstrcpy(szFileName,dlf.szOpenFile);
  68.     SetTitle(dlf.szFileName);
  69.     fNamed = TRUE;
  70.     ClearChanged();
  71. }
  72.  
  73. BOOL NPLoadNamedFile(PSZ nm)
  74. {
  75.     SHANDLE hFile;
  76.     VOID NPLoadFile(SHANDLE FAR *);
  77.  
  78.     if (!OpenFile((PSZ)nm,
  79.             (PHANDLE)&hFile,
  80.             (PSZ)szFileName,
  81.             OF_READ)) {
  82.         AlertBox(hwndNP,
  83.                     IDS_EOF,
  84.                     (PSZ)nm,
  85.                     szTitle,
  86.                     NULL,
  87.                     MB_OK | MB_ICONASTERISK | MB_APPLMODAL);
  88.         }
  89.     else {
  90.         NPLoadFile(&hFile);
  91.         SetTitle(nm);
  92.         fNamed = TRUE;
  93.         ClearChanged();
  94.     }
  95.     return(TRUE);
  96. }
  97.  
  98. static VOID filterOutCR(PCHAR buff, PUSHORT puLen)
  99. {
  100.     register USHORT off, pos;
  101.  
  102.     off = 0;
  103.     for (pos = 0; pos < *puLen; pos++) {
  104.         if (*(buff+pos) == '\r') {
  105.             off++;
  106.         } else {
  107.             *(buff+pos-off) = *(buff+pos);
  108.         }
  109.     }
  110.     *puLen -= off;
  111. }
  112.  
  113. VOID NPLoadFile(SHANDLE FAR *phfile)
  114. {
  115.     SEL selRead;
  116.     SHORT nread;
  117.     USHORT rdsize;
  118.     FILESTATUS fstsInfo;
  119.     HPOINTER hptrSave;
  120.  
  121.     hptrSave = WinQueryPointer (HWND_DESKTOP);
  122.     WinSetPointer(HWND_DESKTOP, WinQuerySysPointer (HWND_DESKTOP, SPTR_WAIT, FALSE));
  123.  
  124.     /* Query the OS for the size of the file to read */
  125.     DosQFileInfo (*phfile,
  126.                   (USHORT) 1,
  127.                   &fstsInfo,
  128.                   sizeof(fstsInfo));
  129.  
  130.     /* While there are still bytes left in the file to read */
  131.     while (fstsInfo.cbFileAlloc > 0) {
  132.  
  133.         /* Choose minimum of segment size and remaining file size to load */
  134.  
  135.         if (fstsInfo.cbFileAlloc > 65535) {
  136.                 rdsize = 65535;
  137.                 DosAllocSeg((USHORT) 65535, (PSEL)&selRead, 0);
  138.                 }
  139.         else {
  140.                 rdsize = (USHORT) fstsInfo.cbFileAlloc;
  141.                 DosAllocSeg(rdsize, (PSEL)&selRead, 0);
  142.                 }
  143.  
  144.         fstsInfo.cbFileAlloc -= rdsize;
  145.  
  146.         /* If the read failed or we got zero bytes, an error occurred */
  147.         if ((DosRead(*phfile,MAKEP(selRead,0),rdsize,&nread) != 0) ||
  148.             nread == 0) {
  149.             WinAlarm(HWND_DESKTOP, WA_WARNING);
  150.             WinMessageBox(HWND_DESKTOP,
  151.                     hwndNP,
  152.                     szMsgs[MS_LOADERR],
  153.                     NULL,
  154.                     0,
  155.                     MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
  156.             break;
  157.         }
  158.         else {
  159.             filterOutCR((PCHAR)MAKEP(selRead,0), (PUSHORT)&nread);
  160.             WinSendMsg(hwndNPEdit, EM_SETIMPORTEXPORT, MPFROMP(MAKEP(selRead,0)), MPFROMSHORT(nread));
  161.             WinSendMsg(hwndNPEdit, EM_IMPORT, (MPARAM)0, MPFROMSHORT(nread));
  162.         }
  163.     }
  164.     DosClose(*phfile);
  165.     ClearChanged();
  166.  
  167.     /* Set the cursor to the beginning of the text */
  168.     WinSendMsg (hwndNPEdit, EM_SETSEL, 0L, 0L);
  169.  
  170.     WinSetPointer (HWND_DESKTOP, hptrSave);
  171. }
  172.  
  173.  
  174. VOID SetTitle(PSZ title)
  175. {
  176.     SWCNTRL swctl;
  177.     static HSWITCH hswitch = NULL;
  178.     PIDINFO pidinfo;
  179.  
  180.     DosGetPID((PPIDINFO)&pidinfo);
  181.  
  182.     lstrcpy(szTitle, "NP.EXE - [");
  183.     lstrcat(szTitle, title);
  184.     lstrcat(szTitle, "]");
  185.     lstrcpy(swctl.szSwtitle, szTitle);
  186.  
  187.     if (hswitch == NULL) {
  188.         swctl.hwnd = hwndNPFrame;
  189.         swctl.hwndIcon = (HWND)NULL;
  190.         swctl.hprog = (HPROGRAM)NULL;
  191.         swctl.idProcess = pidinfo.pid;
  192.         swctl.uchVisibility = SWL_VISIBLE;
  193.         swctl.fbJump = SWL_JUMPABLE;
  194.         hswitch = WinAddSwitchEntry((PSWCNTRL)&swctl);
  195.     } else {
  196.         WinChangeSwitchEntry(hswitch,(PSWCNTRL)&swctl);
  197.     }
  198.  
  199.     WinSetWindowText(WinWindowFromID(hwndNPFrame, FID_TITLEBAR), szTitle);
  200. }
  201.