|
|
1.1 ! root 1: #define NOCOMM ! 2: #define NOVIRTUALKEYCODES ! 3: #define NOWINMESSAGES ! 4: #include "cardfile.h" ! 5: ! 6: /*********************************************************************/ ! 7: /* Windows/PM Cardfile Shared Code */ ! 8: /* */ ! 9: /* (c) Copyright Microsoft Corp. 1987,1988 - All Rights Reserved */ ! 10: /*********************************************************************/ ! 11: ! 12: /*********************************************************************/ ! 13: /* The following shared code was developed from the original */ ! 14: /* Cardfile application. This code can be compiled to run under */ ! 15: /* either the Windows or the PM manager environment. All */ ! 16: /* functionality associated with bitmaps or printing has been */ ! 17: /* deleted. Some comments refering to these functions may still be */ ! 18: /* present in the code and should be disregarded. jw. */ ! 19: /*********************************************************************/ ! 20: ! 21: ! 22: /*********************************************************************/ ! 23: /* This file contains the routines for writing and reading */ ! 24: /* information to the disk. All of the procedures in this file */ ! 25: /* consist entirely of shared code. */ ! 26: /*********************************************************************/ ! 27: ! 28: ! 29: ! 30: /*********************************************************************/ ! 31: /* */ ! 32: /* cardfile data files are layed out with the following format: */ ! 33: /* three magic bytes "MGC" */ ! 34: /* a word count of cards in the file */ ! 35: /* array of cardheaders, each one containing: */ ! 36: /* */ ! 37: /* char reserved[6]; bytes available for future use */ ! 38: /* unsigned long lfData; file offset of data */ ! 39: /* unsigned char flags; flags */ ! 40: /* char line[LINELENGTH+1]; 40 character lines plus null */ ! 41: /* */ ! 42: /* These are stored sorted in alphabetical order on the */ ! 43: /* header (line). */ ! 44: /* */ ! 45: /* Following the headers are the cards' data. lfData in a card's */ ! 46: /* header points to somewhere in this area. Each card's data is */ ! 47: /* layed out like this: */ ! 48: /* */ ! 49: /* unsigned bmSize; size in bytes of the bitmap */ ! 50: /* Ooops, this won't work so well when we get 64K bitmaps */ ! 51: /* (Must be 0 for this time round!) */ ! 52: /* */ ! 53: /* If bmSize is > 0 then the card has a bitmap, and then next */ ! 54: /* bytes contain: */ ! 55: /* */ ! 56: /* int cxBitmap; cx in pixels of bitmap */ ! 57: /* int cyBitmap; cy in pixels of bitmap */ ! 58: /* int cxEighths; (x coord of bitmap * 8) / cxFont */ ! 59: /* int cyEighths; (y coord of bitmap * 8) / cyFont */ ! 60: /* BYTE bmBits[bmSize] bitmap bits */ ! 61: /* */ ! 62: /* The x and y coords are in the funny format so that the bitmap */ ! 63: /* will appear in roughly the same place on the card on different */ ! 64: /* displays. */ ! 65: /* */ ! 66: /* Following the bitmap information is the card's text */ ! 67: /* */ ! 68: /* unsigned tSize; size in bytes */ ! 69: /* char Text[tSize]; text characters */ ! 70: /* */ ! 71: /* */ ! 72: /*********************************************************************/ ! 73: ! 74: ! 75: /*********************************************************************/ ! 76: /* MergeCardFile - */ ! 77: /* Merges the file specified by pchName into the current file. */ ! 78: /* */ ! 79: /* Same for PM and Windows */ ! 80: /*********************************************************************/ ! 81: ! 82: BOOL FAR MergeCardFile(pchName) ! 83: PSTR pchName; ! 84: { ! 85: int fh; ! 86: unsigned i; ! 87: char buf[PATHMAX]; ! 88: char MaGiC[4]; ! 89: OFSTRUCT mergereopen; ! 90: LPSTR lpText; ! 91: HANDLE hText; ! 92: unsigned cMergeCards; ! 93: unsigned tSize; ! 94: unsigned lTemp; ! 95: unsigned long lCurPos; ! 96: int result = FALSE; ! 97: ! 98: /* if no extension, append the default one */ ! 99: AppendExtension(pchName, buf); ! 100: ! 101: /* open file */ ! 102: if ((fh = OpenFile((LPSTR)buf, (LPOFSTRUCT)&mergereopen, ! 103: OF_PROMPT | OF_CANCEL)) < 0) ! 104: return(FALSE); ! 105: ! 106: /* now read it in */ ! 107: /* check that the first three bytes signify a Cardfile */ ! 108: MaGiC[3] = 0; ! 109: myread(fh, MaGiC, 3); ! 110: if (Mylstrcmp(MaGiC, "MGC")) ! 111: { ! 112: CardfileOkError(IDS_ENOTVALIDFILE); ! 113: goto MergeClean; ! 114: } ! 115: ! 116: /* read the number of cards in the file */ ! 117: myread(fh, (PSTR)&cMergeCards, sizeof(int)); ! 118: ! 119: /* allocate enough memory for the file */ ! 120: lTemp = (cCards+cMergeCards)*sizeof(CARDHEADER); ! 121: if (!GlobalReAlloc(hCards, lTemp, GMEM_MOVEABLE)) ! 122: { ! 123: MergeInsMem: ! 124: CardfileOkError(IDS_EINSMEMORY); ! 125: goto MergeClean; ! 126: } ! 127: ! 128: /* allocate a buffer for the text on the cards */ ! 129: hText = GlobalAlloc(GHND, (long)CARDTEXTSIZE); ! 130: if (!hText) ! 131: goto MergeInsMem; ! 132: lpText = GlobalLock(hText); ! 133: ! 134: /* for each card in the merged file */ ! 135: for(i = 0; i < cMergeCards; ++i) ! 136: { ! 137: /* read its header */ ! 138: myread(fh, (PSTR)&CurCardHead, sizeof(CARDHEADER)); ! 139: /* save current position, and seek to the data */ ! 140: lCurPos = MyLseek(fh, 0L, 1); ! 141: MyLseek(fh, CurCardHead.lfData, 0); ! 142: ! 143: CurCard.hBitmap = 0; ! 144: ! 145: /* if there's a bitmap, display an error */ ! 146: myread(fh, (PSTR)&CurCard.bmSize, sizeof(int)); ! 147: if (CurCard.bmSize) ! 148: { ! 149: CardfileOkError( IDS_NOBITMAP ); ! 150: goto MergeClean; ! 151: } ! 152: ! 153: /* read text size */ ! 154: myread(fh, (PSTR)&tSize, sizeof(int)); ! 155: ! 156: /* make sure text is no bigger than buffer */ ! 157: if (tSize >= CARDTEXTSIZE) ! 158: tSize = CARDTEXTSIZE-1; ! 159: ! 160: /* read text */ ! 161: mylread(fh, (LPSTR)lpText, tSize); ! 162: *(lpText+tSize) = 0; ! 163: ! 164: /* write out the card, so we'll be able to get it in the future */ ! 165: if (tSize = WriteCurCard(&CurCardHead, &CurCard, lpText)) ! 166: { ! 167: iFirstCard = AddCurCard(); ! 168: } ! 169: ! 170: /* seek to next header */ ! 171: MyLseek(fh, lCurPos, 0); ! 172: if (!tSize) ! 173: goto MergeClean; ! 174: } ! 175: GlobalUnlock(hText); ! 176: GlobalFree(hText); ! 177: fFileDirty = TRUE; ! 178: result = TRUE; ! 179: MergeClean: ! 180: MyClose(fh); ! 181: return(result); ! 182: } ! 183: ! 184: /*********************************************************************/ ! 185: /* ReadCardFile - */ ! 186: /* Reads specified cardfile. */ ! 187: /* */ ! 188: /* Same for PM and Windows */ ! 189: /*********************************************************************/ ! 190: ! 191: BOOL FAR ReadCardFile(pchName) ! 192: PSTR pchName; ! 193: { ! 194: int fh; ! 195: LPCARDHEADER lpTCards; ! 196: unsigned i; ! 197: char buf[PATHMAX]; ! 198: char MaGiC[4]; ! 199: unsigned cNewCards; ! 200: unsigned lTemp; ! 201: int result = FALSE; ! 202: OFSTRUCT tmpmain; ! 203: ! 204: /* if no extension, append the default */ ! 205: AppendExtension(pchName, buf); ! 206: ! 207: /* open file */ ! 208: if ((fh = OpenFile((LPSTR)buf, (LPOFSTRUCT)&tmpmain, ! 209: OF_PROMPT | OF_CANCEL)) < 0) ! 210: return(FALSE); ! 211: ! 212: /* now read it in, and verify that it's a cardfile */ ! 213: MaGiC[3] = 0; ! 214: myread(fh, (PSTR)MaGiC, 3); ! 215: if (Mylstrcmp(MaGiC, "MGC")) ! 216: { ! 217: CardfileOkError(IDS_ENOTVALIDFILE); ! 218: goto ReadClean; ! 219: } ! 220: ! 221: /* read the number of cards in the file */ ! 222: myread(fh, (PSTR)&cNewCards, sizeof(int)); ! 223: ! 224: /* allocate the object to hold all the headers */ ! 225: lTemp = cNewCards * sizeof(CARDHEADER); ! 226: if (!GlobalReAlloc(hCards, lTemp, GMEM_MOVEABLE)) ! 227: { ! 228: CardfileOkError(IDS_EINSMEMORY); ! 229: goto ReadClean; ! 230: } ! 231: /* save card count */ ! 232: cCards = cNewCards; ! 233: lpTCards = (LPCARDHEADER) GlobalLock(hCards); ! 234: ! 235: /* for all cards */ ! 236: for(i = 0; i < cNewCards; ++i) ! 237: { ! 238: /* read the header, and save it */ ! 239: myread(fh, (PSTR)&CurCardHead, sizeof(CARDHEADER)); ! 240: *lpTCards++ = CurCardHead; ! 241: } ! 242: GlobalUnlock(hCards); ! 243: fFileDirty = FALSE; ! 244: ! 245: mainreopen = tmpmain; /* save new OFSTRUCT */ ! 246: Mylstrcpy((LPSTR)CurIFile, (LPSTR)mainreopen.szPathName); ! 247: result = TRUE; ! 248: ReadClean: ! 249: MyClose(fh); ! 250: return(result); ! 251: } ! 252: ! 253: /*********************************************************************/ ! 254: /* AppendExtension - */ ! 255: /* This routine checks for an extension, and if none exists, */ ! 256: /* appends the default (CRD). A single '.' denotes an extension, so */ ! 257: /* here is what this routine will do: */ ! 258: /* FOO -> FOO.CRD */ ! 259: /* FOO. -> FOO. */ ! 260: /* FOO.BAR -> FOO.BAR */ ! 261: /* */ ! 262: /* Same for PM and Windows */ ! 263: /*********************************************************************/ ! 264: ! 265: void FAR AppendExtension(pchName, pchBuf) ! 266: PSTR pchName; ! 267: PSTR pchBuf; ! 268: { ! 269: char *pch1; ! 270: char ch; ! 271: ! 272: /* save name */ ! 273: Mylstrcpy((LPSTR)pchBuf, (LPSTR)pchName); ! 274: ! 275: /* get to end */ ! 276: pch1 = pchBuf + Mylstrlen((LPSTR)pchBuf); ! 277: ! 278: /* scan backwards for beginning or end of filename */ ! 279: while ((ch = *pch1) != '.' && ch != '\\' && ch != ':' && pch1 > pchBuf) ! 280: pch1 = FAR_TO_NEAR( AnsiPrev((LPSTR)pchBuf, (LPSTR)pch1) ); ! 281: ! 282: /* if no '.', need to tack on extension */ ! 283: if (*pch1 != '.') ! 284: Mylstrcat((LPSTR)pchBuf, (LPSTR)".CRD"); ! 285: ! 286: /* what the heck, upper case it */ ! 287: AnsiUpper((LPSTR)pchBuf); ! 288: } ! 289: ! 290: /*********************************************************************/ ! 291: /* WriteCardFile - */ ! 292: /* This routine writes out a cardfile */ ! 293: /* */ ! 294: /* Same for PM and Windows */ ! 295: /*********************************************************************/ ! 296: ! 297: BOOL FAR WriteCardFile(pchName) ! 298: PSTR pchName; ! 299: { ! 300: LPCARDHEADER lpTCards = NULL; /* so cleaning works */ ! 301: char bakName[PATHMAX]; ! 302: unsigned i; ! 303: int fhBak; ! 304: int fhDollar; ! 305: int fhOld; ! 306: int fh; ! 307: unsigned long lCurLoc; ! 308: unsigned long lCardData; ! 309: unsigned bmSize; ! 310: HANDLE hText; ! 311: LPSTR lpText; ! 312: char buf[PATHMAX]; ! 313: unsigned tSize; ! 314: int fSameFile; ! 315: char *pchFileName; ! 316: int result = FALSE; ! 317: CARDHEADER CardHeader; ! 318: LPCARDHEADER lpCards; ! 319: OFSTRUCT bakofStruct; ! 320: ! 321: /* if no extension, append the default one */ ! 322: AppendExtension(pchName, buf); ! 323: ! 324: /* if saving to same file, need to save out to temporary one */ ! 325: if (fSameFile = !Mylstrcmp(buf, CurIFile)) ! 326: { ! 327: /* get a tempfile name */ ! 328: if(!GetTempFileName(CurIFile[0] | TF_FORCEDRIVE, (LPSTR)"CRD", 0, ! 329: (LPSTR)bakName)) ! 330: goto SaveTempProblem; ! 331: } ! 332: else ! 333: /* otherwise, just save to specified file */ ! 334: Mylstrcpy((LPSTR)bakName, (LPSTR)buf); ! 335: ! 336: /* open the new file */ ! 337: fhBak = OpenFile((LPSTR)bakName, (LPOFSTRUCT)&bakofStruct, OF_CREATE); ! 338: /* open files */ ! 339: if (CurIFile[0]) ! 340: pchFileName = CurIFile; ! 341: else ! 342: pchFileName = rgchCardData; ! 343: /* open temporary file */ ! 344: if (fReadOnly) ! 345: goto SaveTempProblem; ! 346: ! 347: fhDollar = OpenFile((LPSTR)pchFileName, (LPOFSTRUCT)&tmpreopen, ! 348: OF_PROMPT | OF_REOPEN | 2); ! 349: if (fhDollar == -1) ! 350: { ! 351: SaveTempProblem: ! 352: CardfileOkError(IDS_EDISKFULLFILE); ! 353: return(FALSE); ! 354: } ! 355: if (fhBak < 0) ! 356: { ! 357: goto CantMakeFile; ! 358: } ! 359: /* if curifile is null, then won't use fhOld */ ! 360: if (CurIFile[0]) ! 361: fhOld = OpenFile((LPSTR)CurIFile, (LPOFSTRUCT)&mainreopen, ! 362: OF_PROMPT | OF_REOPEN); ! 363: ! 364: if (MyLseek(fhBak, 0L, 0) == -1) ! 365: { ! 366: if (CurIFile[0]) ! 367: MyClose(fhOld); ! 368: CantMakeFile: ! 369: MyClose(fhDollar); ! 370: CardfileOkError(IDS_ECANTMAKEFILE); ! 371: return(FALSE); ! 372: } ! 373: /* truncate file */ ! 374: mywrite(fhBak, (PSTR)"", 0); ! 375: ! 376: /* write out cardfile magic bytes */ ! 377: mywrite(fhBak, (PSTR)"MGC", 3); ! 378: ! 379: /* write the number of cards in the file */ ! 380: mywrite(fhBak, (PSTR)&cCards, sizeof(int)); ! 381: lCardData = MyLseek(fhBak, 0L, 1) + (cCards * sizeof(CARDHEADER)); ! 382: ! 383: /* allocate buf for card text */ ! 384: hText = GlobalAlloc(GHND, (long)CARDTEXTSIZE); ! 385: if (!hText) ! 386: { ! 387: MyClose(fhBak); ! 388: MyClose(fhOld); ! 389: MyClose(fhDollar); ! 390: Fdelete(bakName); ! 391: CardfileOkError(IDS_EINSMEMORY); ! 392: goto WriteFileClean; ! 393: } ! 394: ! 395: lpText = (LPSTR)GlobalLock(hText); ! 396: ! 397: /* lock down the card headers */ ! 398: lpCards = lpTCards = (LPCARDHEADER) GlobalLock(hCards); ! 399: ! 400: /* for each card in file */ ! 401: for(i = 0; i < cCards; ++i) ! 402: { ! 403: /* see where the card's data is */ ! 404: if (lpTCards->flags & FTMPFILE) ! 405: fh = fhDollar; ! 406: else ! 407: fh = fhOld; ! 408: /* seek to data */ ! 409: MyLseek(fh, lpTCards->lfData, 0); ! 410: /* get header */ ! 411: CardHeader = *lpTCards++; ! 412: /* clear out tmpfile bit */ ! 413: CardHeader.flags &= (!FTMPFILE); ! 414: CardHeader.lfData = lCardData; ! 415: /* write header */ ! 416: if (mylwrite(fhBak, (LPSTR)&CardHeader, sizeof(CARDHEADER)) ! 417: < sizeof(CARDHEADER)) ! 418: goto WFDiskFull; ! 419: lCurLoc = MyLseek(fhBak, 0L, 1); ! 420: /* seek to data spot in new file */ ! 421: MyLseek(fhBak, lCardData, 0); ! 422: myread(fh, (PSTR)&bmSize, sizeof(int)); ! 423: mywrite(fhBak, (PSTR)&bmSize, sizeof(int)); ! 424: ! 425: /* save text */ ! 426: myread(fh, (PSTR)&tSize, sizeof(int)); ! 427: if (mywrite(fhBak, (PSTR)&tSize, sizeof(int)) < sizeof(int)) ! 428: goto WFDiskFull; ! 429: mylread(fh, (LPSTR)lpText, tSize); ! 430: if (mylwrite(fhBak, (LPSTR)lpText, tSize) < tSize) ! 431: { ! 432: WFDiskFull: ! 433: MyClose(fhBak); ! 434: MyClose(fhOld); ! 435: MyClose(fhDollar); ! 436: Fdelete(bakName); ! 437: CardfileOkError(IDS_EDISKFULLFILE); ! 438: goto WriteFileClean; ! 439: } ! 440: ! 441: lCardData = MyLseek(fhBak, 0L, 1); ! 442: MyLseek(fhBak, lCurLoc, 0); ! 443: } ! 444: MyClose(fhBak); ! 445: if (CurIFile[0]) ! 446: MyClose(fhOld); ! 447: MyLseek(fhDollar, 0L, 0); ! 448: mywrite(fhDollar, (PSTR)"", 0); ! 449: MyClose(fhDollar); ! 450: if (fSameFile) ! 451: { ! 452: Fdelete(buf); ! 453: Frename(bakName, buf); ! 454: fhOld = OpenFile((LPSTR)buf, (LPOFSTRUCT)&mainreopen, 2); ! 455: } ! 456: else ! 457: { ! 458: AnsiUpper((LPSTR)CurIFile); ! 459: fhOld = OpenFile((LPSTR)bakName, (LPOFSTRUCT)&mainreopen, 2); ! 460: } ! 461: ! 462: Mylstrcpy((LPSTR)CurIFile, (LPSTR)mainreopen.szPathName); ! 463: ! 464: MyLseek(fhOld, 5L, 0); ! 465: lpTCards = lpCards; ! 466: for(i = 0; i < cCards; ++i) ! 467: { ! 468: myread(fhOld, (PSTR)&CardHeader, sizeof(CARDHEADER)); ! 469: *lpTCards++ = CardHeader; ! 470: } ! 471: MyClose(fhOld); ! 472: fFileDirty = FALSE; ! 473: result = TRUE; ! 474: WriteFileClean: ! 475: if (hText) ! 476: { ! 477: GlobalUnlock(hText); ! 478: GlobalFree(hText); ! 479: } ! 480: if (lpTCards) ! 481: GlobalUnlock(hCards); ! 482: return(result); ! 483: } ! 484: ! 485: /*********************************************************************/ ! 486: /* WriteCurCard - */ ! 487: /* Write out the data for the current card */ ! 488: /* */ ! 489: /* Same for PM and Windows */ ! 490: /*********************************************************************/ ! 491: ! 492: BOOL FAR WriteCurCard(pCardHead, pCard, lpText) ! 493: PCARDHEADER pCardHead; ! 494: PCARD pCard; ! 495: LPSTR lpText; ! 496: { ! 497: int fh; ! 498: unsigned long lEnd; ! 499: int zero = 0; ! 500: unsigned tSize; ! 501: char *pchFileName; ! 502: unsigned cchWritten; ! 503: ! 504: /* get right string in case of error */ ! 505: if (CurIFile[0]) ! 506: pchFileName = CurIFile; ! 507: else ! 508: pchFileName = rgchCardData; ! 509: ! 510: /* open temp file, if necessary asking for it */ ! 511: ! 512: fh = OpenFile((LPSTR)pchFileName, (LPOFSTRUCT)&tmpreopen, ! 513: OF_CANCEL | OF_PROMPT | OF_REOPEN | 2); ! 514: if (fh == -1) ! 515: { ! 516: CardfileOkError(IDS_EOPENTEMPSAVE); ! 517: return(FALSE); ! 518: } ! 519: ! 520: /* seek to end of temp file */ ! 521: lEnd = MyLseek(fh, 0L, 2); ! 522: ! 523: mywrite(fh, (PSTR)&zero, sizeof(int)); ! 524: ! 525: /* save text */ ! 526: tSize = Mylstrlen((LPSTR)lpText); ! 527: if (tSize >= CARDTEXTSIZE) ! 528: tSize = CARDTEXTSIZE-1; ! 529: if (mywrite(fh, (PSTR)&tSize, sizeof(int)) < sizeof(int)) ! 530: goto WCDiskFull; ! 531: cchWritten = mylwrite(fh, (LPSTR)lpText, tSize); ! 532: MyClose(fh); ! 533: if (cchWritten < tSize) ! 534: { ! 535: WCDiskFull: ! 536: CardfileOkError(IDS_EDISKFULLSAVE); ! 537: return(FALSE); ! 538: } ! 539: pCardHead->flags |= FTMPFILE; ! 540: pCardHead->lfData = lEnd; ! 541: return(TRUE); ! 542: } ! 543: ! 544: /*********************************************************************/ ! 545: /* ReadCurData - */ ! 546: /* Read current card's data */ ! 547: /* */ ! 548: /* Same for PM and Windows */ ! 549: /*********************************************************************/ ! 550: ! 551: BOOL FAR ReadCurCardData(pCardHead, pCard, lpText) ! 552: PCARDHEADER pCardHead; ! 553: PCARD pCard; ! 554: LPSTR lpText; ! 555: { ! 556: int fh; ! 557: unsigned tSize; ! 558: char *pchFileName; ! 559: int result = TRUE; ! 560: ! 561: /* assume no bitmap */ ! 562: pCard->hBitmap = 0; ! 563: ! 564: /* if a new card, then can't get it out of any file */ ! 565: if (pCardHead->flags & FNEW) ! 566: { ! 567: /* no text */ ! 568: lpText = (LPSTR)""; ! 569: return(result); ! 570: } ! 571: ! 572: /* if data is in temp file, get the right file handle */ ! 573: if (pCardHead->flags & FTMPFILE) ! 574: { ! 575: if (CurIFile[0]) ! 576: pchFileName = CurIFile; ! 577: else ! 578: pchFileName = rgchCardData; ! 579: fh = OpenFile((LPSTR)pchFileName, (LPOFSTRUCT)&tmpreopen, ! 580: OF_PROMPT | OF_REOPEN | 2); ! 581: } ! 582: else ! 583: fh = OpenFile((LPSTR)CurIFile, (LPOFSTRUCT)&mainreopen, ! 584: OF_PROMPT | OF_REOPEN); ! 585: ! 586: /* seek to data */ ! 587: MyLseek(fh, pCardHead->lfData, 0); ! 588: ! 589: /* This must be 0 */ ! 590: myread(fh, (PSTR)&(pCard->bmSize), sizeof(int)); ! 591: ! 592: /* read text */ ! 593: myread(fh, (PSTR)&tSize, sizeof(int)); ! 594: if (tSize >= CARDTEXTSIZE) ! 595: tSize = CARDTEXTSIZE-1; ! 596: mylread(fh, (LPSTR)lpText, tSize); ! 597: *(lpText+tSize) = 0; ! 598: MyClose(fh); ! 599: return (result); ! 600: } ! 601: ! 602: /*********************************************************************/ ! 603: /* MakeTmpFile - */ ! 604: /* Create a temporary file, with a random name provided by system */ ! 605: /* */ ! 606: /* Same for PM and Windows */ ! 607: /*********************************************************************/ ! 608: ! 609: void FAR MakeTmpFile() ! 610: { ! 611: int fh; ! 612: ! 613: if(GetTempFileName(CurIFile[0], (LPSTR)"CRD", 0, (LPSTR)TmpFile)) ! 614: { ! 615: if ((fh = OpenFile((LPSTR)TmpFile, (LPOFSTRUCT)&tmpreopen, ! 616: OF_CREATE)) < 0) ! 617: goto CantMakeTmp; ! 618: else ! 619: MyClose(fh); ! 620: } ! 621: else ! 622: { ! 623: /* if can't make temp file, mark "read only", although I'm sure */ ! 624: /* this readonly stuff doesn't work well. Should rarely happen. */ ! 625: CantMakeTmp: ! 626: CardfileOkError(IDS_ECANTMAKETEMP); ! 627: fReadOnly = TRUE; ! 628: } ! 629: } ! 630:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.