Cruise
From Pickwiki
* Display file entries like REVISE does (using file's DICT) * Written by Will Johnson * BE SURE TO INSTALL THE TCL.II INCLUDE BEFORE TRYING TO COMPILE THIS! * * Apply conversions if any to each multi-value * Use DICT VOC to control DICTs if specified * Don't display multi-value only fields * Use MCP to suppress non-printables * Allow edit as a command * Allow exploding one multi-valued field * EQUATE FALSE TO 0, TRUE TO 1 TEST.MODE = FALSE $INCLUDE FFT.BP TCL.II GOSUB OPEN.FILES GOSUB GET.ITEMLIST GOSUB BUILD.DICT.TABLE IF TEST.MODE THEN GOSUB DISPLAY.DICT.TABLE FOR I.DICT.TABLE = 1 TO S.DICT.TABLE T.LABEL = DICT.TABLE<1,I.DICT.TABLE> IF T.LABEL = THEN T.LABEL = "<NO LABEL>" NEXT I.DICT.TABLE GOSUB PROCESS.RECORDS STOP * OPEN.FILES: OPEN 'VOC' TO F.VOC ELSE N.OFE = 'VOC' ; GOSUB OPEN.FILE.ERROR END K.VOC = "F2R" READ EXISTS FROM F.VOC,K.VOC ELSE R.VOC = "D":@AM:"2":@AM:@AM:"3R":@AM:"S" WRITE R.VOC ON F.VOC,K.VOC END RETURN * OPEN.FILE.ERROR: PRINT 'Cannot open file ':N.OFE:'. Hit ENTER': INPUT CONT ; STOP RETURN * GET.ITEMLIST: WORD.COUNT = DCOUNT(TRIMB(SENTENCE),' ') LAST.WORD = FIELD(TRIMB(SENTENCE),' ',WORD.COUNT) IF LAST.WORD[1,1] = '(' THEN OPTIONS.EXIST = TRUE ; OPTIONS = LAST.WORD[2,LEN(LAST.WORD)] WORD.COUNT -= 1 END ELSE OPTIONS.EXIST = FALSE ; OPTIONS = IF C.WORD < WORD.COUNT THEN ITEM.SPECIFIED = TRUE SELECT.LIST = FALSE ; GROUPCODE = "G":(C.WORD-1):" 99" ITEM.LIST = OCONV(SENTENCE,GROUPCODE) CONVERT "'" TO "" IN ITEM.LIST CONVERT " " TO @AM IN ITEM.LIST END ELSE ITEM.SPECIFIED = FALSE READLIST LISTEXISTS THEN SELECT.LIST = TRUE ; SELECT LISTEXISTS END ELSE SELECT.LIST = FALSE END RETURN * * Select the DICT of the target file, or if already a DICT * then select the DICT VOC file, sorting it by field number * Then for each dict entry, if it's a D type and it's not the key * to the file, and we haven't found a definition for this field * number before then: we add the label to the field number * position in the table line 1, and the conversion (if any) to * the field number position in the table line 2. * BUILD.DICT.TABLE: IF DICT.FLAG THEN CMD = "VOC" ELSE CMD = N.FILE CMD = "SSELECT DICT ":CMD:" BY F2R" EXECUTE CMD, SELECT > DICT.LIST DICT.TABLE = ; DONE = FALSE ; LABEL.WIDTH = 0 LOOP READNEXT DK.FILE FROM DICT.LIST ELSE DONE = TRUE UNTIL DONE DO READ DR.FILE FROM DF.FILE, DK.FILE THEN DICT.TYPE = DR.FILE<1> IF DICT.TYPE[1,1] = 'D' THEN IF NUM(DR.FILE<2>) AND DR.FILE<2> > 0 THEN IF DICT.TABLE<2,DR.FILE<2>> = THEN T.LABEL = DR.FILE<4> CONVERT @VM TO ' ' IN T.LABEL T.LABEL = TRIM(T.LABEL) IF T.LABEL = THEN T.LABEL = DK.FILE DICT.TABLE<1,DR.FILE<2>> = T.LABEL L.LABEL = LEN(T.LABEL) IF L.LABEL > LABEL.WIDTH THEN LABEL.WIDTH = L.LABEL DICT.TABLE<2,DR.FILE<2>> = DR.FILE<3> END IF DR.FILE<7> # "" THEN DICT.TABLE<3,DR.FILE<2>> = DR.FILE<7> END DICT.TABLE<4,DR.FILE<2>> = DK.FILE END END END REPEAT IF LABEL.WIDTH<10 THEN LABEL.WIDTH=10 ; *set min label wdt IF LABEL.WIDTH>35 THEN LABEL.WIDTH=35 ; *set max label wdt LEFT.JUST = "L#":LABEL.WIDTH ; RIGHT.JUST = "R#":LABEL.WIDTH S.DICT.TABLE = DCOUNT(DICT.TABLE<1>,@VM) RETURN * DISPLAY.DICT.TABLE: PRINT "NUM":" ":"FIELD DESC" ("L#":LABEL.WIDTH):" ": PRINT "CONVERSION":" ":"ASSOCIATION" FOR I.DICT.TABLE = 1 TO S.DICT.TABLE GOSUB DISPLAY.A.DICT.ENTRY NEXT I.DICT.TABLE PRINT "Hit ENTER. ": ; INPUT CONT RETURN * DISPLAY.A.DICT.ENTRY: PRINT I.DICT.TABLE"R%3":" ": PRINT DICT.TABLE<1,I.DICT.TABLE> ("L#":LABEL.WIDTH):" ": PRINT DICT.TABLE<2,I.DICT.TABLE>"L#8":" ": PRINT DICT.TABLE<3,I.DICT.TABLE>"L#12":" ": IF DICT.TABLE<4,I.DICT.TABLE> = THEN PRINT END ELSE PRINT DICT.TABLE<4,I.DICT.TABLE> END RETURN * PROCESS.RECORDS: IF TEST.MODE THEN IF SELECT.LIST THEN PRINT "SELECT ": ELSE PRINT "NO SELECT ": PRINT "LIST ACTIVE. HIT ENTER": ; INPUT CONT END BEGIN CASE CASE SELECT.LIST ; NULL CASE ITEM.SPECIFIED ; SELECT ITEM.LIST CASE 1 ; SELECT F.FILE END CASE DONE = FALSE LOOP READNEXT K.FILE ELSE DONE = TRUE UNTIL DONE DO REREAD: READ R.FILE FROM F.FILE,K.FILE THEN PRINT @(-1): N.FILE:' ':K.FILE:' ':@LOGNAME S.FILE = DCOUNT(R.FILE,@AM) ; GOSUB PROCESS.ONE.RECORD IF UPCASE(FIELD(@LOGNAME,'\',2)) = "W.JOHNSON" THEN PRINT 'ENTER for next rec, E TO Edit, H for Help,': PRINT ' Q to stop, # to expand ': INPUT CONT BEGIN CASE CASE CONT = 'Q' CLEARSELECT ; STOP CASE NUM(CONT) BEGIN CASE CASE CONT < 1 ; NULL CASE CONT > S.FILE ; NULL CASE CONT # INT(CONT) ; NULL CASE 1 ; GOSUB EXPAND.FIELD END CASE CASE CONT = 'E' EXECUTE "ED ":N.FILE:" ":K.FILE GO REREAD CASE CONT = 'H' GOSUB HELP END CASE END END REPEAT RETURN * * Don't show me anything for fields with nothing in them. However: * If I have a field with something in it and NO corresponding * Dict entry, then we show '<no label>' on that line. * So the size I walk through, is the size of the record itself * not the size of the Dict table I've here built. * * Don't show fields composed only of value-marks * Suppress non-printables, but tell me when I've done that PROCESS.ONE.RECORD: EXPLODE = FALSE FOR I.DICT.TABLE = 1 TO S.FILE GOSUB PROCESS.ONE.FIELD NEXT I.DICT.TABLE RETURN * PROCESS.ONE.FIELD: T.FILE = R.FILE<I.DICT.TABLE> * SKIP FIELD IF EMPTY OR ONLY VMS IF CONVERT(@VM,,T.FILE) = THEN RETURN * IF EXPLODE THEN GOSUB DISPLAY.A.DICT.ENTRY GOSUB OUTPUT.LABEL GOSUB CONVERT.OUTPUT GOSUB SUPPRESS.CONTROL.CHARS * IF EXPLODE THEN CONVERT "_" TO @VM IN T.OUTPUT VALUE.WIDTH = 78-LABEL.WIDTH SPACE.PAD = SPACE(LABEL.WIDTH) S.T.OUTPUT = DCOUNT(T.OUTPUT,@VM) PRINT T.OUTPUT<1,1> FOR I.T.OUTPUT = 2 TO S.T.OUTPUT T.T.OUTPUT = T.OUTPUT<1,I.T.OUTPUT> PRINT SPACE.PAD:" (":I.DICT.TABLE"R%3": PRINT ".":I.T.OUTPUT"R%3":"): ": T.T.OUTPUT NEXT I.T.OUTPUT END ELSE CONVERT "_" TO "]" IN T.OUTPUT VALUE.WIDTH = 78-(LABEL.WIDTH + 8) SPACE.PAD = SPACE(78-VALUE.WIDTH) T.OUTPUT = FOLD(T.OUTPUT,VALUE.WIDTH) S.T.OUTPUT = DCOUNT(T.OUTPUT,@AM) PRINT T.OUTPUT<1> FOR I.T.OUTPUT = 2 TO S.T.OUTPUT PRINT SPACE.PAD: T.OUTPUT<I.T.OUTPUT> NEXT I.T.OUTPUT END RETURN * OUTPUT.LABEL: T.LABEL = DICT.TABLE<1,I.DICT.TABLE> IF T.LABEL = THEN T.LABEL = '<no label>' IF LEN(T.LABEL) > LABEL.WIDTH THEN PRINT T.LABEL LEFT.JUST: END ELSE PRINT T.LABEL RIGHT.JUST: END IF EXPLODE THEN PRINT " (":I.DICT.TABLE"R%3":".001":"):": END ELSE PRINT " (":I.DICT.TABLE"R%3":"):": END RETURN * CONVERT.OUTPUT: T.CONV = DICT.TABLE<2,I.DICT.TABLE> S.T.FILE = DCOUNT(T.FILE,@VM) ; T.OUTPUT = FOR I.T.FILE = 1 TO S.T.FILE T.OUTPUT<1,I.T.FILE> = OCONV(T.FILE<1,I.T.FILE>,T.CONV) NEXT I.T.FILE CONVERT @VM TO "_" IN T.OUTPUT RETURN * SUPPRESS.CONTROL.CHARS: CT.OUTPUT = OCONV(T.OUTPUT,'MCP') ; *REM NON-PRINTABLES IF CT.OUTPUT = T.OUTPUT THEN PRINT " ": ELSE PRINT ".": ; T.OUTPUT = CT.OUTPUT END RETURN * EXPAND.FIELD: EXPLODE = TRUE I.DICT.TABLE = CONT GOSUB PROCESS.ONE.FIELD PRINT 'Hit ENTER, or Q TO STOP ': ; INPUT CONT IF CONT = 'Q' THEN STOP RETURN * HELP: PRINT "Help doesn't yet work, press ENTER": ; INPUT CONT RETURN * END