Annotation of ntddk/src/print/pslib/ppd.c, revision 1.1

1.1     ! root        1: //--------------------------------------------------------------------------
        !             2: //
        !             3: // Module Name:  PPD.C
        !             4: //
        !             5: // Brief Description:  This module contains the PSCRIPT driver's PPD
        !             6: // Compiler.
        !             7: //
        !             8: // Author:  Kent Settle (kentse)
        !             9: // Created: 20-Mar-1991
        !            10: //
        !            11: // Copyright (c) 1991 Microsoft Corporation
        !            12: //
        !            13: // This module contains routines which will take an Adobe PPD (printer
        !            14: //--------------------------------------------------------------------------
        !            15: 
        !            16: #include "string.h"
        !            17: #include "pscript.h"
        !            18: 
        !            19: #define TESTING 0
        !            20: #define SIZE_TEST 0
        !            21: 
        !            22: #define MAX_PS_NAME     256
        !            23: 
        !            24: // declarations of routines residing within this module.
        !            25: 
        !            26: VOID InitNTPD(PNTPD);
        !            27: int GetString(char *, PPARSEDATA);
        !            28: void GetDimension(PAPERDIM *, PPARSEDATA);
        !            29: void GetImageableArea(RECTL *, PPARSEDATA);
        !            30: int szLength(char *);
        !            31: VOID BuildNTPD(PNTPD, PTMP_NTPD);
        !            32: DWORD SizeNTPD(PNTPD, PTMP_NTPD);
        !            33: int GetKeyword(TABLE_ENTRY *, PPARSEDATA);
        !            34: VOID GetOptionString(PSTR, DWORD, PPARSEDATA);
        !            35: int GetOptionIndex(TABLE_ENTRY *, PPARSEDATA);
        !            36: int MapToken(char *, TABLE_ENTRY *);
        !            37: VOID GetWord(char *, int, PPARSEDATA);
        !            38: VOID ParsePPD(PNTPD, PTMP_NTPD, PPARSEDATA);
        !            39: BOOL GetLine(PPARSEDATA);
        !            40: VOID UnGetLine(PPARSEDATA);
        !            41: VOID EatWhite(PPARSEDATA);
        !            42: BOOL szIsEqual(char *, char *);
        !            43: BOOL GetBuffer(PPARSEDATA);
        !            44: int GetNumber(PPARSEDATA);
        !            45: int GetFloat(int, PPARSEDATA);
        !            46: int NameComp(CHAR *, CHAR *);
        !            47: VOID ParseProtocols(PPARSEDATA, PNTPD);
        !            48: 
        !            49: // external declarations.
        !            50: 
        !            51: extern TABLE_ENTRY KeywordTable[];
        !            52: extern TABLE_ENTRY SecondKeyTable[];
        !            53: extern TABLE_ENTRY FontTable[];
        !            54: 
        !            55: //--------------------------------------------------------------------------
        !            56: //
        !            57: // VOID InitNTPD(pntpd);
        !            58: // PNTPD    pntpd;
        !            59: //
        !            60: // Fills in the NTPD structure with initial values.
        !            61: //
        !            62: // Returns:
        !            63: //   This routine returns no value.
        !            64: //
        !            65: // History:
        !            66: //   22-Mar-1991    -by-    Kent Settle    (kentse)
        !            67: //  Wrote it.
        !            68: //--------------------------------------------------------------------------
        !            69: 
        !            70: VOID InitNTPD(pntpd)
        !            71: PNTPD   pntpd;
        !            72: {
        !            73:     pntpd->cjThis = sizeof(NTPD);
        !            74:     pntpd->flFlags = 0;
        !            75:     pntpd->ulVersion = (ULONG)NTPD_VERSION;
        !            76:     pntpd->iDefResolution = DEF_RESOLUTION;
        !            77:     pntpd->LangLevel = 1;
        !            78: }
        !            79: 
        !            80: 
        !            81: //--------------------------------------------------------------------------
        !            82: //
        !            83: // VOID ParsePPD(pntpd, ptmp, pdata);
        !            84: // PNTPD        pntpd;
        !            85: // PTMP_NTPD    ptmp;
        !            86: // PPARSEDATA   pdata;
        !            87: //
        !            88: // Parses the PPD file, building the TMP_NTPD structure as it goes.
        !            89: //
        !            90: // Returns:
        !            91: //   This routine returns no value.
        !            92: //
        !            93: // History:
        !            94: //   03-Apr-1991    -by-    Kent Settle    (kentse)
        !            95: //  Wrote it.
        !            96: //--------------------------------------------------------------------------
        !            97: 
        !            98: VOID ParsePPD(pntpd, ptmp, pdata)
        !            99: PNTPD       pntpd;
        !           100: PTMP_NTPD   ptmp;
        !           101: PPARSEDATA  pdata;
        !           102: {
        !           103:     int     iKeyword;
        !           104:     int     i, j;
        !           105:     char    szWord[256];
        !           106: 
        !           107:     while (TRUE)
        !           108:     {
        !           109:         // get the next line from the PPD file.
        !           110: 
        !           111:         if (GetLine(pdata))
        !           112:         {
        !           113: #if TESTING
        !           114:             DbgPrint("Normal End of File.\n");
        !           115: #endif
        !           116:             break;
        !           117:         }
        !           118: 
        !           119:         // get the next Keyword from the PPD file.
        !           120: 
        !           121:         iKeyword = GetKeyword(KeywordTable, pdata);
        !           122: 
        !           123:         // we are done if end of file.
        !           124: 
        !           125:         if (iKeyword == TK_EOF)
        !           126:             break;
        !           127: 
        !           128:         // there will actually be a lot of Keywords we don't care
        !           129:         // about.  for speed's sake, let's trap them here.
        !           130: 
        !           131:         if (iKeyword == TK_UNDEFINED)
        !           132:             continue;
        !           133: 
        !           134:         switch (iKeyword)
        !           135:         {
        !           136:             case COLORDEVICE:
        !           137:                 GetWord(szWord, sizeof(szWord), pdata);
        !           138:                if (!(strncmp(szWord, "True", 4)))
        !           139:                 {
        !           140:                     pntpd->flFlags |= COLOR_DEVICE;
        !           141: #if TESTING
        !           142:                    DbgPrint("Device is Color.\n");
        !           143: #endif
        !           144:                 }
        !           145: #if TESTING
        !           146:                 else
        !           147:                    DbgPrint("Device is Black & White.\n");
        !           148: #endif
        !           149:                 break;
        !           150: 
        !           151:             case VARIABLEPAPER:
        !           152:                GetWord(szWord, sizeof(szWord), pdata);
        !           153:                if (!(strncmp(szWord, "True", 4)))
        !           154:                 {
        !           155:                     pntpd->flFlags |= VARIABLE_PAPER;
        !           156: #if TESTING
        !           157:                    DbgPrint("Device supports Variable Paper.\n");
        !           158: #endif
        !           159:                 }
        !           160: #if TESTING
        !           161:                 else
        !           162:                    DbgPrint("Device does not support Variable Paper.\n");
        !           163: #endif
        !           164:                 break;
        !           165: 
        !           166:             case ENDOFFILE:
        !           167:                 GetWord(szWord, sizeof(szWord), pdata);
        !           168:                 if (!(strncmp(szWord, "False", 5)))
        !           169:                 {
        !           170:                     pntpd->flFlags |= NO_ENDOFFILE;
        !           171: #if TESTING
        !           172:                     DbgPrint("Device does not want Ctrl-D.\n");
        !           173: #endif
        !           174:                 }
        !           175:                 else
        !           176: {
        !           177:                     pntpd->flFlags &= ~NO_ENDOFFILE;
        !           178: #if TESTING
        !           179:                     DbgPrint("Device does want Ctrl-D.\n");
        !           180: #endif
        !           181: }
        !           182: 
        !           183:                 break;
        !           184: 
        !           185:             case DEFAULTMANUALFEED:
        !           186:                 GetWord(szWord, sizeof(szWord), pdata);
        !           187:                if (!(strncmp(szWord, "True", 4)))
        !           188:                 {
        !           189:                     pntpd->flFlags |= MANUALFEED_ON;
        !           190: #if TESTING
        !           191:                    DbgPrint("Device defaults to Manual Feed.\n");
        !           192: #endif
        !           193:                 }
        !           194: #if TESTING
        !           195:                 else
        !           196:                    DbgPrint("Device does not default to Manual Feed.\n");
        !           197: #endif
        !           198:                 break;
        !           199: 
        !           200:             case PROTOCOLS:
        !           201:                 ParseProtocols(pdata, pntpd);
        !           202:                 break;
        !           203: 
        !           204:             case NICKNAME:
        !           205:                 ptmp->cbPrinterName = GetString(ptmp->szPrinterName, pdata);
        !           206: 
        !           207:                 // make room for UNICODE printer name.
        !           208: 
        !           209:                 ptmp->cbPrinterName *= 2;
        !           210: #if TESTING
        !           211:                DbgPrint("PrinterName = %s\n", ptmp->szPrinterName);
        !           212: #endif
        !           213:                 break;
        !           214: 
        !           215:             case PRTVM:
        !           216:                 // fill in the free virtual memory in kilobytes.
        !           217: 
        !           218:                 i = GetNumber(pdata);
        !           219:                 pntpd->cbFreeVM = (i >> 10);
        !           220: #if TESTING
        !           221:                DbgPrint("FreeVM = %d KB.\n", pntpd->cbFreeVM);
        !           222: #endif
        !           223:                 break;
        !           224: 
        !           225:             case LANGUAGELEVEL:
        !           226:                 // fill in the language level.  default to level 1 if
        !           227:                 // level 2 is not specified.
        !           228: 
        !           229:                 i = GetNumber(pdata);
        !           230: 
        !           231:                 if (i != 2)
        !           232:                     i = 1;
        !           233: 
        !           234:                 pntpd->LangLevel = (DWORD)i;
        !           235: #if TESTING
        !           236:                DbgPrint("LanguageLevel = %d.\n", pntpd->LangLevel);
        !           237: #endif
        !           238:                 break;
        !           239: 
        !           240:             case DEFAULTRESOLUTION:
        !           241:                 pntpd->iDefResolution = (USHORT)GetNumber(pdata);
        !           242: #if TESTING
        !           243:                DbgPrint("DefResolution = %d.\n", pntpd->iDefResolution);
        !           244: #endif
        !           245:                 break;
        !           246: 
        !           247:             case SETRESOLUTION:
        !           248:             case RESOLUTION:
        !           249:                 // increment the resolution count.  for most printers, which
        !           250:                 // do not support this, pntpd->cResolutions will be zero.
        !           251:                 // this obviously means to use the defaultresolution.
        !           252: 
        !           253:                 i = pntpd->cResolutions;
        !           254:                 i++;
        !           255:                 if (i > MAX_RESOLUTIONS)
        !           256:                 {
        !           257:                     RIP("Too Many Resolutions\n");
        !           258:                     break;
        !           259:                 }
        !           260:                 pntpd->cResolutions = (USHORT)i;
        !           261: 
        !           262:                 // get the resolution itself.
        !           263: 
        !           264:                 i--;
        !           265:                 ptmp->siResolutions[i].usIndex = (USHORT)GetNumber(pdata);
        !           266: #if TESTING
        !           267:                DbgPrint("Resolution Value = %d\n",
        !           268:                          ptmp->siResolutions[i].usIndex);
        !           269: #endif
        !           270:                 // now get the string to send to the printer to set the
        !           271:                 // resolution.
        !           272: 
        !           273:                 GetString(ptmp->siResolutions[i].szString, pdata);
        !           274:                 break;
        !           275: 
        !           276:             case SCREENFREQ:
        !           277:                 // the screen frequency is stored within quotes.
        !           278:                 // advance to first quotation mark, then one character past.
        !           279: 
        !           280:                 while (*(pdata->szLine) != '"')
        !           281:                     pdata->szLine++;
        !           282:                 pdata->szLine++;
        !           283: 
        !           284:                 pntpd->iScreenFreq = (USHORT)GetFloat(10, pdata);
        !           285: #if TESTING
        !           286:                DbgPrint("ScreenFrequency * 10 = %d\n", pntpd->iScreenFreq);
        !           287: #endif
        !           288:                 break;
        !           289: 
        !           290:             case SCREENANGLE:
        !           291:                 // the screen angle is stored within quotes.
        !           292:                 // advance to first quotation mark, then one character past.
        !           293: 
        !           294:                 while (*(pdata->szLine) != '"')
        !           295:                     pdata->szLine++;
        !           296:                 pdata->szLine++;
        !           297: 
        !           298:                 pntpd->iScreenAngle = (USHORT)GetFloat(10, pdata);
        !           299: #if TESTING
        !           300:                DbgPrint("ScreenAngle * 10 = %d\n", pntpd->iScreenAngle);
        !           301: #endif
        !           302:                 break;
        !           303: 
        !           304:             case TRANSFER:
        !           305:                 // GetOptionIndex will get the string defining the type
        !           306:                 // of transfer function.  Normalized is the one we
        !           307:                 // care about.
        !           308: 
        !           309:                 i = GetOptionIndex(SecondKeyTable, pdata);
        !           310:                 if (i == NORMALIZED)
        !           311:                 {
        !           312:                     ptmp->cbTransferNorm = GetString(ptmp->szTransferNorm, pdata);
        !           313: #if TESTING
        !           314:                    DbgPrint("TransferNormalized = %s\n",
        !           315:                              ptmp->szTransferNorm);
        !           316: #endif
        !           317:                 }
        !           318:                 else if (i == NORM_INVERSE)
        !           319:                 {
        !           320:                     ptmp->cbInvTransferNorm = GetString(ptmp->szInvTransferNorm, pdata);
        !           321: #if TESTING
        !           322:                    DbgPrint("InvTransferNormalized = %s\n",
        !           323:                              ptmp->szInvTransferNorm);
        !           324: #endif
        !           325:                 }
        !           326: 
        !           327:                 break;
        !           328: 
        !           329:             case DUPLEX:
        !           330:                 // GetOptionIndex will get the string defining the type
        !           331:                 // of duplex function.
        !           332: 
        !           333:                 i = GetOptionIndex(SecondKeyTable, pdata);
        !           334: 
        !           335:                 switch (i)
        !           336:                 {
        !           337:                     case OPTION_FALSE:
        !           338:                         ptmp->cbDuplexNone = GetString(ptmp->szDuplexNone, pdata);
        !           339: #if TESTING
        !           340:                         DbgPrint("szDuplexNone = %s.\n", ptmp->szDuplexNone);
        !           341: #endif
        !           342:                         break;
        !           343: 
        !           344:                     case OPTION_TRUE:
        !           345:                         ptmp->cbDuplexNoTumble = GetString(ptmp->szDuplexNoTumble, pdata);
        !           346: #if TESTING
        !           347:                         DbgPrint("szDuplexNoTumble = %s.\n", ptmp->szDuplexNoTumble);
        !           348: #endif
        !           349:                         break;
        !           350: 
        !           351:                     case OPTION_NONE:
        !           352:                         ptmp->cbDuplexNone = GetString(ptmp->szDuplexNone, pdata);
        !           353: #if TESTING
        !           354:                         DbgPrint("szDuplexNone = %s.\n", ptmp->szDuplexNone);
        !           355: #endif
        !           356:                         break;
        !           357: 
        !           358:                     case DUPLEX_TUMBLE:
        !           359:                         ptmp->cbDuplexTumble = GetString(ptmp->szDuplexTumble, pdata);
        !           360: #if TESTING
        !           361:                         DbgPrint("szDuplexTumble = %s.\n", ptmp->szDuplexTumble);
        !           362: #endif
        !           363:                         break;
        !           364: 
        !           365:                     case DUPLEX_NO_TUMBLE:
        !           366:                         ptmp->cbDuplexNoTumble = GetString(ptmp->szDuplexNoTumble, pdata);
        !           367: #if TESTING
        !           368:                         DbgPrint("szDuplexNoTumble = %s.\n", ptmp->szDuplexNoTumble);
        !           369: #endif
        !           370:                         break;
        !           371:                 }
        !           372: 
        !           373:                 break;
        !           374: 
        !           375:             case COLLATE:
        !           376:                 // GetOptionIndex will get the string defining the type
        !           377:                 // of collate function.
        !           378: 
        !           379:                 i = GetOptionIndex(SecondKeyTable, pdata);
        !           380:                 if (i == OPTION_TRUE)
        !           381:                 {
        !           382:                     ptmp->cbCollateOn = GetString(ptmp->szCollateOn, pdata);
        !           383: #if TESTING
        !           384:                    DbgPrint("CollateOn = %s\n",
        !           385:                              ptmp->szCollateOn);
        !           386: #endif
        !           387:                 }
        !           388:                 else if (i == OPTION_FALSE)
        !           389:                 {
        !           390:                     ptmp->cbCollateOff = GetString(ptmp->szCollateOff, pdata);
        !           391: #if TESTING
        !           392:                    DbgPrint("CollateOff = %s\n",
        !           393:                              ptmp->szCollateOff);
        !           394: #endif
        !           395:                 }
        !           396: 
        !           397:                 break;
        !           398: 
        !           399:             case DEFAULTPAGESIZE:
        !           400:                 // GetOptionIndex, will get the string defining the defaultpagesize,
        !           401:                 // and return the corresponding value from PaperTable.
        !           402: 
        !           403:                 GetOptionString(ptmp->szDefaultForm, sizeof(ptmp->szDefaultForm),
        !           404:                             pdata);
        !           405: 
        !           406: #if TESTING
        !           407:                 DbgPrint("DefaultForm = %s.\n", ptmp->szDefaultForm);
        !           408: #endif
        !           409:                 break;
        !           410: 
        !           411:             case PAGESIZE:
        !           412:                 // increment the paper size count.
        !           413: 
        !           414:                 i = pntpd->cPSForms;
        !           415: 
        !           416:                 if (i >= MAX_PAPERSIZES)
        !           417:                 {
        !           418:                     RIP("Too Many PaperSizes.\n");
        !           419:                     break;
        !           420:                 }
        !           421: 
        !           422:                 pntpd->cPSForms++;
        !           423: 
        !           424:                 // get the form name.
        !           425: 
        !           426:                 GetOptionString(ptmp->FormEntry[i].szName,
        !           427:                             sizeof(ptmp->FormEntry[i].szName), pdata);
        !           428: 
        !           429:                 // now get the form invocation string to send to the printer.
        !           430: 
        !           431:                 GetString(ptmp->FormEntry[i].szInvocation, pdata);
        !           432: 
        !           433:                 break;
        !           434: 
        !           435:             case PAGEREGION:
        !           436:                 // increment the page region count.
        !           437: 
        !           438:                 i = pntpd->cPageRegions;
        !           439: 
        !           440:                 if (i >= MAX_PAPERSIZES)
        !           441:                 {
        !           442:                     RIP("Too Many PageRegions.\n");
        !           443:                     break;
        !           444:                 }
        !           445:                 pntpd->cPageRegions++;
        !           446: 
        !           447:                 // get the form name, and the invocation string to
        !           448:                 // set the page region.
        !           449: 
        !           450:                 GetOptionString(ptmp->PageRegion[i].szName,
        !           451:                             sizeof(ptmp->PageRegion[i].szName), pdata);
        !           452: 
        !           453: #if TESTING
        !           454:                DbgPrint("PageRegion %s.\n", ptmp->PageRegion[i].szName);
        !           455: #endif
        !           456: 
        !           457:                 // now get the pageregion invocation string.
        !           458: 
        !           459:                 GetString(ptmp->PageRegion[i].szInvocation, pdata);
        !           460: 
        !           461:                 break;
        !           462: 
        !           463:             case IMAGEABLEAREA:
        !           464:                 // increment the imageablearea count.
        !           465: 
        !           466:                 i = ptmp->cImageableAreas;
        !           467: 
        !           468:                 if (i >= MAX_PAPERSIZES)
        !           469:                 {
        !           470:                     RIP("Too Many ImageableAreas.\n");
        !           471:                     break;
        !           472:                 }
        !           473: 
        !           474:                 ptmp->cImageableAreas++;
        !           475: 
        !           476:                 // get the form name.
        !           477: 
        !           478:                 GetOptionString(ptmp->ImageableArea[i].szForm,
        !           479:                                 sizeof(ptmp->ImageableArea[i].szForm),
        !           480:                                 pdata);
        !           481: 
        !           482:                 // now get the rectangle of the imageablearea.
        !           483: 
        !           484:                 GetImageableArea(&ptmp->ImageableArea[i].rect, pdata);
        !           485: #if TESTING
        !           486:                DbgPrint("ImageableArea %s = %d %d %d %d\n",
        !           487:                          ptmp->ImageableArea[i].szForm,
        !           488:                          ptmp->ImageableArea[i].rect.left,
        !           489:                          ptmp->ImageableArea[i].rect.top,
        !           490:                          ptmp->ImageableArea[i].rect.right,
        !           491:                          ptmp->ImageableArea[i].rect.bottom);
        !           492: #endif
        !           493:                 break;
        !           494: 
        !           495:             case PAPERDIMENSION:
        !           496:                 // increment the paperdimension count.
        !           497: 
        !           498:                 i = ptmp->cPaperDimensions;
        !           499: 
        !           500:                 if (i >= MAX_PAPERSIZES)
        !           501:                 {
        !           502:                     RIP("Too Many PaperDimensions.\n");
        !           503:                     break;
        !           504:                 }
        !           505: 
        !           506:                 ptmp->cPaperDimensions++;
        !           507: 
        !           508:                 GetOptionString(ptmp->PaperDimension[i].szForm,
        !           509:                                 sizeof(ptmp->PaperDimension[i].szForm),
        !           510:                                 pdata);
        !           511: 
        !           512:                 // now get the rectangle of the paper itself.
        !           513: 
        !           514:                 GetDimension(&ptmp->PaperDimension[i], pdata);
        !           515: #if TESTING
        !           516:                DbgPrint("PaperDimension %s = %d %d\n",
        !           517:                          ptmp->PaperDimension[i].szForm,
        !           518:                          ptmp->PaperDimension[i].sizl.cx,
        !           519:                          ptmp->PaperDimension[i].sizl.cy);
        !           520: #endif
        !           521:                 break;
        !           522: 
        !           523:             case DEFAULTOUTPUTBIN:
        !           524:                 GetOptionString(ptmp->szDefaultOutputBin,
        !           525:                                 sizeof(ptmp->szDefaultOutputBin), pdata);
        !           526: 
        !           527: #if TESTING
        !           528:                DbgPrint("DefaultOutputBin = %s\n", ptmp->szDefaultOutputBin);
        !           529: #endif
        !           530:                 break;
        !           531: 
        !           532: 
        !           533:             case OUTPUTBIN:
        !           534:                 // increment the output bin count.
        !           535: 
        !           536:                 i = pntpd->cOutputBins;
        !           537:                 i++;
        !           538:                 if (i > MAX_BINS)
        !           539:                 {
        !           540:                     RIP("Too Many OutputBins.\n");
        !           541:                     break;
        !           542:                 }
        !           543:                 pntpd->cOutputBins = (USHORT)i;
        !           544: 
        !           545:                 i--;
        !           546: 
        !           547:                 GetOptionString(ptmp->siOutputBin[i].szName,
        !           548:                                 sizeof(ptmp->siOutputBin[i].szName), pdata);
        !           549: #if TESTING
        !           550:                DbgPrint("OutputBin Name = %s\n", ptmp->siOutputBin[i].szName);
        !           551: #endif
        !           552: 
        !           553:                 // now get the string to send to the printer to set the
        !           554:                 // outputbin.
        !           555: 
        !           556:                 GetString(ptmp->siOutputBin[i].szInvocation, pdata);
        !           557:                 break;
        !           558: 
        !           559:             case DEFAULTINPUTSLOT:
        !           560:                 GetOptionString(ptmp->szDefaultInputSlot,
        !           561:                                 sizeof(ptmp->szDefaultInputSlot), pdata);
        !           562: 
        !           563: #if TESTING
        !           564:                DbgPrint("DefaultInputSlot = %s\n", ptmp->szDefaultInputSlot);
        !           565: #endif
        !           566:                 break;
        !           567: 
        !           568: 
        !           569:             case INPUTSLOT:
        !           570:                 // increment the output bin count.
        !           571: 
        !           572:                 i = pntpd->cInputSlots;
        !           573:                 i++;
        !           574:                 if (i > MAX_BINS)
        !           575:                 {
        !           576:                     RIP("Too Many InputSlots.\n");
        !           577:                     break;
        !           578:                 }
        !           579:                 pntpd->cInputSlots = (USHORT)i;
        !           580: 
        !           581:                 i--;
        !           582: 
        !           583:                 GetOptionString(ptmp->siInputSlot[i].szName,
        !           584:                                 sizeof(ptmp->siInputSlot[i].szName), pdata);
        !           585: 
        !           586: #if TESTING
        !           587:                DbgPrint("InputSlot Name = %s\n", ptmp->siInputSlot[i].szName);
        !           588: #endif
        !           589: 
        !           590:                 // now get the string to send to the printer to set the
        !           591:                 // inputslot.
        !           592: 
        !           593:                 GetString(ptmp->siInputSlot[i].szInvocation, pdata);
        !           594:                 break;
        !           595: 
        !           596:             case MANUALFEED:
        !           597:                 // GetOptionIndex will get the string defining the type
        !           598:                 // of ManualFeed function.
        !           599: 
        !           600:                 i = GetOptionIndex(SecondKeyTable, pdata);
        !           601: 
        !           602:                 if (i == OPTION_TRUE)
        !           603:                 {
        !           604:                     // get and save the string to set manual feed to TRUE
        !           605:                     // for the given printer.
        !           606: 
        !           607:                     ptmp->cbManualTRUE = GetString(ptmp->szManualTRUE, pdata);
        !           608:                 }
        !           609:                 else if (i == OPTION_FALSE)
        !           610:                 {
        !           611:                     // get and save the string to set manual feed to FALSE
        !           612:                     // for the given printer.
        !           613: 
        !           614:                     ptmp->cbManualFALSE = GetString(ptmp->szManualFALSE, pdata);
        !           615:                 }
        !           616: 
        !           617:                 break;
        !           618: 
        !           619:             case DEFAULTFONT:
        !           620:                 // GetOptionIndex, will get the string defining the defaultfont,
        !           621:                 // and return the corresponding value from FontTable.
        !           622: 
        !           623:                 i = GetOptionIndex(FontTable, pdata);
        !           624:                 pntpd->usDefaultFont = (USHORT)i;
        !           625: #if TESTING
        !           626:                DbgPrint("DefaultFont = %d\n", i);
        !           627: #endif
        !           628:                 break;
        !           629: 
        !           630:             case DEVICE_FONT:
        !           631:                 // get the index of the font.
        !           632: 
        !           633:                 j = GetOptionIndex(FontTable, pdata);
        !           634: 
        !           635:                 if (j == TK_UNDEFINED)
        !           636:                 {
        !           637: #if TESTING
        !           638:                     DbgPrint("ParsePPD: font not found.\n");
        !           639: #endif
        !           640:                     break;
        !           641:                 }
        !           642: 
        !           643:                 // increment the font counter if the font was valid.
        !           644: 
        !           645:                 i = pntpd->cFonts;
        !           646:                 i++;
        !           647: 
        !           648:                 if (i > MAX_FONTS)
        !           649:                 {
        !           650:                     RIP("Too Many Fonts.\n");
        !           651:                     break;
        !           652:                 }
        !           653: 
        !           654:                 pntpd->cFonts = (USHORT)i;
        !           655: 
        !           656:                 // GetOptionIndex, will get the string defining the font,
        !           657:                 // and return the corresponding value from FontTable.
        !           658: 
        !           659:                 i--;
        !           660: 
        !           661:                 ptmp->bFonts[i] = (BYTE)j;
        !           662: #if TESTING
        !           663:                DbgPrint("Font Value = %d\n", j);
        !           664: #endif
        !           665:                 break;
        !           666: 
        !           667:             default:
        !           668:                 break;
        !           669:         }
        !           670:     }
        !           671: }
        !           672: 
        !           673: 
        !           674: //--------------------------------------------------------------------------
        !           675: //
        !           676: // VOID BuildNTPD(pntpd, ptmp);
        !           677: // PNTPD        pntpd;
        !           678: // PTMP_NTPD    ptmp;
        !           679: //
        !           680: // Fills in the NTPD structure with values derived from the TMP_NTPD
        !           681: // structure.
        !           682: //
        !           683: // Returns:
        !           684: //   This routine returns no value.
        !           685: //
        !           686: // History:
        !           687: //   25-Mar-1991    -by-    Kent Settle    (kentse)
        !           688: //  Wrote it.
        !           689: //--------------------------------------------------------------------------
        !           690: 
        !           691: VOID BuildNTPD(pntpd, ptmp)
        !           692: PNTPD       pntpd;
        !           693: PTMP_NTPD   ptmp;
        !           694: {
        !           695:     DWORD           i, j;
        !           696:     BYTE           *pfont;
        !           697:     PSRESOLUTION   *pRes;
        !           698:     PSFORM         *pForm;
        !           699:     PSOUTPUTBIN    *pBin;
        !           700:     PSINPUTSLOT    *pSlot;
        !           701: 
        !           702:     // start by adding the printer name to the end of the NTPD structure.
        !           703:     // the printer name is stored as a UNICODE string, so it needs to be
        !           704:     // WCHAR aligned.
        !           705: 
        !           706: #if SIZE_TEST
        !           707:     DbgPrint("Entering BuildNTPD: cjThis = %d.\n", pntpd->cjThis);
        !           708: #endif
        !           709: 
        !           710:     pntpd->cjThis = WCHARALIGN(pntpd->cjThis);
        !           711: 
        !           712: #if DBG
        !           713:     // make sure alignment is proper.
        !           714: 
        !           715:     ASSERTPS(((pntpd->cjThis % sizeof(WCHAR)) == 0),
        !           716:              "pntpd->lowszPrinterName not properly aligned.\n");
        !           717: #endif
        !           718: 
        !           719:     pntpd->lowszPrinterName = pntpd->cjThis;
        !           720: 
        !           721:     strcpy2WChar((PWSTR)((PSTR)pntpd + pntpd->lowszPrinterName),
        !           722:                  ptmp->szPrinterName);
        !           723: 
        !           724: #if TESTING
        !           725:     DbgPrint("PrinterName = %ws\n",
        !           726:              (PWSTR)((PSTR)pntpd + pntpd->lowszPrinterName));
        !           727: #endif
        !           728: 
        !           729:     // now add the set resolution strings to the end of the structure,
        !           730:     // if there are any to add.  it is worth noting how these are stored
        !           731:     // in the NTPD structure.  an array of cResolutions PSRESOLUTION
        !           732:     // structures are stored at the end of the NTPD structure.  within
        !           733:     // each PSRESOLUTION structure is an offset to the string corresponding
        !           734:     // to the resolution in question.
        !           735: 
        !           736:     // the start of the PSRESOLUTION array must be DWORD aligned.
        !           737: 
        !           738:     pntpd->cjThis += ptmp->cbPrinterName;
        !           739:     pntpd->cjThis = DWORDALIGN(pntpd->cjThis);
        !           740: 
        !           741: #if DBG
        !           742:     // make sure alignment is proper.
        !           743: 
        !           744:     ASSERTPS(((pntpd->cjThis % sizeof(DWORD)) == 0),
        !           745:              "pntpd->loResolution not properly aligned.\n");
        !           746: #endif
        !           747: 
        !           748:     pntpd->loResolution = pntpd->cjThis;
        !           749: 
        !           750: #if SIZE_TEST
        !           751:     DbgPrint("post cbPrinterName: cjThis = %d.\n", pntpd->cjThis);
        !           752: #endif
        !           753: 
        !           754:     if (pntpd->cResolutions != 0)
        !           755:     {
        !           756:         // add the PSRESOLUTION array to the end of the NTPD structure.
        !           757: 
        !           758:         pntpd->cjThis += pntpd->cResolutions * sizeof(PSRESOLUTION);
        !           759: 
        !           760:         pRes = (PSRESOLUTION *)((CHAR *)pntpd + pntpd->loResolution);
        !           761: 
        !           762:         // for each resolution, fill in the PSRESOLUTION structure.
        !           763:         // then add the string itself to the end of the NTPD structure.
        !           764: 
        !           765:         for (i = 0; i < (DWORD)pntpd->cResolutions; i++)
        !           766:         {
        !           767:             pRes[i].iValue = (DWORD)ptmp->siResolutions[i].usIndex;
        !           768:             pRes[i].loInvocation = pntpd->cjThis;
        !           769: 
        !           770:             j = szLength(ptmp->siResolutions[i].szString);
        !           771:             memcpy((CHAR *)pntpd + pntpd->cjThis,
        !           772:                    ptmp->siResolutions[i].szString, j);
        !           773:             pntpd->cjThis += j;
        !           774:         }
        !           775:     }
        !           776: 
        !           777: #if SIZE_TEST
        !           778:     DbgPrint("post resolutions: cjThis = %d.\n", pntpd->cjThis);
        !           779: #endif
        !           780: 
        !           781:     // add the transfernormalized string to the end of the structure.
        !           782:     // check to make sure we have a string to copy.
        !           783: 
        !           784:     i = (USHORT)ptmp->cbTransferNorm;
        !           785: 
        !           786:     if (i != 0)
        !           787:     {
        !           788:         pntpd->loszTransferNorm = pntpd->cjThis;
        !           789:         pntpd->cjThis += i;
        !           790: 
        !           791:         memcpy((CHAR *)pntpd + pntpd->loszTransferNorm,
        !           792:                ptmp->szTransferNorm, i);
        !           793:     }
        !           794: 
        !           795: #if SIZE_TEST
        !           796:     DbgPrint("post cbTransferNorm: cjThis = %d.\n", pntpd->cjThis);
        !           797: #endif
        !           798: 
        !           799: #if TESTING
        !           800:     if (i != 0)
        !           801:        DbgPrint("Transfer Normalized Not Found.\n");
        !           802:     else
        !           803:        DbgPrint("Transfer Normalized = %s\n", ptmp->szTransferNorm);
        !           804: #endif
        !           805: 
        !           806:     // add the inverse transfernormalized string to the end of the structure.
        !           807:     // check to make sure we have a string to copy.
        !           808: 
        !           809:     if (i = ptmp->cbInvTransferNorm)
        !           810:     {
        !           811:         pntpd->loszInvTransferNorm = pntpd->cjThis;
        !           812:         pntpd->cjThis += i;
        !           813: 
        !           814:         memcpy((CHAR *)pntpd + pntpd->loszInvTransferNorm,
        !           815:                ptmp->szInvTransferNorm, i);
        !           816:     }
        !           817: 
        !           818: #if SIZE_TEST
        !           819:     DbgPrint("post cbInvTransferNorm: cjThis = %d.\n", pntpd->cjThis);
        !           820: #endif
        !           821: 
        !           822: #if TESTING
        !           823:     if (i != 0)
        !           824:        DbgPrint("Inverse Transfer Normalized Not Found.\n");
        !           825:     else
        !           826:        DbgPrint("Inverse Transfer Normalized = %s\n", ptmp->szTransferNorm);
        !           827: #endif
        !           828: 
        !           829:     // fill in the default form name.
        !           830: 
        !           831:     pntpd->loDefaultForm = pntpd->cjThis;
        !           832:     strcpy((CHAR *)pntpd + pntpd->loDefaultForm, ptmp->szDefaultForm);
        !           833:     pntpd->cjThis += szLength(ptmp->szDefaultForm);
        !           834: 
        !           835:     // add the form names list to the end of the structure.
        !           836: 
        !           837:     pntpd->cjThis = DWORDALIGN(pntpd->cjThis);
        !           838: 
        !           839: #if SIZE_TEST
        !           840:     DbgPrint("post szDefaultForm: cjThis = %d.\n", pntpd->cjThis);
        !           841: #endif
        !           842: 
        !           843: #if DBG
        !           844:     // make sure alignment is proper.
        !           845: 
        !           846:     ASSERTPS(((pntpd->cjThis % sizeof(DWORD)) == 0),
        !           847:              "pntpd->loPSFORMArray not properly aligned.\n");
        !           848: #endif
        !           849: 
        !           850:     pntpd->loPSFORMArray = pntpd->cjThis;
        !           851:     pntpd->cjThis += pntpd->cPSForms * sizeof(PSFORM);
        !           852: 
        !           853: #if SIZE_TEST
        !           854:     DbgPrint("post cPSForms: cjThis = %d.\n", pntpd->cjThis);
        !           855: #endif
        !           856: 
        !           857:     pForm = (PSFORM *)((CHAR *)pntpd + pntpd->loPSFORMArray);
        !           858: 
        !           859:     // for each form, fill in the offset to the form name string, the
        !           860:     // offset to the invocation string, then the strings themselves.
        !           861: 
        !           862:     for (i = 0; i < pntpd->cPSForms; i++)
        !           863:     {
        !           864:         pForm[i].loFormName = pntpd->cjThis;
        !           865:         strcpy((CHAR *)pntpd + pntpd->cjThis, ptmp->FormEntry[i].szName);
        !           866:         pntpd->cjThis += szLength(ptmp->FormEntry[i].szName);
        !           867: 
        !           868:         pForm[i].loSizeInvo = pntpd->cjThis;
        !           869:         strcpy((CHAR *)pntpd + pntpd->cjThis, ptmp->FormEntry[i].szInvocation);
        !           870:         pntpd->cjThis += szLength(ptmp->FormEntry[i].szInvocation);
        !           871: 
        !           872: #if TESTING
        !           873:         DbgPrint("FormEntry %s = %s.\n", ptmp->FormEntry[i].szName,
        !           874:                  ptmp->FormEntry[i].szInvocation);
        !           875: #endif
        !           876:     }
        !           877: 
        !           878: #if SIZE_TEST
        !           879:     DbgPrint("post all forms: cjThis = %d.\n", pntpd->cjThis);
        !           880: #endif
        !           881: 
        !           882:     // fill in the page region information. an offset to each string is set
        !           883:     // in the corresponding PSFORM struct. then add the string itself to the
        !           884:     // end of the NTPD structure.
        !           885: 
        !           886:     for (i = 0; i < pntpd->cPageRegions; i++)
        !           887:     {
        !           888:         for (j = 0; j < pntpd->cPSForms; j++)
        !           889:         {
        !           890:             if (!(NameComp((CHAR *)pntpd + pForm[j].loFormName,
        !           891:                          ptmp->PageRegion[i].szName)))
        !           892:             {
        !           893:                 pForm[j].loRegionInvo = pntpd->cjThis;
        !           894:                 strcpy((CHAR *)pntpd + pntpd->cjThis,
        !           895:                        ptmp->PageRegion[i].szInvocation);
        !           896:                 pntpd->cjThis += szLength(ptmp->PageRegion[i].szInvocation);
        !           897: 
        !           898: #if TESTING
        !           899:     DbgPrint("PageRegion[%d] = %s\n", i, ptmp->PageRegion[i].szName);
        !           900: #endif
        !           901:             }
        !           902:         }
        !           903:     }
        !           904: 
        !           905: #if SIZE_TEST
        !           906:     DbgPrint("post page regions: cjThis = %d.\n", pntpd->cjThis);
        !           907: #endif
        !           908: 
        !           909:     // fill in the imageablearea information.  an RECTL for each form is
        !           910:     // included within the PSFORM struct.
        !           911: 
        !           912:     for (i = 0; i < ptmp->cImageableAreas; i++)
        !           913:     {
        !           914:         for (j = 0; j < pntpd->cPSForms; j++)
        !           915:         {
        !           916:             if (!(NameComp((CHAR *)pntpd + pForm[j].loFormName,
        !           917:                          ptmp->ImageableArea[i].szForm)))
        !           918:             {
        !           919:                 pForm[j].imagearea = ptmp->ImageableArea[i].rect;
        !           920: #if TESTING
        !           921:     DbgPrint("ImageableArea %s = %d %d %d %d.\n",
        !           922:              ptmp->PageRegion[i].szName,
        !           923:              pForm[j].imagearea.left, pForm[j].imagearea.top,
        !           924:              pForm[j].imagearea.right, pForm[j].imagearea.bottom);
        !           925: #endif
        !           926:             }
        !           927:         }
        !           928:     }
        !           929: 
        !           930: #if SIZE_TEST
        !           931:     DbgPrint("post imageableareas: cjThis = %d.\n", pntpd->cjThis);
        !           932: #endif
        !           933: 
        !           934:     // fill in the paper dimension information.  a SIZEL for each form is
        !           935:     // included within the PSFORM struct.
        !           936: 
        !           937:     for (i = 0; i < ptmp->cPaperDimensions; i++)
        !           938:     {
        !           939:         for (j = 0; j < pntpd->cPSForms; j++)
        !           940:         {
        !           941:             if (!(NameComp((CHAR *)pntpd + pForm[j].loFormName,
        !           942:                          ptmp->PaperDimension[i].szForm)))
        !           943:             {
        !           944:                 pForm[j].sizlPaper = ptmp->PaperDimension[i].sizl;
        !           945: #if TESTING
        !           946:     DbgPrint("PaperDimension %s = %d %d.\n",
        !           947:              ptmp->PaperDimension[i].szForm,
        !           948:              pForm[j].sizlPaper.cx, pForm[j].sizlPaper.cy);
        !           949: #endif
        !           950:             }
        !           951:         }
        !           952:     }
        !           953: 
        !           954: #if SIZE_TEST
        !           955:     DbgPrint("post paper dimensions: cjThis = %d.\n", pntpd->cjThis);
        !           956: #endif
        !           957: 
        !           958:     // now add the outputbin strings to the end of the structure,
        !           959:     // if there are any to add.  it is worth noting how these are stored
        !           960:     // in the NTPD structure.  an array of cOutputBins PSOUTPUTBIN
        !           961:     // structures are stored at the end of the NTPD structure.  within
        !           962:     // each PSOUTPUTBIN structure are offsets to the strings corresponding
        !           963:     // to the output bin and invocation.  if there is only the default
        !           964:     // outputbin defined, cOutputBins will be zero.  otherwise it is assumed
        !           965:     // there will be at least two output bins defined.  if there is only one
        !           966:     // defined, it will be the same as the default.
        !           967: 
        !           968:     pntpd->loDefaultBin = pntpd->cjThis;
        !           969:     strcpy((CHAR *)pntpd + pntpd->loDefaultBin, ptmp->szDefaultOutputBin);
        !           970:     pntpd->cjThis += szLength(ptmp->szDefaultOutputBin);
        !           971:     pntpd->cjThis = DWORDALIGN(pntpd->cjThis);
        !           972: 
        !           973: #if SIZE_TEST
        !           974:     DbgPrint("post szDefaultOutputBin: cjThis = %d.\n", pntpd->cjThis);
        !           975: #endif
        !           976: 
        !           977:     if (pntpd->cOutputBins > 0)
        !           978:     {
        !           979: #if DBG
        !           980:     // make sure alignment is proper.
        !           981: 
        !           982:     ASSERTPS(((pntpd->cjThis % sizeof(DWORD)) == 0),
        !           983:              "pntpd->loPSOutputBins not properly aligned.\n");
        !           984: #endif
        !           985: 
        !           986:         // add the PSOUTPUTBIN array to the end of the NTPD structure.
        !           987: 
        !           988:         pntpd->loPSOutputBins = pntpd->cjThis;
        !           989: 
        !           990:         pntpd->cjThis += pntpd->cOutputBins * sizeof(PSOUTPUTBIN);
        !           991: 
        !           992: #if SIZE_TEST
        !           993:     DbgPrint("post cOutputBins: cjThis = %d.\n", pntpd->cjThis);
        !           994: #endif
        !           995: 
        !           996:         pBin = (PSOUTPUTBIN *)((CHAR *)pntpd + pntpd->loPSOutputBins);
        !           997: 
        !           998:         // for each outputbin, fill in the PSOUTPUTBIN structure.
        !           999:         // then add the string itself to the end of the NTPD structure.
        !          1000: 
        !          1001:         for (i = 0; i < pntpd->cOutputBins; i++)
        !          1002:         {
        !          1003:             // copy the output bin name and the invocation string.
        !          1004: 
        !          1005:             pBin[i].loBinName = pntpd->cjThis;
        !          1006:             strcpy((CHAR *)pntpd + pntpd->cjThis, ptmp->siOutputBin[i].szName);
        !          1007:             pntpd->cjThis += szLength(ptmp->siOutputBin[i].szName);
        !          1008: 
        !          1009:             pBin[i].loBinInvo = pntpd->cjThis;
        !          1010:             strcpy((CHAR *)pntpd + pntpd->cjThis,
        !          1011:                    ptmp->siOutputBin[i].szInvocation);
        !          1012:             pntpd->cjThis += szLength(ptmp->siOutputBin[i].szInvocation);
        !          1013: 
        !          1014: #if TESTING
        !          1015:            DbgPrint("OutputBin[%d] = %s\n", i,
        !          1016:                      (CHAR *)pntpd + pBin[i].loBinName);
        !          1017: #endif
        !          1018:         }
        !          1019:     }
        !          1020: 
        !          1021: #if SIZE_TEST
        !          1022:     DbgPrint("post all output bins: cjThis = %d.\n", pntpd->cjThis);
        !          1023: #endif
        !          1024: 
        !          1025:     // now add the inputslot strings to the end of the structure,
        !          1026:     // if there are any to add.  it is worth noting how these are stored
        !          1027:     // in the NTPD structure.  an array of cInputSlots PSINPUTSLOT
        !          1028:     // structures are stored at the end of the NTPD structure.  within
        !          1029:     // each PSINPUTSLOT structure are offsets to the strings corresponding
        !          1030:     // to the slot name and invocation.  if there is only the default inputslot
        !          1031:     // defined, cInputSlots will be zero.  otherwise it is assumed there
        !          1032:     // will be at least two input slots defined.  if there is only one
        !          1033:     // defined, it will be the same as the default.
        !          1034: 
        !          1035:     pntpd->loDefaultSlot = pntpd->cjThis;
        !          1036:     strcpy((CHAR *)pntpd + pntpd->loDefaultSlot, ptmp->szDefaultInputSlot);
        !          1037:     pntpd->cjThis += szLength(ptmp->szDefaultInputSlot);
        !          1038:     pntpd->cjThis = DWORDALIGN(pntpd->cjThis);
        !          1039: 
        !          1040: #if SIZE_TEST
        !          1041:     DbgPrint("post szDefaultInputSlot: cjThis = %d.\n", pntpd->cjThis);
        !          1042: #endif
        !          1043: 
        !          1044:     if (pntpd->cInputSlots > 0)
        !          1045:     {
        !          1046: #if DBG
        !          1047:     // make sure alignment is proper.
        !          1048: 
        !          1049:     ASSERTPS(((pntpd->cjThis % sizeof(DWORD)) == 0),
        !          1050:              "pntpd->loPSInputSlots properly aligned.\n");
        !          1051: #endif
        !          1052: 
        !          1053:         // add the PSINPUTSLOT array to the end of the NTPD structure.
        !          1054: 
        !          1055:         pntpd->loPSInputSlots = pntpd->cjThis;
        !          1056: 
        !          1057:         pntpd->cjThis += pntpd->cInputSlots * sizeof(PSINPUTSLOT);
        !          1058: 
        !          1059: #if SIZE_TEST
        !          1060:     DbgPrint("post cInputSlots: cjThis = %d.\n", pntpd->cjThis);
        !          1061: #endif
        !          1062: 
        !          1063:         pSlot = (PSINPUTSLOT *)((CHAR *)pntpd + pntpd->loPSInputSlots);
        !          1064: 
        !          1065:         // for each inputslot, fill in the PSINPUTSLOT structure.
        !          1066:         // then add the string itself to the end of the NTPD structure.
        !          1067: 
        !          1068:         for (i = 0; i < pntpd->cInputSlots; i++)
        !          1069:         {
        !          1070:             // copy the input slot name and the invocation string.
        !          1071: 
        !          1072:             pSlot[i].loSlotName = pntpd->cjThis;
        !          1073:             strcpy((CHAR *)pntpd + pntpd->cjThis, ptmp->siInputSlot[i].szName);
        !          1074:             pntpd->cjThis += szLength(ptmp->siInputSlot[i].szName);
        !          1075: 
        !          1076:             pSlot[i].loSlotInvo = pntpd->cjThis;
        !          1077:             strcpy((CHAR *)pntpd + pntpd->cjThis,
        !          1078:                    ptmp->siInputSlot[i].szInvocation);
        !          1079:             pntpd->cjThis += szLength(ptmp->siInputSlot[i].szInvocation);
        !          1080: 
        !          1081: #if TESTING
        !          1082:            DbgPrint("InputSlot[%d] = %s\n", i,
        !          1083:                      (CHAR *)pntpd + pSlot[i].loSlotName);
        !          1084: #endif
        !          1085:         }
        !          1086:     }
        !          1087: 
        !          1088: #if SIZE_TEST
        !          1089:     DbgPrint("post all input slots: cjThis = %d.\n", pntpd->cjThis);
        !          1090: #endif
        !          1091: 
        !          1092:     // add the manualfeedtrue string to the end of the structure.
        !          1093:     // check to make sure we found a string first.
        !          1094: 
        !          1095:     if (i = ptmp->cbManualTRUE)
        !          1096:     {
        !          1097:         pntpd->loszManualFeedTRUE = pntpd->cjThis;
        !          1098:         pntpd->cjThis += i;
        !          1099: 
        !          1100:         memcpy((CHAR *)pntpd + pntpd->loszManualFeedTRUE,
        !          1101:                ptmp->szManualTRUE, i);
        !          1102:     }
        !          1103: 
        !          1104: #if SIZE_TEST
        !          1105:     DbgPrint("post cbManualTRUE: cjThis = %d.\n", pntpd->cjThis);
        !          1106: #endif
        !          1107: 
        !          1108: #if TESTING
        !          1109:     if (i != 0)
        !          1110:        DbgPrint("ManualTRUE not found.\n");
        !          1111:     else
        !          1112:        DbgPrint("ManualTRUE = %s\n", ptmp->szManualTRUE);
        !          1113: #endif
        !          1114: 
        !          1115:     // add the manualfeedfalse string to the end of the structure.
        !          1116:     // check to make sure we found a string first.
        !          1117: 
        !          1118:     if (i = ptmp->cbManualFALSE)
        !          1119:     {
        !          1120:         pntpd->loszManualFeedFALSE = pntpd->cjThis;
        !          1121:         pntpd->cjThis += i;
        !          1122: 
        !          1123:         memcpy((CHAR *)pntpd + pntpd->loszManualFeedFALSE,
        !          1124:                ptmp->szManualFALSE, i);
        !          1125:     }
        !          1126: 
        !          1127: #if SIZE_TEST
        !          1128:     DbgPrint("post cbManualFALSE: cjThis = %d.\n", pntpd->cjThis);
        !          1129: #endif
        !          1130: 
        !          1131: #if TESTING
        !          1132:     if (i != 0)
        !          1133:        DbgPrint("ManualFALSE not found.\n");
        !          1134:     else
        !          1135:        DbgPrint("ManualFALSE = %s\n", ptmp->szManualFALSE);
        !          1136: #endif
        !          1137: 
        !          1138:     // add the duplex none string to the end of the structure.
        !          1139:     // check to make sure we found a string first.
        !          1140: 
        !          1141:     if (i = ptmp->cbDuplexNone)
        !          1142:     {
        !          1143:         pntpd->loszDuplexNone = pntpd->cjThis;
        !          1144:         pntpd->cjThis += i;
        !          1145: 
        !          1146:         memcpy((PSTR)pntpd + pntpd->loszDuplexNone, ptmp->szDuplexNone, i);
        !          1147:     }
        !          1148: 
        !          1149: #if SIZE_TEST
        !          1150:     DbgPrint("post cbDuplexNone: cjThis = %d.\n", pntpd->cjThis);
        !          1151: #endif
        !          1152: 
        !          1153: #if TESTING
        !          1154:     if (i != 0)
        !          1155:        DbgPrint("DuplexNone not found.\n");
        !          1156:     else
        !          1157:        DbgPrint("DuplexNone = %s\n", ptmp->szDuplexNone);
        !          1158: #endif
        !          1159: 
        !          1160:     // add the duplex tumble string to the end of the structure.
        !          1161:     // check to make sure we found a string first.
        !          1162: 
        !          1163:     if (i = ptmp->cbDuplexTumble)
        !          1164:     {
        !          1165:         pntpd->loszDuplexTumble = pntpd->cjThis;
        !          1166:         pntpd->cjThis += i;
        !          1167: 
        !          1168:         memcpy((PSTR)pntpd + pntpd->loszDuplexTumble, ptmp->szDuplexTumble, i);
        !          1169:     }
        !          1170: 
        !          1171: #if SIZE_TEST
        !          1172:     DbgPrint("post cbDuplexTumble: cjThis = %d.\n", pntpd->cjThis);
        !          1173: #endif
        !          1174: 
        !          1175: #if TESTING
        !          1176:     if (i != 0)
        !          1177:        DbgPrint("DuplexTumble not found.\n");
        !          1178:     else
        !          1179:        DbgPrint("DuplexTumble = %s\n", ptmp->szDuplexTumble);
        !          1180: #endif
        !          1181: 
        !          1182:     // add the duplex no tumble string to the end of the structure.
        !          1183:     // check to make sure we found a string first.
        !          1184: 
        !          1185:     if (i = ptmp->cbDuplexNoTumble)
        !          1186:     {
        !          1187:         pntpd->loszDuplexNoTumble = pntpd->cjThis;
        !          1188:         pntpd->cjThis += i;
        !          1189: 
        !          1190:         memcpy((PSTR)pntpd + pntpd->loszDuplexNoTumble, ptmp->szDuplexNoTumble, i);
        !          1191:     }
        !          1192: 
        !          1193: #if SIZE_TEST
        !          1194:     DbgPrint("post cbDuplexNoTumble: cjThis = %d.\n", pntpd->cjThis);
        !          1195: #endif
        !          1196: 
        !          1197: #if TESTING
        !          1198:     if (i != 0)
        !          1199:        DbgPrint("DuplexNoTumble not found.\n");
        !          1200:     else
        !          1201:        DbgPrint("DuplexNoTumble = %s\n", ptmp->szDuplexNoTumble);
        !          1202: #endif
        !          1203: 
        !          1204:     // add the collate on string to the end of the structure.
        !          1205:     // check to make sure we found a string first.
        !          1206: 
        !          1207:     if (i = ptmp->cbCollateOn)
        !          1208:     {
        !          1209:         pntpd->loszCollateOn = pntpd->cjThis;
        !          1210:         pntpd->cjThis += i;
        !          1211: 
        !          1212:         memcpy((PSTR)pntpd + pntpd->loszCollateOn, ptmp->szCollateOn, i);
        !          1213:     }
        !          1214: 
        !          1215: #if SIZE_TEST
        !          1216:     DbgPrint("post cbCollateOn: cjThis = %d.\n", pntpd->cjThis);
        !          1217: #endif
        !          1218: 
        !          1219: #if TESTING
        !          1220:     if (i != 0)
        !          1221:        DbgPrint("CollateOn not found.\n");
        !          1222:     else
        !          1223:        DbgPrint("CollateOn = %s\n", ptmp->szCollateOn);
        !          1224: #endif
        !          1225: 
        !          1226:     // add the collate off string to the end of the structure.
        !          1227:     // check to make sure we found a string first.
        !          1228: 
        !          1229:     if (i = ptmp->cbCollateOff)
        !          1230:     {
        !          1231:         pntpd->loszCollateOff = pntpd->cjThis;
        !          1232:         pntpd->cjThis += i;
        !          1233: 
        !          1234:         memcpy((PSTR)pntpd + pntpd->loszCollateOff, ptmp->szCollateOff, i);
        !          1235:     }
        !          1236: 
        !          1237: #if SIZE_TEST
        !          1238:     DbgPrint("post cbCollateOff: cjThis = %d.\n", pntpd->cjThis);
        !          1239: #endif
        !          1240: 
        !          1241: #if TESTING
        !          1242:     if (i != 0)
        !          1243:        DbgPrint("CollateOff not found.\n");
        !          1244:     else
        !          1245:        DbgPrint("CollateOff = %s\n", ptmp->szCollateOff);
        !          1246: #endif
        !          1247: 
        !          1248:     // now add the fonts to the end of the structure, an array of
        !          1249:     // pntpd->cFonts BYTES are stored at the end of the NTPD structure.
        !          1250: 
        !          1251:     // add the BYTE array to the end of the NTPD structure.
        !          1252: 
        !          1253:     pntpd->loFonts = pntpd->cjThis;
        !          1254:     pntpd->cjThis += pntpd->cFonts;
        !          1255: 
        !          1256: #if SIZE_TEST
        !          1257:     DbgPrint("post cFonts: cjThis = %d.\n", pntpd->cjThis);
        !          1258: #endif
        !          1259: 
        !          1260:     pfont = (BYTE *)pntpd + pntpd->loFonts;
        !          1261: 
        !          1262:     for (i = 0; i < (DWORD)pntpd->cFonts; i++)
        !          1263:     {
        !          1264:         pfont[i] = ptmp->bFonts[i];
        !          1265: #if TESTING
        !          1266:        DbgPrint("Font[%d] = %d\n", i, (int)pfont[i]);
        !          1267: #endif
        !          1268:     }
        !          1269: }
        !          1270: 
        !          1271: 
        !          1272: //--------------------------------------------------------------------------
        !          1273: // DWORD SizeNTPD(pntpd, ptmp)
        !          1274: // PNTPD       pntpd;
        !          1275: // PTMP_NTPD   ptmp;
        !          1276: //
        !          1277: // This routine determines the size of the NTPD structure for the
        !          1278: // given printer.
        !          1279: //
        !          1280: // Returns:
        !          1281: //   This routine returns the size of the NTPD structure in BYTES, or
        !          1282: // zero for error.
        !          1283: //
        !          1284: // History:
        !          1285: //   29-Sep-1992    -by-    Kent Settle     (kentse)
        !          1286: //  Wrote it.
        !          1287: //--------------------------------------------------------------------------
        !          1288: 
        !          1289: DWORD SizeNTPD(pntpd, ptmp)
        !          1290: PNTPD       pntpd;
        !          1291: PTMP_NTPD   ptmp;
        !          1292: {
        !          1293:     DWORD           i, dwSize;
        !          1294: 
        !          1295:     // start by adding the printer name to the end of the NTPD structure.
        !          1296: 
        !          1297: #if SIZE_TEST
        !          1298:     DbgPrint("Entering SizeNTPD.\n");
        !          1299: #endif
        !          1300: 
        !          1301:     dwSize = sizeof(NTPD);
        !          1302:     dwSize = WCHARALIGN(dwSize);
        !          1303:     dwSize += ptmp->cbPrinterName;
        !          1304:     dwSize = DWORDALIGN(dwSize);
        !          1305: 
        !          1306: #if SIZE_TEST
        !          1307:     DbgPrint("post cbPrinterName: dwSize = %d.\n", dwSize);
        !          1308: #endif
        !          1309: 
        !          1310:     // now add the set resolution strings to the end of the structure,
        !          1311:     // if there are any to add.  it is worth noting how these are stored
        !          1312:     // in the NTPD structure.  an array of cResolutions PSRESOLUTION
        !          1313:     // structures are stored at the end of the NTPD structure.  within
        !          1314:     // each PSRESOLUTION structure is an offset to the string corresponding
        !          1315:     // to the resolution in question.
        !          1316: 
        !          1317:     if (pntpd->cResolutions != 0)
        !          1318:     {
        !          1319:         // add the PSRESOLUTION array to the end of the NTPD structure.
        !          1320: 
        !          1321:         dwSize += pntpd->cResolutions * sizeof(PSRESOLUTION);
        !          1322: 
        !          1323:         // for each resolution, fill in the PSRESOLUTION structure.
        !          1324:         // then add the string itself to the end of the NTPD structure.
        !          1325: 
        !          1326:         for (i = 0; i < (DWORD)pntpd->cResolutions; i++)
        !          1327:             dwSize += (DWORD)szLength(ptmp->siResolutions[i].szString);
        !          1328:     }
        !          1329: 
        !          1330: #if SIZE_TEST
        !          1331:     DbgPrint("post resolutions: dwSize = %d.\n", dwSize);
        !          1332: #endif
        !          1333: 
        !          1334:     // add the transfernormalized string to the end of the structure.
        !          1335: 
        !          1336:     dwSize += ptmp->cbTransferNorm;
        !          1337: 
        !          1338: #if SIZE_TEST
        !          1339:     DbgPrint("post cbTransferNorm: dwSize = %d.\n", dwSize);
        !          1340: #endif
        !          1341: 
        !          1342:     // add the inverse transfernormalized string to the end of the structure.
        !          1343: 
        !          1344:     dwSize += ptmp->cbInvTransferNorm;
        !          1345: 
        !          1346: #if SIZE_TEST
        !          1347:     DbgPrint("post cbInvTransferNorm: dwSize = %d.\n", dwSize);
        !          1348: #endif
        !          1349: 
        !          1350:     // add the form names list to the end of the structure.
        !          1351: 
        !          1352:     dwSize += szLength(ptmp->szDefaultForm);
        !          1353:     dwSize = DWORDALIGN(dwSize);
        !          1354: 
        !          1355: #if SIZE_TEST
        !          1356:     DbgPrint("post szDefaultForm: dwSize = %d.\n", dwSize);
        !          1357: #endif
        !          1358: 
        !          1359:     dwSize += pntpd->cPSForms * sizeof(PSFORM);
        !          1360: 
        !          1361: #if SIZE_TEST
        !          1362:     DbgPrint("post cPSForms: dwSize = %d.\n", dwSize);
        !          1363: #endif
        !          1364: 
        !          1365:     // for each form, allow room for the FormName, SizeInvo, and
        !          1366:     // RegionInvo strings.
        !          1367: 
        !          1368:     for (i = 0; i < pntpd->cPSForms; i++)
        !          1369:     {
        !          1370:         // account for the form name and invocation strings.
        !          1371: 
        !          1372:         dwSize += szLength(ptmp->FormEntry[i].szName) +
        !          1373:                   szLength(ptmp->FormEntry[i].szInvocation);
        !          1374: 
        !          1375:     }
        !          1376: 
        !          1377: #if SIZE_TEST
        !          1378:     DbgPrint("post all forms: dwSize = %d.\n", dwSize);
        !          1379: #endif
        !          1380: 
        !          1381:     // make room for the page region invocation strings.
        !          1382: 
        !          1383:     for (i = 0; i < pntpd->cPageRegions; i++)
        !          1384:         dwSize += szLength(ptmp->PageRegion[i].szInvocation);
        !          1385: 
        !          1386: #if SIZE_TEST
        !          1387:     DbgPrint("post page regions: dwSize = %d.\n", dwSize);
        !          1388: #endif
        !          1389: 
        !          1390:     // now add the outputbin strings to the end of the structure,
        !          1391:     // if there are any to add.  it is worth noting how these are stored
        !          1392:     // in the NTPD structure.  an array of cOutputBins PSOUTPUTBIN
        !          1393:     // structures are stored at the end of the NTPD structure.  within
        !          1394:     // each PSOUTPUTBIN structure are offsets to the strings corresponding
        !          1395:     // to the output bin and invocation.  if there is only the default
        !          1396:     // outputbin defined, cOutputBins will be zero.  otherwise it is assumed
        !          1397:     // there will be at least two output bins defined.  if there is only one
        !          1398:     // defined, it will be the same as the default.
        !          1399: 
        !          1400:     dwSize += szLength(ptmp->szDefaultOutputBin);
        !          1401:     dwSize = DWORDALIGN(dwSize);
        !          1402: 
        !          1403: #if SIZE_TEST
        !          1404:     DbgPrint("post szDefaultOutputBin: dwSize = %d.\n", dwSize);
        !          1405: #endif
        !          1406: 
        !          1407:     if (pntpd->cOutputBins > 0)
        !          1408:     {
        !          1409:         dwSize += pntpd->cOutputBins * sizeof(PSOUTPUTBIN);
        !          1410: 
        !          1411:         // for each outputbin, fill in the PSOUTPUTBIN structure.
        !          1412: 
        !          1413:         for (i = 0; i < pntpd->cOutputBins; i++)
        !          1414:         {
        !          1415:             dwSize += szLength(ptmp->siOutputBin[i].szName);
        !          1416:             dwSize += szLength(ptmp->siOutputBin[i].szInvocation);
        !          1417:         }
        !          1418:     }
        !          1419: 
        !          1420: #if SIZE_TEST
        !          1421:     DbgPrint("post all output bins: dwSize = %d.\n", dwSize);
        !          1422: #endif
        !          1423: 
        !          1424:     // now add the inputslot strings to the end of the structure,
        !          1425:     // if there are any to add.  it is worth noting how these are stored
        !          1426:     // in the NTPD structure.  an array of cInputSlots PSINPUTSLOT
        !          1427:     // structures are stored at the end of the NTPD structure.  within
        !          1428:     // each PSINPUTSLOT structure are offsets to the strings corresponding
        !          1429:     // to the slot name and the invocation string.  if there is only the
        !          1430:     // default inputslot defined, cInputSlots will be zero.  otherwise it
        !          1431:     // is assumed there will be at least two input slots defined.  if there
        !          1432:     // is only one defined, it will be the same as the default.
        !          1433: 
        !          1434:     dwSize += szLength(ptmp->szDefaultInputSlot);
        !          1435:     dwSize = DWORDALIGN(dwSize);
        !          1436: 
        !          1437: #if SIZE_TEST
        !          1438:     DbgPrint("post szDefaultInputSlot: dwSize = %d.\n", dwSize);
        !          1439: #endif
        !          1440: 
        !          1441:     if (pntpd->cInputSlots > 0)
        !          1442:     {
        !          1443:         dwSize += pntpd->cInputSlots * sizeof(PSINPUTSLOT);
        !          1444: 
        !          1445:         // for each inputslot, fill in the PSINPUTSLOT structure.
        !          1446: 
        !          1447:         for (i = 0; i < pntpd->cInputSlots; i++)
        !          1448:         {
        !          1449:             dwSize += szLength(ptmp->siInputSlot[i].szName);
        !          1450:             dwSize += szLength(ptmp->siInputSlot[i].szInvocation);
        !          1451:         }
        !          1452:     }
        !          1453: 
        !          1454: #if SIZE_TEST
        !          1455:     DbgPrint("post all input slots: dwSize = %d.\n", dwSize);
        !          1456: #endif
        !          1457: 
        !          1458:     // add the manualfeed strings to the end of the structure.
        !          1459: 
        !          1460:     dwSize += ptmp->cbManualTRUE + ptmp->cbManualFALSE;
        !          1461: 
        !          1462: #if SIZE_TEST
        !          1463:     DbgPrint("post manual strings: dwSize = %d.\n", dwSize);
        !          1464: #endif
        !          1465: 
        !          1466:     // add the duplex strings.
        !          1467: 
        !          1468:     dwSize += ptmp->cbDuplexNone + ptmp->cbDuplexTumble +
        !          1469:               ptmp->cbDuplexNoTumble;
        !          1470: 
        !          1471: #if SIZE_TEST
        !          1472:     DbgPrint("post duplex strings: dwSize = %d.\n", dwSize);
        !          1473: #endif
        !          1474: 
        !          1475:     // add the collate strings.
        !          1476: 
        !          1477:     dwSize += ptmp->cbCollateOn + ptmp->cbCollateOff;
        !          1478: 
        !          1479: #if SIZE_TEST
        !          1480:     DbgPrint("post collate strings: dwSize = %d.\n", dwSize);
        !          1481: #endif
        !          1482: 
        !          1483:     // now add the fonts to the end of the structure,
        !          1484:     // it is worth noting how these are stored in the NTPD structure.
        !          1485:     // an array of pntpd->cFonts BYTES are stored at the end of the NTPD
        !          1486:     // structure.
        !          1487: 
        !          1488:     // add the BYTE array to the end of the NTPD structure.
        !          1489: 
        !          1490:     dwSize += pntpd->cFonts;
        !          1491: 
        !          1492: #if SIZE_TEST
        !          1493: DbgPrint("SizeNTPD - dwSize = %d.\n", dwSize);
        !          1494: #endif
        !          1495: 
        !          1496:     return(dwSize);
        !          1497: }
        !          1498: 
        !          1499: 
        !          1500: //--------------------------------------------------------------------------
        !          1501: //
        !          1502: // BOOL GetBuffer();
        !          1503: //
        !          1504: // This routines reads a new buffer full of text from the input file.
        !          1505: //
        !          1506: // Note: If the end of file is encountered in this function then
        !          1507: //     the program is aborted with an error message.    Normally
        !          1508: //     the program will stop processing the input when it sees
        !          1509: //     the end of information keyword.
        !          1510: //
        !          1511: // Parameters:
        !          1512: //   None.
        !          1513: //
        !          1514: // Returns:
        !          1515: //   This routine returns TRUE if end of file, FALSE otherwise.
        !          1516: //
        !          1517: // History:
        !          1518: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          1519: //  Brought in from Windows 3.0, and cleaned up.
        !          1520: //--------------------------------------------------------------------------
        !          1521: 
        !          1522: BOOL GetBuffer(pdata)
        !          1523: PPARSEDATA  pdata;
        !          1524: {
        !          1525:     // initialize the buffer count to zero.
        !          1526: 
        !          1527:     pdata->cbBuffer = 0;
        !          1528: 
        !          1529:     // read in the next buffer full of data if we have not already hit the
        !          1530:     // end of file.
        !          1531: 
        !          1532:     if (!pdata->fEOF)
        !          1533:     {
        !          1534:         ReadFile(pdata->hFile, pdata->rgbBuffer, sizeof(pdata->rgbBuffer),
        !          1535:                  (LPDWORD)&pdata->cbBuffer, (LPOVERLAPPED)NULL);
        !          1536: 
        !          1537:         if (pdata->cbBuffer == 0)
        !          1538:             pdata->fEOF = TRUE;
        !          1539:     }
        !          1540: 
        !          1541:     pdata->pbBuffer = pdata->rgbBuffer;
        !          1542:     return(pdata->fEOF);
        !          1543: }
        !          1544: 
        !          1545: 
        !          1546: //--------------------------------------------------------------------------
        !          1547: //
        !          1548: // BOOL GetLine(pdata);
        !          1549: // PPARSEDATA   pdata;
        !          1550: //
        !          1551: // This routine gets the next line of text out of the input buffer.
        !          1552: //
        !          1553: // Parameters:
        !          1554: //   None.
        !          1555: //
        !          1556: // Returns:
        !          1557: //   This routine returns TRUE if end of file, FALSE otherwise.
        !          1558: //
        !          1559: // History:
        !          1560: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          1561: //  Brought in from Windows 3.0, and cleaned up.
        !          1562: //--------------------------------------------------------------------------
        !          1563: 
        !          1564: BOOL GetLine(pdata)
        !          1565: PPARSEDATA  pdata;
        !          1566: {
        !          1567:     int cbLine;
        !          1568:     char bCh;
        !          1569: 
        !          1570:     if (pdata->fUnGetLine)
        !          1571:     {
        !          1572:         pdata->szLine = pdata->rgbLine;
        !          1573:         pdata->fUnGetLine = FALSE;
        !          1574:         return(FALSE);
        !          1575:     }
        !          1576: 
        !          1577:     cbLine = 0;
        !          1578:     pdata->szLine = pdata->rgbLine;
        !          1579:     *(pdata->szLine) = 0;
        !          1580: 
        !          1581:     if (!pdata->fEOF)
        !          1582:     {
        !          1583:         while(TRUE)
        !          1584:         {
        !          1585:             if (pdata->cbBuffer <= 0)
        !          1586:             {
        !          1587:                 if (GetBuffer(pdata))    // done if end of file hit.
        !          1588:                 break;
        !          1589:             }
        !          1590: 
        !          1591:             while(--pdata->cbBuffer >= 0)
        !          1592:             {
        !          1593:                 bCh = *(pdata->pbBuffer++);
        !          1594:                 if (bCh == '\n' || bCh == '\r' || ++cbLine > sizeof(pdata->rgbLine))
        !          1595:                 {
        !          1596:                     *(pdata->szLine) = 0;
        !          1597:                     pdata->szLine = pdata->rgbLine;
        !          1598:                     EatWhite(pdata);
        !          1599:                     if (*(pdata->szLine) != 0)
        !          1600:                     {
        !          1601:                         pdata->szLine = pdata->rgbLine;
        !          1602:                         return(pdata->fEOF);
        !          1603:                     }
        !          1604: 
        !          1605:                     pdata->szLine = pdata->rgbLine;
        !          1606:                     cbLine = 0;
        !          1607:                     continue;
        !          1608:                 }
        !          1609: 
        !          1610:                 *(pdata->szLine++) = bCh;
        !          1611:             }
        !          1612:         }
        !          1613:     }
        !          1614: 
        !          1615:     *(pdata->szLine) = 0;
        !          1616: 
        !          1617:     pdata->szLine = pdata->rgbLine;
        !          1618:     return(pdata->fEOF);
        !          1619: }
        !          1620: 
        !          1621: 
        !          1622: //--------------------------------------------------------------------------
        !          1623: //
        !          1624: 
        !          1625: // VOID UnGetLine(pdata)
        !          1626: // PPARSEDATA  pdata;
        !          1627: //
        !          1628: // This routine pushes the most recent line back into the input buffer.
        !          1629: //
        !          1630: // Parameters:
        !          1631: //   None.
        !          1632: //
        !          1633: // Returns:
        !          1634: //   This routine returns no value.
        !          1635: //
        !          1636: // History:
        !          1637: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          1638: //  Brought in from Windows 3.0, and cleaned up.
        !          1639: //--------------------------------------------------------------------------
        !          1640: 
        !          1641: VOID UnGetLine(pdata)
        !          1642: PPARSEDATA  pdata;
        !          1643: {
        !          1644:     pdata->fUnGetLine = TRUE;
        !          1645:     pdata->szLine = pdata->rgbLine;
        !          1646: }
        !          1647: 
        !          1648: 
        !          1649: //--------------------------------------------------------------------------
        !          1650: //
        !          1651: // int GetKeyword(pTable, pdata)
        !          1652: // TABLE_ENTRY    *pTable;
        !          1653: // PPARSEDATA      pdata;
        !          1654: //
        !          1655: // Get the next token from the input stream.
        !          1656: //
        !          1657: // Parameters:
        !          1658: //   None.
        !          1659: //
        !          1660: // Returns:
        !          1661: //   This routine returns integer value of next token.
        !          1662: //
        !          1663: // History:
        !          1664: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          1665: //  Brought in from Windows 3.0, and cleaned up.
        !          1666: //--------------------------------------------------------------------------
        !          1667: 
        !          1668: int GetKeyword(pTable, pdata)
        !          1669: TABLE_ENTRY    *pTable;
        !          1670: PPARSEDATA      pdata;
        !          1671: {
        !          1672:     char szWord[256];
        !          1673: 
        !          1674:     if (*(pdata->szLine) == 0)
        !          1675:         if (GetLine(pdata))
        !          1676:             return(TK_EOF);
        !          1677: 
        !          1678:     GetWord(szWord, sizeof(szWord), pdata);
        !          1679:     return(MapToken(szWord, pTable));
        !          1680: }
        !          1681: 
        !          1682: 
        !          1683: //--------------------------------------------------------------------------
        !          1684: // VOID GetOptionString(pstrOptionName, cbBuffer, pdata)
        !          1685: // PSTR        pstrOptionName;
        !          1686: // DWORD       cbBuffer;
        !          1687: // PPARSEDATA  pdata;
        !          1688: //
        !          1689: // This routine fills in the option name of the next option.
        !          1690: //
        !          1691: // Parameters:
        !          1692: //   pstrOptionName - place to put option name.
        !          1693: //
        !          1694: //   cbBuffer - size of buffer.
        !          1695: //
        !          1696: // Returns:
        !          1697: //   This routine returns no value.
        !          1698: //
        !          1699: // History:
        !          1700: //   08-Apr-1992    -by-    Kent Settle     (kentse)
        !          1701: //  Wrote it.
        !          1702: //--------------------------------------------------------------------------
        !          1703: 
        !          1704: VOID GetOptionString(pstrOptionName, cbBuffer, pdata)
        !          1705: PSTR        pstrOptionName;
        !          1706: DWORD       cbBuffer;
        !          1707: PPARSEDATA  pdata;
        !          1708: {
        !          1709:     if (*(pdata->szLine) == 0)
        !          1710:         if (GetLine(pdata))
        !          1711:             return;
        !          1712: 
        !          1713:     EatWhite(pdata);
        !          1714: 
        !          1715:     // copy the form name until the ':' deliminator is encountered.
        !          1716: 
        !          1717:     while (cbBuffer--)
        !          1718:     {
        !          1719:         *pstrOptionName = *(pdata->szLine++);
        !          1720: 
        !          1721:         if ((*pstrOptionName == ':') || (*pstrOptionName == '\0'))
        !          1722:         {
        !          1723:             *pstrOptionName = '\0';  // add the zero terminator.
        !          1724:             break;
        !          1725:         }
        !          1726: 
        !          1727:         pstrOptionName++;
        !          1728:     }
        !          1729: 
        !          1730:     // strip off any trailing spaces, 'cause some people just can't
        !          1731:     // follow the spec.
        !          1732: 
        !          1733:     pstrOptionName--;
        !          1734: 
        !          1735:     if ((*pstrOptionName == ' ') || (*pstrOptionName == '\t'))
        !          1736:     {
        !          1737:         while ((*pstrOptionName == ' ') || (*pstrOptionName == '\t'))
        !          1738:             *pstrOptionName-- = '\0';
        !          1739:     }
        !          1740: 
        !          1741:     return;
        !          1742: }
        !          1743: 
        !          1744: 
        !          1745: //--------------------------------------------------------------------------
        !          1746: // int GetOptionIndex(pTable, pdata)
        !          1747: // TABLE_ENTRY    *pTable;
        !          1748: // PPARSEDATA      pdata;
        !          1749: //
        !          1750: // Get the next token from the input stream.
        !          1751: //
        !          1752: // Parameters:
        !          1753: //   None.
        !          1754: //
        !          1755: // Returns:
        !          1756: //   This routine returns integer value of next token.
        !          1757: //
        !          1758: // History:
        !          1759: //   08-Apr-1991    -by-    Kent Settle     (kentse)
        !          1760: //  Wrote it.
        !          1761: //--------------------------------------------------------------------------
        !          1762: 
        !          1763: int GetOptionIndex(pTable, pdata)
        !          1764: TABLE_ENTRY    *pTable;
        !          1765: PPARSEDATA      pdata;
        !          1766: {
        !          1767:     char    szWord[256];
        !          1768:     int     cbWord;
        !          1769:     char   *pszWord;
        !          1770: 
        !          1771:     if (*(pdata->szLine) == 0)
        !          1772:         if (GetLine(pdata))
        !          1773:             return(TK_EOF);
        !          1774: 
        !          1775:     EatWhite(pdata);
        !          1776: 
        !          1777:     cbWord = sizeof(szWord);
        !          1778:     pszWord = szWord;
        !          1779: 
        !          1780:     while (--cbWord > 0)
        !          1781:     {
        !          1782:         *pszWord = *(pdata->szLine++);
        !          1783: 
        !          1784:         // search to the end of the option.  this could be either the
        !          1785:         // colon, which ends the option, or the slash, which begins the
        !          1786:         // translation string (which we will ignore).
        !          1787: 
        !          1788:         if ((*pszWord == ':') || (*pszWord == '/'))
        !          1789:         {
        !          1790:             *pszWord = 0;
        !          1791:             break;
        !          1792:         }
        !          1793: 
        !          1794:         pszWord++;
        !          1795:     }
        !          1796: 
        !          1797:     return(MapToken(szWord, pTable));
        !          1798: }
        !          1799: 
        !          1800: 
        !          1801: //--------------------------------------------------------------------------
        !          1802: //
        !          1803: // int MapToken(szWord, pTable)
        !          1804: // char           *szWord;        // Ptr to the ascii keyword string
        !          1805: // TABLE_ENTRY    *pTable;
        !          1806: //
        !          1807: // This routine maps an ascii key word into an integer token.
        !          1808: //
        !          1809: // Parameters:
        !          1810: //   szWord
        !          1811: //     Pointer to the ascii keyword string.
        !          1812: //
        !          1813: // Returns:
        !          1814: //   This routine returns int identifying token.
        !          1815: //
        !          1816: // History:
        !          1817: //   03-Apr-1991    -by-    Kent Settle    (kentse)
        !          1818: //  Wrote it.
        !          1819: //--------------------------------------------------------------------------
        !          1820: 
        !          1821: int MapToken(szWord, pTable)
        !          1822: char           *szWord;        // Ptr to the ascii keyword string
        !          1823: TABLE_ENTRY    *pTable;
        !          1824: {
        !          1825:     while (pTable->szStr)
        !          1826:     {
        !          1827:         if (szIsEqual(szWord, pTable->szStr))
        !          1828:             return(pTable->iValue);
        !          1829: 
        !          1830:         ++pTable;
        !          1831:     }
        !          1832: 
        !          1833: #if TESTING
        !          1834:     DbgPrint("MapToken could not map %s.\n", szWord);
        !          1835: #endif
        !          1836:     return(TK_UNDEFINED);
        !          1837: }
        !          1838: 
        !          1839: 
        !          1840: //--------------------------------------------------------------------------
        !          1841: // VOID GetWord(szWord, cbWord, pdata)
        !          1842: // char       *szWord;        // Ptr to the destination area
        !          1843: // int         cbWord;        // The size of the destination area
        !          1844: // PPARSEDATA  pdata;
        !          1845: //
        !          1846: // This routine gets the next word delimited by white space
        !          1847: // from the input buffer.
        !          1848: //
        !          1849: // Parameters:
        !          1850: //   szWord
        !          1851: //     Pointer to the destination area.
        !          1852: //
        !          1853: //   cbWord
        !          1854: //     Size of destination area.
        !          1855: //
        !          1856: // Returns:
        !          1857: //   This routine returns no value.
        !          1858: //
        !          1859: // History:
        !          1860: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          1861: //  Brought in from Windows 3.0, and cleaned up.
        !          1862: //--------------------------------------------------------------------------
        !          1863: 
        !          1864: VOID GetWord(szWord, cbWord, pdata)
        !          1865: char       *szWord;        // Ptr to the destination area
        !          1866: int         cbWord;        // The size of the destination area
        !          1867: PPARSEDATA  pdata;
        !          1868: {
        !          1869:     char bCh;
        !          1870: 
        !          1871:     EatWhite(pdata);
        !          1872:     while (cbWord--)
        !          1873:     {
        !          1874:         switch(bCh = *(pdata->szLine++))
        !          1875:         {
        !          1876:             case 0:
        !          1877:             case ' ':
        !          1878:             case '\t':
        !          1879:             case '\n':     // take care of newline and carriage returns.
        !          1880:             case '\r':
        !          1881:                 --pdata->szLine;
        !          1882:                 *szWord = 0;
        !          1883:                 return;
        !          1884:             case ':':       // the colon is a delimeter in PPD files,
        !          1885:                 break;      // and should simply be skipped over.
        !          1886:             default:
        !          1887:                 *szWord++ = bCh;
        !          1888:                 break;
        !          1889:         }
        !          1890:     }
        !          1891: 
        !          1892:     *szWord = 0;
        !          1893: }
        !          1894: 
        !          1895: 
        !          1896: //--------------------------------------------------------------------------
        !          1897: // int GetString(szDst, pdata)
        !          1898: // char       *szDst;
        !          1899: // PPARSEDATA  pdata;
        !          1900: //
        !          1901: // This routine gets a " bracketed string from the ppd_file, attaching
        !          1902: // a zero terminator to it.
        !          1903: //
        !          1904: // Returns:
        !          1905: //   This routine returns the length of the string, including the zero
        !          1906: //   terminator.
        !          1907: //
        !          1908: // History:
        !          1909: //   03-Apr-1991    -by-    Kent Settle    (kentse)
        !          1910: //  Wrote it.
        !          1911: //--------------------------------------------------------------------------
        !          1912: 
        !          1913: int GetString(szDst, pdata)
        !          1914: char       *szDst;
        !          1915: PPARSEDATA  pdata;
        !          1916: {
        !          1917:     int     i;
        !          1918: 
        !          1919:     // advance to the first quotation mark, then one character past it.
        !          1920: 
        !          1921:     while (*(pdata->szLine) != '"')
        !          1922:         pdata->szLine++;
        !          1923:     pdata->szLine++;
        !          1924: 
        !          1925:     // initialize string length counter to include zero terminator.
        !          1926: 
        !          1927:     i = 1;
        !          1928: 
        !          1929:     // copy the string itself.  be sure to ignore ppd file comments (#).
        !          1930: 
        !          1931:     while (*(pdata->szLine) && *(pdata->szLine) != '"' &&
        !          1932:            *(pdata->szLine) != '%')
        !          1933:     {
        !          1934:         *szDst++ = *(pdata->szLine++);
        !          1935:         i++;
        !          1936:     }
        !          1937: 
        !          1938:     // get the next line if the string is longer than one line.
        !          1939: 
        !          1940:     if (*(pdata->szLine) != '"')
        !          1941:     {
        !          1942:         while (!(GetLine(pdata)))
        !          1943:         {
        !          1944:             while (*(pdata->szLine) && *(pdata->szLine) != '"' &&
        !          1945:                    *(pdata->szLine) != '%')
        !          1946:             {
        !          1947:                 *szDst++ = *(pdata->szLine++);
        !          1948:                 i++;
        !          1949:             }
        !          1950: 
        !          1951:             if (*(pdata->szLine) == '"')
        !          1952:                 break;
        !          1953: 
        !          1954:             // how 'bout a new line.
        !          1955: 
        !          1956:             *szDst++ = '\n';
        !          1957:             i++;
        !          1958:         }
        !          1959:     }
        !          1960: 
        !          1961:     // add the zero terminator.
        !          1962: 
        !          1963:     *szDst = 0;
        !          1964: 
        !          1965:     // return the length of the string.
        !          1966: 
        !          1967:     return (i);
        !          1968: }
        !          1969: 
        !          1970: 
        !          1971: //--------------------------------------------------------------------------
        !          1972: // VOID EatWhite(pdata)
        !          1973: // PPARSEDATA  pdata;
        !          1974: //
        !          1975: // This routine moves the input buffer pointer forward to the
        !          1976: // next non-white character.
        !          1977: //
        !          1978: // Parameters:
        !          1979: //   None.
        !          1980: //
        !          1981: // Returns:
        !          1982: //   This routine returns TRUE if end of file, FALSE otherwise.
        !          1983: //
        !          1984: // History:
        !          1985: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          1986: //  Brought in from Windows 3.0, and cleaned up.
        !          1987: //--------------------------------------------------------------------------
        !          1988: 
        !          1989: VOID EatWhite(pdata)
        !          1990: PPARSEDATA  pdata;
        !          1991: {
        !          1992:     while (TRUE)
        !          1993:     {
        !          1994:         // skip to the next line if necessary.
        !          1995: 
        !          1996:         if ((*(pdata->szLine) == '\0') || (*(pdata->szLine) == '\n') ||
        !          1997:             (*(pdata->szLine) == '\r'))
        !          1998:             GetLine(pdata);
        !          1999: 
        !          2000:         // we are done if we hit a non-white character.
        !          2001: 
        !          2002:         if ((*(pdata->szLine) != ' ') && (*(pdata->szLine) != '\t'))
        !          2003:             break;
        !          2004: 
        !          2005:         pdata->szLine++;
        !          2006:     }
        !          2007: }
        !          2008: 
        !          2009: 
        !          2010: //--------------------------------------------------------------------------
        !          2011: // int GetNumber(pdata)
        !          2012: // PPARSEDATA  pdata;
        !          2013: //
        !          2014: // This routine parses an ASCII decimal number from the
        !          2015: // input file stream and returns its value.
        !          2016: //
        !          2017: // Parameters:
        !          2018: //   None.
        !          2019: //
        !          2020: // Returns:
        !          2021: //   This routine returns integer value of ASCII decimal number.
        !          2022: //
        !          2023: // History:
        !          2024: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          2025: //  Brought in from Windows 3.0, and cleaned up.
        !          2026: //--------------------------------------------------------------------------
        !          2027: 
        !          2028: int GetNumber(pdata)
        !          2029: PPARSEDATA  pdata;
        !          2030: {
        !          2031:     int iVal;
        !          2032:     BOOL fNegative;
        !          2033: 
        !          2034:     fNegative = FALSE;
        !          2035: 
        !          2036:     iVal = 0;
        !          2037: 
        !          2038:     EatWhite(pdata);
        !          2039: 
        !          2040:     // skip quotation mark if number is in quotes.
        !          2041: 
        !          2042:     if (*(pdata->szLine) == '"')
        !          2043:     {
        !          2044:         pdata->szLine++;
        !          2045:         EatWhite(pdata);    // necessary if " 0 1".
        !          2046:     }
        !          2047: 
        !          2048:     if (*(pdata->szLine) == '-')
        !          2049:     {
        !          2050:         fNegative = TRUE;
        !          2051:         ++(pdata->szLine);
        !          2052:     }
        !          2053: 
        !          2054:     // handle the case where the value is '.2'.  make it zero.
        !          2055: 
        !          2056:     if (*(pdata->szLine) == '.')
        !          2057:     {
        !          2058:         // skip all the fractional digits.
        !          2059: 
        !          2060:         while ((*(pdata->szLine)) && (*(pdata->szLine) != ' ') &&
        !          2061:                (*(pdata->szLine) != '\t') && (*(pdata->szLine) != '"'))
        !          2062:             pdata->szLine++;
        !          2063: 
        !          2064:         return(0);
        !          2065:     }
        !          2066: 
        !          2067:     if (*(pdata->szLine) < '0' || *(pdata->szLine) > '9')
        !          2068:     {
        !          2069:         RIP("PSCRIPT!GetNumber:  invalid number found.  things will go bad from here.\n");
        !          2070:         return(0);
        !          2071:     }
        !          2072: 
        !          2073:     while (*(pdata->szLine) >= '0' && *(pdata->szLine) <= '9')
        !          2074:         iVal = iVal * 10 + (*(pdata->szLine++) - '0');
        !          2075: 
        !          2076:     // some .PPD files, which will not be mentioned do NOT follow
        !          2077:     // the Adobe spec, and put non-integer values where they
        !          2078:     // do not belong.  therefore, if we hit a non-integer value,
        !          2079:     // simply lop off the fraction.
        !          2080: 
        !          2081:     if (*(pdata->szLine) == '.')
        !          2082:     {
        !          2083:        // just skip along until we hit some white space.
        !          2084: 
        !          2085:         while ((*(pdata->szLine)) && (*(pdata->szLine) != ' ') &&
        !          2086:                (*(pdata->szLine) != '\t') && (*(pdata->szLine) != '"'))
        !          2087:            pdata->szLine++;
        !          2088:     }
        !          2089: 
        !          2090:     if (fNegative)
        !          2091:         iVal = - iVal;
        !          2092: 
        !          2093:     return(iVal);
        !          2094: }
        !          2095: 
        !          2096: 
        !          2097: //--------------------------------------------------------------------------
        !          2098: // int GetFloat(iScale, pdata)
        !          2099: // int         iScale;        // The amount to scale the value by
        !          2100: // PPARSEDATA  pdata;
        !          2101: //
        !          2102: // This routine parses an ASCII floating point decimal number from the
        !          2103: // input file stream and returns its value scaled by a specified amount.
        !          2104: //
        !          2105: // Parameters:
        !          2106: //   None.
        !          2107: //
        !          2108: // Returns:
        !          2109: //   This routine returns integer value of ASCII decimal number.
        !          2110: //
        !          2111: // History:
        !          2112: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          2113: //  Brought in from Windows 3.0, and cleaned up.
        !          2114: //--------------------------------------------------------------------------
        !          2115: 
        !          2116: int GetFloat(iScale, pdata)
        !          2117: int         iScale;        // The amount to scale the value by
        !          2118: PPARSEDATA  pdata;
        !          2119: {
        !          2120:     long lVal;
        !          2121:     long lDivisor;
        !          2122:     BOOL fNegative;
        !          2123: 
        !          2124:     EatWhite(pdata);
        !          2125: 
        !          2126:     fNegative = FALSE;
        !          2127:     lVal = 0L;
        !          2128: 
        !          2129:     if (*(pdata->szLine) == '-')
        !          2130:     {
        !          2131:         fNegative = TRUE;
        !          2132:         pdata->szLine++;
        !          2133:     }
        !          2134: 
        !          2135:     if (*(pdata->szLine) < '0' || *(pdata->szLine) > '9')
        !          2136:     {
        !          2137:         RIP("PSCRIPT!GetFloat: invalid number.\n");
        !          2138:         return(0);
        !          2139:     }
        !          2140: 
        !          2141:     while (*(pdata->szLine) >= '0' && *(pdata->szLine) <= '9')
        !          2142:         lVal = lVal * 10 + (*(pdata->szLine++) - '0');
        !          2143: 
        !          2144:     lDivisor = 1L;
        !          2145:     if (*(pdata->szLine) == '.')
        !          2146:     {
        !          2147:         pdata->szLine++;
        !          2148:         while (*(pdata->szLine) >= '0' && *(pdata->szLine) <= '9')
        !          2149:         {
        !          2150:             lVal = lVal * 10 + (*(pdata->szLine++) - '0');
        !          2151:             lDivisor = lDivisor * 10;
        !          2152:         }
        !          2153:     }
        !          2154:     lVal = (lVal * iScale) / lDivisor;
        !          2155: 
        !          2156:     if (fNegative)
        !          2157:         lVal = - lVal;
        !          2158: 
        !          2159:     return((short)lVal);
        !          2160: }
        !          2161: 
        !          2162: 
        !          2163: //--------------------------------------------------------------------------
        !          2164: // void GetDimension(pdim, pdata)
        !          2165: // PAPERDIM   *pdim;
        !          2166: // PPARSEDATA  pdata;
        !          2167: //
        !          2168: // This routine extracts the paper dimension from the ppd file.
        !          2169: //
        !          2170: // Returns:
        !          2171: //   This routine returns no value.
        !          2172: //
        !          2173: // History:
        !          2174: //   03-Apr-1991    -by-    Kent Settle     (kentse)
        !          2175: //  Rewrote it.
        !          2176: //   25-Mar-1991    -by-    Kent Settle    (kentse)
        !          2177: //  Stole from Windows 3.0, and cleaned up.
        !          2178: //--------------------------------------------------------------------------
        !          2179: 
        !          2180: void GetDimension(pdim, pdata)
        !          2181: PAPERDIM   *pdim;
        !          2182: PPARSEDATA  pdata;
        !          2183: {
        !          2184:     pdim->sizl.cx = GetNumber(pdata);
        !          2185:     EatWhite(pdata);
        !          2186:     pdim->sizl.cy = GetNumber(pdata);
        !          2187: }
        !          2188: 
        !          2189: 
        !          2190: //--------------------------------------------------------------------------
        !          2191: // void GetImageableArea(prect, pdata)
        !          2192: // RECTL      *prect;
        !          2193: // PPARSEDATA  pdata;
        !          2194: //
        !          2195: // This routine extracts the imageable area from the ppd file.
        !          2196: //
        !          2197: // Returns:
        !          2198: //   This routine returns no value.
        !          2199: //
        !          2200: // History:
        !          2201: //   03-Apr-1991    -by-    Kent Settle     (kentse)
        !          2202: //  Rewrote it.
        !          2203: //   25-Mar-1991    -by-    Kent Settle    (kentse)
        !          2204: //  Stole from Windows 3.0, and cleaned up.
        !          2205: //--------------------------------------------------------------------------
        !          2206: 
        !          2207: void GetImageableArea(prect, pdata)
        !          2208: RECTL      *prect;
        !          2209: PPARSEDATA  pdata;
        !          2210: {
        !          2211:     prect->left = GetNumber(pdata);
        !          2212:     prect->bottom = GetNumber(pdata);
        !          2213:     prect->right = GetNumber(pdata);
        !          2214:     prect->top = GetNumber(pdata);
        !          2215: }
        !          2216: 
        !          2217: 
        !          2218: //--------------------------------------------------------------------
        !          2219: // szLength(pszScan)
        !          2220: //
        !          2221: // This routine calculates the length of a given string, including
        !          2222: // the terminating NULL.  This routine checks to make sure the
        !          2223: // string is not longer than MAX_STRING.
        !          2224: //
        !          2225: // History:
        !          2226: //   19-Mar-1991        -by-    Kent Settle     (kentse)
        !          2227: // Created.
        !          2228: //--------------------------------------------------------------------
        !          2229: 
        !          2230: int szLength(pszScan)
        !          2231: char    *pszScan;
        !          2232: {
        !          2233:     int i;
        !          2234:     char *pszTmp;
        !          2235: 
        !          2236:     pszTmp = pszScan;
        !          2237: 
        !          2238:     i = 1;
        !          2239:     while (*pszScan++ != '\0')
        !          2240:         i++;
        !          2241: 
        !          2242:     // do a little internal checking.
        !          2243: 
        !          2244:     if (i > MAX_PPD_STRING)
        !          2245:     {
        !          2246:        DbgPrint("String Length too long!\n");
        !          2247:        DbgPrint("Offending String: \"%s\"", pszTmp);
        !          2248:         RIP("PSCRIPT!szLength:  about to overrun buffer.\n");
        !          2249:     }
        !          2250: 
        !          2251:     return(i);
        !          2252: }
        !          2253: 
        !          2254: 
        !          2255: //--------------------------------------------------------------------------
        !          2256: //
        !          2257: // BOOL szIsEqual(sz1, sz2)
        !          2258: // char *sz1;
        !          2259: // char *sz2;
        !          2260: //
        !          2261: // This routine compares two NULL terminated strings.
        !          2262: //
        !          2263: // Parameters:
        !          2264: //   sz1
        !          2265: //     Pointer to string 1.
        !          2266: //
        !          2267: //   sz2
        !          2268: //     Pointer to string2.
        !          2269: //
        !          2270: // Returns:
        !          2271: //   This routine returns TRUE if strings are same, FALSE otherwise.
        !          2272: //
        !          2273: // History:
        !          2274: //   18-Mar-1991    -by-    Kent Settle    (kentse)
        !          2275: //  Brought in from Windows 3.0, and cleaned up.
        !          2276: //--------------------------------------------------------------------------
        !          2277: 
        !          2278: BOOL szIsEqual(sz1, sz2)
        !          2279: char *sz1;
        !          2280: char *sz2;
        !          2281: {
        !          2282:     while (*sz1 && *sz2)
        !          2283:     {
        !          2284:         if (*sz1++ != *sz2++)
        !          2285:             return(FALSE);
        !          2286:     }
        !          2287: 
        !          2288:     return(*sz1 == *sz2);
        !          2289: }
        !          2290: 
        !          2291: 
        !          2292: //--------------------------------------------------------------------------
        !          2293: // int NameComp(pname1, pname2)
        !          2294: // CHAR   *pname1;
        !          2295: // CHAR   *pname2;
        !          2296: //
        !          2297: // This routine is a glorified version of strcmp, in that it first gets
        !          2298: // rid of any PostScript translation strings before comparing the strings.
        !          2299: //
        !          2300: // Returns same as strcmp.
        !          2301: //
        !          2302: // History:
        !          2303: //   20-Mar-1993    -by-    Kent Settle     (kentse)
        !          2304: //  Wrote it.
        !          2305: //--------------------------------------------------------------------------
        !          2306: 
        !          2307: int NameComp(pname1, pname2)
        !          2308: CHAR   *pname1;
        !          2309: CHAR   *pname2;
        !          2310: {
        !          2311:     CHAR    buf1[MAX_PS_NAME];
        !          2312:     CHAR    buf2[MAX_PS_NAME];
        !          2313:     PSTR    pstr1, pstr2;
        !          2314: 
        !          2315:     // loop through the first name.  copy it into a buffer until we hit
        !          2316:     // either the NULL terminator, or the '/' translation string deliminator.
        !          2317: 
        !          2318:     pstr1 = pname1;
        !          2319:     pstr2 = buf1;
        !          2320: 
        !          2321:     while (*pstr1 && (*pstr1 != '/'))
        !          2322:         *pstr2++ = *pstr1++;
        !          2323: 
        !          2324:     *pstr2 = '\0';
        !          2325: 
        !          2326:     // now do the same for the second name.
        !          2327: 
        !          2328:     pstr1 = pname2;
        !          2329:     pstr2 = buf2;
        !          2330: 
        !          2331:     while (*pstr1 && (*pstr1 != '/'))
        !          2332:         *pstr2++ = *pstr1++;
        !          2333: 
        !          2334:     *pstr2 = '\0';
        !          2335: 
        !          2336:     // now both buffers contain the names with any translation strings removed.
        !          2337: 
        !          2338:     return(strcmp(buf1, buf2));
        !          2339: }
        !          2340: 
        !          2341: 
        !          2342: //--------------------------------------------------------------------------
        !          2343: // int NameComp(pname1, pname2)
        !          2344: // CHAR   *pname1;
        !          2345: // CHAR   *pname2;
        !          2346: //
        !          2347: // This routine is a glorified version of strcmp, in that it first gets
        !          2348: // rid of any PostScript translation strings before comparing the strings.
        !          2349: //
        !          2350: // Returns same as strcmp.
        !          2351: //
        !          2352: // History:
        !          2353: //   20-Mar-1993    -by-    Kent Settle     (kentse)
        !          2354: //  Wrote it.
        !          2355: //--------------------------------------------------------------------------
        !          2356: 
        !          2357: VOID ParseProtocols(pdata, pntpd)
        !          2358: PPARSEDATA      pdata;
        !          2359: PNTPD           pntpd;
        !          2360: {
        !          2361:     CHAR    buf[256];
        !          2362:     CHAR   *pbuf;
        !          2363:     BOOL    bMore, bWordDone;
        !          2364:     CHAR    jCh;
        !          2365:     DWORD   cjBuf;
        !          2366: 
        !          2367:     // there may be several protocols defined, so loop until we get
        !          2368:     // them all.
        !          2369: 
        !          2370:     bMore = TRUE;
        !          2371: 
        !          2372:     while (bMore)
        !          2373:     {
        !          2374:         // gobble up any white space.
        !          2375: 
        !          2376:         EatWhite(pdata);
        !          2377: 
        !          2378:         pbuf = buf;
        !          2379:         cjBuf = sizeof(buf) - 1;
        !          2380: 
        !          2381:         bWordDone = FALSE;
        !          2382: 
        !          2383:         while(cjBuf--)
        !          2384:         {
        !          2385:             switch(jCh = *(pdata->szLine++))
        !          2386:             {
        !          2387:                 case 0:
        !          2388:                 case '\n':     // take care of newline and carriage returns.
        !          2389:                 case '\r':
        !          2390:                     --pdata->szLine;
        !          2391:                     *pbuf = 0;
        !          2392:                     bMore = FALSE;
        !          2393:                     bWordDone = TRUE;
        !          2394:                     break;
        !          2395:                 case ' ':
        !          2396:                 case '\t':
        !          2397:                     --pdata->szLine;
        !          2398:                     *pbuf = 0;
        !          2399:                     bWordDone = TRUE;
        !          2400:                     break;
        !          2401:                 default:
        !          2402:                     *pbuf++ = jCh;
        !          2403:                     break;
        !          2404:             }
        !          2405: 
        !          2406:             if (bWordDone)
        !          2407:             {
        !          2408:                 // reset pointer to start of buffer.
        !          2409: 
        !          2410:                 pbuf = buf;
        !          2411:                 cjBuf = sizeof(buf) - 1;
        !          2412: 
        !          2413:                 if (!(strncmp(pbuf, "PJL", 3)))
        !          2414:                 {
        !          2415:                     pntpd->flFlags |= PJL_PROTOCOL;
        !          2416: #if TESTING
        !          2417:                     DbgPrint("Device supports PJL protocol.\n");
        !          2418: #endif
        !          2419:                 }
        !          2420:                 else if (!(strncmp(pbuf, "SIC", 3)))
        !          2421:                 {
        !          2422:                     pntpd->flFlags |= SIC_PROTOCOL;
        !          2423: #if TESTING
        !          2424:                     DbgPrint("Device supports SIC protocol.\n");
        !          2425: #endif
        !          2426:                 }
        !          2427: 
        !          2428:                 // now go see if there is another protocol to parse.
        !          2429: 
        !          2430:                 break;
        !          2431:             }
        !          2432:         }
        !          2433: 
        !          2434:     }
        !          2435: }

unix.superglobalmegacorp.com

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