diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 4813441c97..ba530b65df 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,14 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-03-07 13:16 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) + * contrib/hbtip/Makefile + - contrib/hbtip/encmthd.c + + contrib/hbtip/encb64c.c + + contrib/hbtip/encurlc.c + * Split and renamed source file containing low-level encoder/decoder + functions. + 2010-03-07 13:13 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbtip/encmthd.c - Deleted __TIP_QP_[ENCODE|DECODE](). Either I'm misunderstanding diff --git a/harbour/contrib/hbtip/Makefile b/harbour/contrib/hbtip/Makefile index 9374b52027..80caf97dbf 100644 --- a/harbour/contrib/hbtip/Makefile +++ b/harbour/contrib/hbtip/Makefile @@ -9,7 +9,8 @@ include $(TOP)$(ROOT)config/global.mk LIBNAME := hbtip C_SOURCES := \ - encmthd.c \ + encb64c.c \ + encurlc.c \ utils.c \ PRG_SOURCES := \ diff --git a/harbour/contrib/hbtip/encmthd.c b/harbour/contrib/hbtip/encb64c.c similarity index 71% rename from harbour/contrib/hbtip/encmthd.c rename to harbour/contrib/hbtip/encb64c.c index 131b51714d..c143f6ce61 100644 --- a/harbour/contrib/hbtip/encmthd.c +++ b/harbour/contrib/hbtip/encb64c.c @@ -246,130 +246,3 @@ HB_FUNC( __TIP_BASE64_DECODE ) cRet = ( unsigned char * ) hb_xrealloc( cRet, nPosRet + 1 ); hb_retclen_buffer( ( char * ) cRet, nPosRet ); } - -HB_FUNC( __TIP_URL_ENCODE ) -{ - const char * cData = hb_parc( 1 ); - int nLen = hb_parclen( 1 ); - HB_BOOL bComplete = hb_parl( 2 ); - char * cRet; - int nPos = 0, nPosRet = 0, nVal; - char cElem; - - if( hb_pcount() < 2 ) - bComplete = HB_TRUE; - - if( ! cData ) - { - hb_errRT_BASE( EG_ARG, 3012, NULL, - HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) ); - return; - } - - if( ! nLen ) - { - hb_retc_null(); - return; - } - - /* Giving maximum final length possible */ - cRet = ( char * ) hb_xgrab( nLen * 3 + 1 ); - - while( nPos < nLen ) - { - cElem = cData[ nPos ]; - - if( cElem == ' ' ) - { - cRet[ nPosRet ] = '+'; - } - else if( - ( cElem >= 'A' && cElem <= 'Z' ) || - ( cElem >= 'a' && cElem <= 'z' ) || - ( cElem >= '0' && cElem <= '9' ) || - cElem == '.' || cElem == ',' || cElem == '&' || - cElem == '/' || cElem == ';' || cElem == '_' ) - { - cRet[ nPosRet ] = cElem; - } - else if( ! bComplete && ( cElem == ':' || cElem == '?' || cElem == '=' ) ) - { - cRet[ nPosRet ] = cElem; - } - else /* encode! */ - { - cRet[ nPosRet++ ] = '%'; - nVal = ( ( unsigned char ) cElem ) >> 4; - cRet[ nPosRet++ ] = nVal < 10 ? '0' + ( char ) nVal : 'A' + ( char ) nVal - 10; - nVal = ( ( unsigned char ) cElem ) & 0x0F; - cRet[ nPosRet ] = nVal < 10 ? '0' + ( char ) nVal : 'A' + ( char ) nVal - 10; - } - - nPosRet++; - nPos++; - } - - hb_retclen_buffer( cRet, nPosRet ); -} - -HB_FUNC( __TIP_URL_DECODE ) -{ - const char * cData = hb_parc( 1 ); - int nLen = hb_parclen( 1 ); - char * cRet; - int nPos = 0, nPosRet = 0; - char cElem; - - if( ! cData ) - { - hb_errRT_BASE( EG_ARG, 3012, NULL, - HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) ); - return; - } - - if( ! nLen ) - { - hb_retc_null(); - return; - } - - /* maximum possible lenght */ - cRet = ( char * ) hb_xgrab( nLen ); - - while( nPos < nLen ) - { - cElem = cData[ nPos ]; - - if( cElem == '+' ) - { - cRet[ nPosRet ] = ' '; - } - else if( cElem == '%' ) - { - if( nPos < nLen - 2 ) - { - cElem = cData[ ++nPos ]; - cRet[ nPosRet ] = cElem < 'A' ? cElem - '0' : cElem - 'A' + 10; - cRet[ nPosRet ] *= 16; - - cElem = cData[ ++nPos ]; - cRet[ nPosRet ] |= cElem < 'A' ? cElem - '0' : cElem - 'A' + 10; - } - else - { - if( nPosRet > 0 ) - break; - } - } - else - cRet[ nPosRet ] = cElem; - - nPos++; - nPosRet++; - } - - /* this function also adds a zero */ - /* hopefully reduce the size of cRet */ - cRet = ( char * ) hb_xrealloc( cRet, nPosRet + 1 ); - hb_retclen_buffer( cRet, nPosRet ); -} diff --git a/harbour/contrib/hbtip/encurlc.c b/harbour/contrib/hbtip/encurlc.c new file mode 100644 index 0000000000..7a9bbb2c29 --- /dev/null +++ b/harbour/contrib/hbtip/encurlc.c @@ -0,0 +1,182 @@ +/* + * $Id$ + */ + +/* + * xHarbour Project source code: + * TIP Class oriented Internet protocol library + * + * Copyright 2003 Giancarlo Niccolai + * www - http://www.harbour-project.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#include "hbapi.h" +#include "hbapiitm.h" +#include "hbapierr.h" + +HB_FUNC( __TIP_URL_ENCODE ) +{ + const char * cData = hb_parc( 1 ); + int nLen = hb_parclen( 1 ); + HB_BOOL bComplete = hb_parl( 2 ); + char * cRet; + int nPos = 0, nPosRet = 0, nVal; + char cElem; + + if( hb_pcount() < 2 ) + bComplete = HB_TRUE; + + if( ! cData ) + { + hb_errRT_BASE( EG_ARG, 3012, NULL, + HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) ); + return; + } + + if( ! nLen ) + { + hb_retc_null(); + return; + } + + /* Giving maximum final length possible */ + cRet = ( char * ) hb_xgrab( nLen * 3 + 1 ); + + while( nPos < nLen ) + { + cElem = cData[ nPos ]; + + if( cElem == ' ' ) + { + cRet[ nPosRet ] = '+'; + } + else if( + ( cElem >= 'A' && cElem <= 'Z' ) || + ( cElem >= 'a' && cElem <= 'z' ) || + ( cElem >= '0' && cElem <= '9' ) || + cElem == '.' || cElem == ',' || cElem == '&' || + cElem == '/' || cElem == ';' || cElem == '_' ) + { + cRet[ nPosRet ] = cElem; + } + else if( ! bComplete && ( cElem == ':' || cElem == '?' || cElem == '=' ) ) + { + cRet[ nPosRet ] = cElem; + } + else /* encode! */ + { + cRet[ nPosRet++ ] = '%'; + nVal = ( ( unsigned char ) cElem ) >> 4; + cRet[ nPosRet++ ] = nVal < 10 ? '0' + ( char ) nVal : 'A' + ( char ) nVal - 10; + nVal = ( ( unsigned char ) cElem ) & 0x0F; + cRet[ nPosRet ] = nVal < 10 ? '0' + ( char ) nVal : 'A' + ( char ) nVal - 10; + } + + nPosRet++; + nPos++; + } + + hb_retclen_buffer( cRet, nPosRet ); +} + +HB_FUNC( __TIP_URL_DECODE ) +{ + const char * cData = hb_parc( 1 ); + int nLen = hb_parclen( 1 ); + char * cRet; + int nPos = 0, nPosRet = 0; + char cElem; + + if( ! cData ) + { + hb_errRT_BASE( EG_ARG, 3012, NULL, + HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) ); + return; + } + + if( ! nLen ) + { + hb_retc_null(); + return; + } + + /* maximum possible lenght */ + cRet = ( char * ) hb_xgrab( nLen ); + + while( nPos < nLen ) + { + cElem = cData[ nPos ]; + + if( cElem == '+' ) + { + cRet[ nPosRet ] = ' '; + } + else if( cElem == '%' ) + { + if( nPos < nLen - 2 ) + { + cElem = cData[ ++nPos ]; + cRet[ nPosRet ] = cElem < 'A' ? cElem - '0' : cElem - 'A' + 10; + cRet[ nPosRet ] *= 16; + + cElem = cData[ ++nPos ]; + cRet[ nPosRet ] |= cElem < 'A' ? cElem - '0' : cElem - 'A' + 10; + } + else + { + if( nPosRet > 0 ) + break; + } + } + else + cRet[ nPosRet ] = cElem; + + nPos++; + nPosRet++; + } + + /* this function also adds a zero */ + /* hopefully reduce the size of cRet */ + cRet = ( char * ) hb_xrealloc( cRet, nPosRet + 1 ); + hb_retclen_buffer( cRet, nPosRet ); +}