home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource1 / chint / useful31.hnt < prev    next >
Text File  |  1993-11-01  |  7KB  |  158 lines

  1. This hint outlines how to modify the standard report skeleton to allow
  2. reports to the "CON" device, (the screen), to use ASNI escape sequences
  3. thus adding a bit of color to the report.
  4.  
  5. NOTE THAT TO BE ABLE TO USE ANSI ESCAPE CODE YOU MUST HAVE ANSI.SYS LOADED!
  6.  
  7.  
  8. To build these improvements in as seemlessly as possible we will look for
  9. the "Screen Printer Definition" in a file of a different name the that
  10. usually used, (ANSIPRT.DEF rather than DBPRINT.DEF).  This way it won't be
  11. necessary to keep running the printer installation every time you want to
  12. swap printing a report to/from the screen and some other device, (printer
  13. or disk file).
  14.  
  15. 1) Copy the standard report skeleton, (DBCREP.SKL), to a new file where we
  16.    can feel safe making the changes, (DBCREPA.SKL).
  17.  
  18.    COPY DBCREP.SKL DBCREPA.SKL
  19.  
  20.  
  21. 2) Now to make some modifications to our new skeleton.  First we need to
  22.    introduce another intiialized string at the top of the skeleton, this is
  23.    the name of the printer definition file if the output device is "CON".
  24.    We'll add this directly after the standard printer definitino file name...
  25.  
  26.    STRING   PRT_DEFN_NAME   = "DBPRINT.DEF";
  27.    STRING   CON_DEFN_NAME   = "ANSIPRT.DEF";  /* <-- Add this line */
  28.  
  29.  
  30. 3) The next change is to the "getPrinterCodes()" function.  Currently this
  31.    function automatically returns null/empty printer escape sequences if the
  32.    output device in "CON", (so that normal printer codes don't end up all
  33.    over the screen).
  34.  
  35.    Modify the line
  36.  
  37.      if (!strstr(iodev, "CON") && !strstr(iodev, "DSK")) {
  38.  
  39.    To
  40.  
  41.      if (!strstr(iodev, "DSK")) {
  42.  
  43.  
  44. 4) In a similar manner the "outputLine" function does not attempt to process
  45.    printer codes if the output device in the "CON".  In this case we can
  46.    remove then opening "if.. else { " clause and it's associated "}"
  47.  
  48.    There is also another small alteration in the "outputLine" function, this
  49.    is the swapping of the lines :--
  50.  
  51.        outputPrinterCodes(strip(tempString1, printerCodePtr->on), 1);
  52.        outputPrinterCodes(strip(tempString1, printerCodePtr->off), 0);
  53.  
  54.     In the modified exert below these are swapped so that "OFF" codes are
  55.     processed before "ON" codes, it is important to do this because the
  56.     different "color" codes are not "additive".
  57.  
  58.  
  59. void outputLine(PAGELINE aLine)
  60. {
  61.    BYTE     lastCodePos;
  62.    PCODEPTR printerCodePtr;
  63.    STRING   tempString1, tempString2, tempString3;
  64.  
  65.    *tempString1 = *tempString2 = *tempString3 = NULL_CH;
  66. /*
  67.    if (strstr(iodev, "CON") && !pabort) chkwrite(outputFileHandle, strcopy(tempString1, aLine.line, 0, 79), ad_crlf);
  68.    else {
  69. */  /* MOD ANSIPRT remove the above test */
  70.       lastCodePos    = 0;
  71.       printerCodePtr = aLine.pcodes;
  72.       while (printerCodePtr)  {
  73.          if (!pabort) chkwrite(outputFileHandle, filterstr(tempString2, linebit(tempString1, aLine.line, lastCodePos, printerCodePtr->xpos - 1), pmode), no_crlf);
  74.          lastCodePos    = printerCodePtr->xpos;
  75.          outputPrinterCodes(strip(tempString1, printerCodePtr->off), 0);
  76. /*MOD ANSIPRT */ /* remember to move "off" up above "on" */
  77.          outputPrinterCodes(strip(tempString1, printerCodePtr->on), 1);
  78.          printerCodePtr = printerCodePtr->nxtp;
  79.       }
  80.       if (!pabort) chkwrite(outputFileHandle, filterstr(tempString3, trim(tempString1, linebit(tempString2, aLine.line, lastCodePos, strlen(aLine.line) - 1)), pmode), ad_crlf);
  81. /* } */ /* MOD ANSIPRT */
  82.    return;
  83. }
  84.  
  85.  
  86. 5) The final change to make is in the "readPrinterCodesFile()" function.
  87.    Here we just need to test the output device, and if it is the "CON" then
  88.    read the printer codes from "ANSIPRT.DEF" instead of "DBPRINT.DEF".  As
  89.    both the file names are defined as initialized strings use the local
  90.    "tempString" to store the name depending on the device name :--
  91.  
  92. void readPrinterCodesFile(void)
  93. {
  94.    uchar      codeslen;
  95.    FILE      *printerCodesFile;                        /* file of STYLEREC */
  96.    STYLEREC   printerCodesRecord;
  97.    PRTCTRLREC startLinkListPtr, nextLinkListPtr;
  98.    STRING     tempString;
  99.  
  100.    startLinkListPtr = NULL;
  101.  
  102. /* START MOD ANSIPRT */
  103.    if (strstr(iodev, "CON"))                 /* Test output device         */
  104.      strcpy(tempString,CON_DEFN_NAME);       /* this one for "CON"         */
  105.    else                                      /* otherwise                  */
  106.      strcpy(tempString,PRT_DEFN_NAME);       /* use the usual one          */
  107.    printerCodesFile = fopen(tempString,"rb");/* Open name in tempString    */
  108.    if (!printerCodesFile)                    /* May need to look elsewhere */
  109.      printerCodesFile = fopen(strconcat(tempString, thisprog.fdir, tempString,NULL), "rb");
  110. /* END MOD ANSIPRT */
  111.  
  112.    if (printerCodesFile) {
  113.    ...
  114.  
  115.  
  116. 6) With all the above changes made you simply need to change the skeleton
  117.    name when you "GENERATE" the report from DBCREP.SKL to DBCREPA.SKL, and
  118.    all the changes will end up in the final program.
  119.  
  120. 7) The last step is to create the "ANSIPRT.DEF" printer definition file.  To
  121.    do this run the "Printer Installation" utility and "A"dd a new printer,
  122.    (let's call it  "ANSI Console").
  123.  
  124.    Press the "+" key to swap to the control codes screen and add in the
  125.    codes you want to use.  Here is a simple example of some escape sequences
  126.    that you could use.
  127.  
  128.    ID   Description              ON                    OFF
  129.    ---  ---------------  --------------------  --------------------
  130.     N   Normal           ESC,'[0;37;40m'       ESC,'[0;37;40m'
  131.     C   Compressed       ESC,'[1;37;40m'       ESC,'[0;37;40m'
  132.     R   Reset            ESC,'[0;37;40m'       ESC,'[0;37;40m'
  133.     B   Bold             ESC,'[1;33;40m'       ESC,'[0;37;40m'
  134.     E   Enhanced         ESC,'[1;31;40m'       ESC,'[0;37;40m'
  135.  
  136.    Finally press "-" to get back to the first screen and "Select" the new
  137.    printer definition, change the anem from "DBPRINT.DEF" to "ANSIPRT.DEF"
  138.    and that just about does it.
  139.  
  140.  
  141. SOME ANSI ATTRIBUTES/COLORS
  142. ===========================
  143.   0 - All attribures off
  144.   1 - High Intensity Foreground
  145.   4 - Underscore, (Monochrome display cards only)
  146.   5 - Blinking Background
  147.   7 - Reverse video
  148.   8 - Concealed
  149.  
  150.   30 - Black Foreground         40 - Black Background
  151.   31 - Red Foreground           41 - Red Background
  152.   32 - Green Foreground         42 - Green Background
  153.   33 - Yellow Foreground        43 - Yellow Background
  154.   34 - Blue Foreground          44 - Blue Background
  155.   35 - Magents Foreground       45 - Magents Background
  156.   36 - Cyan Foreground          46 - Cyan Background
  157.   37 - White Foreground         47 - White Background
  158.