/* build_proglist.p
 *
 * 2001 by John Green, Joanju Limited
 *
 * Quick and dirty script to build a list of compilable
 * program filenames. You probably have formal program
 * lists as a part of your development environment, and
 * you should be using those instead.
 *
 */

DEFINE VARIABLE command AS CHARACTER NO-UNDO.
DEFINE VARIABLE dirname AS CHARACTER NO-UNDO.
DEFINE VARIABLE filter AS CHARACTER NO-UNDO.
DEFINE VARIABLE outname AS CHARACTER NO-UNDO.
DEFINE VARIABLE progname AS CHARACTER NO-UNDO.
DEFINE VARIABLE progcount AS INTEGER NO-UNDO.


ASSIGN dirname = ".".
RUN proparse/utilities/textprompt.w
    (INPUT "Enter the name of the directory which contains "
           + "the program files that you want to parse.~n"
           + "This utility recurses through subdirectories.~n"
           + "File extensions collected: *.p, *.w, *.cls ~n~n"
           + "Enter . for current (working) directory.",
     INPUT-OUTPUT dirname
    ).
IF RETURN-VALUE = "cancel" THEN RETURN.


FILE-INFO:FILE-NAME = dirname.

IF FILE-INFO:FILE-TYPE = ?
   OR INDEX(FILE-INFO:FILE-TYPE, "D":U) = 0
   THEN DO:
  MESSAGE "Invalid directory name" VIEW-AS ALERT-BOX.
  RETURN.
END.

/* Replace any '.' with the full path. */
ASSIGN dirname = FILE-INFO:FULL-PATHNAME.


SESSION:SET-WAIT-STATE("GENERAL").
DO ON ERROR UNDO, LEAVE:

  ASSIGN outname = SESSION:TEMP-DIRECTORY + "joanju_proglist.txt".
  OUTPUT TO VALUE(outname).
  RUN recurseDirectory(dirname).
  OUTPUT CLOSE.

END.

MESSAGE "Programs found: " progcount VIEW-AS ALERT-BOX.

RETURN.



PROCEDURE recurseDirectory:
  DEFINE INPUT PARAMETER dirName AS CHARACTER NO-UNDO.

  DEFINE VARIABLE basename AS CHARACTER NO-UNDO.
  DEFINE VARIABLE fullpath AS CHARACTER NO-UNDO.
  DEFINE VARIABLE attribs  AS CHARACTER NO-UNDO.

  FILE-INFO:FILE-NAME = dirName.
  INPUT FROM OS-DIR (FILE-INFO:FULL-PATHNAME).
  REPEAT:
    IMPORT basename fullpath attribs.
    IF attribs MATCHES "*D*":U AND NOT(basename=".":U OR basename="..":U) THEN
      RUN recurseDirectory(fullpath).
    IF (   attribs MATCHES "*F*":U
       AND (  (basename MATCHES "*~~.p":U)
           OR (basename MATCHES "*~~.w":U)
           OR (basename MATCHES "*~~.cls":U)
           )
       )
	   THEN DO:
      PUT UNFORMATTED fullpath SKIP.
      ASSIGN progcount = progcount + 1.
    END.
  END.
  INPUT CLOSE.
END PROCEDURE.


