home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / printer / copycat.arc / COPYCAT.BAS next >
BASIC Source File  |  1989-05-10  |  10KB  |  323 lines

  1. 'Wed  May 10, 1989   9:21:44 pm 
  2. '***********************************************************************
  3. ' PROGRAM TO PRINT OUT FORMATTED ASCII FILES, customized for Dr.Download
  4. ' written by David A. Wesson  24 Fairview St.  W. Hartford, CT 06119
  5. '***********************************************************************
  6.  
  7. DECLARE SUB printpage ()
  8. DECLARE SUB getfilename ()
  9. DECLARE SUB makelist ()
  10. DECLARE FUNCTION newtime$ ()
  11. DECLARE SUB getkey ()
  12. DECLARE SUB checkprinter ()
  13. DECLARE SUB checkinputfile ()
  14. DECLARE SUB goodbye ()
  15. DECLARE SUB header ()
  16. DECLARE FUNCTION printer ()
  17. DECLARE SUB helpscreen ()
  18. DECLARE SUB readcommandline ()
  19. DECLARE SUB splitline (in$)
  20. DECLARE SUB outputroutine ()
  21. DECLARE FUNCTION newdate$ ()
  22.  
  23. TYPE RegType
  24.      ax    AS INTEGER
  25.      bx    AS INTEGER
  26.      cx    AS INTEGER
  27.      dx    AS INTEGER
  28.      bp    AS INTEGER
  29.      si    AS INTEGER
  30.      di    AS INTEGER
  31.      flags AS INTEGER
  32. END TYPE
  33.  
  34. DIM SHARED inregs AS RegType, outregs AS RegType
  35. DIM SHARED day$(7), month$(12), word$(10), l$(70)
  36.  
  37. COMMON SHARED in$, esc$, margin, lines, readlist, filename$, datafile$, nl$
  38. COMMON SHARED page, suppress, ff$, clear$, lf$, top, preview, jump, row, col
  39. COMMON SHARED killtemp
  40.  
  41. esc$ = CHR$(27)
  42. ff$ = CHR$(12)
  43. lf$ = CHR$(10)
  44. clear$ = CHR$(24)
  45. nl$ = STRING$(79, 45)
  46.  
  47. '************************ MAIN PROGRAM BEGINS HERE **********************
  48.      readcommandline
  49.      outputroutine
  50.      goodbye
  51. '************************* MAIN PROGRAM ENDS HERE ***********************
  52.  
  53. SUB checkinputfile
  54.      IF filename$ = "" THEN filename$ = "%.%"
  55.      OPEN filename$ FOR RANDOM AS 1
  56.      IF LOF(1) = 0 THEN
  57.           header
  58.           LOCATE 3, 1
  59.           PRINT "No filename by that name found. Hit a key to ABORT."
  60.           getkey
  61.           CLOSE 1
  62.           KILL filename$
  63.           goodbye
  64.      END IF
  65.      CLOSE 1
  66.      OPEN filename$ FOR INPUT AS 1
  67. END SUB
  68.  
  69. SUB checkprinter
  70.      DO
  71.           IF printer = 0 THEN
  72.                LOCATE 3, 1
  73.                PRINT "Printer is offline. Fix and hit a key, or hit [Esc] to EXIT."
  74.                getkey
  75.           END IF
  76.           IF in$ = esc$ THEN goodbye
  77.      LOOP UNTIL printer = 1
  78. END SUB
  79.  
  80. SUB getfilename
  81.      IF EOF(2) THEN
  82.           goodbye
  83.           ELSE LINE INPUT #2, filename$
  84.      END IF
  85. END SUB
  86.  
  87. SUB getkey
  88. in:     in$ = INKEY$: IF in$ = "" THEN GOTO in
  89. END SUB
  90.  
  91. SUB goodbye
  92.      CLOSE
  93.      IF printer = 1 THEN LPRINT clear$;
  94.      IF killtemp = 1 THEN KILL "copycat.tmp"
  95.      VIEW PRINT
  96.      CLS
  97.      PRINT "Thank you for using COPYCAT."
  98.      END
  99. END SUB
  100.  
  101. SUB header
  102.      CLS
  103.      LOCATE 1, 1: PRINT STRING$(80, 196);
  104.      PRINT "COPYCAT printing "; filename$;
  105.      PRINT " beginning at "; newtime$; TAB(72); "Page"; page
  106.      LOCATE 4, 1: PRINT STRING$(80, 196);
  107. END SUB
  108.  
  109. SUB helpscreen
  110.      CLS
  111.      PRINT "COPYCAT prints ASCII files with header and other options."
  112.      PRINT ""
  113.      PRINT "Syntax: COPYCAT filename [ /Mn /Tn /Ln /Jn /S /P ]"
  114.      PRINT " where  filename is any legal path and filename"
  115.      PRINT "        * or ? may be used as wildcards in the filename      "
  116.      PRINT "        /Mn sets left margin to n characters "
  117.      PRINT "        /Tn sets top margin to n lines"
  118.      PRINT "        /Ln sets number of lines on page [default 55]"
  119.      PRINT "        /Jn jump to page n"
  120.      PRINT "        /S  suppresses header"
  121.      PRINT "        /P  previews to screen only"
  122.      PRINT ""
  123.      PRINT "        If filename begins with @ then filename is name of"
  124.      PRINT "        datafile with list of filenames to print, one per line."
  125.      PRINT ""
  126.      PRINT "Written for the public domain and Dr.Download by"
  127.      PRINT "David Wesson  24 Fairview St.  W. Hartford, CT 06119"
  128.      END
  129. END SUB
  130.  
  131. SUB makelist
  132.         com$ = "dir " + filename$ + " > copycat.dir"
  133.         SHELL com$
  134.         OPEN "copycat.dir" FOR INPUT AS 3
  135.         OPEN "copycat.tmp" FOR OUTPUT AS 4
  136.         WHILE NOT EOF(3)
  137.                 LINE INPUT #3, l$
  138.                 IF LEFT$(l$, 1) > CHR$(32) THEN
  139.                         f$ = RTRIM$(LEFT$(l$, 8)) + "." + MID$(l$, 10, 3)
  140.                         PRINT #4, f$
  141.                 END IF
  142.         WEND
  143.         CLOSE 3
  144.         CLOSE 4
  145.         KILL "copycat.dir"
  146.         filename$ = "@copycat.tmp"
  147.         killtemp = 1
  148. END SUB
  149.  
  150. FUNCTION newdate$
  151.      day$(0) = "Sunday"
  152.      day$(1) = "Monday"
  153.      day$(2) = "Tuesday"
  154.      day$(3) = "Wednesday"
  155.      day$(4) = "Thursday"
  156.      day$(5) = "Friday"
  157.      day$(6) = "Saturday"
  158.      month$(1) = "Jan"
  159.      month$(2) = "Feb"
  160.      month$(3) = "Mar"
  161.      month$(4) = "Apr"
  162.      month$(5) = "May"
  163.      month$(6) = "Jun"
  164.      month$(7) = "Jul"
  165.      month$(8) = "Aug"
  166.      month$(9) = "Sep"
  167.      month$(10) = "Oct"
  168.      month$(11) = "Nov"
  169.      month$(12) = "Dec"
  170.      t1 = &H2A00: t2 = 0: t3 = 0: t4 = 0
  171.      inregs.ax = t1: inregs.bx = t2: inregs.cx = t3: inregs.dx = t4
  172.      CALL interrupt(&H21, inregs, outregs)
  173.      t1 = outregs.ax: t2 = outregs.bx: t3 = outregs.cx: t4 = outregs.dx
  174.      day = t1 - ((FIX(t1 / 256)) * 256)
  175.      day$ = day$(day)
  176.      year = t3
  177.      year$ = LTRIM$(RTRIM$(STR$(year)))
  178.      month = FIX(t4 / 256)
  179.      month$ = month$(month)
  180.      date = t4 - (month * 256)
  181.      newdate$ = day$ + SPACE$(2) + month$ + STR$(date) + "," + STR$(year)
  182. END FUNCTION
  183.  
  184. FUNCTION newtime$
  185.      intime$ = TIME$
  186.       hour$ = MID$(intime$, 1, 2)
  187.       min$ = MID$(intime$, 4, 2)
  188.       sec$ = MID$(intime$, 7, 2)
  189.       hour = VAL(hour$)
  190.            IF hour < 12 THEN ampm$ = "am" ELSE ampm$ = "pm"
  191.            IF hour > 12 THEN hour = hour - 12
  192.       hour$ = STR$(hour)
  193.      newtime$ = hour$ + ":" + min$ + ":" + sec$ + " " + ampm$
  194. END FUNCTION
  195.  
  196. SUB outputroutine
  197. DO
  198.      IF readlist = 1 THEN getfilename
  199.      checkinputfile
  200.      checkprinter
  201.      header
  202.      LOCATE 3, 1
  203.      IF preview = 1 THEN
  204.           PRINT "Hit [Esc] to terminate preview, or any key to continue previewing pages."
  205.           ELSE PRINT "Hit [Esc] to terminate printing.                                         "
  206.      END IF
  207.      row = 5: col = 1
  208.      DO
  209.           x = 0
  210.           page = page + 1
  211.           VIEW PRINT
  212.           LOCATE 2, 76: PRINT page;
  213.           DO
  214.                x = x + 1
  215.                l$(x) = ""
  216.                IF NOT EOF(1) THEN LINE INPUT #1, l$(x)
  217.                in$ = INKEY$
  218.           LOOP UNTIL x = lines OR in$ = esc$
  219.           IF page >= jump THEN printpage
  220.      LOOP UNTIL in$ = esc$ OR EOF(1)
  221.      CLOSE 1
  222.      VIEW PRINT
  223.      page = 0
  224. LOOP
  225. END SUB
  226.  
  227. FUNCTION printer
  228.      inregs.ax = 2 * 256: inregs.dx = 0
  229.      CALL interrupt(&H17, inregs, outregs)
  230.      ah = FIX(outregs.ax / 256)
  231.      bit7 = FIX(ah / 128)
  232.      bit6 = FIX((ah - (bit7 * 128)) / 64)
  233.      printer = ABS(bit6)
  234. END FUNCTION
  235.  
  236. SUB printpage
  237.      VIEW PRINT 5 TO 25
  238.      LOCATE row, col
  239.      PRINT STRING$(top, lf$)
  240.      IF preview = 0 THEN LPRINT STRING$(top, lf$)
  241.      IF suppress = 0 THEN
  242.           PRINT SPC(margin); STRING$((79 - margin), 42)
  243.           PRINT SPC(margin); UCASE$(filename$); TAB(20 + margin);
  244.           PRINT newdate$; TAB(45 + margin); newtime$; SPC(16 - margin); "Page"; page
  245.           PRINT SPC(margin); STRING$((79 - margin), 42)
  246.           PRINT lf$;
  247.           IF preview = 0 THEN
  248.                LPRINT SPC(margin); STRING$((79 - margin), 42)
  249.                LPRINT SPC(margin); UCASE$(filename$); TAB(20 + margin);
  250.                LPRINT newdate$; TAB(42 + margin); newtime$; SPC(19 - margin); "Page"; page
  251.                LPRINT SPC(margin); STRING$((79 - margin), 42)
  252.                LPRINT lf$;
  253.           END IF
  254.      END IF
  255.      x = 0
  256.      DO
  257.           x = x + 1
  258.           PRINT SPC(margin); LEFT$(l$(x), 79 - margin)
  259.           IF preview = 0 THEN LPRINT SPC(margin); LEFT$(l$(x), 79 - margin)
  260.           IF LEN(l$(x)) > (80 - margin) THEN
  261.                IF preview = 0 THEN LPRINT SPC(margin); ">"; MID$(l$(x), 80 - margin)
  262.                PRINT SPC(margin); ">"; MID$(l$(x), 80 - margin)
  263.           END IF
  264.           in$ = INKEY$
  265.      LOOP UNTIL x = lines OR in$ = esc$
  266.      PRINT LEFT$(nl$, 80)
  267.      IF preview = 0 THEN LPRINT ff$ ELSE getkey
  268.      row = CSRLIN: col = POS(0)
  269. END SUB
  270.  
  271. SUB readcommandline
  272.      in$ = COMMAND$
  273.      IF in$ = "" THEN helpscreen
  274.      splitline in$
  275.      x = 0: lines = 55
  276.      DO
  277.           x = x + 1
  278.           wp$ = LEFT$(word$(x), 2)
  279.           SELECT CASE wp$
  280.                CASE "/M": margin = VAL(MID$(word$(x), 3))
  281.                CASE "/T": top = VAL(MID$(word$(x), 3))
  282.                CASE "/L": lines = VAL(MID$(word$(x), 3))
  283.                CASE "/J": jump = VAL(MID$(word$(x), 3))
  284.                CASE "/S": suppress = 1
  285.                CASE "/P": preview = 1
  286.                CASE ELSE
  287.                     IF word$(x) <> "" THEN
  288.                          filename$ = word$(x)
  289.                     END IF
  290.           END SELECT
  291.      LOOP UNTIL word$(x) = ""
  292.      IF filename$ = "" THEN
  293.           LOCATE 3, 1
  294.           INPUT "Enter filename: ", filename$
  295.      END IF
  296.      IF INSTR(filename$, "*") > 0 OR INSTR(filename$, "?") > 0 THEN makelist
  297.      IF suppress = 0 THEN lines = lines - 4
  298.      IF LEFT$(filename$, 1) = "@" THEN
  299.           datafile$ = MID$(filename$, 2)
  300.           OPEN datafile$ FOR INPUT AS 2
  301.           readlist = 1
  302.      END IF
  303. END SUB
  304.  
  305. SUB splitline (in$) STATIC
  306.      w = 1: word$ = ""
  307.      q1 = INSTR(in$, CHR$(34))
  308.      IF q1 > 0 THEN
  309.           q2 = INSTR(MID$(in$, q1 + 1), CHR$(34))
  310.           test$ = MID$(in$, q1 + 1, q2 - 1)
  311.           in$ = LEFT$(in$, q1 - 1) + MID$(in$, q1 + LEN(test$) + 2)
  312.      END IF
  313.      FOR x = 1 TO LEN(in$)
  314.      ch$ = MID$(in$, x, 1): ch = ASC(ch$)
  315.           IF ch = 32 AND LEN(word$) > 1 THEN
  316.                word$(w) = LTRIM$(RTRIM$(word$)): w = w + 1: word$ = ""
  317.                ELSE word$ = word$ + ch$
  318.           END IF
  319.      NEXT x
  320.      IF LEN(word$) > 1 THEN word$(w) = LTRIM$(RTRIM$(word$))
  321. END SUB
  322.  
  323.