|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.