?TACL ROUTINE == DEPSCAN routine == This routine searches a file or files for ?SOURCE statements == and returns a list ordered by the target file of the ?SOURCE == statement. Only ?SOURCE statements at the start of each line are == procesed. == == Syntax: DEPSCAN [/OUT /] == #FRAME == check that user has read access to the file == [#DEF check_access ROUTINE |BODY| #FRAME #PUSH buf_ err_ pmt_ fname fs_err SINK [#ARGUMENT/VALUE fname/FILENAME] #SET fs_err [#REQUESTER READ [fname] err_ buf_ pmt_] [#IF fs_err <> 0 |THEN| op_msg Can't read [fname] - error [fs_err] #RESULT 0 |ELSE| SINK [#REQUESTER CLOSE err_] #RESULT -1 ] #UNFRAME ] == write a message to the original #OUT location == [#DEF op_msg ROUTINE |BODY| #FRAME #PUSH cur_out #SET cur_out [#OUT] #PUSH #OUT #SET #OUT [old_out] #OUTPUT [#REST] #UNFRAME ] == pull one filename from a list of filenames == [#DEF waste_one ROUTINE |BODY| #FRAME #PUSH the^var first^file SINK [#ARGUMENT/VALUE the^var/VARIABLE] SINK [#ARGUMENT/VALUE first^file/FILENAME] #SET [the^var] [#REST] #UNFRAME ] == sort the results == [#DEF sort_results ROUTINE |BODY| #FRAME #PUSH in^file out^file #SET in^file [#DEFAULTS/SAVED/].DEPSIN #SET out^file [#DEFAULTS/SAVED/].DEPSOUT vartofile report [in^file] SORT/INLINE/ + TO [out^file] + FROM [in^file] + ASC 1 FOR 24 + RUN + EXIT #SET report filetovar [out^file] report SINK [#PURGE [in^file]] SINK [#PURGE [out^file]] #UNFRAME ] == process one line from the edit result set == [#DEF process_line ROUTINE |BODY| #FRAME #PUSH src^file target^file rest padding #SET padding * * SINK [#ARGUMENT/VALUE src^file/FILENAME] SINK [#ARGUMENT WORD] SINK [#ARGUMENT WORD] SINK [#ARGUMENT/VALUE target^file/FILENAME/SYNTAX/] #SET rest [#REST] [#IF [#CHARCOUNT rest] > 20 |THEN| #SET rest [#CHARGET rest 1 TO 17]... ] #APPEND report [target^file] & [#CHARGET padding 2 for [#COMPUTE 26 - [#CHARCOUNT target^file]]] & [src^file] - [rest] #UNFRAME ] == process one file == [#DEF process_file ROUTINE |BODY| #FRAME #PUSH #OUTFORMAT the_file code out_lines #SET #OUTFORMAT TACL #PUSH the_file code #SET #INLINETO out_lines SINK [#ARGUMENT/VALUE the_file/ FILENAME] #SET code [#FILEINFO/CODE/ [the_file]] [#IF (code = 101) |THEN| [#IF [check_access [the_file]] |THEN| + g [the_file] r + lb/?SOURCE/ COL 1:7 [#IF [#LINEFIND out_lines 1 CURRENT FILE IS [the_file]] |THEN| #LINEDEL out_lines 1 [#LOOP |WHILE| NOT [#EMPTYV out_lines] |DO| process_line [the_file] [#EXTRACT out_lines] ] |ELSE| #SET out_lines ] ] ] #UNFRAME ] == Main routine == #PUSH template fnames fname outfile old_out report #PUSH #INLINEOUT #INLINEPREFIX #INLINEECHO #INLINEPROCESS [#IF ( [#ARGUMENT/PEEK/SLASH TEXT END] = 1 ) |THEN| SINK [#ARGUMENT SLASH] SINK [#ARGUMENT KEYWORD/ WORDLIST out/] SINK [#ARGUMENT /VALUE outfile/ FILENAME / SYNTAX /] SINK [#ARGUMENT SLASH] #SET old_out [#OUT] #PUSH #OUT #SET #OUT [outfile] ] == end if #SET #INLINEPREFIX + #SET #INLINEOUT 0 #SET #INLINEECHO 0 EDIT/INLINE/ SINK [#ARGUMENT/VALUE template/ TEMPLATE] #SET fnames [#FILENAMES [template]] op_msg Searching files [template]... [#LOOP |WHILE| NOT [#EMPTYV fnames] |DO| #SETMANY fname, [fnames] waste_one fnames [fnames] process_file [fname] ] [#IF NOT [#EMPTY [#INLINEPROCESS]] |THEN| + EXIT ] op_msg Sorting results... [#IF [#LINECOUNT report] |THEN| sort_results #OUTPUTV report ] [#IF NOT [#EMPTYV outfile] |THEN| op_msg Report is now in [outfile] op_msg Finished ! ] #UNFRAME