/*
**  $VER: Prototype.ged 1.004 (23 Sep 1995)  **
**
**        © 1995 Stefan Berendes
**
**  PROGRAMNAME:
**      Prototype.ged
**
**  FUNCTION:
**      Automatically generates a Prototype from a function call
**
**  $HISTORY:
**
**  23 Sep 1995 : 001.004 : now deletes everything except Local and Prototype
**  20 Sep 1995 : 001.003 :  need to FIX some vars
**  20 Sep 1995 : 001.002 :  set word delimiter (GUI SPC) to 32
**  17 Sep 1995 : 001.001 : initial release
*/

OPTIONS RESULTS                             /* enable return codes     */

if (LEFT(ADDRESS(), 6) ~= "GOLDED") then    /* not started by GoldEd ? */
    address 'GOLDED.DICE'

'LOCK CURRENT'                              /* lock GUI, gain access   */
OPTIONS FAILAT 6                            /* ignore warnings         */
SIGNAL ON SYNTAX                            /* ensure clean exit       */


/* ------------------------ INSERT YOUR CODE HERE: ------------------- */

'QUERY BUFFER VAR THISLINE'

if (THISLINE ~= "") then do

    firstbrace = POS( "(", THISLINE )


    if (firstbrace = 0) then do
        'REQUEST PROBLEM="Is this really a function declaration?"'
        'UNLOCK'
        EXIT 0
    end

    FUNCNAME = LEFT( THISLINE, firstbrace-1)    /* Funcion name     */
    FUNCNAME = COMPRESS( FUNCNAME)              /* remove blanks    */

    THISLINE = DELSTR( THISLINE, 1, firstbrace)    /* remove funcname & ( */

    lastbrace = LASTPOS( ")", THISLINE )
    if (lastbrace = 0) then do
        'REQUEST PROBLEM="Is this really a function declaration?"'
        'UNLOCK'
        EXIT 0
    end

    THISLINE = LEFT( THISLINE, lastbrace-1)         /* remove last ) */

    if ( COMPRESS(THISLINE) = "" ) then
        ARGSTR = "void"                         /* no arguments */
    else do
        colpos = 0
        ARGSTR = ""

        colpos = POS( "," ,THISLINE )
        do while ( colpos ~= 0)
            WORK = LEFT( THISLINE, colpos-1)   /* the part before the colon */
            WORK = STRIP( WORK)            /* remove leading & trailing blanks */

            if ( RIGHT( WORK, 1) = "]" ) THEN   /* array = pointer */
                array = TRUE
            else
                array = FALSE

            lastbra = LASTPOS( ")", WORK)
            lastast = LASTPOS( "*", WORK)
            lastspc = LASTPOS( " ", WORK)

            last = MAX( lastbra, lastast, lastspc)
            varstr = LEFT( WORK, last)
            varstr = STRIP( varstr)

            if ( array = TRUE ) THEN
                varstr = "(" || varstr || ") *"

            ARGSTR = ARGSTR || varstr || ", "

            THISLINE = DELSTR( THISLINE, 1, colpos)
            colpos = POS(",", THISLINE )
        end   /* do */

        WORK = STRIP( THISLINE)            /* remove leading & trailing blanks */

        if ( RIGHT( WORK, 1) = "]" ) THEN   /* array = pointer */
            array = TRUE
        else
            array = FALSE

        lastbra = LASTPOS( ")", WORK)
        lastast = LASTPOS( "*", WORK)
        lastspc = LASTPOS( " ", WORK)

        last = MAX( lastbra, lastast, lastspc)
        varstr = LEFT( WORK, last)
        varstr = STRIP( varstr)

        if ( array = TRUE ) THEN
            varstr = "(" || varstr || ") *"

        ARGSTR = ARGSTR || varstr

        'FIX VAR=ARGSTR'
    end   /* not "void" */

    'PING 0'
    'UP'

    'QUERY BUFFER VAR RETVAL'

    RETVAL = STRIP( RETVAL)
    'FIX VAR=RETVAL'

    'FIND FIRST STRING="$PROTOTYPES:"'
    IF RC ~= 0 THEN DO
        'REQUEST PROBLEM="No $PROTOTYPES: mark"'
        'UNLOCK'
        EXIT
    END

    'FOLD OPEN=TRUE'
    'QUERY ABSLINE VAR BEGINPROTO'
    'QUERY FOLDB VAR FOLDEND'
    'FIND NEXT STRING="'|| FOLDEND ||'"'
    'QUERY ABSLINE VAR ENDPROTO'

    'FIND FIRST STRING='|| FUNCNAME
    'QUERY ABSLINE VAR CURLINE'

    DO WHILE CURLINE <= BEGINPROTO
        'FIND NEXT STRING='|| FUNCNAME
        'QUERY ABSLINE VAR CURLINE'
    END

    IF CURLINE < ENDPROTO THEN DO      /* function Prototype does already exist */
        'QUERY SPC VAR SPACE'
        'GUI SPC=32'
        'FIRST'
        'QUERY WORD VAR ACTWORD'
        if (ACTWORD = "Local") | (ACTWORD = "Prototype") THEN
            'NEXT'
        'DELETE EOL'
        'TEXT T="'|| RETVAL || ' ' || FUNCNAME || '( ' || ARGSTR || ' );"'
        insertedline = FALSE
        'FIX VAR=SPACE'
        'GUI SPC="' || SPACE || '"'
    END
    else DO
        'GOTO LINE ' || (BEGINPROTO + 2)
        'INSERT LINE'
        insertedline = TRUE

        'REQUEST BODY="Prototype ' || FUNCNAME || '() as ?" BUTTON="_global|_local|_none"'

        if (RC = 0) then do

            if (RESULT = 1) then
                PROTO = "Prototype "
            else if (RESULT = 2) then
                PROTO = "Local     "
            else
                PROTO = ""

            'TEXT T="'PROTO || RETVAL || ' ' || FUNCNAME || '( ' || ARGSTR || ' );"'
        end
    END

    'FOLD OPEN=FALSE'
    'PONG 0'
    IF insertedline = TRUE THEN
        'DOWN'

/* ---------------------------- END OF YOUR CODE --------------------- */

'UNLOCK' /* VERY important: unlock GUI */
EXIT

SYNTAX:

'REQUEST PROBLEM="Sorry, error line" SIGL ":" ERRORTEXT(RC) ":-("'
'UNLOCK'
EXIT

