FILE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:24k
源码类别:

Windows编程

开发平台:

Visual C++

  1.     /****************************************************************************/
  2.     /*                                                                          */
  3.     /*                 Copyright (C) 1987-1996 Microsoft Corp.                */
  4.     /*                           All Rights Reserved                            */
  5.     /*                                                                          */
  6.     /****************************************************************************/
  7.     /****************************** Module Header *******************************
  8.     * Module Name: file.c
  9.     *
  10.     * Contains routines for handling files.
  11.     *
  12.     * History:
  13.     *
  14.     ****************************************************************************/
  15.     
  16.     #include "imagedit.h"
  17.     #include "dialogs.h"
  18.     
  19.     #include <string.h>
  20.  #include <windowsx.h>
  21.     #include <commdlg.h>
  22.     
  23.     
  24.     #ifdef WIN16
  25.     typedef BOOL (APIENTRY *LPOFNHOOKPROC) (HWND, UINT, WPARAM, LONG);
  26.     #endif
  27.     
  28.     
  29.     STATICFN VOID NEAR AddFilterString(PSTR pszBuf, PSTR pszType, PSTR pszExt,
  30.         BOOL fFirst);
  31.     STATICFN PSTR NEAR DefExtFromFilter(INT index, PSTR pszFilter);
  32.     STATICFN BOOL NEAR LoadFile(PSTR pszFullFileName);
  33.     STATICFN INT NEAR GetTypeFromExt(PSTR pszFileName);
  34.     STATICFN VOID NEAR FileCat(PSTR pchName, PSTR pchCat);
  35.     
  36.     
  37.     static OPENFILENAME ofn;
  38.     
  39.     
  40.     
  41.     /************************************************************************
  42.     * SetFileName
  43.     *
  44.     * Updates the globals that contain the file name of the currently
  45.     * loaded file.  This routine will also cause the title bar to
  46.     * be udpated with the new name.
  47.     *
  48.     * Arguments:
  49.     *
  50.     * History:
  51.     *
  52.     ************************************************************************/
  53.     
  54.     VOID SetFileName(
  55.         PSTR pszFullFileName)
  56.     {
  57.         CHAR szTitle[CCHMAXPATH];
  58.         WIN32_FIND_DATA ffbuf;
  59.         CHAR *pch;
  60.     
  61.         if (pszFullFileName) {
  62.             HANDLE hfind;
  63.             strcpy(gszFullFileName, pszFullFileName);
  64.             gpszFileName = FileInPath(gszFullFileName);
  65.     
  66.             if((hfind = FindFirstFile( pszFullFileName, &ffbuf)) !=
  67.                     INVALID_HANDLE_VALUE) {
  68.     
  69.                 strcpy(gpszFileName, ffbuf.cFileName);
  70.                 FindClose(hfind);
  71.             }
  72.     
  73.         }
  74.         else {
  75.             *gszFullFileName = '';
  76.             gpszFileName = NULL;
  77.         }
  78.     
  79.         strcpy(szTitle, ids(IDS_PGMTITLE));
  80.         strcat(szTitle, " - ");
  81.         pch = gpszFileName ? gpszFileName : ids(IDS_UNTITLED);
  82.         strncat(szTitle, pch, sizeof(szTitle) - strlen(szTitle));
  83.         szTitle[CCHMAXPATH-1] = '';
  84.         SetWindowText(ghwndMain, szTitle);
  85.     }
  86.     
  87.     
  88.     
  89.     /************************************************************************
  90.     * FileInPath
  91.     *
  92.     * This function takes a path and returns a pointer to the file name
  93.     * portion of it.  For instance, it will return a pointer to
  94.     * "abc.res" if it is given the following path: "c:windowsabc.res".
  95.     *
  96.     * Arguments:
  97.     *   PSTR pstrPath - Path to look through.
  98.     *
  99.     * History:
  100.     *
  101.     ************************************************************************/
  102.     
  103.     PSTR FileInPath(
  104.         PSTR pstrPath)
  105.     {
  106.         PSTR pstr;
  107.     
  108.         pstr = pstrPath + strlen(pstrPath);
  109.         while (pstr > pstrPath) {
  110.             pstr = FAR2NEAR(AnsiPrev(pstrPath, pstr));
  111.             if (*pstr == '\' || *pstr == ':' || *pstr == '/') {
  112.                 pstr = FAR2NEAR(AnsiNext(pstr));
  113.                 break;
  114.             }
  115.         }
  116.     
  117.         return pstr;
  118.     }
  119.     
  120.     
  121.     
  122.     /************************************************************************
  123.     * ClearResource
  124.     *
  125.     * Resets the editor back to a neutral state before editing any image.
  126.     * This function can be called before starting to edit a new file
  127.     * (but not just a new image).  Files should be saved before calling
  128.     * this routine, because the entire image list is destroyed.
  129.     *
  130.     * History:
  131.     *
  132.     ************************************************************************/
  133.     
  134.     VOID ClearResource(VOID)
  135.     {
  136.         ImageLinkFreeList();
  137.     
  138.         SetFileName(NULL);
  139.     
  140.         gnImages = 0;
  141.         fImageDirty = FALSE;
  142.         fFileDirty = FALSE;
  143.         gpImageCur = NULL;
  144.     
  145.         /*
  146.          * Hide the workspace and view windows.
  147.          */
  148.         ShowWindow(ghwndWork, SW_HIDE);
  149.         ViewShow(FALSE);
  150.     
  151.         /*
  152.          * Destroy the image DC's.
  153.          */
  154.         ImageDCDelete();
  155.     
  156.         /*
  157.          * Update the properties bar.
  158.          */
  159.         PropBarClearPos();
  160.         PropBarClearSize();
  161.         PropBarUpdate();
  162.     }
  163.     
  164.     
  165.     
  166.     /************************************************************************
  167.     * OpenDlg
  168.     *
  169.     *
  170.     *
  171.     * Arguments:
  172.     *
  173.     * History:
  174.     *
  175.     ************************************************************************/
  176.     
  177.     BOOL OpenDlg(
  178.         PSTR pszFileName,
  179.         INT iType)
  180.     {
  181.         BOOL fGotName;
  182.         INT idDlg;
  183.         INT idPrevDlg;
  184.         CHAR szFilter[CCHTEXTMAX];
  185.     
  186.         pszFileName[0] = '';
  187.     
  188.         switch (iType) {
  189.             case FT_BITMAP:
  190.             case FT_ICON:
  191.             case FT_CURSOR:
  192.                 AddFilterString(szFilter, ids(IDS_BMPFILTER),
  193.                         ids(IDS_BMPFILTEREXT), TRUE);
  194.                 AddFilterString(szFilter, ids(IDS_ICOFILTER),
  195.                         ids(IDS_ICOFILTEREXT), FALSE);
  196.                 AddFilterString(szFilter, ids(IDS_CURFILTER),
  197.                         ids(IDS_CURFILTEREXT), FALSE);
  198.                 AddFilterString(szFilter, ids(IDS_ALLFILTER),
  199.                         ids(IDS_ALLFILTEREXT), FALSE);
  200.     
  201.                 ofn.nFilterIndex = iType + 1;
  202.                 idDlg = DID_COMMONFILEOPEN;
  203.     
  204.                 break;
  205.     
  206.             case FT_PALETTE:
  207.                 AddFilterString(szFilter, ids(IDS_PALFILTER),
  208.                         ids(IDS_PALFILTEREXT), TRUE);
  209.                 AddFilterString(szFilter, ids(IDS_ALLFILTER),
  210.                         ids(IDS_ALLFILTEREXT), FALSE);
  211.     
  212.                 ofn.nFilterIndex = 1;
  213.                 idDlg = DID_COMMONFILEOPENPAL;
  214.     
  215.                 break;
  216.         }
  217.     
  218.         ofn.lStructSize = sizeof(OPENFILENAME);
  219.         ofn.hwndOwner = ghwndMain;
  220.         ofn.hInstance = NULL;
  221.         ofn.lpstrFilter = szFilter;
  222.         ofn.lpstrCustomFilter = NULL;
  223.         ofn.nMaxCustFilter = 0;
  224.         ofn.lpstrFile = pszFileName;
  225.         ofn.nMaxFile = CCHMAXPATH;
  226.         ofn.lpstrFileTitle = NULL;
  227.         ofn.nMaxFileTitle = 0;
  228.         ofn.lpstrInitialDir = NULL;
  229.         ofn.lpstrTitle = NULL;
  230.         ofn.Flags = OFN_HIDEREADONLY | OFN_SHOWHELP | OFN_FILEMUSTEXIST |
  231.                 OFN_ENABLEHOOK;
  232.         ofn.nFileOffset = 0;
  233.         ofn.nFileExtension = 0;
  234.         ofn.lpstrDefExt = (LPCSTR)DefExtFromFilter((INT)ofn.nFilterIndex - 1,
  235.                 (PSTR)ofn.lpstrFilter);
  236.         ofn.lCustData = 0;
  237.         ofn.lpfnHook = (LPOFNHOOKPROC)MakeProcInstance(
  238.                 (FARPROC)GetOpenFileNameHook, ghInst);
  239.         ofn.lpTemplateName = NULL;
  240.     
  241.         EnteringDialog(idDlg, &idPrevDlg, TRUE);
  242.         fGotName = GetOpenFileName(&ofn);
  243.         EnteringDialog(idPrevDlg, NULL, FALSE);
  244.     
  245.         FreeProcInstance((FARPROC)ofn.lpfnHook);
  246.     
  247.         return fGotName;
  248.     }
  249.     
  250.     
  251.     
  252.     /************************************************************************
  253.     * SaveAsDlg
  254.     *
  255.     *
  256.     *
  257.     * Arguments:
  258.     *
  259.     * History:
  260.     *
  261.     ************************************************************************/
  262.     
  263.     BOOL SaveAsDlg(
  264.         PSTR pszFileName,
  265.         INT iType)
  266.     {
  267.         INT idDlg;
  268.         BOOL fGotName;
  269.         INT idPrevDlg;
  270.         CHAR szFilter[CCHTEXTMAX];
  271.     
  272.         switch (iType) {
  273.             case FT_BITMAP:
  274.                 AddFilterString(szFilter, ids(IDS_BMPFILTER),
  275.                         ids(IDS_BMPFILTEREXT), TRUE);
  276.     
  277.                 ofn.lpstrDefExt = ids(IDS_DEFEXTBMP);
  278.                 idDlg = DID_COMMONFILESAVE;
  279.     
  280.                 break;
  281.     
  282.             case FT_ICON:
  283.                 AddFilterString(szFilter, ids(IDS_ICOFILTER),
  284.                         ids(IDS_ICOFILTEREXT), TRUE);
  285.     
  286.                 ofn.lpstrDefExt = ids(IDS_DEFEXTICO);
  287.                 idDlg = DID_COMMONFILESAVE;
  288.     
  289.                 break;
  290.     
  291.             case FT_CURSOR:
  292.                 AddFilterString(szFilter, ids(IDS_CURFILTER),
  293.                         ids(IDS_CURFILTEREXT), TRUE);
  294.     
  295.                 ofn.lpstrDefExt = ids(IDS_DEFEXTCUR);
  296.                 idDlg = DID_COMMONFILESAVE;
  297.     
  298.                 break;
  299.     
  300.             case FT_PALETTE:
  301.                 AddFilterString(szFilter, ids(IDS_PALFILTER),
  302.                         ids(IDS_PALFILTEREXT), TRUE);
  303.     
  304.                 ofn.lpstrDefExt = ids(IDS_DEFEXTPAL);
  305.                 idDlg = DID_COMMONFILESAVEPAL;
  306.     
  307.                 break;
  308.         }
  309.     
  310.         ofn.lStructSize = sizeof(OPENFILENAME);
  311.         ofn.hwndOwner = ghwndMain;
  312.         ofn.hInstance = NULL;
  313.         ofn.lpstrFilter = szFilter;
  314.         ofn.lpstrCustomFilter = NULL;
  315.         ofn.nMaxCustFilter = 0;
  316.         ofn.nFilterIndex = 1;
  317.         ofn.lpstrFile = pszFileName;
  318.         ofn.nMaxFile = CCHMAXPATH;
  319.         ofn.lpstrFileTitle = NULL;
  320.         ofn.nMaxFileTitle = 0;
  321.         ofn.lpstrInitialDir = NULL;
  322.         ofn.lpstrTitle = NULL;
  323.         ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_SHOWHELP;
  324.         ofn.nFileOffset = 0;
  325.         ofn.nFileExtension = 0;
  326.         ofn.lCustData = 0;
  327.         ofn.lpfnHook = NULL;
  328.         ofn.lpTemplateName = NULL;
  329.     
  330.         EnteringDialog(idDlg, &idPrevDlg, TRUE);
  331.         fGotName = GetSaveFileName(&ofn);
  332.         EnteringDialog(idPrevDlg, NULL, FALSE);
  333.     
  334.         return fGotName;
  335.     }
  336.     
  337.     
  338.     
  339.     /************************************************************************
  340.     * GetOpenFileNameHook
  341.     *
  342.     * This function is the hook function for the Common Dialogs
  343.     * GetOpenFileName funtion.  It is used to be sure the default
  344.     * extension that is used when the function exits is the same
  345.     * as the image file type that the user specifies they want
  346.     * opened.
  347.     *
  348.     * Arguments:
  349.     *
  350.     * History:
  351.     *
  352.     ************************************************************************/
  353.     
  354.     DIALOGPROC GetOpenFileNameHook(
  355.         HWND hwnd,
  356.         UINT msg,
  357.         WPARAM wParam,
  358.         LPARAM lParam)
  359.     {
  360.         switch (msg) {
  361.             case WM_INITDIALOG:
  362.                 /*
  363.                  * Tell Windows to set the focus for me.
  364.                  */
  365.                 return TRUE;
  366.     
  367.             case WM_COMMAND:
  368.                 /*
  369.                  * Did they change the type of file from the File Type
  370.                  * combo box?
  371.                  */
  372.                 if (GET_WM_COMMAND_ID(wParam, lParam) == DID_COMMDLG_TYPECOMBO &&
  373.                         GET_WM_COMMAND_CMD(wParam, lParam) == CBN_SELCHANGE) {
  374.                     INT iSelect;
  375.     
  376.                     /*
  377.                      * Get the selected file type, then change the default
  378.                      * extension field of the ofn structure to match it.
  379.                      * This ensures that the proper default extension
  380.                      * gets added to the end of the file name if the user
  381.                      * does not specify an extension explicitly.
  382.                      */
  383.                     if ((iSelect = (INT)SendDlgItemMessage(hwnd,
  384.                             DID_COMMDLG_TYPECOMBO, CB_GETCURSEL, 0, 0L))
  385.                             != CB_ERR) {
  386.                         ofn.lpstrDefExt = (LPCSTR)DefExtFromFilter(
  387.                                 iSelect, (PSTR)ofn.lpstrFilter);
  388.                     }
  389.                 }
  390.     
  391.                 break;
  392.         }
  393.     
  394.         /*
  395.          * Process the message normally.
  396.          */
  397.         return FALSE;
  398.     }
  399.     
  400.     
  401.     
  402.     /************************************************************************
  403.     * AddFilterString
  404.     *
  405.     * This function adds a filter string pair to a filter string for
  406.     * use by the common dialog open/save file functions.  The string
  407.     * pair will be added to the end of the given filter string, unless
  408.     * fFirst is TRUE, in which case it will be written out to the
  409.     * start of the buffer.  A double null will always be written out
  410.     * at the end of the filter string.
  411.     *
  412.     * Arguments:
  413.     *   PSTR pszBuf  - Buffer to write to.
  414.     *   PSTR pszType - Type string.  Something like "Icon files (*.ico)".
  415.     *   PSTR pszExt  - Extension string.  Something like "*.ico".
  416.     *   BOOL fFirst  - TRUE if this is the first filter string in the
  417.     *                  buffer.  If FALSE, the new filter string pair will
  418.     *                  be added to the end of pszBuf.
  419.     *
  420.     * History:
  421.     *
  422.     ************************************************************************/
  423.     
  424.     STATICFN VOID NEAR AddFilterString(
  425.         PSTR pszBuf,
  426.         PSTR pszType,
  427.         PSTR pszExt,
  428.         BOOL fFirst)
  429.     {
  430.         PSTR psz;
  431.     
  432.         psz = pszBuf;
  433.     
  434.         /*
  435.          * If this is not the first filter string pair, skip to the
  436.          * terminating double null sequence.
  437.          */
  438.         if (!fFirst) {
  439.             while (*psz || *(psz + 1))
  440.                 psz++;
  441.     
  442.             psz++;
  443.         }
  444.     
  445.         strcpy(psz, pszType);
  446.         psz += strlen(pszType) + 1;
  447.         strcpy(psz, pszExt);
  448.         psz += strlen(pszExt) + 1;
  449.         *psz = '';
  450.     }
  451.     
  452.     
  453.     
  454.     /************************************************************************
  455.     * DefExtFromFilter
  456.     *
  457.     * This function returns the default extension for the given index
  458.     * from the specified filter string chain.  The filter string chain
  459.     * is in the format expected by the GetSaveFileName function.
  460.     *
  461.     * It will return NULL if the filter extension found is "*.*".
  462.     *
  463.     * Arguments:
  464.     *   INT index      - Zero based index to the filter string.
  465.     *   PSTR pszFilter - Pointer to the start of the filter chain.
  466.     *
  467.     * History:
  468.     *
  469.     ************************************************************************/
  470.     
  471.     STATICFN PSTR NEAR DefExtFromFilter(
  472.         INT index,
  473.         PSTR pszFilter)
  474.     {
  475.         if (!pszFilter)
  476.             return NULL;
  477.     
  478.         /*
  479.          * Skip to the specified filter string pair.
  480.          */
  481.         while (index--) {
  482.             pszFilter += strlen(pszFilter) + 1;
  483.             pszFilter += strlen(pszFilter) + 1;
  484.         }
  485.     
  486.         /*
  487.          * Skip the first string, then skip the '*' and the '.'.
  488.          */
  489.         pszFilter += strlen(pszFilter) + 1 + 1 + 1;
  490.     
  491.         /*
  492.          * If the string found was "*.*", return NULL for the default
  493.          * extension.
  494.          */
  495.         if (*pszFilter == '*')
  496.             return NULL;
  497.     
  498.         /*
  499.          * Return a pointer to the default extension.  This will be
  500.          * something like "bmp" or "ico".
  501.          */
  502.         return pszFilter;
  503.     }
  504.     
  505.     
  506.     
  507.     /************************************************************************
  508.     * VerifySaveFile
  509.     *
  510.     * Prompts the user if they want to save the current file to disk.
  511.     * If Yes, calls the appropriate save routine.
  512.     *
  513.     * Returns:
  514.     *   Returns TRUE if either the file was not dirty (no save was done)
  515.     *   or if it was and the user did not want to save it or the file
  516.     *   was dirty and the user wanted to save it and the save was
  517.     *   successful.
  518.     *
  519.     *   Returns FALSE if the user cancelled the operation, or an error
  520.     *   occured with the save.
  521.     *
  522.     * History:
  523.     *
  524.     ************************************************************************/
  525.     
  526.     BOOL VerifySaveFile(VOID)
  527.     {
  528.         if (fImageDirty || fFileDirty) {
  529.             switch (Message(MSG_SAVEFILE,
  530.                     gpszFileName ? gpszFileName : ids(IDS_UNTITLED))) {
  531.                 case IDYES:
  532.                     return SaveFile(FALSE);
  533.     
  534.                 case IDNO:
  535.                     fImageDirty = FALSE;
  536.                     break;
  537.     
  538.                 case IDCANCEL:
  539.                     return FALSE;
  540.             }
  541.         }
  542.     
  543.         return TRUE;
  544.     }
  545.     
  546.     
  547.     
  548.     /************************************************************************
  549.     * SaveFile
  550.     *
  551.     * Does a save of the current file.  If the file is untitled, it
  552.     * will ask the user for a file name.
  553.     *
  554.     * Arguments:
  555.     *   BOOL fSaveAs - TRUE to force a Save As operation (always prompts
  556.     *                  for the file name).
  557.     *
  558.     * Returns:
  559.     *   Returns TRUE if the save was successful.
  560.     *
  561.     *   Returns FALSE if the user cancelled the operation, or an error
  562.     *   occured with the save.
  563.     *
  564.     * History:
  565.     *
  566.     ************************************************************************/
  567.     
  568.     BOOL SaveFile(
  569.         BOOL fSaveAs)
  570.     {
  571.         CHAR szFileName[CCHMAXPATH];
  572.     
  573.         if (gnImages == 0) {
  574.             Message(MSG_NOIMAGES);
  575.             return FALSE;
  576.         }
  577.     
  578.         if (gpszFileName)
  579.             strcpy(szFileName, gszFullFileName);
  580.         else
  581.             *szFileName = '';
  582.     
  583.         if (fSaveAs || !gpszFileName) {
  584.             if (!SaveAsDlg(szFileName, giType))
  585.                 return FALSE;
  586.         }
  587.     
  588.         switch (giType) {
  589.             case FT_BITMAP:
  590.                 return SaveBitmapFile(szFileName);
  591.     
  592.             case FT_ICON:
  593.             case FT_CURSOR:
  594.                 return SaveIconCursorFile(szFileName, giType);
  595.         }
  596.     
  597.         return FALSE;
  598.     }
  599.     
  600.     
  601.     
  602.     /************************************************************************
  603.     * OpenAFile
  604.     *
  605.     * Prompts for a file name to open and then does the loading of it.
  606.     *
  607.     * History:
  608.     *
  609.     ************************************************************************/
  610.     
  611.     BOOL OpenAFile(VOID)
  612.     {
  613.         CHAR szFileName[CCHMAXPATH];
  614.     
  615.         if (OpenDlg(szFileName, giType)) {
  616.             /*
  617.              * Clear out the current resource.
  618.              */
  619.             ClearResource();
  620.     
  621.             LoadFile(szFileName);
  622.     
  623.             return TRUE;
  624.         }
  625.         else {
  626.             return FALSE;
  627.         }
  628.     }
  629.     
  630.     
  631.     
  632.     /************************************************************************
  633.     * LoadFile
  634.     *
  635.     * Loads the specified file for editing.
  636.     *
  637.     * Arguments:
  638.     *   PSTR pszFullFileName - Full path name to the file to load.
  639.     *
  640.     * History:
  641.     *
  642.     ************************************************************************/
  643.     
  644.     STATICFN BOOL NEAR LoadFile(
  645.         PSTR pszFullFileName)
  646.     {
  647.         switch (GetTypeFromExt(pszFullFileName)) {
  648.             case FT_BITMAP:
  649.                 return LoadBitmapFile(pszFullFileName);
  650.     
  651.             case FT_ICON:
  652.                 return LoadIconCursorFile(pszFullFileName, TRUE);
  653.     
  654.             case FT_CURSOR:
  655.                 return LoadIconCursorFile(pszFullFileName, FALSE);
  656.         }
  657.     
  658.         return FALSE;
  659.     }
  660.     
  661.     
  662.     
  663.     /************************************************************************
  664.     * GetTypeFromExt
  665.     *
  666.     * Returns the type of file based on it's file name extension.
  667.     *
  668.     * Arguments:
  669.     *   PSTR pszFileName - File name to check.
  670.     *
  671.     * History:
  672.     *
  673.     ************************************************************************/
  674.     
  675.     STATICFN INT NEAR GetTypeFromExt(
  676.         PSTR pszFileName)
  677.     {
  678.         PSTR pszExt;
  679.     
  680.         pszExt = pszFileName + strlen(pszFileName) - 3;
  681.     
  682.         if (strcmpi(pszExt, ids(IDS_DEFEXTICO)) == 0)
  683.             return FT_ICON;
  684.         else if (strcmpi(pszExt, ids(IDS_DEFEXTCUR)) == 0)
  685.             return FT_CURSOR;
  686.         else
  687.             return FT_BITMAP;
  688.     }
  689.     
  690.     
  691.     
  692.     /************************************************************************
  693.     * OpenCmdLineFile
  694.     *
  695.     * Handles opening of the file specified on the command line.
  696.     *
  697.     * History:
  698.     * Nov 7, 1989   Byron Dazey - Created
  699.     *
  700.     ************************************************************************/
  701.     
  702.     VOID OpenCmdLineFile(
  703.         PSTR pstrFileName)
  704.     {
  705.         CHAR szFullPath[CCHMAXPATH];
  706.         OFSTRUCT OfStruct;
  707.     
  708.         strcpy(szFullPath, pstrFileName);
  709.     
  710.         /*
  711.          * If the file name does not already have an extension,
  712.          * assume it is a bitmap file and add a .BMP extension
  713.          * to it.
  714.          */
  715.         FileCat(szFullPath, ids(IDS_DOTBMP));
  716.     
  717.         if ((HFILE)OpenFile(szFullPath, &OfStruct, OF_EXIST) == (HFILE)-1) {
  718.             Message(MSG_CANTOPEN, pstrFileName);
  719.         }
  720.         else {
  721.             LoadFile(OfStruct.szPathName);
  722.         }
  723.     }
  724.     
  725.     
  726.     
  727.     /************************************************************************
  728.     * FileCat
  729.     *
  730.     * This function checks for an extension on the give file name.
  731.     * If an extension is not found, the extension specified by
  732.     * pchCat is added to the file name.
  733.     *
  734.     * Arguments:
  735.     *     PSTR pch          = The file spec to "cat" the extension to.
  736.     *     PSTR pchCat       = The extension to "cat" on to pch,
  737.     *                         including the '.'
  738.     *
  739.     * History:
  740.     *
  741.     ************************************************************************/
  742.     
  743.     STATICFN VOID NEAR FileCat(
  744.         PSTR pchName,
  745.         PSTR pchCat)
  746.     {
  747.         PSTR pch;
  748.     
  749.         pch = pchName + strlen(pchName);
  750.         pch = FAR2NEAR(AnsiPrev(pchName, pch));
  751.     
  752.         /* back up to '.' or '\' */
  753.         while (*pch != '.') {
  754.             if (*pch == '\' || pch <= pchName) {
  755.                 /* no extension, add one */
  756.                 strcat(pchName, pchCat);
  757.                 return;
  758.             }
  759.     
  760.             pch = FAR2NEAR(AnsiPrev(pchName, pch));
  761.         }
  762.     }
  763.     
  764.     
  765.     
  766.     /************************************************************************
  767.     * MyFileRead
  768.     *
  769.     *
  770.     *
  771.     * Arguments:
  772.     *
  773.     * History:
  774.     *
  775.     ************************************************************************/
  776.     
  777.     BOOL MyFileRead(
  778.         HFILE hf,
  779.         LPSTR lpBuffer,
  780.         UINT nBytes,
  781.         PSTR pszFileName,
  782.         INT iType)
  783.     {
  784.         register UINT cb;
  785.     
  786.         cb = _lread((HFILE)hf, lpBuffer, nBytes);
  787.     
  788.         if (cb == -1) {
  789.             Message(MSG_READERROR, pszFileName);
  790.             return FALSE;
  791.         }
  792.         else if (cb != nBytes) {
  793.             Message((iType == FT_BITMAP) ? MSG_BADBMPFILE : MSG_BADICOCURFILE,
  794.                 pszFileName);
  795.             return FALSE;
  796.         }
  797.         else {
  798.             return TRUE;
  799.         }
  800.     }
  801.     
  802.     
  803.     
  804.     /************************************************************************
  805.     * MyFileWrite
  806.     *
  807.     *
  808.     *
  809.     * Arguments:
  810.     *
  811.     * History:
  812.     *
  813.     ************************************************************************/
  814.     
  815.     BOOL MyFileWrite(
  816.         HFILE hf,
  817.         LPSTR lpBuffer,
  818.         UINT nBytes,
  819.         PSTR pszFileName)
  820.     {
  821.         register UINT cb;
  822.     
  823.         cb = _lwrite((HFILE)hf, lpBuffer, nBytes);
  824.     
  825.         if (cb == -1 || cb != nBytes) {
  826.             Message(MSG_WRITEERROR, pszFileName);
  827.             return FALSE;
  828.         }
  829.         else {
  830.             return TRUE;
  831.         }
  832.     }