Annotation of ntddk/src/print/pscript/output.c, revision 1.1.1.1

1.1       root        1: //--------------------------------------------------------------------------
                      2: //
                      3: // Module Name:  OUTPUT.C
                      4: //
                      5: // Brief Description:  This module contains the PSCRIPT driver's output
                      6: // functions and related routines.
                      7: //
                      8: // Author:  Kent Settle (kentse)
                      9: // Created: 20-Nov-1990
                     10: //
                     11: // Copyright (c) 1990 - 1993 Microsoft Corporation
                     12: //
                     13: // This routine contains routines to handle opening, writing to, and
                     14: // closing the output channel.
                     15: //--------------------------------------------------------------------------
                     16: 
                     17: #include "stdlib.h"
                     18: #include "pscript.h"
                     19: #include "enable.h"
                     20: #include "stdarg.h"
                     21: 
                     22: // external declarations.
                     23: 
                     24: extern BOOL  bOutputHeader(PDEVDATA);
                     25: 
                     26: // declarations of routines residing within this module.
                     27: 
                     28: DWORD PSFIXToBuffer(CHAR *, PS_FIX);
                     29: 
                     30: // we are using PS_FIX numbers, which are 24.8.  therefore, there are only
                     31: // 256 possible fractional values, so here is a table containing their
                     32: // ASCII equivalents.
                     33: 
                     34: static char *Fracs[] =
                     35: {
                     36: "",     // 0.00000        0 / 256.
                     37: "004",  // 0.00391        1 / 256.
                     38: "008",  // 0.00781        2 / 256.
                     39: "012",  // 0.01172        3 / 256.
                     40: "016",  // 0.01563        4 / 256.
                     41: "020",  // 0.01953        5 / 256.
                     42: "023",  // 0.02344        6 / 256.
                     43: "027",  // 0.02734        7 / 256.
                     44: "031",  // 0.03125        8 / 256.
                     45: "035",  // 0.03516        9 / 256.
                     46: "039",  // 0.03906       10 / 256.
                     47: "043",  // 0.04297       11 / 256.
                     48: "047",  // 0.04688       12 / 256.
                     49: "051",  // 0.05078       13 / 256.
                     50: "055",  // 0.05469       14 / 256.
                     51: "059",  // 0.05859       15 / 256.
                     52: "063",  // 0.06250       16 / 256.
                     53: "066",  // 0.06641       17 / 256.
                     54: "070",  // 0.07031       18 / 256.
                     55: "074",  // 0.07422       19 / 256.
                     56: "078",  // 0.07813       20 / 256.
                     57: "082",  // 0.08203       21 / 256.
                     58: "086",  // 0.08594       22 / 256.
                     59: "090",  // 0.08984       23 / 256.
                     60: "094",  // 0.09375       24 / 256.
                     61: "098",  // 0.09766       25 / 256.
                     62: "102",  // 0.10156       26 / 256.
                     63: "105",  // 0.10547       27 / 256.
                     64: "109",  // 0.10938       28 / 256.
                     65: "113",  // 0.11328       29 / 256.
                     66: "117",  // 0.11719       30 / 256.
                     67: "121",  // 0.12109       31 / 256.
                     68: "125",  // 0.12500       32 / 256.
                     69: "129",  // 0.12891       33 / 256.
                     70: "133",  // 0.13281       34 / 256.
                     71: "137",  // 0.13672       35 / 256.
                     72: "141",  // 0.14063       36 / 256.
                     73: "145",  // 0.14453       37 / 256.
                     74: "148",  // 0.14844       38 / 256.
                     75: "152",  // 0.15234       39 / 256.
                     76: "156",  // 0.15625       40 / 256.
                     77: "160",  // 0.16016       41 / 256.
                     78: "164",  // 0.16406       42 / 256.
                     79: "168",  // 0.16797       43 / 256.
                     80: "172",  // 0.17188       44 / 256.
                     81: "176",  // 0.17578       45 / 256.
                     82: "180",  // 0.17969       46 / 256.
                     83: "184",  // 0.18359       47 / 256.
                     84: "188",  // 0.18750       48 / 256.
                     85: "191",  // 0.19141       49 / 256.
                     86: "195",  // 0.19531       50 / 256.
                     87: "199",  // 0.19922       51 / 256.
                     88: "203",  // 0.20313       52 / 256.
                     89: "207",  // 0.20703       53 / 256.
                     90: "211",  // 0.21094       54 / 256.
                     91: "215",  // 0.21484       55 / 256.
                     92: "219",  // 0.21875       56 / 256.
                     93: "223",  // 0.22266       57 / 256.
                     94: "227",  // 0.22656       58 / 256.
                     95: "230",  // 0.23047       59 / 256.
                     96: "234",  // 0.23438       60 / 256.
                     97: "238",  // 0.23828       61 / 256.
                     98: "242",  // 0.24219       62 / 256.
                     99: "246",  // 0.24609       63 / 256.
                    100: "25",   // 0.25000       64 / 256.
                    101: "254",  // 0.25391       65 / 256.
                    102: "258",  // 0.25781       66 / 256.
                    103: "262",  // 0.26172       67 / 256.
                    104: "266",  // 0.26563       68 / 256.
                    105: "270",  // 0.26953       69 / 256.
                    106: "273",  // 0.27344       70 / 256.
                    107: "277",  // 0.27734       71 / 256.
                    108: "281",  // 0.28125       72 / 256.
                    109: "285",  // 0.28516       73 / 256.
                    110: "289",  // 0.28906       74 / 256.
                    111: "293",  // 0.29297       75 / 256.
                    112: "297",  // 0.29688       76 / 256.
                    113: "301",  // 0.30078       77 / 256.
                    114: "305",  // 0.30469       78 / 256.
                    115: "309",  // 0.30859       79 / 256.
                    116: "313",  // 0.31250       80 / 256.
                    117: "316",  // 0.31641       81 / 256.
                    118: "320",  // 0.32031       82 / 256.
                    119: "324",  // 0.32422       83 / 256.
                    120: "328",  // 0.32813       84 / 256.
                    121: "332",  // 0.33203       85 / 256.
                    122: "336",  // 0.33594       86 / 256.
                    123: "340",  // 0.33984       87 / 256.
                    124: "344",  // 0.34375       88 / 256.
                    125: "348",  // 0.34766       89 / 256.
                    126: "352",  // 0.35156       90 / 256.
                    127: "355",  // 0.35547       91 / 256.
                    128: "359",  // 0.35938       92 / 256.
                    129: "363",  // 0.36328       93 / 256.
                    130: "367",  // 0.36719       94 / 256.
                    131: "371",  // 0.37109       95 / 256.
                    132: "375",  // 0.37500       96 / 256.
                    133: "379",  // 0.37891       97 / 256.
                    134: "383",  // 0.38281       98 / 256.
                    135: "387",  // 0.38672       99 / 256.
                    136: "391",  // 0.39063      100 / 256.
                    137: "394",  // 0.39453      101 / 256.
                    138: "398",  // 0.39844      102 / 256.
                    139: "402",  // 0.40234      103 / 256.
                    140: "406",  // 0.40625      104 / 256.
                    141: "410",  // 0.41016      105 / 256.
                    142: "414",  // 0.41406      106 / 256.
                    143: "418",  // 0.41797      107 / 256.
                    144: "422",  // 0.42188      108 / 256.
                    145: "426",  // 0.42578      109 / 256.
                    146: "430",  // 0.42969      110 / 256.
                    147: "434",  // 0.43359      111 / 256.
                    148: "438",  // 0.43750      112 / 256.
                    149: "441",  // 0.44141      113 / 256.
                    150: "445",  // 0.44531      114 / 256.
                    151: "449",  // 0.44922      115 / 256.
                    152: "453",  // 0.45313      116 / 256.
                    153: "457",  // 0.45703      117 / 256.
                    154: "461",  // 0.46094      118 / 256.
                    155: "465",  // 0.46484      119 / 256.
                    156: "469",  // 0.46875      120 / 256.
                    157: "473",  // 0.47266      121 / 256.
                    158: "477",  // 0.47656      122 / 256.
                    159: "480",  // 0.48047      123 / 256.
                    160: "484",  // 0.48438      124 / 256.
                    161: "488",  // 0.48828      125 / 256.
                    162: "492",  // 0.49219      126 / 256.
                    163: "496",  // 0.49609      127 / 256.
                    164: "5",    // 0.50000      128 / 256.
                    165: "504",  // 0.50391      129 / 256.
                    166: "508",  // 0.50781      130 / 256.
                    167: "512",  // 0.51172      131 / 256.
                    168: "516",  // 0.51563      132 / 256.
                    169: "520",  // 0.51953      133 / 256.
                    170: "523",  // 0.52344      134 / 256.
                    171: "527",  // 0.52734      135 / 256.
                    172: "531",  // 0.53125      136 / 256.
                    173: "535",  // 0.53516      137 / 256.
                    174: "539",  // 0.53906      138 / 256.
                    175: "543",  // 0.54297      139 / 256.
                    176: "547",  // 0.54688      140 / 256.
                    177: "551",  // 0.55078      141 / 256.
                    178: "555",  // 0.55469      142 / 256.
                    179: "559",  // 0.55859      143 / 256.
                    180: "563",  // 0.56250      144 / 256.
                    181: "566",  // 0.56641      145 / 256.
                    182: "570",  // 0.57031      146 / 256.
                    183: "574",  // 0.57422      147 / 256.
                    184: "578",  // 0.57813      148 / 256.
                    185: "582",  // 0.58203      149 / 256.
                    186: "586",  // 0.58594      150 / 256.
                    187: "590",  // 0.58984      151 / 256.
                    188: "594",  // 0.59375      152 / 256.
                    189: "598",  // 0.59766      153 / 256.
                    190: "602",  // 0.60156      154 / 256.
                    191: "605",  // 0.60547      155 / 256.
                    192: "609",  // 0.60938      156 / 256.
                    193: "613",  // 0.61328      157 / 256.
                    194: "617",  // 0.61719      158 / 256.
                    195: "621",  // 0.62109      159 / 256.
                    196: "625",  // 0.62500      160 / 256.
                    197: "629",  // 0.62891      161 / 256.
                    198: "633",  // 0.63281      162 / 256.
                    199: "637",  // 0.63672      163 / 256.
                    200: "641",  // 0.64063      164 / 256.
                    201: "645",  // 0.64453      165 / 256.
                    202: "648",  // 0.64844      166 / 256.
                    203: "652",  // 0.65234      167 / 256.
                    204: "656",  // 0.65625      168 / 256.
                    205: "660",  // 0.66016      169 / 256.
                    206: "664",  // 0.66406      170 / 256.
                    207: "668",  // 0.66797      171 / 256.
                    208: "672",  // 0.67188      172 / 256.
                    209: "676",  // 0.67578      173 / 256.
                    210: "680",  // 0.67969      174 / 256.
                    211: "684",  // 0.68359      175 / 256.
                    212: "688",  // 0.68750      176 / 256.
                    213: "691",  // 0.69141      177 / 256.
                    214: "691",  // 0.69531      178 / 256.
                    215: "699",  // 0.69922      179 / 256.
                    216: "703",  // 0.70313      180 / 256.
                    217: "707",  // 0.70703      181 / 256.
                    218: "711",  // 0.71094      182 / 256.
                    219: "715",  // 0.71484      183 / 256.
                    220: "719",  // 0.71875      184 / 256.
                    221: "723",  // 0.72266      185 / 256.
                    222: "727",  // 0.72656      186 / 256.
                    223: "730",  // 0.73047      187 / 256.
                    224: "734",  // 0.73438      188 / 256.
                    225: "738",  // 0.73828      189 / 256.
                    226: "742",  // 0.74219      190 / 256.
                    227: "746",  // 0.74609      191 / 256.
                    228: "75",   // 0.75000      192 / 256.
                    229: "754",  // 0.75391      193 / 256.
                    230: "758",  // 0.75781      194 / 256.
                    231: "762",  // 0.76172      195 / 256.
                    232: "766",  // 0.76563      196 / 256.
                    233: "770",  // 0.76953      197 / 256.
                    234: "773",  // 0.77344      198 / 256.
                    235: "777",  // 0.77734      199 / 256.
                    236: "781",  // 0.78125      200 / 256.
                    237: "785",  // 0.78516      201 / 256.
                    238: "789",  // 0.78906      202 / 256.
                    239: "793",  // 0.79297      203 / 256.
                    240: "797",  // 0.79688      204 / 256.
                    241: "801",  // 0.80078      205 / 256.
                    242: "805",  // 0.80469      206 / 256.
                    243: "809",  // 0.80859      207 / 256.
                    244: "813",  // 0.81250      208 / 256.
                    245: "816",  // 0.81641      209 / 256.
                    246: "820",  // 0.82031      210 / 256.
                    247: "824",  // 0.82422      211 / 256.
                    248: "828",  // 0.82813      212 / 256.
                    249: "832",  // 0.83203      213 / 256.
                    250: "836",  // 0.83594      214 / 256.
                    251: "840",  // 0.83984      215 / 256.
                    252: "844",  // 0.84375      216 / 256.
                    253: "848",  // 0.84766      217 / 256.
                    254: "852",  // 0.85156      218 / 256.
                    255: "856",  // 0.85547      219 / 256.
                    256: "859",  // 0.85938      220 / 256.
                    257: "863",  // 0.86328      221 / 256.
                    258: "867",  // 0.86719      222 / 256.
                    259: "871",  // 0.87109      223 / 256.
                    260: "875",  // 0.87500      224 / 256.
                    261: "879",  // 0.87891      225 / 256.
                    262: "883",  // 0.88281      226 / 256.
                    263: "887",  // 0.88672      227 / 256.
                    264: "891",  // 0.89063      228 / 256.
                    265: "895",  // 0.89453      229 / 256.
                    266: "898",  // 0.89844      230 / 256.
                    267: "902",  // 0.90234      231 / 256.
                    268: "906",  // 0.90625      232 / 256.
                    269: "910",  // 0.91016      233 / 256.
                    270: "914",  // 0.91406      234 / 256.
                    271: "918",  // 0.91797      235 / 256.
                    272: "922",  // 0.92188      236 / 256.
                    273: "926",  // 0.92578      237 / 256.
                    274: "930",  // 0.92969      238 / 256.
                    275: "934",  // 0.93359      239 / 256.
                    276: "938",  // 0.93750      240 / 256.
                    277: "941",  // 0.94141      241 / 256.
                    278: "945",  // 0.94531      242 / 256.
                    279: "949",  // 0.94922      243 / 256.
                    280: "953",  // 0.95313      244 / 256.
                    281: "957",  // 0.95703      245 / 256.
                    282: "961",  // 0.96094      246 / 256.
                    283: "965",  // 0.96484      247 / 256.
                    284: "969",  // 0.96875      248 / 256.
                    285: "973",  // 0.97266      249 / 256.
                    286: "977",  // 0.97656      250 / 256.
                    287: "980",  // 0.98047      251 / 256.
                    288: "984",  // 0.98438      252 / 256.
                    289: "988",  // 0.98828      253 / 256.
                    290: "992",  // 0.99219      254 / 256.
                    291: "996"   // 0.99609      255 / 256.
                    292: };
                    293: 
                    294: #define LOCAL_BUFFER_SIZE  64
                    295: 
                    296: 
                    297: //--------------------------------------------------------------------------
                    298: // BOOL PrintString(pdev, psz)
                    299: // PDEVDATA    pdev;
                    300: // PSZ     psz;
                    301: //
                    302: // This routine takes cNumbers of decimal numbers and outputs them to
                    303: // the printers, with a space following each number.
                    304: //
                    305: // Parameters:
                    306: //   pdev:
                    307: //     pointer to DEVDATA structure.
                    308: //
                    309: //   cNumbers:
                    310: //     count of decimal numbers to output.
                    311: //
                    312: //   iStack:
                    313: //     place holder for parameters on stack.
                    314: //
                    315: // Returns:
                    316: //   This function returns TRUE if the numbers were sent out, else FALSE.
                    317: //
                    318: // History:
                    319: //   08-Nov-1991     -by-      Kent Settle     (kentse)
                    320: //  Wrote it.
                    321: //--------------------------------------------------------------------------
                    322: 
                    323: BOOL PrintString(pdev, psz)
                    324: PDEVDATA    pdev;
                    325: PSZ        psz;
                    326: {
                    327:     // simply send the string to the printer.  yes, we want strlen bytes
                    328:     // passed to bPSWrite.  we don't want the NULL terminator.
                    329: 
                    330:     return(bPSWrite(pdev, psz, strlen(psz)));
                    331: }
                    332: 
                    333: 
                    334: //--------------------------------------------------------------------------
                    335: // BOOL PrintDecimal(pdev, cNumbers, ...)
                    336: // PDEVDATA    pdev;
                    337: // DWORD           cNumbers;
                    338: //
                    339: // This routine takes cNumbers of decimal numbers and outputs them to
                    340: // the printers, with a space following each number.
                    341: //
                    342: // Parameters:
                    343: //   pdev:
                    344: //     pointer to DEVDATA structure.
                    345: //
                    346: //   cNumbers:
                    347: //     count of decimal numbers to output.
                    348: //
                    349: //   iStack:
                    350: //     place holder for parameters on stack.
                    351: //
                    352: // Returns:
                    353: //   This function returns TRUE if the numbers were sent out, else FALSE.
                    354: //
                    355: // History:
                    356: //   08-Nov-1991     -by-      Kent Settle     (kentse)
                    357: //  Wrote it.
                    358: //--------------------------------------------------------------------------
                    359: 
                    360: BOOL PrintDecimal(
                    361: PDEVDATA    pdev,
                    362: DWORD      cNumbers,
                    363: ...
                    364: )
                    365: {
                    366:     CHAR       Buffer[LOCAL_BUFFER_SIZE];
                    367:     CHAR       *pBuffer;
                    368:     DWORD      cb = 0;
                    369:     DWORD      cbTotal = 0;
                    370:     LONG       lNum;
                    371:     va_list     pvarg;
                    372: 
                    373:     // initialize some pointers.
                    374: 
                    375:     pBuffer = Buffer;
                    376:     va_start(pvarg, cNumbers);
                    377: 
                    378:     while (cNumbers--)
                    379:     {
                    380:        // get the next decimal number from the stack, convert it to
                    381:        // ASCII and put it into the output buffer.
                    382: 
                    383:         lNum = va_arg(pvarg, LONG);
                    384:        itoa(lNum, pBuffer, 10);
                    385: 
                    386:        // how many characters, excluding the NULL terminator, did we place
                    387:        // into the output buffer.
                    388: 
                    389:        cb = strlen(pBuffer);
                    390:        if ((cbTotal + cb) >= (LOCAL_BUFFER_SIZE - 1))
                    391:        {
                    392:            RIP("PSCRIPT!PrintDecimal: overran the output buffer.\n");
                    393:            SetLastError(ERROR_BUFFER_OVERFLOW);
                    394:            return(FALSE);
                    395:        }
                    396: 
                    397:        // update the buffer pointer.
                    398: 
                    399:        pBuffer += cb;
                    400: 
                    401:        // output the trailing space.
                    402: 
                    403:         if (cNumbers >= 1)
                    404:         {
                    405:             *pBuffer++ = ' ';       // overwrites NULL terminator from itoa.
                    406:             cb++;
                    407:         }
                    408: 
                    409:        // update the total bytes to buffer counter.
                    410: 
                    411:         cbTotal += cb;
                    412:     }
                    413: 
                    414:     // we have now build the entire string in our local output buffer.
                    415:     // send it out to the printer.
                    416: 
                    417:     return(bPSWrite(pdev, Buffer, cbTotal));
                    418: }
                    419: 
                    420: 
                    421: //--------------------------------------------------------------------------
                    422: // BOOL PrintPSFIX(pdev, cNumbers, iStack)
                    423: // PDEVDATA    pdev;
                    424: // DWORD       cNumbers;
                    425: // DWORD       iStack;
                    426: //
                    427: // This routine takes cNumbers of PS_FIX numbers and outputs them to
                    428: // the printers, with a space following each number.
                    429: //
                    430: // Parameters:
                    431: //   pdev:
                    432: //     pointer to DEVDATA structure.
                    433: //
                    434: //   cNumbers:
                    435: //     count of PS_FIX numbers to output.
                    436: //
                    437: //   iStack:
                    438: //     place holder for parameters on stack.
                    439: //
                    440: // Returns:
                    441: //   This function returns TRUE if the numbers were sent out, else FALSE.
                    442: //
                    443: // History:
                    444: //   08-Nov-1991     -by-      Kent Settle     (kentse)
                    445: //  Wrote it.
                    446: //--------------------------------------------------------------------------
                    447: 
                    448: BOOL PrintPSFIX(
                    449: PDEVDATA    pdev,
                    450: DWORD      cNumbers,
                    451: ...
                    452: )
                    453: {
                    454:     CHAR       Buffer[LOCAL_BUFFER_SIZE];
                    455:     CHAR       *pBuffer;
                    456:     PS_FIX     psfxNum;
                    457:     DWORD      cb = 0;
                    458:     DWORD      cbTotal = 0;
                    459:     va_list     pvarg;
                    460: 
                    461:     // initialize some pointers.
                    462: 
                    463:     pBuffer = Buffer;
                    464:     va_start(pvarg, cNumbers);
                    465: 
                    466:     while (cNumbers--)
                    467:     {
                    468:        // get the next PS_FIX number from the stack.
                    469: 
                    470:         psfxNum = (PS_FIX)va_arg(pvarg, LONG);
                    471: 
                    472:         cb = PSFIXToBuffer(pBuffer, psfxNum);
                    473: 
                    474:         pBuffer += cb;
                    475: 
                    476:         // output the trailing space if not last number in array.
                    477: 
                    478:         if (cNumbers >= 1)
                    479:         {
                    480:             *pBuffer++ = ' ';   // overwrites NULL terminator from strcpy.
                    481:             cb++;
                    482:         }
                    483: 
                    484:         cbTotal += cb;
                    485:         if (cbTotal >= (LOCAL_BUFFER_SIZE - 1))
                    486:        {
                    487:            RIP("PSCRIPT!PrintPSFIX: overran the output buffer.\n");
                    488:            SetLastError(ERROR_BUFFER_OVERFLOW);
                    489:            return(FALSE);
                    490:        }
                    491:     }
                    492: 
                    493:     // we have now built the entire string in our local output buffer.
                    494:     // send it out to the printer.
                    495: 
                    496:     return(bPSWrite(pdev, Buffer, cbTotal));
                    497: }
                    498: 
                    499: 
                    500: //--------------------------------------------------------------------------
                    501: // BOOL bPSWrite(pdev, pbSrc, ulCount)
                    502: // PDEVDATA      pdev;
                    503: // PBYTE    pbSrc;          // pointer to source to write to channel.
                    504: // ULONG    ulCount;    // length of pbSrc.
                    505: //
                    506: // This routine writes to the output buffer.  When the output buffer
                    507: // becomes full, or the channel is closed, the buffer is flushed to the
                    508: // output channel.
                    509: //
                    510: // Parameters:
                    511: //   pdev:
                    512: //     pointer to DEVDATA structure.
                    513: //
                    514: //   pbSrc:
                    515: //     pointer to source, which gets written to the output buffer.
                    516: //
                    517: //   ulCount:
                    518: //     number of bytes in bpSrc.
                    519: //
                    520: // Returns:
                    521: //   This function returns TRUE if the channel was successfully closed,
                    522: //   FALSE otherwise.
                    523: //
                    524: // History:
                    525: //   20-Nov-1990     -by-     Kent Settle     (kentse)
                    526: //  Wrote it.
                    527: //--------------------------------------------------------------------------
                    528: 
                    529: BOOL bPSWrite(pdev, pbSrc, ulCount)
                    530: PDEVDATA    pdev;
                    531: PBYTE    pbSrc;          // pointer to source to write to channel.
                    532: ULONG    ulCount;      // length of pbSrc.
                    533: {
                    534:     ULONG   ulFree;        // free space in buffer.
                    535:     PBYTE   pbDst, pbSource;
                    536: 
                    537:     // output nothing if the document has been cancelled.
                    538: 
                    539:     if (pdev->dwFlags & PDEV_CANCELDOC)
                    540:         return(TRUE);
                    541: 
                    542:     // output nothing if a startdoc call has not been issued.
                    543: 
                    544:     if (!(pdev->dwFlags & PDEV_STARTDOC))
                    545:        return(TRUE);
                    546: 
                    547:     // get a local source pointer to munge with.
                    548: 
                    549:     pbSource = pbSrc;
                    550: 
                    551:     // output our header if it has not yet been done.
                    552: 
                    553:     bOutputHeader(pdev);
                    554: 
                    555:     while(ulCount > 0)
                    556:     {
                    557:         // get a local pointer to the current position in the buffer.
                    558: 
                    559:         pbDst = ((PBYTE)pdev->ioChannel.pBuffer) + pdev->ioChannel.ulBufCount;
                    560: 
                    561:         // get the current number of free bytes in the output buffer.
                    562: 
                    563:        ulFree = OUTPUT_BUFFER_SIZE - pdev->ioChannel.ulBufCount;
                    564: 
                    565:         // if the entire source will fit into the buffer, put it there.
                    566: 
                    567:         if (ulCount < ulFree)
                    568:         {
                    569:             // update the buffer counter.
                    570: 
                    571:             pdev->ioChannel.ulBufCount += ulCount;
                    572: 
                    573:             memcpy(pbDst, pbSource, ulCount);
                    574: 
                    575:             return(TRUE);
                    576:         }
                    577:        else
                    578:        {
                    579: 
                    580:            // control comes here if the source will not fit into the
                    581:            // buffer.  copy ulFree bytes into the buffer, flush the
                    582:            // buffer, and try again.
                    583: 
                    584:            ulCount -= ulFree;
                    585: 
                    586:            memcpy(pbDst, pbSource, ulFree);
                    587: 
                    588:            // update the source pointer.
                    589: 
                    590:            pbSource += ulFree;
                    591: 
                    592:            // set the buffer position holder to the end of the buffer.
                    593: 
                    594:            pdev->ioChannel.ulBufCount = OUTPUT_BUFFER_SIZE;
                    595: 
                    596:            // flush the buffer to the output channel.  ulBufCount
                    597:            // get reset to zero by bPSFlush.
                    598: 
                    599:            bPSFlush(pdev);
                    600:        }
                    601:     }
                    602: 
                    603:     return(TRUE);
                    604: }
                    605: 
                    606: 
                    607: //--------------------------------------------------------------------------
                    608: // BOOL bPSFlush(pdev)
                    609: // PDEVDATA      pdev;
                    610: //
                    611: // This routine flushes the output buffer to the output channel.
                    612: //
                    613: // Parameters:
                    614: //   pdev:
                    615: //     pointer to DEVDATA structure.
                    616: //
                    617: // Returns:
                    618: //   This function returns TRUE if the buffer was successfully flushed,
                    619: //   FALSE otherwise.
                    620: //
                    621: // History:
                    622: //   21-Nov-1990     -by-     Kent Settle     (kentse)
                    623: //  Wrote it.
                    624: //--------------------------------------------------------------------------
                    625: 
                    626: BOOL bPSFlush(pdev)
                    627: PDEVDATA    pdev;
                    628: {
                    629:     DWORD   cWritten;
                    630: 
                    631:     while (pdev->ioChannel.ulBufCount &&
                    632:          !(pdev->dwFlags & PDEV_CANCELDOC))
                    633:     {
                    634:         if (!WritePrinter(pdev->hPrinter, pdev->ioChannel.pBuffer,
                    635:                           pdev->ioChannel.ulBufCount, &cWritten))
                    636:         {
                    637:             DbgPrint("bPSFlush: WritePrinter failed, will not call again.\n");
                    638:             pdev->dwFlags |= PDEV_CANCELDOC;
                    639: 
                    640:         }
                    641:         else
                    642:             pdev->ioChannel.ulBufCount -= cWritten;
                    643:     }
                    644: 
                    645:     if (pdev->dwFlags & PDEV_CANCELDOC)
                    646:     {
                    647:         pdev->ioChannel.ulBufCount = 0;
                    648:         return TRUE;
                    649:     }
                    650: 
                    651:     return(TRUE);
                    652: }
                    653: 
                    654: 
                    655: //--------------------------------------------------------------------------
                    656: // VOID vHexOut(pdev, pbSrc, nbSrc)
                    657: // PDEVDATA    pdev;   // pointer to the DC instance
                    658: // PBYTE       pbSrc;  // pointer to the output buffer to send
                    659: // LONG        nbSrc;  // Size of the output buffer
                    660: //
                    661: // This routine converts a byte string to hexadecimal and sends the
                    662: // result to the output channel.
                    663: //
                    664: // Parameters:
                    665: //   pdev:
                    666: //     pointer to DEVDATA structure.
                    667: //
                    668: //   pbSrc:
                    669: //     pointer to byte string.
                    670: //
                    671: //   nbSrc:
                    672: //     number of bytes in string.
                    673: //
                    674: // Returns:
                    675: //   This function returns no value.
                    676: //
                    677: // History:
                    678: //  Wed Dec 26, 1990    -by-     Kent Settle     (kentse)
                    679: //  Wrote it.
                    680: //--------------------------------------------------------------------------
                    681: 
                    682: VOID vHexOut(pdev, pbSrc, nbSrc)
                    683: PDEVDATA    pdev;   // pointer to the DC instance
                    684: PBYTE      pbSrc;  // pointer to the output buffer to send
                    685: LONG       nbSrc;  // Size of the output buffer
                    686: {
                    687:     register LONG   nwFree;    // Number of 16 bit words available
                    688:     register PBYTE  pbDst, pbSource;
                    689:     int            b1, b2;
                    690:     BOOL           bFitsInBuffer;
                    691: 
                    692:     // output nothing if the document has been cancelled.
                    693: 
                    694:     if (pdev->dwFlags & PDEV_CANCELDOC)
                    695:         return;
                    696: 
                    697:     // output nothing if a startdoc call has not been issued.
                    698: 
                    699:     if (!(pdev->dwFlags & PDEV_STARTDOC))
                    700:         return;
                    701: 
                    702:     // get a local source pointer to munge with.
                    703: 
                    704:     pbSource = pbSrc;
                    705: 
                    706:     // output our header if it has not yet been done.
                    707: 
                    708:     bOutputHeader(pdev);
                    709: 
                    710:     // Loop once for each byte and stuff each byte into the output
                    711:     // buffer. When the buffer becomes full, call FlushChannel to
                    712:     // empty it.
                    713: 
                    714:     while (nbSrc > 0)
                    715:     {
                    716:         // get a pointer to the current location within the output buffer.
                    717:         // then calculate how many WORDS are free in the output buffer.
                    718: 
                    719:         pbDst = ((PBYTE)pdev->ioChannel.pBuffer) + pdev->ioChannel.ulBufCount;
                    720:        nwFree = ((OUTPUT_BUFFER_SIZE - 1) - pdev->ioChannel.ulBufCount) >> 1;
                    721: 
                    722:         // we will be converting one source byte into two destination
                    723:         // bytes, so it is proper to compare the number of source bytes
                    724:         // with the number of destination words.
                    725: 
                    726:         bFitsInBuffer = FALSE;
                    727: 
                    728:         if (nbSrc < nwFree)
                    729:         {
                    730:             nwFree = nbSrc;
                    731:             bFitsInBuffer = TRUE;
                    732:         }
                    733: 
                    734:         nbSrc -= nwFree;
                    735:         pdev->ioChannel.ulBufCount += (nwFree << 1);
                    736: 
                    737:         while (nwFree-- > 0)
                    738:         {
                    739:             // Get a byte and convert it to two hex digits
                    740: 
                    741:             b1 = *pbSource++;
                    742:             b2 = (b1 >> 4) & 0x0f;
                    743:             b1 &= 0x0f;
                    744: 
                    745: //!!! during the code review it was suggested to use itoa here.
                    746: //!!! is that really worth doing??? - kentse.
                    747: 
                    748:             if (b2 >= 10)
                    749:                 b2 += ('A' - 10);
                    750:             else
                    751:                 b2 += '0';
                    752: 
                    753:             if (b1 >= 10)
                    754:                 b1 += ('A' - 10);
                    755:             else
                    756:                 b1 += '0';
                    757: 
                    758:             *pbDst++ = (CHAR)b2;
                    759:             *pbDst++ = (CHAR)b1;
                    760:         }
                    761: 
                    762:         // flush the buffer when it is full.
                    763: 
                    764:         if (!bFitsInBuffer)
                    765:             bPSFlush(pdev);
                    766:     }
                    767: }
                    768: 
                    769: // These two routines support four cases for Bitmaps:
                    770: //
                    771: //      DataType        Form
                    772: //      -----------|-------------
                    773: //         0       | Unpacked binary data               - level1
                    774: //         1       | Unpacked hex    data               - level1
                    775: //         2       | Packed binary data( RLE only)      - level2
                    776: //         3       | Packed ascii85 data(RLE + ascii85) - level2
                    777: SHORT PSBitMapType(PDEVDATA pdev, BOOL BinaryClearChannel)
                    778: {
                    779: 
                    780:   if(!BinaryClearChannel)
                    781:   {
                    782:      if(pdev->pntpd->LangLevel == 2)
                    783:      {
                    784:          if (pdev->pntpd->flFlags & BCP_PROTOCOL)
                    785:             return(3);
                    786:          else
                    787:             return(1);
                    788:      }
                    789:      else
                    790:          return(1);
                    791:    }
                    792:    else
                    793:    {
                    794:      if(pdev->pntpd->LangLevel == 2)
                    795:      {
                    796:          if (pdev->pntpd->flFlags & TBCP_PROTOCOL)
                    797:             return(2);
                    798:          else
                    799:             return(0);
                    800:      }
                    801:      else
                    802:          return(0);
                    803:    }
                    804: }
                    805: 
                    806: 
                    807: //--------------------------------------------------------------------------
                    808: // DWORD PSFIXToBuffer(pbuffer, psfx)
                    809: // CHAR       *pbuffer;
                    810: // PS_FIX      psfx;
                    811: //
                    812: // This routine takes a PS_FIX (24.8) number and outputs its ASCII
                    813: // equivalent to pbuffer.
                    814: //
                    815: // Parameters:
                    816: //   pbuffer:
                    817: //     pointer to output buffer.
                    818: //
                    819: //   psfx:
                    820: //     PS_FIX number.
                    821: //
                    822: // Returns:
                    823: //   This function returns number of BYTES written to pbuffer.
                    824: //
                    825: // History:
                    826: //   07-May-1993     -by-     Kent Settle     (kentse)
                    827: // broke out of PrintPSFIX.
                    828: //--------------------------------------------------------------------------
                    829: 
                    830: DWORD PSFIXToBuffer(pbuffer, psfx)
                    831: CHAR       *pbuffer;
                    832: PS_FIX      psfx;
                    833: {
                    834:     DWORD       cb;
                    835:     BOOL        bNegative;
                    836:     LONG        lNum;
                    837:     PSZ         pszFrac;
                    838: 
                    839:     // handle negative numbers.
                    840: 
                    841:     bNegative = FALSE;
                    842: 
                    843:     if (psfx < 0)
                    844:     {
                    845:         psfx *= -1;
                    846:         *pbuffer++ = '-';
                    847:         bNegative = TRUE;
                    848:     }
                    849: 
                    850:     // grab the integer portion of the number, convert it to ASCII
                    851:     // and put it into the output buffer.
                    852: 
                    853:     lNum = PSFXTOL(psfx);
                    854:     itoa(lNum, pbuffer, 10);
                    855: 
                    856:     // how many characters, excluding the NULL terminator, did we place
                    857:     // into the output buffer.
                    858: 
                    859:     if (bNegative)
                    860:         pbuffer--;
                    861:     cb = strlen(pbuffer);
                    862: 
                    863:     // update the buffer pointer.
                    864: 
                    865:     pbuffer += cb;
                    866: 
                    867:     // now see if we have a fractional portion of the number to
                    868:     // worry about.
                    869: 
                    870:     lNum = (psfx & PS_FIX_MASK);
                    871:     pszFrac = Fracs[lNum];
                    872: 
                    873:     // output a decimal point if we have a non-zero fraction, otherwise
                    874:     // output the trailing space.
                    875: 
                    876:     if (*pszFrac)
                    877:         *pbuffer++ = '.';   // overwrites NULL terminator from itoa.
                    878:     else
                    879:         return(cb);         // we are done.
                    880: 
                    881:     // account for the decimal point.
                    882: 
                    883:     cb++;
                    884: 
                    885:     // output the fractional portion number of the if there is one.
                    886: 
                    887:     // copy the fractional number to the output buffer.
                    888: 
                    889:     strcpy(pbuffer, pszFrac);
                    890: 
                    891:     // how many characters, excluding the NULL terminator, did we place
                    892:     // into the output buffer.
                    893: 
                    894:     cb += strlen(pszFrac);
                    895: 
                    896:     return(cb);
                    897: }

unix.superglobalmegacorp.com

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