LFormat

From Pickwiki
Jump to navigationJump to search
* A utility to print source code to an HP laser printer with various
* output options. Written by Adrian Matthews in 1994

$OPTIONS SMA.HEADING
      PROMPT ''

	       DEFAULT.PRINTER = '\\PRINTSERV\[[Development_HP8150]]'
      DEFAULT.PRINT = DQUOTE(DEFAULT.PRINTER)
      ESC = CHAR(27)
      READLIST PASSED.RECORDS ELSE PASSED.RECORDS = ''
      COND = ESC:"(10U":ESC:'(s0P':ESC:'&k2S'
      SENTENCE = CONVERT(' ',@FM,FIELD(@SENTENCE,'-',1))
      OPTIONS = FIELD(@SENTENCE,'-',2,999)
      CONVERT ' ' TO '' IN OPTIONS
      CONVERT '-' TO @FM IN OPTIONS
      NO.NUM.OPTIONS = CONVERT('0123456789','',OPTIONS)
      OPT.STRING = ''
      LOCATE 'S' IN NO.NUM.OPTIONS<1> SETTING POS THEN
         START.LINE = TRIM(CONVERT('S','',OPTIONS<POS>))
         IF NOT(NUM(START.LINE)) THEN
            ERR= '-S must be followed by a number'
            GOSUB ERR.HANDLER
            STOP
         END
         OPT.STRING = 'From line - ' : START.LINE
      END ELSE
         START.LINE = 1
      END
      LOCATE 'E' IN NO.NUM.OPTIONS<1> SETTING POS THEN
         END.LINE = TRIM(CONVERT('E','',OPTIONS<POS>))
         IF NOT(NUM(END.LINE)) THEN
            ERR = '-E must be followed by a number'
            GOSUB ERR.HANDLER
            STOP
         END
         OPT.STRING := ' to line ':END.LINE
      END ELSE
         END.LINE = 999999
      END
      LOCATE 'EXPAND' IN OPTIONS<1> SETTING POS THEN
         OPT.STRING<-1> = "INCLUDEs will not be expanded"
         MODE = ''
      END ELSE
         MODE = 'EXPAND'
         OPT.STRING<-1> = "INCLUDEs will be expanded"
      END
      LOCATE 'P' IN OPTIONS<1> SETTING POS THEN
         LANDSCAPE = @FALSE
         OPT.STRING<-1> = 'Output in portrait format'
      END ELSE
         LANDSCAPE = @TRUE
         OPT.STRING<-1> = "Output in landscape format"
      END
      LOCATE 'LPI' IN NO.NUM.OPTIONS<1> SETTING POS THEN
         LPI = TRIM(CONVERT('LPI','',OPTIONS<POS>))
      END ELSE
         LPI = 8
      END
      BEGIN CASE
         CASE LPI = 8
            LPI = ESC:'&l8D'
            LINES.PER.COL = 54
            PORT.LINES = 80
            OPT.STRING := ' at eight lines per inch'
         CASE LPI = 12
            LPI = ESC:'&l10D'
            LINES.PER.COL=86
            PORT.LINES = 126
            OPT.STRING := ' at twelve lines per inch'
         CASE 1
            ERR = 'Lines per inch must be 8 or 12'
            GOSUB ERR.HANDLER
            STOP
      END CASE
      LOCATE 'NOLINES' IN OPTIONS<1> SETTING POS THEN
         NOLINES = @TRUE
         OPT.STRING<-1> = 'Line-up bars will not be printed'
      END ELSE
         OPT.STRING<-1> = 'Line-up bars will be printed'
         NOLINES = @FALSE
      END
      FILE.NAME = SENTENCE<2>
      RECORD.ID = SENTENCE<3>
      IF FILE.NAME = '' AND RECORD.ID = '' AND OPTIONS = '' THEN
         CRT @SYS.BELL
         STOP
      END
      LINES.PER.PAGE = LINES.PER.COL * 2
      IF MODE = 'EXPAND' THEN ANS= 'Y' ELSE ANS = 'S'
      PASSED.RECORDS<-1> = RECORD.ID
            PERFORM 'SETPTR 0,80,63,0,0,1,AT ':DEFAULT.PRINTER
      IF LANDSCAPE THEN
        OPEN '&HOLD&' TO F.HOLD ELSE STOP 'Cannot open the &HOLD& file'
      END
      ERR.FLAG = 0
      TERM.WIDTH = 0
      DIM REC(99) ; MAT REC = ''
      DIM SAVE.INDENT(99) ; MAT SAVE.INDENT = ''
      DIM AMT(99) ; MAT AMT = ''
      DIM SAVE.CNT(99) ; MAT SAVE.CNT = ''
      DIM SAVE.MORE(99) ; MAT SAVE.MORE = ''
      VINCLUDE = 0
      CALL !GETPU(2,0,TERM.WIDTH,ERR.FLAG)
      IF NOLINES THEN
         MASK = SPACE(200)
      END ELSE
         MASK = "      ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179):"  ":CHAR(179)
      END
      LOOP
         REMOVE RECORD.ID FROM PASSED.RECORDS SETTING MORE.IDS
         FIELD.NO = 1
         LOOP
            BEGIN CASE
               CASE FIELD.NO = 1
                  LOOP
                     ERR = ''
                     IF NOT(FILE.NAME) THEN
                        CRT
                        CRT 'Enter file name : ': ; INPUT FILE.NAME
                     END
                     IF FILE.NAME THEN
                        OPEN FILE.NAME TO F.FILE ELSE
                           ERR = FILE.NAME:' is not a valid file name'
                           GOSUB ERR.HANDLER
                           FILE.NAME = ''
                        END
                     END ELSE
                        FIELD.NO = 99
                        EXIT
                     END
                     FIELD.NO += (NOT(ERR))
                  UNTIL NOT(ERR) REPEAT
               CASE FIELD.NO = 2
                  LOOP
                     ERR = ''
                     IF NOT(RECORD.ID) THEN
                        CRT
                        CRT 'Enter record ID : ': ; INPUT RECORD.ID
                     END
                     IF RECORD.ID THEN
                        READV RECV FROM F.FILE,RECORD.ID,0 ELSE
                           ERR = RECORD.ID:' does not exist on ':FILE.NAME
                           GOSUB ERR.HANDLER
                           RECORD.ID = ''
                        END
                     END ELSE
                        FIELD.NO = 1
                        FILE.NAME = ''
                        EXIT
                     END
                     FIELD.NO += (NOT(ERR))
                  UNTIL NOT(ERR) REPEAT
               CASE FIELD.NO = 3
                  CRT
                  CRT
                  CRT '[LFORMAT V1.0]'
                  CRT
                  LOOP
                     REMOVE STRING FROM OPT.STRING SETTING MORE
                     IF STRING THEN CRT STRING
                  WHILE MORE REPEAT
                  CRT
                  PERFORM 'FORMAT ':FILE.NAME:' ':RECORD.ID
                  READ RECV FROM F.FILE,RECORD.ID THEN NULL
                  MAX.LINES = DCOUNT(RECV,@FM)
                  REC(VINCLUDE) = RECV
                  PTR.WIDTH = ''
                  PTR.LENGTH = ''
                  PTR.TOP.MAR = ''
                  PTR.BOT.MAR = ''
                  PTR.MODE = ''
                  PTR.OPTIONS = ''
                  CALL !SET.PTR(-1,PTR.WIDTH,PTR.LENGTH,PTR.TOP.MAR,PTR.BOT.MAR,PTR.MODE,PTR.OPTIONS)
                  IF LANDSCAPE THEN
                     CALL !SET.PTR(0,92,99,0,0,3,'BANNER ':RECORD.ID:@USERNO:',NHEAD')
                     PRINTER.WIDTH = 92-9
                  END ELSE
                     CALL !SET.PTR(0,129,PORT.LINES,0,0,PTR.MODE,PTR.OPTIONS)
                     PRINTER.WIDTH = 129 - 9
                  END
                  PRINTER ON
                  IF NOT(LANDSCAPE) THEN
                     PRINT ESC:'&l0O':COND:LPI
                     HEADING "File, Record = ":FILE.NAME:", ":RECORD.ID:"'G'Acc. - ":@WHO:"'GTG'Dev. - ":FIELD(@LOGNAME,'\',2):"'G'Page 'SL'":STR(CHAR(205),129)
                  END
                  INDENT = 0
                  CNT = 0
                  AMT(VINCLUDE) = MAX.LINES
                  GRAND.TOT = AMT(VINCLUDE)
                  CRT STR(@(-10),INT(((AMT(VINCLUDE)/10)[[/TERM]].WIDTH) + 1) + 2):@(-4):'Performing a Lineup Format ...':@(-3)
                  GOSUB PROCESS.REC
                  IF LANDSCAPE THEN
                     FIELD.NO = 4
                  END ELSE
                     FIELD.NO = 5
                  END
               CASE FIELD.NO = 4
                  PRINTER CLOSE
                  PRINTER OFF
                  CALL !SET.PTR(0,188,LINES.PER.COL + 2,0,0,PTR.MODE,PTR.OPTIONS)
                  PRINTER ON
                  PRINT ESC:'&l1O':COND:LPI
                  HEADING "File Name - ":FILE.NAME:"'G'Record Name - ":RECORD.ID:"'G'Account - ":@WHO:"'G'Date and Time - 'TG'Developer - ":FIELD(@LOGNAME,'\',2):"'G'Page 'SL'":STR(CHAR(205),188)
                  READ HOLD.REC FROM F.HOLD,RECORD.ID:@USERNO THEN
*                     DELETE F.HOLD,RECORD.ID:@USERNO
                     HOLD.TOT = DCOUNT(HOLD.REC,@FM)
                     FOR CNT = 1 TO HOLD.TOT STEP LINES.PER.PAGE
                        FOR X = CNT TO CNT+(LINES.PER.COL-1)
                           PRINT FMT(HOLD.REC<X>,'92L'):' ':CHAR(221):' ':FMT(HOLD.REC<X+LINES.PER.COL>,'92L')
                        NEXT X
                     NEXT CNT
                  END ELSE
                     PRINT "Couldn't read ":RECORD.ID:@USERNO:" from &HOLD&"
                  END
                  FIELD.NO = 5
               CASE FIELD.NO = 5
                  PRINTER CLOSE
                  PRINTER OFF
                  CRT
                  IF START.LINE AND END.LINE NE 999999 THEN
                     CRT 'Lines ':START.LINE:' to ':END.LINE:' printed to unit 0'
                  END ELSE
                     CRT GRAND.TOT:' lines printed to unit 0'
                  END
                  CALL !SET.PTR(0,PTR.WIDTH,PTR.LENGTH,PTR.TOP.MAR,PTR.BOT.MAR,PTR.MODE,PTR.OPTIONS)
                  FIELD.NO = 99
            END CASE
         UNTIL FIELD.NO = 99 REPEAT
      WHILE MORE.IDS REPEAT
      CRT
      STOP
PROCESS.REC:
      LOOP
         CNT += 1
         IF NOT(MOD(CNT,10)) THEN
            CRT ">":
         END
         REMOVE LINE FROM REC(VINCLUDE) SETTING MORE
         IF NOT(VINCLUDE) THEN
            IF CNT LT START.LINE OR CNT GT END.LINE THEN
               IF NOT(MORE) THEN EXIT ELSE CONTINUE
            END
         END
         LINE.NO = FMT(CNT,"4'0'R"):(IF VINCLUDE THEN "$:" ELSE ": "):" "
         TEST = TRIM(LINE)
         FLINE = TRIMF(LINE)
         LINE.LEN = LEN(LINE)
         IF LEN(TEST) = 0 THEN
            PRINT LINE.NO:MASK[1,INDENT]
         END ELSE
            INDENT = LINE.LEN - LEN(FLINE)
            LINE = MASK[1, INDENT]:FLINE
            FOR XX = 1 TO LINE.LEN STEP PRINTER.WIDTH
               PRINT (IF XX = 1 THEN LINE.NO ELSE SPACE(7)):LINE[XX,PRINTER.WIDTH]
            NEXT XX
         END
         IF LINE[1,8] = "$INCLUDE" AND ANS NE "S" THEN
            IF ANS NE "E" THEN
               CRT
               LOOP
                  CRT 'Expand ':LINE
                  PREV.ANS = ANS
                  CRT '(Y)es, (N)o, (E)xpand all, (S)kip all : ':ANS:@(-9): ; INPUT ANS,1
                  IF ANS = '' THEN ANS = PREV.ANS
                  ANS = UPCASE(ANS)
               UNTIL ANS MATCHES 'Y':@VM:'N':@VM:'E':@VM:'S' DO
                  CRT @SYS.BELL:
               REPEAT
            END
            IF ANS = 'Y' OR ANS = 'E' THEN
               SAVE.CNT(VINCLUDE) = CNT
               SAVE.MORE(VINCLUDE) = MORE
               SAVE.INDENT(VINCLUDE) = INDENT
               CNT = 0
               RECORD.ID = FIELD(LINE,' ',3)
               IF RECORD.ID = '' THEN
                  RECORD.ID = FIELD(LINE,' ',2)
               END ELSE
                  FILE.NAME = FIELD(LINE,' ',2)
               END
               HUSH ON ; PRINTER OFF
               PERFORM 'FORMAT ' : FILE.NAME:' ':RECORD.ID
               PRINTER ON ; HUSH OFF
               RECV = TRANS(FILE.NAME,RECORD.ID,-1,'X')
               VINCLUDE += 1
               REC(VINCLUDE) = RECV
               AMT(VINCLUDE) = DCOUNT(REC(VINCLUDE),@FM)
               INDENT = 0
               GRAND.TOT += AMT(VINCLUDE)
               GOSUB PROCESS.REC
               VINCLUDE -= 1
               CNT = SAVE.CNT(VINCLUDE)
               MORE = SAVE.MORE(VINCLUDE)
               INDENT = SAVE.INDENT(VINCLUDE)
            END
         END
      WHILE MORE REPEAT
      RETURN
ERR.HANDLER:
      CRT
      CRT @SYS.BELL:'LFORMAT> ':ERR
      CRT
      RETURN
   END