home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 186_01 / fxpr22.c < prev    next >
Text File  |  1985-08-21  |  16KB  |  694 lines

  1. /*
  2. 04/08/83
  3. FXPR2.C (ver 2) EPSON FX-80 printer utility by Thomas E. McCormick derived
  4. from PRINTER.C for the Espon MX printers by Gary P. Novosielski (c) 1982.
  5.  
  6. Requires only BDSCIO.H in addition to this FXPR.C source to compile.
  7.  
  8. ************************************************************************
  9. 05/09/85 Two small changes have been made to enable compilation under
  10.      BDS C ver. 1.50a.        R. W. Odlin
  11. ************************************************************************
  12.  
  13. FXPR2.DOC documentation file explains the options more thoroughly.
  14.  
  15. DEN1  DEN2  DEN4  MX-80/100 features from PRINTER.C have been removed.
  16.  
  17. There are more than 50 keyword options, and God knows how many combinations.
  18. They have NOT all been tested !!  Be aware that the FX-80 treats various
  19. combinations differently than "you thought".  The features have priorities
  20. with regard to others, and some negate others.    The 150+ page manual has
  21. several tables that will help, but you will have to experiment a little too.
  22.  
  23. It is a good idea to use RESET as your first keyword to "baseline" the
  24. subsequent commands.  If you don't, you will be asking "why it behaves
  25. differently even though the same command is entered". For example, some
  26. of the features are "toggles"; the condition will remain set until unset 
  27. with the same command. Other features require a specific reset command.
  28. The "RESET" command mentioned above will reset ALL modes to the power-on
  29. configuration you have chosen via the DIP switches at installation.
  30.  
  31. Look for FXPARMS.BAS MBASIC source file.  It contains many of the examples
  32. from the FX-80 Operation Manual, and allows you to fiddle with them and
  33. print them immediately to fine tune.
  34.  
  35. Fifteen unduplicated print modes/pitches have been added with the
  36. ESCAPE;"!";CHR$(n) commands where n = 0 to 63.    These are the
  37. P5, P5B, P10VB, etc commands setting pitch and intensity at once.
  38.  
  39. All rights reserved.
  40. Permission is hereby granted for unrestricted non-commercial
  41. use.  Any use for commercial advantage without prior written
  42. consent of the author (G.P.N.) is prohibited.
  43.  
  44. This public domain program compiles under BDS C ver 1.44 or 1.5.
  45. As of March, 1983, you should use 1.44 if you want to apply NOBOOT2
  46. to the FXPR2.COM file since NOBOOT2 does NOT work if compiled with
  47. BDS C  ver 1.5.
  48.  
  49. To Recompile with 1.44 and apply NOBOOT2:
  50.  
  51.     A>CC1 FXPR2.C
  52.  
  53.     A>CLINK FXPR2
  54.  
  55.     A>NOBOOT2 FXPR2.COM
  56.  
  57.  
  58. */
  59.  
  60. #include <bdscio.h>    /* brackets instead of quotes, so that 1.50a looks for
  61.                header file on the default drive */
  62.  
  63. /*    Return code definitions   */
  64. #define RESET    1
  65. #define PITCH    2
  66. #define LPI    3
  67. #define DRAFT    4
  68. #define TEXT    5
  69. #define EJECT    6
  70. #define TINY    7
  71. #define TABS    8
  72. #define SKIP    9
  73. #define NOSKIP    10
  74. #define WIDTH    11
  75. #define ITALIC    12
  76. #define ROMAN    13
  77. #define PROPOR    14
  78. #define LTRITA    15
  79. #define LTRITB    16
  80. #define LTRELI    17
  81. #define EMPHAS    18
  82. #define ELITE    19
  83. #define PICA    20
  84. #define QUIET    21
  85. #define ENLARG    22
  86. #define CONDEN    23
  87. #define P5    24
  88. #define P5B    25
  89. #define P5VB    26
  90. #define P6    27
  91. #define P6B    28
  92. #define P6VB    29
  93. #define P9B    30
  94. #define P9VB    31
  95. #define P10    32
  96. #define P10B    33
  97. #define P10VB    34
  98. #define P12    35
  99. #define P12B    36
  100. #define P17    37
  101. #define P17B    38
  102. #define LPI10    39
  103. #define TINYER    40
  104. #define LEFTM    41
  105. #define RIGHTM    42
  106. #define LPI3    43
  107. #define LPI6    44
  108. #define LPI8    45
  109. #define LPI12    46
  110. #define PLINCH    47
  111. #define DOUBLE    48
  112. #define XDOUBL    49
  113. #define XEMPHA    50
  114. #define LPI4    51
  115. #define LPI5    52
  116. #define XENLAR    53
  117. #define XCONDE    54
  118.  
  119. #define LST    5    /* Bdos function for list output */
  120.  
  121. #define ESC    27    /* This equate needed to compile under BDS ver. 1.50a,
  122.                as the def. has been moved in this version from 
  123.                BDSCIO.H to HARDWARE.H */
  124.  
  125. main(argc, argv)
  126. int  argc;
  127. char **argv;
  128. {
  129.     int  value, oldvalue;
  130.     char xlate();
  131.  
  132.     if (argc < 2)
  133.     {
  134.     puts("FXPR2 (ver 2).......by Tom McCormick  04/08/83\n");
  135.     puts("      from PRINTER.C (c) 1982 G.P. Novosielski\n");
  136.     puts("FXPR2 <opt> [<opt>.....]   where <opt> may be:\n");
  137.     puts("                                              \n");
  138.     puts("RESET      QUIET       PITCH 10    PITCH 17   \n");
  139.     puts("LPI3       LPI4        LPI5        LPI6       \n");
  140.     puts("LPI8       LPI10       LPI12       PLINCH 1-22\n");
  141.     puts("WIDTH 80 [... or any value between 2 and 137 ]\n");
  142.     puts("SKIP       NOSKIP      EJECT       TABS n n n \n");
  143.     puts("PROPOR     DRAFT       TEXT                   \n");
  144.     puts("PICA       ELITE       ITALIC      LEFTM  n   \n");
  145.     puts("TINY       TINYER      ROMAN       RIGHTM n   \n");
  146.     puts("LTRITA     LTRITB      LTRELI                 \n");
  147.     puts("EMPHAS     CONDEN      ENLARG      DOUBLE     \n");
  148.     puts("XEMPHA     XCONDE      XENLAR      XDOUBL     \n");
  149.     puts("Various pitches (CPI) and bold or very bold...\n");
  150.     puts(" P5     P6            P10     P12     P17     \n");
  151.     puts(" P5B    P6B    P9B    P10B    P12B    P17B    \n");
  152.     puts(" P5VB   P6VB   P9VB   P10VB                   \n");
  153.     puts("                                              \n");
  154.     puts("\n  Example: FXPR2 RESET LPI6 PITCH 10 ELITE  \n");
  155.     exit();
  156.     }
  157.  
  158.     while (--argc > 0)
  159.     {
  160.     switch (xlate(*++argv))
  161.     {
  162.     case RESET:
  163.         bdos(LST,ESC);
  164.         bdos(LST,'@');
  165.         bdos(LST,ESC);
  166.         bdos(LST,'C');
  167.         bdos(LST,0);
  168.         bdos(LST,11);
  169.         break;
  170.     case PITCH:
  171.         value = atoi((--argc,*++argv));
  172.         if (value == 10)
  173.         bdos(LST,18);
  174.         else if (value == 17)
  175.         bdos(LST,15);
  176.         else
  177.         abort ("%s--Invalid pitch.  Not 10 or 17.",*argv);
  178.         break;
  179.     case LPI:
  180.         if (!(value = atoi((--argc,*++argv))) || value > 216)
  181.         abort ("%s--Invalid Lines per Inch\nMust be 1 - 216.",*argv);
  182.         bdos(LST,ESC);
  183.         bdos(LST,'3');
  184.         bdos(LST,216/value);
  185.         break;
  186.     case DRAFT:
  187.         bdos(LST,ESC);
  188.         bdos(LST,'H');
  189.         bdos(LST,ESC);
  190.         bdos(LST,'T');
  191.         break;
  192.     case TEXT:
  193.         bdos(LST,ESC);
  194.         bdos(LST,'G');
  195.         bdos(LST,ESC);
  196.         bdos(LST,'U');
  197.         bdos(LST,1);
  198.         break;
  199.     case EJECT:
  200.         bdos(LST,12);
  201.         break;
  202.     case TINY:
  203.         bdos(LST,ESC);
  204.         bdos(LST,'S');
  205.         bdos(LST,0);
  206.         bdos(LST,ESC);
  207.         bdos(LST,'1');
  208.         bdos(LST,ESC);
  209.         bdos(LST,'C');
  210.         bdos(LST,110);
  211.         bdos(LST,ESC);
  212.         bdos(LST,'N');
  213.         bdos(LST,20);
  214.         break;
  215.     case TABS:
  216.         oldvalue = 0;
  217.         bdos(LST,ESC);
  218.         bdos(LST,'D');
  219.         while(--argc)
  220.         {
  221.         value = atoi(*++argv);
  222.         if(value && value <= oldvalue)
  223.         {
  224.             bdos(LST,0);
  225.             abort("Tabs not in increasing order");
  226.         }
  227.         if (!value)
  228.             --argv, ++argc;
  229.         else
  230.             bdos(LST,(oldvalue = value));
  231.         }
  232.         bdos(LST,0);
  233.         break;
  234.     case SKIP:
  235.         bdos(LST,ESC);
  236.         bdos(LST,'N');
  237.         bdos(LST,6);
  238.         break;
  239.     case NOSKIP:
  240.         bdos(LST,ESC);
  241.         bdos(LST,'N');
  242.         bdos(LST,0);
  243.         break;
  244.     case WIDTH:
  245.         if (!(--argc))
  246.         break;
  247.         if (!(value = atoi(*++argv)))
  248.         abort("%s--Invalid width.",*argv);
  249.         bdos(LST,ESC);
  250.         bdos(LST,'Q');
  251.         bdos(LST,value);
  252.         break;
  253.     case ITALIC:
  254.         bdos(LST,ESC);
  255.         bdos(LST,'4');
  256.         break;
  257.     case ROMAN:
  258.         bdos(LST,ESC);
  259.         bdos(LST,'5');
  260.         break;
  261.      case PROPOR:
  262.         bdos(LST,ESC);
  263.         bdos(LST,'p');
  264.         bdos(LST,1);
  265.         break;
  266.     case LTRITA:
  267.         bdos(LST,ESC);
  268.         bdos(LST,'@');
  269.         bdos(LST,ESC);
  270.         bdos(LST,'C');
  271.         bdos(LST,ESC);
  272.         bdos(LST,0);
  273.         bdos(LST,11);
  274.  
  275.         bdos(LST,ESC);
  276.         bdos(LST,'4');
  277.  
  278.         bdos(LST,ESC);
  279.         bdos(LST,'!');
  280.         bdos(LST,3);
  281.  
  282.         bdos(LST,ESC);
  283.         bdos(LST,'Q');
  284.         bdos(LST,132);
  285.         break;
  286.  
  287.     case LTRITB:
  288.  
  289.         bdos(LST,ESC);
  290.         bdos(LST,'@');
  291.         bdos(LST,ESC);
  292.         bdos(LST,'C');
  293.         bdos(LST,ESC);
  294.         bdos(LST,0);
  295.         bdos(LST,11);
  296.  
  297.         bdos(LST,ESC);
  298.         bdos(LST,'4');
  299.  
  300.         bdos(LST,ESC);
  301.         bdos(LST,'!');
  302.         bdos(LST,17);
  303.  
  304.         bdos(LST,ESC);
  305.         bdos(LST,'Q');
  306.         bdos(LST,132);
  307.         break;
  308.  
  309.     case LTRELI:
  310.         bdos(LST,ESC);
  311.         bdos(LST,'@');
  312.         bdos(LST,ESC);
  313.         bdos(LST,'C');
  314.         bdos(LST,ESC);
  315.         bdos(LST,0);
  316.         bdos(LST,11);
  317.  
  318.         bdos(LST,ESC);
  319.         bdos(LST,'5');
  320.         bdos(LST,'M');
  321.  
  322.         bdos(LST,ESC);
  323.         bdos(LST,'!');
  324.         bdos(LST,3);
  325.  
  326.         bdos(LST,ESC);
  327.         bdos(LST,'Q');
  328.         bdos(LST,132);
  329.         break;
  330.  
  331.      case EMPHAS:
  332.         bdos(LST,ESC);
  333.         bdos(LST,'E');
  334.         break;
  335.     case ELITE:
  336.         bdos(LST,ESC);
  337.         bdos(LST,'M');
  338.         break;
  339.     case PICA:
  340.         bdos(LST,ESC);
  341.         bdos(LST,'P');
  342.         break;
  343.     case QUIET:
  344.         bdos(LST,ESC);
  345.         bdos(LST,'s');
  346.         bdos(LST,1);
  347.         break;
  348.     case ENLARG:
  349.         bdos(LST,14);
  350.         break;
  351.     case CONDEN:
  352.         bdos(LST,15);
  353.         break;
  354.     case P5:
  355.         bdos(LST,ESC);
  356.         bdos(LST,'!');
  357.         bdos(LST,32);
  358.         break;
  359.        case P5B:
  360.         bdos(LST,ESC);
  361.         bdos(LST,'!');
  362.         bdos(LST,40);
  363.         break;
  364.        case P5VB:
  365.         bdos(LST,ESC);
  366.         bdos(LST,'!');
  367.         bdos(LST,62);
  368.         break;
  369.        case P6:
  370.         bdos(LST,ESC);
  371.         bdos(LST,'!');
  372.         bdos(LST,35);
  373.         break;
  374.        case P6B:
  375.         bdos(LST,ESC);
  376.         bdos(LST,'!');
  377.         bdos(LST,47);
  378.         break;
  379.        case P6VB:
  380.         bdos(LST,ESC);
  381.         bdos(LST,'!');
  382.         bdos(LST,63);
  383.         break;
  384.        case P9B:
  385.         bdos(LST,ESC);
  386.         bdos(LST,'!');
  387.         bdos(LST,36);
  388.         break;
  389.        case P9VB:
  390.         bdos(LST,ESC);
  391.         bdos(LST,'!');
  392.         bdos(LST,52);
  393.         break;
  394.     case P10:
  395.         bdos(LST,ESC);
  396.         bdos(LST,'!');
  397.         bdos(LST,2);
  398.         break;
  399.        case P10B:
  400.         bdos(LST,ESC);
  401.         bdos(LST,'!');
  402.         bdos(LST,8);
  403.         break;
  404.        case P10VB:
  405.         bdos(LST,ESC);
  406.         bdos(LST,'!');
  407.         bdos(LST,24);
  408.         break;
  409.        case P12:
  410.         bdos(LST,ESC);
  411.         bdos(LST,'!');
  412.         bdos(LST,3);
  413.         break;
  414.        case P12B:
  415.         bdos(LST,ESC);
  416.         bdos(LST,'!');
  417.         bdos(LST,17);
  418.         break;
  419.        case P17:
  420.         bdos(LST,ESC);
  421.         bdos(LST,'!');
  422.         bdos(LST,4);
  423.         break;
  424.        case P17B:
  425.         bdos(LST,ESC);
  426.         bdos(LST,'!');
  427.         bdos(LST,22);
  428.         break;
  429.     case LPI10:
  430.         bdos(LST,ESC);
  431.         bdos(LST,'1');
  432.         bdos(LST,ESC);
  433.         bdos(LST,'C');
  434.         bdos(LST,110);
  435.         bdos(LST,ESC);
  436.         bdos(LST,'N');
  437.         bdos(LST,20);
  438.         break;
  439.     case TINYER:
  440.         bdos(LST,ESC);
  441.         bdos(LST,'S');
  442.         bdos(LST,0);
  443.  
  444.         bdos(LST,ESC);
  445.         bdos(LST,'3');
  446.         bdos(LST,18);
  447.  
  448.         bdos(LST,ESC);
  449.         bdos(LST,'N');
  450.         bdos(LST,26);
  451.         break;
  452.     case LEFTM:
  453.         if (!(--argc))
  454.         break;
  455.         if (!(value = atoi(*++argv)))
  456.         abort("%s--Invalid width.",*argv);
  457.         bdos(LST,ESC);
  458.         bdos(LST,'l');
  459.         bdos(LST,value);
  460.         break;
  461.     case RIGHTM:
  462.         if (!(--argc))
  463.         break;
  464.         if (!(value = atoi(*++argv)))
  465.         abort("%s--Invalid width.",*argv);
  466.         bdos(LST,ESC);
  467.         bdos(LST,'Q');
  468.         bdos(LST,value);
  469.         break;
  470.  
  471.     case LPI3:
  472.         bdos(LST,ESC);
  473.         bdos(LST,'3');
  474.         bdos(LST,72);
  475.         bdos(LST,ESC);
  476.         bdos(LST,'C');
  477.         bdos(LST,33);
  478.         bdos(LST,ESC);
  479.         bdos(LST,'N');
  480.         bdos(LST,6);
  481.  
  482.     case LPI6:
  483.         bdos(LST,ESC);
  484.         bdos(LST,'2');
  485.         bdos(LST,ESC);
  486.         bdos(LST,'C');
  487.         bdos(LST,66);
  488.         bdos(LST,ESC);
  489.         bdos(LST,'N');
  490.         bdos(LST,12);
  491.         break;
  492.  
  493.     case LPI8:
  494.         bdos(LST,ESC);
  495.         bdos(LST,'0');
  496.         bdos(LST,ESC);
  497.         bdos(LST,'C');
  498.         bdos(LST,88);
  499.         bdos(LST,ESC);
  500.         bdos(LST,'N');
  501.         bdos(LST,16);
  502.         break;
  503.     case LPI12:
  504.         bdos(LST,ESC);
  505.         bdos(LST,'3');
  506.         bdos(LST,18);
  507.         bdos(LST,ESC);
  508.         bdos(LST,'C');
  509.         bdos(LST,126);
  510.         bdos(LST,ESC);
  511.         bdos(LST,'N');
  512.         bdos(LST,18);
  513.         break;
  514.     case PLINCH:
  515.         if (!(value = atoi((--argc,*++argv))) || value > 22)
  516.         abort ("%s--Page Length Inches\nMust be 1 - 22.",*argv);
  517.         bdos(LST,ESC);
  518.         bdos(LST,'C');
  519.         bdos(LST,'0');
  520.         bdos(LST,value);
  521.         break;
  522.     case DOUBLE:
  523.         bdos(LST,ESC);
  524.         bdos(LST,'G');
  525.         break;
  526.     case XDOUBL:
  527.         bdos(LST,ESC);
  528.         bdos(LST,'H');
  529.         break;
  530.     case XEMPHA:
  531.         bdos(LST,ESC);
  532.         bdos(LST,'F');
  533.         break;
  534.     case LPI4:
  535.         bdos(LST,ESC);
  536.         bdos(LST,'3');
  537.         bdos(LST,54);
  538.         bdos(LST,ESC);
  539.         bdos(LST,'C');
  540.         bdos(LST,44);
  541.         bdos(LST,ESC);
  542.         bdos(LST,'N');
  543.         bdos(LST,8);
  544.     case LPI5:
  545.         bdos(LST,ESC);
  546.         bdos(LST,'3');
  547.         bdos(LST,43);
  548.         bdos(LST,ESC);
  549.         bdos(LST,'C');
  550.         bdos(LST,55);
  551.         bdos(LST,ESC);
  552.         bdos(LST,'N');
  553.         bdos(LST,10);
  554.         break;
  555.     case XENLAR:
  556.         bdos(LST,20);
  557.         break;
  558.     case XCONDE:
  559.         bdos(LST,18);
  560.         break;
  561.  
  562.        default:
  563.         abort("%s--Unknown keyword.",*argv);
  564.     }
  565.     }  
  566. }
  567.  
  568. char xlate(string)
  569.   char *string;
  570. {
  571.     if (!strcmp(string,"RESET"))
  572.     return RESET;
  573.     else if (!strcmp(string,"PITCH"))
  574.     return PITCH;
  575.     else if (!strcmp(string,"LPI"))
  576.     return LPI;
  577.     else if (!strcmp(string,"DRAFT"))
  578.     return DRAFT;
  579.     else if (!strcmp(string,"TEXT"))
  580.     return TEXT;
  581.     else if (!strcmp(string,"EJECT"))
  582.     return EJECT;
  583.     else if (!strcmp(string,"TINY"))
  584.     return TINY;
  585.     else if (!strcmp(string,"TABS"))
  586.     return TABS;
  587.     else if (!strcmp(string,"TAB"))
  588.     return TABS;
  589.     else if (!strcmp(string,"SKIP"))
  590.     return SKIP;
  591.     else if (!strcmp(string,"NOSKIP"))
  592.     return NOSKIP;
  593.     else if (!strcmp(string,"WIDTH"))
  594.     return WIDTH;
  595.     else if (!strcmp(string,"ITALIC"))
  596.     return ITALIC;
  597.     else if (!strcmp(string,"ROMAN"))
  598.     return ROMAN;
  599.     else if (!strcmp(string,"PROPOR"))
  600.     return PROPOR;
  601.     else if (!strcmp(string,"LTRITA"))
  602.     return LTRITA;
  603.     else if (!strcmp(string,"LTRITB"))
  604.     return LTRITB;
  605.     else if (!strcmp(string,"LTRELI"))
  606.     return LTRELI;
  607.     else if (!strcmp(string,"ENLARG"))
  608.     return ENLARG;
  609.     else if (!strcmp(string,"ELITE"))
  610.     return ELITE;
  611.     else if (!strcmp(string,"PICA"))
  612.     return PICA;
  613.     else if (!strcmp(string,"QUIET"))
  614.     return QUIET;
  615.     else if (!strcmp(string,"EMPHAS"))
  616.     return EMPHAS;
  617.     else if (!strcmp(string,"CONDEN"))
  618.     return CONDEN;
  619.     else if (!strcmp(string,"P5"))
  620.     return P5;
  621.     else if (!strcmp(string,"P5B"))
  622.     return P5B;
  623.     else if (!strcmp(string,"P5VB"))
  624.     return P5VB;
  625.     else if (!strcmp(string,"P6"))
  626.     return P6;
  627.     else if (!strcmp(string,"P6B"))
  628.     return P6B;
  629.     else if (!strcmp(string,"P6VB"))
  630.     return P6VB;
  631.     else if (!strcmp(string,"P9B"))
  632.     return P9B;
  633.     else if (!strcmp(string,"P9VB"))
  634.     return P9VB;
  635.     else if (!strcmp(string,"P10"))
  636.     return P10;
  637.     else if (!strcmp(string,"P10B"))
  638.     return P10B;
  639.     else if (!strcmp(string,"P10VB"))
  640.     return P10VB;
  641.     else if (!strcmp(string,"P12"))
  642.     return P12;
  643.     else if (!strcmp(string,"P12B"))
  644.     return P12B;
  645.     else if (!strcmp(string,"P17"))
  646.     return P17;
  647.     else if (!strcmp(string,"P17B"))
  648.     return P17B;
  649.     else if (!strcmp(string,"LPI10"))
  650.     return LPI10;
  651.     else if (!strcmp(string,"TINYER"))
  652.     return TINYER;
  653.     else if (!strcmp(string,"LEFTM"))
  654.     return LEFTM;
  655.     else if (!strcmp(string,"RIGHTM"))
  656.     return RIGHTM;
  657.     else if (!strcmp(string,"LPI3"))
  658.     return LPI3;
  659.     else if (!strcmp(string,"LPI6"))
  660.     return LPI6;
  661.     else if (!strcmp(string,"LPI8"))
  662.     return LPI8;
  663.     else if (!strcmp(string,"LPI12"))
  664.     return LPI12;
  665.     else if (!strcmp(string,"PLINCH"))
  666.     return PLINCH;
  667.     else if (!strcmp(string,"DOUBLE"))
  668.     return DOUBLE;
  669.     else if (!strcmp(string,"XDOUBL"))
  670.     return XDOUBL;
  671.     else if (!strcmp(string,"XEMPHA"))
  672.     return XEMPHA;
  673.     else if (!strcmp(string,"LPI4"))
  674.     return LPI4;
  675.     else if (!strcmp(string,"LPI5"))
  676.     return LPI5;
  677.     else if (!strcmp(string,"XENLAR"))
  678.     return XENLAR;
  679.     else if (!strcmp(string,"XCONDE"))
  680.     return XCONDE;
  681.  
  682.     else
  683.     return ERROR;
  684. }
  685.  
  686. abort(p1,p2,p3,p4,p5,p6,p7,p8)
  687. unsigned p1,p2,p3,p4,p5,p6,p7,p8;
  688. {                         
  689.     printf(p1,p2,p3,p4,p5,p6,p7,p8);
  690.     unlink("A:$$$.SUB");
  691.     puts("...ABORTED");
  692.     exit();
  693. }
  694.