/* proparse/utilities/scanlister.p
 * 2002 by John Green, Joanju Limited
 *
 * Walks through the scan list, and for each node,
 * displays the node's type, text, line, and column.
 *
 * usage
 * =====
 * The default scanlister settings will be used, results displayed in the resultswindow.
 * RUN proparse/utilities/scanlister.p PERSISTENT SET scanlister.
 * RUN setScanFile IN scanlister ("filename.p").
 * RUN main IN scanlister.
 * APPLY "CLOSE":U TO scanlister.
 *
 *
 * Other methods
 * =============
 *
 * To write the output to "output.txt" instead of showing the output in resultswindow:
 * RUN setOutputFile IN scanlister ("output.txt").
 *
 */

DEFINE VARIABLE filename        AS CHARACTER NO-UNDO.
DEFINE VARIABLE outfile         AS CHARACTER NO-UNDO.
DEFINE VARIABLE currnode        AS INTEGER   NO-UNDO.
DEFINE VARIABLE showColumn      AS LOGICAL   NO-UNDO INITIAL TRUE.
DEFINE VARIABLE showLine        AS LOGICAL   NO-UNDO INITIAL TRUE.
DEFINE VARIABLE showWindow      AS LOGICAL   NO-UNDO INITIAL TRUE.

DEFINE VARIABLE parser AS HANDLE NO-UNDO.
RUN proparse/api/proparse.p PERSISTENT SET parser.
{proparse/api/proparse.i parser}

ASSIGN outfile = SESSION:TEMP-DIRECTORY + "/joanju_scanlister.txt":U.


ON "CLOSE":U OF THIS-PROCEDURE DO:
  APPLY "CLOSE":U TO parser.
  DELETE PROCEDURE THIS-PROCEDURE.
END.


RETURN.


PROCEDURE main:
/* Action program for this persistent procedure */
  DEFINE VARIABLE nodeType AS CHARACTER NO-UNDO.
  DEFINE VARIABLE parseNum AS INTEGER   NO-UNDO.
  OUTPUT TO VALUE(outfile).
  errorblock:
  DO ON ERROR UNDO, LEAVE:
    FILE-INFO:FILE-NAME = filename.
    parseNum = parserParseCreate("scan":U, FILE-INFO:FULL-PATHNAME).
    IF parserErrorGetStatus() <> 0 THEN DO:
      MESSAGE parserErrorGetText() VIEW-AS ALERT-BOX ERROR TITLE "Scanner error":T.
      LEAVE errorblock.
    END.
    currnode = parserGetHandle().
    parserParseGetTop(parseNum, currnode).
    nodeType = parserGetNodeType(currNode).
    DO WHILE nodetype <> "":
      RUN printline.
      nodeType = parserNodeNextSibling(currNode, currNode).
    END.
  END. /* errorblock */
  OUTPUT CLOSE.
  parserParseDelete(parseNum).
  IF showWindow THEN
    RUN proparse/utilities/resultswindow.p (outfile).
END PROCEDURE. /* main */


PROCEDURE printline:
/* Prints one node per line */
  PUT UNFORMATTED
    parserGetNodeType(currNode)
    "    ":U
    parserGetNodeText(currNode)
    .
  IF showLine OR showColumn THEN
    PUT UNFORMATTED  "    ":U STRING(parserGetNodeLine(currNode)).
  IF showColumn THEN
    PUT UNFORMATTED  ":":U STRING(parserGetNodeColumn(currNode)).
  PUT UNFORMATTED SKIP.
END PROCEDURE. /* printline */


PROCEDURE setDispAttr:
/* Call this before main to choose attributes to display */
  DEFINE INPUT PARAMETER attrList AS CHARACTER NO-UNDO.
  ASSIGN
    showColumn     = CAN-DO(attrList, "column":U)
    showLine       = CAN-DO(attrList, "linenum":U)
    .
END PROCEDURE.  


PROCEDURE setOutputFile:
/* Call this before main to choose a filename to output to,
   rather than use the result window */
  DEFINE INPUT PARAMETER p AS CHARACTER NO-UNDO.
  ASSIGN
    outfile = p
    showWindow = FALSE.
END PROCEDURE.


PROCEDURE setScanFile:
/* (required) Call this before main to set the scan filename */ 
  DEFINE INPUT PARAMETER p AS CHARACTER NO-UNDO.
  ASSIGN filename = p.
END PROCEDURE.


