Files
harbour-core/harbour/utils/hbdoc/genng.prg
Viktor Szakats 5dcbeffc68 2006-06-22 00:25 UTC+0100 Viktor Szakats (viktor.szakats syenar.hu)
* harbour/include/common.ch
   * harbour/source/debug/dbghelp.prg
   * harbour/source/debug/dbgmenu.prg
   * harbour/source/debug/dbgtarr.prg
   * harbour/source/debug/dbgtobj.prg
   * harbour/source/debug/dbgwa.prg
   * harbour/source/debug/debugger.prg
   * harbour/source/rdd/dbupdat.prg
   * harbour/source/rtl/achoice.prg
   * harbour/source/rtl/checkbox.prg
   * harbour/source/rtl/dbedit.prg
   * harbour/source/rtl/getsys.prg
   * harbour/source/rtl/listbox.prg
   * harbour/source/rtl/persist.prg
   * harbour/source/rtl/pushbtn.prg
   * harbour/source/rtl/radiobtn.prg
   * harbour/source/rtl/tbcolumn.prg
   * harbour/source/rtl/tbrowse.prg
   * harbour/source/rtl/tclass.prg
   * harbour/source/rtl/teditor.prg
   * harbour/source/rtl/tget.prg
   * harbour/source/rtl/tgetlist.prg
   * harbour/source/rtl/tlabel.prg
   * harbour/source/rtl/treport.prg
   * harbour/utils/hbdoc/genchm.prg
   * harbour/utils/hbdoc/genhtm.prg
   * harbour/utils/hbdoc/genng.prg
   * harbour/utils/hbdoc/genos2.prg
   * harbour/utils/hbdoc/genrtf.prg
   * harbour/utils/hbdoc/gentrf.prg
   * harbour/utils/hbdoc/html.prg
   * harbour/utils/hbdoc/ng.prg
   * harbour/utils/hbdoc/os2.prg
   * harbour/utils/hbdoc/rtf.prg
   * harbour/utils/hbmake/checks.prg
   * harbour/utils/hbmake/hbmake.prg
   * harbour/utils/hbmake/hbmutils.prg
   * harbour/utils/hbmake/radios.prg
   * harbour/utils/hbtest/rt_hvm.prg
     + HB_SYMBOL_UNUSED() added for .prg code. It can suppress unused
       var warnings where applicable. The code won't generate any final
       pcodes, so it won't cause overhead. The only current downside
       is that it cannot be used inside codeblocks.
     ! Fixed a number (>200) of declared but unused variable /w2 error.
       All parts were scanned and fixed (except contrib).
       Note that there are several false "unreachable code" warnings,
       and there are still quite a few unused var warnings inside
       codeblocks. After fixing these /w2 switch could be added to
       the standard build process to maintain code quality.
2006-06-21 22:25:00 +00:00

1777 lines
60 KiB
Plaintext

/*
* $Id$
*/
/*
* Harbour Project source code:
* GENNG support module for hbdoc document Extractor
*
* Copyright 2000 Luiz Rafael Culik <culik@sl.conex.net>
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#include "directry.ch"
#include "fileio.ch"
#include "inkey.ch"
#include 'common.ch'
#include 'hbdocdef.ch'
// output lines on the screen
#define INFILELINE 10
#define MODULELINE 12
#define LINELINE 14
#define ERRORLINE 20
#define LONGLINE 600
#define LONGONELINE 66
MEMVAR aDirlist
MEMVAR aDocInfo
STATIC aAlso
STATIC aFiTable := {}
STATIC aSiTable := {}
STATIC lIsTable := .F.
STATIC nCommentLen
STATIC lEof
STATIC aFoiTable := {}
STATIC atiTable := {}
STATIC nNumTableItems := 0
STATIC aCurDoc := {}
STATIC nCurDoc := 1
STATIC aColorTable := { { 'aqua', '1B' }, { 'black', '10' }, { 'fuchia', '1D' }, { 'grey', '18' }, { 'green', '12' }, { 'lime', '1A' }, { 'maroon', '16' }, { 'navy', '19' }, { 'olive', '12' }, { 'purple', '15' }, { 'red', '1C' }, { 'silver', '17' }, { 'teal', '13 ' }, { 'white', '1F' }, { 'yellow', '1E' } }
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function ProcessiNg()
*+
*+ Called from ( hbdoc.prg ) 2 - function main()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION ProcessiNg()
//
// Copyright (C) 2000 Luiz Rafael Culik
//
// Purpose: Process each of the files in the directory
// and Gerenate norton guide source code
// Modification History:
// Version Date Who Notes
// V1.00 1/16/2000 LRC Initial Version
//
// Calling parameters: None
//
// Notes: None
// -
// LOCAL variables:
LOCAL i
LOCAL j
LOCAL nFiles := LEN( aDirList )
LOCAL lDoc
LOCAL cBuffer
LOCAL nEnd
LOCAL nCount
LOCAL nAlso
LOCAL lData := .F.
LOCAL lMethod := .F.
LOCAL lIsDataLink := .F.
LOCAL lIsMethodLink := .F.
LOCAL cBar := "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
LOCAL nMode
LOCAL cFuncName
LOCAL cOneLine
LOCAL cCategory
LOCAL cFileName
LOCAL nLineCnt
LOCAL cSeeAlso
LOCAL cTemp
LOCAL lPar
LOCAL cChar
LOCAL lBlankLine := .F. // Blank line enCountered and sent out
LOCAL lAddBlank := .F. // Need to add a blank line if next line is not blank
LOCAL oNgi
LOCAL nReadHandle
LOCAL cDoc := DELIM + "DOC" + DELIM // DOC keyword
LOCAL cEnd := DELIM + "END" + DELIM // END keyword
LOCAL cFunc := DELIM + "FUNCNAME" + DELIM // FUNCNAME keyword
LOCAL cCat := DELIM + "CATEGORY" + DELIM // CATEGORY keyword
LOCAL cOne := DELIM + "ONELINER" + DELIM // ONELINER keyword
LOCAL cSyn := DELIM + "SYNTAX" + DELIM // SYNTAX keyword
LOCAL cArg := DELIM + "ARGUMENTS" + DELIM // ARGUMENTS keyword
LOCAL cRet := DELIM + "RETURNS" + DELIM // RETURNS keyword
LOCAL cDesc := DELIM + "DESCRIPTION" + DELIM // DESCRIPTION keyword
LOCAL cExam := DELIM + "EXAMPLES" + DELIM // EXAMPLES keyword
LOCAL cSee := DELIM + "SEEALSO" + DELIM // SEEALSO keyword
LOCAL cInc := DELIM + "INCLUDE" + DELIM // INCLUDE keyword
LOCAL cComm := DELIM + "COMMANDNAME" + DELIM // COMMAND keyword
LOCAL cCompl := DELIM + "COMPLIANCE" + DELIM
LOCAL cTest := DELIM + 'TESTS' + DELIM
LOCAL cStatus := DELIM + 'STATUS' + DELIM
LOCAL cPlat := DELIM + 'PLATFORMS' + DELIM
LOCAL cFiles := DELIM + 'FILES' + DELIM
LOCAL cSubCode := DELIM + 'SUBCODE' + DELIM
LOCAL cFunction := DELIM + 'FUNCTION' + DELIM
LOCAL cConstruct := DELIM + 'CONSTRUCTOR' + DELIM
LOCAL cDatalink := DELIM + 'DATALINK' + DELIM
LOCAL cDatanolink := DELIM + 'DATANOLINK' + DELIM
LOCAL cMethodslink := DELIM + 'METHODSLINK' + DELIM
LOCAL cMethodsNolink := DELIM + 'METHODSNOLINK' + DELIM
LOCAL cData := DELIM + "DATA" + DELIM
LOCAL cMethod := DELIM + 'METHOD' + DELIM
LOCAL cClassDoc := DELIM + "CLASSDOC" + DELIM
lData := .F.
lMethod := .F.
lIsDataLink := .F.
lIsMethodLink := .F.
lPar := .T.
//
// Entry Point
//
// Put up information labels
@ INFILELINE, 20 SAY "Extracting: "
@ MODULELINE, 20 SAY "Documenting: "
// loop through all of the files
FOR i := 1 TO nFiles
afiTable := {}
asiTable := {}
// Open file for input
nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 4 )
nReadHandle := FT_FUSE( aDirList[ i, F_NAME ] )
@ INFILELINE, 33 CLEAR TO INFILELINE, MAXCOL()
@ INFILELINE, 33 SAY PAD( aDirList[ i, F_NAME ], 47 )
@ MODULELINE, 33 CLEAR TO LINELINE, MAXCOL()
@ LINELINE, 27 SAY "Line:"
nLineCnt := 0
IF nReadHandle < 0
WRITE_ERROR( "Can't open file: (Dos Error " + STR( FERROR() ) + ")",,,, aDirList[ i, F_NAME ] )
@ ERRORLINE, 0 CLEAR TO ERRORLINE, MAXCOL()
@ ERRORLINE, 20 SAY "Can't open file: (Dos Error " + STR( FERROR() ) + ") File=" + aDirList[ i, F_NAME ]
LOOP
ENDIF
lEof := .F.
lDoc := .F.
// First find the author
ReadFromTop( nReadHandle )
DO WHILE .NOT. lEof
// Read a line
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
cBuffer := STRTRAN( cBuffer, CHR( 10 ), "" )
nLineCnt ++
IF nLineCnt % 10 = 0
@ LINELINE, 33 SAY STR( nLineCnt, 5, 0 )
ENDIF
// check to see if we are in doc mode or getting out of doc mode
IF AT( cDoc, cBuffer ) > 0 .OR. AT( cClassDoc, cBuffer ) > 0
IF lDoc
WRITE_ERROR( cDoc + " enCountered during extraction of Doc" ;
+ " at line" + STR( nLinecnt, 5, 0 ),,,, aDirList[ i, F_NAME ] )
ENDIF
lDoc := .T.
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), ;
nCommentLen ) )
nLineCnt ++
cCategory := cFuncName := cSeeAlso := ""
nMode := D_IGNORE
ELSEIF AT( cEnd, cBuffer ) > 0
nCurDoc ++
IF .NOT. lDoc
WRITE_ERROR( cEnd + " enCountered outside of Doc area at line" ;
+ STR( nLinecnt, 5, 0 ),,,, aDirList[ i, F_NAME ] )
ELSE
// Add a new entry to our list of files
IF EMPTY( cCategory )
WRITE_ERROR( "Blank Category",,,, aDirList[ i, F_NAME ] )
cCategory := "Unknown"
ENDIF
IF EMPTY( cFuncName )
WRITE_ERROR( "Blank Function Name",,,, aDirList[ i, F_NAME ] )
cFuncName := "Unknown"
ENDIF
AADD( aDocInfo, { cCategory, cFuncName, cOneLine, cFileName } )
// Now close down this little piece
lDoc := .F.
IF .NOT. EMPTY( cSeeAlso )
FOR nAlso := 1 TO LEN( aalso )
IF nAlso == 1
oNgi:WriteLink( "!seealso: " + aalso[ nAlso ] )
ELSE
oNgi:WriteLink( "," + aalso[ nAlso ] )
ENDIF
NEXT
oNgi:WritePar( CRLF )
ENDIF
oNgi:Close()
nMode := D_IGNORE
ENDIF
@ MODULELINE, 33 CLEAR TO MODULELINE, MAXCOL()
ENDIF
// Act on the input
IF lDoc
// 1) function name
IF AT( cFunc, cBuffer ) > 0 .OR. AT( cComm, cBuffer ) > 0 .OR. AT( cSubCode, cBuffer ) > 0
cBuffer := ReadLN( @lEof )
nLineCnt ++
// Save the function name
cFuncName := ALLTRIM( SUBSTR( cBuffer, nCommentLen ) )
@ MODULELINE, 33 CLEAR TO MODULELINE, MAXCOL()
@ MODULELINE, 33 SAY cFuncName
nMode := D_NORMAL
// Open a new file
IF AT( "FT_", cFuncName ) > 0
cTemp := upper(SUBSTR( cFuncName, 4 ))
ELSE
cTemp := upper(cFuncName)
ENDIF
IF ( nEnd := AT( "(", cTemp ) ) > 0
cTemp := LEFT( cTemp, nEnd - 1 )
ENDIF
cFileName := ""
// Strip off any other non-alphabetic/numeric characters
FOR j := 1 TO LEN( cTemp )
cChar := SUBSTR( cTemp, j, 1 )
IF ( cChar >= "0" .AND. cChar <= "9" ) .OR. ;
( cChar >= "A" .AND. cChar <= "Z" ) .OR. cChar = "_"
cFileName += cChar
ENDIF
NEXT
// See if file name is present already. If so then modify
cFileName := LEFT( cFileName, 21 )
nEnd := 1
nCount := 0
DO WHILE nEnd > 0
nEnd := ASCAN( aDocInfo, { | a | a[ 4 ] == cFileName + ".ngi" } )
IF nEnd > 0
// This will break if there are more than 10 files with the same first
// seven characters. We take our chances.
IF LEN( cFileName ) = 21
cFileName := STUFF( cFileName, 21, 1, STR( nCount, 1, 0 ) )
ELSE
cFileName += STR( nCount, 1, 0 )
ENDIF
nCount ++
ENDIF
ENDDO
// Add on the extension
cFileName := LEFT( cFileName, 21 ) + ".ngi"
oNgi := TNortonGuide():new( "ngi\" + cFileName )
IF oNgi:nHandle < 1
? "Error creating", cFileName, ".ngi"
WRITE_ERROR( "Error creating",,,, cFileName + ".ngi" )
ENDIF
// 2) Category
ELSEIF ( AT( cdata, cBuffer ) > 0 .AND. GetItem( cBuffer, nCurdoc ) ) .OR. ( AT( cmethod, cBuffer ) > 0 .AND. GetItem( cBuffer, nCurdoc ) )
IF AT( cdata, cBuffer ) > 0
lData := .T.
lMethod := .F.
ELSEIF AT( cmethod, cBuffer ) > 0
lMethod := .T.
lData := .F.
ENDIF
cBuffer := ReadLN( @lEof )
nLineCnt ++
// Save the function name
cFuncName := ALLTRIM( SUBSTR( cBuffer, nCommentLen ) )
@ MODULELINE, 33 CLEAR TO MODULELINE, MAXCOL()
@ MODULELINE, 33 SAY cFuncName
nMode := D_NORMAL
// endif
ELSEIF AT( cCat, cBuffer ) > 0
cBuffer := ReadLN( @lEof )
nLineCnt ++
// get the category
cCategory := ALLTRIM( SUBSTR( cBuffer, nCommentLen ) )
// 3) One line description
ELSEIF AT( cOne, cBuffer ) > 0
cBuffer := ReadLN( @lEof )
nLineCnt ++
cOneLine := ALLTRIM( SUBSTR( cBuffer, nCommentLen ) )
IF LEN( cOneLine ) > LONGONELINE
WRITE_ERROR( "OneLine", cOneLine, nLineCnt, LONGONELINE, ;
aDirList[ i, F_NAME ] )
ENDIF
nMode := D_ONELINE
// Now start writing out what we know
IF lData
oNgi:WriteJumpTitle( LEFT( cFilename, AT( '.', cFilename ) - 1 ) + cFuncName, "Data " + cFuncName )
ELSEIF lMethod
oNgi:WriteJumpTitle( LEFT( cFilename, AT( '.', cFilename ) - 1 ) + cFuncName, "Method " + cFuncName )
ELSE
IF LEN( cFuncname ) < 22
oNgi:WriteTitle( PAD( cFuncName, 21 ) + cOneLine, cFuncName )
ELSE
oNgi:WriteTitle( PAD( cFuncName, 24 ) + cOneLine, cFuncName )
ENDIF
oNgi:WritePar( cOneLine )
oNgi:WritePar( cBar )
// 4) all other stuff
ENDIF
ELSE
IF AT( cSyn, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
oNgi:WriteParBold( " Syntax" )
nMode := D_SYNTAX
lAddBlank := .T.
ENDIF
ELSEIF AT( cConstruct, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
oNgi:WriteParBold( " Constructor syntax" )
nMode := D_SYNTAX
lAddBlank := .T.
ENDIF
ELSEIF AT( cArg, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lBlankLine
oNgi:WriteParBold( " Arguments" )
ENDIF
nMode := D_ARG
lAddBlank := .T.
ENDIF
ELSEIF AT( cRet, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
// IF !lBlankLine
// oNgi:WritePar( "" )
// ENDIF
oNgi:WriteParBold( " Returns" )
nMode := D_ARG
lAddBlank := .T.
ENDIF
ELSEIF AT( cDesc, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
oNgi:WriteParBold( " Description" )
nMode := D_DESCRIPTION
lAddBlank := .T.
lPar := .T.
ENDIF
ELSEIF AT( cdatalink, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lBlankLine
oNgi:WritePar( "" ) //:endpar()
ENDIF
oNgi:WriteParBold( " Data" )
nMode := D_DATALINK
lAddBlank := .T.
lIsDataLink := .T.
ENDIF
ELSEIF AT( cDatanolink, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lIsDataLink
oNgi:WriteParBold( " Data" )
ENDIF
nMode := D_NORMAL
lAddBlank := .T.
lPar := .T.
ENDIF
ELSEIF AT( cMethodslink, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
oNgi:WriteParBold( " Method" )
nMode := D_METHODLINK
lAddBlank := .T.
lIsMethodLink := .T.
ENDIF
ELSEIF AT( cMethodsnolink, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lIsMethodLink
oNgi:WriteParBold( " Methods" )
ENDIF
nMode := D_NORMAL
lAddBlank := .T.
lPar := .T.
ENDIF
ELSEIF AT( cExam, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lBlankLine
// oNgi:WritePar( "" )
oNgi:WriteParBold( " Examples" )
ENDIF
nMode := D_EXAMPLE
lAddBlank := .T.
ENDIF
ELSEIF AT( cTest, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lBlankLine
oNgi:WriteParBold( " Tests" )
ENDIF
nMode := D_EXAMPLE
lAddBlank := .T.
lPar := .t.
ENDIF
ELSEIF AT( cStatus, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
nMode := D_STATUS
ENDIF
ELSEIF AT( cCompl, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lBlankLine
oNgi:WriteParBold( " Compliance" )
ENDIF
nMode := D_COMPLIANCE
lAddBlank := .T.
lPar := .t.
ENDIF
ELSEIF AT( cPlat, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lBlankLine
oNgi:WriteParBold( " Platforms" )
ENDIF
nMode := D_NORMAL
lAddBlank := .T.
lPar := .t.
ENDIF
ELSEIF AT( cFiles, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lBlankLine
oNgi:WriteParBold( " Files" )
ENDIF
nMode := D_NORMAL
lAddBlank := .T.
lPar := .t.
ENDIF
ELSEIF AT( cFunction, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
// IF !lBlankLine
// oNgi:WritePar( "" )
// ENDIF
oNgi:WriteParBold( " Functions" )
lPar := .t.
nMode := D_NORMAL
lAddBlank := .T.
ENDIF
ELSEIF AT( cSee, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
nMode := D_SEEALSO
ENDIF
ELSEIF AT( cInc, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
nMode := D_INCLUDE
ENDIF
// All other input is trimmed of comments and sent out
ELSE
// translate any \$ into $
cBuffer := STRTRAN( cBuffer, "\" + DELIM, DELIM )
IF nMode = D_SYNTAX
IF LEN( cBuffer ) > LONGLINE
WRITE_ERROR( "Syntax", cBuffer, nLineCnt, ;
LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
IF AT( "<par>", cBuffer ) > 0
STRTRAN( cBuffer, "<par>", '' )
STRTRAN( cBuffer, "</par>", '' )
cBuffer := STRTRAN( cBuffer, SPACE( 6 ), "" )
cbuFfer := '<par><b>' + cBuffer + '</b></par>'
ENDIF
procngdesc( cbuffer, oNgi, "Syntax" )
ELSEIF nMode = D_ARG
IF LEN( cBuffer ) > LONGLINE
WRITE_ERROR( "Arguments", cBuffer, nLineCnt, ;
LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
procngdesc( cbuffer, oNgi, "Arguments" )
ELSEIF nMode = D_EXAMPLE
IF LEN( cBuffer ) > LONGLINE
WRITE_ERROR( "General", cBuffer, nLineCnt, ;
LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
ProcNgDesc( cBuffer, oNgi, "Example" )
ELSEIF nMode = D_DESCRIPTION
IF LEN( cBuffer ) > LONGLINE
WRITE_ERROR( "General", cBuffer, nLineCnt, ;
LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
ProcNgDesc( cBuffer, oNgi, "Description" )
ELSEIF nMode = D_NORMAL
IF LEN( cBuffer ) > LONGLINE
WRITE_ERROR( "General", cBuffer, nLineCnt, ;
LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
ProcNgDesc( cBuffer, oNgi )
ELSEIF nMode = D_COMPLIANCE
IF LEN( cBuffer ) > LONGLINE
WRITE_ERROR( "General", cBuffer, nLineCnt, ;
LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
ProcNgDesc( cBuffer, oNgi, "Compliance" )
ELSEIF nMode = D_SEEALSO
IF .NOT. EMPTY( cBuffer )
cSeeAlso := ProcNgiAlso( StripFiles( ALLTRIM( cBuffer ) ) )
ENDIF
ELSEIF nMode = D_INCLUDE
// read next line
ELSEIF nMode = D_STATUS
IF !EMPTY( cBuffer )
oNgi:WriteParBold( "Status" )
ENDIF
ProcStatusNg( oNgi, cBuffer )
ELSE
// unknown data from somewhere
WRITE_ERROR( "Unknown Data Type " + cBuffer,, ;
nLineCnt, ;
LONGONELINE, aDirList[ i, F_NAME ] )
ENDIF
ENDIF
ENDIF
ENDIF
ENDDO
// Close down the input file
FT_FUSE()
nCurDoc := 1
aCurDoc := {}
NEXT
RETURN Nil
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function ProcNgiAlso()
*+
*+ Called from ( genhtm2.prg ) 1 - function processwww()
*+ ( genng.prg ) 1 - function processing()
*+ ( genng1.prg ) 1 - function processing()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION ProcNgiAlso( cSeealso )
aAlso := {}
aAlso := ListAsArray( cSeealso, "," )
RETURN aAlso
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function ProcNgiInput()
*+
*+ Called from ( hbdoc.prg ) 1 - function main()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION ProcNgiInput()
LOCAL aFiles := {}
LOCAL aFuncs := {}
LOCAL aFuncsam := {}
LOCAL aFuncsn_ := {}
LOCAL acfiles := {}
LOCAL aComms := {}
LOCAL cName
LOCAL cT
LOCAL cTs
LOCAL cFile
LOCAL x
LOCAL nPos
LOCAL nAlso
LOCAL y
LOCAL nXhandle := FCREATE( 'ngi\funcam.txt' )
LOCAL nYhandle := FCREATE( 'ngi\funcn_.txt' )
LOCAL xY := "!Short:"
LOCAL cSee := "!seealso:"
LOCAL lEof := .f.
LOCAL cBuffer
SET CONSOLE ON
afiles := DIRECTORY( "ngi\*.*" )
ASORT( aFiles,,, { | x, y | UPPER( x[ 1 ] ) < UPPER( y[ 1 ] ) } )
FOR x := 1 TO LEN( aFiles )
FT_FUSE( "ngi\" + aFiles[ x, 1 ] )
WHILE !lEof
cBuffer := ReadLn( @lEof )
cBuffer := STRTRAN( cBuffer, CHR( 10 ), "" )
cT := LEFT( cBuffer, 7 )
IF xY == cT
cName := SUBSTR( cBuffer, 9 )
cName := SUBSTR( cName, 1, 21 )
nPos := AT( "()", cName )
IF nPos > 0
AADD( aFuncs, cName )
IF LEFT( cname, 1 ) < "N" .and. LEFT( cname, 1 ) < "n"
AADD( afuncsam, aFiles[ x, 1 ] )
ELSE
AADD( afuncsn_, aFiles[ x, 1 ] )
ENDIF
ELSE
AADD( aComms, cName )
AADD( aCfiles, aFiles[ x, 1 ] )
ENDIF
ENDIF
END
lEof := .f.
FT_FUSE()
NEXT
@ INFILELINE, 21 SAY "Extracting: "
FOR x := 1 TO LEN( afuncsam )
cFile := afuncsam[ x ]
@ INFILELINE, 33 SAY PAD( cfile, 47 )
FT_FUSE( "ngi\" + cFile )
aAlso := {}
WHILE !lEof
cBuffer := ReadLn( @lEof )
cBuffer := STRTRAN( cbuffer, CHR( 10 ), '' )
cT := LEFT( cBuffer, 7 )
IF xY == cT
cName := SUBSTR( cBuffer, 9 )
cName := SUBSTR( cName, 1, AT( ' ', cName ) - 1 )
ENDIF
cTs := SUBSTR( cBuffer, 1, 9 )
IF UPPER( cSee ) == UPPER( cTs )
cTs := SUBSTR( cBuffer, 11 )
aAlso := procngialso2( cTs )
cBuffer := ''
ENDIF
FWRITE( nXhandle, cBuffer + pCRLF )
ENDDO
IF LEN( aAlso ) > 0
cBuffer := "!SeeAlso: "
FOR nAlso := 1 TO LEN( aAlso )
cBuffer += aAlso[ nalso ] + " "
NEXT
ENDIF
// cBuffer:=strtran(cBuffer,chr(10),"")
FWRITE( nXhandle, cBuffer + pCRLF )
lEof := .f.
aalso := {}
FT_FUSE()
NEXT
FCLOSE( nXhandle )
FOR x := 1 TO LEN( AFUNCSN_ )
cFile := afuncsn_[ x ]
@ INFILELINE, 33 SAY PAD( cfile, 47 )
FT_FUSE( "ngi\" + cFile )
aAlso := {}
WHILE !lEof
cBuffer := ReadLn( @lEof )
cBuffer := STRTRAN( cbuffer, CHR( 10 ), '' )
cT := LEFT( cBuffer, 7 )
IF xY == cT
cName := SUBSTR( cBuffer, 9 )
cName := SUBSTR( cName, 1, AT( ' ', cName ) - 1 )
ENDIF
// if at(chr(10),cBuffer)>0
// cBuffer:=Strtran(cbuffer,chr(10),'')
// endif
cTs := SUBSTR( cBuffer, 1, 9 )
IF UPPER( cSee ) == UPPER( cTs )
cTs := SUBSTR( cBuffer, 11 )
aAlso := procngialso2( cTs )
cBuffer := ''
ENDIF
// cBuffer:=strtran(cBuffer,chr(10),"")
FWRITE( nYhandle, cBuffer + pCRLF )
ENDDO
IF LEN( aAlso ) > 0
cBuffer := "!SeeAlso: "
FOR nAlso := 1 TO LEN( aAlso )
cBuffer += aAlso[ nalso ] + " "
NEXT
ENDIF
// cBuffer:=strtran(cBuffer,chr(10),"")
FWRITE( nYhandle, cBuffer + pCRLF )
lEof := .f.
aAlso := {}
lEof := .f.
FT_FUSE()
NEXT
FCLOSE( nYhandle )
lEof := .f.
y := FCREATE( 'ngi\comm.txt' )
ASORT( acfiles )
FOR x := 1 TO LEN( acfiles )
cFile := acfiles[ x ]
IF UPPER( LEFT( cFile, AT( '.', cFile ) - 1 ) ) <> "LICENSE" ;
.AND. UPPER( LEFT( cFile, AT( '.', cFile ) - 1 ) ) <> "OVERVIEW" ;
.AND. UPPER( LEFT( cFile, AT( '.', cFile ) - 1 ) ) <> "COMPILEROPTIONS" ;
.AND. UPPER( LEFT( cFile, AT( '.', cFile ) - 1 ) ) <> "GNULICENSE" ;
.AND. UPPER( LEFT( cFile, AT( '.', cFile ) - 1 ) ) <> "GNULICENSEPART2";
.AND. UPPER( LEFT( cFile, AT( '.', cFile ) - 1 ) ) <> "STRONGTYPING";
.AND. UPPER( LEFT( cFile, AT( '.', cFile ) - 1 ) ) <> "THEGARBAGECOLLECTOR" ;
.AND. UPPER( LEFT( cFile, AT( '.', cFile ) - 1 ) ) <> "THEIDLESTATES"
@ INFILELINE, 33 SAY PAD( cfile, 47 )
FT_FUSE( "ngi\" + acfiles[ x ] )
aAlso := {}
WHILE !lEof
cBuffer := ReadLn( @lEof )
cT := LEFT( cBuffer, 7 )
cBuffer := STRTRAN( cbuffer, CHR( 10 ), '' )
IF xY == cT
cName := SUBSTR( cBuffer, 9 )
cName := SUBSTR( cName, 1, AT( ' ', cName ) - 1 )
ENDIF
cTs := SUBSTR( cBuffer, 1, 9 )
// if at(chr(10),cBuffer)>0
// cBuffer:=Strtran(cbuffer,chr(10),'')
// endif
IF UPPER( cSee ) == UPPER( cTs )
cTs := SUBSTR( cBuffer, 11 )
aAlso := procngialso2( cTs )
cBuffer := ''
ENDIF
// cBuffer:=strtran(cBuffer,chr(10),"")
FWRITE( y, cBuffer + pCRLF )
ENDDO
IF LEN( aAlso ) > 0
cBuffer := "!SeeAlso: "
FOR nAlso := 1 TO LEN( aAlso )
cBuffer += aAlso[ nalso ]
NEXT
FWRITE( y, cBuffer + pCRLF )
ENDIF
ENDIF
lEof := .f.
aAlso := {}
FT_FUSE()
NEXT
lEof := .f.
FCLOSE( y )
RETURN NIL
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function procngialso2()
*+
*+ Called from ( genng.prg ) 3 - function procngiinput()
*+ ( genng1.prg ) 3 - function procngiinput()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION procngialso2( cSeealso )
LOCAL nPos
LOCAL aAlso := {}
LOCAL cTemp := ''
LOCAL xAlso := {}
LOCAL hPos := 0
aAlso := {}
xAlso := ListAsArray2( cSeeAlso )
FOR hPos := 1 TO LEN( xAlso )
cTemp := SUBSTR( xAlso[ hPos ], 2, 1 )
IF cTemp >= "A" .AND. cTemp < "_" .or. cTemp >= "a" .and. cTemp <= "z"
nPos := AT( "()", xAlso[ hPos ] )
IF nPos > 0
AADD( aAlso, "funcam.ngo:" + ALLTRIM( xAlso[ hPos ] ) + ' ' )
ELSEIF nPos = 0 .AND. UPPER( xAlso[ hPos ] ) <> "LICENSE" .AND. UPPER( xAlso[ hPos ] ) <> "OVERVIEW" .AND. !EMPTY( xAlso[ hPos ] )
AADD( aAlso, "Comm.ngo:" + ALLTRIM( xAlso[ hPos ] ) + ' ' )
ENDIF
ENDIF
NEXT
RETURN aAlso
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function ProcStatusng()
*+
*+ Called from ( genhtm2.prg ) 1 - function processwww()
*+ ( genng.prg ) 1 - function processing()
*+ ( genng1.prg ) 1 - function processing()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION ProcStatusng( nWriteHandle, cBuffer )
IF LEN( ALLTRIM( cBuffer ) ) > 1
nWriteHandle:WritePar( cBuffer )
ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "R"
nWriteHandle:WritePar( " Ready" )
ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "S"
nWriteHandle:WritePar( " Started" )
ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "C"
nWriteHandle:WritePar( " Clipper" )
ELSE
nWriteHandle:WritePar( " Not Started" )
ENDIF
RETURN nil
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function GenNgTable()
*+
*+ Called from ( genng.prg ) 1 - function procngdesc()
*+ ( genng1.prg ) 1 - function procngdesc()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION GenNgTable( oNgi )
LOCAL x
LOCAL nMax
LOCAL nSpace
LOCAL lCar := .f.
LOCAL nMax2
LOCAL nSpace2
LOCAL nPos1
LOCAL nPos2
LOCAL nPos
LOCAL aLensFItem := {}
LOCAL aLensSItem := {}
LOCAL cMaxItem := ''
LOCAL nmax3
LOCAL nmax4
LOCAL npos3
LOCAL npos4
LOCAL nSpace3
LOCAL nSpace4
LOCAL aLensTItem := {}
LOCAL aLensfoItem := {}
FOR X := 1 TO LEN( afitable )
IF !EMPTY( afiTable[ x ] )
AADD( aLensFItem, LEN( afiTable[ x ] ) )
END
NEXT
FOR X := 1 TO LEN( asiTable )
IF !EMPTY( asiTable[ x ] )
AADD( aLensSItem, LEN( asiTable[ x ] ) )
END
NEXT
IF LEN( afoitable ) > 0
FOR X := 1 TO LEN( afoitable )
IF !EMPTY( afoiTable[ x ] )
AADD( aLensfoItem, LEN( afoiTable[ x ] ) )
END
NEXT
ENDIF
IF LEN( atitable ) > 0
FOR X := 1 TO LEN( atitable )
IF !EMPTY( atiTable[ x ] )
AADD( aLenstItem, LEN( atiTable[ x ] ) )
END
NEXT
ENDIF
ASORT( aLensFItem,,, { | x, y | x > y } )
ASORT( aLensSItem,,, { | x, y | x > y } )
IF LEN( afoitable ) > 0 .AND. nNumTableItems == 4
ASORT( alenstitem,,, { | x, y | x > y } )
nmax3 := alenstitem[ 1 ]
npos := maxelem( atitable )
nPos3 := ASCAN( alenstitem, { | x | x == nPos } )
ASORT( aLensFoItem,,, { | x, y | x > y } )
nmax4 := alensfoitem[ 1 ]
nPos := maxelem( afoitable )
nPos4 := ASCAN( alensfoitem, { | x | x == nPos } )
ENDIF
IF LEN( atitable ) > 0 .AND. nNumTableItems == 3
ASORT( alenstitem,,, { | x, y | x > y } )
nmax3 := alenstitem[ 1 ]
npos := maxelem( atitable )
nPos3 := ASCAN( alenstitem, { | x | x == nPos } )
ENDIF
nMax := aLenssItem[ 1 ]
nPos := maxelem( asitable )
nPos1 := ASCAN( aLenssItem, { | x | x == nPos } )
/* oNgi:WritePar( "" )*/
// nMax2:=checkcar(aTable,1)+1
nMax2 := alensfitem[ 1 ]
nPos := maxelem( afitable )
nPos2 := ASCAN( alensfitem, { | x | x == nPos } )
IF nNumTableItems == 2
cMaxItem := ' ' + "É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "»"
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "»", .F. ) //-4
ELSE
oNgi:WritePar( "É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "»", .F. ) //-4
ENDIF
ELSEIF nNumTableItems == 3
cMaxItem := ' ' + "É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ë" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "»"
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ë" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "»", .F. ) //-4
ELSE
oNgi:WritePar( "É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ë" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "»", .F. ) //-4
ENDIF
ELSEIF nNumTableItems == 4
cMaxItem := ' ' + "É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ë" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "Ë" + Replicate( "Í", alensfoitem[ nPos4 ] + 2 ) + "»"
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ë" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "Ë" + Replicate( "Í", alensfoitem[ nPos4 ] + 2 ) + "»", .F. ) //-4
ELSE
oNgi:WritePar( "É" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ë" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ë" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "Ë" + Replicate( "Í", alensfoitem[ nPos4 ] + 2 ) + "»", .F. ) //-4
ENDIF
ENDIF
FOR x := 1 TO LEN( asitable )
IF !EMPTY( asitable[ x ] )
nSpace := nMax - LEN( asitable[ x ] )
nSpace2 := nMax2 - LEN( afitable[ x ] )
IF nNumTableItems == 2
IF LEN( cMaxItem ) < 76
oNgi:WriteParBox( " º " + afiTable[ x ] + SPACE( nSpace2 ) + " º " + IF( asiTable[ x ] == "|", STRTRAN( asiTable[ x ], "|", " " ), asiTable[ x ] ) + SPACE( nspace ) + " º" + HB_OSNEWLINE() )
ELSE
oNgi:WriteParBox( "º " + afiTable[ x ] + SPACE( nSpace2 ) + " º " + IF( asiTable[ x ] == "|", STRTRAN( asiTable[ x ], "|", " " ), asiTable[ x ] ) + SPACE( nspace ) + " º" + HB_OSNEWLINE() )
ENDIF
ELSEIF nNumTableItems == 3
nSpace3 := nMax3 - LEN( atitable[ x ] )
IF LEN( cMaxItem ) < 76
oNgi:WriteParBox( " º " + afiTable[ x ] + SPACE( nSpace2 ) + " º " + IF( asiTable[ x ] == "|", STRTRAN( asiTable[ x ], "|", " " ), asiTable[ x ] ) + SPACE( nspace ) + " º " + atiTable[ x ] + SPACE( nspace3 ) + " º" + HB_OSNEWLINE() )
ELSE
oNgi:WriteParBox( "º " + afiTable[ x ] + SPACE( nSpace2 ) + " º " + IF( asiTable[ x ] == "|", STRTRAN( asiTable[ x ], "|", " " ), asiTable[ x ] ) + SPACE( nspace ) + " º " + atiTable[ x ] + SPACE( nspace3 ) + " º" + HB_OSNEWLINE() )
ENDIF
ELSEIF nNumTableItems == 4
nSpace3 := nMax3 - LEN( atitable[ x ] )
nSpace4 := nMax4 - LEN( afoitable[ x ] )
IF LEN( cMaxItem ) < 76
oNgi:WriteParBox( " º " + afiTable[ x ] + SPACE( nSpace2 ) + " º " + IF( asiTable[ x ] == "|", STRTRAN( asiTable[ x ], "|", " " ), asiTable[ x ] ) + SPACE( nspace ) + " º " + atiTable[ x ] + SPACE( nspace3 ) + " º " + afoiTable[ x ] + SPACE( nspace4 ) + " º" + HB_OSNEWLINE() )
ELSE
oNgi:WriteParBox( "º " + afiTable[ x ] + SPACE( nSpace2 ) + " º " + IF( asiTable[ x ] == "|", STRTRAN( asiTable[ x ], "|", " " ), asiTable[ x ] ) + SPACE( nspace ) + " º " + atiTable[ x ] + SPACE( nspace3 ) + " º " + afoiTable[ x ] + SPACE( nspace4 ) + " º" + HB_OSNEWLINE() )
ENDIF
ENDIF
ELSE
IF nNumTableItems == 2
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " Ì" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Î" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "¹", .F. )
ELSE
oNgi:WritePar( "Ì" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Î" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "¹", .F. )
ENDIF
ELSEIF nNumTableItems == 3
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " Ì" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Î" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Î" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "¹", .F. ) //-4
ELSE
oNgi:WritePar( "Ì" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Î" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Î" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "¹", .F. ) //-4
ENDIF
ELSEIF nNumTableItems == 4
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " Ì" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Î" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Î" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "Î" + Replicate( "Í", alensfoitem[ nPos4 ] + 2 ) + "¹", .F. ) //-4
ELSE
oNgi:WritePar( "Ì" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Î" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Î" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "Î" + Replicate( "Í", alensfoitem[ nPos4 ] + 2 ) + "¹", .F. ) //-4
ENDIF
ENDIF
ENDIF
NEXT
IF nNumTableItems == 2
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " È" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ê" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "¼", .F. ) //-4
ELSE
oNgi:WritePar( "È" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ê" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "¼", .F. ) //-4
ENDIF
ELSEIF nNumTableItems == 3
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " È" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ê" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ê" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "¼", .F. ) //-4
ELSE
oNgi:WritePar( " È" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ê" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ê" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "¼", .F. ) //-4
ENDIF
ELSEIF nNumTableItems == 4
IF LEN( cMaxItem ) < 76
oNgi:WritePar( " È" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ê" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ê" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "Ê" + Replicate( "Í", alensfoitem[ nPos4 ] + 2 ) + "¼", .F. ) //-4
ELSE
oNgi:WritePar( "È" + Replicate( "Í", aLensFitem[ nPos2 ] + 2 ) + "Ê" + Replicate( "Í", alensSitem[ nPos1 ] + 2 ) + "Ê" + Replicate( "Í", alensTitem[ nPos3 ] + 2 ) + "Ê" + Replicate( "Í", alensfoitem[ nPos4 ] + 2 ) + "¼", .F. ) //-4
ENDIF
ENDIF
/* oNgi:WritePar( "" )*/
afiTable := {}
asitable := {}
atitable := {}
afoitable := {}
RETURN Nil
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function ProcNgTable()
*+
*+ Called from ( genng.prg ) 2 - function procngdesc()
*+ ( genng1.prg ) 2 - function procngdesc()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION ProcNgTable( cBuffer, nNum )
LOCAL nPos
LOCAL cItem := ''
LOCAL cItem2 := ''
LOCAL cItem3 := ''
LOCAL cItem4 := ''
LOCAL nColorpos
LOCAL cColor
cBuffer := ALLTRIM( cBuffer )
IF AT( "<color:", cBuffer ) > 0
nColorPos := AT( ":", cBuffer )
cColor := SUBSTR( cBuffer, nColorpos + 1 )
nPos := AT( ">", ccolor )
cColor := SUBSTR( ccolor, 1, nPos - 1 )
cBuffer := STRTRAN( cbuffer, "</color>", "" )
cBuffer := STRTRAN( cbuffer, "<color:", "" )
cBuffer := STRTRAN( cbuffer, ">", "" )
cBuffer := STRTRAN( cBuffer, ccolor, '' )
nColorpos := ASCAN( aColorTable, { | x, y | UPPER( x[ 1 ] ) == UPPER( ccolor ) } )
cColor := aColortable[ nColorPos, 2 ]
ENDIF
/*
If !empty(cBuffer)
cItem := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem, "" ,,1) )
else
citem:=''
endif
if nNum==2
If !empty(cBuffer)
cItem2 := SUBSTR( cBuffer, 1 )
else
citem2:=''
endif
elseif nNum ==3
If !empty(cBuffer)
cItem2 := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem2, "" ) )
cItem3 := SUBSTR( cBuffer, 1 )
else
citem2:=''
citem3:=''
endif
ELSEIF nNum > 3
If !empty(cBuffer)
cItem2 := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem2, "" ) )
cItem3 := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem3, "" ) )
cItem4 := SUBSTR( cBuffer, 1 )
else
citem2:=''
citem3:=''
citem4:=''
endif
ENDIF
AADD( afiTable, RTRIM( LTRIM( cItem ) ) )
AADD( asiTable, cItem2 )
AADD( atiTable, cItem3 )
AADD( afoiTable, cItem4 )
*/
IF !EMPTY( cBuffer )
cItem := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem, "" ) )
ELSE
citem := ''
ENDIF
IF nNum == 2
IF !EMPTY( cBuffer )
cItem2 := SUBSTR( cBuffer, 1 )
ELSE
citem2 := ''
ENDIF
ELSEIF nNum == 3
IF !EMPTY( cBuffer )
cItem2 := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem2, "" ) )
cItem3 := SUBSTR( cBuffer, 1 )
ELSE
citem2 := ''
citem3 := ''
ENDIF
ELSEIF nNum > 3
IF !EMPTY( cBuffer )
cItem2 := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem2, "" ) )
cItem3 := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem3, "" ) )
cItem4 := SUBSTR( cBuffer, 1 )
ELSE
citem2 := ''
citem3 := ''
citem4 := ''
ENDIF
ENDIF
AADD( afiTable, RTRIM( LTRIM( cItem ) ) )
AADD( asiTable, cItem2 )
// IF !EMPTY( cItem3 )
AADD( atiTable, cItem3 )
// ENDIF
// IF !EMPTY( cItem4 )
AADD( afoiTable, cItem4 )
// ENDIF
RETURN Nil
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function ProcNGDesc()
*+
*+ Called from ( genng.prg ) 6 - function processing()
*+ ( genng1.prg ) 6 - function processing()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION ProcNGDesc( cBuffer, oNgi, cStyle )
LOCAL cLine := ''
LOCAL nPos
LOCAL CurPos := 0
LOCAL nColorPos
LOCAL ccolor := ''
LOCAL cReturn := ''
LOCAL nIdentLevel
LOCAL cOldLine
LOCAL lEndPar := .F.
LOCAL lEndFixed := .F.
LOCAL lEndTable := .F.
LOCAL LFstTableItem := .T.
LOCAL lArgBold := .F.
DEFAULT cStyle TO "Default"
IF AT( '<par>', cBuffer ) == 0 .AND. !EMPTY( cBuffer ) .AND. cstyle <> "Example"
cBuffer := '<par>' + cBuffer
ENDIF
IF EMPTY( cBuffer )
oNgi:WritePar( "" )
ENDIF
IF cStyle <> "Example" .AND. AT( "<table>", cBuffer ) == 0 .AND. AT( "<fixed>", cBuffer ) = 0
IF AT( "<par>", cBuffer ) >= 0 .OR. AT( "</par>", cBuffer ) = 0 .AND. !EMPTY( cbuffer )
IF AT( "<par>", cBuffer ) > 0 .AND. AT( "</par>", cBuffer ) > 0
IF cStyle == "Arguments"
cReturn := cBuffer
cReturn := STRTRAN( cReturn, "<par>", "" )
cReturn := STRTRAN( cReturn, "</par>", "" )
cReturn := ALLTRIM( cReturn )
nPos := AT( " ", cReturn )
cOldLine := LEFT( cReturn, nPos - 1 )
cReturn := STRTRAN( cReturn, cOldLine, "" )
IF AT( "@", cOldLine ) > 0 .OR. AT( "()", cOldLine ) > 0 .OR. AT( "<", cOldLine ) > 0 .OR. AT( "_", cOldLine ) > 0
lArgBold := .T.
ELSE
lArgBold := .f.
ENDIF
// cBuffer:= strtran(cBuffer,"<par>","<par><b>")
IF lArgBold
cReturn := ' <par><b>' + cOldLine + '</b> ' + cReturn + ' </par>'
ELSE
cReturn := ' <par>' + cOldLine + ' ' + cReturn + ' </par>'
ENDIF
cbuffer := cReturn
ENDIF
ELSE
cBuffer := FormatngBuff( cBuffer, cStyle, ongi )
ENDIF
ENDIF
ENDIF
IF AT( '<par>', cBuffer ) > 0 .AND. AT( '</par>', cBuffer ) > 0
cBuffer := STRTRAN( cBuffer, '<par>', '' )
cBuffer := STRTRAN( cBuffer, '<b>', ' ^b' )
cBuffer := STRTRAN( cBuffer, '</b>', '^n ' )
cBuffer := STRTRAN( cBuffer, '</color>', '^n ' )
cBuffer := STRTRAN( cBuffer, '<em>', '' )
cBuffer := STRTRAN( cBuffer, '</em>', '' )
cBuffer := STRTRAN( cBuffer, '<i>', '' )
cBuffer := STRTRAN( cBuffer, '</i>', '' )
nColorPos := AT( '<color:', cBuffer )
IF ncolorpos > 0
checkngcolor( @cbuffer, ncolorpos )
ENDIF
// Alltrim(cBuffer)
IF cStyle == "Description" .OR. cStyle == "Compliance"
nIdentLevel := 6
nPos := 0
DO WHILE !lendPar
IF nPos == 0
cLine := SUBSTR( cBuffer, 1, 76 )
nPos := RAT( " ", cLine )
IF nPos > 0
cLine := SUBSTR( cBuffer, 1, nPos )
ENDIF
ELSE
cLine := SPACE( nidentLevel ) + SUBSTR( cBuffer, curPos, 69 )
IF AT( '</par>', cLine ) > 0
lEndPar := .T.
cLine := STRTRAN( cLine, " </par>", "" )
ENDIF
nPos := RAT( " ", cLine )
IF nPos > 0
cLine := SPACE( nidentLevel ) + SUBSTR( cBuffer, curpos, nPos - nIdentlevel )
nPos -= nIdentlevel
ELSE
IF cLine == "</par>"
cLine := ''
ENDIF
ENDIF
ENDIF
IF !EMPTY( cLine )
oNgi:WritePar( SPACE( nidentLevel ) + ALLTRIM( cLine ) )
ENDIF
curPos += nPos
ENDDO
ELSEIF cStyle == "Arguments"
nIdentLevel := 18
nPos := 0
DO WHILE !lendPar
IF nPos == 0
cLine := SUBSTR( cBuffer, 1, 76 )
nPos := RAT( " ", cLine )
IF nPos > 0
cLine := SUBSTR( cBuffer, 1, nPos )
ENDIF
IF !EMPTY( cLine )
oNgi:WritePar( cLine )
ENDIF
ELSE
cLine := SPACE( nidentLevel ) + SUBSTR( cBuffer, curPos, 58 ) //60
IF AT( '</par>', cLine ) > 0
lEndPar := .T.
cLine := STRTRAN( cLine, " </par>", "" )
ENDIF
nPos := RAT( " ", cLine )
IF nPos > 0
cLine := SPACE( nidentLevel ) + SUBSTR( cBuffer, curpos, nPos - nIdentlevel )
nPos -= nIdentlevel
ELSE
IF cLine == "</par>"
cLine := ''
ENDIF
ENDIF
IF !EMPTY( cLine )
oNgi:WritePar( SPACE( nidentLevel ) + ALLTRIM( cLine ) )
ENDIF
ENDIF
curPos += nPos
ENDDO
ELSEIF cStyle == "Syntax"
nIdentLevel := 6
nPos := 0
DO WHILE !lendPar
IF nPos == 0
cLine := SUBSTR( cBuffer, 1, 76 )
nPos := RAT( " ", cLine )
IF nPos > 0
cLine := SUBSTR( cBuffer, 1, nPos )
ENDIF
ELSE
cLine := SPACE( nidentLevel ) + SUBSTR( ALLTRIM( cBuffer ), curPos, 69 )
IF AT( '</par>', cLine ) > 0
lEndPar := .T.
cLine := STRTRAN( cLine, " </par>", "" )
ENDIF
nPos := RAT( " ", cLine )
IF nPos > 0
cLine := SPACE( nidentLevel ) + SUBSTR( cBuffer, curpos, nPos - nIdentlevel )
nPos -= nIdentlevel
ELSE
IF cLine == "</par>"
cLine := ''
ENDIF
ENDIF
ENDIF
IF !EMPTY( cLine )
oNgi:WritePar( SPACE( nidentLevel ) + ALLTRIM( cLine ) )
ENDIF
curPos += nPos
ENDDO
ELSEIF cStyle == "Default"
nIdentLevel := 6
nPos := 0
DO WHILE !lendPar
IF nPos == 0
cLine := SUBSTR( cBuffer, 1, 76 )
nPos := RAT( " ", cLine )
IF nPos > 0
cLine := SUBSTR( cBuffer, 1, nPos )
ENDIF
ELSE
cLine := SPACE( nidentLevel ) + SUBSTR( cBuffer, curPos, 69 )
nPos := RAT( " ", cLine )
IF AT( '</par>', cLine ) > 0
lEndPar := .T.
cLine := STRTRAN( cLine, "</par>", "" )
ENDIF
IF nPos > 0
cLine := SPACE( nidentLevel ) + SUBSTR( cBuffer, curpos, nPos - nIdentlevel )
nPos -= nIdentlevel
ELSE
IF cLine == "</par>"
cLine := ''
ENDIF
ENDIF
ENDIF
IF !EMPTY( cLine )
oNgi:WritePar( RTRIM( cLine ) )
ENDIF
curPos += nPos
ENDDO
ENDIF
ENDIF
IF AT( '<fixed>', cBuffer ) > 0 .OR. cStyle = "Example"
IF AT( '<fixed>', cBuffer ) = 0 .OR. !EMPTY( cBuffer )
cBuffer := STRTRAN( cBuffer, "<par>", "" )
cBuffer := STRTRAN( cBuffer, "<fixed>", "" )
oNgi:WritePar( cBuffer )
ENDIF
DO WHILE !lendFixed
cLine := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
IF AT( "</fixed>", cLine ) > 0
lendfixed := .t.
cLine := STRTRAN( cLine, "</fixed>", "" )
ENDIF
IF AT( DELIM, cLine ) = 0
cReturn += ALLTRIM( cLine ) + ' '
ENDIF
IF AT( DELIM, cLine ) > 0
FT_FSKIP( - 1 )
lEndfixed := .t.
ENDIF
IF AT( DELIM, cLine ) == 0
oNgi:WritePar( cLine )
ENDIF
ENDDO
END
IF AT( '<table>', cBuffer ) > 0
DO WHILE !lendTable
cLine := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
IF AT( "</table>", cLine ) > 0 .or. AT( "</TABLE>", cLine ) > 0
lendTable := .t.
ELSE
IF LFstTableItem
nNumTableItems := GetNumberofTableItems( cLine )
procngtable( cline, nNumTableItems )
LFstTableItem := .f.
ELSE
procngtable( cline, nNumTableItems )
ENDIF
ENDIF
ENDDO
IF lEndTable
GenNgTable( oNgi )
LFstTableItem:=.T.
ENDIF
ENDIF
// If cStyle=="Description" .or. cStyle=="Compliance"
// oNgi:Writepar('')
// endif
RETURN nil
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function checkngcolor()
*+
*+ Called from ( genhtm1.prg ) 1 - function prochtmdesc()
*+ ( genhtm2.prg ) 1 - function prochtmdesc()
*+ ( genng.prg ) 1 - function procngdesc()
*+ ( genng1.prg ) 1 - function procngdesc()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNC checkngcolor( cbuffer, ncolorpos )
LOCAL ncolorend
LOCAL nreturn
LOCAL cOldColorString
LOCAL cReturn
LOCAL ccolor
DO WHILE AT( "<color:", cbuffer ) > 0
nColorPos := AT( "<color:", cBuffer )
ccolor := SUBSTR( cbuffer, ncolorpos + 7 )
nColorend := AT( ">", ccolor )
ccolor := SUBSTR( ccolor, 1, nColorend - 1 )
cOldColorString := SUBSTR( cbuffer, ncolorpos )
nColorend := AT( ">", cOldColorString )
cOldColorString := SUBSTR( cOldColorString, 1, nColorEnd )
nreturn := ASCAN( acolortable, { | x, y | UPPER( x[ 1 ] ) == UPPER( ccolor ) } )
IF nreturn > 0
cReturn := "^a" + acolortable[ nreturn, 2 ]
ENDIF
cBuffer := STRTRAN( cBuffer, cOldColorString, cReturn )
ENDDO
RETURN cbuffer
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function maxelem()
*+
*+ Called from ( genng.prg ) 5 - function genngtable()
*+ ( genng1.prg ) 4 - function genngtable()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNC maxelem( a )
LOCAL nSize := LEN( a )
LOCAL max := 0
LOCAL tam := 0
LOCAL nMax2 := 0
LOCAL nPos := 1
LOCAL nCount
FOR nCount := 1 TO nSize
tam := LEN( a[ nCount ] )
max := IF( tam > max, tam, max )
NEXT
nPos := ASCAN( a, { | x | LEN( x ) == max } )
RETURN max
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function FormatNgBuff()
*+
*+ Called from ( genhtm1.prg ) 1 - function prochtmdesc()
*+ ( genhtm2.prg ) 1 - function prochtmdesc()
*+ ( genng.prg ) 1 - function procngdesc()
*+ ( genng1.prg ) 1 - function procngdesc()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION FormatNgBuff( cBuffer, cStyle, ongi )
LOCAL cReturn := ''
LOCAL cLine := ''
LOCAL cOldLine := ''
LOCAL cBuffEnd := ''
LOCAL lEndBuffer := .f.
LOCAL nPos
LOCAL lArgBold := .f.
LOCAL LFstTableItem := .t.
HB_SYMBOL_UNUSED( ongi )
cReturn := cBuffer + ' '
IF AT( '</par>', cReturn ) > 0 .OR. EMPTY( cBuffer )
IF EMPTY( cbuffer )
cReturn := ''
ENDIF
RETURN cReturn
ENDIF
IF cStyle != "Syntax" .AND. cStyle != "Arguments" .AND. cStyle != "Return"
DO WHILE !lEndBuffer
cLine := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
IF AT( '</par>', cLine ) > 0
lEndBuffer := .t.
ENDIF
IF EMPTY( cLine )
lEndBuffer := .t.
FT_FSKIP( - 1 )
ENDIF
IF AT( DELIM, cLine ) > 0
FT_FSKIP( - 1 )
lEndBuffer := .t.
ENDIF
IF AT( DELIM, cLine ) = 0
cReturn += ' ' + ALLTRIM( cLine ) + ' '
ENDIF
ENDDO
cReturn := STRTRAN( cReturn, "<par>", "" )
cReturn := STRTRAN( cReturn, "</par>", "" )
cReturn := '<par>' + cReturn + ' </par>'
ELSEIF cStyle == 'Syntax'
cReturn := STRTRAN( cReturn, SPACE( 4 ), "" )
cReturn := '<par><b>' + cReturn + ' </b></par>'
ELSEIF cStyle == 'Arguments' .OR. cStyle == "Return"
nPos := 0
cReturn := '<par>' + cReturn
IF AT( "<par>", cReturn ) > 0
cReturn := STRTRAN( cReturn, "<par>", "" )
cReturn := STRTRAN( cReturn, "</par>", "" )
cReturn := ALLTRIM( cReturn )
nPos := AT( " ", cReturn )
cOldLine := LEFT( cReturn, nPos - 1 )
cReturn := STRTRAN( cReturn, cOldLine, "" )
IF AT( "@", cOldLine ) > 0 .OR. AT( "()", cOldLine ) > 0 .OR. AT( "<", cOldLine ) > 0 .OR. AT( "_", cOldLine ) > 0
lArgBold := .T.
ENDIF
ENDIF
DO WHILE !lEndBuffer
cLine := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
IF AT( "</par>", cLine ) > 0
lEndBuffer := .t.
ENDIF
IF EMPTY( cLine )
lEndBuffer := .t.
FT_FSKIP( - 1 )
ENDIF
IF AT( DELIM, cLine ) > 0
FT_FSKIP( - 1 )
lEndBuffer := .t.
ENDIF
IF AT( DELIM, cLine ) = 0
cReturn += ' ' + ALLTRIM( cLine ) + ' '
ENDIF
ENDDO
cReturn := STRTRAN( cReturn, "<par>", "" )
cReturn := STRTRAN( cReturn, "</par>", "" )
IF lArgBold
cReturn := ' <par><b>' + cOldLine + '</b> ' + cReturn + ' </par>'
ELSE
cReturn := ' <par>' + cOldLine + ' ' + cReturn + ' </par>'
ENDIF
ENDIF
lArgBold := .F.
// endif
RETURN cReturn
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Static Function ReadFromTop()
*+
*+ Called from ( genng.prg ) 1 - function processing()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
STATIC FUNCTION ReadFromTop( nh )
LOCAL cDoc := DELIM + "DOC" + DELIM // DOC keyword
LOCAL cEnd := DELIM + "END" + DELIM // END keyword
LOCAL cClassDoc := DELIM + "CLASSDOC" + DELIM
LOCAL cBuffer := ''
LOCAL NPOS := 0
LOCAL aLocDoc := {}
DO WHILE FREADline( nH, @cBuffer, 4096 )
cBuffer := TRIM( SUBSTR( cBuffer, nCommentLen ) )
AADD( Alocdoc, CbUFFER )
IF AT( cEnd, cBuffer ) > 0
AADD( aCurdoc, aLocdoc )
aLocDoc := {}
ENDIF
ENDDO
lEof := .F.
FT_FGOTOP()
RETURN nil
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Static Function GetItem()
*+
*+ Called from ( genng.prg ) 20 - function processing()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
STATIC FUNCTION GetItem( cItem, nCurdoc )
LOCAL nPos
LOCAL cCuritem
LOCAL lReturn
LOCAL xPos
xPos := aCurdoc[ nCurdoc ]
nPos := ASCAN( xPos, { | x, y | UPPER( ALLTRIM( x ) ) == UPPER( ALLTRIM( cItem ) ) } )
IF nPos > 0
cCuritem := xPos[ nPos ]
IF AT( "$", xPos[ nPos + 1 ] ) > 0
lReturn := .f.
ELSE
lReturn := .t.
ENDIF
ENDIF
RETURN lReturn
*+ EOF: GENNG.PRG