home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / australi / pscptclp.lzh / POSTSCPT.PRG < prev   
Text File  |  1989-11-12  |  13KB  |  466 lines

  1. PROCEDURE Post_scpt
  2. *
  3. * DOS-LEVEL POSTSCRIPT DRIVER - Clipper Version
  4. * ╒══════════════════════════════════════════════════════════════════════════╕
  5. * │ Written by G.C.Lesnie for PA Consulting Australia                        │
  6. * │                                                                          │
  7. * │ Any requests for improvement please refer back to:                       │
  8. * │    Greg Lesnie,                                                          │
  9. * │    9 Linigen Pl. St.Ives                                                 │
  10. * │    NSW. 2075. Australia.                                                 │
  11. * │    (061) 02 449-6556                                                     │
  12. * │                                                                          │
  13. * │ Similarly, if you make substantial improvements, please let me have      │
  14. * │    the revised source.                                                   │
  15. * │ Regards: Greg Lesnie, November 1989.                                     │
  16. * ╘══════════════════════════════════════════════════════════════════════════╛
  17. *
  18. * ╒══════════════════════════════════════════════════════════════════════════╕
  19. * │ The procedure outputs a preamble (postscript program) to the printer     │ 
  20. * │    or re-directed disk file.                                             │ 
  21. * │    It then takes a specified disk file, previously output by the clipper │ 
  22. * │    program and translates it into postscript compatible form, embedding  │ 
  23. * │    calls for underlining, pitch and font etc. Its a little bit slow,     │ 
  24. * │    but it does the job. There may be still some 'anomalous features'     │ 
  25. * │    i.e. bugs because we ditched the development in favour of the         │ 
  26. * │    QuickBasic version due to the inferior speed of Clipper vs QuickBasic │ 
  27. * │                                                                          │ 
  28. * │    POST_SCPT emulates a limited subset of EPSON commands, selecting      │ 
  29. * │    COURIER Regular, with 10 pitch, 12 pitch, compressed, underline       │ 
  30. * │    originally compiled with QuickBasic 4.5, which runs 3 times as fast   │ 
  31. * │    The conversion exercise, using Brief as the editor, took 2 hours, so  │ 
  32. * │    if you're interested in language conversion QB4 to Clipper, take note.│ 
  33. * ╘══════════════════════════════════════════════════════════════════════════╛
  34.  
  35.  
  36. PARAMETERS File_Name, Out_File, New_Point, New_Margin
  37.  
  38. * ════════════════════════════════════════════════════════════════════════════
  39. *     Call post_scpt with parameters
  40. *     -  Parameter Type Contents
  41. *     -  File_name  C   Input Text file to be printed in postscript
  42. *     -  Out_file   C   Optional Redirected output file
  43. *     -  New_Point  C   Optional Initial Point Size - default is "10";
  44. *                       Recognised sizes are "12", "10", "8", "7", "6", "5"
  45. *     -  New_Margin C   Optional Left Margin. Default "350" = 1/2 inch
  46. *     e.g.
  47. *     DO post_scpt with "inputfil.txt"
  48. *     DO post_scpt with "inputfil.txt",,"8","700"
  49. *     DO post_scpt with "inputfil.txt","outputfl.prn","8","700"
  50. * ════════════════════════════════════════════════════════════════════════════
  51.  
  52.    save screen
  53.    @ 23,00
  54.    @ 24,00
  55.    params = PCOUNT() 
  56.    IF params <= 0
  57.       return
  58.    endif
  59.  
  60.    if params > 1
  61.       Output_fil = Out_File
  62.    else
  63.       Output_fil = ''
  64.    endif
  65.  
  66.    if params > 2
  67.       newpoint = new_point
  68.    else
  69.       newpoint = ''
  70.    endif
  71.  
  72.    if params > 3
  73.       newmargin = new_margin
  74.    else
  75.       newmargin = ''
  76.    endif
  77.    @ 23,00 say "Input file "+file_name
  78.    Text_file = FOPEN(file_name,0)
  79.    Eof_Text = .F.
  80.    IF text_file < 0
  81.       RETURN
  82.    END 
  83.    @ 23,12+len(file_name) say "Handle"+str(text_file,4)
  84.    RESTORE from postscpt additive
  85.    if "" <> Output_fil
  86.       set printer to &Output_fil
  87.    endif
  88.    set print on
  89.    set console off
  90.  
  91. * Movements
  92.    TopMargin = " 13000"
  93.    NTopMargin = VAL(TopMargin)
  94.    NLeftMargin = 350
  95.    LeftMargin = STR(NLeftMargin, 4)
  96.  
  97.    LineSpace = -192
  98.    MaxLines = 62
  99.    Uline_Begin = "_U "
  100.    Uline_End = "_u "
  101.    Courier_Reg = "/CourierR"
  102.    Courier_Bold = "/Courier-BoldR"
  103.    Point_12 = " 600 _ff"
  104.    Point_10 = " 500 _ff"
  105.    Point_8 = " 400 _ff"
  106.    Point_7 = " 350 _ff"
  107.    Point_6 = " 300 _ff"
  108.    
  109. * Input Filters
  110.  
  111.    Compress = CHR(15)
  112.    Crlf  = CHR(13) + CHR(10)
  113.    Eoj   = CHR(4)
  114.    Tb    = CHR(9)
  115.    Lf    = CHR(10)
  116.    Ff    = CHR(12)
  117.    Cr    = CHR(13)
  118.    So    = CHR(14)
  119.    Nrml  = CHR(18)
  120.    Dc4   = CHR(20)
  121.    Esc   = CHR(27)
  122.    Fs    = CHR(28)
  123.  
  124.    InitPoint = 10
  125.    CInitPoint = Point_10
  126.  
  127.    IF NewPoint = "10"
  128.        InitPoint = 10
  129.        CInitPoint = Point_10
  130.        LineSpace = -200
  131.        MaxLines = 62
  132.    ELSEIF NewPoint = "12"
  133.        InitPoint = 12
  134.        CInitPoint = Point_12
  135.        LineSpace = -208
  136.        MaxLines = 58
  137.    ELSEIF NewPoint = "8"
  138.        InitPoint = 8
  139.        CInitPoint = Point_8
  140.        LineSpace = -200
  141.        MaxLines = 62
  142.    ELSEIF NewPoint = "7"
  143.        InitPoint = 7
  144.        CInitPoint = Point_7
  145.        LineSpace = -200
  146.        MaxLines = 62
  147.    ELSEIF NewPoint = "6"
  148.        InitPoint = 6
  149.        CInitPoint = Point_6
  150.        LineSpace = -200
  151.        MaxLines = 62
  152.    ENDIF
  153.  
  154.    NMargin = val(NewMargin)
  155.    IF NMargin > 3 .and. NMargin <= 18
  156.        NLeftMargin = 100 * NMargin
  157.        LeftMargin = STR(LeftMargin, 4)
  158.    END IF
  159.    
  160.    Vertical = NTopMargin
  161.    LineCount = MaxLines
  162.    CurrentFont = Courier_Reg
  163.    PointSize = InitPoint
  164.    CPointSize = CInitPoint
  165.    EmptyPage = .T.
  166.    TEXT = ""
  167.    Next_char = ""
  168.    This_Char = ""
  169.    pages = 1
  170.    char_count = 0
  171.    line_total = 0
  172.    do preamble
  173.    DO WHILE .NOT. eof_text
  174.        IF "" = Next_Char
  175.            Next_Char = Read_char()
  176.            LOOP
  177.        ENDIF
  178.        This_Char = Next_Char
  179.        Next_Char = Read_char()
  180.        DO CASE
  181.        CASE This_Char $ "(\)" 
  182.            TEXT = TEXT + "\" + This_Char
  183.  
  184.        CASE This_Char >= " " 
  185.            TEXT = TEXT + This_Char
  186.  
  187.        CASE This_Char = Cr .and. Next_Char = Lf
  188.            This_Char = ""
  189.            * Discard so following Linefeed takes effect
  190.  
  191.        CASE This_Char = Cr
  192.            DO Carriage
  193.  
  194.        CASE This_Char = Lf
  195.            DO EndofLine
  196.  
  197.        CASE This_Char = Ff
  198.            DO FormFeed
  199.  
  200.        CASE This_Char = Compress
  201.            DO CondFound
  202.  
  203.        CASE This_Char = Dc4
  204.            DO EnlargOff
  205.  
  206.        CASE This_Char = EOJ
  207.            * DO EndofJob?
  208.            This_Char = ""
  209.  
  210.        CASE This_Char = Esc
  211.            DO EscFound
  212.  
  213.        CASE This_Char = Fs
  214.            DO FsFound
  215.  
  216.        CASE This_Char = Nrml
  217.            DO NrmlFound
  218.  
  219.        CASE This_Char = So
  220.            DO EnlargOff
  221.  
  222.        CASE "" = This_Char
  223.            EXIT         
  224.            * Should be impossible ??
  225.  
  226.        OTHERWISE
  227.            This_Char = ""
  228.            * Discard if not printable?
  229.  
  230.        ENDCASE
  231.    ENDDO
  232.  
  233.    DO EndJob
  234.    FCLOSE(TEXT_FILE)
  235.    restore screen
  236.  
  237.    RETURN
  238.  
  239. PROCEDURE FlushText
  240.         IF "" <> TEXT
  241.             ? "("+TEXT+ ")_S "
  242.             EmptyPage = .F.
  243.             TEXT = ""
  244.         ENDIF
  245.         RETURN
  246.  
  247. PROCEDURE FormFeed
  248.         DO FlushText
  249.         This_Char = ""
  250.         DO EndPage
  251.         DO StartPage
  252.         RETURN
  253.  
  254. PROCEDURE EscFound
  255.         DO FlushText
  256.         EscCmd = Next_Char
  257.         This_Char = ""
  258.         Next_Char = ""
  259.         InsertCmd = ""
  260.         IF EscCmd $ "!/3ACJNQRSUijlps%I"
  261.             EscOprnd = read_char()
  262.             RETURN
  263.         ENDIF
  264.  
  265.         IF EscCmd $ "?"
  266.             EscOprnd = read_char()
  267.             EscOprnd = read_char()
  268.             RETURN
  269.         ENDIF
  270.  
  271.         IF EscCmd $ ":"
  272.             EscOprnd = read_char()
  273.             EscOprnd = read_char()
  274.             EscOprnd = read_char()
  275.             RETURN
  276.         ENDIF
  277.  
  278.  
  279.         IF EscCmd $ "BbD%"
  280.             EscOprnd = read_char()
  281.             DO WHILE EscOprnd <> CHR(0) .and. EscOprnd <> ""
  282.                 EscOprnd = read_char()
  283.             ENDDO
  284.             RETURN
  285.         ENDIF
  286.  
  287.         IF EscCmd $ "&KLY*^"
  288.             RETURN
  289.         ENDIF
  290.  
  291.         IF EscCmd = "-"
  292.             EscOprnd = read_char()
  293.             Uline = ASC(EscOprnd + CHR(0))
  294.             IF Uline = 0 .OR. Uline = 48
  295.                 InsertCmd = " _u "
  296.             ENDIF
  297.             IF Uline = 1 .OR. Uline = 49
  298.                 InsertCmd = " _U "
  299.             ENDIF
  300.         ELSEIF EscCmd = "W"
  301.             EscOprnd = read_char()
  302.             Enlarge = ASC(EscOprnd + CHR(0))
  303.             IF Enlarge = 0 .OR. Enlarge = 48
  304.                 InsertCmd = " " + CurrentFont + CPointSize
  305.             ENDIF
  306.             IF Enlarge = 1 .OR. Enlarge = 49
  307.                 InsertCmd = " " + Courier_Bold + CPointSize
  308.             ELSE
  309.                 Enlarge = 0
  310.             ENDIF
  311.  
  312.         ELSEIF EscCmd = "E" .OR. EscCmd = "G" .OR. EscCmd = CHR(14)
  313.             InsertCmd = " " + Courier_Bold + CPointSize
  314.         ELSEIF EscCmd = "F" .OR. EscCmd = "H"
  315.             InsertCmd = " " + CurrentFont + CPointSize
  316.         ELSEIF EscCmd = "M"
  317.             * 10 point
  318.             PointSize = 10
  319.             CPointSize = Point_10
  320.             InsertCmd = " " + CurrentFont + CPointSize
  321.         ELSEIF EscCmd = "P"
  322.             * 12 point
  323.             PointSize = 12
  324.             CPointSize = Point_12
  325.             InsertCmd = " " + CurrentFont + CPointSize
  326.         ELSE
  327.             InsertCmd = ""
  328.         ENDIF
  329.         IF "" <> InsertCmd
  330.             ? InsertCmd
  331.         endif
  332.         RETURN
  333.  
  334. PROCEDURE FsFound
  335.         DO FlushText
  336.         This_Char = ""
  337.         Next_Char = ""
  338.         RETURN
  339.  
  340. PROCEDURE EnlargOff
  341.         DO FlushText
  342.         This_Char = ""
  343.         IF Enlarge
  344.            InsertCmd = " " + CurrentFont + CPointSize
  345.            Enlarge = 0
  346.            ? InsertCmd
  347.         ELSE
  348.            RETURN
  349.         ENDIF
  350.  
  351.         RETURN
  352.  
  353. PROCEDURE Carriage
  354.         DO FlushText
  355.         This_Char = ""
  356.         ? LeftMargin + " " + STR(Vertical)+ " _m"
  357.         * Reposition at start of Line
  358.         RETURN
  359.  
  360. PROCEDURE CondFound
  361.         DO FlushText
  362.         This_Char = ""
  363.         IF PointSize = 10
  364.             PointSize = 6
  365.             CPointSize = Point_6
  366.             InsertCmd = " " + CurrentFont + CPointSize
  367.             ? InsertCmd
  368.         ELSEIF PointSize = 12
  369.             PointSize = 8
  370.             CPointSize = Point_8
  371.             InsertCmd = " " + CurrentFont + CPointSize
  372.             ? InsertCmd
  373.         ENDIF
  374.  
  375.         RETURN
  376.  
  377. PROCEDURE NrmlFound
  378.         DO FlushText
  379.         This_Char = ""
  380.         IF PointSize = 8
  381.             PointSize = 12
  382.             CPointSize = Point_12
  383.             InsertCmd = " " + CurrentFont + CPointSize
  384.             ? InsertCmd
  385.         ELSEIF PointSize = 6
  386.             PointSize = 10
  387.             CPointSize = Point_10
  388.             InsertCmd = " " + CurrentFont + CPointSize
  389.             ? InsertCmd
  390.         ENDIF
  391.  
  392.         RETURN
  393.  
  394. PROCEDURE StartPage
  395.         ? "_bp "+ CurrentFont+ CPointSize
  396.         ? "0 14032 9922 _ornt "+ LeftMargin + TopMargin+" _m"
  397.         EmptyPage = .T.
  398.         Vertical = NTopMargin
  399.         LineCount = MaxLines
  400.         Pages = Pages + 1
  401.         @ 24,40 SAY Pages PICTURE "999"
  402.         RETURN
  403.  
  404. PROCEDURE EndofLine
  405.         line_total = line_total + 1
  406.         @ 24,58 SAY char_count PICTURE "999999"
  407.         @ 24,72 SAY line_total PICTURE "999999"
  408.         DO FlushText
  409.         LineCount = LineCount - 1
  410.         IF LineCount <= 0
  411.             DO EndPage
  412.             DO StartPage
  413.         ELSE
  414.             Vertical = Vertical + LineSpace
  415.             ? LeftMargin + " " + STR(Vertical) + " _m"
  416.         ENDIF
  417.          
  418.         RETURN
  419.  
  420. PROCEDURE EndPage
  421.         ? "_ep"
  422.         LineCount = 0
  423.         RETURN
  424.  
  425. PROCEDURE EndJob
  426.         DO FlushText
  427.         IF .NOT. EmptyPage
  428.             DO EndPage
  429.         ENDIF
  430.         ? "_ed end"
  431.         ? EOJ
  432.         set print off
  433.         set console on
  434.         RETURN
  435.  
  436. PROCEDURE Preamble
  437.     eodata = 0
  438.     Eoj = CHR(4)
  439.     @ 24,00 SAY "Downloading Program   "
  440.     ? ps_start
  441.     ? "_bd a4 _bp 0 14032 9922 _ornt /CourierR 500 _ff"
  442.     ? "0 14032 9922 _ornt  350 13000 _m"
  443.     @ 24,00 SAY "Finished Download       Printing Page:          Chr.Count         Lines "
  444.     @ 24,40 SAY Pages PICTURE "999"
  445.     @ 24,58 SAY char_count PICTURE "999999"
  446.     @ 24,72 SAY line_total PICTURE "999999"
  447.     RETURN
  448.  
  449. FUNCTION read_char
  450.     if eof_text
  451.        return ""
  452.     ENDIF
  453.     char_count = char_count + 1
  454.     char = " "
  455.     bytes_read = FREAD(text_file,@char,1)
  456.     if ferror() <> 0
  457.        @ 23,50 say "fread() error "
  458.        @ 23,64 say ferror() picture "9999"
  459.     endif
  460.  
  461.     if bytes_read <= 0 .or. len(char) <=0
  462.        eof_text = .T.
  463.        return ""
  464.     ENDIF
  465.     return char
  466.