En primer lugar te doy las gracias por hacer tu crítica...
Aprendo más de ellas que de los halagos.
Paso a contestarte cada pregunta...
Why don't write it in harbour?
Me gusta explorar todos recursos que tiene Harbour y el sistema extendido es lo mejor que tiene. Podría haber optado por hacerlo en Harbour pero creo que hay ciertos procesos que pueden mejorar el rendimiento y este podría ser uno de ellos. Es cuestión de hacer algún test.
Why don't write it in C?
Bueno ambas preguntas son autoexcluyentes, obviamente está escrita en lenguaje C, pero usando los recursos que Harbour pone a nuestro alcance, como por ejemplo correr una función (HB_ATOKENS) escrita para usarla desde PRG ejecutarla usando la pila de Harbour, si te refieres a eso,
Why don't use strtok instead of use HB_ATokens?
Para mi hubiera sido fácil usar strtok pero me encanta estudiar como está hecho Harbour y leo su código fuente con mucha atención, seguramente no habrás reparado en las diferentes entradas que hay en el changelog.txt ad virtiendo que está función de C no se debe usar ya que es incompatible con el sistema MT. Mira esto:
-----------------------
2006-12-15 16:55 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* general PCODE cleanup and address most of TODO/FIXME notes in
source code:
! removed all strtok() functions
----------------------
2011-09-20 13:56 UTC+0200 Viktor Szakats (vszakats.net/harbour)
* contrib/hbqt/qtcore/hbqt_pointer.cpp
! fixed to avoid non-MT compatible strtok() C RTL call.
NOTE: Please continue to avoid strtok() usage in any further Harbour patches,
it is avoided for good reason.
----------------------
2011-08-27 13:49 UTC-0800 Pritpal Bedi (
bedipritpal@hotmail.com)
* contrib/hbqt/hbmk2_qt.hbs
* contrib/hbqt/qtcore/hbqt.h
+ Implemented: C level class creation is now thread-safe.
With this only pending issue with hbQT remains to replace
usage of strtok() function with Harbour's implementation.
------------------------
Por eso no uso esa funcion de C
It is a strange mix, that I don't like, it looks like he takes the harbour code and translate it in C++ automatically...
Admito que no te guste... en mi tierra hay un dicho que dice que para gusto colores...
Pero el tema es que no te entiendo que quieres decir. La mezcla para nada es extraña, el código de Harbour está llena de esto. Yo no traduzco lo que hace Harbour en C, más bien me parece que tu has traducido lo que yo he hecho en C en PRG. Eso demuestra lo grande que es Harbour. Practicamente cualquier cosa que se pueda hacer en C se puede hacer en Harbour y en algunas incluso supera la velocidad de procesado, pero no es este el caso.
"Yo hago lo imposible, porque lo posible lo hace cualquiera", lo dijo alguien al que yo admiro, Pablo Picasso, por cierto paisano de A. Linares.
Y como soy un romántico informático también pongo en mi puño esta otra frase de Ernesto Guevara:
"Seamos realistas y hagamos lo imposible"
Termino reiterando mi agradecimiento a tu crítica.
Pongo aquí una nueva versión más optimizada de la función que me gusta más:
- Code: Select all Expand view
/***
* Convierte un cadena como esta "esto=123&es=una&prueba=de&token=999" a u
* Hash asi { esto => 123, es => una, prueba => de, token => 999 }
*/
HB_FUNC( PARAM2HASH )
{
PHB_ITEM pHash = hb_hashNew( NULL );
static PHB_DYNS s_pFuncATokens;
if( !s_pFuncATokens )
{
s_pFuncATokens = hb_dynsymFind( "HB_ATOKENS" );
}
if( s_pFuncATokens )
{
HB_SIZE nLen;
PHB_ITEM aTokens = hb_stackReturnItem();
hb_itemSetNil( aTokens );
hb_vmPushDynSym( s_pFuncATokens );
hb_vmPushNil();
hb_vmPush( hb_param( 1, HB_IT_STRING ) );
hb_vmPushString( "&", 1 );
hb_vmProc( 2 );
if( ( nLen = hb_arrayLen( aTokens ) ) > 0 )
{
const char *szText;
HB_SIZE i = 0, nPos, nStrLen;
PHB_ITEM pKey = hb_itemNew( NULL );
PHB_ITEM pValue = hb_itemNew( NULL );
hb_hashPreallocate( pHash, nLen );
while( i < nLen )
{
i++;
szText = hb_arrayGetCPtr( aTokens, i );
nStrLen = hb_arrayGetCLen( aTokens, i );
nPos = hb_strAt( "=", 1, szText, nStrLen );
hb_hashAdd( pHash, hb_itemPutCL( pKey, szText, nPos - 1 ),
hb_itemPutCL( pValue, szText + nPos, nStrLen - nPos ) );
}
hb_itemRelease( pKey );
hb_itemRelease( pValue );
}
}
hb_itemReturnRelease( pHash );
}
Antonio traduce si puedes