Annotation of mstools/samples/sdktools/porttool/ptbkport.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: #include "porttool.h"
                     13: #include "port.h"
                     14: 
                     15: 
                     16: /* define line types returned from GetNextLine */
                     17: #define VALID_LINE      0
                     18: #define COMMENT_LINE    1
                     19: #define EOF_LINE        2
                     20: 
                     21: #define CARRIAGE_RETURN  13
                     22: #define LINE_FEED       10
                     23: 
                     24: /* define worker functions for this module */
                     25: int  WINAPI GetNextLine (char *, int, char *, char *, BOOL *);
                     26: int  WINAPI NextLineLength (char *, char *, int);
                     27: BOOL WINAPI BkFilePortThread (LPBKPORTFILESTRUCT);
                     28: void WINAPI DateTimeStamp (char *);
                     29: 
                     30: 
                     31: 
                     32: /* function creates a background porting thread */
                     33: HANDLE WINAPI StartBkPortThread (LPBKPORTFILESTRUCT    lpBkPort)
                     34: {
                     35:     DWORD    id;
                     36: 
                     37:     /* create thread with initial structure */
                     38:     return (lpBkPort->hThread = CreateThread ((LPSECURITY_ATTRIBUTES)NULL,
                     39:                                      4096,
                     40:                                      (LPTHREAD_START_ROUTINE)BkFilePortThread,
                     41:                                      (LPVOID)lpBkPort,
                     42:                                      0,
                     43:                                      &id));
                     44: }
                     45: 
                     46: 
                     47: /* independent thread function that performs background file porting */
                     48: BOOL WINAPI BkFilePortThread (
                     49:     LPBKPORTFILESTRUCT   lpBkPort)
                     50: {
                     51:     HANDLE     hEvents[nBKPORTEVENTS];
                     52:     HANDLE     hFile;
                     53:     OFSTRUCT   of;
                     54:     DWORD      nFileSize;
                     55:     DWORD       nBytes;
                     56:     HANDLE     hFileBuffer;
                     57:     char       *lpFile, *lpFilePtr;
                     58:     WORD       wComplete, wIssues = 0;
                     59:     int        nLines = 0;
                     60:     BOOL       bCommentOn;
                     61:     HANDLE     hLine;
                     62:     HANDLE     hToken, hIssue, hSuggest, hHelp;
                     63:     RESULT     rIssue;
                     64:     char       *lpLine;
                     65:     char       szHeader[MAX_PATH], szToken[50], szIssue[50], szdt[50],
                     66:                szSuggest[50], szHelp[50], szHelpFile[50], szEOL[50], szNL[5];
                     67: 
                     68: 
                     69:     /* adjust our priority to below normal */
                     70:     SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_BELOW_NORMAL);
                     71: 
                     72:     /* attach our thread input to the parent thread so we can post messages directly */
                     73:     AttachThreadInput (GetCurrentThreadId (),
                     74:                       GetWindowThreadProcessId (lpBkPort->hDlg, NULL),
                     75:                       TRUE);
                     76: 
                     77:     /* load file comment strings */
                     78:     LoadString (GetModuleHandle (NULL), IDS_BKPORTNEWLINE, szNL, 5);
                     79:     LoadString (GetModuleHandle (NULL), IDS_BKPORTHEADER, szHeader, MAX_PATH);
                     80:     LoadString (GetModuleHandle (NULL), IDS_BKPORTTOKEN, szToken, 50);
                     81:     LoadString (GetModuleHandle (NULL), IDS_BKPORTISSUE, szIssue, 50);
                     82:     LoadString (GetModuleHandle (NULL), IDS_BKPORTSUGGEST, szSuggest, 50);
                     83:     LoadString (GetModuleHandle (NULL), IDS_BKPORTHELP, szHelp, 50);
                     84:     LoadString (GetModuleHandle (NULL), IDS_BKPORTHELPFILE, szHelpFile, 50);
                     85:     LoadString (GetModuleHandle (NULL), IDS_BKPORTEOL, szEOL, 50);
                     86: 
                     87:     /* initialize wait events for communication between threads */
                     88:     if (!CreateEvents (hEvents, lpBkPort))
                     89:        return FALSE;
                     90: 
                     91:     /* open file for porting and read into buffer */
                     92:     if ((int)(hFile = (HANDLE)OpenFile (lpBkPort->szFilePath, &of, OF_READWRITE)) == -1)
                     93:        {
                     94:        DestroyEvents (hEvents);
                     95:        return FALSE;
                     96:        }
                     97: 
                     98:     /* global allocate buffer for file */
                     99:     if (!(hFileBuffer = GlobalAlloc (GPTR, (nFileSize = GetFileSize (hFile, NULL))+1)) ||
                    100:        !(lpFile = (char *)GlobalLock (hFileBuffer)))
                    101:        {
                    102:        CloseHandle (hFile);
                    103:        DestroyEvents (hEvents);
                    104:        return FALSE;
                    105:        }
                    106: 
                    107:     /* allocate initial line buffer of reasonable size */
                    108:     hLine = GlobalAlloc (GMEM_MOVEABLE, 1024);
                    109: 
                    110:     /* allocate local memory segments for porttool RESULT strings */
                    111:     if (!(rIssue.lpszToken = LocalLock (hToken = LocalAlloc (LHND, MAXTOKENLEN))) ||
                    112:        !(rIssue.lpszHelpStr = LocalLock (hHelp = LocalAlloc (LHND, MAXHELPLEN))) ||
                    113:        !(rIssue.lpszIssue = LocalLock (hIssue = LocalAlloc (LHND, MAXISSUELEN))) ||
                    114:        !(rIssue.lpszSuggest = LocalLock (hSuggest = LocalAlloc (LHND, MAXSUGGESTLEN))))
                    115:        {
                    116:        CloseHandle (hFile);
                    117:        GlobalUnlock (lpFile);
                    118:        GlobalFree (hFileBuffer);
                    119:        DestroyEvents (hEvents);
                    120:        GlobalFree (hLine);
                    121:        return FALSE;
                    122:        }
                    123: 
                    124:     /* read entire file into buffer and zero terminate */
                    125:     ReadFile (hFile, lpFile, nFileSize, &nBytes, NULL);
                    126:     lpFile[nFileSize] = 0;
                    127:     lpFilePtr = lpFile;
                    128: 
                    129:     /* if bytes read not equal to size of file, abort */
                    130:     if (nBytes != nFileSize)
                    131:        {
                    132:        CloseHandle (hFile);
                    133:        GlobalUnlock (lpFile);
                    134:        GlobalFree (hFileBuffer);
                    135:        DestroyEvents (hEvents);
                    136:        GlobalFree (hLine);
                    137:        return FALSE;
                    138:        }
                    139: 
                    140:     /* reset file to size zero before beginning porting */
                    141:     SetFilePointer (hFile, 0, NULL, FILE_BEGIN);
                    142:     SetEndOfFile (hFile);
                    143:     WriteFile (hFile, szHeader, strlen (szHeader), &nBytes, NULL);
                    144:     WriteFile (hFile, lpBkPort->szFile, strlen (lpBkPort->szFile), &nBytes, NULL);
                    145:     WriteFile (hFile, szEOL, strlen (szEOL), &nBytes, NULL);
                    146:     WriteFile (hFile, szNL, strlen (szNL), &nBytes, NULL);
                    147: 
                    148:     while (TRUE)
                    149:        {
                    150:        /* wait 1ms for either abort or status events to signal */
                    151:        switch (WaitForMultipleObjects (nBKPORTEVENTS, hEvents, FALSE, 1))
                    152:            {
                    153:            case BKPORT_ABORT:
                    154:                {
                    155:                char    szAbort[MAX_PATH];
                    156: 
                    157:                /* create time and date */
                    158:                DateTimeStamp (szdt);
                    159: 
                    160:                /* write header line */
                    161:                WriteFile (hFile, szHeader, strlen (szHeader), &nBytes, NULL);
                    162:                WriteFile (hFile, szdt, strlen (szdt), &nBytes, NULL);
                    163:                WriteFile (hFile, szEOL, strlen (szEOL), &nBytes, NULL);
                    164:                WriteFile (hFile, szNL, strlen (szNL), &nBytes, NULL);
                    165: 
                    166:                /* load abort string and write to file */
                    167:                LoadString (GetModuleHandle (NULL),
                    168:                            IDS_BKPORTABORT,
                    169:                            szAbort,
                    170:                            MAX_PATH);
                    171:                WriteFile (hFile, szAbort, strlen (szAbort), (LPDWORD)&nBytes, NULL);
                    172: 
                    173:                /* write rest of file to disk */
                    174:                WriteFile (hFile,
                    175:                           (VOID *)lpFilePtr,
                    176:                           (nFileSize - (lpFilePtr-lpFile)),
                    177:                           (LPDWORD)&nBytes,
                    178:                           NULL);
                    179: 
                    180:                /* clean up */
                    181:                CloseHandle (hFile);
                    182:                GlobalUnlock (lpFile);
                    183:                GlobalFree (hFileBuffer);
                    184:                GlobalFree (hLine);
                    185:                DestroyEvents (hEvents);
                    186: 
                    187:                /* free RESULT strings */
                    188:                LocalUnlock (hToken); LocalFree (hToken);
                    189:                LocalUnlock (hHelp); LocalFree (hHelp);
                    190:                LocalUnlock (hIssue); LocalFree (hIssue);
                    191:                LocalUnlock (hSuggest); LocalFree (hSuggest);
                    192: 
                    193:                /* exit thread */
                    194:                return FALSE;
                    195:                }
                    196:                break;
                    197: 
                    198:            case BKPORT_STATUS:
                    199:                /* post message to parent thread with status info */
                    200:                PostMessage (lpBkPort->hDlg,
                    201:                             UM_STATUSUPDATE,
                    202:                             MAKELONG (wIssues, wComplete),
                    203:                             nLines);
                    204:                break;
                    205: 
                    206:            case WAIT_TIMEOUT:
                    207:                /* if we timed out ignore */
                    208:                break;
                    209: 
                    210:            default:
                    211:                /* anything else is an error */
                    212:                ErrorNotify (lpBkPort->hDlg, GetLastError ());
                    213:                goto DONE;
                    214:                break;
                    215:            }
                    216: 
                    217:        /* reset line buffer */
                    218:        GlobalReAlloc (hLine,
                    219:                       NextLineLength (lpFilePtr, lpFile, nFileSize),
                    220:                       GMEM_MOVEABLE);
                    221:        lpLine = (char *)GlobalLock (hLine);
                    222:        *lpLine = 0;
                    223: 
                    224:        /* get next line from  file buffer */
                    225:        switch (GetNextLine (lpFile, nFileSize, lpFilePtr, lpLine, &bCommentOn))
                    226:            {
                    227:            /* check valid strings for porting issues */
                    228:            case VALID_LINE:
                    229:                /* initialize rIssue string lengths */
                    230:                *(WORD *)rIssue.lpszToken = MAXTOKENLEN;
                    231:                *(WORD *)rIssue.lpszHelpStr = MAXHELPLEN;
                    232:                *(WORD *)rIssue.lpszIssue = MAXISSUELEN;
                    233:                *(WORD *)rIssue.lpszSuggest = MAXSUGGESTLEN;
                    234: 
                    235:                if (CheckString (lpLine, lpBkPort->dwPTFlags, &rIssue))
                    236:                    {
                    237:                    /* create time and date */
                    238:                    DateTimeStamp (szdt);
                    239: 
                    240:                    /* write header line */
                    241:                    WriteFile (hFile, szNL, strlen (szNL), &nBytes, NULL);
                    242:                    WriteFile (hFile, szHeader, strlen (szHeader), &nBytes, NULL);
                    243:                    WriteFile (hFile, szdt, strlen (szdt), &nBytes, NULL);
                    244:                    WriteFile (hFile, szEOL, strlen (szEOL), &nBytes, NULL);
                    245: 
                    246:                    /* write token line */
                    247:                    WriteFile (hFile, szToken, strlen (szToken), &nBytes, NULL);
                    248:                    WriteFile (hFile,
                    249:                               rIssue.lpszToken,
                    250:                               strlen (rIssue.lpszToken),
                    251:                               &nBytes,
                    252:                               NULL);
                    253:                    WriteFile (hFile, szEOL, strlen (szEOL), &nBytes, NULL);
                    254: 
                    255:                    /* write issue line */
                    256:                    WriteFile (hFile, szIssue, strlen (szIssue), &nBytes, NULL);
                    257:                    WriteFile (hFile,
                    258:                               rIssue.lpszIssue,
                    259:                               strlen (rIssue.lpszIssue),
                    260:                               &nBytes,
                    261:                               NULL);
                    262:                    WriteFile (hFile, szEOL, strlen (szEOL), &nBytes, NULL);
                    263: 
                    264:                    /* if suggestion */
                    265:                    if (*(rIssue.lpszSuggest))
                    266:                        {
                    267:                        WriteFile (hFile, szSuggest, strlen (szSuggest), &nBytes, NULL);
                    268:                        WriteFile (hFile,
                    269:                                   rIssue.lpszSuggest,
                    270:                                   strlen (rIssue.lpszSuggest),
                    271:                                   &nBytes,
                    272:                                   NULL);
                    273:                        WriteFile (hFile, szEOL, strlen (szEOL), &nBytes, NULL);
                    274:                        }
                    275: 
                    276:                    /* if help string */
                    277:                    if (*(rIssue.lpszSuggest))
                    278:                        {
                    279:                        WriteFile (hFile, szHelp, strlen (szHelp), &nBytes, NULL);
                    280:                        WriteFile (hFile,
                    281:                                   rIssue.lpszHelpStr,
                    282:                                   strlen (rIssue.lpszHelpStr),
                    283:                                   &nBytes,
                    284:                                   NULL);
                    285:                        WriteFile (hFile, szHelpFile, strlen (szHelpFile), &nBytes, NULL);
                    286:                        WriteFile (hFile, szEOL, strlen (szEOL), &nBytes, NULL);
                    287:                        }
                    288: 
                    289:                    wIssues++;
                    290:                    }
                    291: 
                    292:            case COMMENT_LINE:
                    293:                /* write line to file whether comment or not */
                    294:                WriteFile (hFile, lpLine, strlen (lpLine), &nBytes, NULL);
                    295:                break;
                    296: 
                    297:            case EOF_LINE:
                    298:                if (*lpLine)
                    299:                    WriteFile (hFile, lpLine, strlen (lpLine), &nBytes, NULL);
                    300:                goto DONE;
                    301:                break;
                    302:            }
                    303: 
                    304:        /* unlock line buffer */
                    305:        GlobalUnlock (hLine);
                    306: 
                    307:        /* update status counts */
                    308:        lpFilePtr += strlen (lpLine);
                    309:        nLines++;
                    310:        wComplete = (WORD)(((lpFilePtr-lpFile)*100)/nFileSize);
                    311:        }
                    312: 
                    313: DONE:
                    314:     /* clean up */
                    315:     CloseHandle (hFile);
                    316:     GlobalUnlock (lpFile);
                    317:     GlobalFree (hFileBuffer);
                    318:     GlobalFree (hLine);
                    319:     DestroyEvents (hEvents);
                    320: 
                    321:     /* free RESULT strings */
                    322:     LocalUnlock (hToken); LocalFree (hToken);
                    323:     LocalUnlock (hHelp); LocalFree (hHelp);
                    324:     LocalUnlock (hIssue); LocalFree (hIssue);
                    325:     LocalUnlock (hSuggest); LocalFree (hSuggest);
                    326: 
                    327:     /* send message to parent that thread is dead */
                    328:     PostMessage (lpBkPort->hDlg,
                    329:                 UM_THREADCOMPLETE,
                    330:                 (WPARAM)lpBkPort->hThread,
                    331:                 0);
                    332: 
                    333:     /* exit thread */
                    334:     return TRUE;
                    335: }
                    336: 
                    337: 
                    338: 
                    339: void WINAPI DateTimeStamp (
                    340:     char    *lpszDT)
                    341: {
                    342:     SYSTEMTIME   dt;
                    343:     char         Buff[10];
                    344: 
                    345:     /* create time and date stamp */
                    346:     GetSystemTime (&dt);
                    347:     strcpy (lpszDT, itoa (dt.wMonth, Buff, 10));
                    348:     strcat (lpszDT, "/");
                    349:     strcat (lpszDT, itoa (dt.wDay, Buff, 10));
                    350:     strcat (lpszDT, "/");
                    351:     strcat (lpszDT, itoa (dt.wYear, Buff, 10));
                    352:     strcat (lpszDT, "    ");
                    353:     strcat (lpszDT, itoa (dt.wHour, Buff, 10));
                    354:     strcat (lpszDT, ":");
                    355:     strcat (lpszDT, itoa (dt.wMinute, Buff, 10));
                    356: }
                    357: 
                    358: 
                    359: 
                    360: 
                    361: 
                    362: BOOL WINAPI CreateEvents (
                    363:     HANDLE               *lphEvents,
                    364:     LPBKPORTFILESTRUCT   lpBkPort)
                    365: {
                    366:     char    szEvent[MAX_PATH];
                    367: 
                    368: 
                    369:     LoadString (GetModuleHandle (NULL), IDS_BKPORTABORT, szEvent, MAX_PATH);
                    370:     strcat (szEvent, lpBkPort->szFile);
                    371:     if (!(lphEvents[BKPORT_ABORT] = CreateEvent (NULL, TRUE, FALSE, szEvent)))
                    372:        return FALSE;
                    373: 
                    374:     LoadString (GetModuleHandle (NULL), IDS_BKPORTSTATUS, szEvent, MAX_PATH);
                    375:     strcat (szEvent, lpBkPort->szFile);
                    376:     if (!(lphEvents[BKPORT_STATUS] = CreateEvent (NULL, TRUE, FALSE, szEvent)))
                    377:        {
                    378:        CloseHandle (lphEvents[BKPORT_ABORT]);
                    379:        return FALSE;
                    380:        }
                    381: 
                    382:     /* return success */
                    383:     return TRUE;
                    384: }
                    385: 
                    386: 
                    387: 
                    388: 
                    389: void WINAPI DestroyEvents (
                    390:     HANDLE    *lphEvents)
                    391: {
                    392:     /* close event handles */
                    393:     CloseHandle (lphEvents[BKPORT_ABORT]);
                    394:     CloseHandle (lphEvents[BKPORT_STATUS]);
                    395: }
                    396: 
                    397: 
                    398: 
                    399: 
                    400: int WINAPI NextLineLength (
                    401:     char    *lpFilePtr,
                    402:     char    *lpFile,
                    403:     int     nFileSize)
                    404: {
                    405:     int    nCnt=0;
                    406:     char   *lpf = lpFilePtr;
                    407: 
                    408:     /* count all characters up to end of file or CR/LF sequence */
                    409:     while (lpf                          &&
                    410:           lpf-lpFile < nFileSize        &&
                    411:           *lpf       != CARRIAGE_RETURN &&
                    412:           *(lpf+1)   != LINE_FEED)
                    413:        {
                    414:        lpf++;
                    415:        nCnt++;
                    416:        }
                    417: 
                    418:     /* length plus 3 for CR/LF/0 terminator sequence */
                    419:     return nCnt + 3;
                    420: }
                    421: 
                    422: 
                    423: 
                    424: 
                    425: int WINAPI GetNextLine (
                    426:     char    *lpFile,
                    427:     int     nFileSize,
                    428:     char    *lpFilePtr,
                    429:     char    *lpLine,
                    430:     BOOL    *bCommentOn)
                    431: {
                    432:     char    *lpf = lpFilePtr;
                    433:     char    *lpl = lpLine;
                    434: 
                    435:     /* copy all characters up to end of file or CR/LF sequence */
                    436:     while (lpf                          &&
                    437:           lpf-lpFile < nFileSize        &&
                    438:           *lpf       != CARRIAGE_RETURN &&
                    439:           *(lpf+1)   != LINE_FEED)
                    440:        *lpl++ = *lpf++;
                    441: 
                    442:     /* check for end of buffer */
                    443:     if (lpf-lpFile >= nFileSize)
                    444:        return EOF_LINE;
                    445: 
                    446:     /* copy carriage return and line feed to line and terminate */
                    447:     *lpl++ = *lpf++;
                    448:     *lpl++ = *lpf++;
                    449:     *lpl = 0;
                    450: 
                    451:     /* increment lpl to first non space character in line */
                    452:     lpl = lpLine;
                    453:     while (*lpl == ' ')
                    454:        lpl++;
                    455: 
                    456:     /* see if single line comments exist */
                    457:     if (*lpl    == '/' &&
                    458:        *(lpl+1) == '/')
                    459:        return COMMENT_LINE;
                    460: 
                    461:     /* see if comments begin */
                    462:     if (*lpl    == '/'  &&
                    463:        *(lpl+1) == '*')
                    464:        *bCommentOn = TRUE;
                    465: 
                    466:     /* if comment on, see if it terminates yet */
                    467:     if (*bCommentOn)
                    468:        {
                    469:        lpl = lpLine;
                    470:        while (*lpl)
                    471:            {
                    472:            if (*lpl     == '*'  &&
                    473:                *(lpl+1) == '/')
                    474:                {
                    475:                *bCommentOn = FALSE;
                    476:                break;
                    477:                }
                    478:            lpl++;
                    479:            }
                    480: 
                    481:        /* if more text on line, valid line */
                    482:        while (*lpl)
                    483:            if (*lpl != '*'      &&
                    484:                *(lpl+1) != '/')
                    485:                return VALID_LINE;
                    486:            else
                    487:                return COMMENT_LINE;
                    488:        }
                    489: 
                    490:     /* if haven't returned yet, must be valid line */
                    491:     return VALID_LINE;
                    492: }

unix.superglobalmegacorp.com

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