See changelog 20000209 20:15
This commit is contained in:
@@ -3,13 +3,20 @@
|
||||
#
|
||||
|
||||
ifeq ($(HB_MAIN),)
|
||||
HB_MAIN = std
|
||||
HB_MAIN = std
|
||||
endif
|
||||
|
||||
ROOT = ../../
|
||||
|
||||
PRG_SOURCES=\
|
||||
hbdoc.prg
|
||||
hbdoc.prg \
|
||||
genos2.prg \
|
||||
gentrf.prg \
|
||||
genng.prg \
|
||||
genhtm.prg \
|
||||
genrtf.prg \
|
||||
genhpc.prg \
|
||||
genasc.prg
|
||||
|
||||
PRG_MAIN=hbdoc.prg
|
||||
|
||||
@@ -27,3 +34,4 @@ LIBS=\
|
||||
common \
|
||||
|
||||
include $(TOP)$(ROOT)config/bin.cf
|
||||
|
||||
|
||||
577
harbour/utils/hbdoc/genasc.prg
Normal file
577
harbour/utils/hbdoc/genasc.prg
Normal file
@@ -0,0 +1,577 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* GENASC 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 of the License, or
|
||||
* (at your option) any later version, with one exception:
|
||||
*
|
||||
* The exception is that if you link the Harbour Runtime Library (HRL)
|
||||
* and/or the Harbour Virtual Machine (HVM) 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 HRL
|
||||
* and/or HVM code into it.
|
||||
*
|
||||
* 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
|
||||
* their web site at http://www.gnu.org/).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#define NANFOR
|
||||
#endif
|
||||
|
||||
#include "directry.ch"
|
||||
#include "fileio.ch"
|
||||
#include "inkey.ch"
|
||||
|
||||
// output lines on the screen
|
||||
|
||||
#define INFILELINE 10
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
#xtranslate UPPERLOWER(<exp>) => (UPPER(SUBSTR(<exp>,1,1))+LOWER(SUBSTR(<exp>,2)))
|
||||
MEMVAR aDirList,aDocInfo,aWww,LCONTINUOUS,lAuthor
|
||||
STATIC NWRITEHANDLE
|
||||
|
||||
FUNCTION ASCIIFiles()
|
||||
|
||||
//
|
||||
// This routine and all accompaning database structures are
|
||||
// Copyright (C) 1992 Leo J. Letendre.
|
||||
//
|
||||
// Purpose: Process each of the files in the directory making an ascii file
|
||||
//
|
||||
// Modification History:
|
||||
// Version Date Who Notes
|
||||
// V1.00 1/19/92 LJL Initial Version
|
||||
// V1.01 2/25/92 LJL Trimmed spaces from see also and header
|
||||
// V1.02 10/30/92 LJL Added multi-line one liner check and
|
||||
// insured blank line prior to and after
|
||||
// category headers
|
||||
// V1.03 10/30/93 LJL added changable delimiter support,
|
||||
// COMMANDNAME keyword and removed
|
||||
// filename references in see alsos
|
||||
//
|
||||
// Calling parameters: None
|
||||
//
|
||||
// Notes: None
|
||||
// -
|
||||
// LOCAL variables:
|
||||
|
||||
LOCAL i
|
||||
LOCAL j
|
||||
LOCAL nFiles := LEN( aDirList )
|
||||
LOCAL nCommentLen
|
||||
LOCAL lEof
|
||||
LOCAL lDoc
|
||||
LOCAL cBuffer
|
||||
LOCAL nEnd
|
||||
LOCAL nCount
|
||||
LOCAL cAuthor
|
||||
LOCAL cBar := "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ" + CRLF
|
||||
LOCAL nMode
|
||||
LOCAL cFuncName
|
||||
LOCAL cOneLine
|
||||
LOCAL cCategory
|
||||
LOCAL cFileName
|
||||
LOCAL nLineCnt
|
||||
LOCAL cSeeAlso
|
||||
LOCAL cTemp
|
||||
LOCAL cChar
|
||||
LOCAL nDocCnt
|
||||
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 lFunc := .T. // currently a function rather than a command
|
||||
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
|
||||
|
||||
#define D_NORMAL 1
|
||||
#define D_ARG 2
|
||||
#define D_SYNTAX 3
|
||||
#define D_IGNORE 4
|
||||
#define D_SEEALSO 5
|
||||
#define D_INCLUDE 6
|
||||
#define D_ONELINE 7
|
||||
#define D_STATUS 8
|
||||
#define D_TESTS 9
|
||||
#define D_FUNCTIONS 10
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
// Open file for input
|
||||
|
||||
nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 3 )
|
||||
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
|
||||
|
||||
DO WHILE .NOT. lEof
|
||||
|
||||
// Read a line
|
||||
|
||||
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
|
||||
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
|
||||
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
|
||||
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 nDocCnt > 60 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
FWRITE( nWriteHandle, " Source: " + aDirList[ i, F_NAME ] + CRLF + CRLF )
|
||||
IF lAuthor
|
||||
FWRITE( nWriteHandle, " Author: " + cAuthor + CRLF )
|
||||
ENDIF
|
||||
IF .NOT. EMPTY( cSeeAlso )
|
||||
FWRITE( nWriteHandle, "See also: " + cSeeAlso + CRLF )
|
||||
ENDIF
|
||||
IF .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
ELSE
|
||||
FWRITE( nWriteHandle, CRLF + CRLF )
|
||||
ENDIF
|
||||
nDocCnt := 0
|
||||
FCLOSE( nWriteHandle )
|
||||
ENDIF
|
||||
nMode := D_IGNORE
|
||||
@ 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
|
||||
lFunc := AT( cFunc, cBuffer ) > 0
|
||||
cBuffer := ReadLN( @lEof )
|
||||
nLineCnt ++
|
||||
// Save the function name
|
||||
cFuncName := UPPER( 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 := SUBSTR( cFuncName, 4 )
|
||||
ELSE
|
||||
cTemp := 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, 8 )
|
||||
nEnd := 1
|
||||
nCount := 0
|
||||
DO WHILE nEnd > 0
|
||||
nEnd := ASCAN( aDocInfo, { | a | a[ 4 ] == cFileName + ".hdf" } )
|
||||
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 ) = 8
|
||||
cFileName := STUFF( cFileName, 8, 1, STR( nCount, 1, 0 ) )
|
||||
ELSE
|
||||
cFileName += STR( nCount, 1, 0 )
|
||||
ENDIF
|
||||
nCount ++
|
||||
ENDIF
|
||||
ENDDO
|
||||
// Add on the extension
|
||||
|
||||
cFileName := LEFT( cFileName, 8 ) + ".hdf"
|
||||
|
||||
nWriteHandle := FCREATE( "hdf\" + cFileName )
|
||||
IF nWriteHandle < 1
|
||||
? "Error creating", cFileName, ".hdf"
|
||||
write_error( "Error creating",,,, cFileName + ".hdf" )
|
||||
ENDIF
|
||||
// 2) Category
|
||||
ELSEIF AT( cCat, cBuffer ) > 0
|
||||
cBuffer := ReadLN( @lEof )
|
||||
nLineCnt ++
|
||||
// get the category
|
||||
cCategory := UPPER( 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 nDocCnt > 60 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, IIF( lFunc, "FUNCTION: ", "COMMAND: " ) ;
|
||||
+ cFuncName + CRLF )
|
||||
FWRITE( nWriteHandle, " " + cOneLine + CRLF )
|
||||
FWRITE( nWriteHandle, cBar )
|
||||
nDocCnt += 3
|
||||
// 4) all other stuff
|
||||
|
||||
ELSE
|
||||
|
||||
IF AT( cSyn, cBuffer ) > 0
|
||||
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, " Syntax:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_SYNTAX
|
||||
|
||||
ELSEIF AT( cArg, cBuffer ) > 0
|
||||
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, " Arguments:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cRet, cBuffer ) > 0
|
||||
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, " Returns:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cDesc, cBuffer ) > 0
|
||||
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, " Description:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cExam, cBuffer ) > 0
|
||||
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, " Examples:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cTest, cBuffer ) > 0
|
||||
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, " Tests:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cStatus, cBuffer ) > 0
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, " Status:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cCompl, cBuffer ) > 0
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, " Compliance:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cPlat, cBuffer ) > 0
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, " Platforms:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFiles, cBuffer ) > 0
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, " Files:" + CRLF )
|
||||
nDocCnt ++
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cSee, cBuffer ) > 0
|
||||
nMode := D_SEEALSO
|
||||
ELSEIF AT( cInc, cBuffer ) > 0
|
||||
nMode := D_INCLUDE
|
||||
|
||||
// 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
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
lAddBlank := .F.
|
||||
ELSEIF lAddBlank
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
lAddBlank := .F.
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
FWRITE( nWriteHandle, " " + cBuffer + CRLF )
|
||||
nDocCnt ++
|
||||
ELSEIF nMode = D_ARG
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "Arguments", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
lAddBlank := .F.
|
||||
ELSEIF lAddBlank
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
lAddBlank := .F.
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
FWRITE( nWriteHandle, cBuffer + CRLF )
|
||||
nDocCnt ++
|
||||
ELSEIF nMode = D_NORMAL
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "General", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
lAddBlank := .F.
|
||||
ELSEIF lAddBlank
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
lAddBlank := .F.
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, cBuffer + CRLF )
|
||||
nDocCnt ++
|
||||
ELSEIF nMode = D_SEEALSO
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
cSeeAlso := StripFiles( ALLTRIM( cBuffer ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_INCLUDE
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
IF nDocCnt > 62 .AND. .NOT. lContinuous
|
||||
FWRITE( nWriteHandle, CHR( K_CTRL_L ) + CRLF )
|
||||
nDocCnt := 0
|
||||
ELSEIF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
lAddBlank := .F.
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, " Header File: " ;
|
||||
+ ALLTRIM( cBuffer ) + CRLF )
|
||||
nDocCnt ++
|
||||
ENDIF
|
||||
ELSEIF nMode = D_STATUS
|
||||
IF !EMPTY( cBuffer )
|
||||
FWRITE( nWriteHandle, " Status" + CRLF )
|
||||
ENDIF
|
||||
ProcStatus( nWriteHandle, 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()
|
||||
NEXT
|
||||
|
||||
RETURN NIL
|
||||
613
harbour/utils/hbdoc/genhpc.prg
Normal file
613
harbour/utils/hbdoc/genhpc.prg
Normal file
@@ -0,0 +1,613 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* GENHPC 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 of the License, or
|
||||
* (at your option) any later version, with one exception:
|
||||
*
|
||||
* The exception is that if you link the Harbour Runtime Library (HRL)
|
||||
* and/or the Harbour Virtual Machine (HVM) 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 HRL
|
||||
* and/or HVM code into it.
|
||||
*
|
||||
* 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
|
||||
* their web site at http://www.gnu.org/).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#define NANFOR
|
||||
#endif
|
||||
|
||||
#include "directry.ch"
|
||||
#include "fileio.ch"
|
||||
#include "inkey.ch"
|
||||
|
||||
// output lines on the screen
|
||||
|
||||
#define INFILELINE 10
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
#xtranslate UPPERLOWER(<exp>) => (UPPER(SUBSTR(<exp>,1,1))+LOWER(SUBSTR(<exp>,2)))
|
||||
MEMVAR aDirList,aDocInfo,aWww
|
||||
STATIC NWRITEHANDLE
|
||||
|
||||
FUNCTION ProcessFiles()
|
||||
|
||||
//
|
||||
// This routine and all accompaning database structures are
|
||||
// Copyright (C) 1992 Leo J. Letendre. Modified to generate
|
||||
// HELPC Source code By Luiz Rafael Culik
|
||||
//
|
||||
// Purpose: Process each of the files in the directory
|
||||
//
|
||||
// Modification History:
|
||||
// Version Date Who Notes
|
||||
// V1.00 1/19/92 LJL Initial Version
|
||||
// V1.01 2/25/92 LJL Trimmed spaces from see also and header
|
||||
// V1.02 10/17/92 LJL Added multi-line one-liner check
|
||||
// V1.03 10/22/92 LJL Insured that there was a blank line
|
||||
// before and after each catagory header
|
||||
// V1.04 10/30/93 LJL added changable delimiter support and
|
||||
// COMMANDNAME keyword
|
||||
//
|
||||
// Calling parameters: None
|
||||
//
|
||||
// Notes: None
|
||||
// -
|
||||
// LOCAL variables:
|
||||
|
||||
#define D_NORMAL 1
|
||||
#define D_ARG 2
|
||||
#define D_SYNTAX 3
|
||||
#define D_IGNORE 4
|
||||
#define D_SEEALSO 5
|
||||
#define D_INCLUDE 6
|
||||
#define D_ONELINE 7
|
||||
#define D_STATUS 8
|
||||
#define D_TESTS 9
|
||||
#define D_FUNCTIONS 10
|
||||
|
||||
LOCAL i
|
||||
LOCAL j
|
||||
LOCAL nFiles := LEN( aDirList )
|
||||
LOCAL nCommentLen
|
||||
LOCAL lEof
|
||||
LOCAL lDoc
|
||||
LOCAL cBuffer
|
||||
LOCAL nEnd
|
||||
LOCAL nCount
|
||||
|
||||
LOCAL cBar := "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ" + CRLF
|
||||
LOCAL nMode
|
||||
LOCAL cFuncName
|
||||
LOCAL cOneLine
|
||||
LOCAL cCategory
|
||||
LOCAL cFileName
|
||||
LOCAL nLineCnt
|
||||
LOCAL cSeeAlso
|
||||
LOCAL cTemp
|
||||
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 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
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
// Open file for input
|
||||
|
||||
nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 3 )
|
||||
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
|
||||
|
||||
// loop to go through file
|
||||
|
||||
DO WHILE .NOT. lEof
|
||||
|
||||
// Read a line
|
||||
|
||||
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
|
||||
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
|
||||
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
|
||||
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 )
|
||||
FWRITE( nWriteHandle, "See Also " )
|
||||
Proccalso( nWriteHandle, cSeealso )
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, ".end-topic" + CRLF )
|
||||
FCLOSE( nWriteHandle )
|
||||
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 := UPPER( 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 := SUBSTR( cFuncName, 4 )
|
||||
ELSE
|
||||
cTemp := 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, 8 )
|
||||
nEnd := 1
|
||||
nCount := 0
|
||||
DO WHILE nEnd > 0
|
||||
nEnd := ASCAN( aDocInfo, { | a | a[ 4 ] == cFileName + ".hdf" } )
|
||||
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 ) = 8
|
||||
cFileName := STUFF( cFileName, 8, 1, STR( nCount, 1, 0 ) )
|
||||
ELSE
|
||||
cFileName += STR( nCount, 1, 0 )
|
||||
ENDIF
|
||||
nCount ++
|
||||
ENDIF
|
||||
ENDDO
|
||||
// Add on the extension
|
||||
|
||||
cFileName := LEFT( cFileName, 8 ) + ".hdf"
|
||||
|
||||
nWriteHandle := FCREATE( "hdf\" + cFileName )
|
||||
IF nWriteHandle < 1
|
||||
? "Error creating", cFileName, ".hdf"
|
||||
write_error( "Error creating",,,, cFileName + ".hdf" )
|
||||
ENDIF
|
||||
// 2) Category
|
||||
ELSEIF AT( cCat, cBuffer ) > 0
|
||||
cBuffer := ReadLN( @lEof )
|
||||
nLineCnt ++
|
||||
// get the category
|
||||
cCategory := UPPER( 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
|
||||
FWRITE( nWriteHandle, '.topic ' + CheckTop( PAD( cFuncName, 20 ) ) + CRLF )
|
||||
// FWRITE(nWriteHandle,"!short: "+PAD(cFuncName,17)+cOneLine+CRLF)
|
||||
FWRITE( nWriteHandle, '.title ' + cFuncName + CRLF )
|
||||
// FWRITE(nWriteHandle," "+cFuncName+CRLF)
|
||||
FWRITE( nWriteHandle, ".par font 6 size 12 align center " + CRLF + cOneLine + CRLF + ".endpar" + CRLF )
|
||||
FWRITE( nWriteHandle, HB_OEMTOANSI( cBar ) )
|
||||
// 4) all other stuff
|
||||
|
||||
ELSE
|
||||
|
||||
IF AT( cSyn, cBuffer ) > 0
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Syntax" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
nMode := D_SYNTAX
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cArg, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Arguments" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
ENDIF
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cRet, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Returns" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cDesc, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
|
||||
FWRITE( nWriteHandle, " Description" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cExam, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
ENDIF
|
||||
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Examples" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cTest, cBuffer ) > 0
|
||||
nMode=D_TESTS
|
||||
ELSEIF AT( cCompl, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Compliance" + CRLF )
|
||||
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cPlat, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Platforms" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFiles, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Files" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFunction, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Function" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cStatus, cBuffer ) > 0
|
||||
nMode := D_STATUS
|
||||
ELSEIF AT( cSee, cBuffer ) > 0
|
||||
nMode := D_SEEALSO
|
||||
ELSEIF AT( cInc, cBuffer ) > 0
|
||||
nMode := D_INCLUDE
|
||||
|
||||
// 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 lAddBlank
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, cBuffer + CRLF )
|
||||
ELSEIF nMode = D_ARG
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "Arguments", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
cBuffer := STRTRAN( cBuffer, "<", "<", 1 )
|
||||
cBuffer := STRTRAN( cBuffer, ">", ">", 1 )
|
||||
FWRITE( nWriteHandle, cBuffer + CRLF )
|
||||
ELSEIF nMode = D_NORMAL
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "General", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, StripNgControls( cBuffer ) + CRLF )
|
||||
ELSEIF nMode = D_SEEALSO
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
cSeeAlso := StripFiles( ALLTRIM( cBuffer ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_INCLUDE
|
||||
// read next line
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
IF !lBlankLine
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, " Header File: " ;
|
||||
+ ALLTRIM( cBuffer ) + CRLF )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_STATUS
|
||||
IF !EMPTY( cBuffer )
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Status" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
ENDIF
|
||||
ProcStatus( nWriteHandle, StripNgControls( cBuffer ) )
|
||||
ELSEIF nMode=D_TESTS
|
||||
IF !EMPTY(cBuffer)
|
||||
FWRITE( nWriteHandle, ".par bold on" + CRLF )
|
||||
FWRITE( nWriteHandle, " Tests" + CRLF )
|
||||
FWRITE( nWriteHandle, ".endpar" + CRLF )
|
||||
FWRITE( nWriteHandle, CRLF )
|
||||
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle,StripNgControls( cBuffer ) +CRLF)
|
||||
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()
|
||||
NEXT
|
||||
|
||||
RETURN NIL
|
||||
#define CRLF chr(13)+chr(10)
|
||||
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function Proccalso()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION Proccalso( nWriteHandle, cSeeAlso )
|
||||
|
||||
LOCAL nPos
|
||||
LOCAL cTemp := ''
|
||||
LOCAL xTemp
|
||||
LOCAL nLen
|
||||
LOCAL xPos
|
||||
LOCAL tPos
|
||||
nLen := LEN( cSeeAlso )
|
||||
WHILE .t.
|
||||
nPos := AT( ",", cSeeAlso )
|
||||
|
||||
IF nPos > 0
|
||||
xTemp := SUBSTR( ALLTRIM( cSeeAlso ), 1, nPos - 1 )
|
||||
tPos := AT( "()", xTemp )
|
||||
IF tPos > 0
|
||||
nLen -= LEN( xTemp ) + 1
|
||||
|
||||
xTemp += "~" + xTemp + "~ "
|
||||
cTemp := "~" + xTemp
|
||||
ELSE
|
||||
xPos := AT( " ", xTemp )
|
||||
IF xPos > 0
|
||||
nLen -= LEN( xTemp ) + 3
|
||||
xTemp += "~" + SUBSTR( xTemp, 1, xPos - 1 ) + '_' + SUBSTR( xTemp, xPos + 1 ) + "~ "
|
||||
cTemp := "~" + xTemp
|
||||
ELSE
|
||||
nLen -= LEN( xTemp ) + 2
|
||||
xTemp += "~" + xTemp + "~ "
|
||||
cTemp := "~" + xTemp
|
||||
END
|
||||
|
||||
END
|
||||
ELSE
|
||||
xTemp := SUBSTR( cSeeAlso, 1 )
|
||||
tPos := AT( "()", xTemp )
|
||||
|
||||
IF tPos > 0
|
||||
nLen -= LEN( xTemp ) + 1
|
||||
|
||||
xTemp += "~" + xTemp + "~ "
|
||||
cTemp := "~" + xTemp
|
||||
ELSE
|
||||
|
||||
xPos := AT( " ", xTemp )
|
||||
IF xPos > 0
|
||||
nLen -= LEN( xTemp ) + 3
|
||||
xTemp += "~" + SUBSTR( xTemp, 1, xPos - 1 ) + '_' + SUBSTR( xTemp, xPos + 1 ) + "~"
|
||||
cTemp := "~" + xTemp
|
||||
ELSE
|
||||
nLen -= LEN( xTemp ) + 2
|
||||
xTemp += "~" + xTemp + "~ "
|
||||
cTemp := "~" + xTemp
|
||||
END
|
||||
END
|
||||
|
||||
ENDIF
|
||||
FWRITE( nWriteHandle, ALLTRIM( cTemp ) + CRLF )
|
||||
cSeeAlso := SUBSTR( cSeeAlso, nPos + 1 )
|
||||
|
||||
IF nLen == 0 .OR. nLen < 0
|
||||
EXIT
|
||||
END
|
||||
ENDDO
|
||||
RETURN nil
|
||||
|
||||
FUNCTION ProcStatus( nWriteHandle, cBuffer )
|
||||
IF LEN( ALLTRIM( cBuffer ) ) > 1
|
||||
FWRITE( nWriteHandle, cBuffer + CRLF )
|
||||
ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "R"
|
||||
FWRITE( nWriteHandle, " Ready" + CRLF )
|
||||
ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "S"
|
||||
FWRITE( nWriteHandle, " Started" + CRLF )
|
||||
ELSE
|
||||
FWRITE( nWriteHandle, " Not Started" + CRLF )
|
||||
ENDIF
|
||||
RETURN nil
|
||||
|
||||
FUNCTION CheckTop( cTop )
|
||||
|
||||
LOCAL nPos
|
||||
LOCAL cTemp
|
||||
cTop := RTRIM( cTop )
|
||||
nPos := AT( " ", cTop )
|
||||
IF nPos > 0
|
||||
cTemp := SUBSTR( cTop, 1, nPos - 1 ) + '_' + SUBSTR( cTop, nPos + 1 )
|
||||
ELSE
|
||||
cTemp := cTop
|
||||
ENDIF
|
||||
RETURN cTemp
|
||||
588
harbour/utils/hbdoc/genhtm.prg
Normal file
588
harbour/utils/hbdoc/genhtm.prg
Normal file
@@ -0,0 +1,588 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* GENHTM 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 of the License, or
|
||||
* (at your option) any later version, with one exception:
|
||||
*
|
||||
* The exception is that if you link the Harbour Runtime Library (HRL)
|
||||
* and/or the Harbour Virtual Machine (HVM) 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 HRL
|
||||
* and/or HVM code into it.
|
||||
*
|
||||
* 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
|
||||
* their web site at http://www.gnu.org/).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#define NANFOR
|
||||
#endif
|
||||
|
||||
#include "directry.ch"
|
||||
#include "fileio.ch"
|
||||
#include "inkey.ch"
|
||||
|
||||
// output lines on the screen
|
||||
|
||||
#define INFILELINE 10
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
#xtranslate UPPERLOWER(<exp>) => (UPPER(SUBSTR(<exp>,1,1))+LOWER(SUBSTR(<exp>,2)))
|
||||
MEMVAR aDirList,aDocInfo,aWww
|
||||
|
||||
FUNCTION ProcessWww()
|
||||
|
||||
// Copyright (C) 2000 Luiz Rafael Culik
|
||||
//
|
||||
// Purpose: Process each of the files in the directory
|
||||
//
|
||||
// Modification History:
|
||||
// Version Date Who Notes
|
||||
// V1.00 1/12/2000 LRC Initial Version
|
||||
//
|
||||
// Calling parameters: None
|
||||
//
|
||||
// Notes: None
|
||||
// -
|
||||
// LOCAL variables:
|
||||
|
||||
#define D_NORMAL 1
|
||||
#define D_ARG 2
|
||||
#define D_SYNTAX 3
|
||||
#define D_IGNORE 4
|
||||
#define D_SEEALSO 5
|
||||
#define D_INCLUDE 6
|
||||
#define D_ONELINE 7
|
||||
#define D_STATUS 8
|
||||
LOCAL i
|
||||
LOCAL j
|
||||
LOCAL nFiles := LEN( aDirList )
|
||||
LOCAL nCommentLen
|
||||
LOCAL lEof
|
||||
LOCAL lDoc
|
||||
LOCAL cBuffer
|
||||
LOCAL nEnd
|
||||
LOCAL nCount
|
||||
|
||||
LOCAL cBar := REPLICATE( "-", 80 ) + CRLF
|
||||
LOCAL nMode
|
||||
LOCAL cFuncName
|
||||
LOCAL cOneLine
|
||||
LOCAL cCategory
|
||||
LOCAL cFileName
|
||||
LOCAL nLineCnt
|
||||
LOCAL cSeeAlso
|
||||
LOCAL cTemp
|
||||
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 oHtm
|
||||
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
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
// Open file for input
|
||||
|
||||
nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 3 )
|
||||
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
|
||||
|
||||
DO WHILE .NOT. lEof
|
||||
|
||||
// Read a line
|
||||
|
||||
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
|
||||
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
|
||||
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
|
||||
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 )
|
||||
oHtm:WritePar( "See Also " )
|
||||
ProcWwwalso( oHtm, cSeealso )
|
||||
ENDIF
|
||||
|
||||
oHtm: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 := UPPER( 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 := SUBSTR( cFuncName, 4 )
|
||||
ELSE
|
||||
cTemp := 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 + ".htm" } )
|
||||
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 ) + ".htm"
|
||||
|
||||
oHTM := THTML():new( "htm\" + LOWER( cFileName ) )
|
||||
IF oHtm:nHandle < 1
|
||||
? "Error creating", cFileName, ".htm"
|
||||
write_error( "Error creating",,,, cFileName + ".htm" )
|
||||
ENDIF
|
||||
// 2) Category
|
||||
ELSEIF AT( cCat, cBuffer ) > 0
|
||||
cBuffer := ReadLN( @lEof )
|
||||
nLineCnt ++
|
||||
// get the category
|
||||
cCategory := UPPER( 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
|
||||
oHtm:WriteTitle( PAD( cFuncName, 21 ) )
|
||||
AADD( aWWW,{ cFuncName,LEFT(cFileName,AT(".",cFileName)-1)} )
|
||||
oHtm:WriteParBold( cOneLine )
|
||||
oHtm:WritePar( cBar )
|
||||
// 4) all other stuff
|
||||
|
||||
ELSE
|
||||
|
||||
IF AT( cSyn, cBuffer ) > 0
|
||||
|
||||
oHtm:WriteParBold( " Syntax" )
|
||||
|
||||
nMode := D_SYNTAX
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cArg, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
|
||||
oHtm:WriteParBold( " Arguments" )
|
||||
|
||||
ENDIF
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cRet, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
|
||||
oHtm:WriteParBold( " Returns" )
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cDesc, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
oHtm:WriteParBold( " Description" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cExam, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
oHtm:WriteParBold( " Examples" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cTest, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
|
||||
oHtm:WriteParBold( " Tests" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cStatus, cBuffer ) > 0
|
||||
|
||||
nMode := D_STATUS
|
||||
|
||||
ELSEIF AT( cCompl, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
oHtm:WriteParBold( " Compliance" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cPlat, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
oHtm:WriteParBold( " Platforms" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFiles, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
oHtm:WriteParBold( " Files" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFunction, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
oHtm:WriteParBold( " Functions" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cSee, cBuffer ) > 0
|
||||
nMode := D_SEEALSO
|
||||
ELSEIF AT( cInc, cBuffer ) > 0
|
||||
nMode := D_INCLUDE
|
||||
|
||||
// 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 lAddBlank
|
||||
oHtm:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
cBuffer := ProcwwwBuf( cBuffer )
|
||||
|
||||
oHtm:WritePar( cBuffer )
|
||||
ELSEIF nMode = D_ARG
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "Arguments", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oHtm:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
cBuffer := STRTRAN( cBuffer, "<", "<", 1 )
|
||||
cBuffer := STRTRAN( cBuffer, ">", ">", 1 )
|
||||
oHtm:WritePar( cBuffer )
|
||||
ELSEIF nMode = D_NORMAL
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "General", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oHtm:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
oHtm:WritePar( StripNgControls( cBuffer ) )
|
||||
ELSEIF nMode = D_SEEALSO
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
cSeeAlso := StripFiles( ALLTRIM( cBuffer ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_INCLUDE
|
||||
// read next line
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
IF !lBlankLine
|
||||
oHtm:WritePar( "" )
|
||||
ENDIF
|
||||
oHtm:WritePar( " Header File: " ;
|
||||
+ ALLTRIM( cBuffer ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_STATUS
|
||||
IF !EMPTY( cBuffer )
|
||||
oHtm:WriteParBold( "Status" )
|
||||
ENDIF
|
||||
ProcStatusWww( oHtm, 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()
|
||||
NEXT
|
||||
RETURN nil
|
||||
/***********************************
|
||||
* Function ProcWwwBuf(cBuffer) -> cTemp
|
||||
* Parameter cBuffer -> Strip the "<" and ">" symbols from the imput String
|
||||
* Return cTemp Formated String to WWW output
|
||||
*/
|
||||
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcWwwBuf()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcWwwBuf( cPar )
|
||||
|
||||
cPar:=STRTRAN(cPar,"<","<")
|
||||
cPar:=STRTRAN(cPar,">",">")
|
||||
|
||||
RETURN cPar
|
||||
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcWwwAlso()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcWwwAlso( nWriteHandle, cSeeAlso )
|
||||
|
||||
LOCAL nPos
|
||||
LOCAL cTemp := ''
|
||||
LOCAL xTemp
|
||||
LOCAL nLen
|
||||
LOCAL xPos
|
||||
LOCAL tPos
|
||||
nLen := LEN( cSeeAlso )
|
||||
WHILE .t.
|
||||
nPos := AT( ",", cSeeAlso )
|
||||
IF nPos > 0
|
||||
xTemp := SUBSTR( ALLTRIM( cSeeAlso ), 1, nPos - 1 )
|
||||
tPos := AT( "()", xTemp )
|
||||
IF tPos > 0
|
||||
nLen -= LEN( xTemp ) + 1
|
||||
|
||||
cTemp := xTemp
|
||||
ELSE
|
||||
xPos := AT( " ", xTemp )
|
||||
IF xPos > 0
|
||||
nLen -= LEN( xTemp ) + 3
|
||||
|
||||
cTemp := xTemp
|
||||
ELSE
|
||||
nLen -= LEN( xTemp ) + 2
|
||||
|
||||
cTemp := xTemp
|
||||
END
|
||||
|
||||
END
|
||||
ELSE
|
||||
xTemp := SUBSTR( cSeeAlso, 1 )
|
||||
tPos := AT( "()", xTemp )
|
||||
|
||||
IF tPos > 0
|
||||
nLen -= LEN( xTemp ) + 1
|
||||
|
||||
cTemp := xTemp
|
||||
ELSE
|
||||
|
||||
xPos := AT( " ", xTemp )
|
||||
IF xPos > 0
|
||||
nLen -= LEN( xTemp ) + 3
|
||||
|
||||
cTemp := xTemp
|
||||
ELSE
|
||||
nLen -= LEN( xTemp ) + 2
|
||||
|
||||
cTemp := xTemp
|
||||
END
|
||||
END
|
||||
|
||||
ENDIF
|
||||
|
||||
nWriteHandle:WriteLink( ALLTRIM( cTemp ) )
|
||||
cSeeAlso := SUBSTR( cSeeAlso, nPos + 1 )
|
||||
|
||||
IF nLen == 0 .OR. nLen < 0
|
||||
EXIT
|
||||
END
|
||||
ENDDO
|
||||
RETURN nil
|
||||
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcStatusWww()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcStatusWww( 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" )
|
||||
ELSE
|
||||
nWriteHandle:WritePar( " Not Started" )
|
||||
ENDIF
|
||||
RETURN nil
|
||||
724
harbour/utils/hbdoc/genng.prg
Normal file
724
harbour/utils/hbdoc/genng.prg
Normal file
@@ -0,0 +1,724 @@
|
||||
/*
|
||||
* $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 of the License, or
|
||||
* (at your option) any later version, with one exception:
|
||||
*
|
||||
* The exception is that if you link the Harbour Runtime Library (HRL)
|
||||
* and/or the Harbour Virtual Machine (HVM) 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 HRL
|
||||
* and/or HVM code into it.
|
||||
*
|
||||
* 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
|
||||
* their web site at http://www.gnu.org/).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#define NANFOR
|
||||
#endif
|
||||
|
||||
#include "directry.ch"
|
||||
#include "fileio.ch"
|
||||
#include "inkey.ch"
|
||||
|
||||
// output lines on the screen
|
||||
|
||||
#define INFILELINE 10
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
#xtranslate UPPERLOWER(<exp>) => (UPPER(SUBSTR(<exp>,1,1))+LOWER(SUBSTR(<exp>,2)))
|
||||
MEMVAR aDirlist,aDocInfo
|
||||
STATIC aAlso
|
||||
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:
|
||||
|
||||
#define D_NORMAL 1
|
||||
#define D_ARG 2
|
||||
#define D_SYNTAX 3
|
||||
#define D_IGNORE 4
|
||||
#define D_SEEALSO 5
|
||||
#define D_INCLUDE 6
|
||||
#define D_ONELINE 7
|
||||
#define D_STATUS 8
|
||||
LOCAL i
|
||||
LOCAL j
|
||||
LOCAL nFiles := LEN( aDirList )
|
||||
LOCAL nCommentLen
|
||||
LOCAL lEof
|
||||
LOCAL lDoc
|
||||
LOCAL cBuffer
|
||||
LOCAL nEnd
|
||||
LOCAL nCount ,nAlso
|
||||
|
||||
LOCAL cBar := "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
|
||||
LOCAL nMode
|
||||
LOCAL cFuncName
|
||||
LOCAL cOneLine
|
||||
LOCAL cCategory
|
||||
LOCAL cFileName
|
||||
LOCAL nLineCnt
|
||||
LOCAL cSeeAlso
|
||||
LOCAL cTemp
|
||||
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
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
// Open file for input
|
||||
|
||||
nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 3 )
|
||||
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
|
||||
|
||||
DO WHILE .NOT. lEof
|
||||
|
||||
// Read a line
|
||||
|
||||
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
|
||||
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
|
||||
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
|
||||
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 := UPPER( 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 := SUBSTR( cFuncName, 4 )
|
||||
ELSE
|
||||
cTemp := 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( cCat, cBuffer ) > 0
|
||||
cBuffer := ReadLN( @lEof )
|
||||
nLineCnt ++
|
||||
// get the category
|
||||
cCategory := UPPER( 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
|
||||
oNgi:WriteTitle( PAD( cFuncName, 21 ) + cOneLine, cFuncName )
|
||||
oNgi:WritePar( cOneLine )
|
||||
oNgi:WritePar( cBar )
|
||||
// 4) all other stuff
|
||||
|
||||
ELSE
|
||||
|
||||
IF AT( cSyn, cBuffer ) > 0
|
||||
|
||||
oNgi:WriteParBold( " Syntax" )
|
||||
|
||||
nMode := D_SYNTAX
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cArg, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
|
||||
oNgi:WriteParBold( " Arguments" )
|
||||
|
||||
ENDIF
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cRet, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
|
||||
oNgi:WriteParBold( " Returns" )
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cDesc, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
oNgi:WriteParBold( " Description" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cExam, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
oNgi:WriteParBold( " Examples" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cTest, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
|
||||
oNgi:WriteParBold( " Tests" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cStatus, cBuffer ) > 0
|
||||
|
||||
nMode := D_STATUS
|
||||
|
||||
ELSEIF AT( cCompl, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
oNgi:WriteParBold( " Compliance" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cPlat, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
oNgi:WriteParBold( " Platforms" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFiles, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
oNgi:WriteParBold( " Files" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cFunction, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
oNgi:WriteParBold( " Functions" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cSee, cBuffer ) > 0
|
||||
nMode := D_SEEALSO
|
||||
ELSEIF AT( cInc, cBuffer ) > 0
|
||||
nMode := D_INCLUDE
|
||||
|
||||
// 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 lAddBlank
|
||||
oNgi:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
oNgi:WritePar( cBuffer )
|
||||
ELSEIF nMode = D_ARG
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "Arguments", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oNgi:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
cBuffer := STRTRAN( cBuffer, "<", "<", 1 )
|
||||
cBuffer := STRTRAN( cBuffer, ">", ">", 1 )
|
||||
oNgi:WritePar( StripNgControls( cBuffer ) )
|
||||
ELSEIF nMode = D_NORMAL
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "General", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oNgi:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
oNgi:WritePar( StripNgControls( cBuffer ) )
|
||||
ELSEIF nMode = D_SEEALSO
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
cSeeAlso := ProcNgiAlso( StripFiles( ALLTRIM( cBuffer ) ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_INCLUDE
|
||||
// read next line
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
IF !lBlankLine
|
||||
oNgi:WritePar( "" )
|
||||
ENDIF
|
||||
oNgi:WritePar( " Header File: " ;
|
||||
+ ALLTRIM( cBuffer ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_STATUS
|
||||
IF !EMPTY( cBuffer )
|
||||
oNgi:WriteParBold( "Status" )
|
||||
ENDIF
|
||||
ProcStatusWww( 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()
|
||||
NEXT
|
||||
Return Nil
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcNgiAlso()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcNgiAlso( cSeealso )
|
||||
aAlso:={}
|
||||
aAlso := ListAsArray( cSeealso, "," )
|
||||
|
||||
RETURN aAlso
|
||||
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcNgiInput()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcNgiInput()
|
||||
|
||||
LOCAL aFiles := {}
|
||||
LOCAL aFuncs := {}
|
||||
LOCAL aFuncsam := {}
|
||||
LOCAL aFuncsn_ := {}
|
||||
LOCAL acfiles := {}
|
||||
LOCAL aComms := {}
|
||||
|
||||
LOCAL cName,cT,cTs,cFile
|
||||
LOCAL x,nPos,nAlso,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 )
|
||||
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"
|
||||
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 )
|
||||
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 + CRLF )
|
||||
|
||||
ENDDO
|
||||
IF LEN( aAlso ) > 0
|
||||
cBuffer := "!SeeAlso: "
|
||||
FOR nAlso := 1 TO LEN( aAlso )
|
||||
cBuffer += aAlso[ nalso ] + " "
|
||||
NEXT
|
||||
ENDIF
|
||||
|
||||
FWRITE( nXhandle, cBuffer + CRLF )
|
||||
|
||||
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 )
|
||||
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( nYhandle, cBuffer + CRLF )
|
||||
|
||||
ENDDO
|
||||
|
||||
IF LEN( aAlso ) > 0
|
||||
cBuffer := "!SeeAlso: "
|
||||
FOR nAlso := 1 TO LEN( aAlso )
|
||||
cBuffer += aAlso[ nalso ] + " "
|
||||
NEXT
|
||||
ENDIF
|
||||
|
||||
FWRITE( nYhandle, cBuffer + CRLF )
|
||||
|
||||
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 LEFT( cFile, AT( '.', cFile ) - 1 ) <> "LICENSE" .AND. LEFT( cFile, AT( '.', cFile ) - 1 ) <> "OVERVIEW"
|
||||
|
||||
@ INFILELINE, 33 SAY PAD( cfile, 47 )
|
||||
|
||||
Ft_FUse( "ngi\" + acfiles[ x ] )
|
||||
aAlso := {}
|
||||
WHILE !lEof
|
||||
cBuffer := ReadLn( @lEof )
|
||||
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( y, cBuffer + CRLF )
|
||||
|
||||
ENDDO
|
||||
|
||||
IF LEN( aAlso ) > 0
|
||||
cBuffer := "!SeeAlso: "
|
||||
FOR nAlso := 1 TO LEN( aAlso )
|
||||
cBuffer += aAlso[ nalso ]
|
||||
NEXT
|
||||
FWRITE( y, cBuffer + CRLF )
|
||||
|
||||
ENDIF
|
||||
ENDIF
|
||||
lEof := .f.
|
||||
aAlso := {}
|
||||
Ft_FUse()
|
||||
NEXT
|
||||
lEof := .f.
|
||||
FCLOSE( y )
|
||||
RETURN NIL
|
||||
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcNgiAlso2()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
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 < "N"
|
||||
nPos := AT( "()", xAlso[ hPos ] )
|
||||
IF nPos > 0
|
||||
AADD( aAlso, "funcam.ngo:" + ALLTRIM( xAlso[ hPos ] ) + ' ' )
|
||||
ELSEIF nPos = 0 .AND. xAlso[ hPos ] <> "LICENSE" .AND. xAlso[ hPos ] <> "OVERVIEW" .AND. !EMPTY( xAlso[ hPos ] )
|
||||
AADD( aAlso, "Comm.ngo:" + ALLTRIM( xAlso[ hPos ] ) + ' ' )
|
||||
ENDIF
|
||||
ELSE
|
||||
nPos := AT( "()", xAlso[ hPos ] )
|
||||
IF nPos > 0
|
||||
AADD( aAlso, "funcn_.ngo:" + ALLTRIM( xAlso[ hPos ] ) + ' ' )
|
||||
ELSEIF nPos = 0 .AND. xAlso[ hPos ] <> "LICENSE" .AND. xAlso[ hPos ] <> "OVERVIEW" .AND. !EMPTY( xAlso[ hPos ] )
|
||||
AADD( aAlso, "Comm.ngo:" + ALLTRIM( xAlso[ hPos ] ) + ' ' )
|
||||
ENDIF
|
||||
ENDIF
|
||||
NEXT
|
||||
RETURN aAlso
|
||||
517
harbour/utils/hbdoc/genos2.prg
Normal file
517
harbour/utils/hbdoc/genos2.prg
Normal file
@@ -0,0 +1,517 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* GENOS2 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 of the License, or
|
||||
* (at your option) any later version, with one exception:
|
||||
*
|
||||
* The exception is that if you link the Harbour Runtime Library (HRL)
|
||||
* and/or the Harbour Virtual Machine (HVM) 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 HRL
|
||||
* and/or HVM code into it.
|
||||
*
|
||||
* 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
|
||||
* their web site at http://www.gnu.org/).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#define NANFOR
|
||||
#endif
|
||||
|
||||
#include "directry.ch"
|
||||
#include "fileio.ch"
|
||||
#include "inkey.ch"
|
||||
|
||||
// output lines on the screen
|
||||
|
||||
#define INFILELINE 10
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
#xtranslate UPPERLOWER(<exp>) => (UPPER(SUBSTR(<exp>,1,1))+LOWER(SUBSTR(<exp>,2)))
|
||||
MEMVAR aDirlist,aDocInfo
|
||||
STATIC aAlso
|
||||
|
||||
FUNCTION ProcessOs2()
|
||||
|
||||
//
|
||||
|
||||
// Copyright (C) 2000 Luiz Rafael Culik
|
||||
//
|
||||
// Purpose: Process each of the files in the directory
|
||||
// and generate .tr file format output
|
||||
// Modification History:
|
||||
// Version Date Who Notes
|
||||
// V1.00 1/20/2000 LRC Initial Version
|
||||
//
|
||||
// Calling parameters: None
|
||||
//
|
||||
// Notes: None
|
||||
// -
|
||||
// LOCAL variables:
|
||||
|
||||
#define D_NORMAL 1
|
||||
#define D_ARG 2
|
||||
#define D_SYNTAX 3
|
||||
#define D_IGNORE 4
|
||||
#define D_SEEALSO 5
|
||||
#define D_INCLUDE 6
|
||||
#define D_ONELINE 7
|
||||
#define D_STATUS 8
|
||||
LOCAL i
|
||||
LOCAL j
|
||||
LOCAL nFiles
|
||||
LOCAL nCommentLen
|
||||
LOCAL lEof
|
||||
LOCAL lDoc
|
||||
LOCAL cBuffer
|
||||
LOCAL nEnd
|
||||
LOCAL nCount,nAlso
|
||||
|
||||
LOCAL cBar := "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
|
||||
LOCAL nMode
|
||||
LOCAL cFuncName
|
||||
LOCAL cOneLine
|
||||
LOCAL cCategory
|
||||
LOCAL cFileName
|
||||
LOCAL nLineCnt
|
||||
LOCAL cSeeAlso
|
||||
LOCAL cTemp
|
||||
LOCAL cChar
|
||||
LOCAL oOs2
|
||||
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 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
|
||||
|
||||
|
||||
nFiles := LEN( aDirList )
|
||||
//
|
||||
// Entry Point
|
||||
//
|
||||
// Put up information labels
|
||||
@ INFILELINE, 20 SAY "Extracting: "
|
||||
@ MODULELINE, 20 SAY "Documenting: "
|
||||
// loop through all of the files
|
||||
oOs2 := tOS2():new( "ipf\Harbour.ipf" )
|
||||
FOR i := 1 TO nFiles
|
||||
|
||||
// Open file for input
|
||||
|
||||
nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 3 )
|
||||
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
|
||||
|
||||
DO WHILE .NOT. lEof
|
||||
|
||||
// Read a line
|
||||
|
||||
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
|
||||
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
|
||||
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
|
||||
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 )
|
||||
oOs2:WritePar( ".br" + CRLF + "See Also:" )
|
||||
FOR nAlso := 1 TO LEN( aAlso )
|
||||
|
||||
IF nAlso == 1
|
||||
oOs2:WriteLink( aAlso[ nAlso ] )
|
||||
ELSE
|
||||
oOs2:WriteLink( aAlso[ nAlso ] )
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
ENDIF
|
||||
|
||||
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 := UPPER( 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 := SUBSTR( cFuncName, 4 )
|
||||
ELSE
|
||||
cTemp := 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 + ".ipf" } )
|
||||
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
|
||||
|
||||
IF oOs2:nHandle < 1
|
||||
? "Error creating", cFileName, ".ipf"
|
||||
write_error( "Error creating",,,, cFileName + ".ipf" )
|
||||
ENDIF
|
||||
// 2) Category
|
||||
ELSEIF AT( cCat, cBuffer ) > 0
|
||||
cBuffer := ReadLN( @lEof )
|
||||
nLineCnt ++
|
||||
// get the category
|
||||
cCategory := UPPER( 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
|
||||
oOs2:WriteTitle( PAD( cFuncName, 21 ), cFuncName )
|
||||
oOs2:WriteParBold( cOneLine )
|
||||
// 4) all other stuff
|
||||
|
||||
ELSE
|
||||
|
||||
IF AT( cSyn, cBuffer ) > 0
|
||||
|
||||
oOs2:WriteParBold( " Syntax" )
|
||||
|
||||
nMode := D_SYNTAX
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cArg, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
|
||||
oOs2:WriteParBold( " Arguments" )
|
||||
|
||||
ENDIF
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cRet, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
|
||||
oOs2:WriteParBold( " Returns" )
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cDesc, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
oOs2:WriteParBold( " Description" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cExam, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
oOs2:WriteParBold( " Examples" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cTest, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
|
||||
oOs2:WriteParBold( " Tests" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cStatus, cBuffer ) > 0
|
||||
|
||||
nMode := D_STATUS
|
||||
|
||||
ELSEIF AT( cCompl, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
oOs2:WriteParBold( " Compliance" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cPlat, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
oOs2:WriteParBold( " Platforms" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFiles, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
oOs2:WriteParBold( " Files" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFunction, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
oOs2:WriteParBold( " Function" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cSee, cBuffer ) > 0
|
||||
nMode := D_SEEALSO
|
||||
ELSEIF AT( cInc, cBuffer ) > 0
|
||||
nMode := D_INCLUDE
|
||||
|
||||
// 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 lAddBlank
|
||||
oOs2:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
/* nNonBlank:=FirstNB(cBuffer)
|
||||
cBuffer=STUFF(cBuffer,nNonBlank,0,"^a1f ")*/
|
||||
oOs2:WritePar( cBuffer )
|
||||
ELSEIF nMode = D_ARG
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "Arguments", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oOs2:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
cBuffer := STRTRAN( cBuffer, "<", "<", 1 )
|
||||
cBuffer := STRTRAN( cBuffer, ">", ">", 1 )
|
||||
oOs2:WritePar( StripNgControls( cBuffer ) )
|
||||
ELSEIF nMode = D_NORMAL
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "General", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oOs2:WritePar( "" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
oOs2:WritePar( StripNgControls( cBuffer ) )
|
||||
ELSEIF nMode = D_SEEALSO
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
cSeeAlso := ProcOs2Also( StripFiles( ALLTRIM( cBuffer ) ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_INCLUDE
|
||||
// read next line
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
IF !lBlankLine
|
||||
oOs2:WritePar( "" )
|
||||
ENDIF
|
||||
oOs2:WritePar( " Header File: " ;
|
||||
+ ALLTRIM( cBuffer ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_STATUS
|
||||
IF !EMPTY( cBuffer )
|
||||
oOs2:WriteParBold( "Status" )
|
||||
ENDIF
|
||||
ProcStatusOs2( oOs2, 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()
|
||||
NEXT
|
||||
oOs2:Close()
|
||||
RETURN NIL
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcStatusOs2()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcStatusOs2( 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" )
|
||||
ELSE
|
||||
nWriteHandle:WritePar( " Not Started" )
|
||||
ENDIF
|
||||
RETURN nil
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcOs2Also()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcOs2Also( cSeealso )
|
||||
aAlso := {}
|
||||
aAlso := ListAsArray2( cSeealso, "," )
|
||||
RETURN aAlso
|
||||
580
harbour/utils/hbdoc/genrtf.prg
Normal file
580
harbour/utils/hbdoc/genrtf.prg
Normal file
@@ -0,0 +1,580 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* GENRTF 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 of the License, or
|
||||
* (at your option) any later version, with one exception:
|
||||
*
|
||||
* The exception is that if you link the Harbour Runtime Library (HRL)
|
||||
* and/or the Harbour Virtual Machine (HVM) 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 HRL
|
||||
* and/or HVM code into it.
|
||||
*
|
||||
* 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
|
||||
* their web site at http://www.gnu.org/).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#define NANFOR
|
||||
#endif
|
||||
|
||||
#include "directry.ch"
|
||||
#include "fileio.ch"
|
||||
#include "inkey.ch"
|
||||
|
||||
// output lines on the screen
|
||||
|
||||
#define INFILELINE 10
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
#xtranslate UPPERLOWER(<exp>) => (UPPER(SUBSTR(<exp>,1,1))+LOWER(SUBSTR(<exp>,2)))
|
||||
MEMVAR aDirList,aDocInfo
|
||||
|
||||
FUNCTION ProcessRtf()
|
||||
|
||||
//
|
||||
// Copyright (C) 2000 Luiz Rafael Culik
|
||||
//
|
||||
// Purpose: Process each of the files in the directory
|
||||
//
|
||||
// Modification History:
|
||||
// Version Date Who Notes
|
||||
// V1.00 1/08/2000 LRC Initial Version
|
||||
//
|
||||
// Calling parameters: None
|
||||
//
|
||||
// Notes: None
|
||||
// -
|
||||
// LOCAL variables:
|
||||
|
||||
#define D_NORMAL 1
|
||||
#define D_ARG 2
|
||||
#define D_SYNTAX 3
|
||||
#define D_IGNORE 4
|
||||
#define D_SEEALSO 5
|
||||
#define D_INCLUDE 6
|
||||
#define D_ONELINE 7
|
||||
#define D_STATUS 8
|
||||
LOCAL i
|
||||
LOCAL j
|
||||
LOCAL nFiles := LEN( aDirList )
|
||||
LOCAL nCommentLen
|
||||
LOCAL lEof
|
||||
LOCAL lDoc
|
||||
LOCAL cBuffer
|
||||
LOCAL nEnd
|
||||
LOCAL nCount
|
||||
LOCAL xAddBlank
|
||||
|
||||
LOCAL cBar := "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
|
||||
LOCAL nMode
|
||||
LOCAL cFuncName
|
||||
LOCAL cOneLine
|
||||
LOCAL cCategory
|
||||
LOCAL cFileName
|
||||
LOCAL nLineCnt
|
||||
LOCAL cSeeAlso
|
||||
LOCAL cTemp
|
||||
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 oRtf
|
||||
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
|
||||
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
// Open file for input
|
||||
|
||||
nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 3 )
|
||||
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
|
||||
|
||||
DO WHILE .NOT. lEof
|
||||
|
||||
// Read a line
|
||||
|
||||
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
|
||||
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
|
||||
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
|
||||
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 )
|
||||
oRtf:WritePar(""):EndPar()
|
||||
oRtf:WriteParBold( "See Also" )
|
||||
ProcRtfalso( oRtf, cSeealso )
|
||||
ENDIF
|
||||
|
||||
oRtf: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 := UPPER( 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 := SUBSTR( cFuncName, 4 )
|
||||
ELSE
|
||||
cTemp := 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 + ".rtf" } )
|
||||
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 ) + ".rtf"
|
||||
|
||||
oRtf := TRTF():new( "rtf\" + cFileName ):WriteHeader()
|
||||
IF oRtf:nHandle < 1
|
||||
? "Error creating", cFileName, ".rtf"
|
||||
write_error( "Error creating",,,, cFileName + ".rtf" )
|
||||
ENDIF
|
||||
// 2) Category
|
||||
ELSEIF AT( cCat, cBuffer ) > 0
|
||||
cBuffer := ReadLN( @lEof )
|
||||
nLineCnt ++
|
||||
// get the category
|
||||
cCategory := UPPER( 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
|
||||
oRtf:WriteTitle( PAD( cFuncName, 21 ), cFuncName )
|
||||
oRtf:WriteParBold( cOneLine )
|
||||
oRtf:WritePar( cBar ):EndPar()
|
||||
// 4) all other stuff
|
||||
|
||||
ELSE
|
||||
|
||||
IF AT( cSyn, cBuffer ) > 0
|
||||
|
||||
oRtf:WriteParBold( " Syntax" )
|
||||
|
||||
nMode := D_SYNTAX
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cArg, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
|
||||
oRtf:WriteParBold( " Arguments" )
|
||||
|
||||
ENDIF
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cRet, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
|
||||
oRtf:WriteParBold( " Returns" )
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cDesc, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
oRtf:WriteParBold( " Description" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cExam, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
oRtf:WriteParBold( " Examples" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cTest, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
|
||||
oRtf:WriteParBold( " Tests" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cStatus, cBuffer ) > 0
|
||||
|
||||
nMode := D_STATUS
|
||||
|
||||
ELSEIF AT( cCompl, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
oRtf:WriteParBold( " Compliance" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cPlat, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
oRtf:WriteParBold( " Platforms" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFiles, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
oRtf:WriteParBold( " Files" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cFunction, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
oRtf:WriteParBold( " Functions" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cSee, cBuffer ) > 0
|
||||
nMode := D_SEEALSO
|
||||
ELSEIF AT( cInc, cBuffer ) > 0
|
||||
nMode := D_INCLUDE
|
||||
|
||||
// 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 lAddBlank
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
/* nNonBlank:=FirstNB(cBuffer)
|
||||
cBuffer=STUFF(cBuffer,nNonBlank,0,"^a1f ")*/
|
||||
oRtf:WritePar( cBuffer ):EndPar()
|
||||
oRtf:WritePar(""):EndPar()
|
||||
|
||||
ELSEIF nMode = D_ARG
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "Arguments", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
cBuffer := STRTRAN( cBuffer, "<", "<", 1 )
|
||||
cBuffer := STRTRAN( cBuffer, ">", ">", 1 )
|
||||
oRtf:WritePar( StripNgControls( cBuffer ) ):EndPar()
|
||||
ELSEIF nMode = D_NORMAL
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "General", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
oRtf:WritePar( StripNgControls( cBuffer ) ):EndPar()
|
||||
|
||||
ELSEIF nMode = D_SEEALSO
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
cSeeAlso := StripFiles( ALLTRIM( cBuffer ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_INCLUDE
|
||||
// read next line
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
IF !lBlankLine
|
||||
oRtf:WritePar( "" ):EndPar()
|
||||
ENDIF
|
||||
oRtf:WritePar( " Header File: " ;
|
||||
+ ALLTRIM( cBuffer ) ):EndPar()
|
||||
ENDIF
|
||||
ELSEIF nMode = D_STATUS
|
||||
IF !EMPTY( cBuffer )
|
||||
oRtf:WritePar(""):EndPar()
|
||||
oRtf:WriteParBold( "Status" )
|
||||
oRtf:WritePar(""):EndPar()
|
||||
xaddblank:=.T.
|
||||
ELSE
|
||||
oRtf:WritePar(""):EndPar()
|
||||
xAddBlank:=.T.
|
||||
ENDIF
|
||||
ProcStatusRtf( oRtf, cBuffer )
|
||||
IF !xAddBlank
|
||||
oRtf:WritePar(""):EndPar()
|
||||
xaddblank:=.T.
|
||||
ENDIF
|
||||
xAddBlank:=.F.
|
||||
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()
|
||||
NEXT
|
||||
|
||||
RETURN NIL
|
||||
|
||||
FUNCTION ProcRtfAlso( nWriteHandle, cSeeAlso )
|
||||
|
||||
LOCAL nPos
|
||||
LOCAL cTemp := ''
|
||||
LOCAL nLen
|
||||
LOCAL xPos
|
||||
LOCAL xTemp
|
||||
LOCAL tPos
|
||||
nLen := LEN( cSeeAlso )
|
||||
WHILE .t.
|
||||
nPos := AT( ",", cSeeAlso )
|
||||
|
||||
IF nPos > 0
|
||||
xTemp := SUBSTR( ALLTRIM( cSeeAlso ), 1, nPos - 1 )
|
||||
tPos := AT( "()", xTemp )
|
||||
IF tPos > 0
|
||||
nLen -= LEN( xTemp ) + 1
|
||||
|
||||
cTemp := xTemp
|
||||
ELSE
|
||||
xPos := AT( " ", xTemp )
|
||||
IF xPos > 0
|
||||
nLen -= LEN( xTemp ) + 3
|
||||
|
||||
cTemp := xTemp
|
||||
ELSE
|
||||
nLen -= LEN( xTemp ) + 2
|
||||
|
||||
cTemp := xTemp
|
||||
END
|
||||
|
||||
END
|
||||
ELSE
|
||||
xTemp := SUBSTR( cSeeAlso, 1 )
|
||||
tPos := AT( "()", xTemp )
|
||||
|
||||
IF tPos > 0
|
||||
nLen -= LEN( xTemp ) + 1
|
||||
|
||||
cTemp := xTemp
|
||||
ELSE
|
||||
|
||||
xPos := AT( " ", xTemp )
|
||||
IF xPos > 0
|
||||
nLen -= LEN( xTemp ) + 3
|
||||
|
||||
cTemp := xTemp
|
||||
ELSE
|
||||
nLen -= LEN( xTemp ) + 2
|
||||
|
||||
cTemp := xTemp
|
||||
END
|
||||
END
|
||||
|
||||
ENDIF
|
||||
|
||||
nWriteHandle:WriteLink( ALLTRIM( cTemp ) )
|
||||
cSeeAlso := SUBSTR( cSeeAlso, nPos + 1 )
|
||||
|
||||
IF nLen == 0 .OR. nLen < 0
|
||||
EXIT
|
||||
END
|
||||
ENDDO
|
||||
RETURN nil
|
||||
|
||||
FUNCTION ProcStatusRTF( nWriteHandle, cBuffer )
|
||||
IF LEN( ALLTRIM(cBuffer) ) >1
|
||||
nWriteHandle:WritePar( cBuffer ):EndPar()
|
||||
ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "R"
|
||||
nWriteHandle:WritePar( " Ready" ):EndPar()
|
||||
ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "S"
|
||||
nWriteHandle:WritePar( " Started" ):EndPar()
|
||||
ELSE
|
||||
nWriteHandle:WritePar( " Not Started" ):EndPar()
|
||||
ENDIF
|
||||
RETURN nil
|
||||
|
||||
509
harbour/utils/hbdoc/gentrf.prg
Normal file
509
harbour/utils/hbdoc/gentrf.prg
Normal file
@@ -0,0 +1,509 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* Gentrf 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 of the License, or
|
||||
* (at your option) any later version, with one exception:
|
||||
*
|
||||
* The exception is that if you link the Harbour Runtime Library (HRL)
|
||||
* and/or the Harbour Virtual Machine (HVM) 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 HRL
|
||||
* and/or HVM code into it.
|
||||
*
|
||||
* 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
|
||||
* their web site at http://www.gnu.org/).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#define NANFOR
|
||||
#endif
|
||||
|
||||
#include "directry.ch"
|
||||
#include "fileio.ch"
|
||||
#include "inkey.ch"
|
||||
|
||||
// output lines on the screen
|
||||
|
||||
#define INFILELINE 10
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
#xtranslate UPPERLOWER(<exp>) => (UPPER(SUBSTR(<exp>,1,1))+LOWER(SUBSTR(<exp>,2)))
|
||||
MEMVAR aDirlist,aDocInfo
|
||||
STATIC aAlso
|
||||
FUNCTION ProcessTroff
|
||||
|
||||
//
|
||||
|
||||
// Copyright (C) 2000 Luiz Rafael Culik
|
||||
//
|
||||
// Purpose: Process each of the files in the directory
|
||||
// and generate .tr file format output
|
||||
// Modification History:
|
||||
// Version Date Who Notes
|
||||
// V1.00 1/06/2000 LRC Initial Version
|
||||
//
|
||||
// Calling parameters: None
|
||||
//
|
||||
// Notes: None
|
||||
// -
|
||||
// LOCAL variables:
|
||||
|
||||
#define D_NORMAL 1
|
||||
#define D_ARG 2
|
||||
#define D_SYNTAX 3
|
||||
#define D_IGNORE 4
|
||||
#define D_SEEALSO 5
|
||||
#define D_INCLUDE 6
|
||||
#define D_ONELINE 7
|
||||
#define D_STATUS 8
|
||||
LOCAL i
|
||||
LOCAL j
|
||||
LOCAL nFiles := LEN( aDirList )
|
||||
LOCAL nCommentLen
|
||||
LOCAL lEof
|
||||
LOCAL lDoc
|
||||
LOCAL cBuffer
|
||||
LOCAL nEnd
|
||||
LOCAL nCount
|
||||
|
||||
LOCAL cBar := "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
|
||||
LOCAL nMode
|
||||
LOCAL cFuncName
|
||||
LOCAL cOneLine
|
||||
LOCAL cCategory
|
||||
LOCAL cFileName
|
||||
LOCAL nLineCnt
|
||||
LOCAL cSeeAlso
|
||||
LOCAL cTemp
|
||||
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 nAlso
|
||||
LOCAL oTroff
|
||||
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
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
// Open file for input
|
||||
|
||||
nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 3 )
|
||||
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
|
||||
|
||||
DO WHILE .NOT. lEof
|
||||
|
||||
// Read a line
|
||||
|
||||
cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
|
||||
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
|
||||
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
|
||||
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 )
|
||||
oTroff:WriteText( '.ft B' + CRLF + "See Also:" + CRLF + '.ft R' )
|
||||
FOR nAlso := 1 TO LEN( aAlso )
|
||||
|
||||
IF nAlso == 1
|
||||
oTroff:WriteLink( aalso[ nAlso ] )
|
||||
ELSE
|
||||
oTroff:WriteLink( "," + aalso[ nAlso ] )
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
ENDIF
|
||||
|
||||
otroff: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 := UPPER( 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 := SUBSTR( cFuncName, 4 )
|
||||
ELSE
|
||||
cTemp := 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 + ".tr" } )
|
||||
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 ) + ".tr"
|
||||
|
||||
otroff := tTroff():new( "tr\" + cFileName )
|
||||
IF otroff:nHandle < 1
|
||||
? "Error creating", cFileName, ".tr"
|
||||
write_error( "Error creating",,,, cFileName + ".tr" )
|
||||
ENDIF
|
||||
// 2) Category
|
||||
ELSEIF AT( cCat, cBuffer ) > 0
|
||||
cBuffer := ReadLN( @lEof )
|
||||
nLineCnt ++
|
||||
// get the category
|
||||
cCategory := UPPER( 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
|
||||
otroff:WriteTitle( PAD( cFuncName, 21 ), cFuncName )
|
||||
otroff:WriteParBold( cOneLine )
|
||||
// 4) all other stuff
|
||||
|
||||
ELSE
|
||||
|
||||
IF AT( cSyn, cBuffer ) > 0
|
||||
|
||||
otroff:WriteParBold( " Syntax" )
|
||||
|
||||
nMode := D_SYNTAX
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cArg, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
|
||||
otroff:WriteParBold( " Arguments" )
|
||||
|
||||
ENDIF
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cRet, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
ENDIF
|
||||
|
||||
otroff:WriteParBold( " Returns" )
|
||||
|
||||
nMode := D_ARG
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cDesc, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
ENDIF
|
||||
otroff:WriteParBold( " Description" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cExam, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
ENDIF
|
||||
otroff:WriteParBold( " Examples" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cTest, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
ENDIF
|
||||
|
||||
otroff:WriteParBold( " Tests" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cStatus, cBuffer ) > 0
|
||||
|
||||
nMode := D_STATUS
|
||||
|
||||
ELSEIF AT( cCompl, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
ENDIF
|
||||
otroff:WriteParBold( " Compliance" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cPlat, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
ENDIF
|
||||
otroff:WriteParBold( " Platforms" )
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
ELSEIF AT( cFiles, cBuffer ) > 0
|
||||
|
||||
IF !lBlankLine
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
ENDIF
|
||||
otroff:WriteParBold( " Files" )
|
||||
|
||||
nMode := D_NORMAL
|
||||
lAddBlank := .T.
|
||||
|
||||
ELSEIF AT( cSee, cBuffer ) > 0
|
||||
nMode := D_SEEALSO
|
||||
ELSEIF AT( cInc, cBuffer ) > 0
|
||||
nMode := D_INCLUDE
|
||||
|
||||
// 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 lAddBlank
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
/* nNonBlank:=FirstNB(cBuffer)
|
||||
cBuffer=STUFF(cBuffer,nNonBlank,0,"^a1f ")*/
|
||||
otroff:WritePar( cBuffer )
|
||||
ELSEIF nMode = D_ARG
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "Arguments", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
cBuffer := STRTRAN( cBuffer, "<", "<", 1 )
|
||||
cBuffer := STRTRAN( cBuffer, ">", ">", 1 )
|
||||
otroff:WritePar( StripNgControls( cBuffer ) )
|
||||
ELSEIF nMode = D_NORMAL
|
||||
IF LEN( cBuffer ) > LONGLINE
|
||||
write_error( "General", cBuffer, nLineCnt, ;
|
||||
LONGLINE, aDirList[ i, F_NAME ] )
|
||||
ENDIF
|
||||
lBlankLine := EMPTY( cBuffer )
|
||||
IF lAddBlank
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
lAddBlank := .F.
|
||||
ENDIF
|
||||
otroff:WritePar( StripNgControls( cBuffer ) )
|
||||
ELSEIF nMode = D_SEEALSO
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
cSeeAlso := ProcTroffAlso( StripFiles( ALLTRIM( cBuffer ) ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_INCLUDE
|
||||
// read next line
|
||||
IF .NOT. EMPTY( cBuffer )
|
||||
IF !lBlankLine
|
||||
oTroff:WriteText( ".sp" + CRLF + ".in 0.4i" )
|
||||
ENDIF
|
||||
otroff:WritePar( " Header File: " ;
|
||||
+ ALLTRIM( cBuffer ) )
|
||||
ENDIF
|
||||
ELSEIF nMode = D_STATUS
|
||||
IF !EMPTY( cBuffer )
|
||||
otroff:WriteParBold( "Status" )
|
||||
ENDIF
|
||||
ProcStatusTroff( otroff, 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()
|
||||
NEXT
|
||||
RETURN NIL
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcTroffAlso()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcTroffAlso( cSeealso )
|
||||
aAlso := {}
|
||||
aAlso := ListAsArray2( cSeealso, "," )
|
||||
RETURN aAlso
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
*+ Function ProcStatusTroff()
|
||||
*+
|
||||
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
*+
|
||||
FUNCTION ProcStatusTroff( 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" )
|
||||
ELSE
|
||||
nWriteHandle:WritePar( " Not Started" )
|
||||
ENDIF
|
||||
RETURN nil
|
||||
@@ -1,90 +1,90 @@
|
||||
source\rdd\dbcmd.c
|
||||
source\rtl\achoice.prg
|
||||
source\rtl\adir.prg
|
||||
source\rtl\alert.prg
|
||||
source\rtl\arrays.c
|
||||
source\rtl\asort.prg
|
||||
source\rtl\binnum.c
|
||||
source\rtl\break.c
|
||||
source\rtl\browdb.prg
|
||||
source\rtl\browse.prg
|
||||
source\rtl\classes.c
|
||||
source\rtl\codebloc.c
|
||||
source\rtl\console.c
|
||||
source\rtl\copyfile.c
|
||||
source\rtl\dates.c
|
||||
source\rtl\dbedit.prg
|
||||
source\rtl\descend.c
|
||||
source\rtl\devoutp.prg
|
||||
source\rtl\dir.c
|
||||
source\rtl\dircmd.prg
|
||||
source\rtl\do.c
|
||||
source\rtl\dummy.prg
|
||||
source\rtl\empty.c
|
||||
source\rtl\environ.c
|
||||
source\rtl\errorapi.c
|
||||
source\rtl\errorsys.prg
|
||||
source\rtl\extend.c
|
||||
source\rtl\fieldbl.prg
|
||||
source\rtl\filesys.c
|
||||
source\rtl\fm.c
|
||||
source\rtl\gtapi.c
|
||||
source\rtl\gtxxx.c
|
||||
source\rtl\harbinit.prg
|
||||
source\rtl\hardcr.c
|
||||
source\rtl\initexit.c
|
||||
source\rtl\inkey.c
|
||||
source\rtl\input.prg
|
||||
source\rtl\isprint.c
|
||||
source\rtl\itemapi.c
|
||||
source\rtl\langapi.c
|
||||
source\rtl\len.c
|
||||
source\rtl\license.prg
|
||||
source\rtl\math.c
|
||||
source\rtl\memofile.c
|
||||
source\rtl\memoline.c
|
||||
source\rtl\memvarbl.prg
|
||||
source\rtl\memvars.c
|
||||
source\rtl\menuto.prg
|
||||
source\rtl\mlcount.c
|
||||
source\rtl\mlpos.c
|
||||
source\rtl\mouseapi.c
|
||||
source\rtl\mousexxx.c
|
||||
source\rtl\msgxxx.c
|
||||
source\rtl\mtran.c
|
||||
source\rtl\natmsg.c
|
||||
source\rtl\net.c
|
||||
source\rtl\objfunc.prg
|
||||
source\rtl\oemansi.c
|
||||
source\rtl\oldbox.c
|
||||
source\rtl\oldclear.c
|
||||
source\rtl\pcount.c
|
||||
source\rtl\proc.c
|
||||
source\rtl\pvalue.c
|
||||
source\rtl\readkey.prg
|
||||
source\rtl\readme.prg
|
||||
source\rtl\readvar.prg
|
||||
source\rtl\samples.c
|
||||
source\rtl\set.c
|
||||
source\rtl\setcolor.c
|
||||
source\rtl\setfunc.prg
|
||||
source\rtl\setkey.prg
|
||||
source\rtl\setta.prg
|
||||
source\rtl\soundex.c
|
||||
source\rtl\strings.c
|
||||
source\rtl\tbcolumn.prg
|
||||
source\rtl\tbrowse.prg
|
||||
source\rtl\tclass.prg
|
||||
source\rtl\terror.prg
|
||||
source\rtl\text.prg
|
||||
source\rtl\tget.prg
|
||||
source\rtl\tgetlist.prg
|
||||
source\rtl\tone.c
|
||||
source\rtl\trace.c
|
||||
source\rtl\transfrm.c
|
||||
source\rtl\type.c
|
||||
source\rtl\valtype.c
|
||||
source\rtl\wait.prg
|
||||
source\rtl\word.c
|
||||
source\rtl\xhelp.c
|
||||
source\rtl\xsavescr.prg
|
||||
..\..\source\rdd\dbcmd.c
|
||||
..\..\source\rtl\achoice.prg
|
||||
..\..\source\rtl\adir.prg
|
||||
..\..\source\rtl\alert.prg
|
||||
..\..\source\rtl\arrays.c
|
||||
..\..\source\rtl\asort.prg
|
||||
..\..\source\rtl\binnum.c
|
||||
..\..\source\rtl\break.c
|
||||
..\..\source\rtl\browdb.prg
|
||||
..\..\source\rtl\browse.prg
|
||||
..\..\source\rtl\classes.c
|
||||
..\..\source\rtl\codebloc.c
|
||||
..\..\source\rtl\console.c
|
||||
..\..\source\rtl\copyfile.c
|
||||
..\..\source\rtl\dates.c
|
||||
..\..\source\rtl\dbedit.prg
|
||||
..\..\source\rtl\descend.c
|
||||
..\..\source\rtl\devoutp.prg
|
||||
..\..\source\rtl\dir.c
|
||||
..\..\source\rtl\dircmd.prg
|
||||
..\..\source\rtl\do.c
|
||||
..\..\source\rtl\dummy.prg
|
||||
..\..\source\rtl\empty.c
|
||||
..\..\source\rtl\environ.c
|
||||
..\..\source\rtl\errorapi.c
|
||||
..\..\source\rtl\errorsys.prg
|
||||
..\..\source\rtl\extend.c
|
||||
..\..\source\rtl\fieldbl.prg
|
||||
..\..\source\rtl\filesys.c
|
||||
..\..\source\rtl\fm.c
|
||||
..\..\source\rtl\gtapi.c
|
||||
..\..\source\rtl\gtxxx.c
|
||||
..\..\source\rtl\harbinit.prg
|
||||
..\..\source\rtl\hardcr.c
|
||||
..\..\source\rtl\initexit.c
|
||||
..\..\source\rtl\inkey.c
|
||||
..\..\source\rtl\input.prg
|
||||
..\..\source\rtl\isprint.c
|
||||
..\..\source\rtl\itemapi.c
|
||||
..\..\source\rtl\langapi.c
|
||||
..\..\source\rtl\len.c
|
||||
..\..\source\rtl\license.prg
|
||||
..\..\source\rtl\math.c
|
||||
..\..\source\rtl\memofile.c
|
||||
..\..\source\rtl\memoline.c
|
||||
..\..\source\rtl\memvarbl.prg
|
||||
..\..\source\rtl\memvars.c
|
||||
..\..\source\rtl\menuto.prg
|
||||
..\..\source\rtl\mlcount.c
|
||||
..\..\source\rtl\mlpos.c
|
||||
..\..\source\rtl\mouseapi.c
|
||||
..\..\source\rtl\mousexxx.c
|
||||
..\..\source\rtl\msgxxx.c
|
||||
..\..\source\rtl\mtran.c
|
||||
..\..\source\rtl\natmsg.c
|
||||
..\..\source\rtl\net.c
|
||||
..\..\source\rtl\objfunc.prg
|
||||
..\..\source\rtl\oemansi.c
|
||||
..\..\source\rtl\oldbox.c
|
||||
..\..\source\rtl\oldclear.c
|
||||
..\..\source\rtl\pcount.c
|
||||
..\..\source\rtl\proc.c
|
||||
..\..\source\rtl\pvalue.c
|
||||
..\..\source\rtl\readkey.prg
|
||||
..\..\source\rtl\readme.prg
|
||||
..\..\source\rtl\readvar.prg
|
||||
..\..\source\rtl\samples.c
|
||||
..\..\source\rtl\set.c
|
||||
..\..\source\rtl\setcolor.c
|
||||
..\..\source\rtl\setfunc.prg
|
||||
..\..\source\rtl\setkey.prg
|
||||
..\..\source\rtl\setta.prg
|
||||
..\..\source\rtl\soundex.c
|
||||
..\..\source\rtl\strings.c
|
||||
..\..\source\rtl\tbcolumn.prg
|
||||
..\..\source\rtl\tbrowse.prg
|
||||
..\..\source\rtl\tclass.prg
|
||||
..\..\source\rtl\terror.prg
|
||||
..\..\source\rtl\text.prg
|
||||
..\..\source\rtl\tget.prg
|
||||
..\..\source\rtl\tgetlist.prg
|
||||
..\..\source\rtl\tone.c
|
||||
..\..\source\rtl\trace.c
|
||||
..\..\source\rtl\transfrm.c
|
||||
..\..\source\rtl\type.c
|
||||
..\..\source\rtl\valtype.c
|
||||
..\..\source\rtl\wait.prg
|
||||
..\..\source\rtl\word.c
|
||||
..\..\source\rtl\xhelp.c
|
||||
..\..\source\rtl\xsavescr.prg
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user