/*
 * $VER: HuntDoc.rexx 1.2 (30.3.98)
 * © Copyright 1998 by Olivier Fabre (off@mygale.org)
 *
 * ARexx script for use with AmisED 1.10
 * Searches and displays the autodoc of the function
 * under the cursor.
 *
 * Usage: rx HuntDoc DIR=<Autodocs dir> [MAXDELAY=<max time in seconds>]
 *                   [SCREEN=<Name of public screen>]
 */

OPTIONS RESULTS

PARSE ARG 'DIR="' adocs '"' .
PARSE ARG "MAXDELAY=" maxdelay .
PARSE ARG "SCREEN=" screen .
IF adocs="" THEN PARSE ARG 'DIR=' adocs .
CALL RIGHT(adocs,1)
IF ~(result="/" | result=":") THEN adocs = adocs || '/'
IF adocs="/" | ~EXISTS(adocs) | (maxdelay~="" & DATATYPE(maxdelay)~="NUM") THEN DO
	'Message "Usage: HuntDoc DIR/K/A,MAXDELAY/K/N,SCREEN/K" 200'
	EXIT 20
END
IF maxdelay="" THEN maxdelay=99999
IF screen="" THEN screen = "AmisED" || SUBSTR(Address(), LASTPOS(".", Address()))

dbase = adocs || "HuntDoc.database"

GetWord
func = RESULT
IF func="" | DATATYPE(func)~="CHAR" THEN DO
	'Message " · This is not a function name." 50'
	EXIT 5
END
IF UPPER(LEFT(func, 4))="_LVO" THEN func = SUBSTR(func, 5)

'Message " · Hunting «'||func||'»..." 0'

IF ~SHOW('L','amigaguide.library') THEN DO
	IF ~ADDLIB('amigaguide.library', 0, -30, 0) THEN DO
		'Message' "Can't open amigaguide.library !" '50'
		EXIT 20
	END
END

CALL TIME()
PARSE VAR result start.h ':' start.m ':' start.s

found=0
IF OPEN("db", dbase, "R") THEN DO
	DO WHILE ~EOF("db")
		line = READLN("db")
		IF WORD(line,1) = func THEN DO
			found = 1
			PARSE VAR line . ' ' doc
			CALL TheEnd "db"
			LEAVE
		END
	END
	CLOSE("db")
END

IF ~found THEN DO
	ADDRESS COMMAND 'List' adocs || '~(#?.info|Autodocs|HuntDoc.database) LFORMAT=%s TO=t:HuntDoc.list'
	IF ~OPEN('list', 'T:HuntDoc.list', 'R') THEN DO
		'Message' "Error opening temporary file !" '50'
		EXIT 10
	END

	func2 = func||'()'
	DO WHILE ~EOF('list') & ~found
		doc = READLN('list')
		IF doc ~= "" THEN DO
			IF ~OPEN('doc', adocs||doc, 'R') THEN DO
				'Message' "Error opening" doc "!" '0'
				ITERATE
			END
			DO WHILE ~EOF('doc')
				CALL READLN('doc')
				IF UPPER(WORD(result,1))="@ENDNODE" THEN BREAK
				IF WORD(result,2)=func2 THEN DO
					found=1
					CALL TheEnd "ok"
					LEAVE
				END
			END
			CLOSE('doc')
		END
	END
	CLOSE('list')
	ADDRESS COMMAND 'delete t:HuntDoc.list quiet'
END

IF ~found THEN CALL TheEnd "no"
'Message' msg '50'
EXIT

TheEnd:
	PARSE ARG flag
	CALL TIME()
	PARSE VAR result stop.h ':' stop.m ':' stop.s
	deltaTime = (stop.h-start.h)*3600 + (stop.m-start.m)*60 + stop.s-start.s
	IF deltaTime < 0 THEN deltaTime = deltaTime+24*3600
	msg = '" · Autodoc for «'||func||'»'
	SELECT
		WHEN flag="db" THEN msg = msg 'found in database'
		WHEN flag="ok" THEN msg = msg 'found'
		OTHERWISE msg = msg 'not found !'
	END
	msg = msg '('||deltaTime 'seconds)"'
	'Message' msg '0'
	IF deltaTime >= maxdelay & flag="ok" THEN DO
		IF ~EXISTS(dbase) THEN ADDRESS COMMAND "echo >" || dbase "noline"
		IF OPEN('db', dbase, "A") THEN DO
			WRITELN('db', func doc)
			CLOSE('db')
		END
	END
	IF flag~="no" THEN ShowNode(screen, adocs||doc, func || '()', 0, 0)
	RETURN
