Annotation of pmsdk/samples/newcard/cffile.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

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