diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 5007b4f137..d1683624a4 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,14 @@ +19991005-20:34 GMT+1 Victor Szel + * include/hbextern.ch + source/runner/stdalone/external.prg + - One of the two HB_OSNEWLINE removed. + + source/rtl/memoline.c + source/rtl/Makefile + doc/funclist.txt + + MEMOLINE() added + (thanks to Ignacio Ortiz de Zúniga ) + !! WARNING !! Please modify non-GNU make files. + 19991005-18:20 GMT+1 Victor Szel + source/rtl/rddord.prg source/rtl/Makefile diff --git a/harbour/doc/funclist.txt b/harbour/doc/funclist.txt index 8e4f4d9ed9..d1b7e3307c 100644 --- a/harbour/doc/funclist.txt +++ b/harbour/doc/funclist.txt @@ -135,8 +135,8 @@ HARDCR ;R; HEADER ;R; I2BIN ;R; IF ;R; -INDEXEXT ;N; -INDEXKEY ;N; +INDEXEXT ;S; +INDEXKEY ;S; INDEXORD ;N; INKEY ;S; INT ;R; @@ -159,7 +159,7 @@ MAX ;R; MAXCOL ;R; MAXROW ;R; MEMOEDIT ;N; -MEMOLINE ;N; +MEMOLINE ;R; MEMOREAD ;R; MEMORY ;N; MEMOTRAN ;R; diff --git a/harbour/include/hbextern.ch b/harbour/include/hbextern.ch index 0abd3efa84..ea0c71df78 100644 --- a/harbour/include/hbextern.ch +++ b/harbour/include/hbextern.ch @@ -158,7 +158,6 @@ EXTERNAL SETMODE EXTERNAL __ACCEPT EXTERNAL __ACCEPTSTR EXTERNAL __COLORINDEX -EXTERNAL HB_OSNEWLINE // //symbols from file: rtl\copyfile.c // diff --git a/harbour/source/rtl/Makefile b/harbour/source/rtl/Makefile index 6421016dd7..6e7f99ecdf 100644 --- a/harbour/source/rtl/Makefile +++ b/harbour/source/rtl/Makefile @@ -26,6 +26,7 @@ C_SOURCES=\ langapi.c \ math.c \ memofile.c \ + memoline.c \ memvars.c \ mlcount.c \ mouseapi.c \ diff --git a/harbour/source/rtl/memoline.c b/harbour/source/rtl/memoline.c new file mode 100644 index 0000000000..022c21b59b --- /dev/null +++ b/harbour/source/rtl/memoline.c @@ -0,0 +1,151 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * MEMOLINE() function + * + * Copyright 1999 Ignacio Ortiz de Zúniga + * 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/). + * + */ + +#include "extend.h" + +HARBOUR HB_MEMOLINE( void ) +{ + char * pszString = hb_parc( 1 ); + USHORT uiLineLength = ISNUM( 2 ) ? hb_parni( 2 ) : 79; + ULONG ulLineNumber = ISNUM( 3 ) ? hb_parni( 3 ) : 1; + USHORT uiTabLength = ISNUM( 4 ) ? hb_parni( 4 ) : 4; + ULONG uiLastSpace = 0; + ULONG uiCurLength = 0; + BOOL bWordWrap = ISLOG( 5 ) ? hb_parl( 5 ) : TRUE; + ULONG ulLen = hb_parclen( 1 ); + ULONG ulLines = 0; + ULONG ulPos = 0; + ULONG ulLineBegin; + ULONG ulLineEnd; + + if ( uiLineLength < 4 || uiLineLength > 254 ) + uiLineLength = 79; + + if ( uiTabLength > uiLineLength ) + uiTabLength = uiLineLength - 1; + + ulLineBegin = ulPos; + ulLineEnd = 0; + + while( ulPos < ulLen && ulLines < ulLineNumber ) + { + switch( pszString[ ulPos ] ) + { + case HB_CHAR_HT: + uiCurLength += uiTabLength; + break; + + case HB_CHAR_LF: + uiCurLength = 0; + uiLastSpace = 0; + ulLineEnd = ulPos - 2; + ulLines++; + if( ulLines < ulLineNumber ) + { + ulLineBegin = ulPos + 1; + ulLineEnd = 0; + } + break; + + case HB_CHAR_CR: + break; + + case ' ': + uiCurLength++; + uiLastSpace = uiCurLength; + break; + + default: + uiCurLength++; + } + + if( uiCurLength > uiLineLength ) + { + if( bWordWrap ) + { + if( uiLastSpace == 0 ) + { + uiCurLength = 1; + ulLineEnd = ulPos - 1; + } + else + { + uiCurLength = uiCurLength - uiLastSpace; + ulLineEnd = ulPos - uiCurLength ; + } + } + else + { + uiCurLength = 1; + ulLineEnd = ulPos - 1; + } + + ulLines++; + uiLastSpace = 0; + + if( ulLines < ulLineNumber ) + { + ulLineBegin = ulPos - uiCurLength + 1; + ulLineEnd = 0; + } + } + + ulPos++; + } + + if( ulLineEnd == 0 ) + { + ulLines++; + ulLineEnd = ulPos - 1; + } + + if( ulLineNumber == ulLines ) + { + if( (ulLineEnd - ulLineBegin + 1 ) == uiLineLength ) + { + hb_retclen( pszString + ulLineBegin, ( ulLineEnd - ulLineBegin + 1 ) ); + } + else + { + char * pszLine = hb_xgrab( uiLineLength ); + memset( pszLine, ' ', uiLineLength ); + memcpy( pszLine, ( pszString + ulLineBegin ), ( ulLineEnd - ulLineBegin + 1 ) ); + hb_retclen( pszLine, uiLineLength ); + hb_xfree( pszLine ); + } + } + else + hb_retc( "" ); +} diff --git a/harbour/source/runner/stdalone/external.prg b/harbour/source/runner/stdalone/external.prg index 0abd3efa84..ea0c71df78 100644 --- a/harbour/source/runner/stdalone/external.prg +++ b/harbour/source/runner/stdalone/external.prg @@ -158,7 +158,6 @@ EXTERNAL SETMODE EXTERNAL __ACCEPT EXTERNAL __ACCEPTSTR EXTERNAL __COLORINDEX -EXTERNAL HB_OSNEWLINE // //symbols from file: rtl\copyfile.c //