Annotation of mstools/samples/sdktools/imagedit/file.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.