/* query_length.p

Find LENGTH() functions within current node which do not provide
the second "type" parameter: "CHARACTER," "RAW," or "COLUMN".
A query like this might be used as part of your effort to ensure
that your application is unicode ready.

In practice, you would want to change this so that it
reports each include file only once. ie: Create a temp-table
storing each filename/line-number combination only once, and then
report on that.

*/

DEFINE INPUT PARAMETER parser AS HANDLE NO-UNDO.
DEFINE INPUT PARAMETER nodehandle AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER programName AS CHARACTER NO-UNDO.

{proparse/api/proparse.i parser}

DEFINE VARIABLE outfile     AS CHARACTER NO-UNDO.
DEFINE VARIABLE tempfile    AS CHARACTER NO-UNDO.
DEFINE VARIABLE child       AS INTEGER   NO-UNDO.
DEFINE VARIABLE i1          AS INTEGER   NO-UNDO.
DEFINE VARIABLE numChildren AS INTEGER   NO-UNDO.
DEFINE VARIABLE numResults  AS INTEGER   NO-UNDO.
DEFINE VARIABLE result      AS INTEGER   NO-UNDO.
DEFINE VARIABLE havenode    AS LOGICAL   NO-UNDO.

ASSIGN outfile = SESSION:TEMP-DIRECTORY + "/joanju_qry_len.out".
ASSIGN tempfile = SESSION:TEMP-DIRECTORY + "/joanju_qry_len.tmp".

result = parserGetHandle().
child = parserGetHandle().
numResults = parserQueryCreate(nodehandle, "query_len", "LENGTH").

DO i1 = 1 TO numResults:
  parserQueryGetResult("query_len", i1, result).

  ASSIGN
    havenode = parserNodeFirstChild(result,child) <> ""
    numChildren = 0.
  DO WHILE havenode:
    ASSIGN
      numChildren = numChildren + 1
      havenode = parserNodeNextSibling(child,child) <> "".
  END.
  /* Expecting children: LEFTPAREN expression COMMA expression RIGHTPAREN
   * Anything less than 5 children means there's no "type" parameter.
   */
  IF numChildren < 5 THEN DO:
    OUTPUT TO VALUE(outfile) APPEND.
    PUT UNFORMATTED
      SKIP(1)
      "From " programName " : "
      parserGetNodeFilename(result)
      " : " parserGetNodeLine(result)
      SKIP.
    OUTPUT CLOSE.
    parserWriteNode(result, tempfile).
    OS-APPEND VALUE(tempfile) VALUE(outfile).
  END.

END.

OS-DELETE VALUE(tempfile).

RETURN.
