Annotation of mstools/samples/porttool/ptbkport.c, revision 1.1

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

unix.superglobalmegacorp.com

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