PROGRAM RUNPROC * * ECL - KRJ - PROC driver * Public Domain: written by Keith Johnson 2004 * * This is called by a command line like * * [RUN file1] RUNPROC [DICT][file2] proc * * Where upper case words are entered as shown and * lower case words are variables. [] means optional. * If file2 is not specified, then VOC is assumed. * * If data is to be passed to the input buffer, then the command line * will have to look like * * [RUN file1] RUNPROC [DICT] file2 proc buffer<1> buffer<2> ... * COMMON /PROCBUFF/ IBUF(2),OBUF(2),FREC(10),FHAN(10),SREG(11) COMMON /PROCPNTR/ IPTR,OPTR,ACTI,ACTO * IBUF and OBUF are the Input and Output buffers * There is one input buffer pointer, IPTR * and two output buffer pointers, OPTR<1> and OPTR<2> * The active buffers are signified by ACTI and ACTO * FREC are the file buffers, and FHAN the file variables * (10 being the fast buffer) * SREG are the select list registers * Check if we need to initialise the buffers IF NOT(ASSIGNED(IBUF(1))) THEN MAT IBUF = ''; MAT OBUF = '' MAT FREC = ''; MAT FHAN = ''; MAT SREG = '' END * Get the name of the proc and the file it is in THIS = TRIM(@SENTENCE) CONVERT ' ' TO @AM IN THIS * Get rid of 'RUN file' IF UPCASE(THIS<1>) = 'RUN' THEN DEL THIS<1> DEL THIS<1> END * Get rid of 'RUNPROC' or whatever it is called DEL THIS<1> * Get any 'DICT' and the file name DICT = '' FILENAME = THIS<1> DEL THIS<1> IF FILENAME = 'DICT' THEN DICT = 'DICT' FILENAME = THIS<1> DEL THIS<1> END * Get the name of the PROC NAME = THIS<1> * If we don't have a PROC name, then assume the PROC is in VOC IF NAME = '' AND DICT = 'DICT' THEN NAME = FILENAME FILENAME = 'VOC' END IF NAME = '' THEN FILEHANDLE = @VOC NAME = FILENAME END ELSE OPEN DICT,FILENAME TO FILEHANDLE ELSE STOP 'Cannot open ':DICT:' ':FILENAME END END * Get the PROC record READ PROC FROM FILEHANDLE,NAME ELSE STOP 'Cannot read PROC "':NAME:'" from ':DICT:' ':FILENAME END * Save the name of the file, including the 'DICT' FILENAME = DICT:'*':FILENAME * Set the pointers and the active buffers IF THIS = '' THEN THIS = NAME IBUF(1) = THIS IPTR = 1 ACTI = 1 OPTR = DCOUNT(OBUF(1),@AM) ACTO = 1 OPTR<2> = DCOUNT(OBUF(2),@AM) * Set the select registers MAT SREG = '' READLIST SREG(1) FROM 0 ELSE SREG(1) = '' READLIST SREG(2) FROM 1 ELSE SREG(2) = '' READLIST SREG(3) FROM 2 ELSE SREG(3) = '' READLIST SREG(4) FROM 3 ELSE SREG(4) = '' READLIST SREG(5) FROM 4 ELSE SREG(5) = '' READLIST SREG(6) FROM 5 ELSE SREG(6) = '' READLIST SREG(7) FROM 6 ELSE SREG(7) = '' READLIST SREG(8) FROM 7 ELSE SREG(8) = '' READLIST SREG(9) FROM 8 ELSE SREG(9) = '' READLIST SREG(10) FROM 9 ELSE SREG(10) = '' READLIST SREG(11) FROM 10 ELSE SREG(11) = '' * Clear the LABEL (it's used for passing between PROCs) LABEL = '' * and try to run the PROC CALL CALLPROC(PROC,NAME,FILENAME,FILEHANDLE,LABEL) * Restore any select lists FORMLIST SREG(1) TO 0 FORMLIST SREG(2) TO 1 FORMLIST SREG(3) TO 2 FORMLIST SREG(4) TO 3 FORMLIST SREG(5) TO 4 FORMLIST SREG(6) TO 5 FORMLIST SREG(7) TO 6 FORMLIST SREG(8) TO 7 FORMLIST SREG(9) TO 8 FORMLIST SREG(10) TO 9 FORMLIST SREG(11) TO 10 STOP END