es

  Previous topic Next topic JavaScript is required for the print function Mail us feedback on this topic! Mail us feedback on this topic!  
c:\harbour\doc\es
c:\harbour\doc\es\array.txt
/*
 * $Id: array.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *         ARRAY(), AADD(), ASIZE(), ATAIL(), ASIZE(),
 *         AINS(), ADEL(), ADEL(), AFILL(), ASCAN()
 *         AEVAL(), ACOPY(), ACLONE(), ASORT()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ARRAY()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Crea un array sin inicializar de la longitud especificada
 *  $SYNTAX$
 *      ARRAY(  [, ...] ) --> aArray
 *  $ARGUMENTS$
 *       es el n£mero de elementos de la dimensi¢n especificada.
 *  $RETURNS$
 *      Un array con las dimensiones especificadas.
 *  $DESCRIPTION$
 *      Esta funci¢n retorna un array sin inicializar de tama¤o 
 *      Si par metros  adicionales son especificados se crea
 *      un array anidado multidimensional sin inicializar dentro de la misma
 *      referencia del array.
 *      Crear una variable de memoria con el mismo nombre que el array puede
 *      destruir el array original y liberar el contenido entero del array.
 *      Esto depende, por supuesto del tipo de almacenamiento de ambos: del
 *      array y la variable con el mismo nombre que el array.
 *  $EXAMPLES$
 *      *  El siguiente ejemplo crea un array de diez elementos iniciales,
 *         luego en cada elemento de ese array, va creando submatrices
 *         lineales con la funci¢n ARRAY(). Cada una con la misma cantidad
 *         de items que la posici¢n que ocupa en aArray. Finalmente lo
 *         muestra.
 *
 *         LOCAL aArray := Array(10)
 *         LOCAL i := 1, j
 *
 *         FOR i = 1 to LEN( aArray )
 *           aArray [i] := Array(i)
 *         NEXT
 *
 *         FOR i = 1 to LEN( aArray )
 *            ? i
 *            FOR j = 1 to LEN( aArray [i] )
 *                ?? " ", aArray [i][j]
 *            NEXT
 *         NEXT
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es CA-Cl*pper Compatible en todos los casos, excepto que
 *      los arrays en Harbour pueden tener un n£mero ilimitado de elementos
 *      mientras que Clipper tiene un l¡mite de 4096 elementos por dimensi¢n.
 *      Los arrays en Harbour pueden tener un n£mero ilimitado de dimensiones
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      AADD(),ADEL(),AFILL(),AINS()
 *  $END$
 */


 *  $DOC$
 *  $FUNCNAME$
 *      AADD()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Agrega din micamente un nuevo elemento al final de un array
 *  $SYNTAX$
 *      AADD(, ) --> Valor
 *  $ARGUMENTS$
 *       es el array al cual se agrega un nuevo elemento.
 *
 *         es el valor asignado al nuevo elemento.
 *  $RETURNS$
 *      AADD() eval£a  y retorna su valor.  Si  no esta
 *      especificado, AADD() retorna NIL.
 *  $DESCRIPTION$
 *      AADD() es una funci¢n que din micamente incrementa la longitud actual
 *      del array destino en un elemento y asigna el valor  al reci‚n
 *      creado elemento del array.
 *       puede ser un puntero de referencia a otro array, el cual
 *      puede ser asignado a la posici¢n sub¡ndice.
 *
 *      Es £til para construir listas din micas o colas (queues).
 *      Cada vez que se ejecuta un comando @...GET, el sistema usa AADD()
 *      para agregar un nuevo elemento al final del array GetList, y entonces
 *      asignar un nuevo objeto Get al nuevo elemento.
 *  $EXAMPLES$
 *      *  Este ejemplo muestra el efecto de m£ltiples llamadas de la funci¢n
 *         AADD() a un array, donde va agrgando un nuevo elemento cada vez.
 *
 *      LOCAL aArray := {}
 *      FOR x:= 1 to 10
 *          AADD( aArray, x)
 *      NEXT
 *
 *      *  Este ejemplo crea un array multidemensional
 *      LOCAL aArray := {}             // Resultado: aArray es un array vac¡o
 *      AADD( aArray, {10, 10122734 }) // Resultado: aArray es {10, 10122734}
 *      AADD( aArray, {11, 13173645 }) // Resultado: aArray es
 *                                     { { 10, 10122734 }, { 11, 13173645 } }
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas las plataformas
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      AINS(), ASIZE()
 * $END$


/*  $DOC$
 *  $FUNCNAME$
 *      ASIZE()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Ajusta (aumenta ¢ decrementa) el tama¤o de un array
 *  $SYNTAX$
 *      ASIZE(, ) --> aDestino
 *  $ARGUMENTS$
 *       es el nombre del array a ser din micamente alterado
 *
 *       es el valor Num‚rico del nuevo tama¤o de 
 *  $RETURNS$
 *      ASIZE() retorna una referencia al array .
 *  $DESCRIPTION$
 *      Esta funci¢n din micamente incrementa ¢ decrementa el tama¤o del
 *      array  ajustando la longitud del array a 
 *      posiciones.
 *
 *      Si la longitud del array  is acortada, aquellos elementos
 *      al final se pierden. Si la longitud del array es alargada un valor
 *      NIL es asignado a los elementos en las nuevas posiciones.
 *  $EXAMPLES$
 *      *  El siguiente ejemplo crea un array con un s¢lo elemento, luego lo
 *         agranda y luego lo vuelve al tama¤o original.
 *
 *         aArray := { 1 }           // Resultado: aArray es { 1 }
 *         ASIZE( aArray, 3)         // Resultado: aArray es { 1, NIL, NIL }
 *         ASIZE( aArray, 1)         // Resultado: aArray es { 1 }
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Si HB_COMPAT_C53 es definido, la funci¢n genera un Error, de otro
 *      modo retornar  el mismo array.
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      AADD(), ADEL(), AFILL(), AINS()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      ATAIL()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Retorna el £ltimo elemento de un array
 *  $SYNTAX$
 *      ATAIL(  ) --> Elemento
 *  $ARGUMENTS$
 *       es el nombre del array a usar
 *  $RETURNS$
 *      ATAIL() retorna  que puede ser un valor ¢ una referencia
 *      contenida en el £ltimo elemento en el array.
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve el £ltimo elemento en el array llamado 
 *      No modifica el tama¤o del array ni el valor de ning£n sub¡ndice.
 *  $EXAMPLES$
 *      *  El siguiente ejemplo crea un array unidimensional y devuelve el
 *         £ltimo elemento.
 *
 *         aArray := { "Cu l", "es el", "futuro", "de xBase ?", "Harbour!" }
 *         ? ATAIL( aArray )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      LEN(),ARRAY(),ASIZE(),AADD()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      AINS()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Inserta un elemento NIL en una posici¢n del array
 *  $SYNTAX$
 *      AINS( ,  ) --> aDestino
 *  $ARGUMENTS$
 *       es el nombre del array al que se va a insertar un item
 *
 *         es la posici¢n en el 
 *  $RETURNS$
 *      AINS() retorna una referencia al array destino, 
 *  $DESCRIPTION$
 *      Esta funci¢n inserta un valor NIL en el array llamado 
 *      en la posicion .
 *
 *      Todos los elementos del array comenzando con la  ser n
 *      desplazados hacia arriba una posici¢n y el £ltimo item en el array
 *      ser  removido completamente. En otras palabras, si se va a insertar
 *      un item en la quinta posici¢n de un array de diez elementos, el
 *      elemento que previamente estaba en la quinta posici¢n ahora ser 
 *      reubicado a la sexta posici¢n. El elemento reci‚n agregado ser  de
 *      tipo NIL y el £ltimo elemento es descartado. La longitud del array
 *       permanece sin cambios.
 *  $EXAMPLES$
 *      *  El siguiente ejemplo crea un array lineal, al cual se inserta un
 *         elemento en la quinta posici¢n, perdi‚ndose el £ltimo.
 *
 *         LOCAL aArray:= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
 *         AINS( aArray, 5)
 *
 *         Resultado: aArray es { 1, 2, 3, 4, NIL, 5, 6, 7, 8, 9 }
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      AADD(), ACOPY(), ADEL(), AEVAL(), AFILL(), ASIZE()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      ADEL()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Borra un elemento del array
 *  $SYNTAX$
 *      ADEL(, ) --> aDestino
 *  $ARGUMENTS$
 *       es el nombre del array cuyo elemento ser  removido.
 *
 *           es la posici¢n del elemento a borrar
 *  $RETURNS$
 *      ADEL() retorna una referencia al array destino, 
 *  $DESCRIPTION$
 *      Esta funci¢n borra el elemento que se encuentra en la posici¢n 
 *      en el array . Todos los elementos en el array 
 *      m s all  de la posici¢n dada  ser n movidos hacia abajo una
 *      posici¢n en el array.
 *      En otras palabras, si se borra un item de la quinta posici¢n de un
 *      array de diez elementos, el elemento que estaba en la sexta posici¢n
 *      ahora ser  reubicado a la quinta posici¢n.
 *      La longitud del array  permanece sin cambios y el £ltimo
 *      elemento en el array toma el valor NIL.
 *  $EXAMPLES$
 *      *  El siguiente ejemplo crea un array lineal, del cual se borra el
 *         elemento en la quinta posici¢n.
 *
 *         LOCAL aArray:= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
 *         ADEL( aArray, 5)
 *
 *         Resultado: aArray es { 1, 2, 3, 4, 6, 7, 8, 9, NIL }
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      ACOPY(), AINS(), AFILL()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      AFILL()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Rellena un array con un valor especificado
 *  $SYNTAX$
 *      AFILL( , , [], []) --> aDestino
 *  $ARGUMENTS$
 *        es el nombre del array a rellenar
 *
 *          es la expresi¢n con la que ser  rellenado 
 *
 *         es la posici¢n de comienzo, sub¡ndice del array
 *
 *       es el n£mero de elementos que se van a rellenar
 *  $RETURNS$
 *      AFILL() retorna una referencia al array destino, 
 *  $DESCRIPTION$
 *      Esta funci¢n rellena cada elemento del array llamado  con
 *      el valor . Si es especificado,  marca el elemento
 *      de inicio para continuar rellenando por  posiciones.
 *      Si no es especificado, el valor de   ser  1, y el valor de
 *       ser  el valor de LEN(); y todos las posiciones
 *      del array  ser n llenadas con la expresi¢n de .
 *
 *      Advertencia !:
 *      Esta funci¢n s¢lo trabaja en una sola dimensi¢n de .
 *      Si hay punteros de referencia a otros arrays dentro de un sub¡ndice
 *      de  estos valores se perder n, porque esta funci¢n los
 *      sobreescribe con los nuevos valores.
 *  $EXAMPLES$
 *      *  El siguiente ejemplo crea un array con valores asignados, luego
 *         lo rellena con el valor cinco.
 *
 *         LOCAL aTest := { NIL, 0, 1, 2 }
 *         Afill( aTest, 5)            // Resultado aTest es { 5, 5, 5, 5 }
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      AADD(), AEVAL(), DBSTRUCT(), DIRECTORY()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      ASCAN()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Busca en un array por un valor o hasta que el block devuelva .T.
 *  $SYNTAX$
 *      ASCAN( , ,
 *             [], [] ) --> nParadoEn
 *  $ARGUMENTS$
 *        es el nombre del array a examinar
 *
 *        es la expresi¢n a encontrar en 
 *
 *         es la posici¢n a la cual comenzar la b£squeda
 *
 *       es el n£mero de elementos a examinar
 *  $RETURNS$
 *      ASCAN() retorna un valor num‚rico , de la posici¢n donde
 *       fu‚ encontrada.
 *  $DESCRIPTION$
 *      Esta funci¢n examina el contenido de un array llamado  en
 *      busca del valor de . El valor devuelto es la posici¢n en el
 *      array  en el cual  fue encontrada.
 *      Si esta expresi¢n no es encontrada el valor retornado es cero.
 *
 *      Si es especificada, la posici¢n de inicio al cual comenzar la
 *      b£squeda puede ser establecida con el valor pasado en .
 *      Por defecto es uno.
 *
 *      Si es especificado, el n£mero de elementos del array a examinar puede
 *      ser establecido con el valor pasado en . Por defecto es
 *      el n£mero total de elementos en el array .
 *
 *      Si  es un bloque de c¢digo, la operaci¢n de la funci¢n es
 *      ligeramente diferente. Cada referencia del subindice del array es
 *      pasada al bloque de c¢digo para ser evaluada. La rutina de b£squeda
 *      continuar  hasta que el valor obtenido del bloque de c¢digo sea
 *      verdadero (.T.) ¢ hasta que el final del array haya sido alcanzado.
 *  $EXAMPLES$
 *      *  El siguiente ejemplo utiliza una funci¢n de biblioteca para llenar
 *         el array aDir con los nombres de archivos en el directorio actual.
 *         Posteriormente, busca si entre ellos esta presente el archivo
 *         test.prg, devuelve cero si no esta, ¢ mayor de cero si est .
 *
 *         LOCAL aDir := DIRECTORY( "*.*")
 *         ? ASCAN( aDir,,,{|x,y| x[1] == "test.prg" } )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n no es compatible con CA-Cl*pper . La funci¢n ASCAN() de
 *      Clipper es afectada por la condici¢n  SET EXACT ON/OFF
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      AEVAL(), EVAL()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      AEVAL()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Ejecuta un bloque de c¢digo por cada elemento en el array
 *  $SYNTAX$
 *      AEVAL(, , [], []) --> aArray
 *  $ARGUMENTS$
 *         es el array a ser evaluado.
 *
 *        es el bloque de c¢digo a evaluar para cada elemento
 *                 procesado
 *        es el elemento de inicio del array a evaluar.
 *
 *       es el n£mero de elementos a procesar desde 
 *                  hasta el final del array 
 *  $RETURNS$
 *      AEVAL() retorna una referencia a 
 *  $DESCRIPTION$
 *      Esta funci¢n eval£a y procesa los elementos en .
 *      Un bloque de c¢digo pasado como  define la operacion a ser
 *      ejecutada sobre cada elemento del array. Todos los elementos en
 *       ser n evaluados a menos que sea especificada la posici¢n de
 *      comienzo en  por  elementos.
 *      Por defecto  es uno.
 *
 *      Dos par metros son pasados al bloque de c¢digo . Los
 *      elementos individuales en el array son el primer par metro y su
 *      posici¢n en el array es el segundo.
 *
 *      AEVAL() no reemplaza al bucle FOR...NEXT para procesar arrays.
 *      Si un array es una unidad aut¢noma, AEVAL() es apropiado. Si el array
 *      va a ser alterado ¢ si los elementos van a ser reevaluados, un
 *      bucle FOR...NEXT es m s apropiado.
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      EVAL(),DBEVAL()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      ACOPY()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Copia elementos de un array a otro
 *  $SYNTAX$
 *      ACOPY( , , [], [],
 *             [] )--> aDestino
 *  $ARGUMENTS$
 *          es el array desde el que se copian los elementos.
 *
 *         es el array al que se copian los elementos.
 *
 *          es la posici¢n desde donde se inicia la copia en
 *                   . Por defecto es uno.
 *        es el n£mero de elementos a copiar comenzando en la
 *                   posici¢n 
 *
 *       es la posici¢n de inicio en el array  hacia
 *                    donde se copian los elementos. Por defecto es uno.
 *  $RETURNS$
 *      ACOPY() retorna una referencia al array 
 *  $DESCRIPTION$
 *      ACOPY() copia elementos desde el array  hacia el array
 *      . Esta funci¢n copia todo tipo de datos.
 *
 *      Si un elemento en el array  es un puntero de referencia a
 *      otro array (submatriz), esa referencia ser  copiada al array
 *       pero no todas las dimensiones ser n copiadas de un array
 *      al otro. Esto debe ser realizado via funci¢n ACLONE().
 *
 *      Note
 *      Si el array  es mayor que , los elementos en el
 *      array comienzan a ser copiados en  y continuan
 *      copiandose hasta que el final del array  es alcanzado, los
 *      elementos que sobran en  se descartan.
 *      La funci¢n ACOPY() no agrega posiciones al array destino, el tama¤o
 *      del array  permanece constante.
 *  $EXAMPLES$
 *      * El ejemplo siguiente copia un array sobre otro.
 *
 *      LOCAL nContador := 2, nInicio := 1, aUltimo, aPrimero
 *      aUltimo  := { "HARBOUR", " es el ", "Heredero" }
 *      aPrimero := { "CLIPPER", " fue el ", "Pionero" }
 *      ACOPY( aUltimo, aPrimero, nInicio, nContador)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      ACLONE(),ADEL(),AEVAL(),AFILL(),AINS(),ASORT()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      ACLONE()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Duplica un array anidado ¢ multidimensional
 *  $SYNTAX$
 *      ACLONE(  ) --> aDuplicado
 *  $ARGUMENTS$
 *       es el nombre del array a ser clonado.
 *  $RETURNS$
 *      ACLONE() retorna  un nueva referencia a otro array
 *      exactamente igual al original.
 *  $DESCRIPTION$
 *      Esta funci¢n realiza una copia completa del array llamado .
 *      Crea todas las dimensiones en el array  que existen en el
 *      array original y luego llena cada dimensi¢n con los mismos valores
 *      de los elementos en el original.
 *      Ambos arrays coexisten como entidades distintas.
 *  $EXAMPLES$
 *      * El ejemplo siguiente crea un array bidimensional y lo duplica.
 *        Se muestra que son copiadas ambas dimensiones.
 *
 *        LOCAL aOrigen, aDestino
 *        aOrigen  := { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10} }
 *        aDestino := ACLONE( aOrigen )
 *
 *        * primera dimensi¢n
 *        ? "Impares son: "                // Resultado: es {1, 3, 5, 7, 9}
 *        FOR n := 1 TO LEN( aDestino)
 *            ?? aDestino [n][1]
 *        NEXT
 *
 *        * segunda dimensi¢n
 *        ? "Pares   son: "                // Resultado: es {2, 4, 6, 8, 10}
 *        FOR n := 1 TO LEN( aDestino)
 *            ?? aDestino [n][2]
 *        NEXT
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Clipper retorna NIL si el par metro no es un array.
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      ACOPY(),ADEL(),AINS(),ASIZE()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      ASORT()
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Ordena un array
 *  $SYNTAX$
 *      ASORT( , [], [],
 *             [] ) --> aDestino
 *  $ARGUMENTS$
 *        es el nombre del array a ser ordenado.
 *
 *         es el primer elemento para comenzar el ordenamiento.
 *                  Por defecto es uno.
 *
 *       es el n£mero de elementos a ordenar comenzando en la
 *                  posici¢n . Por defecto son todos los elementos
 *
 *          es el bloque de c¢digo para el orden de ordenamiento,
 *                  por defecto es en orden ascendente {| x, y | x < y }.
 *                  El bloque de c¢digo debe recibir dos elementos del array
 *                  como parametros y debe retornar .T. si el orden es el
 *                  correcto, .F. en caso contrario.
 *  $RETURNS$
 *      ASORT() retorna una referencia al reciente array ordenado 
 *      ¢ NIL si el par metro  no es un array.
 *  $DESCRIPTION$
 *      Esta funcion ordena todo ¢ parte de un array dado. Si  es
 *      omitido, la funci¢n espera que  sea un array unidimensional
 *      conteniendo un solo tipo de datos (uno de: CHARACTER, DATE, LOGICAL,
 *      NUMERIC) y ordena este array en orden ascendente: los caracteres son
 *      ordenados por su valor ASCII, las fechas son ordenadas
 *      cronologicamente el valor l¢gico .F. va antes de .T. y los valores
 *      num‚ricos son ordenados por su valor.
 *
 *      Si  es especificado este es usado para manejar la forma de
 *      ordenamiento. Cada vez que el bloque es evaluado, dos elementos del
 *      array son pasados al bloque de c¢digo, y el bloque debe retornar un
 *      valor l¢gico que define si esos elementos estan en orden (.T.) ¢ no
 *      (.F.). Usando este bloque se puede ordenar arrays multidimensionales
 *      hacer un ordenamiento descendente ¢ a£n (pero para que querria Ud.
 *      hacerlo) ordenar un array que contenga diferentes tipo de datos.
 *  $EXAMPLES$
 *      * El siguiente ejemplo ordena valores numericos en orden ascendente
 *
 *        ASORT( { 3, 1, 4, 42, 5, 9 })   // Resultado: { 1, 3, 4, 5, 9, 42}
 *
 *      * El siguiente ejemplo ordena cadenas en orden descendente
 *        LOCAL aKeys := { "Ctrl", "Alt", "Delete" }, n
 *        LOCAL bOrden := {| x, y | UPPER( x ) > UPPER( y ) }
 *        ASORT( aKeys,,, bOrden )
 *        FOR n = 1 TO LEN( aKeys )
 *            ? aKeys [n]          // Resultado: { "Delete", "Ctrl", "Alt"}
 *        NEXT
 *
 *      * El siguiente ejemplo ordena dos arrays bidimensionales de acuerdo
 *        al segundo elemento de cada par.
 *
 *        LOCAL aPair := { {"Sun",8}, {"Mon",1}, {"Tue",57}, {"Wed",-6} }
 *        ASORT( aPair,,, {| x, y | x[2] < y[2] } )
 *
 *        FOR n = 1 TO LEN( aPair )
 *            ? aPair [n][1],  aPair [n][2]
 *        NEXT
 *        // Resultado: { {"Wed",-6}, {"Mon",1}, {"Sun",8}, {"Tue",57} }
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      La frecuencia de llamada al bloque de c¢digo y el orden difiere de
 *      Clipper debido a que Harbour usa un algoritmo distinto (m s r pido)
 *      de ordenamiento (quicksort).
 *  $FILES$
 *      El c¢digo fuente est  en source\vm\arrays.c
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      ASCAN(),EVAL(),SORT
 *  $END$
 */


c:\harbour\doc\es\binnum.txt
/*
 * $Id: binnum.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *    BIN2W(), BIN2I(), BIN2L(), BIN2U(), I2BIN(),
 *    W2BIN(), L2BIN(), U2BIN()
 *
 * Copyright 2000 Chen Kedem 
 * Documentaci¢n en Ingl‚s de: BIN2W(), BIN2I(), BIN2L(), BIN2U(), I2BIN(),
 *                             W2BIN(), L2BIN(), U2BIN()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      BIN2W()
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte 2 bytes de un entero corto sin signo en un n£mero
 *  $SYNTAX$
 *      BIN2W(  ) --> nNumero
 *  $ARGUMENTS$
 *       es una cadena de caracteres que contiene un entero corto
 *                sin signo codificado en 16 bits (byte menos significativo
 *                primero). Los primeros dos bytes son tenidos en cuenta,
 *                si hay m s son ignorados.
 *  $RETURNS$
 *      BIN2W() retorna un n£mero entero (¢ cero si  no es una
 *      cadena).
 *  $DESCRIPTION$
 *      BIN2W() es una de las funciones de conversi¢n binaria, de bajo nivel.
 *      Estas funciones convierten entre un valor num‚rico en Harbour y una
 *      representaci¢n de cadena de un valor num‚rico dado.
 *      BIN2W() toma dos bytes de un entero corto sin signo codificado en 16
 *      bits y los convierte en un valor num‚rico estandar de Harbour.
 *
 *      Ud podr¡a preguntarse cual es la necesidad de este tipo de funciones,
 *      bueno, primero de todo esta permite leer/escribir informaci¢n desde/
 *      hacia un archivo binario (como extraer informaci¢n de la cabecera de
 *      un archivo DBF), es tambi‚n una forma £til de compartir informaci¢n
 *      desde otra fuente distinta a Harbour (lenguaje C por ejemplo).
 *      BIN2W() es la inversa de W2BIN()
 *  $EXAMPLES$
 *      
 *      // Muestra la longitud de la cabecera de un DBF
 *      FUNCTION main()
 *      LOCAL nHandle, cBuffer := SPACE( 2 )
 *      nHandle := FOPEN( "test.dbf" )
 *
 *      IF nHandle > 0
 *         FSEEK( nHandle, 8 )
 *         FREAD( nHandle, @cBuffer, 2 )
 *         ? "Longitud de la cabecera del DBF en bytes:", BIN2W( cBuffer )
 *         FCLOSE( nHandle )
 *      ELSE
 *         ? "No puedo abrir el archivo..."
 *      ENDIF
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      BIN2W() funciona exactamente como la funci¢n de CA-Cl*pper, BIN2W()
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BIN2I(),BIN2L(),BIN2U(),I2BIN(),W2BIN(),WORD()*,U2BIN(),FREAD()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      BIN2I()
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte 2 bytes de un entero con signo en un n£mero en Harbour
 *  $SYNTAX$
 *      BIN2I(  ) --> nNumero
 *  $ARGUMENTS$
 *       es una cadena de caracteres que contiene un entero corto
 *                con signo codificado en 16 bits (byte menos significativo
 *                primero). Los primeros dos bytes son tenidos en cuenta,
 *                si hay m s son ignorados.
 *  $RETURNS$
 *      BIN2I() retorna un n£mero entero (¢ cero si  no es una
 *      cadena).
 *  $DESCRIPTION$
 *      BIN2I() es una de las funciones de conversi¢n binaria, de bajo nivel.
 *      Estas funciones convierten entre un valor num‚rico en Harbour y una
 *      representaci¢n de cadena de un valor num‚rico dado.
 *      BIN2I() toma dos bytes de un entero corto con signo codificado en 16
 *      bits y los convierte en un valor num‚rico est ndar de Harbour.
 *
 *      Ud podr¡a preguntarse cual es la necesidad de este tipo de funciones,
 *      bueno, primero de todo esta permite leer/escribir informaci¢n desde/
 *      hacia un archivo binario (como extraer informaci¢n de la cabecera de
 *      un archivo DBF), es tambien una forma £til de compartir informaci¢n
 *      desde otra fuente distinta a Harbour (lenguaje C por ejemplo).
 *      BIN2I() es la inversa de I2BIN()
 *  $EXAMPLES$
 *      
 *      // Muestra la fecha de la £ltima actualizaci¢n del DBF
 *      FUNCTION main()
 *      LOCAL nHandle, cAno, cMes, cDia
 *      nHandle := FOPEN( "test.dbf" )
 *
 *      IF nHandle > 0
 *         FSEEK( nHandle, 1 )
 *         cAno := cMes := cDia := " "
 *         FREAD( nHandle, @cAno, 1 )
 *         FREAD( nHandle, @cMes, 1 )
 *         FREAD( nHandle, @cDia, 1 )
 *         ? "Fecha de actualizaci¢n:", BIN2I( cAno ), BIN2I( cMes ), ;
 *                                      BIN2I( cDia )
 *         FCLOSE( nHandle )
 *      ELSE
 *         ? "No puedo abrir el archivo..."
 *      ENDIF
 *
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      BIN2I() funciona exactamente como la funci¢n de CA-Cl*pper, BIN2I()
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BIN2L(),BIN2U(),BIN2W(),I2BIN(),W2BIN(),WORD()*,U2BIN(),FREAD()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      BIN2L()
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte 4 bytes de un entero largo con signo en un n£mero
 *  $SYNTAX$
 *      BIN2L(  ) --> nNumero
 *  $ARGUMENTS$
 *       es una cadena de caracteres que contiene un entero largo
 *                con signo codificado en 32 bits (byte menos significativo
 *                primero). Los primeros cuatro bytes son tenidos en cuenta,
 *                si hay m s son ignorados.
 *  $RETURNS$
 *      BIN2L() retorna un n£mero entero (¢ cero si  no es una
 *      cadena).
 *  $DESCRIPTION$
 *      BIN2L() es una de las funciones de conversi¢n binaria, de bajo nivel.
 *      Estas funciones convierten entre un valor num‚rico en Harbour y una
 *      representaci¢n de cadena de un valor num‚rico dado.
 *      BIN2L() toma cuatro bytes de un entero largo con signo codificado en
 *      32 bits y los convierte en un valor num‚rico est ndar de Harbour.
 *
 *      Ud podr¡a preguntarse cual es la necesidad de este tipo de funciones,
 *      bueno, primero de todo esta permite leer/escribir informaci¢n desde/
 *      hacia un archivo binario (como extraer informaci¢n de la cabecera de
 *      un archivo DBF), es tambien una forma £til de compartir informaci¢n
 *      desde otra fuente distinta a Harbour (lenguaje C por ejemplo).
 *      BIN2L() es la inversa de L2BIN()
 *  $EXAMPLES$
 *      
 *      // Muestra el n£mero de registros en el DBF
 *      FUNCTION main()
 *      LOCAL nHandle, cBuffer := SPACE( 4 )
 *      nHandle := FOPEN( "test.dbf" )
 *
 *      IF nHandle > 0
 *         FSEEK( nHandle, 4 )
 *         FREAD( nHandle, @cBuffer, 4 )
 *         ? "n£mero de registros en el archivo:", BIN2L( cBuffer )
 *         FCLOSE( nHandle )
 *      ELSE
 *         ? "No puedo abrir el archivo..."
 *      ENDIF
 *
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      BIN2L() funciona exactamente como la funci¢n de CA-Cl*pper, BIN2L()
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BIN2I(),BIN2U(),BIN2W(),I2BIN(),L2BIN(),W2BIN(),WORD()*,U2BIN()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      BIN2U()
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte 4 bytes de un entero largo sin signo en un n£mero
 *  $SYNTAX$
 *      BIN2U(  ) --> nNumero
 *  $ARGUMENTS$
 *       es una cadena de caracteres que contiene un entero largo
 *                sin signo codificado en 32 bits (byte menos significativo
 *                primero). Los primeros cuatro bytes son tenidos en cuenta,
 *                si hay m s son ignorados.
 *  $RETURNS$
 *      BIN2U() retorna un n£mero entero (¢ cero si  no es una
 *      cadena).
 *  $DESCRIPTION$
 *      BIN2U() es una de las funciones de conversi¢n binaria, de bajo nivel.
 *      Estas funciones convierten entre un valor num‚rico en Harbour y una
 *      representaci¢n de cadena de un valor num‚rico dado.
 *      BIN2U() toma cuatro bytes de un entero largo sin signo codificado en
 *      32 bits y los convierte en un valor num‚rico est ndar de Harbour.
 *
 *      Ud podr¡a preguntarse cual es la necesidad de este tipo de funciones,
 *      bueno, primero de todo esta permite leer/escribir informaci¢n desde/
 *      hacia un archivo binario (como extraer informaci¢n de la cabecera de
 *      un archivo DBF), es tambien una forma util de compartir informaci¢n
 *      desde otra fuente distinta a Harbour (lenguaje C por ejemplo).
 *      BIN2U() es la inversa de U2BIN()
 *  $EXAMPLES$
 *      
 *      // Muestra el n£mero de registros en el DBF
 *      FUNCTION main()
 *      LOCAL nHandle, cBuffer := SPACE( 4 )
 *      nHandle := FOPEN( "test.dbf" )
 *
 *      IF nHandle > 0
 *         FSEEK( nHandle, 4 )
 *         FREAD( nHandle, @cBuffer, 4 )
 *         ? "N£mero de registros en el archivo:", BIN2U( cBuffer )
 *         FCLOSE( nHandle )
 *      ELSE
 *         ? "No puedo abrir el archivo..."
 *      ENDIF
 *
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      BIN2U() es una funci¢n de compatibilidad con XBase++ y no existe como
 *      una funci¢n est ndar en CA-Cl*pper 5.x
 *      Esta funci¢n es solamente visible si el archivo source/rtl/binnum.c
 *      fue compilado con la bandera HB_COMPAT_XPP.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BIN2I(),BIN2L(),BIN2W(),I2BIN(),W2BIN(),WORD()*,U2BIN(),FREAD()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      I2BIN()
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte un n£mero en 2 bytes de un entero corto con signo.
 *  $SYNTAX$
 *      I2BIN(  ) --> cBuffer
 *  $ARGUMENTS$
 *       es un valor num‚rico a convertir (los digitos decimales
 *                son ignorados).
 *  $RETURNS$
 *      I2BIN() retorna una cadena de caracteres de dos bytes que
 *      contienen un entero corto con signo, codificado en 16 bits (byte
 *      menos significativo primero).
 *  $DESCRIPTION$
 *      I2BIN() es una de las funciones de conversi¢n binaria, de bajo nivel.
 *      Estas funciones convierten entre un valor num‚rico en Harbour y una
 *      representaci¢n de cadena de un valor num‚rico dado.
 *      I2BIN() toma un valor num‚rico y lo convierte en dos bytes de
 *      un entero corto con signo, codificado en 16 bits.
 *
 *      Ud podr¡a preguntarse cual es la necesidad de este tipo de funciones,
 *      bueno, primero de todo esta permite leer/escribir informaci¢n desde/
 *      hacia un archivo binario (como extraer informaci¢n de la cabecera de
 *      un archivo DBF), es tambien una forma util de compartir informaci¢n
 *      desde otra fuente distinta a Harbour (lenguaje C por ejemplo).
 *      I2BIN() es la inversa de BIN2I()
 *  $EXAMPLES$
 *      
 *      // El ejemplo cambia la "fecha de ultima actualizaci¢n" del DBF
 *      #include "fileio.ch"
 *      FUNCTION main()
 *      LOCAL nHandle, cAno, cMes, cDia
 *
 *      USE test
 *      ? "La fecha original de actualizaci¢n es:", LUPDATE()
 *      CLOSE
 *      nHandle := FOPEN( "test.dbf", FO_READWRITE )
 *
 *      IF nHandle > 0
 *         FSEEK( nHandle, 1, )
 *         cAno := I2BIN( 68 )
 *         cMes := I2BIN(  8 )
 *         cDia := I2BIN(  1 )
 *         FWRITE( nHandle, cAno , 1 )   // escribe solo el primer byte
 *         FWRITE( nHandle, cMes, 1 )
 *         FWRITE( nHandle, cDia, 1 )
 *         FCLOSE( nHandle )
 *         USE test
 *         ? "La nueva fecha de actualizaci¢n es:", LUPDATE()
 *         CLOSE
 *      ELSE
 *         ? "No puedo abrir el archivo..."
 *      ENDIF
 *
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      I2BIN() funciona exactamente como la funci¢n de CA-Cl*pper, I2BIN()
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BIN2I(),BIN2L(),BIN2U(),BIN2W(),W2BIN(),WORD()*,U2BIN(),FWRITE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      W2BIN()
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte un n£mero en 2 bytes de un entero corto sin signo
 *  $SYNTAX$
 *      W2BIN(  ) --> cBuffer
 *  $ARGUMENTS$
 *       es un valor num‚rico a convertir (los digitos decimales
 *                son ignorados).
 *  $RETURNS$
 *      W2BIN() retorna una cadena de caracteres de dos bytes que
 *      contienen un entero corto sin signo, codificado en 16 bits (byte
 *      menos significativo primero).
 *  $DESCRIPTION$
 *      W2BIN() es una de las funciones de conversi¢n binaria, de bajo nivel.
 *      Estas funciones convierten entre un valor num‚rico en Harbour y una
 *      representaci¢n de cadena de un valor num‚rico dado.
 *      W2BIN() toma un valor num‚rico y lo convierte en dos bytes de
 *      un entero corto sin signo, codificado en 16 bits.
 *
 *      Ud podr¡a preguntarse cual es la necesidad de este tipo de funciones,
 *      bueno, primero de todo esta permite leer/escribir informaci¢n desde/
 *      hacia un archivo binario (como extraer informaci¢n de la cabecera de
 *      un archivo DBF), es tambien una forma util de compartir informaci¢n
 *      desde otra fuente distinta a Harbour (lenguaje C por ejemplo).
 *      W2BIN() es la inversa de BIN2W()
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      W2BIN() es una funci¢n de compatibilidad con XBase++ y no existe como
 *      una funci¢n estandar en CA-Cl*pper 5.x
 *      Esta funci¢n es solamente visible si el archivo source/rtl/binnum.c
 *      fue compilado con la bandera HB_COMPAT_XPP.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BIN2I(),BIN2L(),BIN2U(),BIN2W(),I2BIN(),WORD()*,U2BIN(),FWRITE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      L2BIN()
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte un n£mero en 4 bytes de un entero largo con signo
 *  $SYNTAX$
 *      L2BIN(  ) --> cBuffer
 *  $ARGUMENTS$
 *       es un valor num‚rico a convertir (los digitos decimales
 *      son ignorados).
 *  $RETURNS$
 *      L2BIN() retorna una cadena de caracteres de cuatro bytes que
 *      contienen un entero largo con signo, codificado en 32 bits (byte
 *      menos significativo primero).
 *  $DESCRIPTION$
 *      L2BIN() es una de las funciones de conversi¢n binaria, de bajo nivel.
 *      Estas funciones convierten entre un valor num‚rico en Harbour y una
 *      representaci¢n de cadena de un valor num‚rico dado.
 *      L2BIN() toma un valor num‚rico y lo convierte en cuatro bytes de
 *      un entero largo con signo, codificado en 32 bits.
 *
 *      Ud podr¡a preguntarse cual es la necesidad de este tipo de funciones,
 *      bueno, primero de todo esta permite leer/escribir informaci¢n desde/
 *      hacia un archivo binario (como extraer informaci¢n de la cabecera de
 *      un archivo DBF), es tambien una forma £til de compartir informaci¢n
 *      desde otra fuente distinta a Harbour (lenguaje C por ejemplo).
 *      L2BIN() es la inversa de BIN2L()
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      L2BIN() funciona exactamente como la funci¢n de CA-Cl*pper, L2BIN()
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BIN2I(),BIN2L(),BIN2U(),BIN2L(),W2BIN(),WORD()*,U2BIN(),FWRITE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      U2BIN()
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte un n£mero en 4 bytes de un entero largo sin signo
 *  $SYNTAX$
 *      U2BIN(  ) --> cBuffer
 *  $ARGUMENTS$
 *       es un valor num‚rico a convertir (los digitos decimales
 *                son ignorados).
 *  $RETURNS$
 *      U2BIN() retorna una cadena de caracteres de cuatro bytes que
 *      contienen un entero largo sin signo, codificado en 32 bits (byte
 *      menos significativo primero).
 *  $DESCRIPTION$
 *      U2BIN() es una de las funciones de conversi¢n binaria, de bajo nivel.
 *      Estas funciones convierten entre un valor num‚rico en Harbour y una
 *      representaci¢n de cadena de un valor num‚rico dado.
 *      U2BIN() toma un valor num‚rico y lo convierte en cuatro bytes de
 *      un entero largo sin signo, codificado en 32 bits.
 *
 *      Ud podr¡a preguntarse cual es la necesidad de este tipo de funciones,
 *      bueno, primero de todo esta permite leer/escribir informaci¢n desde/
 *      hacia un archivo binario (como extraer informaci¢n de la cabecera de
 *      un archivo DBF), es tambien una forma £til de compartir informaci¢n
 *      desde otra fuente distinta a Harbour (lenguaje C por ejemplo).
 *      U2BIN() es la inversa de BIN2U()
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      U2BIN() es una funci¢n de compatibilidad con XBase++ y no existe como
 *      una funci¢n est ndar en CA-Cl*pper 5.x
 *      Esta funci¢n es solamente visible si el archivo source/rtl/binnum.c
 *      fue compilado con la bandera HB_COMPAT_XPP.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BIN2I(),BIN2L(),BIN2U(),I2BIN(),L2BIN(),W2BIN(),WORD()*,FWRITE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      WORD()*
 *  $CATEGORY$
 *      Conversi¢n binaria
 *  $ONELINER$
 *      Convierte par metros de doble precisi¢n del mandato CALL a enteros
 *  $SYNTAX$
 *      WORD(  ) --> 
 *  $ARGUMENTS$
 *       es un valor num‚rico de doble precisi¢n.
 *  $RETURNS$
 *      WORD() retorna un entero en el rango: -32767 a +32767
 *  $DESCRIPTION$
 *      Esta funci¢n convierte valores de doble precisi¢n a enteros, para
 *      ser usados con el mandato CALL.
 *  $EXAMPLES$
 *      
 *      // Utiliza WORD() como argumento del mandato CALL
 *      CALL INVENT WITH WORD(75300)
 *
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      La NG de Clipper NG establece que WORD() funcionar  solamente cuando
 *      sea usada en la lista de par metros del comando CALL, de otra manera
 *      devolver  NIL, en Harbour esta funcionar  donde sea.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *       CALL
 *  $END$
 */


c:\harbour\doc\es\browse.txt
/*
 * $Id: browse.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: BROWSE(), DBEDIT(), TBROWSEDB(), DBSKIPPER()
 *
 * Copyright 1999 Chen Kedem 
 * Documentaci¢n en Ingl‚s de:  BROWSE(), DBEDIT(), TBROWSEDB(), DBSKIPPER()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      DBEDIT()*
 *  $CATEGORY$
 *      Entrada y salida de datos
 *  $ONELINER$
 *      Despliega registros en una tabla
 *  $SYNTAX$
 *      DBEDIT( [], [], [], [], [], ;
 *              [], [], ;
 *              [], ;
 *              [], [], ;
 *              [], [] ) --> lExito
 *  $ARGUMENTS$
 *       coordenada para la fila Superior de visualizaci¢n. El rango
 *      para  va de cero a MAXROW(), por defecto es cero.
 *
 *       coordenada para la columna izquierda de visualizaci¢n. El
 *      rango para  va de cero a MAXCOL(), por defecto es cero.
 *
 *       coordenada para la fila inferior de visualizaci¢n. El rango
 *      para  va de cero a MAXROW(), por defecto es MAXROW().
 *
 *       coordenada para la columna derecha de visualizaci¢n. El rango
 *      para  va de cero a MAXCOL(), por defecto es MAXCOL().
 *
 *       es un array de expresiones de caracteres que contienen
 *      los nombres de los campos de la base de datos, ¢ expresiones para la
 *      visualizaci¢n en cada columna.
 *      Si no es especificada, por defecto es la visualizaci¢n de todos los
 *      campos de la base de datos en el  rea de trabajo actual.
 *
 *       es el nombre de una funci¢n ¢ un bloque de c¢digo
 *      que podr¡a ser llamado cada vez que una tecla no reconocida ha sido
 *      presionada ¢ cuando no hay m s teclas para ser procesadas y DBEDIT()
 *      va al modo inactivo. Si  es una cadena de caracteres
 *      ‚sta debe contener el nombre de una funci¢n de usuario definida, que
 *      sea v lida y sin par‚ntesis.
 *      Ambos la funci¢n definida por el usuario ¢ el bloque de c¢digo
 *      deber n aceptar dos par metros: nModo y nActualColumna.
 *      Ambos deber¡an devolver un valor num‚rico que corresponda a uno de
 *      los c¢digos de retorno esperados.
 *      (Vea la tabla m s abajo con la lista de nModo y los c¢digos de
 *      retorno).
 *
 *       es un molde (picture) opcional.
 *      Si  es una cadena de caracteres, todas las
 *      columnas pueden usar el mismo valor como cadena de molde (picture).
 *      Si  es un array, cada elemento debe ser una
 *      cadena de caracteres que corresponde a la cadena (picture) usada de
 *      molde para la columna con el mismo ¡ndice. Vea la ayuda para @...SAY
 *      para tener m s informaci¢n acerca de los valores de molde (picture).
 *
 *       contiene los t¡tulos de cabecera para cada columna
 *      si ‚ste es una cadena de caracteres, todas las columnas tendr n el
 *      mismo encabezado, si ‚ste es un array, cada elemento es una cadena
 *      de caracteres que contienen el titulo de cabecera para cada campo.
 *      La cabecera puede ser dividido en m s de una l¡nea al poner un punto
 *      y coma (;) en los lugares donde Ud. desea romper la l¡nea.
 *      Si es omitida el valor por defecto para cada cabecera de columna es
 *      tomado de  ¢ el nombre del campo de la base de datos, si
 *       no fue especificado
 *
 *       es un array que contiene caracteres que dibujan
 *      las l¡neas que separan las cabeceras y los datos de los campos .
 *      En lugar de un array Ud. puede usar una cadena de caracteres que
 *      podr¡a ser usada para la visualizaci¢n de la misma l¡nea para todos
 *      los campos.
 *      El valor por defecto es una l¡nea doble.
 *
 *       es un array que contiene caracteres que dibujan
 *      las l¡neas que separan las columnas visualizadas. En lugar de un
 *      array Ud. puede usar una cadena de caracteres que podria ser usada
 *      para la visualizaci¢n de la misma l¡nea para todos los campos.
 *      El valor por defecto es una l¡nea simple.
 *
 *       es un array que contiene caracteres que dibujan
 *      las l¡neas que separan el  rea de datos de los campos y el pie.
 *      En lugar de un array Ud. puede usar una cadena de caracteres que
 *      podr¡a ser usada para la visualizaci¢n de la misma l¡nea para todos
 *      los campos. El valor por defecto es ning£n separador de pie.
 *
 *       contiene el pie para ser visualizado al final de
 *      cada columna, si este es una cadena de caracteres, todas las columnas
 *      tendr n el mismo pie, si este es un array, cada elemento es una
 *      cadena de caracteres que contienen el pie para cada campo. El pie
 *      puede ser dividido en m s de una l¡nea al poner un punto y coma (;)
 *      en los lugares donde Ud. desea romper la l¡nea. Si es omitido, ning£n
 *      pie es visualizado.
 *  $RETURNS$
 *      DBEDIT() retorna .F. si no hay una base de datos abierta en ese  rea
 *      de trabajo, ¢ si el n£mero de columnas para la visualizaci¢n es cero,
 *      en caso contrario DBEDIT() devuelve .T.
 *  $DESCRIPTION$
 *      DBEDIT() visualiza y permite editar registros de una ¢ m s  reas de
 *      trabajo en una grilla en pantalla. Cada columna es definida por los
 *      elementos de  y es el equivalente de un campo.
 *      Cada fila es el equivalente de un registro de la base de datos.
 *
 *
 *      A Continuaci¢n estan las teclas manejadas por DBEDIT(): 
 *      -------------------------------------------------------
 *
 *       Tecla            Significado
 *
 *       Izquierda        Mueve una columna a la izquierda (campo previo)
 *       Derecha          Mueve una columna a la derecha (proximo campo)
 *       Arriba           Mueve arriba una fila (registro previo)
 *       Abajo            Mueve abajo una fila (proximo registro)
 *       Pag-Arriba       Mueve a la pantalla previa
 *       Pag-Abajo        Mueve a la pantalla pr¢xima
 *       Ctrl Pag-Arriba  Mueve al inicio del archivo
 *       Ctrl Pag-Abajo   Mueve al final del archivo
 *       Inicio           Mueve a la columna visible m s a la izquierda
 *       Fin              Mueve a la columna visible m s a la derecha
 *       Ctrl Izquierda   Desplaza una columna a la izquierda
 *       Ctrl Derecha     Desplaza una columna a la deecha
 *       Ctrl Inicio      Mueve a la columna m s a la izquierda
 *       Ctrl Fin         Mueve a la columna m s a la derecha
 *
 *
 *      Cuando  es omitida, dos teclas m s estan activas:
 *
 *       Tecla            significado
 *
 *       Esc              Termina BROWSE()
 *       Enter            Termina BROWSE()
 *
 *
 *      Cuando DBEDIT() ejecuta  le pasa los siguientes
 *      argumentos:
 *      nModo y el ¡ndice del registro actual en .
 *      Si  es omitido, el n£mero de ¡ndice es n£mero de FIELD()
 *      de la estructura de la base de datos abierta.
 *
 *
 *      Valores de los Modos en DBEDIT() :    
 *      ---------------------------------
 *
 *       Dbedit.ch     Valor  Significado
 *
 *       DE_IDLE        0     DBEDIT() esta inactivo, todas la teclas de
 *                            movimiento han sido procesadas.
 *       DE_HITTOP      1     Intento de mover el cursor m s alla de la parte
 *                            superior del archivo
 *       DE_HITBOTTOM   2     Intento de mover el cursor despues del final
 *                            del archivo.
 *       DE_EMPTY       3     No hay registros en el  rea de trabajo, la base
 *                            de datos est  vacia.
 *       DE_EXCEPT      4     Interrupci¢n de teclado
 *
 *
 *
 *      La funci¢n definida por el usuario ¢ el bloque de c¢digo debe
 *      retornar un valor que le indique a DBEDIT() que hacer a continuaci¢n.
 *
 *
 *      C¢digos de retorno de la Funci¢n del Usuario:    
 *      --------------------------------------------
 *
 *       Dbedit.ch   Valor   Significado
 *
 *       DE_ABORT     0      Aborta DBEDIT().
 *       DE_CONT      1      Continua DBEDIT() como ahora.
 *       DE_REFRESH   2      Fueza relectura/revisualizaci¢n en pantalla de
 *                           todas las filas de datos
 *
 *
 *      La funci¢n del usuario es llamada una vez en cada uno de los
 *      siguientes casos:
 *      - La base de datos esta vac¡a.
 *      - El usuario trata de mover m s alla de la parte superior ¢ de la
 *        parte inferior del archivo.
 *      - Interrupci¢n de teclado, el usuario ha presionado una tecla que no
 *        puede ser manejada por DBEDIT().
 *      - El buffer de teclado esta vac¡o ¢ un refresco de pantalla acaba
 *        de ocurrir.
 *
 *      Nota Importante:
 *      ---------------
 *      DBEDIT() es una funci¢n de compatibilidad, esta fu‚ superada por la
 *      clase TBrowse y no es recomendada para nuevas aplicaciones.
 *  $EXAMPLES$
 *      
 *      // Despliega un archivo DBF usando valores por defecto
 *      USE Test
 *      DBEDIT()
 *      
 *
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *       puede ser tambi‚n un bloque de c¢digo, esta es una
 *      extensi¢n de Harbour.
 *
 *      CA-Cl*pper lanzar  un error si no hay una base de datos abierta
 *      Harbour puede retornar .F.
 *
 *      Clipper es inconsistente y lanzar  un error si el n£mero de columnas
 *      es cero. Harbour puede retornar .F.
 *      Las NG de CA-Cl*pper 5.2 indican que el valor devuelto es NIL,
 *      esto es err¢neo y deber¡a ser un valor l¢gico.
 *
 *      Hay un c¢digo de retorno (3) indocumentado para las funciones
 *      definidas por el usuario en Clipper (ambos 87 and 5.x). este es un
 *      Modo de agregado (Append) el cual:
 *      "Divide la pantalla para permitir m s que datos sean agregados en el
 *       rea de la ventana".
 *      Este modo no es soportado por Harbour.
 *  $FILES$
 *      Los archivos de cabecera son dbedit.ch, inkey.ch
 *      La librer¡a es rtl
 *  $SEEALSO$
 *     @...SAY,BROWSE(),TBrowse class,TRANSFORM()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      BROWSE()*
 *  $CATEGORY$
 *      Entrada y salida de datos
 *  $ONELINER$
 *      Despliega un archivo de base de datos
 *  $SYNTAX$
 *      BROWSE( [, , , ] ) --> lExito
 *  $ARGUMENTS$
 *       coordenada de la fila Superior de visualizaci¢n.
 *
 *       coordenada de la columna izquierda de visualizaci¢n.
 *
 *       coordenada de la fila inferior de visualizaci¢n.
 *
 *       coordenada de la columna derecha de visualizaci¢n.
 *  $RETURNS$
 *      BROWSE() retorna .F. si no hay una base de datos abierta en ese  rea
 *      de trabajo, en caso contrario devuelve .T.
 *  $DESCRIPTION$
 *      BROWSE() es un visualizador de bases de datos de prop¢sito general,
 *      sin demasiado trabajo ud. puede desplegar un archivo DBF con las
 *      siguientes teclas:
 *
 *
 *       Tecla            Significado
 *
 *       Izquierda        Mueve una columna a la izquierda (campo previo)
 *       Derecha          Mueve una columna a la derecha (proximo campo)
 *       Arriba           Mueve arriba una fila (registro previo)
 *       Abajo            Mueve abajo una fila (proximo registro)
 *       Pag-Arriba       Mueve a la pantalla previa
 *       Pag-Abajo        Mueve a la pantalla proxima
 *       Ctrl Pag-Arriba  Mueve al inicio del archivo
 *       Ctrl Pag-Abajo   Mueve al final del archivo
 *       Inicio           Mueve a la columna visible m s a la izquierda
 *       Fin              Mueve a la columna visible m s a la derecha
 *       Ctrl Izquierda   Desplaza una columna a la izquierda
 *       Ctrl Derecha     Desplaza una columna a la deecha
 *       Ctrl Inicio      Mueve a la columna m s a la izquierda
 *       Ctrl Fin         Mueve a la columna m s a la derecha
 *       Esc              Termina el BROWSE()
 *
 *
 *
 *      En la parte superior de la pantalla ud. ve una l¡nea de estado con
 *      la siguiente indicaci¢n:
 *
 *
 *      Registro ###/### N£mero registro actual / N£mero Total de registros.
 *                  No hay registros, el archivo esta vacio.
 *                   Ud.esta en modo de Agregado al final del archivo.
 *               El registro actual esta borrado.
 *                   Ud. esta en el comienzo del archivo.
 *
 *
 *      Ud. deber¡a pasar las cuatro coordenadas validas, si menos de cuatro
 *      par metros son pasados al BROWSE() las coordenadas por defecto son:
 *      1, 0, MAXROW(), MAXCOL().
 *  $EXAMPLES$
 *      
 *      // muestra como desplegar una base de datos
 *      USE Test
 *      BROWSE()
 *      
 *  $STATUS$
 *      S
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      DBEDIT()*,TBrowse class
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      TBrowseDB()
 *  $CATEGORY$
 *      Clase TBrowse
 *  $ONELINER$
 *      Crea un nuevo objeto TBrowse para ser usado con una base de datos.
 *  $SYNTAX$
 *      TBrowseDB( [], [], [], [] ) --> oBrowse
 *  $ARGUMENTS$
 *       coordenada de la fila superior de visualizaci¢n.
 *
 *       coordenada de la columna izquierda de visualizaci¢n.
 *
 *       coordenada de la fila inferior de visualizaci¢n.
 *
 *       coordenada de la columna derecha de visualizaci¢n.
 *  $RETURNS$
 *      TBrowseDB() retorna un nuevo objeto TBrowse con unas coordenadas
 *      espec¡ficas y un :SkipBlock, :GoTopBlock y :GoBottomBlock por defecto
 *      para desplegar una base de datos.
 *  $DESCRIPTION$
 *      TBrowseDB() es una forma r pida de crear un objeto TBrowse junto con
 *      el soporte m¡nimo para desplegar una base de datos.
 *      Note que el objeto TBrowse devuelto no contiene objetos TBColumn y
 *      Ud. necesita agregar una columna para cada campo por Ud. mismo
 *  $EXAMPLES$
 *      
 *      Para un buen ejemplo, mire en el c¢digo fuente de la funci¢n BROWSE()
 *      en el subdirectorio ../source/rtl/browse.prg
 *      
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      TBrowseDB() funciona exactamente como la funci¢n de CA-Cl*pper
 *       TBrowseDB().
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      BROWSE()*,TBColumn class,TBrowse class,TBrowseNew()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      dbSkipper()
 *  $CATEGORY$
 *      Base de datos
 *  $ONELINER$
 *      Funci¢n para ayudar a saltar registros en la base de datos
 *  $SYNTAX$
 *      dbSkipper(  ) --> nSkipped
 *  $ARGUMENTS$
 *       es el n£mero de registros a saltar relativos al registro
 *      actual. N£meros positivos tratan de mover el puntero de registro
 *      hacia adelante y N£meros negativos tratan de mover el puntero de
 *      registro hacia atr s  registros.
 *  $RETURNS$
 *      dbSkipper() retorna el n£mero actual de registros saltados.
 *  $DESCRIPTION$
 *      dbSkipper() es una funci¢n de ayuda usada en el mecanismo de
 *      despliegue para saltar un n£mero de registros mientras le da al
 *      llamador una indicaci¢n del n£mero actual de registros saltados.
 *  $EXAMPLES$
 *      
 *      // Abre un archivo y chequea si tenemos suficientes registros en el
 *      USE ventas
 *      IF dbSkipper( 100 ) == 100
 *         ? "Buen trabajo!, debes irte de fiesta"
 *      ELSE
 *         ? "Muy mal, Ud. deber¡a realmente trabajar m s duro"
 *      ENDIF
 *      CLOSE
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      dbSkipper() es una funci¢n de compatibilidad con XBase++ y no existe
 *      como una funci¢n est ndar en CA-Cl*pper 5.x
 *      Esta funci¢n es solamente visible si el archivo:
 *       ../source/rtl/browdb.prg fue compilado con la bandera HB_COMPAT_XPP.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      DBSKIP(),SKIP
 *  $END$
 */


c:\harbour\doc\es\clipper.txt
/*
 * $Id: clipper.txt 6072 2003-07-13 14:51:56Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Ron Pinkas 
 *   Documentaci¢n en Ingl‚s
 *
 * Copyright 2001 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol de clipper.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


   Este documento intenta describir las caracter¡sticas que separan
   Harbour de Clipper.

/* TODO: @FuncPointer(), y todas las otras extensiones de Harbour. */


    El Compilador de Macros de Harbour
    ----------------------------------
    El Compilador de Macros de Harbour ofrece dos capas adicionales de
    funcionalidad por medio de la funci¢n HB_SETMACRO()*, no disponible
    en Clipper.

    HB_SETMACRO( HB_SM_HARBOUR, TRUE ) habilitar  compilaci¢n de macros
    y evaluaci¢n de expresiones complejas, no soportadas por Clipper como:

     - exp++, exp--, var += exp, (exp), etc..
     - bloques de c¢digo (codeblocks) anidados.
     - Expresiones m s largas de 254 caracteres.


    HB_SETMACRO( HB_SM_XBASE, TRUE ) habilitar  compilaci¢n de macros
    y evaluaci¢n de listas separadas por comas, en todos los contextos
    donde las listas son aceptadas por Clipper*, incluyendo:

     - { &cMacro }         // Literal de la lista de elementos de un array.
     - SomeArray[ &cMacro ]// Lista de indices de un array.
     - SomeFun( &cMacro )  // Lista de Argumentos de una funci¢n.
     - ( &cMacro )         // Lista de expresiones parentizada.

    *Clipper s¢lo soporta lista de macros dentro del contexto de bloques
    de c¢digo (codeblocks).

    Ambas capas extras estan activadas por defecto.

    * Vea tambi‚n el switch -k del Compilador


    Comando LIST
    ------------

    LIST &cMacro

    LIST en clipper soporta [superficialmente] macros de listas de
    expresiones.
    Ning£n error ser  producido, y todas las expresiones en la lista ser n
    evaluadas, pero *solamente* la *£ltima* expresion ser  visualizada.
    Esto no est  documentado ni en el comando LIST, ni en la descripci¢n
    del operador Macro (&), pero es el comportamiento por defecto en 
    todas las versiones de Clipper 5.x

    Harbour en su lugar, no s¢lo eval£a todas las expresiones en esa 
    lista de macros, sino que tambi‚n visualiza todos aquellos valores. 
    Este comportamiento por defecto de Harbour, puede ser deshabilitado 
    HB_SETMACRO( HB_SM_XBASE, .F. )*

    * Vea tambi‚n el switch -k del Compilador


    INIT/EXIT y procedimientos de inicio
    ------------------------------------

    En Clipper el procedimiento de inicio es siempre el primer procedimiento
    /funci¢n del modulo principal, a£n si ese s¡mbolo es el s¡mbolo INIT 
    ¢ EXIT. En tal caso el programa nunca ejecutar  el s¡mbolo "main".
    En Harbour el primer s¡mbolo que no sea INIT/EXIT, ser  ejecutado como
    el s¡mbolo "main" despu‚s que todos los procedimientos INIT hayan sido
    ejecutados. 
 



c:\harbour\doc\es\cmdline.txt
/*
 * $Id: cmdline.txt 9243 2008-08-25 21:36:00Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 
 *   Documentación en Ingl‚s de: cmdline.txt
 *
 * Copyright 2002 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de: cmdline.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Linea de Comandos
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Opciones del Compilador
 *  $DESCRIPTION$
 *      Esta especificaci¢n sirve para CLIPPERCMD, HARBOURCMD, el compilador
 *      Harbour y las directivas #pragma en el c¢digo fuente.
 *      
 *      La l¡nea de comando siempre predomina sobre las variables de entorno.
 *      
 *      Note que algunos switches no son aceptados en variables de entorno,
 *      y algunos otros en #pragmas.
 *      
 *      Primero el analizador (parser) deber¡a comenzar saltando a trav‚s 
 *      de todos los tokens en la cadena separadas por espacios en blanco.
 *      (¢ solo ir a trav‚s de todos los argv[])
 *      
 *      1.) Si el token comienza con "-", este debe ser tratado como un
 *          un nuevo estilo de switch .
 *      
 *      Uno ¢ m s caracteres switch pueden seguir a ‚ste. El signo "-"
 *      dentro del token apaga el switch.
 *      
 *      Si el switch tiene un argumento, todos los caracteres siguientes son
 *      tratados como parte del argumento:
 *      
 *      El signo "/" n tiene significado especial aqui.
 *          
 *        
 *        Switch                  Opci¢n resultante
 *
 *        -wn                     ( W N )
 *        -w-n                    ( !W N )
 *        -wi/harbour/include/    ( W I=/harbour/include/ )
 *        -wi/harbour/include/n   ( W I=/harbour/include/n )
 *        -wes0n                  ( W ES=0 N )
 *        -wen                    ( W [invalid switch: e] N )
 *        -wesn                   ( W ES=default(0) N )
 *        -wses                   ( W S ES=default(0) )
 *        -wess                   ( W ES=default(0) S )
 *        -                       ( [invalid switch] )
 *        -w-n-p                  ( !W !N P )
 *        -w-n-p-                 ( !W !N !P )      
 *        -w- -w -w-              ( finally: !W )
 *          
* * * 2.) Si el token comienza con "/", este debe ser tratado como un * switch de compatibilidad. * * El analizador revisa el token por el pr¢ximo signo "/", o EOS * (End Of String = fin de linea) y trata la cadena resultante * como un s¢lo switch. * * Esto significa que si un switch con un argumento conteniendo el * signo "/" tiene algunas limitaciones. * Esto puede ser resuelto permitiendo el uso de caracteres comillas. * Esto es mayormente un problema en sistemas que usan "/" como un * separador de path. * * * El signo "-" n tiene significado especial aqu¡, ‚ste no puede ser * usado para deshabilitar un switch. * * * Switch Opci¢n resultante * * /w/n ( W N ) * /wo/n ( [invalid switch: wo] N ) * /ihello/world/ ( I=hello [invalid switch: world] * [invalid switch: /] ) * /i"hello/world/"/w ( I=hello/world/ W ) * /ihello\world\ ( I=hello\world\ ) *
* * * 3.) Si el token comienza con otra cosa, ‚ste deber¡a ser saltado. * * Los switches de Harbour son siempre insensibles a las mayúsculas. * * En la l¡nea de comandos de Harbour los dos estilos pueden ser usados * conjuntamente: * * harbour -wnes2 /gc0/q0 -iC:\hello * * Excepciones: * * - El manejo del switch indocumentado /CREDIT en la l¡nea de comandos * de Harbour es inusual, revise el c¢digo actual por esto. * * - El analisis de los par metros en la l¡nea de comandos de CLIPPER, * HARBOUR y aplicaciones de Harbour, son cosas distintas, vea * cmdarg.c por una nota. * * Notas: * * - En toda ocurrencia donde el path es aceptado, Harbour deber¡a * manejar el caracter doble comillas (") para especificar un path * conteniendo espacios, signo negativo, barras u otros caracteres * con un significado especial. * * /i"C:/hello/" * -i"C:/hello-n" * /i"C:/Program Files/" * -i"C:/Program Files/" * * * S¢lo algunos ejemplos para las varias formas aceptadas: * //F20 == /F20 == F20 == F:20 == F20X * //TMPPATH:C:\hello * F20//TMPPATH:/temp///F:30000000 NOIDLE * F0NOIDLEX10 * SQUAWKNOIDLE * * "//" siempre deber¡an ser usados en la l¡nea de comandos. * $SEEALSO$ * Opciones Compilador * $END$ */
c:\harbour\doc\es\codebloc.txt
/*
 * $Id: codebloc.txt 6072 2003-07-13 14:51:56Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Ryszard Glab 
 *   Documentaci¢n en Ingl‚s de codeblock.txt
 *
 * Copyright 2001 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol de codeblock.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

Implementaci¢n de Harbour de codeblocks (bloques de c¢digo)
===========================================================

Compilaci¢n de un codeblock
  Durante el tiempo de Compilaci¢n, el codeblock es almacenado en la 
  siguiente forma:
  - la cabecera
  - la ristra de bytes de pcodes

La cabecera almacena informaci¢n acerca de variables locales 
referenciadas.
+0: el byte pcode para _PUSHBLOCK
+1: el n£mero de bytes que definen a un codeblock
+3: el n£mero de par metros codeblock (declarados entre || en el codeblock)
+5: n£mero de variables locales usadas declaradas en el procedimiento /
    funci¢n donde el codeblock es creado.
+7: La lista de las posiciones de variables locales de los procedimientos /
    funciones, en la pila eval del procedimiento / funci¢n. Cada variable
    local usada en un codeblock usa 2 bytes en esta lista. Cuando son 
    usados codeblocks anidados, entonces esta lista es creada solamente 
    en el codeblock m s externo.
+x: La ristra de bytes pcode, siguiendo a la cabecera.
+y: El byte pcode para _ENDBLOCK


Creaci¢n de un codeblock
========================
 Cuando el opcode HB_P_PUSHBLOCK es ejecutado entonces la estructura 
HB_ITEM es creada y puesta en la pila de evaluaci¢n. El tipo de item 
es IT_BLOCK.
El valor de este item es un puntero a la estructura HB_CODEBLOCK. 
Adicionalmente este item almacena la base de las variables est ticas 
definidas para el procedimiento/funci¢n actual. - esto es usado durante 
la evaluaci¢n de un codeblock cuando la evaluaci¢n es llamada desde 
c¢digo desde otro m¢dulo PRG. Tambi‚n el n£mero de par metros esperados 
es almacenado.

 La estructura HB_CODEBLOCK almacena un puntero a la ristra (stream) 
de pcodes que es ejecutada durante la evaluaci¢n de un codeblock. 
Este almacena tambi‚n el puntero a la tabla con referencia a variables 
locales. Valores de todas las variables locales definidas en un 
procedimiento y usadas en un codeblock son reemplazadas con una 
referencia a un valor almacenado en un pool de variables de memoria 
global. Esto permite el correcto acceso a variables locales aisladas 
en un codeblock devuelto desde ‚sta funci¢n (sea directamente en una
sentencia RETURN ¢ indirectamente por asignarlo ‚ste a una variable 
est tica ¢ MEMVAR). 
Este reemplazo autom tico e incondicional es requerido porque no hay 
un m‚todo seguro de encontrar si un codeblock ser  accedido desde 
fuera de una funci¢n d¢nde ‚ste es creado.

Cuando son usados codeblocks anidados, solamente el codeblock m s 
externo crea la tabla - todo codeblock interno usa esta tabla. 
Esto permite compartir la tabla entre codeblocks anidados - , la 
tabla es borrada si no hay m s referencias a ella. 
Esto es causado por el hecho que un codeblock interno puede ser 
creado durante la evaluaci¢n del codeblock exterior cuando las 
variables locales no existen como en este ejemplo:

PROCEDURE MAIN()
PRIVATE foo, bar

  Test()
  EVAL( foo )
  EVAL( bar )

RETURN

PROCEDURE Test()
LOCAL a:='FOO', b:='BAR'

  foo ={ || a + ( bar:=EVAL( {|| b} ) ) }

RETURN


Evaluaci¢n de un codeblock
==========================
Los par metros pasados a un codeblock son puestos en la pila de 
evaluaci¢n antes de la evaluaci¢n del codeblock. Ellos son accedidos 
exactamente igual que cualquier par metro de funci¢n. Cuando un 
par metro de codeblock es referenciado, entonces su posici¢n en 
la pila de evaluaci¢n es usada.
Cuando una variable local de un procedimiento es referenciada 
entonces el ¡ndice dentro de la tabla de posiciones de variables 
locales (copiada de la cabecera) es usada. El valor negativo es 
usado como un ¡ndice para distinguirlo de la referencia a un 
par metro del codeblock.


Incompatibilidad con Clipper
============================

1) Variables locales aisladas pasadas por referencia
   -------------------------------------------------
Hay una peque¤a diferencia entre el manejo de las variables pasadas 
por referencia en un codeblock.
El siguiente c¢digo lo explica (gracias a David G. Holm)

Function Main()
Local nTest
Local bBlock1 := MakeBlock()
Local bBlock2 := {|| DoThing( @nTest ), qout("From Main: ", nTest ) }

   eval( bBlock1 )
   eval( bBlock2 )

Return( NIL )

Function MakeBlock()
Local nTest
Return( {|| DoThing( @nTest ), qout("From MakeBlock: ", nTest ) } )


Function DoThing( n )
   n := 42
Return( NIL )


   En Clipper esto produce:
Desde MakeBlock = NIL
Desde Main      = 42 

En Harbour esta produce: (esta es la salida correcta, en mi opini¢n ) 
Desde MakeBlock = 42
Desde Main      = 42 


2) Alcance de variables sin declarar
   ---------------------------------
Considere el siguiente c¢digo:

PROCEDURE MAIN()
LOCAL cb
  cb :=Detach()
  ? EVAL( cb, 10 )

RETURN

FUNCTION Detach()
LOCAL b:={|x| x+a}
LOCAL a:=0
RETURN b

En Clipper la variable 'a' en un codeblock tiene alcance *local* ,
sin embargo en Harbour la variable 'a' tiene un alcance *privado*. 
Como resultado de ello, en Clipper este c¢digo imprimir  10 y en 
Harbour este producir  "error de argumento" en la operaci¢n '+'.
Esto ser  cierto cuando la variable 'a' sea declarada como PRIVATE.

PROCEDURE MAIN()
LOCAL cb
PRIVATE a
  cb := Detach()
  ? EVAL( cb, 10 )
RETURN

El c¢digo de arriba tambi‚n produce 10 en Clipper (a£n si es 
compilado con el switch -a ¢ -v).
  





c:\harbour\doc\es\codestyl.txt
/*
 * $Id: codestyl.txt 6361 2004-05-28 05:17:36Z alex_degarate $
 */

/* Note los siguientes comentarios que podemos usar en cualquier lugar

   NOTE: Notas 
   TODO: Algo que deber¡a ser agregado aqu¡
   TOFIX: Algo que necesita ser corregido 
   OBSOLETE: Algo que podr¡a ser removido de aqu¡
   QUESTION: Yo tuve algunas dudas en este punto pero Yo podr¡a no tener
             una respuesta.
   OPT: Algo es comentado para mejorar la performance

   como un ejemplo: */


Est ndar de Codificaci¢n de Harbour
===================================
(basado mayormente en los est ndares de codificaci¢n de PHP)


Implementaci¢n de C¢digo
------------------------

[0] Documente su c¢digo en los archivos fuentes y en los archivos de texto
    que van a constituir el manual. [tm]

[1] Funciones que reciben punteros a recursos no deber¡an liberar a ‚stos.
  por ejemplo, la funci¢n  int mail( char *to, char *from) NO deber¡a
  liberar la memoria a la que apuntan los punteros "to" y "from".
  Excepciones:

  - Las funciones dise¤adas para liberar aquel recurso.
    por ejemplo, hb_xfree()

  - La funci¢n que recibe un argumento booleano, que controla cuando la 
    funci¢n puede liberar sus argumentos (si es cierto - la funci¢n 
    debe liberar sus argumentos, si es falso - no debe hacerlo).
    
[2] Funciones que est n estrechamente ligadas ¢ integradas con otras 
    funciones dentro del mismo m¢dulo, y conf¡an en ese comportamiento 
    poco trivial entre una y otra, deber¡an ser documentadas como tal y 
    declaradas 'static'. Ellas deber¡an ser evitadas de ser posible.

[3] Use definciones y macros cuando sea posible, as¡ estas constantes 
    tienen nombres significativos y pueden ser f cilmente manipulados.
    Use TRUE  en lugar de 1 (en un contexto booleano)
    Use FALSE en lugar de 0 (en un contexto booleano)
    Use NULL  en lugar de 0 (en un contexto de un puntero)
    Siempre use el prefijo 'HB_' para definiciones de nuevos tipos
    de datos y macros.
    Use ¢ bi‚n el prefijo 'PHB_' ¢ el sufijo '_PTR' para tipos de datos 
    que son punteros.
    
    por ejemplo:
    HB_ITEM
    PHB_ITEM
    HB_ITEM_PTR 

[4] Cuando escriba funciones que traten con cadenas, aseg£rese de recordar
    que Harbour mantiene la propiedad del tama¤o de cada cadena, y que 
    esta no deber¡a ser calculada con strlen().  Escriba sus funciones de 
    forma tal que estas tomen ventaja de la propiedad tama¤o ¢ longitud,
    tanto por eficiencia, como para que sean seguras en el tratamiento 
    de cadenas binarias.
    Funciones que cambien cadenas y obtengan sus nuevas longitudes mientras
    hacen esto, deber¡an devolver esa nueva longitud, as¡ no tienen que
    recalcularlas con strlen().

[5] NUNCA USE strncat().  Si Ud. est  absolutamente seguro de lo que est 
    haciendo, chequee este documento de nuevo, y reci‚n entonces considere
    usarlo, y a£n as¡ trate de evitarlo.

[6] Use assert(). No solamente buenos assert encuentran errores, sino 
    que tambi‚n ayuda con la legibilidad del c¢digo fuente. 
     - No use assert para el manejo de errores. Use assert solamente para
       la condici¢n que debe ser siempre cierta.
     - No use asignaciones en condiciones assert. Si Ud. asigna dentro
       de una condici¢n assert, Ud. se arriesga a un evasivo error que 
       podr¡a ser muy dif¡cil de encontrar en una contruccion de depuraci¢n
       debido al efecto lateral de la asignaci¢n.
       Llamadas a funciones en condiciones assert tambi‚n pueden causar 
       este problema, si ellos modifican uno de sus argumentos ¢ variables
       globales.

[7] Cuando desee inactivar c¢digo coment ndolo, utilice una sentencia #if 
    y NO utilice #if 0 solamente.  En su lugar use "_0"
    Por ejemplo #if FOO_0, donde FOO es su nombre de usuario del CVS.
    Esto permite un seguimiento m s f cil del por qu‚ el c¢digo fu‚ anulado 
    al ser comentado, especialmente en librer¡as empaquetadas.

[8] Use  hb_xgrab()/hb_xalloc(), hb_xfree(), hb_xrealloc(), hb_xsize() 
    para manejar la asignaci¢n de memoria. Estas funciones implementan  
    un mecanismo interno "safety-net" que asegura la des-asignaci¢n de 
    cualquier memoria no liberada al final de la aplicaci¢n.
    Ellas proveen tambi‚n valiosa informaci¢n sobre asignaci¢n y 
    desbordamiento, mientras se ejecutan en modo depuraci¢n (debug mode).


Convenci¢n para los Nombres
---------------------------

[1] Los nombres de funciones para nivel-de-usuario definidas en el c¢digo 
    fuente en C deber¡an ser encerradas dentro de la macro HB_FUNC().
    Ellas deber¡an estar en may£sculas.
    El nombre deber¡a ser prefijado con HB_' si esta funci¢n es una extensi¢n
    al conjunto de funciones definidas en Clipper.
    Las abreviaturas en el nombre no deber¡an ser usadas cuando ellas 
    disminuyan la legibilidad ¢ el significado de la funci¢n.

[2] Los nombres de variables deben ser significativos.  Los nombres de 
    variables de una letra deben ser evitados, excepto para lugares donde 
    la variable no tiene un real significado ¢ tiene un significado trivial 
    (por ej.   for (i=0; i<100; i++) ...).

[3] Los nombres de variables deber¡an usar la as¡ llamada notaci¢n H£ngara.
    Use letras en min£sculas y no use el gui¢n inferior '_' (underscore)
    para separar entre palabras.
    
    Bien:
    pMemoryPtr
    
    Mal:
    p_memory_ptr

[4] Variables est ticas deben ser prefijadas con 's_'

[5] Variables Globales (variables compartidas entre m¢dulos) deber¡an ser
    prefijadas con 'hb_' por ej. hb_vm_bDebug, hb_gc_pStart
   

Sintaxis e Indentaci¢n
----------------------

[1] Nunca use comentarios estilo C++ (por ej. // comentario).  
    Siempre use comentarios estilo C en su lugar.
    Harbour est  escrito en C, y el prop¢sito es compilarlo bajo cualquier
    compilador ANSI-C compatible.  Aunque piense que muchos compiladores 
    aceptan comentarios estilo C++ el c¢digo C, Ud. tiene que asegurarse
    que su c¢digo pueda compilarse en otros compiladores tambi‚n.

[2] No use el estilo K&R (Kerningham y Ritchie). por supuesto nosotros no
    podemos y no queremos forzar a nadie a usar un estilo que el/ella no 
    use, pero al final, cuando su c¢digo vaya dentro de la parte principal
    de Harbour ¢ de uno de sus m¢dulos est ndares, por favor no use el 
    estilo K&R.  Esto se aplica a todo, comenzando con los estilos de  
    indentaci¢n y comentarios hasta la sintaxis de la declaraci¢n de la 
    funci¢n.

    Vea tambi‚n
    http://www.tuxedo.org/~esr/jargon/html/entry/indent-style.html
    
[3] Sea generoso con los espacios en blanco y las llaves. 
    Siempre es preferible:

    if( cualquier_cosa )
    {
       bar;
    }

    a esto:

    if(cualquier_cosa)bar;
    
    y a esto:
    
    if( cualquier_cosa )
       bar;

    Mantenga una l¡nea vac¡a entre la secci¢n de declaraci¢n de variables y
    las sentencias de un block, as¡ como tambi‚n entre grupos de sentencias 
    de un block.

[4] Cuando indente, use tres espacios (NO use tabs). Es importante mantener
    consistencia en la indentaci¢n as¡ las definiciones, comentarios y
    estructuras de control permanecen correctamente alineados.


Documentaci¢n
-------------

[1] Siempre que le sea posible documente Ud. mismo las funciones que
    desarrolle. 
    Generalmente es dif¡cil entender el c¢digo escrito por otra persona,
    m s a£n cuando involucra algoritmos fuera de lo c¢mun, atributos
    y variables del sistema ¢ datos que el documentador no dispone.
    Esto es particularmente evidente en funciones de bajo nivel.

[2] Transcurrido un cierto tiempo, se dificulta la tarea de Documentaci¢n
    debido a que es necesario leer y releer el c¢digo varias veces (aunque 
    la tarea la haga el propio desarrollador). Esto es evidente cuando no
    se utilizan variables con un nombre adecuado para la tarea que realizan
    (s¢lo se utilizan letras).
    Por eso se pide encarecidamente que NO se dejen funciones ¢ 
    procedimientos sin documentar.

[3] Si la funci¢n ¢ procedimiento que se est  tratando de documentar, hace 
    a su vez llamados a funciones no documentadas del sistema y el 
    desarrollador original no est  disponible, podr¡a ser muy dif¡cil ¢ tal
    vez imposible de documentar.

[4] Rastrear cuales funciones est n documentadas y cuales no y si est n 
    total ¢ parcialmente documentadas es un malgasto de recursos adicional
    en tiempo y en gente.

[5] Si Ud. es el desarrollador de la funci¢n, No se preocupe por la 
    narrativa. Es m s importante saber qu‚ hace la funci¢n qu‚ argumentos
    recibe, para qu‚ sirven y especialmente qu‚ dato/s se devuelven.

[6] Si Ud. es el desarrollador de la funci¢n, y utiliza variables ¢ 
    funciones no documentadas del sistema, por favor expliquelas tanto como 
    sea posible.
    Si utiliza alg£n algoritmo raro, explique brevemente qu‚ hace y como
    funciona.

[7] Las aclaraciones ¢ explicaciones que ponga en el cuerpo de la funci¢n
    enci‚rrelas entre el par /* */ por favor no utilice la doble barra //
    para comentarios porque disminuye su portabilidad.

[8] Recuerde... el proceso de documentaci¢n consume mucho tiempo, usualmente
    lleva m s tiempo escribir la documentaci¢n de una funci¢n que la funci¢n
    propiamente dicha.


c:\harbour\doc\es\command.txt
/*
 * $Id: command.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de los comandos OOP
 *
 * Copyright 2000 Brian Hays 
 * Documentaci¢n en Ingl‚s de los comandos OOP
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


/*  $DOC$
 *  $COMMANDNAME$
 *      CLASS
 *  $CATEGORY$
 *      Comando OOP
 *  $ONELINER$
 *      Define una Clase para la Programacion Orientada a Objetos (OOP).
 *  $SYNTAX$
 *      CLASS  [   ]
 *  $ARGUMENTS$
 *       Nombre de la clase a definir. Por tradici¢n, las
 *                    clases en Harbour comienzan con "T" (algo com£n en el
 *                    mundo OOP) para evitar colisiones con clases creadas
 *                    por el usuario.
 *        La clase padre para usar la herencia.
 *  $DESCRIPTION$
 *      CLASS crea una clase desde la cual se pueden crear objetos.
 *      Cada clase es definida en un archivo.prg separado para este prop¢sito
 *      No se puede crear m s de una clase en un archivo.prg
 *      Despu‚s del mandato CLASS comienza la definici¢n, luego los elementos
 *      DATA (tambien conocidos como variables de instancia) y luego
 *      los METHODS de la clase (el equivalente a las funciones en la
 *      Programacion tradicional)
 *
 *      Las Clases pueden heredar desde una clase sola , pero la
 *      cadena de herencia puede extenderse a muchos niveles
 *
 *      Un program usa una clase llamando al Constructor de la clase, el
 *      m‚todo New() para crear el objeto. Ese objeto es usualmente asignado
 *      a una variable, la cual es usada para acceder a los elementos DATA
 *      y a los m‚todos
 *  $EXAMPLES$
 *      
 *      CLASS TBColumn
 *
 *         DATA Block      // Codeblock para recuperar datos para la Columna
 *         DATA Cargo      // Variable definida por el usuario
 *         DATA ColorBlock // Codeblock que determina el color de los items
 *         DATA ColSep     // Caracter separador de la Columna
 *         DATA DefColor   // Array de ¡ndices num‚ricos a la tabla de color
 *         DATA Footing    // Pie de Columna
 *         DATA FootSep    // Caracter separador del Pie
 *         DATA Heading    // Encabezado de la Columna
 *         DATA HeadSep    // Caracter separador de la cabecera
 *         DATA Width      // Ancho de la Columna
 *         DATA ColPos     // Posici¢n temporaria de la columna en pantalla
 *
 *         METHOD New()    // Constructor
 *
 *      ENDCLASS
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      CLASS es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      HBClass(),Programacion Orientada a Objeto,DATA,METHOD
 *  $END$
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      DATA
 *  $CATEGORY$
 *      Comando OOP
 *  $ONELINER$
 *      Define una variable de instance DATA, para los objetos de la clase
 *  $SYNTAX$
 *      DATA  [,] [ AS  ] [ INIT  ]
 *  $ARGUMENTS$
 *       Nombre de DATA
 *
 *              Especificaci¢n Opcional del tipo de datos, de uno de
 *                    los siguientes (especificaci¢n en ingl‚s):
 *                    Character, Numeric, Date, Logical, Codeblock, Nil
 *
 *            Valor opcional inicial cuando se crea un nuevo objeto
 *  $DESCRIPTION$
 *      Los elementos DATA tambien pueden ser pensados como "propiedades"
 *       ¢ "atributos" de un objeto. ellos pueden ser de cualquier tipo
 *      incluyendo bloques de codigo.
 *      Una vez que el objeto ha sido creado, los elementos DATA son refe-
 *      renciados con dos puntos (:) como en MyObject:Heading := "Nombre".
 *      Usualmente una clase tambi‚n define m‚todos para manipular los DATA.
 *
 *      Se puede usar la clausula "AS " para reforzar que DATA es
 *      perteneciente a un cierto tipo. De otra manera este tomar  el tipo
 *      de cualquier valor que le sea asignado.
 *
 *      Use la clausula "INIT " para inicializar ese DATA a 
 *      siempre que un nuevo objeto es creado.
 *  $EXAMPLES$
 *      
 *      CLASS TBColumn
 *
 *         DATA Block      // Codeblock para recuperar datos para la Columna
 *         DATA Cargo      // Variable definida por el usuario
 *         DATA ColorBlock // Codeblock que determina el color de los items
 *         DATA ColSep     // Caracter separador de la Columna
 *         DATA DefColor   // Array de ¡ndices num‚ricos a la tabla de color
 *         DATA Footing    // Pie de Columna
 *         DATA FootSep    // Caracter separador del Pie
 *         DATA Heading    // Encabezado de la Columna
 *         DATA HeadSep    // Caracter separador de la cabecera
 *         DATA Width      // Ancho de la Columna
 *         DATA ColPos     // Posici¢n temporaria de la columna en pantalla
 *
 *         METHOD New()    // Constructor
 *
 *      ENDCLASS
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      DATA es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      Programacion Orientada a Objeto,CLASS,METHOD,CLASSDATA
 *  $END$
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      CLASSDATA
 *  $CATEGORY$
 *      Comando OOP
 *  $ONELINER$
 *      Define una variable CLASSDATA para una clase (NO para un Objeto !)
 *  $SYNTAX$
 *      CLASSDATA  [,] [ AS  ] [ INIT  ]
 *  $ARGUMENTS$
 *       Nombre de DATA
 *
 *              Especificaci¢n opcional del tipo de datos de uno de
 *                    los siguientes (Original en ingl‚s):
 *                    Character, Numeric, Date, Logical, Codeblock, Nil
 *
 *            Valor opcional inicial cuando se inicia el programa
 *  $DESCRIPTION$
 *      Las variables CLASSDATA pueden se pensadas como "propiedades" de un
 *      clase entera. Cada CLASSDATA existe s¢lo una vez, no importa cu ntos
 *      objetos sean creados. Un uso comun es para un contador que es
 *      incrementado siempre que un objeto es creado y decrementado cuando
 *      alguno es destruido, as¡ se puede monitorear el n£mero de objetos
 *      en existencia para esta clase.
 *
 *      Se puede usar la clausula "AS " para reforzar que CLASSDATA es
 *      perteneciente a un cierto tipo. De otra manera este tomar  el tipo
 *      de cualquier valor que le sea asignado.
 *      Use la clausula "INIT " para inicializar ese DATA a 
 *      siempre que un nuevo objeto es creado.
 *  $EXAMPLES$
 *      
 *      CLASS TWindow
 *         DATA   hWnd, nOldProc
 *         CLASSDATA lRegistered AS LOGICAL
 *      ENDCLASS
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      CLASSDATA es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      Programacion Orientada a Objeto,CLASS,METHOD,DATA
 *  $END$
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      METHOD
 *  $CATEGORY$
 *      Comando OOP
 *  $ONELINER$
 *      Declara un METHOD para una clase en la cabecera de la clase
 *  $SYNTAX$
 *      METHOD ( []) [ CONSTRUCTOR ]
 *      METHOD ( []) INLINE 
 *      METHOD ( []) BLOCK  
 *      METHOD ( []) EXTERN ([])
 *      METHOD ( []) SETGET
 *      METHOD ( []) VIRTUAL
 *      METHOD ( [] )     OPERATOR 
 *      METHOD ( []) CLASS 
 *  $ARGUMENTS$
 *        Nombre del m‚todo a definir
 *
 *          Lista opcional de parametros
 *  $DESCRIPTION$
 *      Los M‚todos son "funciones de clase" y hacen el trabajo de la clase.
 *      Todos los m‚todos pueden ser definidos en la cabecera entre los
 *      comandos CLASS y ENDCLASS. Si el cuerpo de un m‚todo no esta
 *      totalmente definido aqui, el cuerpo completo es escrito debajo del
 *      comando ENDCLASS usando esta sintaxis:
 *
 *         METHOD ( [] ) CLASS 
 *
 *      Los M‚todos pueden referenciar al objeto actual usando la palabra
 *      clave "Self:" ¢ su versi¢n m s corta "::"
 *
 *      CLAUSULAS:
 *
 *      CONSTRUCTOR  Define un m‚todo especial de la clase: el m‚todo
 *                   Constructor, usado para crear objetos. Este es
 *                   usualmente el m‚todo New().
 *                   Los constructores siempre retornan el objeto New().
 *
 *      INLINE       R pido y f cil de codificar, INLINE le permite definir
 *                   el c¢digo para el m‚todo inmediatamente despu‚s de la
 *                   definici¢n de la clase. Cualquier m‚todo no declarado
 *                   INLINE ¢ BLOCK debe ser completamente definido despu‚s
 *                   del comando ENDCLASS.
 *                   El  siguiente a INLINE recibe un parametro
 *                   de Self. Si se necesita recibir m s par metros, use
 *                   la cl usula BLOCK en su lugar.
 *
 *      BLOCK        Use esta cl usula cuando desee declarar r pidos m‚todos
 *                   'inline' que necesiten par metros. El primer par metro
 *                    a  debe ser Self, como en:
 *
 *          METHOD  BLOCK {|Self,,,...,|...}
 *
 *      EXTERN       Si una funci¢n externa hace lo que el m‚todo necesita,
 *                   use esta cl usula para hacer una llamada optimizada a
 *                   esa funci¢n directamente.
 *
 *      SETGET       Para datos calculados. El nombre del m‚todo puede ser
 *                   manipulado como un elemento de DATA para establecer
 *                   (Set) u obtener (Get) un valor.
 *
 *      VIRTUAL      M‚todos que no hacen nada. Utiles para Clases de Base
 *                   donde la Clase hija definir  el comportamiento del
 *                   m‚todo, ¢ cuando Ud. esta creando y probando una Clase.
 *
 *      OPERATOR     Operador de Sobrecarga para las Clases.
 *                   Vea el ejemplo ../Tests/TestOp.prg para detalles
 *
 *      CLASS 
 *                   Use esta sintaxis solamente para definir un m‚todo
 *                   completo despu‚s del comando ENDCLASS.
 *  $EXAMPLES$
 *      
 *      CLASS TWindow
 *         DATA   hWnd, nOldProc
 *         METHOD New( ) CONSTRUCTOR
 *         METHOD Capture() INLINE  SetCapture( ::hWnd )
 *         METHOD End() BLOCK  { | Self, lEnd | If( lEnd := ::lValid(),;
 *                                 ::PostMsg( WM_CLOSE ),), lEnd }
 *         METHOD EraseBkGnd( hDC )
 *         METHOD cTitle( cNewTitle ) SETGET
 *         METHOD Close() VIRTUAL
 *      ENDCLASS
 *
 *      METHOD New( ) CLASS TWindow
 *         local nVar, cStr
 *         ...  ...
 *         ...  ...
 *      RETURN Self
 *      
 *  $TESTS$
 *      
 *      TestOp.prg
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      METHOD es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      HBClass(),Programacion Orientada a Objeto,DATA,CLASS
 *  $END$
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      MESSAGE
 *  $CATEGORY$
 *      Comando OOP
 *  $ONELINER$
 *      Reenv¡a la llamada de un m‚todo a otro m‚todo.
 *  $SYNTAX$
 *      MESSAGE    METHOD ( [] )
 *      MESSAGE () METHOD ( [] )
 *  $ARGUMENTS$
 *        El nombre del pseudo-m‚todo a definir.
 *
 *         El m‚todo a crear y llamar cuando 
 *                       es invocado.
 *           Lista de par metros opcionales para el m‚todo
 *  $DESCRIPTION$
 *      El comando MESSAGE es una caracter¡stica rara vez usada, que permite
 *      re-enviar una llamada a un m‚todo con un nombre diferente. Esto puede
 *      ser necesario si el nombre de un m‚todo entra en conflicto con una
 *      funci¢n p£blica que necesita ser llamada desde adentro de un m‚todo
 *      de la Clase.
 *
 *      Por ejemplo, se puede tener una funci¢n p£blica llamda BeginPaint()
 *      que es usada para pintar las ventanas. Podr¡a ser natural tambi‚n
 *      tener un m‚todo de la Clase Ventana, llamado :BeginPaint() que la
 *      aplicaci¢n pueda llamar.
 *      Pero dentro del m‚todo de la Clase uno podr¡a no estar habilitado
 *      para llamar a la funci¢n p£blica porque, los m‚todos internos est n
 *      basados en funciones est ticas (las que ocultan funciones p£blicas
 *      con el mismo nombre)
 *
 *      El comando MESSAGE permite crear el verdadero m‚todo con un nombre
 *      diferente (::xBeginPaint()) y a£n permitir la sintaxis ::BeginPaint()
 *      para llamar a ::xBeginPaint(). Este entonces es libre de llamar a
 *      la funci¢n publica BeginPaint().
 *  $EXAMPLES$
 *      
 *      CLASS TWindow
 *         DATA   hWnd, nOldProc
 *         METHOD New( )  CONSTRUCTOR
 *         MESSAGE BeginPaint METHOD xBeginPaint()
 *      ENDCLASS
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      MESSAGE es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      METHOD,DATA,CLASS,Programacion Orientada a Objeto
 *  $END$
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      ERROR HANDLER
 *  $CATEGORY$
 *      Comando OOP
 *  $ONELINER$
 *      Designa un m‚todo como manejador de error para la Clase.
 *  $SYNTAX$
 *      ERROR HANDLER ( [] )
 *  $ARGUMENTS$
 *        Nombre del m‚todo a definir
 *
 *          Lista de parametros opcionales
 *  $DESCRIPTION$
 *      ERROR HANDLER nombra al m‚todo que deberia manejar los errores para
 *      la Clase que esta siendo definida.
 *  $EXAMPLES$
 *      
 *      CLASS TWindow
 *         ERROR HANDLER  MyErrHandler()
 *      ENDCLASS
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      ERROR HANDLER es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      Programacion Orientada a Objeto,ON ERROR,CLASS,METHOD,DATA
 *  $END$
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      ON ERROR
 *  $CATEGORY$
 *      Comando OOP
 *  $ONELINER$
 *      Designa un m‚todo como manejador de error para la Clase.
 *  $SYNTAX$
 *      ON ERROR ( [] )
 *  $ARGUMENTS$
 *        Nombre del m‚todo a definir
 *
 *          Lista de parametros opcionales
 *  $DESCRIPTION$
 *      ON ERROR es un sin¢nimo para ERROR HANDLER.
 *      Este nombra al m‚todo que deber¡a manejar los errores para la
 *      Clase que esta siendo definida.
 *  $EXAMPLES$
 *      
 *      CLASS TWindow
 *         ON ERROR  MyErrHandler()
 *      ENDCLASS
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      ON ERROR es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      Programacion Orientada a Objeto,ERROR HANDLER,CLASS,METHOD,DATA
 *  $END$
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      ENDCLASS
 *  $CATEGORY$
 *      Comando OOP
 *  $ONELINER$
 *      Termina la declaraci¢n de una Clase.
 *  $SYNTAX$
 *      ENDCLASS
 *  $DESCRIPTION$
 *      ENDCLASS marca el fin de la declaraci¢n de una Clase.
 *      Este es usualmente seguido por el m‚todo de la Clase que no es
 *      INLINE.
 *  $EXAMPLES$
 *      
 *      CLASS TWindow
 *         DATA   hWnd, nOldProc
 *      ENDCLASS
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      ON ERROR es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      Programacion Orientada a Objeto,CLASS,METHOD,DATA
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Programacion Orientada a Objeto
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Programacion Orientada a Objeto
 *  $DESCRIPTION$
 *      Programaci¢n Orientada a Objeto (OOP)
 *
 *      INTRODUCCION
 *
 *      Esta es una breve introduci¢n al mundo OOP, no pretende ser m s que
 *      un ayuda memoria de algunos puntos.
 *      El Objetivo de la OOP de Harbour es alcanzar la m xima compatibilidad
 *      posible con otros programas que prove¡an de funcionalidad OOP a
 *      Clipper donde este no la tenia.
 *      Algunos de ellos son Class(y), FiveWin Objects, TopClass y Visual
 *      Object.
 *
 *
 *      OBJETOS
 *
 *      Tradicionalmente la implementaci¢n de objetos, ha sido basado en
 *      lo que se conoce como "estructuras", un tipo de datos habitual en
 *      lenguaje "C" (struct) y (record) en Pascal y Delphi.
 *      Tanto en Clipper como en Harbour los objetos se implementan sobre
 *      arrays.
 *      Un objeto puede contener a la vez variables y funciones.
 *      Mientras ese objeto-array se conserve se puede pasar como par metro
 *      modificarlo, ejecutar las funciones contenidas en ‚l, etc.
 *      Uno vive rodeado de objetos. Podemos considerar Arbol como una clase
 *      particular de objeto. Entonces podremos tener Pino, Roble, Acacia
 *      todos ellos son instancias de Arbol. En otras palabras ellos son
 *      objetos de la clase Arbol.
 *
 *
 *      CLASE
 *
 *      Es un t‚rmino que describe una especificaci¢n para un conjunto de
 *      objetos con propiedades comunes.
 *      Desde el punto de vista de la programaci¢n Ud. define que debe
 *      tener una clase para que le sea £til a Ud., qu‚ atributos satisfacen
 *      sus necesidades.
 *      Esto es llamado Abstracci¢n de datos en la jerga de OOP, ¢
 *      Programacion Orientada a Objetos porque Ud. solamente abstrae los
 *      atributos que Ud. desea usar, de un mont¢n de posibilidades para un
 *      objeto modelo.
 *
 *
 *      INSTANCIA
 *
 *      Una instancia de una clase es un t‚rmino t‚cnico para un objeto de
 *      esa clase.
 *
 *
 *      CLASES DE OBJETOS
 *
 *      Una definicion de una clase lista todos los parametros que se
 *      necesitan para definir un objeto de esa clase en particular.
 *      La cantidad de datos necesarios para definir una clase depende
 *      de que es lo que Ud. vaya a hacer con ese objeto, pero siempre
 *      habr  un m¡nimo que impida que una clase sea ambigua ¢ incompleta.
 *
 *      La clase Arbol por ejemplo podr¡a contener dos parametros en la
 *      definici¢n. El nombre del Arbol como cadena de caracteres, Si es
 *      perenne (si conserva las hojas en invierno) como una variable logica
 *      Los parametros que definen un objeto son denominados variables
 *      de instancia ¢ atributos de una clase.
 *      Las variables de instancia pueden ser tipos basicos de datos como
 *      CHARACTER, NUMERIC ¢ LOGIC, aunque tambien puede ser otros objetos
 *      como la Hoja y definida esta como de la Clase Hoja.
 *
 *
 *      OPERANDO CON OBJETOS
 *
 *      Una de las limitaciones basicas sobre que puede hacer con los
 *      objetos dependen del tipo de datos sobre los cuales estan basados
 *      as¡ por ejmplo Ud. no puede hacer operaciones matematicas con el
 *      atributo  de la clase Arbol, pero s¡ puede compararlo con
 *      otro, etc.
 *      Las unicas operaciones que se pueden hacer sobre una instancia de una
 *      clase particular son aquellas definidas dentro de la clase.
 *      Por lo tanto, la utilidad y flexibilidad de una clase depende de
 *      cuanto esfuerzo e ingenio haya puesto al establecer su definici¢n.
 *      Estas operaciones se llaman METODOS en la jerga OOP que no son
 *      ni m s ni menos que nuestros conocidos procedimientos y funciones.
 *
 *
 *      ENCAPSULAMIENTO
 *
 *      Se refiere al hecho de ocultar items de datos y metodos dentro de
 *      una clase al declararlos como Private en la definici¢n de la
 *      clase. Esto protege las partes internas de la clase de ser cambiadas
 *      ¢ usadas incorrectamente.
 *      Esta habilidad de ocultar la Implementaci¢n de la clase
 *      permitiendo un acceso limitado a los miembros de una clase, le da la
 *      posibilidad de cambiar las partes internas de esa clase cuando sea
 *      necesario. Mientras las caracteristicas de los metodos que pueden ser
 *      llamados desde afuera permanezcan sin cambios, la codificaci¢n
 *      interna puede ser cambiada como se desee.
 *
 *
 *      HERENCIA
 *
 *      Muchos de los objetos que se definen en una clase pueden ser
 *      subdivididos en conjuntos m s especializados que tambi‚n pueden ser
 *      representados por clases.
 *      En nuestro ejemplo de la clase Arbol, Conifera podr¡a ser una
 *      subclase de la clase Arbol, esta podr¡a tener todas las variables de
 *      instancia y m‚todos de la clase Arbol, m s algunas variables de
 *      instancia adicionales y metodos que la definan como Conifera.
 *      Podemos referirnos a la clase conifera como una Subclase de
 *      la clase Arbol y a la clase Arbol como una Superclase ¢
 *      Clase Padre de la clase Conifera.
 *
 *
 *      POLIMORFISMO
 *
 *      Es la habilidad de asumir diferentes formas ¢ contornos.
 *      Practicamente significa la habilidad de una £nica variable de llamar
 *      a diferentes m‚todos, dependiendo de lo que contiene la variable.
 *      El polimorfismo involucra dos cosas:
 *      1) Usar una variable de un tipo especifico, gralmente una variable
 *         de una clase base, para almacenar objetos de alguna de las clases
 *         derivadas.
 *      2) El uso automatico del objeto almacenado en la variable de la clase
 *         base para seleccionar un m‚todo de entre todos los m‚todos de las
 *         clases derivadas.
 *         El tipo del objeto almacenado no es conocido hasta que el
 *         programa se ejecuta, por tanto la elecci¢n de cual m‚todo de clase
 *         a ejecutar es hecha dinamicamente.
 *
 *
 *      ATRIBUTOS
 *
 *      Los atributos de un objeto, a menudo son llamados Miembros de
 *      Clase y se declaran utilizando la palabra clave DATA.
 *      Por ejemplo:
 *      DATA cFile  INIT "*.txt"
 *      En Harbour se utiliza la clausula INIT para inicializar las variables
 *
 *
 *      CONSTRUCTOR
 *
 *      Declarar una variable para soportar un objeto no crea al objeto en
 *      s¡ mismo, la variable solo mantiene una referencia al objeto.
 *      para crear un objeto se debe usar la palabra clave New.
 *      Este es seguido por una lista de argumentos opcionales entre
 *      parentesis y luego por el objeto de la clase a la que pertenecen.
 *
 *      Un constructor es la funci¢n que crea al objeto e inicializa las
 *      variables. Como las funciones en el lenguaje OOP se llaman
 *      m‚todos el constuctor siempre se declara como  METHOD New(..)
 *
 *      METHOD New( cFile ) CLASS TNortonGuide
 *
 *         IF VALTYPE( cFile ) <> NIL .AND. VALTYPE( cFile ) == "C"
 *            Self:cFile   := LOWER( cFile )
 *            Self:nHandle := FCREATE( Self:cFile )
 *         ENDIF
 *
 *      RETURN Self
 *
 *      Cuando se crea un objeto, el objeto contendr  todas las variables que
 *      fueron incluidas en la definici¢n de la clase. Sin embargo no todas
 *      las variables son iguales. Hay dos tipos:
 *      Un tipo de variable de clase que es asociada con cada objeto
 *      univocamente, cada instancia de la clase tendr  su propia copia de
 *      estas variables con su propio valor asignado. Estas diferencian un
 *      objeto de otro, d ndole a un objeto su individualidad por ello se
 *      llaman Variables de Instancia.
 *
 *      El otro tipo de variable de clase es asociada con la clase y es
 *      compartida con todos los objetos de la clase. Hay solo una copia
 *      de este tipo de variables, no importa cuantos objetos sean creados.
 *      Este £ltimo tipo se llama Variables de Clase, ellas existen
 *      a£n si ning£n objeto de esta clase ha sido creado. Ellas pertenecen
 *      a la clase, pero son incluidas como parte de cada objeto de la clase.
 *      Si el valor de una variable de clase es cambiado, el nuevo valor est 
 *      disponible en todos los objetos de la clase.
 *      Una variable de clase debe ser definida usando la palabra clave
 *      CLASSDATA (es equivalente a STATIC en el mundo OOP) precediendo a su
 *      nombre.
 *
 *      Al igual que con las variables existen dos tipos de M‚todos:
 *      Metodos de Clase Ud. puede ejecutar Metodos de Clase, a£n
 *      si ning£n objeto de esta clase ha sido creado. Al igual que con las
 *      variables de clase son precedidos del identificador STATIC en la
 *      mayoria de los lenguajes OOP.
 *
 *      Mientras que los Metodos de Instancia solamente pueden ser
 *      ejecutados en relaci¢n a un objeto particular, as¡ que si no existe
 *      el objeto, NO hay m‚todo de instancia a ser ejecutado.
 *
 *      Debe tenerse en cuenta que no se puede hacer referencia a ninguna
 *      variable de instancia dentro de una clase dentro un m‚todo Static
 *      Estto se debe a que su m‚todo Static puede ser ejecutado cuando
 *      todav¡a ning£n objeto de la clase a sido creado y por lo tanto NO
 *      existen variables de instancia.
 *
 *
 *      SELF
 *
 *      Habitualmente los m‚todos de una clase, devuelven una referencia al
 *      objeto sobre el cual act£an y esa referencia se denomina 
 *
 *
 *      DEFINIENDO UNA CLASE
 *
 *      Una clase se define con la palabra clave CLASS seguida de un nombre
 *      que identifica a la clase. Para indicar que termina una clase se
 *      utiliza la palabra clave ENDCLASS
 *      Por tradici¢n, las clases en Harbour comienzan con la letra "T"
 *      (algo com£n en el mundo OOP) para evitar colisiones con clases
 *      creadas por el usuario.
 *
 *      la por ej.
 *      METHOD ( [] ) CLASS 
 *
 *      Los M‚todos pueden referenciar al objeto actual usando la palabra
 *      clave "Self:" ¢ su versi¢n m s corta "::"
 *      Vea METHOD para una explicaci¢n de las distintas variantes.
 *
 *
 *      VIDA DE UN OBJETO
 *
 *      La vida de un objeto esta determinada por la variable que hace
 *      referencia a ‚l. Si distintas variables hacen referencia a un
 *      mismo objeto, el objeto sobrevive mientras todav¡a haya una variable
 *      que haga referencia a ese objeto.
 *      Si creamos un objeto
 *          oNgi := TNortonGuide():new( "Myfile" )
 *      y luego hacemos
 *          oNgi := NIL
 *      la variable oNgi no apunta m s al objeto, se pierde la referencia y
 *      si asumimos que no hay ninguna otra variable referenciandolo entonces
 *      el objeto TNortonGuide al cual ella apunta queda disponible para el
 *      el recolector de memoria.
 *      Pero el objeto no desaparece instant neamente, sino que pasa alg£n
 *      tiempo hasta que el objeto se vuelve inaccesible para su programa
 *      (cuando el subsistema de memoria dispone de tiempo de procesamiento),
 *      se ocupa de ‚l.
 *
 *
 *      SOBRECARGA
 *      Vea testop.prg por un ejemplo
 *
 *
 *      CLONANDO OBJETOS
 *      Algunos lenguajes OOP proveen una m‚todo preconstruido para duplicar
 *      objetos.
 *
 *      Comentario Final
 *
 *      Los programas Orientados a Objetos son escritos usando objetos los
 *      cuales modelan el problema que esta siendo resuelto.
 *      Debido a que un objeto incluye los m‚todos con los cuales puede
 *      operar, as¡ como los datos que lo definen, este tipo de programaci¢n
 *      es menos propensa a errores (seg£n los especialistas) y deber¡a ser
 *      m s robusta que la forma de programaci¢n procedural.
 *
 *      Estas caracter¡sticas son las que han facilitado la proliferaci¢n de
 *      lenguajes como Java y Python. Pero una de las desventajas m s notables
 *      es la dificultad muchas veces para intercambiar la informaci¢n
 *      almacenada en esos objetos con otros programas y la conservaci¢n de
 *      esos objetos en un medio magnetico (Serializaci¢n) en un
 *      formato compatible, algo que seg£n los expertos promete XML y que ya
 *      est  disponible con Harbour.
 *
 *  $EXAMPLES$
 *      CLASS Circle
 *
 *      CLASS TNortonGuide
 *
 *         DATA cFile                // Nombre archivo
 *         DATA nHandle              // file handle
 *         METHOD New( cFile )       // constructor, funcion que crea archivo
 *         METHOD CLOSE()            // funcion que cierra archivo
 *         METHOD WriteParBold( cPar )
 *         METHOD WriteTitle( cTopic, cTitle )
 *
 *      ENDCLASS
 *
 *      METHOD new( cFile ) CLASS TNortonGuide
 *
 *         IF VALTYPE( cFile ) <> NIL .AND. VALTYPE( cFile ) == "C"
 *            Self:cFile   := LOWER( cFile )
 *            Self:nHandle := FCREATE( Self:cFile )
 *         ENDIF
 *
 *      RETURN Self
 *
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      La sintaxis Orientada a Objetos en Harbour es compatible con
 *      CA-Cl*pper.
 *      Pero Clipper solamente permite la creaci¢n de objetos a partir
 *      de unas pocas clases estandares, y NO le permite al programador
 *      crear nuevas clases.
 *      En Harbour, Ud. puede crear sus propias clases completamente con
 *      M‚todos, Variables de Instancia, Variables de Clase y Herencia.
 *      Aplicaciones enteras pueden ser designadas y codificadas en el
 *      estilo Orientado a Objetos.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *  $SEEALSO$
 *      __objHasData(),CLASS,METHOD
 *  $END$
 */



c:\harbour\doc\es\compiler.txt
/*
 * $Id: compiler.txt 9198 2008-08-20 09:56:47Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:  Opciones del Compilador
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Opciones Compilador
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Opciones del Compilador
 *  $DESCRIPTION$
 *
 *      Invocando al compilador Harbour: 
 *      ===============================
 *
 *         harbour  [opciones]
 *      o
 *         harbour [opciones] 
 *      o
 *         harbour [opciones]  [opciones]
 *
 *
 *      Las opciones de la l¡nea de comandos debe ser separada, al menos por
 *      un espacio en blanco.
 *      Las opciones pueden comenzar con el car cter '/' ¢ '-',
 *
 *
 *      Opciones de la l¡nea de comandos de: 
 *      ====================================
 *
 *      /a               Declaraci¢n Autom tica de memvar
 *      ----------------
 *          Esto causa que todas las variables declaradas por las sentencias
 *          PARAMETER, PRIVATE ¢ PUBLIC sean autom ticamente declaradas como
 *          variables MEMVAR.
 *
 *      /b               Informaci¢n de depuraci¢n (Bug)
 *      ----------------
 *          El compilador genera toda la informaci¢n requerida para
 *          depuraci¢n
 *
 *      /d[=]   #define 
 *      ----------------
 *
 *      /es[]     Establece la Severidad de la salida (Exit Severity)
 *      ----------------
 *
 *          /es or /es0 - Todas las advertencias son ignoradas y el c¢digo
 *                        de salida retornado por el compilador (accedido por
 *                        el comando de DOS ERRORLEVEL) es igual a cero si
 *                        no hay errores en el archivo fuente compilado.
 *          /es1        - Cualquier advertencia genera un c¢digo de salida
 *                        distinto de cero, pero la salida es aún creada.
 *          /es2        - Cualquier advertencia es tratada como error y
 *                        ningún archivo de salida es creado. El c¢digo de
 *                        salida es establecido a un valor distinto de cero.
 *
 *      /g         Generaci¢n del tipo de archivo de salida 
 *      ----------------
 *
 *          /gc          tipo de salida: fuente de lenguaje C (.c) (defecto)
 *          /gf          tipo de salida: Windows/DOS OBJ32 (.obj)
 *          /gh          tipo de salida: Objeto Portable de Harbour (.hrb)
 *          /gj          tipo de salida: fuente de Java (.java)
 *          /gp          tipo de salida: fuente de Pascal (.pas)
 *          /gr          tipo de salida: recursos de Windows (.rc)
 *
 *      /i         Agrega la ruta de búsqueda de archivos #include
 *      ----------------
 *
 *      /l               Suprime la informaci¢n del número de L¡nea
 *      ----------------
 *          El compilador no genera el número de l¡nea del c¢digo fuente
 *          en el archivo de salida. La funci¢n PROCLINE() retornar  cero
 *          para los m¢dulos compilados usando esta opci¢n.
 *
 *      /m               Compilar el M¢dulo actual solamente
 *      ----------------
 *
 *      /n               Sin procedimiento de inicio impl¡cito
 *      ----------------
 *          El compilador no crea un procedimiento con el mismo nombre
 *          que el del archivo compilado.  Esto significa que algunas
 *          declaraciones puestas antes de la primera sentencia de
 *          PROCEDURE ¢ FUNCTION tienen el alcance del archivo y pueden ser
 *          accedidas/usadas en todas las funciones/procedimientos definidos
 *          en el archivo fuente compilado. Todas las sentencias ejecutables
 *          puestas al principio del archivo y antes de la primera sentencia
 *          de PROCEDURE ¢ FUNCTION son ignoradas.
 *
 *      /o         Unidad de disco y/o ruta para el archivo de salida
 *      ----------------
 *
 *      /p               Genera un archivo de salida Pre-procesada (.ppo)
 *      ----------------
 *          El compilador solamente crea el archivo que contiene el
 *          resultado del archivo fuente pre-procesado.
 *
 *      /q               Quieto
 *      ----------------
 *          El compilador no imprime ningún mensaje durante la compilaci¢n
 *          (excepto la informaci¢n del copyright).
 *
 *          /q0          que permanezca realmente Quieto y no muestre ni
 *                       siquiera la informaci¢n del copyright.
 *
 *      /r[]   Solicita al linker Revisar por la  (¢
 *      ---------------- ninguna)
 *          Actualmente no soportado en Harbour.
 *
 *      /s               Solo chequeo de Sintaxis.
 *      ----------------
 *          El compilador chequea la sintaxis solamente. Ningún archivo de
 *          salida es generado.
 *
 *      /t         Ruta para la creaci¢n de un archivo Temporario
 *      ----------------
 *          Actualmente no usado en harbour (El compilador de harbour no
 *          crea ningún archivo temporal)
 *
 *      /u[]    Usar la definici¢n de comando establecido en el
 *                        (¢ ninguno)
 *      ----------------
 *          Aún no soportado.
 *
 *      /v               Las Variables son asumidas como M->
 *      ----------------
 *          Todas las variables sin declarar ¢ unaliased son asumidas como
 *          variables MEMVAR (variables privadas ¢ públicas). si este switch
 *          no es usado entones el alcance de estas variables es chequeado
 *          en tiempo de ejecuci¢n.
 *
 *      /w[]      Establece el número de nivel de las advertencias
 *      ---------------- (Warnings) (0..4, por defecto es 1)
 *
 *         /w0         - sin advertencias
 *         /w or /w1   - advertencias compatibles con Clipper
 *         /w2         - algunas advertencias útiles ausentes en Clipper
 *         /w3         - advertencias generadas para extensiones al lenguaje
 *                       hechas en Harbour. Tambi‚n habilita el chequeo de
 *                       sintaxis fuertemente tipeada pero s¢lo advierte
 *                       contra los tipos declarados, o los tipos que pueden
 *                       ser calculados en tiempo de compilaci¢n.
 *         /w4         - habilita advertencias acerca de operaciones que son
 *                       sospechosas, lo cual significa que si se mezclan
 *                       tipos sin declarar ¢ tipos que no pueden ser
 *                       calculados en tiempo de compilaci¢n, junto con los
 *                       tipos ya declarados, una advertencia ser  generada.
 *
 *      /x[]    Establece el s¡mbolo del prefijo agregado al nombre
 *                       de funci¢n (para archivo.c solamente)
 *      ----------------
 *          Establece el s¡mbolo del prefijo agregado al nombre de funci¢n
 *          de inicio (en la salida de lenguaje C, actualmente).
 *          Esta funci¢n es generada autom ticamente para cada m¢dulo de PRG
 *          compilado.
 *          Este prefijo adicional puede ser usado para suprimir problemas
 *          con s¡mbolos duplicados durante el enlazado de una aplicaci¢n
 *          (linking) con alguna librer¡a de terceros.
 *
 *      /y               Seguimiento de la actividad de Lex & Yacc
 *      ----------------
 *          El compilador Harbour usa las utilidades FLEX y YACC para
 *          analizar el c¢digo fuente y generar el archivo de salida
 *          requerido.
 *          Esta opci¢n sigue la actividad de esas utilidades.
 *
 *      /z               Suprime el cortocircuito l¢gico (.AND. y .OR.)
 *      ----------------
 *
 *      /10              restringe la longitud de s¡mbolos a 10 caracteres.
 *      ----------------
 *          Todos los nombres de variables y de funciones son truncados a
 *          un m ximo de 10 caracteres.
 *
 *
 *      Compilaci¢n en modo lote (batch). 
 *      ================================
 *
 *       @         Compila la lista de m¢dulos en el 
 *      -----------------
 *          No soportado aún.
 *
 *
 *
 *      Conocidas incompatibilidades entre compiladores harbour y clipper
 *      =================================================================
 *
 *      NOTA:
 *        Si desea librer¡as de compilaci¢n y ejecuci¢n 100 % compatibles,
 *      entonces Ud. debe definir: HARBOUR_STRICT_CLIPPER_COMPATIBILITY.
 *      Esta opci¢n debe ser definida en el archvivo ../include/hbsetup.h
 *      (en efecto esta opci¢n es puesta en un comentario por defecto - Ud.
 *      necesita remover los caracteres /* */ solamente. Este cambio debe
 *      ser realizado antes de invocar la utilidad make.
 *
 *
 *      Manejo de variables sin declarar
 *      --------------------------------
 *      Cuando un valor es asignado a una variable no declarada y la opci¢n
 *      -v  de la l¡nea de comandos no es usada, entonces el compilador
 *      Clipper asume que la variable es una variable PRIVATE ¢ PUBLIC y
 *      genera un opcode POPM (pop memvar).
 *
 *      Cuando el valor de una variable no declarada es accedido y la opci¢n
 *      -v de la l¡nea de comandos no es usada, el compilador Harbour genera
 *      un opcode  PUSHV (push variable) para determinar el tipo de variable
 *      en tiempo de ejecuci¢n

 *      Si un campo con el nombre requerido existe en el area de trabajo
 *      actual, entonces este valor es usado. Si no existe el campo, entonces
 *      una variable PRIVATE ¢ PUBLIC es usada (si existe).
 *
 *        El compilador Harbour genera un opcode para determinar el tipo de
 *      variable en tiempo de ejecuci¢n (POPVARIABLE or PUSHVARIABLE) en
 *      ambos casos (asignaci¢n y acceso).
 *
 *      La diferencia puede ser chequeada por el siguiente c¢digo:
 *      
 *      PROCEDURE MAIN()
 *      PRIVATE myname
 *
 *        DBCREATE( "TEST", { { "MYNAME", "C", 10, 0} } )
 *        USE test NEW
 *        SELECT test
 *        APPEND BLANK
 *
 *        FIELD->myname  := "FIELD"
 *        MEMVAR->myname := "MEMVAR"
 *
 *        myname := myname + " assigned"
 *
 *        // In Clipper: "FIELD",  In Harbour: "FIELD assigned"
 *        ? FIELD->myname
 *
 *        // In Clipper: "MEMVAR assigned", In Harbour: "MEMVAR"
 *        ? MEMVAR->myname
 *
 *        USE
 *
 *      RETURN
 *      
 *
 *
 *      Pasando por referencia una variable no declarada
 *      -------------------------------------------------
 *        El compilador Harbour usa un opcode especial PUSHP para pasar una
 *      referencia  a una variable no declarada ( el operador '@' ). El tipo
 *      de la variable pasada es chequeada en tiempo de ejecuci¢n (field or
 *      memvar). Sin embargo las variables de campo no pueden ser pasadas
 *      por referencia. Esto significa que Clipper chequea s¢lo la variable
 *      memvar y no mira por una de campo.
 *      Esta es la raz¢n por la cual el compilador Harbour usa el opcode
 *      habitual PUSHMEMVARREF en estos casos. N¢tese que el comportamiento
 *      en tiempo de ejecuci¢n es el mismo en Clipper y en Harbour - s¢lo
 *      los opcodes generados son diferentes.
 *
 *
 *      Manejo de mensajes a objetos
 *      ----------------------------
 *
 *        El seteo de HARBOUR_STRICT_CLIPPER_COMPATIBILITY determina
 *      la forma en que el env¡o encadenado de mensajes es manejado
 *
 *      Por ejemplo, el siguiente c¢digo:
 *
 *      a:b( COUNT() ):c += 1
 *
 *      ser  manejado como:
 *
 *      a:b( COUNT() ):c := a:b( COUNT() ):c + 1
 *      en modo de compatibilidad estricta y
 *
 *      temp := a:b( COUNT() ), temp:c += 1
 *      en modo no-estricto.
 *
 *        En la pr ctica, Clipper llamar  a la funci¢n COUNT() dos veces:
 *      La primera vez antes de la adici¢n y la segunda despu‚s de la
 *      adici¢n.
 *      En Harbour, COUNT() ser  llamada s¢lo una vez, antes de la adici¢n.
 *
 *        El m‚todo Harbour (no-estricto) es:
 *      1) M s r pido
 *      2) Garantiza que la misma variable de instancia del mismo
 *         objeto ser  cambiada.
 *
 *      (Ver tambi‚n: ../source/compiler/expropt.c)
 *
 *
 *      Inicializaci¢n de variables est ticas
 *      -------------------------------------
 *
 *      Hay una diferencia en la inicializaci¢n de las variables est ticas
 *      que son inicializadas con un bloque de c¢digo que refiere a una
 *      variable local. Por ejemplo:
 *      
 *      PROCEDURE TEST()
 *
 *      LOCAL MyLocalVar
 *      STATIC MyStaticVar := {|| MyLocalVar }
 *
 *        MyLocalVar :=0
 *        ? EVAL( MyStaticVar )
 *
 *      RETURN
 *      
 *      El c¢digo de arriba compila bien en Clipper, pero ‚ste genera un
 *      error de ejecuci¢n:
 *           Error/BASE 1132 Bound error: array access
 *      Called from (b)STATICS$(0)
 *
 *      En Harbour este c¢digo genera un error en tiempo de compilaci¢n:
 *      Error E0009 Illegal variable (b) initializer: 'MyLocalVar'
 *
 *      Ambos Clipper y Harbour estan manejando todas las variables locales
 *      usadas en una forma especial: ellas son separadas de la pila (stack)
 *      local de la funci¢n / procedimiento donde ellas son declaradas.
 *      Esto permite acceder a estas variables despues de la salida de una
 *      funci¢n / procedimiento. Sin embargo todas las variables est ticas
 *      son inicializadas en un procedimiento separado ('STATICS$' en
 *      Clipper y '(_INITSTATICS)' en Harbour) antes del procedimiento
 *      principal y antes de todos los procedimientos INIT. Las variables
 *      locales no existen en la pila de evaluaci¢n (eval stack) donde las
 *      variables est ticas son inicializadas, as¡ ellas no pueden ser
 *      separadas.
 *
 *  $END$
 */  


c:\harbour\doc\es\datetime.txt
/*
 * $Id: datetime.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *      CDOW(),CMONTH(),DATE(),CTOD(),DAY(),DAYS(), DOW(),DTOS(),
 *      DTOC(),ELAPTIME(),MONTH(),SECONDS(),SECS(),TIME(),YEAR()
 *
 * Copyright 2000 Luiz Rafael Culik 
 * Documentation en Ingl‚s de:
 *      CDOW(),CMONTH(),DATE(),CTOD(),DAY(),DAYS(), DOW(),DTOS(),
 *      DTOC(),ELAPTIME(),MONTH(),SECONDS(),SECS(),TIME(),YEAR()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


/*  $DOC$
 *  $FUNCNAME$
 *      CDOW()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Convierte una fecha al Nombre del d¡a de la semana
 *  $SYNTAX$
 *      CDOW()  --> cDia
 *  $ARGUMENTS$
 *        Cualquier expresi¢n de fecha.
 *  $RETURNS$
 *        El d¡a actual de la semana.
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve una cadena de caracteres con el d¡a de la
 *      semana de una expresi¢n de fecha  pasada (DOW=day of week en
 *      ingl‚s). Si una fecha NULL es pasada a la funci¢n, el valor de la
 *      funci¢n ser un byte NULL.
 *  $EXAMPLES$
 *      ? CDOW(DATE())
 *
 *      IF CDOW( DATE() + 10) == "SUNDAY"
 *         ? "Este es un d¡a para el descanso."
 *      ENDIF
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      DAY(),DOW(),DATE(),CMONTH()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      CMONTH()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Retorna una cadena de caracteres con el nombre del mes
 *  $SYNTAX$
 *      CMONTH()  --> cMes
 *  $ARGUMENTS$
 *        Cualquier expresi¢n de fecha.
 *  $RETURNS$
 *        el nombre actual del mes
 *  $DESCRIPTION$
 *      Esta funci¢n retorna el nombre del mes (Enero, Febrero, etc.) de una
 *      expresi¢n de fecha  pasada a ella.
 *      Si una fecha NULL es pasada a la funci¢n, el valor de la funci¢n ser 
 *      un byte NULL.
 *      Nota: El valor devuelto depende del m¢dulo de lenguaje en uso.
 *  $EXAMPLES$
 *      ? CMONTH( DATE())          // resultado: Noviembre
 *
 *      IF CMONTH( DATE() + 35) =="Diciembre"
 *         ? "Ha hecho compras para las fiestas ?"
 *      ENDIF
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      CDOW(),DATE(),MONTH(),YEAR(),DOW(),DTOC()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      DATE()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Retorna la fecha actual del sistema operativo
 *  $SYNTAX$
 *      DATE() --> dFechaActual
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      , la fecha actual del sistema.
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve la fecha actual del sistema.
 *  $EXAMPLES$
 *      ? DATE()
 *  $TESTS$
 *      ? "Hoy es ",DAY( DATE())," de ",CMONTH( DATE())," de ",YEAR( DATE())
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      CTOD(),DTOS(),DTOC(),DAY(),MONTH(),CMONTH()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      CTOD()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Convierte una cadena de caracteres a una expresi¢n de fecha
 *  $SYNTAX$
 *      CTOD()  --> dFecha
 *  $ARGUMENTS$
 *       Un fecha en el formato 'mm/dd/yy'
 *  $RETURNS$
 *       Una expresi¢n de fecha.
 *  $DESCRIPTION$
 *      Esta funci¢n convierte una fecha que ha sido aportada como una
 *      expresi¢n de caracteres a una expresi¢n de fecha. La expresi¢n de
 *      caracteres sera en la forma MM/DD/YY" (basada en el valor por defecto
 *      en SET DATE) o en el formato apropiado especificado por el comado
 *      SET DATE TO. Si una impropia cadena de caracteres es pasada a la
 *      funci¢n, un valor de fecha vac¡a ser  retornado.
 *  $EXAMPLES$
 *      ? CTOD('12/21/00')
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      SET DATE,DATE(),DTOS()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      DAY()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Retorna el n£mero de d¡a del mes en el rango de 0 a 31
 *  $SYNTAX$
 *      DAY() --> nMes
 *  $ARGUMENTS$
 *       Cualquier expresi¢n v lida de fecha.
 *  $RETURNS$
 *     Retorna , el valor num‚rico del d¡a del mes.
 *  $DESCRIPTION$
 *      Esta funci¢n retorna el valor num‚rico del d¡a del mes de una fecha.
 *  $EXAMPLES$
 *      ? DAY( CTOD("06/06/1944") )     // Resultado: 6
 *      ? DAY( DATE() + 6325)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      CTOD(),DTOS(),DTOC(),DATE(),MONTH(),CMONTH()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      DAYS()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Convierte los segundos transcurridos a d¡as.
 *  $SYNTAX$
 *      DAYS( ) --> nDia
 *  $ARGUMENTS$
 *       el n£mero de segundos.
 *  $RETURNS$
 *      Retorna el n£mero de d¡as transcurridos
 *  $DESCRIPTION$
 *      Esta funci¢n convierte  al n£mero equivalente de d¡as;
 *      86399 segundos representan un d¡a, cero segundos es medianoche.
 *  $EXAMPLES$
 *      ? DAYS( 2434234)
 *      ? "Han transcurrido ", DAYS(63251)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *      Nota: No esta documentada en las NG, ni en el manual en espa¤ol de
 *            CA-Cl*pper
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      SECONDS(),SECS(),ELAPTIME()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      DOW()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Convierte una fecha al n£mero del dia de la semana (1-7)
 *  $SYNTAX$
 *      DOW() --> nDia
 *  $ARGUMENTS$
 *        Cualquier expresi¢n v lida de fecha.
 *  $RETURNS$
 *      DOW() retorna el dia de la semana en la forma num‚rica 
 *  $DESCRIPTION$
 *      Esta funci¢n convierte un valor de fecha en un n£mero representando
 *      el dia de la semana. En el rango de 1 al 7, siendo 1 el dia Domingo
 *      y 7 el dia S bado.
 *  $EXAMPLES$
 *      ? DOW( DATE())
 *      ? DOW( DATE() - 6584)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      DTOC(),CDOW(),DATE(),DTOS(),DAY()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      DTOC()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Convierte un valor de fecha a una cadena de caracteres
 *  $SYNTAX$
 *      DTOC()  --> cFecha
 *  $ARGUMENTS$
 *       Cualquier expresi¢n v lida de fecha.
 *  $RETURNS$
 *      Retorna la cadena de caracteres  representando la fecha
 *  $DESCRIPTION$
 *      Esta funci¢n convierte una expresi¢n de fecha (sea un campo ¢ una
 *      variable) expresada como  a una expresi¢n de caracteres en el
 *      formato por defecto "MM/DD/YY". El formato de fecha devuelto por esta
 *      funci¢n es controlado por el formato especificado por el comando
 *      SET DATE y es variable a diferencia del devuelto por la funci¢n
 *      DTOS().
 *  $EXAMPLES$
 *      ? DTOC( DATE())
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      SET DATE,DATE(),DTOS()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      DTOS()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Convierte un valor de fecha a una cadena en el formato AAAAMMDD
 *  $SYNTAX$
 *      DTOS()  --> cFecha
 *  $ARGUMENTS$
 *       Cualquier expresi¢n v lida de fecha.
 *  $RETURNS$
 *      DTOS() retorna 
 *  $DESCRIPTION$
 *      Esta funci¢n convierte un valor de fecha a una cadena de 8 caracteres
 *      en el formato AAAAMMDD (no contiene separadores). Si el valor de
 *       es una fecha vac¡a, esta funci¢n retorna una cadena de
 *      caracteres de 8 espacios en blanco.
 *  $EXAMPLES$
 *      ? DTOS( DATE())
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      DTOC(),DATE(),DTOS()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      ELAPTIME()
 *  $CATEGORY$
 *      Hora
 *  $ONELINER$
 *      Calcula el tiempo transcurrido.
 *  $SYNTAX$
 *      ELAPTIME(,) --> cTranscurrido
 *  $ARGUMENTS$
 *       Hora de inicio en el formato de cadena HH:MM:SS
 *         Hora de finalizaci¢n en el formato de cadena HH:MM:SS
 *  $RETURNS$
 *        Diferencia entre tiempos
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve una cadena que muestra la diferencia entre la
 *      hora inicial representada por  y la hora final
 *      representada por . Si la hora de inicio es mayor que la
 *      de finalizaci¢n, la funci¢n asume que la fecha a cambiado una vez.
 *  $EXAMPLES$
 *      // Muestra el tiempo que se uso el programa parecido a como lo
 *      // hac¡a el viejo Norton Utilities
 *      STATIC cHoraIni       // al inicio del programa
 *      cHoraIni := TIME()
 *
 *      // A la salida del programa
 *      ? "Ud. ha usado el programa durante: ", ELAPTIME( cHoraIni, TIME())
 *      QUIT
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      SECS(),SECONDS(),TIME(),DAY()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      MONTH()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Extrae el mes como valor num‚rico de un valor de fecha dado
 *  $SYNTAX$
 *      MONTH() --> nMes
 *  $ARGUMENTS$
 *       Cualquier expresi¢n v lida de fecha.
 *  $RETURNS$
 *      MONTH() retorna , n£mero correspondiente al mes del a¤o, en el
 *      rango de 0 a 12.
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve el valor num‚rico del mes contenido en .
 *      Este valor esta en el formato de cuatro d¡gitos y no es afectado
 *      por el seteo de los comandos SET CENTURY y SET DATE.
 *      Si se pasa una fecha vac¡a CTOD("") a esta funci¢n devuelve el valor
 *      cero.
 *  $EXAMPLES$
 *      ? Month(DATE())
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      CDOW(),DOW(),YEAR(),CMONTH()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      SECONDS()
 *  $CATEGORY$
 *      Hora
 *  $ONELINER$
 *      Retorna el n£mero de segundos transcurridos desde medianoche.
 *  $SYNTAX$
 *      SECONDS() --> nSegundos
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      SECONDS() retorna  desde la medianoche.
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve un valor num‚rico representando el n£mero de
 *      segundos transcurridos desde la medianoche del d¡a actual, basado en
 *      la hora actual del sistema operativo.
 *      SECONDS() se inicializa en cero (medianoche) y continua hasta 86399
 *      segundos (23:59:59). El valor que devuelve es expresado como segundos
 *      y cent‚simas de segundo.
 *  $EXAMPLES$
 *      // Muestra el tiempo que estuvo en ejecuci¢n una rutina
 *      nArranque = SECONDS()
 *
 *      // Aca va la llamada a la rutina
 *      //  : :
 *      ? "Tard¢: ", SECONDS()- nArranque  ," segundos"
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      TIME()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      SECS()
 *  $CATEGORY$
 *      Hora
 *  $ONELINER$
 *      Retorna el n£mero de segundos de la hora del sistema.
 *  $SYNTAX$
 *      SECS(  ) --> nSegundos
 *  $ARGUMENTS$
 *       Expresi¢n de caracteres en el formato de tiempo HH:MM:SS
 *  $RETURNS$
 *      SECS() retorna  Numbero de segundos
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve un valor num‚rico que es el n£mero de segundos
 *      transcurridos desde medianoche, basados en una cadena de hora dado
 *      como .
 *  $EXAMPLES$
 *      ? SECS( TIME())
 *      ? SECS( TIME() - 10)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *      Nota: No esta documentada en las NG, ni en el manual en espa¤ol de
 *            CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      SECONDS(),ELAPTIME(),TIME()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      TIME()
 *  $CATEGORY$
 *      Hora
 *  $ONELINER$
 *      Retorna la hora del sistema como una cadena de caracteres
 *  $SYNTAX$
 *      TIME() --> cHora
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      TIME() retorna la cadena de caracteres  representando la hora
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve la hora del sistema representada como una
 *      expresi¢n de caracteres en el formato HH:MM:SS, para calculos de
 *      tiempo conviene usar SECONDS().
 *  $EXAMPLES$
 *      ? TIME()   // Resultado: 21:34:12
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      DATE(),SECONDS()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      YEAR()
 *  $CATEGORY$
 *      Fecha
 *  $ONELINER$
 *      Extrae el a¤o como valor num‚rico de un valor de fecha dado
 *  $SYNTAX$
 *      YEAR() --> nAno
 *  $ARGUMENTS$
 *       Cualquier expresi¢n v lida de fecha.
 *  $RETURNS$
 *      YEAR() retorna  la porci¢n de a¤o de una fecha.
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve el valor num‚rico del a¤o contenido en 
 *      Este valor esta en el formato de cuatro d¡gitos y no es afectado
 *      por el seteo de los comandos SET CENTURY y SET DATE.
 *      Si se pasa una fecha vac¡a CTOD("") a esta funci¢n devuelve el valor
 *      cero.
 *  $EXAMPLES$
 *      ? YEAR( DATE())                // Resultado: 2000
 *      ? YEAR( CTOD("01/31/1982"))    // Resultado: 1982
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      DAY(),MONTH()
 *  $END$
 */


c:\harbour\doc\es\dbdelim.txt
/*
 * $Id: dbdelim.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001-2002 David G. Holm 
 *   Documentaci¢n en Ingl‚s de: __dbDelim()
 *
 * Copyright 2001 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de: __dbDelim()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __dbDelim()
 *  $CATEGORY$
 *      Conversi¢n
 *  $ONELINER$
 *      Copia el contenido de una base de datos a un archivo de texto
 *      delimitado ¢ agrega el contenido de un archivo de texto
 *      delimitado a una base de datos.
 *  $SYNTAX$
 *      __dbDelim( , , [], [],
 *      [], [], [], [],   ) --> NIL
 *  $ARGUMENTS$
 *      Si  es puesto a .T. copia registros A un archivo
 *      delimitado.
 *      Si  es .F. agrega registros DESDE un archivo delimitado.
 *
 *       es el nombre del archivo de texto del cual se va a
 *      copiar ¢ al que se va agregar datos.
 *      Si no es especificada una extensi¢n. ".txt" es usada por defecto.
 *
 *       Cualquiera de los caracteres a usar como delimitadores
 *      de campo (s¢lo el primer caracter es usado). ¢ "BLANK" (en may£sculas
 *      ¢ min£sculas), el cual elimina los caracteres delimitadores de campo
 *      y establece el separador de campo a un solo espacio en lugar de una
 *      coma.
 *
 *       Un array con los nombres de los campos a los que se limita
 *      el proceso. Si no es especificado, ¢ si est  vac¡o, entonces todos
 *      los campos son procesados.
 *
 *       Un bloque de c¢digo opcional conteniendo una expresi¢n FOR
 *      que reducir  el n£mero de registros a ser procesados.
 *
 *       Un bloque de c¢digo opcional conteniendo una expresi¢n
 *      WHILE que reducir  el n£mero de registros a ser procesados.
 *
 *       Si est  presente, pero  no est  presente,
 *      especifica procesar este n£mero de registros, empezando con el
 *      registro actual. Un valor de cero significa no procesar registros.
 *
 *       Si est  presente, especifica el £nico registro a
 *      procesar un valor de cero significa no procesar ning£n registro.
 *      Predomina sobre  y .
 *
 *       Si  es .T., y  es establecido en .T. y
 *      no hay argumentos ,  ¢ , entonces
 *      procesa todos los registros, desde el actual hasta el £ltimo.
 *  $RETURNS$
 *      NIL
 *  $DESCRIPTION$
 *      __dbDelim() copia todo ¢ el contenido seleccionado, desde una tabla
 *      de base de datos a un archivo de texto SDF ¢, agrega todo ¢ el
 *      contenido seleccionado desde un archivo de texto SDF a una tabla de
 *      base de datos.
 *  $EXAMPLES$
 *      // Copia cuentas delinquentes dentro de un archivo de texto
 *      // delimitado
 *      USE cuentas NEW
 *      COPY TO deudas DELIMITED FOR !EMPTY( cuentas->vencidas ) ;
 *      .AND. DATE() - cuentas->vencidas > 30
 *
 *      // Importa nuevos registros de clientes
 *      USE clientes NEW
 *      APPEND FROM clientes DELIMITED
 *  $TESTS$
 *
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      Es intenci¢n que __dbDelim() sea totalmente compatible con la funci¢n
 *      de CA-Cl*pper del mismo nombre y es la implementaci¢n subyacente de
 *      los comandos: APPEND FROM DELIMITED y COPY TO DELIMITED.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *
 *  $SEEALSO$
 *      __dbSDF(), APPEND FROM, COPY TO
 *  $END$
 */


c:\harbour\doc\es\dbsdf.txt
/*
 * $Id: dbsdf.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001-2002 David G. Holm 
 *   Documentaci¢n en Ingl‚s de: __dbSDF()
 *
 * Copyright 2001 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de: __dbSDF()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __dbSDF()
 *  $CATEGORY$
 *      Conversi¢n
 *  $ONELINER$
 *      Copia el contenido de una base de datos a un archivo de texto SDF
 *      ¢ agrega el contenido de un archivo de texto SDF a una base de
 *      datos.
 *  $SYNTAX$
 *      __dbSDF( , , [],
 *      [], [], [], [],  ) --> NIL
 *  $ARGUMENTS$
 *      Si  es puesto a .T. copia registros A un archivo SDF.
 *      Si  es .F. agrega registros DESDE un archivo SDF.
 *
 *       es el nombre del archivo de texto del cual se va a
 *      copiar ¢ al que se va agregar datos.
 *      Si no es especificada una extensi¢n. ".txt" es usada por defecto.
 *
 *       Un array con los nombres de los campos a los que se limita
 *      el proceso. Si no es especificado, ¢ si est  vac¡o, entonces todos
 *      los campos son procesados.
 *
 *       Un bloque de c¢digo opcional conteniendo una expresi¢n FOR
 *      que reducir  el n£mero de registros a ser procesados.
 *
 *       Un bloque de c¢digo opcional conteniendo una expresi¢n
 *      WHILE que reducir  el n£mero de registros a ser procesados.
 *
 *       Si est  presente, pero  no est  presente,
 *      especifica procesar este n£mero de registros, empezando con el
 *      registro actual. Un valor de cero significa no procesar registros.
 *
 *       Si est  presente, especifica el £nico registro a
 *      procesar un valor de cero significa no procesar ning£n registro.
 *      Predomina sobre  y .
 *
 *       Si  es .T., y  es establecido en .T. y
 *      no hay argumentos ,  ¢ , entonces
 *      procesa todos los registros, desde el actual hasta el £ltimo.
 *  $RETURNS$
 *      NIL
 *  $DESCRIPTION$
 *      __dbSDF() copia todo ¢ el contenido seleccionado, desde una tabla
 *      de base de datos a un archivo de texto SDF ¢, agrega todo ¢ el
 *      contenido seleccionado desde un archivo de texto SDF a una tabla de
 *      base de datos.
 *  $EXAMPLES$
 *      // Copia cuentas deudoras dentro de un archivo de texto SDF
 *      USE cuentas NEW
 *      COPY TO deudas SDF FOR !EMPTY( cuentas->vencidas ) ;
 *      .AND. DATE() - cuentas->vencidas > 30
 *
 *      // Importa nuevos registros de clientes
 *      USE clientes NEW
 *      APPEND FROM clientes SDF
 *  $TESTS$
 *
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      Es intenci¢n que __dbSDF() sea totalmente compatible con la funci¢n
 *      de CA-Cl*pper del mismo nombre y es la implementaci¢n subyacente de
 *      los comandos: APPEND FROM SDF y COPY TO SDF.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *
 *  $SEEALSO$
 *      __dbDelim(), APPEND FROM, COPY TO
 *  $END$
 */


c:\harbour\doc\es\dbstrux.txt
/*
 * $Id: dbstrux.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Chen Kedem 
 *    Documentation for: __dbCopyStruct(), COPY STRUCTURE, __dbCopyXStruct(),
 *                       COPY STRUCTURE EXTENDED, __dbCreate(), CREATE,
 *                       CREATE FROM, __FLEDIT(), __dbStructFilter()
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *                       __dbCopyStruct(), COPY STRUCTURE, __dbCopyXStruct(),
 *                       COPY STRUCTURE EXTENDED, __dbCreate(), CREATE,
 *                       CREATE FROM, __FLEDIT(), __dbStructFilter()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


/*  $DOC$
 *  $FUNCNAME$
 *      __dbCopyStruct()
 *  $CATEGORY$
 *      Base de Datos
 *  $ONELINER$
 *      Crea otra base de datos basada en la estructura actual del DBF
 *  $SYNTAX$
 *      __dbCopyStruct( , [] ) --> NIL
 *  $ARGUMENTS$
 *       es el nombre de una nueva base de datos a crear.
 *      (.dbf) es la extensi¢n por defecto si ninguna es especificada.
 *
 *       es un array donde cada elemento es un nombre de
 *      campo.
 *      Los nombres pueden ser especificados en may£sculas ¢ min£sculas.
 *  $RETURNS$
 *      __dbCopyStruct() siempre retorna NIL.
 *  $DESCRIPTION$
 *      La funci¢n __dbCopyStruct() crea una nueva base de datos vac¡a,
 *      con una estructura que esta basada en la base de datos actualmente
 *      abierta en este  rea de trabajo. Si  esta vac¡a,
 *      el archivo recientemente creado podr¡a tener la misma estructura
 *      que la base de datos actualmente abierta. De otro modo el nuevo
 *      archivo podr¡a contener s¢lo campos que coincidan exactamente
 *      con .
 *
 *      __dbCopyStruct() puede ser usada para crear un subconjunto de
 *      la base de datos actualmente abierta, basada en una lista dada
 *      de campos.
 *
 *      El comando COPY STRUCTURE es pre-procesado en la funci¢n
 *      __dbCopyStruct() durante el tiempo de compilaci¢n.
 *  $EXAMPLES$
 *      // Crea un nuevo archivo que contiene la misma estructura.
 *      USE TEST
 *      __dbCopyStruct( "mycopy.dbf" )
 *
 *      // Crea un nuevo archivo que contiene parte de la estructura
 *      // original
 *      LOCAL aLista
 *      USE TEST
 *      aLista := { "NOMBRE" }
 *      __dbCopyStruct( "nombre.dbf", aLista )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      __dbCopyStruct() trabaja exactamente como la funci¢n de CA-Cl*pper,
 *      __dbCopyStruct().
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rdd
 *  $SEEALSO$
 *      COPY STRUCTURE,COPY STRUCTURE EXTENDED,DBCREATE(),DBSTRUCT(),__dbCopyXStruct(),__dbCreate(),__dbStructFilter()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      COPY STRUCTURE
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Crea otra base de datos basada en la estructura actual del DBF
 *  $SYNTAX$
 *      COPY STRUCTURE TO  [FIELDS ]
 *  $ARGUMENTS$
 *      TO  es el nombre del nuevo archivo de
 *      base de datos a crear. (.dbf) es la extensi¢n por defecto si
 *      ninguna es dada.
 *
 *      Esta puede ser especificada como un literal de nombre de archivo
 *      ¢ como una expresi¢n de caracteres encerrada entre par‚ntesis.
 *
 *      FIELDS  es una lista opcional de nombres de
 *      campos a copiar desde la base de datos actualmente abierta en
 *      el orden especificado, por defecto son todos los campos.
 *      Los nombres pueden ser especificados en may£sculas ¢ min£sculas.
 *  $DESCRIPTION$
 *      COPY STRUCTURE crea una nueva base de datos vac¡a con una estructura
 *      que esta basada en la base de datos actualmente abierta en este
 *       rea de trabajo.
 *
 *      COPY STRUCTURE puede ser usada para crear un subconjunto de la base
 *      de datos actualmente abierta, basada en una lista dada de campos.
 *
 *      El comando COPY STRUCTURE es pre-procesado en la funci¢n
 *      __dbCopyStruct() durante el tiempo de compilaci¢n.
 *  $EXAMPLES$
 *      // Crea un nuevo archivo que contiene la misma estructura.
 *      USE TEST
 *      COPY STRUCTURE TO MiCopia
 *
 *      // Crea un nuevo archivo que tiene parte de la estructura original
 *      USE TEST
 *      COPY STRUCTURE TO UnaParte FIELDS nombre, direccion
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      COPY STRUCTURE trabaja exactamente como en CA-Cl*pper
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      COPY STRUCTURE EXTENDED,DBCREATE(),DBSTRUCT(),__dbCopyStruct(),__dbCopyXStruct(),__dbCreate(),__dbStructFilter()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      __dbCopyXStruct()
 *  $CATEGORY$
 *      Base de Datos
 *  $ONELINER$
 *      Copia la estructura actual de la base a un archivo de definici¢n.
 *  $SYNTAX$
 *      __dbCopyXStruct(  ) --> lExito
 *  $ARGUMENTS$
 *       es el nombre del archivo de definici¢n de destino
 *      a crear, (*.dbf) es la extensi¢n por defecto si ninguna es dada.
 *  $RETURNS$
 *      __dbCopyXStruct() retorna (.F.) si ninguna base de datos est  en
 *      uso en el  rea actual de trabajo, (.T.) si el proceso fu‚ exitoso,
 *      ¢ un error en tiempo de ejecuci¢n si la operaci¢n de creaci¢n del
 *      archivo ha fallado.
 *  $DESCRIPTION$
 *      La funci¢n __dbCopyXStruct() crea una nueva base de datos llamada
 *       con una estructura predefinida (tambi‚n llamado
 *      "archivo de estructura extendida"):
 *
 *       
 *       Nombre Campo  Tipo   Tama¤o   Decimales
 *
 *       FIELD_NAME     C      10       0
 *       FIELD_TYPE     C      1        0
 *       FIELD_LEN      N      3        0
 *       FIELD_DEC      N      3        0
 *       
* * Cada registro en el nuevo archivo contiene informaci¢n acerca de * un campo en el archivo original. CREATE FROM podr¡a ser usado para * crear la base de datos desde el archivo de estructura extendida. * * Por razones prehist¢ricas de compatibilidad, los campos de * caracteres mayores de 255 caracteres son tratados en una forma * especial al escribir parte de la longitud en el campo FIELD_DEC * de acuerdo a la siguiente f¢rmula (Esto es hecho internamente): * * * FIELD->FIELD_DEC := int( nLength / 256 ) * FIELD->FIELD_LEN := ( nLength % 256 ) * * * Luego si se desea calcular la longitud de un campo, se puede usar * la siguiente f¢rmula: * * * nLength := IIF( FIELD->FIELD_TYPE == "C", ; * FIELD->FIELD_DEC * 256 + FIELD->FIELD_LEN, ; * FIELD->FIELD_LEN ) * * * El comando COPY STRUCTURE EXTENDED es pre-procesado en la funci¢n * __dbCopyXStruct() durante el tiempo de compilaci¢n. * $EXAMPLES$ * // Abre la base de datos, y copia su estructura a un nuevo archivo. * USE Test * __dbCopyXStruct( "TestEstr" ) * * // Abre el nuevo archivo y lista todos sus registros * USE TestEstr * LIST * * $TESTS$ * $STATUS$ * R * $COMPLIANCE$ * __dbCopyXStruct() trabaja exactamente como la funci¢n de CA-Cl*pper, * __dbCopyXStruct(). * $PLATFORMS$ * Todas * $FILES$ * La librer¡a es rdd * $SEEALSO$ * COPY STRUCTURE,COPY STRUCTURE EXTENDED,CREATE,CREATE FROM,DBCREATE(),DBSTRUCT(),__dbCopyStruct(),__dbCreate() * $END$ */ /* $DOC$ * $FUNCNAME$ * COPY STRUCTURE EXTENDED * $CATEGORY$ * Comando * $ONELINER$ * Copia la estructura actual de la base a un archivo de definici¢n. * $SYNTAX$ * COPY STRUCTURE EXTENDED TO * $ARGUMENTS$ * TO es el nombre del nuevo archivo de base * de datos a crear, (.dbf) es la extensi¢n por defecto si ninguna * es dada. * Esta puede ser especificada como un literal de nombre de archivo * ¢ como una expresi¢n de caracteres encerrada entre par‚ntesis. * $DESCRIPTION$ * COPY STRUCTURE EXTENDED crea una nueva base de datos llamada * con una estructura predefinida (tambi‚n llamada * "archivo de estructura extendida"): * * * Nombre Campo Tipo Tama¤o Decimales * * FIELD_NAME C 10 0 * FIELD_TYPE C 1 0 * FIELD_LEN N 3 0 * FIELD_DEC N 3 0 *
* * * * Cada registro en el nuevo archivo contiene informaci¢n acerca de * un campo en el archivo original. CREATE FROM podr¡a ser usado para * crear la base de datos desde el "archivo de estructura extendida". * * Por razones prehist¢ricas de compatibilidad, los campos de * caracteres mayores de 255 caracteres son tratados en una forma * especial al escribir parte de la longitud en el campo FIELD_DEC * de acuerdo a la siguiente f¢rmula (Esto es hecho internamente): * * * FIELD->FIELD_DEC := int( nLength / 256 ) * FIELD->FIELD_LEN := ( nLength % 256 ) * * * Luego si se desea calcular la longitud de un campo, se puede usar * la siguiente f¢rmula: * * * nLength := IIF( FIELD->FIELD_TYPE == "C", ; * FIELD->FIELD_DEC * 256 + FIELD->FIELD_LEN, ; * FIELD->FIELD_LEN ) * * * El comando COPY STRUCTURE EXTENDED es pre-procesado en la funci¢n * __dbCopyXStruct() durante el tiempo de compilaci¢n. * $EXAMPLES$ * // Abre la base de datos, y copia su estructura a un nuevo archivo. * USE Test * __dbCopyXStruct( "TestEstr" ) * * // Abre el nuevo archivo y lista todos sus registros * USE TestEstr * LIST * * $STATUS$ * R * $COMPLIANCE$ * COPY STRUCTURE EXTENDED trabaja exactamente como en CA-Cl*pper. * $PLATFORMS$ * Todas * $SEEALSO$ * COPY STRUCTURE,CREATE,CREATE FROM,DBCREATE(),DBSTRUCT(),__dbCopyStruct(),__dbCopyXStruct(),__dbCreate() * $END$ */ /* $DOC$ * $FUNCNAME$ * __dbCreate() * $CATEGORY$ * Base de Datos * $ONELINER$ * Crea una estructura extendida ¢ usa una para crear otro archivo * $SYNTAX$ * __dbCreate( , [], [], * [], [] ) --> lUsado * $ARGUMENTS$ * es el nombre del archivo destino a crear y luego * abrir, (.dbf) es la extensi¢n por defecto si ninguna es * especificada. * * es el nombre de una estructura extendida opcional * desde la cual el archivo destino va a ser * construido. * Si es omitida, un nuevo archivo de estructura extendida vac¡a con * el nombre es creado y abierto, en el  rea de * trabajo actual. * * es el nombre del RDD para crear el archivo destino, * Si es omitido, es usado el RDD por defecto. * * es una expresi¢n l¢gica opcional, (.T.) abre el nombre * del archivo de destino en la pr¢xima  rea * disponible sin uso y hace de esta el  rea actual. (.F.) abre el * archivo de destino en el  rea de trabajo actual. * El valor por defecto es (.F.). El valor de es ignorado si * no es especificado. * * es un alias opcional para usar el archivo de destino con * el comando USE. Si no es especificado, alias esta basado en el * nombre . * $RETURNS$ * __dbCreate() retorna (.T.) si hay una base de datos usada en el *  rea actual de trabajo (esta podr¡a ser la nueva area de trabajo * elegida), ¢ (.F.) si no hay ninguna base de datos usada. * Note que si hubo ‚xito deber¡a ser devuelto (.F.), pero si hay * alguna falla probablemente se termine con un error en tiempo de * ejecuci¢n y no con un valor de (.F.) * $DESCRIPTION$ * La funci¢n __dbCreate() funciona en dos modos dependiendo del valor * de : * * 1) Si est  vac¡o o no est  especificado, un * nuevo archivo de estructura extendida vac¡a, con el nombre * es creado y luego abierto, en el  rea actual de * trabajo ( es ignorado). * El nuevo archivo tiene la siguiente estructura: * * * Nombre Campo Tipo Tama¤o Decimales * * FIELD_NAME C 10 0 * FIELD_TYPE C 1 0 * FIELD_LEN N 3 0 * FIELD_DEC N 3 0 *
* * El comando CREATE es pre-procesado en la funci¢n __dbCopyStruct() * durante el tiempo de compilaci¢n y usa este modo. * * 2) Si es especificado, este es abierto y se * asume como un archivo de estructura extendida donde cada registro * contiene al menos los siguientes campos (en cualquier orden): * FIELD_NAME, FIELD_TYPE, FIELD_LEN y FIELD_DEC. Cualquier otro campo * es ignorado. Con esta informaci¢n el archivo es * creado y abierto en el nuevo area de trabajo (de acuerdo a ) * si esta es una nueva  rea de trabajo, esta se vuelve la actual. * * Por razones prehist¢ricas de compatibilidad, los campos de * caracteres del archivo de estructura extendida los cuales sean * mayores de 255 caracteres deber¡an ser tratados en una forma * especial al escribir parte de la longitud en el campo FIELD_DEC * de acuerdo a la siguiente f¢rmula: * * * FIELD->FIELD_DEC := int( nLength / 256 ) * FIELD->FIELD_LEN := ( nLength % 256 ) * * * El comando CREATE FROM es pre-procesado en la funci¢n * __dbCopyStruct() durante el tiempo de compilaci¢n. * * $EXAMPLES$ * // Crea un nuevo archivo de estructura extendida, agrega algunos * // registros y luego crea un nueva base de datos desde este * // archivo (CREATE FROM) * * __dbCreate( "molde" ) * DBAPPEND() * FIELD->FIELD_NAME := "CANAL" * FIELD->FIELD_TYPE := "N" * FIELD->FIELD_LEN := 2 * FIELD->FIELD_DEC := 0 * DBAPPEND() * FIELD->FIELD_NAME := "PROGRAMA" * FIELD->FIELD_TYPE := "C" * FIELD->FIELD_LEN := 20 * FIELD->FIELD_DEC := 0 * DBAPPEND() * FIELD->FIELD_NAME := "RESUMEN" * FIELD->FIELD_TYPE := "C" // este campo es de 1000 char longitud * FIELD->FIELD_LEN := 232 // 1000 % 256 = 232 * FIELD->FIELD_DEC := 3 // 1000 / 256 = 3 * DBCLOSEAREA() * __dbCreate( "tv_guia", "molde" ) * $STATUS$ * R * $COMPLIANCE$ * __dbCreate() trabaja exactamente como en CA-Cl*pper. * $PLATFORMS$ * Todas * $FILES$ * La librer¡a es rdd * $SEEALSO$ * COPY STRUCTURE,COPY STRUCTURE EXTENDED,CREATE,CREATE FROM,DBCREATE(),DBSTRUCT(),__dbCopyStruct(),__dbCopyXStruct() * $END$ */ /* $DOC$ * $FUNCNAME$ * CREATE * $CATEGORY$ * Comando * $ONELINER$ * Crea un archivo de estructura extendida vac¡o. * $SYNTAX$ * CREATE [VIA ] [ALIAS ] * $ARGUMENTS$ * es el nombre del archivo de de destino a crear * y abrir, (*.dbf) es la extensi¢n por defecto si ninguna es dada. * Este puede ser especificada un literal de nombre de archivo ¢ * como una expresion de caracteres encerrada entre par‚ntesis. * * VIA es el nombre del RDD con el cual se va * a crear el archivo de destino. Si es omitido, el RDD por defecto * es usado. * Este puede ser especificado como un literal de nombre de archivo * ¢ como una expresi¢n de caracteres encerrada entre par‚ntesis. * * es un alias opcional para usar el archivo de destino con * el comando USE. Si no es especificado, alias esta basado en el * nombre . * $DESCRIPTION$ * El comando CREATE, crea un nuevo archivo de estructura extendida * vac¡o y luego lo abre en el  rea actual de trabajo. * El nuevo archivo tiene la siguiente estructura: * * * Nombre Campo Tipo Tama¤o Decimales * * FIELD_NAME C 10 0 * FIELD_TYPE C 1 0 * FIELD_LEN N 3 0 * FIELD_DEC N 3 0 *
* * El comando CREATE es pre-procesado en la funci¢n __dbCopyStruct() * durante el tiempo de compilaci¢n y usa este modo. * $EXAMPLES$ * // Crea un nuevo archivo de estructura extendida, agrega algunos * // registros y luego crea un nueva base de datos desde este archivo * // (CREATE FROM) * * CREATE molde * APPEND BLANK * FIELD->FIELD_NAME := "CANAL" * FIELD->FIELD_TYPE := "N" * FIELD->FIELD_LEN := 2 * FIELD->FIELD_DEC := 0 * APPEND BLANK * FIELD->FIELD_NAME := "PROGRAMA" * FIELD->FIELD_TYPE := "C" * FIELD->FIELD_LEN := 20 * FIELD->FIELD_DEC := 0 * APPEND BLANK * FIELD->FIELD_NAME := "RESUMEN" * FIELD->FIELD_TYPE := "C" // este campo es de 1000 char longitud * FIELD->FIELD_LEN := 232 // 1000 % 256 = 232 * FIELD->FIELD_DEC := 3 // 1000 / 256 = 3 * CLOSE * CREATE tv_Guia FROM molde * $STATUS$ * R * $COMPLIANCE$ * CREATE trabaja exactamente como en CA-Cl*pper. * $PLATFORMS$ * Todas * $SEEALSO$ * COPY STRUCTURE,COPY STRUCTURE EXTENDED,CREATE FROM,DBCREATE(),DBSTRUCT(),__dbCopyStruct(),__dbCopyXStruct(),__dbCreate() * $END$ */ /* $DOC$ * $FUNCNAME$ * CREATE FROM * $CATEGORY$ * Comando * $ONELINER$ * Crea una base de datos desde un archivo de estructura extendida * $SYNTAX$ * CREATE FROM [VIA ] * [NEW] [ALIAS ] * $ARGUMENTS$ * es el nombre del archivo de de destino a crear * y abrir, (*.dbf) es la extensi¢n por defecto si ninguna es dada. * Este puede ser especificada un literal de nombre de archivo ¢ * como una expresi¢n de caracteres encerrada entre par‚ntesis. * * FROM es el nombre del archivo de estructura * extendida desde la cual el archivo de destino va a ser construido. * Este puede ser especificado como un literal de nombre de archivo * ¢ como una expresi¢n de caracteres encerrada entre par‚ntesis. * * VIA es el nombre del RDD con el cual se va * a crear el archivo de destino. Si es omitido, el RDD por defecto * es usado. * Este puede ser especificado como un literal de nombre de archivo * ¢ como una expresi¢n de caracteres encerrada entre par‚ntesis. * * NEW abre el nombre del archivo de destino en * la pr¢xima  rea disponible sin uso y hace de ‚sta el  rea actual. * Si es omitido, abre el archivo de destino en el  rea de trabajo * actual. * * ALIAS es el alias opcional del archivo de destino * para usar con el comando USE. Si ninguno es especificado el alias * esta basado en el nombre . * $DESCRIPTION$ * El comando CREATE FROM abre un archivo de estructura extendida * donde cada registro contiene al menos los * siguientes campos (en cualquier orden): * FIELD_NAME, FIELD_TYPE, FIELD_LEN y FIELD_DEC. Cualquier otro campo * es ignorado. Con esta informaci¢n el archivo es * creado y abierto en el nuevo area de trabajo (de acuerdo a la * cl usula NEW) si ‚sta es una nueva  rea de trabajo, esta se vuelve * la actual. * * Por razones prehist¢ricas de compatibilidad, los campos de * caracteres del archivo de estructura extendida los cuales sean * mayores de 255 caracteres deber¡an ser tratados en una forma * especial al escribir parte de la longitud en el campo FIELD_DEC * de acuerdo a la siguiente f¢rmula: * * * FIELD->FIELD_DEC := int( nTamano / 256 ) * FIELD->FIELD_LEN := ( nTamano % 256 ) * * * El comando CREATE FROM es preprocesado en la funci¢n __dbCopyStruct() * durante el tiempo de compilaci¢n y usa este modo. * $EXAMPLES$ * Vea el ejemplo del comado CREATE. * $STATUS$ * R * $COMPLIANCE$ * CREATE FROM trabaja exactamente como en CA-Cl*pper. * $PLATFORMS$ * Todas * $SEEALSO$ * COPY STRUCTURE,COPY STRUCTURE EXTENDED,CREATE,DBCREATE(),DBSTRUCT(),__dbCopyStruct(),__dbCopyXStruct(),__dbCreate() * $END$ */ /* $DOC$ * $FUNCNAME$ * __FLEDIT()* * $CATEGORY$ * Base de Datos * $ONELINER$ * Filtra un array con estructura de base de datos. * $SYNTAX$ * __FLEDIT( , [] ) --> aEstructuraFiltrada * $ARGUMENTS$ * es un array multidimensional con la estructura de los * campos de la base de datos, la cual es usualmente la salida de * DBSTRUCT(), donde cada elemento del array tiene la siguiente * estructura: * * * Posici¢n Descripci¢n dbstruct.ch * * 1 cNombreCampo DBS_NAME * 2 cTipoCampo DBS_TYPE * 3 nTama¤oCampo DBS_LEN * 4 nDecimales DBS_DEC *
* * es un array donde cada elemento es un nombre de * campo. Los nombres pueden ser especificados en may£sculas o en * min£sculas. * $RETURNS$ * __FLEDIT() retorna un nuevo array multidimensional donde cada * elemento esta en la misma estructura que el original , * pero el array es construido de acuerdo a la lista de campos en * . * Si esta vac¡o, __FLEDIT() retorna una referencia al * array original . * $DESCRIPTION$ * __FLEDIT() puede ser usado para crear un subconjunto de la * estructura de la base de datos, basada en una lista de campos dadas. * * Note que los nombres de campos en DEBEN ser * especificados en may£sculas de lo contrario podr¡a no encontrarse * coincidencia. * * SET EXACT no tiene efecto en el valor retornado. * * __FLEDIT() es una funci¢n de compatibilidad y es un sin¢nimo para * __dbStructFilter() la cual hace exactamente lo mismo. * $EXAMPLES$ * LOCAL aEstructura, aLista, aRet * aEstructura := {{ "CODIGO", "N", 4, 0 }, ; * { "NOMBRE", "C", 10, 0 }, ; * { "TELEF", "C", 13, 0 }, ; * { "IQ" , "N", 3, 0 } } * aLista := { "IQ", "NOMBRE" } * aRet := __FLEDIT( aEstructura, aLista ) * // { { "IQ", "N", 3, 0 }, { "NAME", "C", 10, 0 } } * * aRet := __FLEDIT( aEstructura, {} ) * ? aRet == aEstructura // .T. * * aLista := { "iq", "NOTEXIST" } * aRet := __FLEDIT( aEstruct, aLista ) * // { { "IQ", "N", 3, 0 } } * * aLista := { "NOTEXIST" } * aRet := __FLEDIT( aEstruct, aLista ) // {} * * * // Crea un nuevo archivo que contiene parte de la estructura * // original * LOCAL aEstructura, aLista, aRet * USE TEST * aEstructura := DBSTRUCT() * aLista := { "NOMBRE" } * DBCREATE( "elnombre.dbf", __FLEDIT( aEstructura, aLista ) ) * $STATUS$ * R * $COMPLIANCE$ * CA-Cl*pper tiene una funci¢n interna no documentada llamada * __FLEDIT(), en Harbour nosotros la llamamos __dbStructFilter(). * El nuevo nombre da una mejor descripci¢n de qu‚ es lo que la funci¢n * hace. En Harbour __FLEDIT(), simplemente llama a __dbStructFilter() * y por tanto la segunda es la funci¢n recomendada. * * Esta funci¢n es s¢lo visible si ../source/rdd/dbstrux.prg fu‚ * compilado con la bandera HB_C52_UNDOC. * $PLATFORMS$ * Todas * $FILES$ * El archivo de cabecera es dbstruct.ch * La librer¡a es rdd * $SEEALSO$ * DBCREATE(),DBSTRUCT(),__dbCopyStruct(),__dbStructFilter() * $END$ */ /* $DOC$ * $FUNCNAME$ * __dbStructFilter() * $CATEGORY$ * Base de Datos * $ONELINER$ * Filtra un array con estructura de base de datos. * $SYNTAX$ * __dbStructFilter( , [] ) * --> aEstructuraFiltrada * $ARGUMENTS$ * es un array multidimensional con la estructura de * los campos de la base de datos, la cual es usualmente la salida * de DBSTRUCT(), donde cada elemento del array tiene la siguiente * estructura: * * * Posici¢n Descripci¢n dbstruct.ch * * 1 cNombreCampo DBS_NAME * 2 cTipoCampo DBS_TYPE * 3 nTama¤oCampo DBS_LEN * 4 nDecimales DBS_DEC *
* * es un array donde cada elemento es un nombre de * campo. * Los nombres pueden ser especificados en may£sculas o en min£sculas. * $RETURNS$ * __dbStructFilter() retorna un nuevo array multidimensional donde * cada elemento esta en la misma estructura que el original * , pero el array es construido de acuerdo a la lista de * campos en el array . Si esta vac¡o, * __dbStructFilter() retorna una referencia al array original * . * $DESCRIPTION$ * __dbStructFilter() puede ser usado para crear un subconjunto de la * estructura de la base de datos, basada en una lista de campos dadas. * * Note que los nombres de campos en DEBEN ser * especificados en may£sculas de lo contrario podr¡a no encontrarse * coincidencia. * * SET EXACT no tiene efecto en el valor retornado. * $EXAMPLES$ * LOCAL aEstructura, aLista, aRet * aEstructura := { { "CODIGO", "N", 4, 0 }, ; * { "NOMBRE", "C", 10, 0 }, ; * { "TELEF", "C", 13, 0 }, ; * { "IQ" , "N", 3, 0 } } * aLista := { "IQ", "NOMBRE" } * aRet := __dbStructFilter( aEstructura, aLista ) * // { { "IQ", "N", 3, 0 }, { "NAME", "C", 10, 0 } } * * aRet := __dbStructFilter( aEstructura, {} ) * ? aRet == aEstruct // .T. * * aLista := { "iq", "NOTEXIST" } * aRet := __dbStructFilter( aEstructura, aLista ) * // { { "IQ", "N", 3, 0 } } * * aLista := { "NOTEXIST" } * aRet := __dbStructFilter( aEstruct, aLista ) // {} * * * // Crea un nuevo archivo que contiene parte de la estructura * // original * LOCAL aEstruct, aLista, aRet * USE TEST * aEstruct := DBSTRUCT() * aLista := { "NOMBRE" } * DBCREATE( "elnombre.dbf", __dbStructFilter( aEstruct, aLista ) ) * $STATUS$ * R * $COMPLIANCE$ * __dbStructFilter() es una extensi¢n de Harbour. CA-Cl*pper tiene * una funci¢n interna no documentada llamada __FLEDIT(), que hace lo * mismo. El nuevo nombre da una mejor descripci¢n de que es lo que * la funci¢n hace. * $PLATFORMS$ * Todas * $FILES$ * El archivo de cabecera es dbstruct.ch * La librer¡a es rdd * $SEEALSO$ * DBCREATE(),DBSTRUCT(),__dbCopyStruct(),__FLEDIT()* * $END$ */
c:\harbour\doc\es\dir.txt
/*
 * $Id: dir.txt 9243 2008-08-25 21:36:00Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: __DIR(), DIR, ADIR()
 *
 * Copyright 1999 Chen Kedem 
 *    Documentaci¢n en Ingl‚s de: __DIR(), DIR, ADIR()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __Dir()*
 *  $CATEGORY$
 *      Manejo de Archivos
 *  $ONELINER$
 *      Muestra por pantalla el listado de archivos.
 *  $SYNTAX$
 *      __Dir( [] ) --> NIL
 *  $ARGUMENTS$
 *       M scara de archivos para incluir en el retorno de la
 *      funci¢n. Esta podr¡a contener subdirectorios (path) y caracteres
 *      est ndar usados como comodines, segun sean soportados por el sistema
 *      operativo (como * y ?). Si  no contiene la ruta al archivo
 *      entonces SET DEFAULT es usado para mostrar archivos en la m scara.
 *  $RETURNS$
 *      __Dir() siempre retorna NIL.
 *  $DESCRIPTION$
 *      Si ninguna  es dada, __Dir() muestra informaci¢n acerca de
 *      todos los *.dbf en la ruta SET DEFAULT. Esta informaci¢n contiene:
 *      - Nombre del archivo
 *      - Numero de registros
 *      - Fecha de la ultima actualizaci¢n
 *      - Tama¤o de cada archivo.
 *
 *      Si  es dada, __Dir() lista todos los archivos que
 *      coinciden con la m scara en los siguientes detalles: Nombre,
 *      Extensi¢n, Tama¤o, Fecha.
 *
 *      El comando DIR es pre-procesado en la funci¢n __Dir() durante el
 *      tiempo de compilaci¢n.
 *
 *      __Dir() es una funci¢n de compatibilidad, esta fu‚ superada por
 *      DIRECTORY(), la cual devuelve toda la informaci¢n en un arreglo
 *      multidimensional.
 *  $EXAMPLES$
 *      
 *      __Dir()   // Informaci¢n de todos los DBF en el directorio actual
 *
 *      __Dir( "*.dbf" )       // Lista todos los DBF en el directorio actual
 *
 *      // Lista todos los PRG de la librer¡a de ejecuci¢n (RTL) de Harbour
 *      // para sistemas operativos compatibles con DOS
 *      __Dir( "C:\harbour\source\rtl\*.prg" )
 *
 *      // Lista todos los archivos de la secci¢n p£blica sobre una m quina
 *      // tipo Unix
 *      __Dir( "/pub" )
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Informaci¢n de DBF: CA-Cl*pper muestra nombres de archivos en el
 *      formato 8.3, Harbour muestra los primeros 15 caracteres si un nombre
 *      largo de archivo esta disponible.
 *
 *      Listado de archivos: para formatear los nombres mostrados usamos algo
 *      as¡ como:
 *      PADR( Nombre, 8 ) + " " + PADR( Ext, 3 )
 *      CA-Cl*pper usa nombres de archivo 8.3, con Harbour probablemente se
 *      podr¡a cortar los nombres largos de archivo para llenar este molde.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      ADIR()*,DIRECTORY(),SET DEFAULT,DIR
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      DIR
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Muestra el listado de archivos
 *  $SYNTAX$
 *      DIR []
 *  $ARGUMENTS$
 *       M scara de archivos para incluir en el retorno de la
 *      funci¢n. Esta podr¡a contener subdirectorios (path) y caracteres
 *      est ndar usados como comdines, segun sean soportados por el sistema
 *      operativo (como * y ?). Si  no contiene la ruta al archivo
 *      entonces SET DEFAULT es usado para mostrar archivos en la m scara.
 *  $DESCRIPTION$
 *      Si ninguna  es dada, __Dir() muestra informaci¢n acerca de
 *      todos los *.dbf en la ruta SET DEFAULT. esta informaci¢n contiene:
 *      - Nombre del archivo
 *      - N£mero de registros
 *      - Fecha de la ultima actualizaci¢n
 *      - Tama¤o de cada archivo.
 *
 *      Si  es dada,__Dir() lista todos los archivos que coinciden
 *      con la m scara en los siguientes detalles: Nombre, Extensi¢n, Tama¤o,
 *      Fecha.
 *
 *      El comando DIR es pre-procesado en la funci¢n __Dir() durante el
 *      tiempo de compilaci¢n.
 *
 *      __Dir() es una funci¢n de compatibilidad, esta fu‚ superada por
 *      DIRECTORY(), la cual devuelve toda la informaci¢n en un arreglo
 *      multidimensional.
 *  $EXAMPLES$
 *      
 *      __Dir()   // Informaci¢n de todos los DBF en el directorio actual
 *
 *      __Dir( "*.dbf" )      // Lista todos los DBF en el directorio actual
 *
 *      // Lista todos los PRG de la librer¡a de ejecuci¢n (RTL) de Harbour
 *      // para sistemas operativos compatibles con DOS
 *      __Dir( "C:\harbour\source\rtl\*.prg" )
 *
 *      // Lista todos los archivos de la secci¢n p£blica sobre una m quina
 *      // tipo Unix
 *      __Dir( "/pub" )
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Informaci¢n de DBF: CA-Cl*pper muestra nombres de archivos en el
 *      formato 8.3, Harbour muestra los primeros 15 caracteres si un nombre
 *      largo de archivo est  disponible.
 *
 *      Listado de archivos: para formatear los nombres mostrados usamos algo
 *      as¡ como:
 *      PADR( Nombre, 8 ) + " " + PADR( Ext, 3 )
 *      CA-Cl*pper usa nombres de archivo 8.3, con Harbour probablemente se
 *      podr¡a cortar los nombres largos de archivo para llenar este molde.
 *  $SEEALSO$
 *      ADIR()*,DIRECTORY(),SET DEFAULT,__DIR()*
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ADIR()*
 *  $CATEGORY$
 *      ARRAY
 *  $ONELINER$
 *      Llena arrays pre-definidos con informaci¢n de archivo / directorio
 *  $SYNTAX$
 *      ADIR( [], [], [], [],
 *            [], [] ) -> nEntradasDirectorio
 *  $ARGUMENTS$
 *       M scara de archivos para incluir en el retorno de la
 *      funci¢n. Esta podria contener subdirectorios (path) y caracteres
 *      estandar usados como comodines, segun sean soportados por el sistema
 *      operativo (como * y ?). Si  no contiene la ruta al archivo
 *      entonces SET DEFAULT es usado para mostrar archivos en la m scara.
 *
 *       Array para llenar con el Nombre de los archivos que cumplen
 *      con . Cada elemento es una cadena de caracteres que
 *      incluye el Nombre y Extensi¢n del archivo sin la ruta de acceso.
 *      Nombre es el nombre largo de archivo como es reportado por el sistema
 *      operativo y no necesariamente en el formato may£sculas 8.3 del D.O.S.
 *
 *       Array  para llenar con el Tama¤o de los archivos que
 *      cumplen con . Cada elemento es un n£mero entero con el
 *      tama¤o del archivo en bytes.
 *      Los Directorios siempre tienen un tama¤o cero.
 *
 *       Array para llenar con la Fecha de la ultima modificaci¢n del
 *      archivo que cumplen con . Cada elemento es del tipo "Date"
 *
 *       Array para llenar con la Hora de la ultima modificaci¢n del
 *      archivo que cumplen con . Cada elemento es una cadena de
 *      caracteres en el formato:      HH:MM:SS.
 *
 *       Array para llenar con los atributos de los archivos que
 *      cumplen con . Cada elemento es una cadena de caracteres,
 *      Vea DIRECTORY() por informaci¢n sobre los valores de los atributos.
 *      Si Ud. pasa un array a , la funci¢n va a devolver archivos
 *      con los atributos Normal, Oculto (H), sistema (S) y directorio (D)
 *      Si  no es especificado o es distinto de un array solo
 *      archivos con atributo normal porian ser devueltos.
 *
 *      Nota: Al momento de escribir esta documentaci¢n todavia no hab¡a
 *            informaci¢n sobre el comportamiento de esta funci¢n con los
 *            atributos que poseen las maquinas tipo Unix.
 *  $RETURNS$
 *      ADIR() retorna el n£mero de entradas de archivo que cumplen con la
 *      condici¢n establecida en la m scara .
 *  $DESCRIPTION$
 *      ADIR() retorna el n£mero de archivos y/o directorios que cumplen con
 *      un formato especificado, este tambien llena una serie de arrays con
 *      Nombre, Tama¤o, Fecha, Hora y Atributo de estos archivos.
 *      El array pasado debe ser pre-inicializado al tama¤o apropiado, vea el
 *      ejemplo m s abajo.
 *      Con motivo de incluir los atributos Oculto (H), sistema (S) o de
 *      directorio (D)  debe ser especificado.
 *
 *      ADIR() es una funci¢n de compatibilidad, esta fue superada por
 *      DIRECTORY(), la cual devuelve toda la informaci¢n en un arreglo
 *      multidimensional.
 *  $EXAMPLES$
 *      
 *      LOCAL aNombre, aTamano, aFecha, aHora, aAtrib, nLen, i
 *      nLen := ADIR( "*.jpg" )   // Nro de archivos JPG files en directorio
 *
 *      IF nLen > 0
 *         aNombre := Array( nLen )  // hace lugar para guardar la informac.
 *         aTamano := Array( nLen )
 *         aFecha  := Array( nLen )
 *         aHora   := Array( nLen )
 *         aAtrib  := Array( nLen )
 *
 *         FOR i = 1 TO nLen
 *             ? aNombre[i], aTamano[i], aFecha[i], aHora[i], aAtrib[i]
 *         NEXT
 *      ELSE
 *         ? "Este directorio no tiene ni pelusa"
 *      ENDIF
 *      
 *  $STATUS$
 *     R
 *  $COMPLIANCE$
 *       esta yendo a ser llenado con nombres largos de archivo y
 *      no necesariamente con el formato may£sculas 8.3 del D.O.S.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      ARRAY(),DIRECTORY(),SET DEFAULT
 *  $END$
 */


c:\harbour\doc\es\dirstruc.txt
/*
 * $Id: dirstruc.txt 9190 2008-08-19 10:50:19Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2002 Chen Kedem  
 *   Documentaci¢n en Ingl‚s de: dirstruc.txt
 *
 * Copyright 2002 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de: dirstruc.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


Estructura de directorios de Harbour
====================================

Siguiendo estan los directorios que existen bajo el arbol de 
Harbour.
Bajo cada directorio existente en esta lista hay tambi‚n un 
directorio especial, llamado CVS, el que deber¡a normalmente
ser ignorado dado que ‚ste es usado por el CVS para mantener
la pista de todos los archivos (lea las FAQ, si Ud. no sabe
qu‚ es el CVS). Note que el  rbol puede contener otros 
directorios vac¡os.
Ellos podr¡an ser obsoletos pero no hay una forma sencilla de
removerlos completamente (Ud. puede usar cvs update -d en
busca de remover directorios vac¡os)


              - Directorio principal de Harbour
|                        Contiene todos los archivos make y Changelog 
|                        (cambios hist¢ricos)
|
+---bin                - Ejecutables y batch de construcci¢n
|   |                    deber¡a contener harbour.exe y otros ejecutables (*)
|   |
|   +---b32            - aqui se construye los binarios 32 bits Borland
|   |
|   +---vc             - aqui se construye los binarios 32 bits Microsoft
|
+---config             - Archivos de Config. (.cf) para the GNU Make system
|   |
|   +---bsd            - Archivos de Configuraci¢n espec¡ficos para FreeBSD
|   |
|   +---dos            - Archivos de Configuraci¢n espec¡ficos 
|   |                    para DOS.
|   +---linux          - Archivos de Config. espec¡ficos para GNU/Linux.
|   |
|   +---os2            - Archivos de Configuraci¢n espec¡ficos para OS/2.
|   |
|   +---w32            - Archivos de Config. espec¡ficos para MS-Win32.
|
|
+---contrib            - Archivos Miscelaneos de contribuci¢n. 
|   |                    No son parte del proyecto oficial Harbour 
|   |
|   +---apollo         - funciones para driver de base de datos Apollo 
|   |   |                
|   |   |
|   |   +---test       - Programas de Testeo
|   |
|   +---directx        - Implementaci¢n de DirectDraw para Windows
|   |   |
|   |   +---lib        -
|   |   |   |
|   |   |   +---vc     -
|   |   |
|   |   +---media      -
|   |   |
|   |   +---samples    - ejemplos de DirectDraw
|   |
|   +---dot            - Pre-Processor/Dot prompt environment.
|   |
|   +---hbclip         - Harbour Compatibility Lib. (HCL) para Clipper 5.x
|   |
|   +---hbzlib         - Interface para 'zlib' libreria de compresion
|   |   |                para trabajar con archivos ZIP
|   |   |
|   |   +---doc        - Documentos para las funciones ZIP 
|   |
|   +---hb_struc       - Clase Base Class para manejo interno de creaci¢n
|   |                    de clases como estructuras
|   |
|   +---hgf            - Entorno gr fico (GUI) de Harbour 
|   |   |
|   |   +---gtk        - Implementaci¢n para entorno GTK+ 
|   |   |
|   |   +---os2pm      - Implementaci¢n para OS/2 Presentation Manager
|   |   |                
|   |   |
|   |   +---tests      - Programas de Testeo
|   |   |
|   |   +---win32      - Implementaci¢n para entorno Win32
|   |
|   +---htmllib        - HTMLLIB (HTML classes) para Harbour
|   |
|   +---libct          - CA-T**ls Compatible Library para Harbour.
|   |   |
|   |   +---alt        - version altenativa de funciones CT
|   |   |
|   |   +---tests      - Programas de Testeo
|   |
|   +---libgt          - GT library port to Harbour.
|   |   |
|   |   +---doc        - Documentos para la librer¡a GT
|   |       |
|   |       +---en     - Documentaci¢n en Ingl‚s.
|   |
|   +---libmisc        - Contribuci¢n Miscel nea 
|   |   |
|   |   +---doc        - Documentos de contribuci¢n 
|   |   |   |
|   |   |   +---en     - Documentaci¢n en Ingl‚s.
|   |   |
|   |   +---tests      - Programas de Testeo
|   |
|   +---libnf          - Libreria Nanforum para Harbour.
|   |
|   +---msql           - clases Harbour de acceso a mSQL 
|   |
|   +---mysql          - clases Harbour de acceso a MySQL
|   |
|   +---odbc           - Demostraci¢n de clases de acceso a ODBC
|   |
|   +---pdflib         - API PDF de bajo nivel para HBDOC para
|   |                    PDFlib.
|   |
|   +---rdd_ads        - RDD para Advantage Database Server.
|   |   |
|   |   +---doc        - Documents para Advantage Database Server RDD.
|   |       |
|   |       +---en     - Documentaci¢n en Ingl‚s.
|   |
|   +---runjava        - JAVA runner para Harbour Portable Object (#3)
|   |
|   +---samples        - Archivos de contribuci¢n miscelaneos
|   |
|   +---tprepro        - Clases PreProcessor basadas en la
|                        libreria de Ejecuci¢n del Preprocessor
|
+---doc                - Documentaci¢n y notas
|   |
|   +---en             - Documentaci¢n en Ingl‚s.
|   |
|   +---es             - Documentaci¢n en Espa¤ol.
|
+---include            - Archivos Include para ambos Harbour y C
|
+---lib                - Librerias de ejecuci¢n para cada plataforma (*)
|   |
|   +---b16            - borland 16 bits
|   |
|   +---b32            - borland 32 bits
|   |
|   +---vc             - microsoft 32 bits (Visual C++)
|
+---obj                - Archivos binarios .obj  (*) (#2)
|   |
|   +---b16            - borland 16 bits
|   |
|   +---b32            - borland 32 bits
|   |
|   +---vc             - microsoft 32 bits (Visual C++)
|
+---samples            - Archivos de ejemplo y peque¤as aplicaciones
|   |
|   +---guestbk        - Libro de visitantes de Harbour para web
|   |
|   +---hscript        - Harbour Script.
|   |
|   +---misc           - unos humildes ejemplos
|   |
|   +---pe             - Editor
|
|   
+---source             - Todos los archivos fuentes residen bajo este 
|   |                    directorio
|   |                    
|   +---common         - Funciones Comunes y Optimizador de Expresiones
|   |
|   +---compiler       - M¢dulo del Compilador de Harbour 
|   |
|   +---debug          - Depurador.
|   |
|   +---lang           - archivos de mensajes para distintos idiomas
|   |
|   +---macro          - Macro compilador
|   |
|   +---pp             - Preprocesesador de Harbour
|   |
|   +---rdd            - Replaceable Database Driver (RDD)
|   |   |                Manejador reemplazable de base de datos
|   |   |
|   |   +---dbfcdx     - DBFCDX RDD.
|   |   |
|   |   +---dbfntx     - DBFNTX RDD.
|   |   |
|   |   +---nulsys     - NULL RDD.
|   |
|   +---rtl            - Funciones de la librer¡a de ejecuci¢n (RTL)
|   |   |                y varias implementaciones de Terminales (GT) 
|   |   |
|   |   +---gtcgi      - GT subsistema para aplicaciones cgi
|   |   |
|   |   +---gtcrs      - Subsistema GT basado en ncurses (unix) (#1)
|   |   |
|   |   +---gtdos      - Subsistema GT para compiladores de DOS  
|   |   |
|   |   +---gtos2      - Subsistema GT para compiladores de OS/2 
|   |   |
|   |   +---gtpca      - Subsistema GT para terminales ANSI 
|   |   |
|   |   +---gtsln      - Subsistema GT basado en slang (unix) (#1)
|   |   |
|   |   +---gtstd      - Subsistema GT para ANSI C stream IO.
|   |   |
|   |   +---gtwin      - Subsistema GT para compiladores Win32
|   |   |
|   |   +---gt_tpl     - Subsistema GT modelo base
|   |
|   +---vm             - Funciones de la Maquina Virtual (VM) e 
|                        internas de la librer¡a de ejecuci¢n (RTL)
|
+---tests              - Programas de Testeo de Harbour
|
+---utils              - Utilidades y herramientas que son parte de Harbour
    |
    +---hbdoc          - Herramienta generadora de Documentaci¢n 
    |
    +---hbextern       - generador de hbextern.ch
    |
    +---hbmake         - Utilidad Make de Harbour 
    |
    +---hbpp           - Preprocesador de Harbour como m¢dulo aislado
    |
    +---hbrun          - Ejecutor de archivos de Objetos Portables de 
    |                    Harbour (#3)
    +---hbtest         - Test de Regresi¢n para la libreria RTL


Leyenda:
=======
(*)    Deber¡a existir en una construcci¢n final si lo 
construye Ud. mismo, en una distribuci¢n normal de CVS este
directorio est  vac¡o ¢ no contiene todos los archivos.

(#1) Aunque hoy en d¡a existen ports a otros sistemas operativos
     sus ra¡ces estan en unix. 

(#2) Directorio temporal donde se ponen los archivos objeto
     .obj u otro (dependiendo de la plataforma) a medida
     que se construyen los ejecutables y las librer¡as.
     si Ud. construye el compilador Harbour.

(#3) (.hrb), Archivos de formato Harbour Portable Object 

c:\harbour\doc\es\diskspac.txt
/*
 * $Id: diskspac.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: DISKSPACE()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      DISKSPACE()
 *  $CATEGORY$
 *      Bajo Nivel
 *  $ONELINER$
 *      Obtiene la cantidad de espacio disponible en el disco
 *  $SYNTAX$
 *      DISKSPACE( [] [, ] ) --> nDiskbytes
 *  $ARGUMENTS$
 *       es el n£mero de disco del que esta solicitando informaci¢n
 *               donde 1 = A, 2 = B, etc, Si se especifica cero ¢ ning£n
 *               parametro DISKPACE() trabaja sobre la unidad actual de disco
 *               Por defecto es cero.
 *
 *       es el tipo de espacio que est  siendo requerido.  Por defecto
 *              es HB_DISK_AVAIL.
 *  $RETURNS$
 *       es el n£mero de bytes en la unidad especificada que
 *                   coincide con el tipo requerido.
 *  $DESCRIPTION$
 *      Por defecto esta funci¢n retorna el n£mero de bytes de espacio libre
 *      en el disco actual que esta disponible para el usuario que solicita
 *      la informaci¢n.
 *
 *      Hay 4 tipos de informaci¢n disponible:
 *
 *      HB_FS_AVAIL   La cantidad de espacio disponible para el usuario que
 *                    hace la solicitud. Este valor podr¡a ser menor que
 *                    HB_FS_FREE si las asignaciones de espacio en disco
 *                    (quotas) son soportadas por el sistema operativo al
 *                    tiempo de ejecuci¢n y estas quotas est n asignadas.
 *                    De otro modo el valor ser  igual al retornado por
 *                    HB_FS_FREE.
 *
 *      HB_FS_FREE    La cantidad actual de espacio libre en el disco.
 *
 *      HB_FS_USED    El n£mero de bytes en uso en el en el disco.
 *
 *      HB_FS_TOTAL   La cantidad total de espacio asignado para el usuario
 *                    si las quotas estan asignadas. De otro modo el tama¤o
 *                    actual del disco.
 *
 *      Si la informaci¢n es requerida sobre un disco que no esta disponible
 *      un error de ejecuci¢n 2018 ser  establecido.
 *  $EXAMPLES$
 *      ? "Ud. tiene diponible: " + STR( DISKSPACE() ) + " bytes " +;
 *        "sobre un total de " + STR( DISKSPACE( 0, HB_FS_TOTAL) )
 *
 *      Note: Ver ..\tests\tstdspac.prg por otros ejemplos.
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      CA-Cl*pper retorna un valor entero cuya utilidad esta limitada a
 *      discos menores de 2 gigabytes. La versi¢n de Harbour retorna un valor
 *      de punto flotante con 0 decimales si el disco es > 2 gigabytes.
 *       es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Dos, Win32, OS/2, Unix
 *  $FILES$
 *      El c¢digo fuente est  en diskspac.c
 *      La librer¡a asociada es rtl
 *      El archivo de cabecera es fileio.ch
 *  $END$
 */


c:\harbour\doc\es\error.txt
/*
 * $Id: error.txt 6072 2003-07-13 14:51:56Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: ERRORSYS()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


/*  $DOC$
 *  $FUNCNAME$
 *     ERRORSYS()
 *  $CATEGORY$
 *     Recuperacion de Errores
 *  $ONELINER$
 *     Instala el manejador de errores por defecto
 *  $SYNTAX$
 *     ERRORSYS() --> NIL
 *  $ARGUMENTS$
 *     Ninguno.
 *  $RETURNS$
 *     ERRORSYS() siempre retorna NIL.
 *  $DESCRIPTION$
 *     ERRORSYS() es llamado en el inicio por Harbour e instala el manejador
 *     de errores por defecto. Normalmente no se debe llamar a esta funci¢n
 *     directamente. En su lugar use ERRORBLOCK() para instalar su propio
 *     manejador de errores.
 *  $STATUS$
 *     R
 *  $COMPLIANCE$
 *     Esta funci¢n es 100 % Clipper compatible
 *  $FILES$
 *     El c¢digo fuente est  en errorsys.c
 *     La librer¡a asociada es rtl
 *  $SEEALSO$
 *      ERRORBLOCK(),Error class
 *  $END$
 */  


c:\harbour\doc\es\eval.txt
/*
 * $Id: eval.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 *    Documentaci¢n en Espa¤ol de: EVAL()
 *
 * Copyright 2000 Luiz Rafael Culik 
 *    Documentaci¢n en Ingl‚s de: EVAL()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


/*  $DOC$
 *  $FUNCNAME$
 *      EVAL()
 *  $CATEGORY$
 *      Bloque de c¢digo
 *  $ONELINER$
 *      Eval£a un bloque de c¢digo (codeblock)
 *  $SYNTAX$
 *      EVAL(  [,  [,...]])   --> xExpresion
 *  $ARGUMENTS$
 *        Bloque de c¢digo a ser evaluado.
 *
 *           Argumento para ser pasado al bloque de c¢digo.
 *
 *        Lista de argumentos para ser pasados al bloque de c¢digo.
 *  $RETURNS$
 *      EVAL() retorna , el valor de la £ltima expresi¢n dentro
 *      del bloque. El valor devuelto puede ser de cualquier tipo v lido.
 *  $DESCRIPTION$
 *      Esta funci¢n eval£a el bloque de c¢digo expresado como  al
 *      ejecutarlo y pasarle los par metros como argumentos ,luego retorna su
 *      valor evaluado. Si hay m£ltiples expresiones dentro del bloque de
 *      c¢digo, la £ltima expresi¢n ser  el valor de esta funci¢n.
 *
 *      Si el bloque de c¢digo requiere par metros para ser pasados a ‚ste,
 *      ellos son especificados en la lista de par metros .
 *      Cada par metro es separado por una coma dentro de la lista de
 *      par metros y cada expresi¢n es separada por comas dentro de la lista
 *      de expresiones.
 *
 *      Nota: Un bloque de c¢digo es un valor de datos especial que hace
 *            referencia a c¢digo de programa compilado (contiene c¢digo
 *            ejecutable), puede incluso contener funciones y el hecho que
 *            permite exportar variables est ticas y locales dentro de ‚l,
 *            la da una gran versatilidad.
 *            Aunque las macros y los bloques de c¢digo son similares, las
 *            Las macros son cadenas de caracteres que se compilan durante
 *            la ejecuci¢n de un programa y se ejecutan a continuaci¢n.
 *            Los bloques de c¢digo se compilan junto con los otros PRG
 *            durante la compilaci¢n del programa. Por esto son m s r pidos,
 *            Es posible compilar un bloque de c¢digo en tiempo de ejecuci¢n
 *            desde una cadena de caracteres usando el operador de macros (&).
 *            Un bloque de c¢digo esta compuesto por:
 *            { ||  }
 *            Los separadores verticales deben estar presentes aunque el
 *            bloque no reciba argumentos.
 *  $EXAMPLES$
 *       bBloque = {|arg1, arg2| QOUT( arg1+arg2) }
 *       EVAL( bBloque, "Harbour", " es fabuloso")
 *  $TESTS$
 *      Ver ejemplos.
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es 100 % compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es vm
 *  $SEEALSO$
 *      AEVAL(),DBEVAL()
 *  $END$
 */


c:\harbour\doc\es\file.txt
/*
 * $Id: file.txt 9243 2008-08-25 21:36:00Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Chen Kedem 
 *   Documentaci¢n en Ingl‚s de: __TYPEFILE(), TYPE
 *
 * Copyright 2000 Luiz Rafael Culik 
 *   Documentaci¢n en Ingl‚s de:
 *         FOPEN(), FCLOSE(), FWRITE(), FSEEK(), FREAD(), FILE(),
 *         FREADSTR(), FRENAME(), FERROR(), RENAME, ERASE, CURDIR(),
 *         DIRMAKE(),DIRCHANGE(),ISDISK(),DIRREMOVE(),DISKCHANGE(),
 *         DIRCHANGE()
 *
 * Copyright 2000 David G. Holm 
 *   Documentaci¢n en Ingl‚s de: HB_FEOF()
 *
 * Copyright 2003 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de:
 *         FOPEN(), FCREAT(), FREAD(), FWRITE(), FERROR(), FCLOSE(),
 *         FERASE(), FRENAME(), FSEEK(), FILE(), FREADSTR(), RENAME,
 *         ERASE, DELETE FILE, __TYPEFILE(), TYPE, CURDIR(), COPY FILE,
 *         HB_FEOF(), DIRREMOVE(), DIRCHANGE(), MAKEDIR(), ISDISK(),
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      FOPEN()
 *  $CATEGORY$
 *      Bajo Nivel
 *  $ONELINER$
 *      Abre un archivo binario
 *  $SYNTAX$
 *      FOPEN( , [] ) --> nHandle
 *  $ARGUMENTS$
 *       Es el Nombre del archivo a abrir
 *
 *          Modo de apertura del archivo
 *  $RETURNS$
 *      Devuelve , el manejador (handle) del archivo.
 *  $DESCRIPTION$
 *      Esta funci¢n abre el archivo binario indicado como  y
 *      devuelve un manejador de archivo para ser usado por otras funciones
 *      de bajo nivel.
 *      El valor de  representa la forma de apertura del archivo, el
 *      valor por defecto es 0 (cero).
 *      Los modos de apertura son los siguientes:
 *
 *      
 *       nModo   fileio.ch      Significado
 *
 *         0     FO_READ        Solo Lectura   (Read only)
 *         1     FO_WRITE       Solo Escritura (Write only)
 *         2     FO_READWRITE   Leer/Escribir  (Read/write)
 *        16     FO_EXCLUSIVE   Uso exclusivo, Solo Lectura
 *        32     FO_DENYWRITE   Evita escritura por otros
 *        48     FO_DENYREAD    Evita Lectura por otros
 *        64     FO_DENYNONE    No Evita nada, Otros pueden Leer/Escribir
 *        64     FO_SHARED      igual que FO_DENYNONE
 *      
* * Si existe un error en la apertura del archivo, la funci¢n devolver  * -1. El valor del manejador de archivo (handle) puede estar en el * rango de cero a 65535. * El estado de los comandos SET DEFAULT TO y SET PATH TO no tiene * efecto sobre esta funci¢n. * Los nombres de directorios y la trayectoria a trav‚s de ellos (path) * puede ser especificada junto con el nombre del archivo a ser abierto. * * Si ocurre un error, consulte el valor que devuelve la funci¢n * FERROR(), por las causas posibles del error. * $EXAMPLES$ * 1) Abre un archivo para lectura/escritura y en modo compartido * * nHandle := FOPEN('x.txt', 66 ) * * IF nHandle < 0 * ? "El archivo no puede ser abierto" * ENDIF * * * 2) ¢ mejor a£n * cFile := "x.txt" * nHandle := FOPEN( cFile, FO_SHARED + FO_READWRITE ) * * IF FERROR() != 0 * ? "El archivo <" + cFile + "> no puede ser abierto, error: ", ; * FERROR() * // Tomar la acci¢n apropiada... * ENDIF * * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * El archivo de cabecera es fileio.ch * $SEEALSO$ * FCREATE(),FERROR(),FCLOSE() * $END$ */ /* $DOC$ * $FUNCNAME$ * FCREATE() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Crea ¢ Trunca un archivo binario. * $SYNTAX$ * FCREATE( , [] ) --> nHandle * $ARGUMENTS$ * Es el Nombre del archivo a abrir * * C¢digo num‚rico con los atributos del archivo * $RETURNS$ * Devuelve el manejador num‚rico (handle) del archivo para * ser usado en otras operaciones. * $DESCRIPTION$ * Esta funci¢n crea un nuevo archivo binario con el nombre . * El valor por defecto de es cero y es usado para * establecer el byte de atributo del archivo creado por esta funci¢n. * El valor de retorno es un manejador de archivo (handle) que es * asociado con el nuevo archivo. Este n£mero estar  entre cero y 65535 * Si ocurre un error, el valor de retorno de esta funci¢n ser  de -1. * * Si el archivo ya existe, ese archivo ser  truncado a una * longitud de cero bytes. * * Si es especificado, la tabla siguiente muestra los * valores que puede tomar y su relaci¢n con el archivo que * est  siendo creado por esta funci¢n. * * * fileio.ch Significado * * 0 FC_NORMAL Normal/Por Defecto, Lectura/Escritura * 1 FC_READONLY Solo Lectura * 2 FC_HIDDEN Oculto, Excluido de la b£squeda normal DIR * 4 FC_SYSTEM Sistema, Excluido de la b£squeda normal DIR *
* $EXAMPLES$ * cFile := "test.txt" * nHandle := FCREATE( cFile ) * * IF nHandle < 0 * ? "No se puede crear el archivo:", cFile * ENDIF * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $FILES$ * La librer¡a asociada es rtl * El archivo de cabecera es fileio.ch * $SEEALSO$ * FCLOSE(),FOPEN(),FWRITE(),FREAD(),FERROR() * $END$ */ /* $DOC$ * $FUNCNAME$ * FREAD() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Lee un n£mero de bytes especificado desde un archivo binario * $SYNTAX$ * FREAD( , @, ) --> nBytesLeidos * $ARGUMENTS$ * Manejador de archivo del sistema operativo * * Cadena de caracteres usada como buffer temporal y * pasada por referencia (n¢tese el operador '@' delante * del nombre de la variable). * * N£mero de bytes a leer * $RETURNS$ * Devuelve , el n£mero de bytes satisfactoriamente * le¡dos desde el archivo. * $DESCRIPTION$ * Esta funci¢n lee caracteres desde un archivo cuyo manejador es * a una variable de memoria indicada como . * La funci¢n retorna el n£mero de bytes exitosamente le¡dos dentro de * . * * El valor de es obtenido de la llamada a la funci¢n FOPEN() * ¢ bien de la llamada a la funci¢n FCREATE(). * * La expresi¢n es pasada por referencia y debe ser definida * antes que esta funci¢n sea llamada. Esta tambi‚n debe tener el * mismo ¢ mayor tama¤o que , caso contrario se producir  un * error. * * es el n£mero de bytes a leer, comenzando en la posici¢n * actual del puntero del archivo. Si esta funci¢n tiene ‚xito en la * lectura de los caracteres del archivo, el n£mero real de caracteres * le¡dos ser  igual a la longitud de , igual al n£mero de * bytes especificado en y ese ser  el valor devuelto. * El puntero actual del archivo avanza tantas posiciones como el n£mero * de bytes le¡dos. * * Esta funci¢n lee todos los caracteres ASCII de 0-255, incluyendo el * car cter null / ASC(0) y los caracteres de control. * Si esta funci¢n devuelve cero, ¢ si el n£mero de bytes le¡dos no * coincide ni con la longitud de , ni con el valor * especificado en , es porque se ha alcanzado la condici¢n * end-of-file (EOF) ¢ fin de archivo. * * Si ocurre un error, consulte el valor que devuelve la funci¢n * FERROR(), por las causas posibles del error. * $EXAMPLES$ * nChunck := 500 * cBuffer := SPACE( nChunck ) * * IF (nHandle := FOPEN('x.txt') ) > 0 * FREAD( nHandle, @cBuffer, nChunck ) * ENDIF * * FCLOSE( nHandle ) * * ? cBuffer * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper, pero tambi‚n extiende el * tama¤o del buffer a cadenas m s grandes que 64 Kb (dependiendo de la * plataforma). * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * BIN2I(),BIN2L(),BIN2W(),FERROR(),FWRITE() * $END$ */ /* $DOC$ * $FUNCNAME$ * FWRITE() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Escribe caracteres hacia un archivo binario abierto. * $SYNTAX$ * FWRITE( , , [] ) --> nBytesEscritos * $ARGUMENTS$ * Manejador de archivo del sistema operativo * * Cadena de caracteres a escribirse * * El n£mero de bytes a escribir * $RETURNS$ * el n£mero de bytes satisfactoriamente escritos. * $DESCRIPTION$ * Esta funci¢n escribe el contenido de la memoria intermedia * a un archivo binario designado por su manejador de archivo . * * El valor devuelto por esta funci¢n es el n£mero de bytes exitosamente * escritos en el archivo. * Si el valor devuelto es cero, un error ha ocurrido, disco lleno, etc. * * Una escritura satisfactoria ocurre cuando el n£mero de bytes * retornados por FWRITE() es igual al LEN( ) ¢ . * * El valor de es el n£mero de bytes a escribir al archivo. * La escritura comienza en la posici¢n actual del puntero del archivo. * Si es especificado, este es el n£mero de bytes en * que van a ser escritos. Si esta variable no es usada, el contenido * completo del buffer es escrito al archivo. * Para truncar un archivo, una llamada a FWRITE( nHandle, "", 0 ) es * necesaria. * * Si ocurre un error, consulte el valor que devuelve la funci¢n * FERROR(), por las causas posibles del error. * $EXAMPLES$ * nHandle := FCREATE('x.txt') * * FOR x :=1 TO 10 * FWRITE( nHandle, STR(x) ) * NEXT * * FCLOSE( nHandle ) * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n no es compatible con CA-Cl*pper porque puede escribir * cadenas de caracteres mayores a 64 Kb. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * FCLOSE(),FCREATE(),FERROR(),FOPEN(),I2BIN(),L2BIN() * $END$ */ /* $DOC$ * $FUNCNAME$ * FERROR() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Reporta el estado de error de las funciones de archivo de bajo nivel * $SYNTAX$ * FERROR() --> * $RETURNS$ * Valor del £ltimo error del DOS encontrado por una * funci¢n de bajo nivel. * * Valores de Retorno de FERROR() * * * Error Significado * * 0 Exito, no hubo error * 2 Archivo no encontrado * 3 Camino (Path) no encontrado * 4 Demasiados archivos abiertos * 5 Acceso denegado * 6 Manejador (handle) no v lido * 8 Memoria insuficiente * 15 Drive especificado no v lido * 19 Intento de escritura en un disco protegido * 21 Drive no listo * 23 Error en CRC de datos * 29 Error de escritura * 30 Error de lectura * 32 Sharing violation * 33 Violaci¢n de bloqueo *
* $DESCRIPTION$ * Despu‚s de ejecutar una funci¢n de manipulaci¢n de archivos de bajo * nivel , esta funci¢n retornar  un valor que provee informaci¢n * adicional sobre su funcionamiento. * Si la funci¢n FERROR() devuelve cero, no se ha detectado ning£n * error. Esta funci¢n mantiene su valor hasta la pr¢xima ejecuci¢n de * una funci¢n de archivo de bajo nivel. * M s arriba hay un tabla con algunos valores devueltos por la funci¢n * FERROR(). * Note que esos valores podr¡an ser distintos en otra plataforma * (sistema operativo) distinta a DOS/Windows. * $EXAMPLES$ * #include "fileio.ch" * // * nHandle := FCREATE("temp.txt", FC_NORMAL) * * IF FERROR() != 0 * ? "No se puede crear el archivo, DOS error ", FERROR() * ENDIF * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * FCLOSE(),FERASE(),FOPEN(),FWRITE() * $END$ */ /* $DOC$ * $FUNCNAME$ * FCLOSE() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Cierra un archivo binario abierto * $SYNTAX$ * FCLOSE( ) --> * $ARGUMENTS$ * Manejador de archivo del sistema operativo * $RETURNS$ * Devuelve un valor l¢gico, es TRUE (.T.) si se cerr¢ con * ‚xito ¢ FALSE (.F.) si no se pudo cerrar. * $DESCRIPTION$ * Esta funci¢n cierra un archivo abierto identificado con el manejador * de DOS y escribe el contenido del buffer DOS asociado hacia * el disco. * El valor es obtenido del llamado a alguna de las * funciones FCREATE() ¢ FOPEN(). * * Si ocurre un error, consulte el valor que devuelve la funci¢n * FERROR(), por las causas posibles del error. * $EXAMPLES$ * nHandle := FOPEN('x.txt') * * ? FSEEK( nHandle, 0, 2) * * FCLOSE( nHandle ) * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * FOPEN(),FCREATE(),FREAD(),FWRITE(),FERROR() * $END$ */ /* $DOC$ * $FUNCNAME$ * FERASE() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Borra un archivo del disco * $SYNTAX$ * FERASE( ) --> nExito * $ARGUMENTS$ * Nombre del archivo a borrar * $RETURNS$ * Devuelve cero si hubo ‚xito, -1 en caso contrario. * $DESCRIPTION$ * Esta funci¢n borra el archivo especificado en del disco. * Ninguna extensi¢n es asumida. El disco y el camino (path) pueden ser * incluidos en ; * Ninguno de los comandos SET DEFAULT ni SET PATH afectan la ejecuci¢n * de esta funci¢n. * Si el disco ¢ el camino no son usados, esta funci¢n buscar  el * archivo solamente en el directorio actual del disco al cual se * encuentra loggeado. * * Si la funci¢n es capaz de borrar satisfactoriamente el archivo del * disco, el valor devuelto por la funci¢n ser  cero ¢ -1 si hubo alguna * falla. Si no fue exitosa la operaci¢n, informaci¢n adicional puede * ser obtenida llamando a la funci¢n FERROR(). * * Nota: Cualquier archivo a ser removido por FERASE() debe estar * previamente cerrado. * $EXAMPLES$ * IF FERASE("test.txt") == 0 * ? "El archivo fu‚ exitosamente borrado" * ELSE * ? "El archivo no puede ser borrado" * ENDIF * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * FERROR(),FRENAME() * $END$ */ /* $DOC$ * $FUNCNAME$ * FRENAME() * $CATEGORY$ * File management * $ONELINER$ * Renombra un archivo * $SYNTAX$ * FRENAME( , ) --> nExito * $ARGUMENTS$ * Nombre del archivo a ser cambiado * * Nuevo nombre que tomar  el archivo * $RETURNS$ * Devuelve cero si hubo ‚xito, -1 en caso contrario. * $DESCRIPTION$ * Esta funci¢n renombra el archivo especificado en * al nuevo nombre: . * El nombre del archivo junto con el del directorio puede ser * especificado para cualquier par metro. * Sin embargo, si el camino es aportado como parte de * y este camino es diferente del camino especificado en * ¢ (si ninguno es usado) el disco y directorio actuales, la funci¢n * podr¡a no ejecutarse satisfactoriamente. * * Ninguno de los comandos SET DEFAULT ni SET PATH afectan la ejecuci¢n * de esta funci¢n. * Al intentar localizar el archivo a ser renombrado, esta funci¢n * buscar  en el disco y el directorio por defecto, ¢ en el disco y * directorio especificado en . * No buscar  en los directorios mencionados en los comandos SET PATH TO * SET DEFAULT TO ¢ por la sentencia PATH del sistema operativo. * * Si el archivo especificado en existe ¢ el archivo * est  abierto, la funci¢n ser  incapaz de renombrar el archivo. * Si la funci¢n es incapaz de completar su operaci¢n, esta devolver  * el valor -1, y cero si la operaci¢n fue exitosa. * Si ocurre un error, consulte el valor que devuelve la funci¢n * FERROR(), por las causas posibles del error. * $EXAMPLES$ * nResult := FRENAME("x.txt", "x1.txt") * * IF nResult < 0 * ? "El archivo no pudo ser renombrado." * ENDIF * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * ERASE,FERASE(),FERROR(),FILE(),RENAME * $END$ */ /* $DOC$ * $FUNCNAME$ * FSEEK() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Mueve el puntero de un archivo binario * $SYNTAX$ * FSEEK( , , [] ) --> nPosicion * $ARGUMENTS$ * Manejador de archivo del sistema operativo * El valor es obtenido del llamado a alguna de * las funciones FCREATE() ¢ FOPEN(). * * N£mero de bytes a mover el puntero del archivo * * Posici¢n inicial del puntero del archivo * $RETURNS$ * Devuelve la posici¢n actual del puntero del archivo con * respecto al comienzo del archivo. * $DESCRIPTION$ * Esta funci¢n mueve el puntero del archivo, cuyo manejador DOS es * tantos bytes hacia delante ¢ atras seg£n el contenido de * , desde la posici¢n establecida por . * * El valor num‚rico retornado por la funci¢n es la posici¢n relativa * del puntero del archivo al marcador de inicio de archivo una vez que * la operaci¢n ha sido completada. * Esta funci¢n no realiza ninguna lectura, simplemente mueve el puntero * del archivo. * * Si el valor de es positivo el puntero se mover  hacia * delante, si el valor es negativo se mover  hacia atr s, desde la * posici¢n establecida por . * * El valor de establece el punto de inicio desde el cual el * puntero del archivo va a ser movido, como se muestra en la tabla * siguiente: * * * fileio.ch Posici¢n en el archivo * * 0 FS_SET Comienzo del archivo * 1 FS_RELATIVE Actual posici¢n del puntero del archivo * 2 FS_END Fin del archivo (EOF) *
* * Si un valor no es provisto para , por defecto es cero y * el puntero del archivo se mueve desde el comienzo del archivo. * El puntero del archivo no puede desplazarse m s alla de los l¡mites * de inicio ¢ de fin de archivo, caso contrario ocurrir  un error. * Si ocurre un error, consulte el valor que devuelve la funci¢n * FERROR(), por las causas posibles del error. * $EXAMPLES$ * // Funci¢n que lee una l¡nea de texto desde un archivo abierto * * // nHandle = manejador de archivo obtenido de FOPEN() * // cB = cadena buffer pasada-por-referencia para poner el resultado * // nMaxLine = n£mero maximo de bytes a leer * * #define EOL HB_OSNEWLINE() * * FUNCTION FREADln( nHandle, cB, nMaxLine ) * * LOCAL cLine, nSavePos, nEol, nNumRead * * cLine := SPACE( nMaxLine ) * cB := '' * nSavePos := FSEEK( nHandle, 0, FS_RELATIVE ) * nNumRead := FREAD( nHandle, @cLine, nMaxLine ) * * IF ( nEol := AT( EOL, substr( cLine, 1, nNumRead ) ) ) == 0 * cB := cLine * ELSE * cB := SUBSTR( cLine, 1, nEol - 1 ) * FSEEK( nHandle, nSavePos + nEol + 1, FS_SET ) * ENDIF * * RETURN nNumRead != 0 * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $FILES$ * La librer¡a asociada es rtl * El archivo de cabecera es fileio.ch * $SEEALSO$ * FCREATE(),FERROR(),FOPEN(),FREAD(),FREADSTR(),FWRITE() * $END$ */ /* $DOC$ * $FUNCNAME$ * FILE() * $CATEGORY$ * File management * $ONELINER$ * Verifica la existencia de archivos * $SYNTAX$ * FILE( ) --> lExiste * $ARGUMENTS$ * Especificaci¢n del archivo, esta puede contener una * referencia a la unidad de disco y el directorio. * La extensi¢n debe ser especificada. * Sigue las reglas b sicas de archivos de DOS. * $RETURNS$ * Retorna un valor l¢gico verdadero (.T.) si el archivo * existe, ¢ falso (.F.) si no es encontrado. * $DESCRIPTION$ * Esta funci¢n busca el archivo como es especificado en * * Si el camino no es especificado, FILE() buscar  primero en la * ubicaci¢n indicada por SET DEFAULT, si no lo encuentra seguir  luego * con la/s ubicaci¢n/es contenidas en SET PATH, hasta que el archivo * sea encontrado ¢ hasta que no haya m s caminos para buscar. * * El PATH del DOS nunca es examinado y el actual disco y directorio * es s¢lo examinado si SET DEFAULT est  en blanco. * * Nota: La utilizaci¢n de caracteres comodines '*' y '?' todav¡a no * est  soportada comletamente. * $EXAMPLES$ * ? FILE( "C:\harbour\doc\compiler.txt") * ? FILE( "C:\harbour\doc\subcodes.txt") * * $STATUS$ * S (el soporte de comodines todav¡a est  ausente) * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * SET DEFAULT,SET PATH,SET() * $END$ */ /* $DOC$ * $FUNCNAME$ * FREADSTR() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Lee una cadena de caracteres desde un archivo binario * $SYNTAX$ * FREADSTR( , ) --> cCadena * $ARGUMENTS$ * Manejador de archivo del sistema operativo * El valor es obtenido del llamado a alguna de * las funciones FCREATE() ¢ FOPEN(). * * N£mero de bytes a leer * $RETURNS$ * Devuelve la cadena de caracteres . * $DESCRIPTION$ * Esta es una funci¢n de bajo nivel que lee caracteres de un archivo * binario. * El valor de es el n£mero de bytes a leer desde el archivo. * * La cadena devuelta ser  el n£mero de caracteres especificado en * si no hubo error y el archivo todav¡a conten¡a esa cantidad * de caracteres. * Si se encuentra los caracteres ASCII=cero ¢ ASCII=26 el tama¤o de la * cadena devuelta ser  menor que e inclusive puede ser nula. * * NOTA: * Esta funci¢n es similar a la funci¢n FREAD(), excepto que detiene la * lectura si encuentra los caracteres CHR(0) (fin de cadena) ¢ CHR(26) * (fin de archivo). * Tenga esto en cuenta si no logra el resultado deseado al leer un * archivo binario, en tal caso la funci¢n FREAD() deber¡a ser usada en * lugar de la funci¢n FREADSTR(). * $EXAMPLES$ * - Este ejemplo lee y muestra los primeros 100 caracteres de un * archivo de texto * * IF ( nHandle := FOPEN("x.txt") ) > 0 * cStr := FREADSTR( nHandle, 100) * ? cStr * ENDIF * * FCLOSE( nHandle ) * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n no es compatible CA-Cl*pper dado que la versi¢n de * Harbour, puede leer cadenas mayores que 64 Kb, dependiendo de la * plataforma. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * BIN2I(),BIN2L(),BIN2W(),FERROR(),FREAD(),FSEEK() * $END$ */ /* HARBOUR COMMANDS */ /* $DOC$ * $FUNCNAME$ * RENAME * $CATEGORY$ * Comando * $ONELINER$ * Cambia el nombre del archivo especificado * $SYNTAX$ * RENAME TO * $ARGUMENTS$ * Nombre del archivo a ser cambiado * * Nuevo nombre que tomar  el archivo * $DESCRIPTION$ * Este comando cambia el nombre de a . * Ambos archivos y deben incluir la * extensi¢n del archivo y pueden opcionalmente incluir la unidad de * disco y el camino, aunque deben especificarse si cualquier archivo * est  en otro directorio distinto al disco y directorio por defecto. * El nombre de cualquiera de los dos archivos puede ser especificado * como una cadena literal, ¢ como una expresi¢n de caracteres * encerrada entre par‚ntesis. * Este comando no es afectado ni por el comando SET PATH TO, ni por el * comando SET DEFAULT TO. * * Si existe previamente ¢ si est  actualmente abierto * este comando no realizar  la operaci¢n deseada. * Si ocurre un error, consulte el valor que devuelve la funci¢n * FERROR(), por las causas posibles del error. * $EXAMPLES$ * RENAME C:\autoexec.bat TO C:\autoexec.old * * $STATUS$ * R * $COMPLIANCE$ * Este comando es compatible con CA-Cl*pper. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * CURDIR(),ERASE,FILE(),FERASE(),FRENAME() * $END$ */ /* $DOC$ * $FUNCNAME$ * ERASE * $CATEGORY$ * Comando * $ONELINER$ * Remueve un archivo del disco * $SYNTAX$ * ERASE * $ARGUMENTS$ * Nombre del archivo a remover * $DESCRIPTION$ * Este comando borra ¢ remueve un archivo del disco. * El nombre de puede especificarse como una cadena literal, * ¢ como una expresi¢n de caracteres. Debe incluir la extensi¢n del * archivo y puede opcionalmente incluir la unidad de disco y el camino. * * El uso de los caracteres comodines '*' y '?' esta permitido. * * Los comandos SET DEFAULT y SET PATH no afectan la operatoria de este * comando. * El archivo debe ser considerado cerrado por el sistema operativo, * antes de que ‚ste pueda ser borrado. * $EXAMPLES$ * ERASE C:\autoexec.bat // s¢lo es una broma, no lo intente! * ERASE C:/temp/read.txt * * $STATUS$ * R * $COMPLIANCE$ * Este comando es compatible con CA-Cl*pper. * $SEEALSO$ * CURDIR(),FILE(),FERASE(),DELETE FILE * $END$ */ /* $DOC$ * $FUNCNAME$ * DELETE FILE * $CATEGORY$ * Comando * $ONELINER$ * Remueve un archivo del disco * $SYNTAX$ * DELETE FILE * $ARGUMENTS$ * Nombre del archivo a remover * $DESCRIPTION$ * Este comando borra ¢ remueve un archivo del disco. * El nombre de puede especificarse como una cadena literal, * ¢ como una expresi¢n de caracteres. Debe incluir la extensi¢n del * archivo y puede opcionalmente incluir la unidad de disco y el camino. * * El uso de los caracteres comodines '*' y '?' esta permitido. * * Los comandos SET DEFAULT y SET PATH no afectan la operatoria de este * comando. * El archivo debe ser considerado cerrado por el sistema operativo, * antes de que ‚ste pueda ser borrado. * $EXAMPLES$ * ERASE C:\autoexec.bat // s¢lo es una broma, no lo intente! * ERASE C:/temp/read.txt * * $STATUS$ * R * $COMPLIANCE$ * Este comando es compatible con CA-Cl*pper. * $SEEALSO$ * CURDIR(),FILE(),FERASE(),ERASE * $END$ */ /* $DOC$ * $FUNCNAME$ * __TYPEFILE() * $CATEGORY$ * Data input and output * $ONELINER$ * Muestra el contenido de un archivo en la consola y/o impresora * $SYNTAX$ * __TYPEFILE( , [] ) --> NIL * $ARGUMENTS$ * Es el nombre del archivo a visualizar. * Si el archivo tiene una extensi¢n, esta debe ser * especificada (no hay valor por defecto). * * Es un valor l¢gico opcional que especifica a donde * deber¡a ir la salida: * (.F.) salida solamente a la pantalla * (.T.) salida a pantalla e impresora. * Por defecto es (.F.). * $RETURNS$ * __TYPEFILE() siempre devuelve NIL. * $DESCRIPTION$ * La funci¢n __TYPEFILE() muestra el contenido de un archivo de texto * en la pantalla, con una opci¢n para enviar esta informaci¢n tambi‚n * a la impresora. * El archivo es visualizado tal como est  sin ning£n encabezado ¢ * formateo previo. * * Si no contiene ning£n camino ¢ path, __TYPEFILE() tratar  * de encontrar primero el archivo en el directorio indicado por * SET DEFAULT y luego entonces en todos los directorios indicados por * SET PATH. * Si el archivo , no puede ser encontrado ocurrir  un error * en tiempo de ejecuci¢n. * * Use SET CONSOLE OFF para suprimir la salida por pantalla. * Usted puede pausar la salida usando , y pulsando cualquier * tecla para continuar. * * La funci¢n __TYPEFILE() es usada en el preprocesamiento del comando * TYPE. * $EXAMPLES$ * Los siguientes ejemplos asumen que un archivo con el nombre * mitexto.dat existe en todos los caminos especificados, un error de * ejecuci¢n podr¡a ser visualizado de no ser as¡. * * // Visualiza el archivo mitexto.dat en la pantalla * __TYPEFILE( "mitexto.dat" ) * * // Visualiza el archivo mitexto.dat en la pantalla e impresora * __TYPEFILE( "mitexto.dat", .T. ) * * // Visualiza el archivo mitexto.dat en la impresora solamente * SET CONSOLE OFF * * __TYPEFILE( "mitexto.dat", .T. ) * * SET CONSOLE ON * * $STATUS$ * R * $COMPLIANCE$ * __TYPEFILE() trabaja exactamente como __TYPEFILE() de CA-Cl*pper * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * COPY FILE,SET DEFAULT,SET PATH,SET PRINTER,TYPE * $END$ */ /* $DOC$ * $FUNCNAME$ * TYPE * $CATEGORY$ * Comando * $ONELINER$ * Visualiza el contenido de un archivo de texto * $SYNTAX$ * TYPE [TO PRINTER] [TO FILE ] * $ARGUMENTS$ * Es el nombre del archivo a visualizar. * Si el archivo tiene una extensi¢n, esta debe ser * especificada (no hay valor por defecto). Esta puede ser * especificada como literal de nombre de archivo ¢ como * una expresi¢n de caracteres encerrada entre parentesis * * TO PRINTER es una cl usula opcional que especifica que la salida * deber¡a ir a la pantalla e impresora. * * TO FILE Copia el archivo fuente tambi‚n * a un archivo. Si ninguna extensi¢n es dada (.txt) es * agregada al archivo de salida. * puede ser especificado como literal de * nombre de archivo ¢ como una expresi¢n de caracteres * encerrada entre par‚ntesis. * $DESCRIPTION$ * El comando TYPE muestra el contenido de un archivo de texto en la * pantalla, con una opci¢n para enviar esta informaci¢n tambi‚n * a la impresora ¢ a un archivo alternativo. * El archivo es visualizado tal como est  sin ning£n encabezado ¢ * formateo previo. * * Si no contiene ning£n camino ¢ path, TYPE tratar  * de encontrar primero el archivo en el directorio indicado por * SET DEFAULT y luego entonces en todos los directorios indicados por * SET PATH. * Si el archivo , no puede ser encontrado ocurrir  un error * en tiempo de ejecuci¢n. * * Si no contiene ning£n camino ¢ path, este es creado en * directorio indicado en SET DEFAULT. * * Use SET CONSOLE OFF para suprimir la salida por pantalla. * Usted puede pausar la salida usando , y pulsando cualquier * tecla para continuar. * $EXAMPLES$ * Los siguientes ejemplos asumen que un archivo con el nombre * mitexto.dat existe en todos los caminos especificados, un error de * ejecuci¢n podr¡a ser visualizado de no ser as¡. * * // Visualiza el archivo mitexto.dat en la pantalla * TYPE mitexto.dat * * // Visualiza el archivo mitexto.dat en la pantalla e impresora * TYPE mitexto.dat TO PRINTER * * // Visualiza el archivo mitexto.dat en la impresora solamente * SET CONSOLE OFF * * TYPE mitexto.dat TO PRINTER * * SET CONSOLE ON * * // Visualiza el archivo mitexto.dat en la pantalla y lo env¡a al * // archivo mireporte.txt * TYPE mitexto.dat TO FILE MiReporte * * $STATUS$ * R * $COMPLIANCE$ * TYPE trabaja exactamente como el comando TYPE de CA-Cl*pper * $SEEALSO$ * COPY FILE,SET DEFAULT,SET PATH,SET PRINTER,__TYPEFILE() * $END$ */ /* $DOC$ * $FUNCNAME$ * CURDIR() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Retorna el nombre del directorio actual del Sistema Operativo * $SYNTAX$ * CURDIR( [] ) --> cPath * $ARGUMENTS$ * Letra del disco del Sistema Operativo * $RETURNS$ * Devuelve , el nombre del directorio actual * $DESCRIPTION$ * Esta funci¢n devuelve el nombre del directorio actual del Sistema * Operativo para un drive especificado. * Si no es especificado, el drive al que se encuentra * actualmente loggeado ¢ conectado ser  usado. * * Esta funci¢n no deber¡a devolver las barras de separaci¢n de * directorio que se encuentren por delante y por detr s del directorio, * sino s¢lo el nombre. * Si un error ha sido detectado por la funci¢n, ¢ el directorio actual * del Sistema Operativo es el raiz, el valor de la funci¢n podr¡a ser * un byte nulo (NULL). * $EXAMPLES$ * ? CURDIR() * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper. * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * FILE() * $END$ */ /* $DOC$ * $FUNCNAME$ * COPY FILE * $CATEGORY$ * Comando * $ONELINER$ * Copia un archivo a uno nuevo ¢ a un dispositivo * $SYNTAX$ * COPY FILE TO | * $ARGUMENTS$ * es el nombre del archivo fuente ¢ de origen * * es el nombre del archivo destino * * es el nombre del dispositivo al que se va a enviar * los datos. Si no existe el dispositivo se crea un * archivo con ese nombre. * $DESCRIPTION$ * Este comando realiza una copia exacta del archivo y * le asigna el nombre . * Ambos archivos deben tener la extensi¢n incluida, no se agrega * ninguna por defecto. Ambos archivos pueden especificar tanto * la unidad de disco como el camino. * Tanto ambos archivos como el dispositivo pueden ser especificados * como literal de nombre de archivo ¢ como una expresi¢n de caracteres * encerrada entre parentesis. * * El nombre del dispositivo puede ser tanto uno local como uno de red * LPT1, \\SHARED\PRINTER, etc. * * Los comandos SET DEFAULT y SET PATH no afectan la operatoria de este * comando. * $EXAMPLES$ * COPY FILE C:\harbour\tests\adirtest.prg TO C:\temp\adirtest.prg * COPY FILE C:\harbour\utils\hbdoc\gennf.prg TO LPT1 * $STATUS$ * R * $COMPLIANCE$ * Este comando es compatible con CA-Cl*pper. * $SEEALSO$ * ERASE,RENAME,FRENAME(),FERASE(),COPY TO * $END$ */ /* $DOC$ * $FUNCNAME$ * HB_FEOF() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Chequea si el puntero del archivo esta al final (EOF). * $SYNTAX$ * HB_FEOF( ) --> lEsEOF * $ARGUMENTS$ * Manejador de archivo del sistema operativo * El valor es obtenido del llamado a alguna de * las funciones FCREATE() ¢ FOPEN(). * $RETURNS$ * Devuelve , un valor l¢gico verdadero (.T.) si el puntero * del archivo de ese manejador est  al final del archivo (EOF), ¢ * falso (.F.) si a£n no lleg¢ al fin del archivo. * $DESCRIPTION$ * Esta funci¢n testea si el archivo abierto correspondiente al * manejador tiene el puntero del archivo al final del * archivo, E-O-F. * * Si el manejador de archivo falta, no es num‚rico, ¢ el archivo no * est  abierto, entonces esta funci¢n devuelve .T. y establece el * valor devuelto por FERROR() a -1 (FS_ERROR), ¢ a un valor de error * dependiente del compilador de lenguaje C (EBADF ¢ EINVAL). * $EXAMPLES$ * nHandle := FOPEN('file.txt') * * ? FREADSTR( nHandle, 80) * * IF HB_FEOF( nHandle ) * ? "Fue alcanzado el Fin-de-Archivo (EOF)" * ELSE * ? FREADSTR( nHandle, 80) * ENDIF * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una extensi¢n de Harbour. * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * FERROR() * $END$ */ /* $DOC$ * $FUNCNAME$ * DIRREMOVE() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Remueve un directorio * $SYNTAX$ * DIRCHANGE( ) --> nError * $ARGUMENTS$ * Es el nombre del directorio a remover * $RETURNS$ * Devuelve un valor num‚rico, es cero si el directorio fu‚ * exitosamente removido, de otro modo devuelve el n£mero del £ltimo * error ocurrido. * $DESCRIPTION$ * Esta funci¢n intenta remover el directorio especificado en la * variable . Si esta funci¢n falla, devolver  el c¢digo * num‚rico del sistema operativo correspondiente al £ltimo error * ocurrido. * Consulte la funci¢n FERROR() por una descripci¢n del error. * $EXAMPLES$ * cDir := ".\backup" * nError := DIRREMOVE( cDir ) * * IF nError == 0 * ? "La remoci¢n del directorio [" + cDir + "] fu‚ exitosa" * ENDIF * $TESTS$ * Ver ejemplos * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper 5.3 * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * MAKEDIR(),DIRCHANGE(),ISDISK(),DISKCHANGE(),DISKNAME(),FERROR() * $END$ */ /* $DOC$ * $FUNCNAME$ * DIRCHANGE() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Cambia el directorio activo * $SYNTAX$ * DIRCHANGE( ) --> nError * $ARGUMENTS$ * Es el nombre del directorio al cual Ud. desea cambiarse * $RETURNS$ * Devuelve un valor num‚rico, es cero si el directorio fu‚ * exitosamente cambiado, de otro modo devuelve el n£mero del £ltimo * error ocurrido. * $DESCRIPTION$ * Esta funci¢n intenta cambiar el directorio actual a otro especificado * en la variable . Si esta funci¢n falla, devolver  el * c¢digo num‚rico del sistema operativo correspondiente al £ltimo error * ocurrido. * Consulte la funci¢n FERROR() por una descripci¢n del error. * $EXAMPLES$ * cDir := "\temp" * nError := DIRCHANGE( cDir ) * * IF nError == 0 * ? "El cambio al directorio [" + cDir + "] fu‚ exitoso" * ENDIF * $TESTS$ * Ver ejemplos * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper 5.3 * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * MAKEDIR(),DIRREMOVE(),ISDISK(),DISKCHANGE(),DISKNAME(),FERROR() * $END$ */ /* $DOC$ * $FUNCNAME$ * MAKEDIR() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Crea un nuevo directorio * $SYNTAX$ * MAKEDIR( ) --> nError * $ARGUMENTS$ * Es el nombre del directorio que Ud. desea crear * $RETURNS$ * Devuelve un valor num‚rico, es cero si el directorio fu‚ * exitosamente creado, de otro modo devuelve el n£mero del £ltimo * error ocurrido. * $DESCRIPTION$ * Esta funci¢n intenta crear un nuevo directorio con el nombre * especificado en la variable . Si esta funci¢n falla, * devolver  el c¢digo num‚rico del sistema operativo correspondiente * al £ltimo error ocurrido. * Consulte la funci¢n FERROR() por una descripci¢n del error. * $EXAMPLES$ * cDir := "Temp" * nError := MAKEDIR( cDir) * IF nError == 0 * ? "La creaci¢n del directorio [" + cDir + "] fu‚ exitosa" * ENDIF * $TESTS$ * Ver ejemplos * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper 5.3 * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * DIRCHANGE(),DIRREMOVE(),ISDISK(),DISKCHANGE(),DISKNAME(),FERROR() * $END$ */ /* $DOC$ * $FUNCNAME$ * ISDISK() * $CATEGORY$ * Bajo Nivel * $ONELINER$ * Verifica si un drive est  listo * $SYNTAX$ * ISDISK( ) --> lExito * $ARGUMENTS$ * Una letra de drive que sea v lida * $RETURNS$ * Devuelve un valor l¢gico , es verdadero (.T.) si el drive * est  listo, ¢ falso (.F.) si no est  listo. * $DESCRIPTION$ * Esta funci¢n intenta acceder a un drive. Si el aceso al drive fu‚ * Es £til para funcines de respaldo ¢ back-up, as¡ Ud. puede determinar * si el drive que va a recibir los datos a resguardar est  listo ¢ no. * Si esta funci¢n falla, devolver  el c¢digo num‚rico del sistema * operativo correspondiente al £ltimo error ocurrido. * Consulte la funci¢n FERROR() por una descripci¢n del error. * $EXAMPLES$ * 1) Testea el drive A: * * IF ISDISK("A") * ? "El Drive est  listo " * ENDIF * * * 2) Testea el drive B: * cDrive := "B" * * IF ! ISDISK( cDrive ) * ? "El Drive [" + cDrive + ":] No est  disponible" * ENDIF * $TESTS$ * Ver ejemplos * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper 5.3 * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * DIRCHANGE(),MAKEDIR(),DIRREMOVE(),DISKCHANGE(),DISKNAME() * $END$ */
c:\harbour\doc\es\garbage.txt
/*
 * $Id: garbage.txt 6072 2003-07-13 14:51:56Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *         Readme, hb_gcAlloc(), hb_gcFree(), hb_gcLockItem(),
 *         hb_gcUnlockItem(), hb_gcCollectAll(), hb_gcItemRef(), HB_GCALL()
 *
 * Copyright 2000 brian Brian Hays 
 * Documentaci¢n en Ingl‚s de:
 *         Readme, hb_gcAlloc(), hb_gcFree(), hb_gcLockItem(),
 *         hb_gcUnlockItem(), hb_gcCollectAll(), hb_gcItemRef(), HB_GCALL()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


/*  $DOC$
 *  $FUNCNAME$
 *      Colector de memoria
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      L‚ame con informaci¢n de la recolecci¢n de memoria.
 *  $DESCRIPTION$
 *      El recolector de memoria (Garbage Collector ¢ GC) usa la siguiente
 *      l¢gica:
 *      - primero recolectar todas las ubicaciones de memoria que puedan
 *        constituirse en "basura"
 *      - luego inspeccionar todas las variables, por si esos bloques est n
 *        todav¡a referenciados.
 *
 *      Note que s¢lo arrays, objetos y bloques de c¢digo son recolectados
 *      porque esos son los £nicos tipos de datos que pueden causar:
 *      auto-referencias
 *            ( a [1] : = a )
 *      ¢ referencias circulares:
 *            ( a[1] := b; b[1] := c; c[1] := a )
 *      que no pueden ser apropiadamente desasignadas por un simple conteo
 *      de referencia.
 *
 *      Como todas las variables en Harbour son almacenadas dentro de algunas
 *      tablas disponibles (eval stack, tabla de memvars y array de variables
 *      est ticas), entonces chequear si la referencia es todav¡a activa es
 *      bastante f cil y no requiere ning£n tratamiento especial durante la
 *      la asignaci¢n de memoria. Adicionalmente el recolector de memoria
 *      inspecciona algunos datos internos usados por la implementaci¢n de
 *      objetos de Harbour que tambi‚n almacena algunos valores que pueden
 *      contener referencias de memoria. Estos datos son usados para inicia-
 *      lizar variables de instancia de la clase, y son almacenadas en
 *      variables compartidas por la clase.
 *
 *      En casos especiales cuando el valor de una variable de Harbour es
 *      almacenada internamente en alg£n area est tica (a nivel de lenguaje
 *      C ¢ asembler), por ejemplo SETKEY() almacena bloques de c¢digo que
 *      ser n evaluados cuando se presione una tecla, el recolector de
 *      memoria no ser  capaz de inspeccionar esos valores porque este no
 *      conoce su ubicaci¢n. Esto podr¡a ocasionar que algunos bloques de
 *      memoria sean liberados prematuramente. Para prevenir la prematura
 *      desasignaci¢n de esos bloques ellos deben ser bloqueados para el
 *      recolector de memoria.
 *
 *      Para ello se definen distintos estados del bloque de memoria:
 *
 *      #define HB_GC_UNLOCKED   0  // desbloqueado
 *      #define HB_GC_LOCKED     1  // No recolectar el bloque de memoria
 *      #define HB_GC_USED_FLAG  2  // bit para la bandera usado/no usado
 *
 *      El bloque de memoria puede ser bloqueado con hb_gcLockItem(), m‚todo
 *      recomendado si un ¡tem de estructura es usado ¢ con la funci¢n
 *      hb_gcLock() si un puntero directo a memoria es usado.
 *      El bloque de memoria puede ser desbloqueado por hb_gcUnlockItem() ¢
 *      hb_gcUnlock().
 *
 *      N¢tese sin embargo que todas las variables pasadas a una funci¢n de
 *      bajo nivel son pasadas mediante la pila de evaluaci¢n (eval stack),
 *      as¡ ellas no necesitan bloquearse durante la llamada a la funci¢n.
 *      El bloqueo puede ser requerido, si un valor pasado es copiado dentro
 *      de alg£n  rea est tica para hacerla disponible para otras funciones
 *      de bajo nivel, llamadas despu‚s de la salida de la funci¢n que
 *      almacena el valor. Esto es requerido porque el valor es removido de
 *      la pila de evaluaci¢n despu‚s de la llamada a la funci¢n y esta no
 *      puede seguir siendo referenciada por otras variables.
 *
 *      Sin embargo la inspecci¢n de todas las variables puede ser una
 *      operaci¢n de un gran consumo de tiempo. Esto requiere que todos los
 *      arrays asignados tengan que ser recorridos a trav‚s de todos sus
 *      elementos para encontrar m s arrays.
 *      Tambi‚n todos los bloques de c¢digo son inspeccionados, en busca de
 *      variables locales separadas que ellos estan referenciando. Por esta
 *      esta raz¢n, la busqueda por bloques de memoria no referenciados es
 *      realizada durante los estados inactivos.
 *
 *      El estado inactivo es el estado cuando no hay un c¢digo real de la
 *      aplicaci¢n ejecut ndose. Por ejemplo, el c¢digo del usuario es
 *      detenido durante 0.1 segundo por INKEY(0.1) - Harbour esta chequeando
 *      s¢lo el teclado durante este tiempo. Esto deja sin embargo suficiente
 *      tiempo para muchas otras tareas en segundo plano. Una de esas tareas
 *      en segundo plano, puede ser la b£squeda de bloques de memoria no
 *      referenciados.
 *
 *      Asignando memoria 
 *      -----------------
 *
 *      El recolector de memoria, recoge bloques de memoria asignados con
 *      llamadas a la funci¢n hb_gcAlloc().   La memoria asignada por
 *      hb_gcAlloc() deber¡a ser liberada con la funci¢n hb_gcFree().
 *
 *
 *      Bloqueando memoria  
 *      ------------------
 *
 *      La memoria asignada con hb_gcAlloc() deber¡a ser bloqueada para
 *      prevenir una autom tica liberaci¢n como un puntero de memoria si no
 *      es almacenado dentro de una variable a nivel de Harbour. Todos los
 *      valores de Harbour (items), almacenados internamente en  reas
 *      est ticas de lenguaje C deben ser bloqueadas.
 *      Vea hb_gcLockItem() y hb_gcUnlockItem() para m s informaci¢n.
 *
 *
 *      La recoleci¢n de memoria  
 *      ------------------------
 *
 *      Durante la b£squeda de memoria no referenciada, el recolector de
 *      memoria (RM) est  usando un algoritmo llamado "mark & sweep", marcar
 *      y barrer. Este es realizado en tres etapas:
 *
 *      1) Marcar todos los bloques asignados por el RM con un bandera:
 *      "sin uso"
 *
 *      2) barrer (buscar) todos los lugares conocidos y limpiar las banderas
 *      sin uso por los bloques de memoria que son referenciados all¡;
 *
 *      3) finalizar recolectando por desasignaci¢n de todos los bloques de
 *      memoria que a£n estan marcados como sin uso y que no est n bloqueados.
 *
 *      Para acelerar las cosas un poco, la etapa de marca es simplificada
 *      por la inversi¢n del significado de la bandera "sin uso". Despu‚s de
 *      la desasignaci¢n de los bloques sin uso, todos los bloques todav¡a
 *      activos son marcados con la bandera "usado" as¡ nosotros podemos
 *      invertir el significado de esta bandera al estado "sin uso" en la
 *      pr¢xima recoleci¢n.
 *      Todos los bloques de memoria nuevos ¢ sin bloquear son autom tica-
 *      mente marcados como "sin uso" usando la bandera actual, lo cual
 *      asegura que todos los bloques de memoria son marcados con la misma
 *       bandera antes de que la etapa de barrido comience.
 *
 *      Ver hb_gcCollectAll() y hb_gcItemRef()
 *
 *
 *      Llamando al recolector de memoria desde c¢digo Harbour
 *      ------------------------------------------------------
 *
 *      El RM puede ser llamado directamente desde un programa en Harbour.
 *      Esto es £til en situaciones donde no hay estados inactivos
 *      disponibles ¢ la aplicaci¢n esta trabajando en un bucle sin
 *      interacci¢n con el usuario y hay muchas asignaciones de memoria.
 *      Vea HB_GCALL() por una explicaci¢n de como llamar a esta funci¢n
 *      desde el c¢digo de Harbour.
 *  $SEEALSO$
 *      hb_gcAlloc(),hb_gcFree(),hb_gcLockItem(),hb_gcUnlockItem(),hb_gcCollectAll(),hb_gcItemRef(),HB_GCALL(),HB_IDLESTATE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_gcAlloc()
 *  $CATEGORY$
 *      Colector de memoria
 *  $ONELINER$
 *      Asigna memoria que ser  recolectada por el recolector de memoria.
 *  $SYNTAX$
 *      #include 
 *      void *hb_gcAlloc( ULONG ulSize, HB_GARBAGE_FUNC_PTR pCleanupFunc );
 *  $ARGUMENTS$
 *        es el tama¤o solicitado del bloque de memoria.
 *
 *       es un Puntero a la funci¢n HB_GARBAGE_FUNC que ser 
 *                     llamada directamente antes de la liberaci¢n del bloque
 *                     de memoria sin uso ¢ NULL. Esta funci¢n deber¡a
 *                     liberar toda otra memoria asignada y almacenada dentro
 *                     del bloque de memoria.
 *      Por ejemplo, esta libera todos los items almacenados dentro del array
 *      La funci¢n recibe un s¢lo par metro: el puntero a la memoria asignada
 *      por hb_gcAlloc().
 *  $RETURNS$
 *      Devuelve un puntero a la memoria asignada ¢ esta generar  un error
 *      interno irrecuperable.
 *  $DESCRIPTION$
 *      hb_gcAlloc() es usada para asignar la memoria que ser  rastreada por
 *      el RM. Este permite una apropiada liberaci¢n de memoria en el caso
 *      de variables auto-referenciadas ¢ con referencias cruzadas a nivel
 *      de Harbour.
 *      La memoria asignada con esta funci¢n deber¡a ser liberada con la
 *      funci¢n hb_gcFree() ¢ esta ser  autom ticamente desasignada por el
 *      RM si no esta bloqueada ¢ si no esta referenciada por alguna
 *      variable a nivel de Harbour.
 *  $EXAMPLES$
 *      Vea  ../source/vm/arrays.c
 *
 *     PHB_BASEARRAY pArr = (PHB_BASEARRAY) :
 *                           hb_gcAlloc( sizeof( HB_BASEARRAY), ;
 *                                       hb_arrayReleaseGarbage );
 *  $STATUS$
 *      C
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Archivo fuente: ../source/vm/garbage.c
 *  $SEEALSO$
 *      hb_gcFree(),hb_gcLockItem(),hb_gcUnlockItem()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_gcFree()
 *  $CATEGORY$
 *      Colector de memoria
 *  $ONELINER$
 *      Libera la memoria que fu‚ asignada con hb_gcAlloc().
 *  $SYNTAX$
 *      void hb_gcFree( void *pMemoryPtr );
 *  $ARGUMENTS$
 *       es el puntero a la memoria a liberar. Este puntero de
 *                   memoria debe ser asignado con la funci¢n hb_gcAlloc().
 *  $RETURNS$
 *      Nada.
 *  $DESCRIPTION$
 *      La funci¢n hb_gcFree() es usada para liberar la memoria que fu‚
 *      asignada con la funci¢n hb_gcAlloc().
 *  $EXAMPLES$
 *      Vea ../source/vm/arrays.c
 *      hb_gcFree( (void *) pBaseArray );  // puntero al array a liberar
 *  $STATUS$
 *      C
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Archivo fuente: ../source/vm/garbage.c
 *  $SEEALSO$
 *      hb_gcAlloc(),hb_gcLockItem(),hb_gcUnlockItem()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_gcLockItem()
 *  $CATEGORY$
 *      Colector de memoria
 *  $ONELINER$
 *      Bloquea la memoria para prevenir la desasignaci¢n por el RM.
 *  $SYNTAX$
 *      void hb_gcLockItem( HB_ITEM_PTR pItem );
 *  $ARGUMENTS$
 *        es el puntero a la estructura item que ser  bloqueada.
 *               El item pasado puede ser de cualquier tipo de datos, aunque
 *               arrays de objetos y bloques de c¢digos son bloqueados
 *               solamente. Otros tipos de datos no necesitan bloqueo, as¡
 *               que ellos son simplemente ignorados.
 *  $RETURNS$
 *      Nada.
 *  $DESCRIPTION$
 *      La funci¢n hb_gcLockItem() es usada para bloquear el puntero de
 *      memoria almacenado en la estructura item pasada. Este suprime la
 *      liberaci¢n de memoria si el RM no encuentra alguna referencia a
 *      este puntero.
 *      El RM almacena un contador de bloqueo y cada llamada a esta funci¢n
 *      incrementa el contador. El item es bloqueado si el contador es mayor
 *      que cero.
 *  $EXAMPLES$
 *      Vea ../source/rtl/setkey.c
 *      // bloquea un codeblock para prevenir la liberaci¢n por el RM
 *      hb_gcLockItem( sk_list_tmp-> pAction );
 *  $STATUS$
 *      C
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Archivo fuente: ../source/vm/garbage.c
 *  $SEEALSO$
 *      hb_gcAlloc(),hb_gcFree(),hb_gcUnlockItem()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_gcUnlockItem()
 *  $CATEGORY$
 *      Colector de memoria
 *  $ONELINER$
 *      Desbloquea la memoria para prevenir la liberaci¢n por el RM
 *  $SYNTAX$
 *      void hb_gcUnlockItem( HB_ITEM_PTR pItem );
 *  $ARGUMENTS$
 *        es el puntero a la estructura item que ser  bloqueada.
 *               El item pasado puede ser de cualquier tipo de datos, aunque
 *               arrays de objetos y bloques de c¢digos son bloqueados
 *               solamente. Otros tipos de datos no necesitan bloqueo as¡
 *               que ellos son simplemente ignorados.
 *  $RETURNS$
 *      Nada.
 *  $DESCRIPTION$
 *      La funci¢n hb_gcUnlockItem() es usada para desbloquear el puntero de
 *      memoria almacenado en la estructura item pasada, que fu‚ previamente
 *      bloqueada con una llamada a hb_gcLockItem(). Esto permite liberar
 *      la memoria durante la recolecci¢n de memoria sin uso si el RM no
 *      encuentra ninguna referencia a este puntero. El RM almacena el
 *      contador de bloqueo, cada llamda a esta funci¢n decrementa el
 *      contador.
 *      Esta funci¢n no libera la memoria almacenada dentro del item,
 *      la memoria debe ser desasignada sin embargo durante la recoleci¢n
 *      de memoria sin uso m s cercana, si el contador de bloqueo es
 *      igual a cero y el puntero de memoria no es referenciado por
 *      ninguna variable a nivel de Harbour.
 *  $EXAMPLES$
 *      Vea ../source/rtl/setkey.c
 *      hb_gcUnlockItem( sk_list_tmp-> pAction );  // libera el item
 *  $STATUS$
 *      C
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Archivo fuente: ../source/vm/garbage.c
 *  $SEEALSO$
 *      hb_gcAlloc(),hb_gcFree(),hb_gcLockItem()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_gcCollectAll()
 *  $CATEGORY$
 *      Colector de memoria
 *  $ONELINER$
 *      Examina todos los bloques de memoria y libera la memoria sin uso.
 *  $SYNTAX$
 *      void hb_gcCollectAll( void );
 *  $ARGUMENTS$
 *      Ninguno.
 *  $RETURNS$
 *      Nada.
 *  $DESCRIPTION$
 *      Esta funci¢n examina la pila de evaluaci¢n, las tablas de memvars,
 *      el array de variables est ticas y las tablas de clases creadas en
 *      busca de bloques de memoria referenciados. Despu‚s de examinar todos
 *      los bloques de memoria sin uso y los bloques que no estan bloqueados,
 *      son liberados.
 *  $STATUS$
 *      C
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Archivo fuente: ../source/vm/garbage.c
 *  $SEEALSO$
 *      hb_gcAlloc(),hb_gcFree(),hb_gcLockItem(),hb_gcUnlockItem()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_gcItemRef()
 *  $CATEGORY$
 *      Colector de memoria
 *  $ONELINER$
 *      Marca la memoria para prevenir la desasignaci¢n por el RM.
 *  $SYNTAX$
 *      void hb_gcItemRef( HB_ITEM_PTR pItem );
 *  $ARGUMENTS$
 *        es el puntero a la estructura item que ser  examinada.
 *               El item pasado puede ser de cualquier tipo de datos, aunque
 *               arrays de objetos y bloques de c¢digos son bloqueados
 *               solamente. Otros tipos de datos no necesitan bloqueo as¡
 *               que ellos son simplemente ignorados.
 *  $RETURNS$
 *      Nada.
 *  $DESCRIPTION$
 *      El recolector de memoria usa la funci¢n hb_gcItemRef() durante la
 *      inspecci¢n de punteros de memoria referenciados.
 *      Esta funci¢n chequea el tipo del item pasado y examina recursivamente
 *      todos los otros bloques de memoria referenciados por este item, si
 *      ‚ste es un array un objeto ¢ un bloque de c¢digo
 *
 *      NOTA: Esta funci¢n es reservada para el recolector de memoria (RM)
 *            solamente. Esta NO debe ser llamada desde el c¢digo del usuario
 *            llamarla puede causar resultados impredecibles (bloques de
 *            memoria referenciados por el item pasado pueden ser liberados
 *            prematuramente durante la recoleci¢n de memoria m s cercana).
 *  $STATUS$
 *      C
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Archivo fuente: ../source/vm/garbage.c
 *  $SEEALSO$
 *      hb_gcAlloc(),hb_gcFree(),hb_gcLockItem(),hb_gcUnlockItem()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HB_GCALL()
 *  $CATEGORY$
 *      Colector de memoria
 *  $ONELINER$
 *      Inspecciona la memoria y libera los bloques de memoria sin uso
 *  $SYNTAX$
 *      HB_GCALL()
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      NIL
 *  $DESCRIPTION$
 *      Esta funci¢n libera todos los bloques de memoria que son considerados
 *      como "basura".
 *  $STATUS$
 *      Harbour
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Archivo fuente: ../source/vm/garbage.c
 *  $SEEALSO$
 *      hb_gcCollectAll()
 *  $END$
 */  


c:\harbour\doc\es\gnulice.txt
/*
 * $Id: gnulice.txt 6075 2003-07-13 18:08:15Z alex_degarate $
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Licencia GNU
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Licencia GNU Parte 1
 *  $DESCRIPTION$
 *
 *      GNU General Public License  
 *      Licencia P£blica General
 *      Versi¢n 2, Junio de 1991  
 *
 *      Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA  
 *
 *      -----------------------------------------------------------------
 *
 *      Traducci¢n al Espa¤ol : Diciembre de 2001 por
 *      Jos‚ Mar¡a Sar chaga Fischer 
 *      Contribuciones:
 *      13-Dic-2002 Fabi n Rodr¡guez   
 *         Ene 2003 Alejandro de G rate 
 *
 *      This is an unofficial translation of the GNU General Public
 *      License into spanish. It was not published by the Free Software
 *      Foundation, and does not legally state the distribution terms for
 *      software that uses the GNU GPL--only the original English text of
 *      the GNU GPL does that. However, we hope that this translation
 *      will help spanish speakers understand the GNU GPL better.
 *
 *      -----------------------------------------------------------------
 *
 *      Esta es una traducci¢n NO oficial de la "GNU General Public
 *      License" al espa¤ol. No fu‚ publicada por la "FSF Free Software
 *      Foundation", y no respalda legalmente los t‚rminos de
 *      distribuci¢n del software que utiliza la "GNU GPL", s¢lo el texto
 *      original en ingl‚s lo hace. Sin embargo esperamos que esta
 *      traducci¢n ayude a las personas de habla hispana a entender mejor
 *      la "GPL".
 *
 *      -----------------------------------------------------------------
 *
 *      Toda persona tiene permiso de copiar y distribuir copias fieles
 *      de este documento de licencia, pero no se permite hacer
 *      modificaciones.
 *
 *
 *      PREAMBULO
 *
 *      Los contratos de licencia de la mayor parte del software est n
 *      dise¤ados para quitarle su libertad de compartir y modificar
 *      dicho software. En contraste, la "GNU General Public License"
 *      pretende garantizar su libertad de compartir y modificar el
 *      software "libre", esto es para asegurar que el software es libre
 *      para todos sus usuarios. Esta licencia p£blica general se aplica
 *      a la mayor¡a del software de la "FSF Free Software Foundation"
 *      (Fundaci¢n para el Software Libre) y a cualquier otro programa de
 *      software cuyos autores as¡ lo establecen. Algunos otros programas
 *      de software de la Free Software Foundation est n cubiertos por la
 *      "LGPL Library General Public License" (Licencia P£blica General
 *      para Librer¡as), la cual puede aplicar a sus programas tambi‚n.
 *
 *      Cuando hablamos de software libre, nos referimos a libertad, no
 *      precio. Nuestras licencias "General Public Licenses" est n
 *      dise¤adas para asegurar que:
 *
 *        1. usted tiene la libertad de distribuir copias del software
 *           libre (y cobrar por ese sencillo servicio si as¡ lo desea)
 *        2. recibir el c¢digo fuente (o tener la posibilidad de obtenerlo
 *           si as¡ lo desea)
 *        3. que usted puede modificar el software o utilizar partes de
 *           ‚l en nuevos programas de software libre
 *        4. que usted est‚ enterado de que tiene la posibilidad de hacer
 *           todas estas cosas.
 *
 *      Para proteger sus derechos, necesitamos hacer restricciones que
 *      prohiban a cualquiera denegarle estos derechos o a pedirle que
 *      renuncie a ellos. Estas restricciones se traducen en algunas
 *      responsabilidades para usted, si distribuye copias del software,
 *      ¢ si lo modifica.
 *
 *      Por ejemplo, si usted distribuye copias de un programa, ya sea
 *      gratuitamente o por alg£n importe, usted debe dar al que recibe
 *      el software todos los derechos que usted tiene sobre el mismo.
 *      Debe asegurarse tambi‚n que reciban el c¢digo fuente o bi‚n que
 *      puedan obtenerlo si lo desean. Y por £ltimo debe mostrarle a esa
 *      persona estos t‚rminos, para que conozca los derechos de que goza.
 *
 *      Nosotros protegemos sus derechos en 2 pasos: (1) protegiendo los
 *      derechos de autor del software y (2) ofreciendole este contrato
 *      de licencia que le otorga permiso legal para copiar, distribuir
 *      y modificar el software.
 *
 *      Adem s, para la protecci¢n de los autores de software y la
 *      nuestra, queremos asegurarnos de que toda persona entienda que no
 *      existe ninguna garant¡a del software libre. Si el software es
 *      modificado por alguien y lo distribuye, queremos que quienes lo
 *      reciban sepan que la copia que obtuvieron no es la original, por
 *      lo que cualquier problema provocado por quien realiz¢ la
 *      modificaci¢n no afectar  la reputaci¢n del autor original.
 *
 *      Finalmente, cualquier programa de software libre es constantemente
 *      amenazado por las patentes de software. Deseamos evadir el peligro
 *      de que los re-distribuidores de un programa de software libre
 *      obtenga individualmente los derechos de patente con el fin de
 *      volver dicho programa propietario. Para prevenir esto, hemos
 *      dejado en claro que cualquier patente deber  ser licenciada para
 *      el uso libre de toda persona o que no est‚ licenciada del todo.
 *
 *      A continuaci¢n se describen con precisi¢n los t‚rminos y
 *      condiciones para copiar, distribuir y modificar el software.
 *
 *      -----------------------------------------------------------------
 *
 *
 *      TERMINOS Y CONDICIONES PARA COPIA, MODIFICACION Y DISTRIBUCION
 *
 *      0. Esta licencia aplica a cualquier programa o trabajo que
 *      contenga una nota puesta por el propietario de los derechos del
 *      trabajo estableciendo que su trabajo puede ser distribuido bajo
 *      los t‚rminos de esta "GPL General Public License".
 *      El "Programa", utilizado en lo subsecuente, se refiere a
 *      cualquier programa o trabajo original, y el "trabajo basado en
 *      el Programa" significa ya sea el Programa o cualquier trabajo
 *      derivado del mismo bajo la ley de derechos de autor: es decir,
 *      un trabajo que contenga el Programa o alguna porci¢n de ‚l, ya
 *      sea ¡ntegra o con modificaciones y/o traducciones a otros idiomas.
 *      De aqu¡ en adelante "traducci¢n" estar  incluida (pero no
 *      limitada a) en el t‚rmino "modificaci¢n", y la persona a la que
 *      se aplique esta licencia ser  llamado "usted".
 *
 *      Otras actividades que no sean copia, distribuci¢n o
 *      modificaci¢n no est n cubiertas en esta licencia y est n fuera de
 *      su alcance. El acto de ejecutar el programa no est  restringido,
 *      y la salida de informaci¢n del programa est  cubierta s¢lo si su
 *      contenido constituye un trabajo basado en el Programa (es
 *      independiente de si fue resultado de ejecutar el programa). Si
 *      esto es cierto ¢ no depende de la funci¢n del programa.
 *
 *
 *      1. Usted puede copiar y distribuir copias fieles del c¢digo
 *      fuente del programa tal como lo recibi¢, en cualquier medio,
 *      siempre que proporcione de manera conciente y apropiada una nota
 *      de derechos de autor y una declaraci¢n de no garant¡a, adem s de
 *      mantener intactas todas las notas que se refieran a esta licencia
 *      y a la ausencia de garant¡a, y que le proporcione a las dem s
 *      personas que reciban el programa una copia de esta licencia junto
 *      con el Programa.
 *      Usted puede aplicar un cargo por el acto f¡sico de transferir una
 *      copia, y ofrecer protecci¢n de garant¡a por una cuota, lo cual no
 *      compromete a que el autor original del Programa responda por tal
 *      efecto.
 *
 *
 *      2. Usted puede modificar su copia del Programa o de cualquier
 *      parte de el, formando as¡ un trabajo basado en el Programa, y
 *      copiar y distribuir tales modificaciones o bi‚n trabajar bajo los
 *      t‚rminos de la secci¢n 1 arriba descrita, siempre que cumpla con
 *      las siguientes condiciones:
 *
 *       A. Usted debe incluir en los archivos modificados notas
 *          declarando que modific¢ dichos archivos y la fecha de los
 *          cambios.
 *       B. Usted debe notificar que ese trabajo que distribuye contiene
 *          totalmente o en partes al Programa, y que debe ser licenciado
 *          como un conjunto sin cargo alguno a cualquier otra persona
 *          que reciba sus modificaciones bajo los t‚rminos de esta
 *          Licencia.
 *       C. Si el programa modificado lee normalmente comandos
 *          interactivamente cuando es ejecutado, usted debe presentar un
 *          aviso, cuando el programa inicie su ejecuci¢n en ese modo
 *          interactivo de la forma m s ordinaria, que contenga una nota
 *          de derechos de autor y un aviso de que no existe garant¡a
 *          alguna (o que s¡ existe si es que usted la proporciona) y que
 *          los usuarios pueden redistribuir el programa bajo esas
 *          condiciones, e informando al usuario como puede ver una copia
 *          de esta Licencia. (Excepci¢n: si el programa en s¡ es
 *          interactivo pero normalmente no muestra notas, su trabajo
 *          basado en el Programa no tiene la obligaci¢n de mostrar tales
 *          notas)
 *
 *      Estos requerimientos aplican al trabajo modificado como un todo.
 *      Si existen secciones identificables de tal trabajo que no son
 *      derivadas del Programa original, y pueden ser razonablemente
 *      consideradas trabajos separados e independientes como tal,
 *      entonces esta Licencia y sus t‚rminos no aplican a dichas
 *      secciones cuando usted las distribuye como trabajos separados.
 *      Pero cuando usted distribuye las mismas secciones como parte de
 *      un todo, que es un trabajo basado en el Programa, la distribuci¢n
 *      del conjunto debe ser bajo los t‚rminos de esta Licencia, cuyos
 *      permisos para otras personas que obtengan el software se
 *      extienden para todo el software, as¡ como para cada parte de ‚l,
 *      independientemente de qui‚n lo escribi¢.
 *
 *      No es la intenci¢n de esta secci¢n de reclamar derechos o pelear
 *      sus derechos sobre trabajos hechos enteramente por usted, en lugar
 *      de eso, la intenci¢n es ejercer el derecho de controlar la
 *      distribuci¢n de los trabajos derivados o colectivos basados en el
 *      Programa.
 *
 *      Adicionalmente, el simple agregado de otro trabajo NO basado en
 *      el Programa al Programa en cuesti¢n (o a un trabajo basado en el
 *      Programa) en alg£n medio de almacenamiento no pone el otro
 *      trabajo bajo el alcance de esta Licencia.
 *
 *
 *      3. Usted puede copiar y distribuir el Programa (¢ un trabajo
 *      basado en ‚l, bajo la Secci¢n 2) en c¢digo objeto ¢ en forma
 *      de ejecutable bajo los t‚rminos de las secciones 1 y 2 arriba
 *      descritas siempre que cumpla los siguientes requisitos:
 *
 *       A. Acompa¤arlo con el correspondiente c¢digo fuente legible por
 *          la m quina, que debe ser distribu¡do bajo los t‚rminos de las
 *          secciones 1 y 2 y en un medio comunmente utilizado para el
 *          intercambio de software, ¢
 *       B. Acompa¤arlo con una oferta escrita, v lida por al menos 3
 *          a¤os y para cualquier persona, por un cargo no mayor al costo
 *          que conlleve la distribuci¢n f¡sica del c¢digo fuente
 *          correspondiente en un medio comunmente utilizado para el
 *          intercambio de software, ¢
 *       C. Acompa¤arlo con la informaci¢n que usted recibi¢ sobre la
 *          oferta de distribuci¢n del c¢digo fuente correspondiente.
 *          (Esta alternativa est  permitida s¢lo para distribuci¢n
 *          no-comercial y s¢lo si usted recibi¢ el Programa en c¢digo
 *          objeto o en forma de ejecutable con tal oferta de acuerdo
 *          a la subsecci¢n b anterior)
 *
 *      El c¢digo fuente de un trabajo significa la forma preferida de
 *      hacer modificaciones al mismo. Para un trabajo ejecutable, un
 *      c¢digo fuente completo significa todo el c¢digo fuente de todos
 *      los m¢dulos que contiene, m s cualquier archivo de definici¢n de
 *      interfases, m s los programas utilizados para controlar la
 *      compilaci¢n y la instalaci¢n del ejecutable.
 *      Sin embargo, como excepci¢n especial, no se requiere que el
 *      c¢digo fuente distribu¡do incluya cualquier cosa que no sea
 *      normalmente distribu¡da con las componentes mayores (compilador,
 *      kernel, etc.) del sistema operativo en el cual el ejecutable
 *      corre, a menos de que una componente en particular acompa¤e al
 *      ejecutable.
 *
 *      Si la distribuci¢n del ejecutable ¢ del c¢digo objeto se hace
 *      ofreciendo acceso a copiar desde un lugar designado, entonces el
 *      ofrecer acceso equivalente para copiar el c¢digo fuente desde el
 *      mismo lugar se considera distribuci¢n del c¢digo fuente, aunque
 *      las dem s personas no copien el c¢digo fuente junto con el c¢digo
 *      objeto.
 *
 *
 *      4. Usted no puede copiar, modificar, sub-licenciar ni distribuir
 *      el Programa a menos que sea expresamente bajo esta Licencia, de
 *      otra forma cualquier intento de copiar, modificar, sub-licenciar
 *      ¢  distribuir el programa es nulo, y autom ticamente causar  la
 *      p‚rdida de sus derechos bajo esta Licencia. Sin embargo, cualquier
 *      persona que haya recibido copias ¢ derechos de usted bajo esta
 *      Licencia no ver n terminadas sus Licencias ni sus derechos
 *      perdidos mientras ellas contin£en cumpliendo los t‚rminos de
 *      esta Licencia.
 *
 *
 *      5. Usted no est  obligado a aceptar esta Licencia, dado que no la
 *      ha firmado. Sin embargo, nada le otorga el permiso de modificar ¢
 *      distribuir el Programa ni sus trabajos derivados. Estas acciones
 *      est n prohibidas por la ley si usted no acepta esta Licencia.
 *      Sin embargo, modificando o distribuyendo el Programa (o cualquier
 *      trabajo basado en el Programa) indica su aceptaci¢n de esta
 *      Licencia y de todos sus t‚rminos y condiciones para copiar,
 *      distribuir o modificar el Programa y/o trabajos basados en ‚l.
 *
 *
 *      6. Cada vez que usted redistribuye el Programa (o cualquier
 *      trabajo basado en el Programa), la persona que lo recibe
 *      autom ticamente recibe una licencia del autor original para
 *      copiar, distribuir o modificar el Programa sujeto a estos
 *      t‚rminos y condiciones. Usted no puede imponer ninguna
 *      restricci¢n adicional a las personas que reciban el Programa
 *      sobre los derechos que en esta Licencia se les otorga.
 *      Usted no es responsable de forzar a terceras personas en ‚l
 *      cumplimiento de esta Licencia.
 *
 *  $SEEALSO$
 *      Licencia GNU Parte 2
 *  $END$
 */

/*
 *  $DOC$
 *  $FUNCNAME$
 *     Licencia GNU Parte 2
 *  $CATEGORY$
 *     Documento
 *  $ONELINER$
 *     Licencia GNU Parte 2
 *  $DESCRIPTION$
 *
 *      7. Si como consecuencia de un veredicto de un juzgado o por el
 *      alegato de infringir una patente ¢ por cualquier otra raz¢n (no
 *      limitado s¢lo a cuestiones de patentes) se imponen condiciones
 *      sobre usted que contradigan los t‚rminos y condiciones de esta
 *      Licencia, ‚stas no le excusan de los t‚rminos y condiciones aqu¡
 *      descritos. Si usted no puede distribuir el producto cumpliendo
 *      totalmente con las obligaciones concernientes a la resoluci¢n
 *      oficial y al mismo tiempo con las obligaciones que se describen
 *      en este contrato de Licencia, entonces no podr  distribuir m s
 *      este producto. Por ejemplo, si una licencia de patente no
 *      permitir  la distribuci¢n del Programa de forma libre de
 *      regal¡as (sin pago de regal¡as) por parte de quienes lo reciban
 *      directa o indirectamente, entonces la £nica forma de cumplir con
 *      ambas obligaciones es renunciar a la distribuci¢n del mismo.
 *
 *      Si cualquier parte de esta secci¢n resulta inv lida, inaplicable
 *      ¢ no obligatoria bajo cualquier circunstancia en particular, la
 *      tendencia de esta es a aplicarse, y la secci¢n completa se
 *      aplicar  bajo otras circunstancias.
 *
 *      La intenci¢n de esta secci¢n no es la de inducirlo a infringir
 *      ninguna ley de patentes, ni tampoco infringir alg£n reclamo de
 *      derechos, ni discutir la validez de tales reclamos; esta secci¢n
 *      tiene el £nico prop¢sito de proteger la integridad del sistema de
 *      distribuci¢n del software libre, que est  implementado por
 *      pr cticas de licencia p£blica. Mucha gente ha hecho generosas
 *      contribuciones a la amplia gama de software distribuido bajo este
 *      sistema favoreciendo as¡ la constante aplicaci¢n de este sistema
 *      de distribuci¢n; es decisi¢n del autor/donador si su Programa
 *      ser  distribu¡do utilizando este u otro sistema de distribuci¢n,
 *      y la persona que recibe el software no puede obligarlo a hacer
 *      ninguna elecci¢n en particular.
 *      Esta secci¢n pretende dejar muy en claro lo que se cree que ser 
 *      una consecuencia del resto de esta Licencia.
 *
 *
 *      8. Si la distribuci¢n y/o el uso del Programa se restringe a
 *      algunos pa¡ses ya sea por patentes, interfases protegidas por
 *      derechos de autor, el propietario original de los derechos de
 *      autor que ubica su Programa bajo esta Licencia puede agregar una
 *      restricci¢n geogr fica de distribuci¢n expl¡cita excluyendo
 *      los pa¡ses que aplique, dando como resultado que su distribuci¢n
 *      s¢lo se permita en los pa¡ses no exclu¡dos. En tal caso, esta
 *      Licencia incorpora la limitaci¢n como si hubiera sido escrita en
 *      el cuerpo de esta misma Licencia.
 *
 *
 *      9. La "FSF Free Software Foundation" puede publicar versiones
 *      nuevas o revisadas de la "GPL General Public License" de uno a
 *      otro momento. Estas nuevas versiones mantendr n el esp¡ritu de la
 *      presente versi¢n, pero pueden diferir en la inclusi¢n de nuevos
 *      problemas ¢ en la manera de tocar los problemas ¢ aspectos ya
 *      presentes.
 *
 *      Cada versi¢n tendr  un n£mero de versi¢n que la distinga. Si el
 *      Programa especifica un n£mero de versi¢n para esta Licencia que
 *      aplique a ‚l y "cualquier versi¢n subsecuente", usted tiene la
 *      opci¢n de seguir los t‚rminos y condiciones de dicha versi¢n o de
 *      cualquiera de las posteriores versiones publicadas por la "FSF".
 *      Si el programa no especifica una versi¢n en especial de esta
 *      Licencia, usted puede elegir entre cualquiera de las versiones
 *      que han sido publicadas por la "FSF".
 *
 *
 *      10. Si usted desea incorporar partes del Programa en otros
 *      Programas de software libre cuyas condiciones de distribuci¢n
 *      sean distintas, deber  escribir al autor solicitando su
 *      autorizaci¢n. Para programas de software protegidas por la "FSF
 *      Free Software Foundation", deber  escribir a la "FSF" solicitando
 *      autorizaci¢n, en ocasiones hacemos excepciones. Nuestra decisi¢n
 *      ser  guiada por dos metas principales:
 *
 *       A. mantener el estado de libertad de todos los derivados de
 *          nuestro software libre
 *       B. promover el uso comunitario y compartido del software en
 *          general
 *
 *
 *
 *      NO EXISTE GARANTIA ALGUNA
 *      -----------------------------------------------------------------
 *
 *      11. DEBIDO A QUE EL PROGRAMA SE OTORGA LIBRE DE CARGOS Y REGALIAS,
 *      NO EXISTE NINGUNA GARANTIA PARA EL MISMO HASTA DONDE LO PERMITA
 *      LA LEY APLICABLE. A EXCEPCION DE QUE SE INDIQUE OTRA COSA, LOS
 *      PROPIETARIOS DE LOS DERECHOS DE AUTOR PROPORCIONAN EL PROGRAMA
 *      "COMO ESTA" SIN NINGUNA GARANTIA DE NINGUN TIPO, YA SEA EXPLICITA
 *      O IMPLICITA, INCLUYENDO, PERO NO LIMITADA A, LAS GARANTIAS QUE
 *      IMPLICA EL MERCADEO Y EJERCICIO DE UN PROPOSITO EN PARTICULAR.
 *      CUALQUIER RIESGO DEBIDO A LA CALIDAD Y DESEMPEÑO DEL PROGRAMA ES
 *      TOMADO COMPLETAMENTE POR USTED. SI EL SOFTWARE MUESTRA ALGUN
 *      DEFECTO, USTED CUBRIRA LOS COSTOS DE CUALQUIER SERVICIO,
 *      REPARACION O CORRECCION DE SUS EQUIPOS Y/O SOFTWARE QUE REQUIERA.
 *
 *      12. EN NINGUN CASO NI BAJO NINGUNA CIRCUNSTANCIA EXCEPTO BAJO
 *      SOLICITUD DE LA LEY O DE COMUN ACUERDO POR ESCRITO, NINGUN
 *      PROPIETARIO DE LOS DERECHOS DE AUTOR NI TERCERAS PERSONAS QUE
 *      PUDIERAN MODIFICAR Y/O REDISTRIBUIR EL PROGRAMA COMO SE PERMITE
 *      ARRIBA, SERAN RESPONSABLES DE LOS DAÑOS CORRESPONDIENTES AL USO
 *      O IMPOSIBILIDAD DE USAR EL PROGRAMA, SIN IMPORTAR SI SON DAÑOS
 *      GENERALES, ESPECIALES, INCIDENTALES O CONSEQUENTES
 *      CORRESPONDIENTES AL USO O IMPOSIBILIDAD DE USAR EL PROGRAMA
 *      (INCLUYENDO PERO NO LIMITADO A LA PERDIDA DE INFORMACION O
 *      DETERIORO DE LA MISMA AFECTANDOLO A USTED, A TERCERAS PERSONAS
 *      QUE SEA POR FALLAS EN LA OPERACION DEL PROGRAMA O SU INTERACCION
 *      CON OTROS PROGRAMAS) INCLUSIVE SI TAL PROPIETARIO U OTRAS
 *      PERSONAS HAYAN SIDO NOTIFICADAS DE TALES FALLAS Y DE LA
 *      POSIBILIDAD DE TALES DAÑOS.
 *
 *
 *      FIN DE TERMINOS Y CONDICIONES
 *
 *      -----------------------------------------------------------------
 *
 *
 *      Apendice: C¢mo aplicar estos t‚rminos a sus nuevos programas ?
 *
 *      Si usted desarrolla un nuevo Programa y desea que sea lo m s
 *      p£blico posible, el mejor modo de hacerlo es haciendolo Software
 *      Libre donde toda persona lo puede redistribuir y cambiar bajo
 *      estos t‚rminos.
 *
 *      Para hacer esto, agregue las siguientes notas al programa.
 *      Es m s seguro agregarlas al inicio de cada archivo del c¢digo
 *      fuente para notificar de manera m s efectiva la ausencia de
 *      garant¡a; y cada archivo debe de contener al menos la l¡nea de
 *      "Copyright" o derechos de autor y una referencia de donde se
 *      puede encontrar la nota completa.
 *      ejemplo:
 *
 *      Una l¡nea que contenga el nombre del programa y una idea de lo
 *      que hace.
 *      Copyright (C)  
 *
 *      Este programa es Software Libre; usted puede redistribuirlo
 *      y/o modificarlo bajo los t‚rminos de la "GNU General Public
 *      License" como lo publica la "FSF Free Software Foundation",
 *      ¢ (a su elecci¢n) de cualquier versi¢n posterior.
 *
 *      Este programa es distribuido con la esperanza de que le ser 
 *      £til, pero SIN NINGUNA GARANTIA; incluso sin la garant¡a
 *      impl¡cita por el MERCADEO o EJERCICIO DE ALGUN PROPOSITO en
 *      particular. Vea la "GNU General Public License" para m s
 *      detalles.
 *
 *      Usted debe haber recibido una copia de la "GNU General Public
 *      License" junto con este programa, si no, escriba a la "FSF
 *      Free Software Foundation, Inc.", 59 Temple Place - Suite 330,
 *      Boston, MA  02111-1307, USA.
 *
 *      Adicionalmente agregue informaci¢n de c¢mo contactarle por
 *      correo electr¢nico y convencional.
 *      Si el programa es interactivo, ponga en la salida del programa
 *      una nota corta al iniciar el modo interactivo como en siguiente
 *      ejemplo:
 *
 *      Gnomovision version 69, Copyright (C)  
 *      Gnomovision no tiene NINGUNA GARANTIA, para m s detalles
 *      escriba 'show w'. Este es Software Libre, y usted est 
 *      permitido para redistribuirlo bajo ciertas condiciones;
 *      escriba 'show c' para m s detalles.
 *
 *      Estos hipoteticos comandos 'show w' y 'show c' deber n mostrar
 *      las partes apropiadas de la "GPL General Public License".
 *      Por supuesto, los comandos que utilice pueden ser distintos,
 *      pueden ser incluso "clicks" del rat¢n, opciones de men£s etc, lo
 *      m s apropiado para su programa.
 *
 *      Usted deber¡a hacer que su jefe de proyecto (si trabaja como
 *      programador) o su escuela, si aplica, firme una "declaraci¢n de
 *      derechos de autor" para el programa, si se necesita.
 *      Aqu¡ hay un ejemplo, modifique los nombres:
 *
 *          "Yoyodyne, Inc., por este medio renuncia a todo inter‚s
 *          en los derechos de autor en el programa 'Gnomovision'
 *          (lo que make pasa al compilador) escrito por James Hacker."
 *
 *           Ty Coon, 1 de Abril 1989
 *          Ty Coon, Presidente de Yoyodyne, Inc
 *
 *
 *      Esta Licencia P£blica General no permite incorporar su programa
 *      en programas propietarios. Si su programa es una librer¡a de
 *      subrutinas, puede ser m s £til permitir que se ligue en tiempo de
 *      compilaci¢n o ejecuci¢n a aplicaciones propietarias. Si esto es
 *      lo que quiere hacer, use la licencia P£blica General para
 *      Librer¡as en lugar de esta licencia.
 *
 *      Consultas y dudas sobre FSF y GNU dirigirlas a gnu@gnu.org
 *
 *      Free Software Foundation, Inc.,
 *      59 Temple Place - Suite 330, Boston, MA 02111, USA
 *      Updated: 3 Jan 2000 rms
 *
 *  $SEEALSO$
 *      Licencia,Licencia GNU
 *  $END$
 */ 



c:\harbour\doc\es\harbext.txt
/*
 * $Id: harbext.txt 6072 2003-07-13 14:51:56Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2002 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol de harbext.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Extensiones a Harbour
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Extensiones a Harbour
 *  $DESCRIPTION$
 *      Extensiones al lenguaje:
 *      ------------------------   
 *
 *      * Generaci¢n y manejo de Clases.
 *
 *        Clipper solamente permite la creaci¢n de objetos desde unas pocas
 *        clases est ndar.
 *
 *        En Harbour, Ud. puede crear sus propias Clases completas con
 *        M‚todos, Variables de Instancia, Variables de Clase y Herencia.
 *        Aplicaciones enteras pueden ser designadas y codificadas en un
 *        enfoque Orientado a Objetos.
 *
 *
 *      * @()   
 *
 *        Retorna el puntero (la direcci¢n) a la funci¢n.
 *
 *        El valor retornado no es £til a nivel de la programaci¢n de la
 *        aplicaci¢n pero es usado a bajo nivel para implementar el c¢digo
 *        Orientado a Objeto (Internamente, el m‚todo de una Clase es una
 *        funci¢n est tica, no hay un s¡mbolo para ella, entonces esta es
 *        accedida mediante su direcci¢n).
 *
 *
 *      * Clase TGetList
 *
 *        Soporte Orientado a Objetos para el manejo de GetList.
 *
 *
 *      * ProcName() soporte para el nombre de M‚todos de las Clases.
 *
 *        Los M‚todos de Clases pueden ser recuperados de la pila de llamada.
 *
 *
 *      * Memory() tiene nuevos valores de retorno.
 *
 *        Vea hbmemory.ch
 *
 *
 *      * TRANSFORM()  --> Agregado de nueva funci¢n para el formateo de
 *        cadenas:
 *
 *        @0      Hace el pad con ceros una cadena num‚rica.
 *
 *
 *      * STOD()  --> dDate
 *
 *        Nueva funci¢n que convierte una cadena en el formato yyyymmdd a
 *        valor de fecha (date).
 *
 *
 *      * Declaraci¢n STRONG TYPE Opcional en tiempo de compilaci¢n (y
 *        advertencias en tiempo de compilaci¢n de TYPE MISMATCH)
 *
 *        Example: LOCAL/STATIC Variable AS ...
 *
 *
 *      * El depurador de Harbour provee de nuevas clases interesantes:
 *
 *        - La Clase TDbWindow podr¡a ser la fundaci¢n de una ventana de
 *          visualizaci¢n multiplatforma.
 *
 *        - La Clase TForm
 *
 *        - La Clase TDbMenu implementa ambos men£es desplegables y
 *          (pulldown & popup)
 *
 *
 *      Funcionalidad mejorada de la RTL:   
 *      ---------------------------------
 *
 *      - DIRECTORY( , ,  )
 *
 *        El tercer par metro es un par metro de Harbour (opcional) e indica
 *        que en aquellas plataformas que soportan nombres largos de archivo,
 *        Ud. solicita lo que podr¡a considerarse el equivalente al nombre
 *        8.3 Podr¡a afectar ADIR() y DIR si ellas fueron modificadas para
 *        tomar ventaja de esto. Esta retornar  nombres largos si el sistema
 *        operativo lo soporta.
 *
 *
 *      - HB_DISKSPACE( ,  )
 *
 *        El segundo par metro es un par metro de Harbour (opcional) e indica
 *        el tipo de informaci¢n del disco que esta siendo requerida.
 *        vea en ../doc/es/diskspac.txt para mayor informaci¢n.
 *
 *  $END$
 */  


c:\harbour\doc\es\hbpplib.txt
/*
 * $Id: hbpplib.txt 9190 2008-08-19 10:50:19Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Felipe Coury 
 *   Documentaci¢n en Ingl‚s
 *
 * Copyright 2001 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol de hbpplib.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


LIBRERIA DE PREPROCESAMIENTO DE HARBOUR EN TIEMPO DE EJECUCION
==============================================================

C¢mo crear hbpp.lib
===================

Este archivo deber¡a contener prreproc.c, hbpplib32, bldhbpp.bat,
testpre.prg, bld32exe.bat y hbpplib.txt (este archivo).

En orden de crear y testear esta librer¡a, Ud. deber¡a poner:
(suponiendo que el directorio de trabajo sea HARBOUR)

- preproc.c   en el directorio \harbour\source\hbpp ;
- hbpplib.b32 y bldhbpp.bat en el directorio \harbour ;
- testpre.prg y bld32exe.bat en el directorio \harbour\tests\working ;
- hbpplib.txt en el directorio \harbour\doc ;

Entonces, Ud. necesita correr bldhbpp.bat para crear hbpp.lib sobre
el directorio \harbour\libs\b32. Note que por ahora el £nico makefile 
es para compilar con los compiladores de Borland. 
Se solicita a quienes tienen otros compiladores/entornos colaboren
escribiendo los makefiles faltantes. Gracias.

Para testear testpre.prg Ud. s¢lo necesita ir al subdirectorio
harbour\test\working y hacerlo usando TESTPRE.
c:\harbour\doc\es\hb_apiln.txt
/*
 * $Id: hb_apiln.txt 7254 2007-04-18 22:15:17Z druzus $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org 
 * 
 * Copyright 2003 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *   Readme, Archivo de cabecera para la API de Idiomas
 *   hb_langRegister(), hb_langDeRegister(), hb_langFind(), hb_langFindPos(),
 *   hb_langSelect(), hb_langSelectID(), hb_langDGetItem(), hb_langID(),
 *   hb_langName(), hb_langDGetErrorDesc(), HB_LANG_REQUEST()
 *
 * Copyright 1999 Victor Szakats 
 *         Header file for the Language API
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Idiomas Soportados
 *  $CATEGORY$
 *      Documentaci¢n
 *  $ONELINER$
 *      L‚ame con las caracter¡sticas del manejo de Idiomas en Harbour
 *  $DESCRIPTION$
 *      Introducci¢n
 *      El m¢dulo de idiomas esta compuesto por una estructura de items que
 *      permite el uso de distintos Idiomas con Harbour de una forma
 *      unificada. Actualmente se definen un m ximo de 64 Idiomas.
 *      #define HB_LANG_MAX_ 64       // en ../source/rtl/langapi.c
 *
 *      Se define tambi‚n un array que contiene los idiomas soportados.
 *      static PHB_LANG s_langList[ HB_LANG_MAX_ ];
 *
 *      Todos los idiomas comparten una estructura com£n que facilita la
 *      portabilidad. Esta estructura es del tipo est tica (s_lang) y esta
 *      definida dentro de los archivos correspondientes a cada idioma, que
 *      se encuentran en el subdirectorio ../source/rtl/lang/*.c
 *      Por ejemplo ./source/rtl/lang/msges.c        // Espa¤ol
 *
 *      Esta estructura esta definida como un array (pItemList[]) de punteros
 *      a void y consta actualmente de 116 elementos (n£meros y cadenas de
 *      caracteres) divididos en unidades tem ticas: A, B, C, D, E, F
 *       typedef struct _HB_LANG
 *       {
 *          void * pItemList[ HB_LANG_ITEM_MAX_ ];
 *       } HB_LANG, * PHB_LANG, * HB_LANG_PTR;
 *
 *      A. Identificador de Idioma [Offset 0-5]
 *      --------------------------
 *      [0] Dos caracteres ISO que caracterizan al idioma. Por ejemplo "ES"
 *          identifica al idioma espa¤ol.
 *      [1] El nombre del Idioma en Ingl‚s. Por ejemplo "Spanish".
 *      [2] El nombre del Idioma en su lengua nativa. Por ejemplo "Espa¤ol"
 *      [3] Identificaci¢n seg£n la RFC. Por ejemplo "ES"
 *      [4] P gina de C¢digos igual a las usadas en DOS y Windows.
 *          Por ejemplo 850, 437, etc.
 *      [5] N£mero de la Versi¢n en uso. Por ejemplo 1.5
 *
 *
 *      B. Nombre de meses [Offset 6-17]: "Enero", "Febrero", etc.
 *      ------------------
 *
 *      C. Nombre de los d¡as [Offset 18-24]: "Domingo", "Lunes", etc.
 *      ---------------------
 *
 *      D. Mensajes de naci¢n (natmsg) compatibles con Clipper [Offset 25-37]
 *      ---------------------
 *
 *      E. Mensajes de error
 *      --------------------
 *        - Nombre con la descripci¢n de errores [Offset 38-88]:
 *          Por ejemplo: "Error de argumento"
 *
 *        - Errores internos [Offset 89-111]:
 *          Por ejemplo: "hb_xgrab no puede asignar memoria"
 *
 *      F. Diversos textos [Offset 112-115].
 *      ------------------
 *      Cada uno de estos elementos es accedido por su posici¢n en el array.
 *
 *      Se define una macro para publicar un idioma tanto a nivel de C como
 *      de Harbour.
 *      #define HB_LANG_ANNOUNCE( id )          HB_FUNC( HB_LANG_##id ) {}
 *
 *
 *      Idioma por defecto
 *      ------------------
 *      Por defecto Harbour siempre enlaza el m¢dulo de Idioma Ingl‚s.
 *      Para setear un m¢dulo de Idioma por defecto a ser usado por Harbour
 *      se debe definir en el archivo ../include/hbsetup.h la macro
 *      HB_LANG_DEFAULT a un identificador de lenguaje v lido.
 *
 *      (Notese que este puede tambi‚n estar bajo la forma de una macro).
 *      #ifndef HB_LANG_DEFAULT
 *         #define HB_LANG_DEFAULT      EN
 *      #endif
 *
 *      Funciones
 *      ---------
 *      Harbour implementa el uso de distintos Idiomas a trav‚s de funciones
 *      de bajo nivel en lenguaje C. Las cuales se describen m s abajo
 *      Estas funciones permiten acceder a estructuras que soportan los
 *      distintos datos que componen cada Idioma, generalmente pasando
 *      punteros a esas estructuras.
 *
 *      /* Manejo de lista de lenguajes */
 *
 *       extern BOOL     hb_langRegister         ( PHB_LANG lang );
 *       extern BOOL     hb_langDeRegister       ( char * pszID );
 *       extern int      hb_langFindPos          ( char * pszID )
 *       extern PHB_LANG hb_langFind             ( char * pszID );
 *
 *
 *       /* Selecci¢n del lenguaje por defecto y b£squeda de datos */
 *
 *       extern PHB_LANG hb_langSelect           ( PHB_LANG lang );
 *       extern char *   hb_langSelectID         ( char * pszID );
 *       extern void *   hb_langDGetItem         ( int iIndex );
 *       extern char *   hb_langID               ( void );
 *       extern char *   hb_langName             ( void );
 *
 *
 *      /* Interfaz de Compatibilidad */
 *
 *      extern char *   hb_langDGetErrorDesc    ( ULONG ulIndex );
 *
 *  $SEEALSO$
 *     hb_langRegister(), hb_langDeRegister(), hb_langFind(), hb_langFindPos(),
 *     hb_langSelect(), hb_langSelectID(), hb_langDGetItem(), hb_langID(),
 *     hb_langName(), hb_langDGetErrorDesc(), HB_LANG_REQUEST()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langRegister()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Registra un Idioma por defecto.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langRegister( PHB_LANG lang ) --> ( BOOL )bResult
 *  $ARGUMENTS$
 *       es un puntero a la estructura del Idioma, que se va a
 *      registrar como idioma por defecto.
 *  $RETURNS$
 *      Retorna el valor l¢gico  indicando si fu‚ satisfactoria la
 *      operaci¢n.
 *  $DESCRIPTION$
 *      La funci¢n hb_langRegister() es una funci¢n de bajo nivel escrita
 *      en lenguaje C que permite registrar un idioma por defecto para ser
 *      usado con Harbour.
 *  $EXAMPLES$
 *      HB_LANG_ANNOUNCE( ES );
 *
 *      HB_CALL_ON_STARTUP_BEGIN( hb_lang_Init_ES )
 *         hb_langRegister( &s_lang );
 *      HB_CALL_ON_STARTUP_END( hb_lang_Init_ES )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langDeRegister, hb_langSelect(), hb_langSelectID()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langDeRegister()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Elimina un Idioma registrado.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langDeRegister( char * pszID ) --> ( BOOL )bResult
 *  $ARGUMENTS$
 *       Puntero a una cadena terminada con '\0' que contiene la
 *      identificaci¢n del idioma a ser removido.
 *  $RETURNS$
 *      Retorna el valor l¢gico  indicando si fu‚ satisfactoria la
 *      operaci¢n.
 *  $DESCRIPTION$
 *      La funci¢n hb_langDeRegister() es una funci¢n de bajo nivel en
 *      lenguaje C que permite eliminar un idioma de una lista para ser
 *      usado con Harbour.
 *      Para ello utiliza a la funci¢n hb_langFindPos( pszID ) que devuelve
 *      la posici¢n en una lista de idiomas (si existe) ¢ el valor -1 si no
 *      se pudo encontrar. Si se encontr¢ cambia su valor a NULL.
 *  $EXAMPLES$
 *      Vea langapi.c
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langRegister(), hb_langSelect(), hb_langSelectID()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langFindPos()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Busca en una lista de idiomas por un identificador de Lenguaje.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langFindPos( char * pszID ) --> int iPos
 *  $ARGUMENTS$
 *       Puntero a una cadena terminada con '\0' que contiene la
 *      identificaci¢n del idioma.
 *  $RETURNS$
 *      Retorna , la posici¢n dentro de la estructura si existe ¢ -1
 *      en caso contrario.
 *  $DESCRIPTION$
 *      La funci¢n hb_langFindPos() es una funci¢n de bajo nivel en
 *      lenguaje C que realiza la b£squeda de un identificador de idioma de
 *      una lista. Para ello compara el par metro  con la cadena de
 *      caracteres que se encuentra en la posici¢n HB_LANG_ITEM_ID_ID del
 *      array pItemList.
 *      Esta devuelve la posici¢n en una lista de idiomas (si existe) ¢ el
 *      valor -1 si no se pudo encontrar. Si se encontr¢ cambia su valor a
 *      NULL.
 *  $EXAMPLES$
 *      Vea langapi.c
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langFind(), hb_langSelectID()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langFind()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Busca en la lista de idiomas por un identificador de Lenguaje.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langFind( char * pszID ) --> ( PHB_LANG )pResult
 *  $ARGUMENTS$
 *       Puntero a una cadena terminada con '\0' que contiene la
 *      identificaci¢n del idioma.
 *  $RETURNS$
 *      Retorna un puntero  a la estructura del idioma solicitado
 *      si lo encuentra ¢ NULL en caso contrario.
 *  $DESCRIPTION$
 *      La funci¢n hb_langFind() es una funci¢n de bajo nivel en lenguaje C
 *      que realiza la b£squeda de un identificador de idioma de una lista.
 *      Para ello utiliza a la funci¢n hb_langFindPos( pszID ) que devuelve
 *      la posici¢n en una lista de idiomas (si existe) ¢ el valor -1 si no
 *      se pudo encontrar.
 *      Si se encontr¢ hb_langFind() devuelve un puntero a esa estructura
 *      ¢ NULL si no se encontr¢.
 *  $EXAMPLES$
 *      Vea langapi.c
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langFindPos(), hb_langID(), hb_langSelectID()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langSelect()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Selecciona un m¢dulo de mensajes espec¡fico a una nacionalidad.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langSelect( PHB_LANG lang ) --> ( PHB_LANG )pResult
 *  $ARGUMENTS$
 *       es un puntero a la estructura del nuevo Idioma que se esta
 *      tratando de seleccionar.
 *  $RETURNS$
 *      Retorna un puntero  a la estructura del Idioma actualmente
 *      en uso, antes de establecer el nuevo idioma solicitado .
 *  $DESCRIPTION$
 *      La funci¢n hb_langSelect() es una funci¢n de bajo nivel en lenguaje
 *      C que establece un nuevo idioma para su uso a trav‚s del pasaje de
 *      un puntero a la estructura del nuevo Idioma. Si el puntero no es
 *      v lido la funci¢n no hace nada.
 *  $EXAMPLES$
 *      Vea langapi.c
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langSelectID(), hb_langID(), hb_langRegister()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langSelectID()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Selecciona un m¢dulo de mensajes correspondiente a un Idioma.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langSelectID( char * pszID ) --> ( char * )pszResult
 *  $ARGUMENTS$
 *       Puntero a una cadena terminada con '\0' que contiene la
 *      identificaci¢n del idioma.
 *  $RETURNS$
 *
 *  $DESCRIPTION$
 *      La funci¢n
 *  $EXAMPLES$
 *      Vea langapi.c
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langSelect(), hb_langID()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langDGetItem()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Obtiene un elemento del array de items del Idioma.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langDGetItem( int iIndex ) --> ( void * )pResult
 *  $ARGUMENTS$
 *       es la posici¢n del elemento en el array del idioma.
 *      El valor de  debe estar comprendido entre 0 y 
 *      HB_LANG_ITEM_MAX_
 *  $RETURNS$
 *      Retorna un puntero  a void, que previo a su uso debe
 *      hacerse un casting al tipo apropiado. En general a: (char *)
 *  $DESCRIPTION$
 *      La funci¢n hb_langDGetItem() es una funci¢n de bajo nivel escrita
 *      en lenguaje C que devuelve un puntero de uso general con el dato
 *      solicitado del array de idioma.
 *  $EXAMPLES$
 *      Vea langapi.c
 *      if( s_lang )
 *          return ( char * ) hb_langDGetItem( HB_LANG_ITEM_BASE_ID +
 *                                            HB_LANG_ITEM_ID_ID );
 *      else
 *          return NULL;
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langDGetErrorDesc(), hb_langID(), hb_langName()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langID()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Retorna el identificador ISO del idioma en uso.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langID( void ) --> ( char * )pszResult
 *  $ARGUMENTS$
 *      Ninguno.
 *  $RETURNS$
 *      Retorna un puntero  a una cadena de caracteres terminada
 *      en '\0' con el identificador del idioma en uso.
 *  $DESCRIPTION$
 *      La funci¢n hb_langID() es una funci¢n de bajo nivel en lenguaje C
 *      que devuelve un puntero a una cadena de caracteres correspondiente
 *      al identificador de 2 caracteres (ISO) del idioma actualmente en
 *      uso.
 *      Esta funci¢n es llamada por la funci¢n de Harbour, HB_LANGSELECT()
 *  $EXAMPLES$
 *      Vea langapi.c
 *      HB_FUNC( HB_LANGSELECT )
 *      {
 *         hb_retc( hb_langID() );
 *
 *         hb_langSelectID( hb_parc( 1 ) );
 *      }
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langSelectID(), hb_langName()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langName()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Obtiene informaci¢n sobre el m¢dulo de lenguaje en uso.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langName( void ) --> ( char * )pszResult
 *  $ARGUMENTS$
 *      Ninguno.
 *  $RETURNS$
 *      Retorna un puntero  a una cadena de caracteres terminada
 *      en '\0' con los datos del idioma actualmente en uso.
 *      La rutina llamadora debe encargarse de liberar el puntero pszName
 *      utilizado por esta funci¢n.
 *  $DESCRIPTION$
 *      La funci¢n hb_langName() es una funci¢n de bajo nivel en lenguaje
 *      C que devuelve una cadena de caracteres con los datos del idioma en
 *      uso en la forma "Harbour Language: %s1 %s2 (%s3)", donde:
 *
 *       %s1 es un puntero a una cadena de caracteres terminada en '\0' que
 *           contiene el identificador del idioma en uso como resultado de 
 *           la llamada a la funci¢n:
 *           hb_langDGetItem( HB_LANG_ITEM_ID_ID).
 *
 *       %s2 es un puntero a una cadena de caracteres terminada en '\0' que
 *           contiene el nombre del idioma en uso (en Ingl‚s) como resultado
 *           de la llamada a la funci¢n:
 *           hb_langDGetItem( HB_LANG_ITEM_ID_NAME).
 *
 *       %s3 es un puntero a una cadena de caracteres terminada en '\0' que
 *           contiene el nombre del idioma en uso (en lengua nativa) como
 *           resultado de la llamada a la funci¢n:
 *           hb_langDGetItem( HB_LANG_ITEM_ID_NAMENAT).
 *
 *      Esta funci¢n es llamada por la funci¢n de Harbour HB_LANGNAME(),
 *      para realizar esta tarea. hb_langName() es meramente informativa.
 *  $EXAMPLES$
 *      Vea langapi.c
 *      HB_FUNC( HB_LANGNAME )
 *      {
 *         char * pszName = hb_langName();
 *         hb_retc( pszName );
 *         hb_xfree( pszName );
 *      }
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langDGetItem()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_langDGetErrorDesc()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Obtiene una descripci¢n de error para un ¡ndice del array de idioma.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_langDGetErrorDesc( ULONG ulIndex ) --> ( char * )pszResult
 *  $ARGUMENTS$
 *       es la posici¢n en el array del Idioma, como un (offset)
 *      desplazamiento a partir de HB_LANG_ITEM_BASE_ERRDESC.
 *  $RETURNS$
 *      Retorna un puntero  a una cadena de caracteres terminada
 *      en '\0' con la descripci¢n del error solicitado.
 *  $DESCRIPTION$
 *      La funci¢n hb_langDGetErrorDesc() es una funci¢n de bajo nivel en
 *      lenguaje C que devuelve la descripci¢n del error solicitado,
 *      correspondiente a un valor num‚rico.
 *      La posici¢n del elemento que contiene la descripci¢n del error se
 *      calcula sumando a la macro HB_LANG_ITEM_BASE_ERRDESC el valor de
 *      .
 *      La descripci¢n puede correponder a un error interno de Harbour ¢ a
 *      uno externo.
 *  $EXAMPLES$
 *      Vea langapi.c
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo fuente es ../source/rtl/langapi.c
 *      La librer¡a asociada es lang
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_langDGetItem()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HB_LANG_REQUEST()
 *  $CATEGORY$
 *      API de Idiomas
 *  $ONELINER$
 *      Pseudofunci¢n para usar un identificador de idioma, en forma de macro
 *  $SYNTAX$
 *      C Prototype (macro definition)
 *
 *      #include 
 *      HB_LANG_REQUEST( id ) --> 
 *
 *      // This hack is needed to force preprocessing if id is also a macro
 *      #define HB_LANG_REQUEST( id )     HB_LANG_REQUEST_( id )
 *      #define HB_LANG_REQUEST_( id )    extern HB_FUNC( HB_LANG_##id ); \
 *                                      void hb_lang_ForceLink( void ) \
 *                                      { \
 *                                         HB_FUNC_EXEC( HB_LANG_##id ); \
 *                                      }
 *
 *      // Macro to publish a specific language module, for both C 
 *      // and Harbour level 
 *      #define HB_LANG_ANNOUNCE( id )       HB_FUNC( HB_LANG_##id ) {}
 *  $ARGUMENTS$
 *       Es el identificador del idioma a establecer
 *  $RETURNS$
 *      Nada.
 *  $DESCRIPTION$
 *      Este truco es necesario para forzar un pre-procesamiento si id es 
 *      tambi‚n una macro.
 *      La macro termina ejecutando la funci¢n HB_FUNC( HB_LANG_##id ) para
 *      el identificador .
 *  $EXAMPLES$
 *      Vea langapi.c, hbapilng.h
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a la API.
 *  $FILES$
 *      El archivo de cabecera es ../include/hbapilng.h
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      HB_LANG_ANNOUNCE(), HB_LANG_REQUEST_() 
 *  $END$
 */


c:\harbour\doc\es\hb_set.txt
/*
 * $Id: hb_set.txt 6072 2003-07-13 14:51:56Z alex_degarate $
 */

/*
 * Las partes siguientes son la Propiedad de los autores individuales.
 * www - http:  / / www.harbour - project.org
 *
 * Copyright 1999 David G.  Holm < dholm@jsd-llc.com >
 *   El archivo de Cabecera para el Set API
 *
 * Copyright 2000 Edison Suarez 
 *    La traducci¢n de fichero hb_set.txt al espa¤ol.
 *
 * Vea doc/license.txt para los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_setInitialize ()
 *  $CATEGORY$
 *      Set API
 *  $ONELINER$
 *
 *  $SYNTAX$
 *      Prototipo C
 *
 *      #include 
 *      hb_setInitialize( void ) --> void
 *  $ARGUMENTS$
 *
 *  $RETURNS$
 *
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      El cumplimiento no es aplicable a las llamadas de API.
 *  $FILES$
 *      La biblioteca es rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_setRelease()
 *  $CATEGORY$
 *      Set API
 *  $ONELINER$
 *
 *  $SYNTAX$
 *      Prototipo C
 *
 *      #include 
 *      hb_setRelease( void ) --> void
 *  $ARGUMENTS$
 *
 *  $RETURNS$
 *
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      El cumplimiento no es aplicable a las llamadas de API.
 *  $FILES$
 *      La biblioteca es rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *
 *  $END$
 */  


c:\harbour\doc\es\hb_vm.txt
/*
 * $Id: hb_vm.txt 6764 2006-07-18 01:30:23Z druzus $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 * 
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:  
 *   Archivo de cabecera para la API de la VM
 *   hb_vmInit(), hb_vmQuit(), hb_vmExecute(), hb_vmProcessSymbols()
 *   hb_vmSymbolInit_RT(), hb_vmRequestQuit(), hb_vmRequestEndProc()
 *   hb_vmRequestCancel(), hb_vmRequestBreak(), hb_vmRequestQuery()
 *   hb_vmMessage(), hb_vmDo(), hb_vmFunction(), hb_vmSend()
 *   hb_vmEvalBlock(), hb_vmEvalBlockV(), hb_vmPush(), hb_vmPushNil()
 *   hb_vmPushNumber(), hb_vmPushInteger(), hb_vmPushLong()
 *   hb_vmPushDouble(), hb_vmPushLogical(), hb_vmPushString()
 *   hb_vmPushDate(), hb_vmPushSymbol(), hb_vmPushPointer()
 *   hb_stackDispCall(), hb_stackPop()
 *
 * Copyright 1999 Antonio Linares 
 *   Header file for the Virtual Machine API
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmInit()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Inicializa la M quina Virtual (Virtual machine)   
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmInit( BOOL bStartMainProc ) --> void
 *  $ARGUMENTS$
 *       Valor l¢gico que indica si la VM se inicia en
 *                       un m¢dulo principal ¢ secundario.
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Inicializa la M quina Virtual (Virtual machine)   
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmQuit()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmQuit()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Sale Inmediatamente de la M quina Virtual
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmQuit( void ) --> int
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      ERRORLEVEL
 *  $DESCRIPTION$
 *      Ocasiona la Inmediata salida de la M quina Virtual
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmInit()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmExecute()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Invoca la M quina Virtual
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) --> void
 *  $ARGUMENTS$
 *          puntero a cadena constante
 * 
 *       s¡mbolo a procesar
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmDo(),hb_vmProcessSymbols()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmProcessSymbols()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Inicializaci¢n de s¡mbolos est ticos 
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmProcessSymbols( PHB_SYMB pSymbols, USHORT uiSymbols ) --> void
 *  $ARGUMENTS$
 *      
 * 
 *      
 *  $RETURNS$
 *      Nada 
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmSymbolInit_RT(),hb_vmExecute()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmSymbolInit_RT()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Inicializaci¢n de s¡mbolos de soporte de ejecuci¢n
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmSymbolInit_RT( void ) --> void
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmProcessSymbols()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmRequestQuit()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmRequestQuit( void ) --> void
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmRequestEndProc()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmRequestEndProc()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmRequestEndProc( void ) --> void
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmRequestQuit(),hb_vmRequestCancel()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmRequestCancel()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmRequestCancel( void ) --> void
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmRequestQuit(),hb_vmRequestBreak()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmRequestBreak()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmRequestBreak( PHB_ITEM pItem ) --> void
 *  $ARGUMENTS$
 *      
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmRequestQuit(),hb_vmRequestCancel()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmRequestQuery()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmRequestQuery( void ) --> ( USHORT )usResult
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      El resultado  expresado como un entero corto sin signo
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmRequestCancel()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmMessage()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Env¡a un mensaje a un objeto
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmMessage( PHB_SYMB pSymMsg ) --> void
 *  $ARGUMENTS$
 *      
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmSend()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmDo()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Invoca la M quina Virtual
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmDo( USHORT uiParams ) --> void
 *  $ARGUMENTS$
 *      
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmExecute(),hb_vmFunction()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmFunction()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Ejecuta una funci¢n guardando su resultado
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmFunction( USHORT uiParams ) --> void
 *  $ARGUMENTS$
 *      
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Ejecuta una funci¢n guardando su resultado
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmDo()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmSend()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Env¡a un mensaje a un objeto
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmSend( USHORT uiParams ) --> void
 *  $ARGUMENTS$
 *      
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmMessage()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmEvalBlock()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Ejecuta el codeblock pasado sin argumentos
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmEvalBlock( PHB_ITEM pBlockItem ) --> ( PHB_ITEM )pResult
 *  $ARGUMENTS$
 *      
 *  $RETURNS$
 *      Un puntero a PHB_ITEM
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmEvalBlockV()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmEvalBlockV()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Ejecuta el codeblock pasado con argumentos
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmEvalBlockV( PHB_ITEM pBlockItem, USHORT uiArgCount, ... )
 *                       --> ( PHB_ITEM )pResult
 *  $ARGUMENTS$
 *      
 * 
 *        Numero de argumentos, expresado como entero sin signo
 * 
 *      <...>         Argumentos opcionales indicados arriba
 *  $RETURNS$
 *      Un puntero a PHB_ITEM
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmEvalBlock()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPush()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja un item generico a la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPush( PHB_ITEM pItem ) --> void
 *  $ARGUMENTS$
 *      
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Empuja un item gen‚rico a la pila de evaluaci¢n
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushNil()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushNil()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Pone NIL en el lugar de self
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushNil( void ) --> void
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPush()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushNumber()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja un n£mero en la pila y lo eval£a
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushNumber( double dNumber, int iDec ) --> void
 *  $ARGUMENTS$
 *       N£mero de doble precisi¢n para ser evaluado
 * 
 *          Numero entero para indicar las cifras decimales
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Empuja un n£mero en la pila y lo eval£a para decidir si es entero
 *      (int), entero largo (long) ¢ de doble precisi¢n (double)
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushInteger(),hb_vmPushLong(),hb_vmPushDouble()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushInteger()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja un n£mero entero corto a la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushInteger( int iNumber ) --> void
 *  $ARGUMENTS$
 *       Entero corto para ser evaluado
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Empuja un n£mero entero corto a la pila para su evaluaci¢n
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushNumber(),hb_vmPushLong(),hb_vmPushDouble()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushLong()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja un n£mero entero largo a la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushLong( long lNumber ) --> void
 *  $ARGUMENTS$
 *       Entero largo para ser evaluado
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Empuja un n£mero entero largo a la pila para su evaluaci¢n.
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushNumber(),hb_vmPushInteger(),hb_vmPushDouble()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushDouble()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja un n£mero doble a la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushDouble( double lNumber, int iDec ) --> void
 *  $ARGUMENTS$
 *       N£mero de doble precisi¢n para ser evaluado
 * 
 *          Numero entero para indicar las cifras decimales
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Empuja un n£mero de doble precisi¢n a la pila para su evaluaci¢n
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushNumber(),hb_vmPushInteger(),hb_vmPushLong()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushLogical()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja un valor l¢gico a la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushLogical( BOOL bValue ) --> void
 *  $ARGUMENTS$
 *       Valor logico
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushNumber(),hb_vmPushString()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushString()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja una cadena a la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushString( char * szText, ULONG length ) --> void
 *  $ARGUMENTS$
 *         puntero a una cadena de texto terminada en '\0'
 * 
 *       longitud de la cadena
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Empuja una cadena a la pila
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushNumber(),hb_vmPushLogical()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushDate()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja una fecha representada como entero largo a la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushDate( long lDate ) --> void
 *  $ARGUMENTS$
 *       Entero largo representando una fecha
 *  $RETURNS$
 *      Nada 
 *  $DESCRIPTION$
 *      Empuja una fecha representada como entero largo a la pila
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushNumber(),hb_vmPushLogical()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushSymbol()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja un puntero a una funci¢n, a la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushSymbol( PHB_SYMB pSym ) --> void
 *  $ARGUMENTS$
 *       puntero a una funci¢n
 *  $RETURNS$
 *      Nada 
 *  $DESCRIPTION$
 *      Empuja un puntero a una funci¢n, a la pila
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushPointer()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_vmPushPointer()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Empuja un item del tipo HB_IT_POINTER 
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_vmPushPointer( void * ) --> void
 *  $ARGUMENTS$
 *        puntero sin tipo (puntero gen‚rico)
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_vmPushSymbol()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_stackDispCall()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_stackDispCall( void ) --> void
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_stackPop()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_stackPop()
 *  $CATEGORY$
 *      Virtual machine API
 *  $ONELINER$
 *      Recupera un item de la pila
 *  $SYNTAX$
 *      C Prototype
 *      
 *      #include 
 *      hb_stackPop( void ) --> void
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      
 *  $EXAMPLES$
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_stackDispCall()
 *  $END$
 */



c:\harbour\doc\es\howtobsd.txt
/*
 * $Id: howtobsd.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001-2002 David G. Holm  
 *   Documentaci¢n en Ingl‚s de: 
 *     BSD platform Configuration for Harbour.
 *
 * Copyright 2001 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de: 
 *     Configuraci¢n del sistema operativo FreeBSD para usar con Harbour
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


COMO CONFIGURAR BSD PARA CONSTRUIR HARBOUR
------------------------------------------

Primero, Ud. necesitar  una instalaci¢n FreeBSD 4.4 para desarrolladores.
Luego Ud. necesitar  instalar bison y gmake. Si Ud. instal¢ la colecci¢n
de ports, todo lo que Ud. necesita para instalar bison y gmake es
ejecutar los siguientes comandos los cuales pueden requerir que ejecute
primero el comando 'su' para obtener los permisos adecuados.

   cd /usr/ports/devel/bison
   make
   make install
   make clean
   cd /usr/ports/devel/gmake
   make
   make install
   make clean

Si Ud. quiere usar la librer¡a GTSLN en lugar de GTSTD ¢ GTCRS, 
entonces Ud. tambi‚n necesita instalar libslang. Si Ud. instal¢
la colecci¢n de ports, entonces todo lo que Ud. necesita para
instalar libslang es ejecutar los siguientes comandos los cuales
pueden requerir que ejecute primero el comando 'su' para obtener
los permisos adecuados.

   cd /usr/ports/devel/libslang
   make
   make install
   make clean

Entonces lea el archivo doc/gmake.txt para instrucciones gen‚ricas 
sobre make (GNU) y los seteos de Harbour espec¡ficos necesarios para 
BSD. Cuando Ud. desee construir Habour, aseg£rese de ejecutar
'gmake -r' en la l¡nea de comandos en lugar de 'make -r'.

David G. Holm 
   
 
c:\harbour\doc\es\hvm.txt
/*
 * $Id: hvm.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *      PROCNAME(), PROCLINE(), PROCFILE(), HB_PVALUE(), PCOUNT()
 *      __QUIT(), CLIPINIT(), __SetHelpK(), BREAK(), DO(), __DBGVMVARLGET()
 *
 * Copyright 1999 Jose Lanin 
 * Documentaci¢n en Ingl‚s de: PROCLINE(),PROCFILE(),PROCNAME()
 *
 * Copyright 1999 Eddie Ruina
 * Documentaci¢n en Ingl‚s de: __DBGVMVARLGET()
 *
 * Copyright 1999 Chen Kedem 
 * Documentaci¢n en Ingl‚s de: CLIPINIT(), __SETHELPK()
 *
 * Copyright 1999 Ryszard Glab 
 * Documentaci¢n en Ingl‚s de: DO()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      PROCNAME()
 *  $CATEGORY$
 *      Miscelanea
 *  $ONELINER$
 *      Obtiene el nombre de la funci¢n actual en la pila
 *  $SYNTAX$
 *      PROCNAME(  ) --> 
 *  $ARGUMENTS$
 *          es el nivel de la funci¢n requerida
 *  $RETURNS$
 *       El nombre de la funci¢n que esta siendo ejecutada
 *  $DESCRIPTION$
 *      Esta funci¢n mira al tope de la pila y obtiene el nombre de la
 *      funci¢n actual ejecutada si no se pasaron argumentos. De otra
 *      manera esta retorna el nombre de la funci¢n ¢ procedimiento en el
 *      nivel .
 *  $EXAMPLES$
 *      Ver Test
 *      
 *  $TESTS$
 *      Este test mostrar  las funciones y procedimientos en la pila
 *      antes de ejecutarlas.
 *
 *      FUNCTION Test()
 *         LOCAL n := 1
 *         while !Empty( ProcName( n ) )
 *            ? ProcName( n++ )
 *         end do
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      PROCNAME() es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      PROCLINE(),PROCFILE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      PROCLINE()
 *  $CATEGORY$
 *      Miscelanea
 *  $ONELINER$
 *      Obtiene el n£mero de l¡nea de la funci¢n actual en la pila
 *  $SYNTAX$
 *      PROCLINE(  ) --> 
 *  $ARGUMENTS$
 *       es el nivel de funci¢n requerida
 *  $RETURNS$
 *       el n£mero de l¡nea de la funci¢n que esta siendo ejecutada
 *  $DESCRIPTION$
 *      Esta funci¢n mira al tope de la pila y obtiene el n£mero de l¡nea
 *      de la funci¢n actual ejecutada si no se pasaron argumentos. De otra
 *      manera esta retorna el n£mero de l¡nea de la funci¢n ¢ procedimiento
 *      en el nivel .
 *  $EXAMPLES$
 *      Ver Test
 *      
 *  $TESTS$
 *      FUNCTION Test()
 *         ? ProcLine( 0 )
 *         ? ProcName( 2 )
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      PROCLINE() es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      PROCNAME(),PROCFILE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      PROCFILE()
 *  $CATEGORY$
 *      Miscelanea
 *  $ONELINER$
 *      Esta funci¢n siempre retorna una cadena vac¡a.
 *  $SYNTAX$
 *      PROCFILE(  ) --> 
 *  $ARGUMENTS$
 *       es cualquier tipo v lido
 *  $RETURNS$
 *      Retorna la cadena vac¡a .
 *  $DESCRIPTION$
 *      Esta funci¢n es agregada a la RTL por total compatibilidad.
 *      Esta siempre retorna una cadena vac¡a.
 *  $EXAMPLES$
 *      ? ProcFile()
 *      
 *  $TESTS$
 *      FUNCTION Test()
 *         ? ProcFile()
 *         ? ProcFile( NIL )
 *         ? ProcFile( 2 )
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      PROCFILE() es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      PROCNAME(),PROCLINE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HB_PVALUE()
 *  $CATEGORY$
 *      Chequeo Parametros
 *  $ONELINER$
 *      Obtiene el valor de un argumento.
 *  $SYNTAX$
 *      HB_PVALUE(  ) --> 
 *  $ARGUMENTS$
 *      Un n£mero que indica el argumento a chequear.
 *  $RETURNS$
 *       Retorna el valor almacenado en el argumento.
 *  $DESCRIPTION$
 *      Esta funci¢n es £til para chequear el valor almacenado en un
 *      argumento.
 *  $EXAMPLES$
 *      Ver Test
 *      
 *  $TESTS$
 *      FUNCTION Test( nValue, cString )
 *         IF PCount() == 2
 *            ? hb_PValue( 1 ), nValue
 *            ? hb_PValue( 2 ), cString
 *         ENDIF
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      HB_PVALUE() es una nueva funci¢n y por tanto no es compatible con
 *      CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      PCOUNT()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      PCOUNT()
 *  $CATEGORY$
 *      Chequeo Parametros
 *  $ONELINER$
 *      Obtiene el n£mero de argumentos pasados a la funci¢n.
 *  $SYNTAX$
 *      PCOUNT() --> 
 *  $ARGUMENTS$
 *      Ninguno.
 *  $RETURNS$
 *        Un n£mero que indica la cantidad de par metros pasados a
 *               la funci¢n ¢ procedimiento,
 *  $DESCRIPTION$
 *      Esta funci¢n es £til para chequear si una funci¢n ¢ procedimiento a
 *      recibido el n£mero de argumentos necesario.
 *  $EXAMPLES$
 *      Ver Test
 *      
 *  $TESTS$
 *      FUNCTION Test( xExp )
 *         IF PCount() == 0
 *            ? "Esta funci¢n necesita un par metro"
 *         ELSE
 *            ? xExp
 *         ENDIF
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      PCOUNT() es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      HB_PVALUE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __QUIT()
 *  $CATEGORY$
 *      Eventos
 *  $ONELINER$
 *      Termina una aplicaci¢n.
 *  $SYNTAX$
 *      __QUIT() --> NIL
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      NIL
 *  $DESCRIPTION$
 *      Esta funci¢n termina la aplicaci¢n actual y retorna al sistema.
 *  $EXAMPLES$
 *      Ver Test
 *      
 *  $TESTS$
 *      FUNCTION EndApp( lYesNo )
 *         IF lYesNo
 *            __Quit()
 *         ENDIF
 *      RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      __QUIT() es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      QUIT
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      CLIPINIT()
 *  $CATEGORY$
 *      Internal
 *  $ONELINER$
 *      Initializa varios subsistemas de Harbour
 *  $SYNTAX$
 *      CLIPINIT() --> NIL
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      CLIPINIT() siempre devuelve NIL.
 *  $DESCRIPTION$
 *      CLIPINIT() es uno de los INIT PROCEDURE predefinidos y es ejecutado
 *      cuando el programa arranca. Este declara un array MEMVAR PUBLIC vac¡o
 *      llamado GetList que va a ser usado por el sistema Get.
 *      Este activa el manejador de error por defecto, y (al menos por el
 *      momento) llama a la funci¢n que establece la tecla de Ayuda por
 *      defecto (F1).
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Se dice que CLIPINIT() no deber¡a llamar a la funci¢n que establece
 *      la tecla de Ayuda por defecto (F1) dado que CA-Cl*pper lo hace en
 *      otro lugar.
 *  $PLATFORMS$
 *      Todas.
 *  $SEEALSO$
 *       INIT PROCEDURE
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __SetHelpK()
 *  $CATEGORY$
 *      Internal
 *  $ONELINER$
 *      Establece a  como la tecla de Ayuda por defecto
 *  $SYNTAX$
 *      __SetHelpK() --> NIL
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      __SetHelpK() siempre devuelve NIL
 *  $DESCRIPTION$
 *      Establece que al pulsar la tecla , se ejecute una funci¢n llamada
 *      HELP si tal funci¢n es enlazada dentro del programa.
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      __SetHelpK() trabaja exactamente como la funci¢n de CA-Cl*pper
 *      llamada __SetHelpK()
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      __XHelp(),SET KEY,SETKEY()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      BREAK()
 *  $CATEGORY$
 *      Error recovery
 *  $ONELINER$
 *      Sale de un bloque BEGIN SEQUENCE
 *  $SYNTAX$
 *      BREAK(  ) --> NIL
 *  $ARGUMENTS$
 *        es cualquier expresi¢n v lida. Esta es requerida siempre
 *              Si Ud. no desea pasarle ning£n argumento, s¢lo use NIL.
 *  $RETURNS$
 *      NIL
 *  $DESCRIPTION$
 *      Esta funci¢n le pasa el control a la sentencia RECOVER en un bloque
 *      BEGIN SEQUENCE.
 *  $EXAMPLES$
 *      Break( NIL )
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      BREAK() es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      BEGIN SEQUENCE
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      DO()
 *  $CATEGORY$
 *      Utility
 *  $ONELINER$
 *      Llama a un procedimiento ¢ a una funci¢n
 *  $SYNTAX$
 *      DO(  [, ] )
 *  $ARGUMENTS$
 *         es tanto una cadena con un nombre de funci¢n ¢
 *                    procedimiento a ser llamado, ¢ un codeblock a evaluar.
 *        argumentos pasados a la funci¢n ¢ procedimiento
 *                    llamado ¢ a un codeblock.
 *  $RETURNS$
 *      A value that was returned from called function.
 *  $DESCRIPTION$
 *      Esta funci¢n puede ser llamada ¢ bien por el compilador Harbour ¢
 *      por el usuario.
 *      El compilador siempre siempre pasa el item de tipo IT_SYMBOL que
 *      almacena el nombre del procedimiento especificado en la sentencia
 *      DO  WITH .
 *      Si el procedimiento/funci¢n no existe, entonces un error de tiempo
 *      de ejecuci¢n es generado.
 *      Esta funci¢n puede ser usada como reemplazo del operador macro.
 *      Esta es tambi‚n usada internamente para implementar:
 *         DO  WITH 
 *      En este caso  es del tipo HB_SYMB.
 *  $EXAMPLES$
 *      cbCode ={|x| MyFunc( x )}
 *      DO( cbCode, 1 )
 *
 *      cFunction := "MyFunc"
 *      xRetVal :=DO( cFunction, 2 )
 *
 *      Old style (slower):
 *      DO &cFunction WITH 3
 *      
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __DBGVMVARLGET()
 *  $CATEGORY$
 *      Variable Management
 *  $ONELINER$
 *      Obtiene una variable LOCAL de un nivel de procedimiento
 *  $SYNTAX$
 *      __DBGVMVARLGET( ,  )
 *  $ARGUMENTS$
 *       Es el nivel de procedimiento, el mismo que el usado
 *                   en PROCNAME() y PROCLINE(), desde el cual una variable
 *                   local va a ser obtenida.
 *           Es la posici¢n ¢ ¡ndice de la variable local a recuperar
 *  $RETURNS$
 *      El contenido de la variable local especificada.
 *  $DESCRIPTION$
 *      Esta funci¢n es usada desde el depurador.
 *  $PLATFORMS$
 *      Todas.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      PROCNAME()
 *  $END$
 */


c:\harbour\doc\es\idle.txt
/*
 * $Id: idle.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Brian Hays 
 * Documentaci¢n en Ingl‚s de:
 *              Readme for Idle state, HB_IDLEADD(), HB_IDLEDEL()
 *              HB_IDLESTATE(), hb_idleState()
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *              Leame para Estado Ocioso, HB_IDLEADD(), HB_IDLEDEL()
 *              HB_IDLESTATE(), hb_idleState()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


/*  $DOC$
 *  $FUNCNAME$
 *      Estado Ocioso
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Archivo L‚ame para Estado Ocioso
 *  $DESCRIPTION$
 *      El estado de espera ¢ ocioso es el estado de la m quina virtual de
 *      Harbour cuando esta espera por una acci¢n del usuario a trav‚s del
 *      teclado ¢ el mouse. El estado ocioso ocurre actualmente durante
 *      las llamadas a INKEY(). Todas las funciones que no usen la funci¢n
 *      INKEY() pueden se¤alizar el estado ocioso con una llamada a la
 *      funci¢n Harbour HB_IDLESTATE() ¢ hb_idleState() a nivel de lenguaje
 *      C.
 *
 *      Durante los estados ociosos, la m quina virtual llama al recolector
 *      de memoria y este puede llamar a acciones definidas por el usuario
 *      (tareas en segundo plano ¢ background). Este tambi‚n libera porciones
 *      del tiempo de la CPU para algunas plataformas deficientes que no son
 *      lo suficientemente inteligentes (Windows NT).
 *
 *      Por definici¢n de tareas en segundo plano vea las funciones:
 *       HB_IDLEADD() y HB_IDLEDEL().
 *
 *      Para llamar directamente a acciones en segundo plano vea la funci¢n:
 *      HB_IDLESTATE().
 *
 *      Para indicar el estado ocioso desde c¢digo en lenguaje C vea la
 *      hb_idleState() en la API,
 *  $SEEALSO$
 *      HB_IDLEADD(),HB_IDLEDEL()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HB_IDLEADD()
 *  $CATEGORY$
 *      Estado Ocioso
 *  $ONELINER$
 *      Agrega tareas en segundo plano.
 *  $SYNTAX$
 *      HB_IDLEADD(  ) --> nHandle
 *  $ARGUMENTS$
 *        es un bloque de c¢digo que ser  ejecutado durante los
 *                  estados ociosos, No hay argumentos pasados a este bloque
 *                  de c¢digo durante la evaluaci¢n.
 *  $RETURNS$
 *        El manejador (un valor entero) que identifica la tarea.
 *                 Este manejador puede ser usado para eliminar la tarea.
 *  $DESCRIPTION$
 *      HB_IDLEADD() agrega el pasado bloque de c¢digo a las lista de tareas
 *      en segundo plano que ser n evaluadas durante los estados ociosos.
 *      No hay un l¡mite para el n£mero de tareas.
 *  $EXAMPLES$
 *      nTarea := HB_IDLEADD( {|| SayTime()} )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Extensi¢n de Harbour, similar a la funci¢n FT_ONIDLE() disponible
 *      en la librer¡a Nanforum.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El archivo fuente es ../source/rtl/idle.c
 *  $SEEALSO$
 *      HB_IDLEDEL(),HB_IDLESTATE()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      HB_IDLEDEL()
 *  $CATEGORY$
 *      Estado Ocioso
 *  $ONELINER$
 *      Remueve tareas desde la lista de tareas en segundo plano.
 *  $SYNTAX$
 *      HB_IDLEDEL(  ) --> xAccion
 *  $ARGUMENTS$
 *       es el identificador de la tarea devuelto por la funci¢n
 *                HB_IDLEADD().
 *  $RETURNS$
 *      Retorna  igual a NIL si un manejador no v lido es pasado
 *  $DESCRIPTION$
 *      La funci¢n HB_IDLEDEL() remueve la acci¢n asociada con el identi-
 *      ficador pasado desde la lista de tareas en segundo plano.
 *      El identificador deber¡a ser el valor retornado por la llamada
 *      previa a la funci¢n HB_IDLEADD().
 *      Si la tarea especificada est  definida, entonces el codeblock es
 *      retornado, de otro modo el valor NIL es retornado.
 *  $EXAMPLES$
 *      nTarea := HB_IDLEADD( {|| SayTime()} )
 *      INKEY(10)
 *      cbAccion := HB_IDLEDEL( nTarea )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Extensi¢n de Harbour
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El archivo fuente es ../source/rtl/idle.c
 *  $SEEALSO$
 *      HB_IDLEADD(),HB_IDLESTATE()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      HB_IDLESTATE()
 *  $CATEGORY$
 *      Estado Ocioso
 *  $ONELINER$
 *      Eval£a una sola tarea en segundo plano y llama al recolector
 *  $SYNTAX$
 *      HB_IDLESTATE()
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      NIL
 *  $DESCRIPTION$
 *      La funci¢n HB_IDLESTATE() solicita la recolecci¢n de memoria sin
 *      uso y ejecuta una £nica tarea definida por el bloque de c¢digo
 *      pasado con la funci¢n HB_IDLEADD(). Cada llamada a esta funci¢n
 *      eval£a una tarea diferente en el orden de la creaci¢n de tareas.
 *      No hay argumentos pasados durante la evaluaci¢n del bloque de
 *      c¢digo.
 *      Esta funci¢n puede ser llamada con seguridad, a£n si no hay tareas
 *      definidas en segundo plano.
 *  $EXAMPLES$
 *      nTarea1 := HB_IDLEADD( {|| MuestreLaHora()} )
 *      nTarea2 := HB_IDLEADD( {|| SaveScreen()} )
 *
 *      DO WHILE( ! bTerminado )
 *         bTerminado := HagaAlgoMuyImportante()
 *         HB_IdleState()
 *      ENDDO
 *
 *      cbAccion := HB_IDLEDEL( nTarea1 )
 *      HB_IDLEDEL( nTarea2 )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Extensi¢n de Harbour, similar a la funci¢n FT_IAMIDLE() disponible
 *      en la librer¡a Nanforum.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El archivo fuente es ../source/rtl/idle.c
 *  $SEEALSO$
 *      HB_IDLEADD(),HB_IDLEDEL()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      hb_idleState()
 *  $CATEGORY$
 *      Estado Ocioso
 *  $ONELINER$
 *      Eval£a una sola tarea en segundo plano y llama al recolector
 *  $SYNTAX$
 *      void hb_idleState( void );
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada.
 *  $DESCRIPTION$
 *      La funci¢n hb_idleState() es una funci¢n en lenguaje C que solicita
 *      la recolecci¢n de memoria sin uso y ejecuta una sola tarea en
 *      segundo plano, definida por el bloque de c¢digo pasado con la
 *      funci¢n HB_IDLEADD(). Esta tambi‚n libera porciones de tiempo de
 *      CPU para aquellas plataformas que lo requieran.
 *
 *      Cada llamda a esta funci¢n eval£a una tarea diferente en el orden
 *      de la creaci¢n de tareas. No hay argumentos pasados durante la
 *      evaluaci¢n del bloque de c¢digo.
 *
 *      Esta funci¢n puede ser llamada con seguridad, a£n si no hay tareas
 *      definidas en segundo plano.
 *
 *      Esta funci¢n es autom ticamente llamada desde la funci¢n INKEY().
 *  $STATUS$
 *      R
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El archivo fuente es ../source/rtl/idle.c
 *  $SEEALSO$
 *      HB_IDLEADD(),HB_IDLEDEL(),HB_IDLESTATE()
 *  $END$
 */ 


c:\harbour\doc\es\input.txt

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *           INKEY(), __KEYBOARD(), HB_KEYPUT(), NEXTKEY()
 *           LASTKEY(), KEYBOARD,   READKEY(), MROW(), MCOL()
 * Copyright 1999 Chen Kedem 
 *    Documentation for: READKEY()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      INKEY()
 *  $CATEGORY$
 *      Entrada de Consola
 *  $ONELINER$
 *      Extrae el pr¢ximo c¢digo de tecla desde el buffer de teclado.
 *  $SYNTAX$
 *      INKEY( [] [,] ) --> nTecla
 *  $ARGUMENTS$
 *       es un valor opcional de tiempo de espera en segundos,
 *                      con una resoluci¢n de 1/10th de segundo.
 *                      Si es omitido, INKEY() retorna inmediatamente.
 *      Si es cero, INKEY() espera hasta que un evento de entrada suceda.
 *      Si es establecido en cualquier otro valor INKEY() retornara tanto
 *      cuando un evento de entrada ocurra como cuando el per¡odo de espera
 *      haya transcurrido.
 *      Si s¢lo este par metro es especificado y este no es num‚rico, ‚ste
 *      ser  tratado como si fuera cero. Pero si ambos par metros son
 *      especificados y este par metro no es num‚rico, este ser  tratado
 *      como si no estuviese presente.
 *
 *       es una m scara opcional de los eventos de entrada que son
 *                 habilitados.
 *                 Si es omitida por defecto es hb_set.HB_SET_EVENTMASK.
 *      M scaras v lidas de entrada se ecuentran en inkey.ch y son explicadas
 *      m s abajo. Se recomienda usar los nombres de estas m scaras, antes
 *      que sus valores num‚ricos, en el caso que estos valores num‚ricos
 *      cambien en futuras versiones de Harbour.
 *      Para permitir m s de un tipo de evento de entrada, simplemente sume
 *      varios nombres de m scara todos juntos.
 *
 *        
 *        inkey.ch           Significado de los eventos
 *
 *        INKEY_MOVE         permitidos los eventos de movimiento del mouse
 *        INKEY_LDOWN        permitido apretar el bot¢n izq. del mouse
 *        INKEY_LUP          permitido soltar el bot¢n izquierdo del mouse
 *        INKEY_RDOWN        permitido apretar el bot¢n derecho del mouse
 *        INKEY_RUP          permitido soltar el bot¢n derecho del mouse
 *        INKEY_KEYBOARD     Todos los eventos de teclado estan permitidos
 *        INKEY_ALL          Todos los eventos de mouse y teclado estan
 *                           permitidos
 *        HB_INKEY_EXTENDED  Codigos Extendidos de teclado son usados
 *        
* Si el par metro no es num‚rico, este ser  tratado como si hubiese * sido establecido a hb_set.HB_SET_EVENTMASK. * $RETURNS$ * INKEY() retorna cero en caso de transcurrido el tiempo de espera sin * ning£n evento de entrada, de otro modo retorna un valor en el rango * -39 a 386 para eventos de teclado ¢ en le rango de 1001 a 1007 para * eventos de mouse. * Los eventos de mouse y los eventos de teclado que no se pueden * imprimir son representados por los valores K_ listados en * el archivo inkey.ch * Los c¢digo de teclas de los eventos de teclado en el rango de 32 a * 127 son los equivalentes al set de caracteres ASCII. Los c¢digos de * retorno de eventos de teclado en el rango de 128 a 255 son asumidos * como imprimibles, pero los resultados pueden variar basados en el * hardware del teclado y la nacionalidad de su seteo. * * Los codigos de tecla Extendidos para un teclado de PC consisten de * scancode y uno o mas valores de desplazamiento (offset). * Si ningun modificador de teclado fue usado entonces HB_INKEY_NONE * es agregado. Las teclas agregan HB_INKEY_ALT, las teclas * agregan HB_INKEY_CTRL, las teclas de desplazamiento (Shift), * (que se simbolizan con una flecha hacia arriba) agregan * HB_INKEY_SHIFT, y las teclas adicionales del teclado numerico * ubicadas a la derecha * del teclado (teclas KeyPad y CursorPad ) agregan HB_INKEY_ENHANCED. * * Por ejemplo la tecla tiene un scancode de 59, asi que si solo * se pulsa se obtiene el codigo 315, da 443, * da 571, da 699. <> * * ?????? And NumPad+/ gives 1077, 1205, 1333, and 1461. At * this time, the only value that can combine with other values is * HB_INKEY_ENHANCED (i.e., there are no Alt+Ctl combinations, etc.) * * Nota: El conjunto de codigos de teclas extendido es mayor que el * conjunto de codigo de tecla normal. Como resultante de esto, si * Ud. cambia entre los modos normal y extendido, Ud. debe saber que * algunos codigos son trasladados como cero en el modo normal (esto * es debido a que existe el correspondiente codigo para esa tecla en * modo normal) y que esos codigos seran removidos del buffer de * entrada del teclado en el modo normal y que Ud. no podr  volver * atras y obtenerlos luego en modo extendido. * $DESCRIPTION$ * INKEY() puede ser usada para detectar eventos de entrada, como la * pulsaci¢n de una tecla, ¢ un click del mouse (arriba y/o abajo). * $EXAMPLES$ * // Espera a que el usuario presione la tecla Esc * ? "Por favor, presione la tecla ESC." * WHILE INKEY( 0.1 ) != K_ESC * END * * $TESTS$ * KEYBOARD "AB"; ? INKEY(), INKEY() ==> 65 66 * * $STATUS$ * S * $COMPLIANCE$ * INKEY() es compatible con la funci¢n INKEY() de Clipper 5.3 con una * excepci¢n: La funci¢n INKEY() de Harbour dar  un error de argumento * si el primer par metro es menor ¢ igual a cero y el segundo par metro * ( ¢ la m scara por defecto ) no es v lida, porque de otra manera * INKEY() podr¡a no retornar nunca, porque en efecto espera por * siempre por un un evento que no se va a producir (Nota: En Clipper, * esto tambi‚n bloquea los eventos SET KEY). * $FILES$ * La librer¡a es rtl * $SEEALSO$ * inkey.ch * $END$ */ /* $DOC$ * $FUNCNAME$ * __KEYBOARD() * $CATEGORY$ * Entrada de Consola * $ONELINER$ * NO LLAMAR A ESTA FUNCION DIRECTAMENTE ! * $SYNTAX$ * KEYBOARD * CLEAR TYPEAHEAD * $ARGUMENTS$ * es una cadena opcional para ser colocada en el buffer * de teclado de Harbour despu‚s de borrarlo. * Nota: El car cter ";" es convertido a CHR(13) (esta es * una caracter¡stica no documentada de CA-Cl*pper). * $RETURNS$ * No hay valor de retorno. * $DESCRIPTION$ * Borra el buffer de teclado de Harbour y luego inserta una cadena * opcional en ‚ste. * $EXAMPLES$ * // Pone la tecla en el buffer de teclado * KEYBOARD CHR(13) * * // Borra el buffer de teclado * CLEAR TYPEAHEAD * * $TESTS$ * KEYBOARD CHR(13); ? INKEY() ==> 13 * KEYBOARD ";" ? INKEY() ==> 13 * KEYBOARD "HOLA"; CLEAR TYPEAHEAD; ? INKEY() ==> 0 * * $STATUS$ * R * $COMPLIANCE$ * __KEYBOARD() es compatible con CA-Cl*pper 5.3 * $FILES$ * La librer¡a es rtl * $SEEALSO$ * CLEAR TYPEAHEAD,KEYBOARD * $END$ */ /* $DOC$ * $FUNCNAME$ * HB_KEYPUT() * $CATEGORY$ * Entrada de Consola * $ONELINER$ * Pone un c¢digo de tecla en el buffer de teclado. * $SYNTAX$ * HB_KEYPUT( ) * $ARGUMENTS$ * es el c¢digo de tecla. que deber¡a ser insertado en * el buffer de teclado. * $RETURNS$ * No hay valor de retorno. * $DESCRIPTION$ * Inserta un c¢digo de tecla en el buffer de teclado. * El buffer *NO* es borrado en esta operaci¢n. Esta funci¢n permite * insertar c¢digos de teclas que no estan en el rango de 0 a 255. * Para insertar m s de un c¢digo, llame a la funci¢n repetidamente. * El c¢digo cero no puede ser insertado. * $EXAMPLES$ * // Coloca la tecla de Alt+PgDn key en el buffer de teclado. * HB_KEYPUT( K_ALT_PGDN ) * * $TESTS$ * HB_KEYPUT( K_ALT_PGDN ) ; ? INKEY() ==> 417 * HB_KEYPUT( K_F11 ) ; ? INKEY() ==> -40 * * $STATUS$ * R * $COMPLIANCE$ * HB_KEYPUT() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * KEYBOARD,CLEAR TYPEAHEAD,INKEY() * $END$ */ /* $DOC$ * $FUNCNAME$ * NEXTKEY() * $CATEGORY$ * Entrada de Consola * $ONELINER$ * Lee la pr¢xima tecla del buffer de teclado sin extraerla * $SYNTAX$ * NEXTKEY( [] ) --> nTecla * $ARGUMENTS$ * es un valor entero opcional compuesto por una o mas * constantes INKEY_ or HB_INKEY_ * El solo proposito de este argumento es permitir cambiar * entre los codigos de tecla HB_INKEY_EXTENDED y usar * los codigos de tecla normales compatibles con Clipper. * $RETURNS$ * el valor del pr¢ximo c¢digo de tecla del buffer de teclado. * $DESCRIPTION$ * Retorna el valor del pr¢ximo c¢digo de tecla del buffer de teclado * sin extraerlo. * $EXAMPLES$ * // Uso de NEXTKEY() con INKEY() para cambiar los caracteres a mostrar * // ¢ para poder salir del bucle, as¡ el llamador puede detectar * // la tecla ESC. * LOCAL nTecla, cChar := "+" * * WHILE TRUE * ?? cChar * nTecla := NEXTKEY() * * IF nTecla == K_ESC * EXIT * ELSE * IF nTecla != 0 * cChar := CHR( nTecla ) * END IF * ENDIF * * END WHILE * * $TESTS$ * KEYBOARD "AB"; ? NEXTKEY(), NEXTKEY() ==> 65 65 * * $STATUS$ * R * $COMPLIANCE$ * NEXTKEY() es compatible con CA-Cl*pper 5.3 * $FILES$ * La librer¡a es rtl * $SEEALSO$ * INKEY(),LASTKEY() * $END$ */ /* $DOC$ * $FUNCNAME$ * LASTKEY() * $CATEGORY$ * Entrada de Consola * $ONELINER$ * Obtiene el £ltima tecla extraida desde el buffer de teclado. * $SYNTAX$ * LASTKEY( [] ) --> nTecla * $ARGUMENTS$ * es un valor entero opcional compuesto por una o mas * constantes INKEY_ o HB_INKEY_ * El solo proposito de este argumento es permitir cambiar * entre los codigos de tecla HB_INKEY_EXTENDED y usar * los codigos de tecla normales compatibles con Clipper. * $RETURNS$ * la £ltima tecla extraida desde el buffer de teclado. * $DESCRIPTION$ * LASTKEY() retorna el valor de la £ltima tecla extraida del buffer * de teclado. * $EXAMPLES$ * // Continua el bucle a menos que la tecla ESC haya sido presionada * // en MainFunc() * WHILE TRUE * * MainFunc() * IF LASTKEY() == K_ESC * EXIT * ENDIF * * END WHILE * * $TESTS$ * KEYBOARD "AB"; ? INKEY(), LASTKEY() ==> 65 65 * * $STATUS$ * R * $COMPLIANCE$ * LASTKEY() es compatible con CA-Cl*pper 5.3 * $FILES$ * La librer¡a es rtl * $SEEALSO$ * INKEY(),LASTKEY() * $END$ */ /* $DOC$ * $FUNCNAME$ * KEYBOARD * $CATEGORY$ * Comando * $ONELINER$ * Rellena el buffer de teclado con una cadena. * $SYNTAX$ * KEYBOARD * $ARGUMENTS$ * es la cadena a ser procesada, un caracter a la vez, por * el procesador de teclado de Harbour. * $DESCRIPTION$ * Este comando llena el buffer de entrada con . * El n£mero de caracteres que pueden ser puestos en el buffer de * teclado es controlado por el comando SET TYPEAHEAD y puede estar en * el rango de 0 a 32622, donde cada caracter corresponde al rango ASCII * de 0 a 255. Ninguna de las teclas extendidas puede ser puestas en * el buffer de teclado. * Haciendo KEYBOARD " " limpiar  el buffer de teclado. * $EXAMPLES$ * // Coloca la tecla en el buffer de teclado. * KEYBOARD CHR(13) * * // Borra el buffer de teclado. * CLEAR TYPEAHEAD * * $TESTS$ * KEYBOARD CHR(13); ? INKEY() ==> 13 * KEYBOARD "HOLA"; CLEAR TYPEAHEAD; ? INKEY() ==> 0 * * $STATUS$ * R * $COMPLIANCE$ * __KEYBOARD() es compatible con CA-Cl*pper 5.3 * $SEEALSO$ * CLEAR TYPEAHEAD,__KEYBOARD() * $END$ */ /* $DOC$ * $FUNCNAME$ * READKEY()* * $CATEGORY$ * Entrada y Salida de datos * $ONELINER$ * Encuentra cual tecla caus¢ la salida del READ * $SYNTAX$ * READKEY() --> nCodigoTecla * $ARGUMENTS$ * Ninguno. * $RETURNS$ * READKEY() retorna un c¢digo num‚rico representando la tecla que * caus¢ la terminaci¢n del READ. * $DESCRIPTION$ * READKEY() es usado despu‚s que un READ ha terminado para determinar * la tecla de salida. * Si el buffer del GET fu‚ actualizado durante el READ, el valor 256 * es agregado al c¢digo de retorno. * * * Tecla de C¢digo de Retorno C¢digo de Retorno * Salida (no actualizado) (actualizado) * * Up 4 260 * Down 5 261 * Page-Up 6 262 * Page-Down 7 263 * Ctrl Page-Up 34 290 * Ctrl Page-Down 35 291 * Esc 12 268 * Ctrl End 14 270 * Enter 15 271 * Key >= 32 15 271 * de otro modo 0 0 *
* READKEY() es una funci¢n de compatibilidad, as¡ que trate de no * usarla. READKEY() es superada por LASTKEY() la que retorna el c¢digo * de INKEY() para esa tecla. UPDATED() podr¡a ser usado para encontrar * si el buffer GET hab¡a cambiado durante el READ. * $STATUS$ * R * $COMPLIANCE$ * READKEY() es compatible con CA-Cl*pper 5.3 * $FILES$ * La librer¡a es rtl * $SEEALSO$ * @...GET,INKEY(),LASTKEY(),READ,READEXIT(),UPDATED() * $END$ */ /* $DOC$ * $FUNCNAME$ * MROW() * $CATEGORY$ * Entrada de Consola * $ONELINER$ * Retorna la fila de posici¢n del cursor del mouse. * $SYNTAX$ * MROW() --> nFilaMouse * $ARGUMENTS$ * Ninguno * $RETURNS$ * la fila de posici¢n del cursor del mouse. * $DESCRIPTION$ * Esta funci¢n retorna el fila de posicion actual del cursor del mouse * En sistemas gr ficos el valor representa filas de pixels. * En sistemas basados en caracteres el valor representa filas de * caracteres como en Clipper. * $EXAMPLES$ * IF MROW() < 1 * ? "El Mouse esta en la fila superior!" * ENDIF * * $STATUS$ * R * $COMPLIANCE$ * MROW() es compatible con CA-Cl*pper 5.3, pero ha sido extendido para * trabajar sobre sistemas gr ficos tan bien como en sistemas basados * en caracteres. * $PLATFORMS$ * Todas. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * MCOL() * $END$ */ /* $DOC$ * $FUNCNAME$ * MCOL() * $CATEGORY$ * Entrada de Consola * $ONELINER$ * Retorna la columna de posici¢n del cursor del mouse. * $SYNTAX$ * MCOL() --> nColumnaMouse * $ARGUMENTS$ * Ninguno. * $RETURNS$ * la columna de posici¢n del cursor del mouse. * $DESCRIPTION$ * Esta funci¢n retorna la columna de posici¢n actual del cursor del * mouse. * En sistemas gr ficos el valor representa filas de pixels. * En sistemas basados en caracteres el valor representa filas de * caracteres como en Clipper. * $EXAMPLES$ * IF MCOL() < 1 * ? "El Mouse esta sobre el margen izquierdo!" * ENDIF * $STATUS$ * R * $COMPLIANCE$ * MCOL() es compatible con CA-Cl*pper 5.3, pero ha sido extendido para * trabajar sobre sistemas gr ficos tan bien como en sistemas basados * en caracteres. * $PLATFORMS$ * Todas. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * MROW() * $END$ */
c:\harbour\doc\es\lang.txt
/*
 * $Id: lang.txt 6360 2004-05-27 18:47:38Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000-2004 Alejandro de G rate 
 *    Documentaci¢n en Espa¤ol de: HB_LANGSELECT(), HB_LANGNAME()
 *       HB_LANGERRMSG(), HB_LANGMESSAGE(), HB_SETCODEPAGE(), HB_TRANSLATE()
 *
 * Copyright 2000 Luiz Rafael Culik 
 *    Documentaci¢n en Ingl‚s de: HB_LANGSELECT(), HB_LANGNAME()
 *
 * Copyright 2004 Chen Kedem 
 *    Documentaci¢n en Ingl‚s de: HB_LANGERRMSG(), HB_LANGMESSAGE(),
 *                       HB_SETCODEPAGE(), HB_TRANSLATE()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HB_LANGERRMSG()
 *  $CATEGORY$
 *      Nacion
 *  $ONELINER$
 *      Descripción de un código de error usando el idioma actual
 *  $SYNTAX$
 *      HB_LANGERRMSG(  ) --> cMensajeError
 *  $ARGUMENTS$
 *       es uno de los código de error genéricos (EG_...)
 *                     definidos en include/error.ch
 *  $RETURNS$
 *      HB_LANGERRMSG() retorna la cadena con el mensaje de error que
 *      representa al código .
 *  $DESCRIPTION$
 *      Esta función devuelve el mensaje de error asociado con un código de
 *      error usando el idioma actual seleccionado.
 *  $EXAMPLES$
 *      #include "error.ch"
 *
 *      REQUEST HB_LANG_ES
 *
 *      FUNCTION Main()
 *      // English: Argument error
 *      ? "English:", HB_LANGERRMSG( EG_ARG )
 *      HB_LANGSELECT( "ES" )
 *
 *      // Spanish: Error de argumento
 *      ? "Spanish:", HB_LANGERRMSG( EG_ARG )
 *      RETURN NIL
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta función es una Extensión de Harbour
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Las Librerías asociadas son: rtl, lang
 *      El archivo de cabecera es error.ch
 *  $SEEALSO$
 *      HB_LANGSELECT(),NATIONMSG()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HB_LANGMESSAGE()
 *  $CATEGORY$
 *      Nacion
 *  $ONELINER$
 *      Retorna una cadena de errores y mensajes internacionales
 *  $SYNTAX$
 *      HB_LANGMESSAGE(  ) --> cMensaje
 *  $ARGUMENTS$
 *       es el código numérico del mensaje 
 *  $RETURNS$
 *      HB_LANGMESSAGE() devuelve el texto asociado con el código .
 *  $DESCRIPTION$
 *      HB_LANGMESSAGE() es similar a NATIONMSG() pero permite el acceso a
 *      la lista completa de mensajes para un idioma determinado: nombres
 *      de Día y Mes, mensajes de error genéricos, errores internos, etc.
 *
 *      Utilice el archivo de cabecera hblang.ch para obtener una lista de
 *      los valores de base para .
 *  $EXAMPLES$
 *      #include "hblang.ch"
 *
 *      REQUEST HB_LANG_ES
 *
 *      FUNCTION Main()
 *      // English: Monday
 *      ? "English:", HB_LANGMESSAGE( HB_LANG_ITEM_BASE_DAY + 1 )
 *      HB_LANGSELECT( "ES" )
 *
 *      // Spanish: Lunes
 *      ? "Spanish:", HB_LANGMESSAGE( HB_LANG_ITEM_BASE_DAY + 1 )
 *      RETURN NIL
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta función es una Extensión de Harbour
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Las Librerías asociadas son: rtl, lang
 *      El archivo de cabecera es hblang.ch
 *  $SEEALSO$
 *      HB_LANGSELECT(),NATIONMSG(),REQUEST
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HB_LANGSELECT()
 *  $CATEGORY$
 *      Nacion
 *  $ONELINER$
 *      Selecciona un m¢dulo de mensajes espec¡fico a una nacionalidad.
 *  $SYNTAX$
 *      HB_LANGSELECT()   --> cViejoLeng
 *  $ARGUMENTS$
 *        El c¢digo de identificaci¢n del m¢dulo de idioma del
 *                    pa¡s.
 *      Los valores posibles para  estan mostrados abajo, tal
 *      como est n definidos en la librer¡a de Lenguajes, ordenados por
 *      idioma.
 *
 *      
 *      Idioma               C¢digo de P gina   
 *      Vasco                850                EU
 *      Catal n              850                CA
 *      Chino Simplificado   936                ZHGB
 *      Chino Tradicional    950                ZHB5
 *      Croata               852                HR852
 *      Croata               ISO-8859-2         HRISO
 *      Checo                852                CS852
 *      Checo                ISO-8859-2         CSISO
 *      Checo                KAM                CSKAM
 *      Checo                Windows-1250       CSWIN
 *      Ingl‚s               437                EN
 *      Esperanto            850                EO
 *      Franc‚s              850                FR
 *      Gallego              850                GL
 *      Alem n               850                DE
 *      Alem n ANSI          ANSI               DEWIN
 *      Griego               737                EL
 *      Griego ANSI          Windows-1253       ELWIN
 *      Hebreo               862                HE862
 *      Hebreo               Windows-1255       HEWIN
 *      Hungaro              852                HU852
 *      Hungaro              CWI-2              HUCWI
 *      Hungaro              Windows-1          HUWIN
 *      Island‚s             850                IS850
 *      Indonesio            437                ID
 *      Italiano             437                IT
 *      Coreano              949                KO
 *      Polaco               852                PL852
 *      Polaco               ISO-8859-1         PLISO
 *      Polaco               Mozowia            PLMAZ
 *      Polaco               Windows-1250       PLWIN
 *      Portugu‚s            850                PT
 *      Rumano               852                RO
 *      Ruso                 866                RU866
 *      Ruso                 KOI-8              RUKOI8
 *      Ruso                 Windows-1251       RUWIN
 *      Serbio               852                SR852
 *      Serbio               ISO-8859-2         SRISO
 *      Serbio               Windows-1251       SRWIN
 *      Eslovenio            437                SL437
 *      Eslovenio            852                SL852
 *      Eslovenio            ISO-8859-2         SLISO
 *      Eslovenio            Windows-1251       SLWIN
 *      Espa¤ol              850                ES
 *      Espa¤ol ANSI         ANSI               ESWIN
 *      
* $RETURNS$ * El identificador anterior de Lenguaje * $DESCRIPTION$ * Esta funci¢n establece un m¢dulo de lenguaje o idioma para las * advertencias internas, mensajes NatMsg y errores internos que * utilizan nombres de fechas, d¡as, meses, etc. * Cuando una IDentificaci¢n de Lenguaje es elegida todos los mensajes * son mostrados de acuerdo al actual idioma, hasta que otro sea * seleccionado, ¢ el programa termine. * La ID son dos letras que establecen la correspondencia con un idioma * dado de acuerdo a una tabla. * * Nota: La tabla que se muestra arriba puede no estar completa. * $EXAMPLES$ * * El siguiente ejemplo cambia el m¢dulo de idioma por defecto, y * luego muestra por pantalla la ID del m¢dulo de lenguaje, el nombre * del d¡a de la semana y el mes en varios idiomas. * * REQUEST HB_LANG_PT * REQUEST HB_LANG_RO * REQUEST HB_LANG_ES * LOCAL nViejo * * HB_LANGSELECT("PT") // el idioma por defecto es ahora Portugu‚s * ? "La nueva ID de idioma elegida es ", HB_LANGSELECT() // PT * ? CDOW( DATE() ) * ? CMONTH( DATE() ) * * nViejo := HB_LANGSELECT("RO") // el idioma por defecto es Romano * ? "La vieja ID de idioma elegida era ", nViejo // PT * ? "La nueva ID de idioma elegida es ", HB_LANGSELECT() // RO * ? CDOW( DATE() ) * ? CMONTH( DATE() ) * * HB_LANGSELECT("ES") // el idioma por defecto es ahora Espa¤ol * ? "La nueva ID de idioma elegida es ", HB_LANGSELECT() // ES * ? CDOW( DATE() ) * ? CMONTH( DATE() ) * * $TESTS$ * Vea ..\tests\langapi.prg tests\langmsg.prg * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una Extensi¢n de Harbour. * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * HB_LANGNAME(),HB_SETCODEPAGE(),NATIONMSG(),REQUEST * $END$ */ /* $DOC$ * $FUNCNAME$ * HB_LANGNAME() * $CATEGORY$ * Nacion * $ONELINER$ * Retorna el nombre del m¢dulo actual de lenguaje en uso. * $SYNTAX$ * HB_LANGNAME() --> cNombreLenguaje * $ARGUMENTS$ * Ninguno. * $RETURNS$ * HB_LANGNAME() retorna , el nombre del idioma en uso * $DESCRIPTION$ * Esta funci¢n describe el nombre del idioma ¢ lenguaje correspondiente * al que existe por defecto ¢ ha sido establecido por HB_LANGSELECT(). * $EXAMPLES$ * * El siguiente ejemplo cambia el m¢dulo de idioma por defecto, y * luego muestra por pantalla la ID del m¢dulo de lenguaje, el idioma * asociado a esa ID. y el d¡a de la semana y el mes en varios idiomas * * REQUEST HB_LANG_PT * REQUEST HB_LANG_ES * * HB_LANGSELECT("PT") // el idioma por defecto es ahora Portugu‚s * ? "El idioma actual es ", HB_LANGNAME() // Portugu‚s * ? "La nueva ID de idioma elegida es ", HB_LANGSELECT() // RO * ? CDOW( DATE() ) * ? CMONTH( DATE() ) * * HB_LANGSELECT("ES") // el idioma por defecto es ahora Espa¤ol * ? "El idioma actual es ", HB_LANGNAME() // Espa¤ol * ? CDOW( DATE() ) * ? CMONTH( DATE() ) * $TESTS$ * Vea ..\tests\langapi.prg tests\langmsg.prg * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una Extensi¢n de Harbour. * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es lang * Nota: el nombre de la extensi¢n de la librer¡a, puede cambiar con * el sistema operativo (.lib .o , etc.) * $SEEALSO$ * HB_LANGSELECT(),NATIONMSG() * $END$ */ /* $DOC$ * $FUNCNAME$ * HB_SETCODEPAGE() * $CATEGORY$ * Nacion * $ONELINER$ * Selecciona el c¢digo de página activo por la ID del idioma * $SYNTAX$ * HB_SETCODEPAGE( [] ) --> cViejoLeng * $ARGUMENTS$ * El c¢digo de identificaci¢n opcional del m¢dulo de * idioma del pa¡s. * Los valores posibles para estan mostrados abajo, tal * como est n definidos en la librer¡a de Lenguajes, ordenados por * idioma (según doc. original en inglés). * * * Idioma C¢digo de P gina * * Ingl‚s 437 EN * Alem n 850 DE * Alem n ANSI ANSI DEWIN * Griego 737 EL * Griego ANSI Windows-1253 ELWIN * Hungaro 852 HU852 * Hungaro Windows-1 HUWIN * Polaco 852 PL852 * Polaco ISO-8859-2 PLISO * Polaco Mozowia PLMAZ * Polaco Windows-1250 PLWIN * Portugu‚s 850 PT * Portugu‚s ISO-8859-1 PTISO * Ruso 866 RU866 * Ruso KOI-8 RUKOI8 * Ruso Windows-1251 RUWIN * Serbio Windows-1251 SRWIN * Eslovenio 437 SL437 * Eslovenio 852 SL852 * Eslovenio ISO-8859-2 SLISO * Eslovenio Windows-1250 SLWIN * Espa¤ol 850 ES * Espa¤ol ANSI ANSI ESWIN *
* $RETURNS$ * El identificador anterior de Lenguaje * $DESCRIPTION$ * HB_SETCODEPAGE() establece el código de página activo usado por * Harbour para ordenar y comparar cadenas. El código de página por * defecto usa el orden ASCII del idioma inglés (cLang == "EN"). * * NOTA: Usted debe solicitar a través del comando 'REQUEST' cada * módulo de código de página que Ud. intente usar. * Por ejemplo: para usar el código de página Ruso: RU866, Ud. debe * agregar lo siguiente a su programa: * REQUEST HB_CODEPAGE_RU866 * $EXAMPLES$ * REQUEST HB_CODEPAGE_HU852 * * FUNCTION Main() * LOCAL cTxt := CHR( 71 ) + " > " + CHR( 144 ) + " is" * * ? HB_SETCODEPAGE() // EN * ? cTxt, CHR( 71 ) > CHR( 144 ) // G >  is .F. * * ? HB_SETCODEPAGE( "HU852" ) // EN * ? cTxt, CHR( 71 ) > CHR( 144 ) // G >  is .T. * * ? HB_SETCODEPAGE( "EN" ) // HU852 * ? cTxt, CHR( 71 ) > CHR( 144 ) // G >  is .F. * RETURN NIL * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una Extensi¢n de Harbour. * * Esta funci¢n es solamente visible si source/rtl/cdpapi.c fué * compilado sin la bandera: HB_CDP_SUPPORT_OFF * $PLATFORMS$ * Todas * $FILES$ * La librer¡as asociadas son rtl, codepage * $SEEALSO$ * HB_LANGNAME(),HB_LANGSELECT(),HB_TRANSLATE(),NATIONMSG(),REQUEST * $END$ */ /* $DOC$ * $FUNCNAME$ * HB_TRANSLATE() * $CATEGORY$ * Nacion * $ONELINER$ * Traduce una cadena de un código de página a otro. * $SYNTAX$ * HB_TRANSLATE( , [], [] ) * --> cTextoDest * $ARGUMENTS$ * Es la cadena original a traducir. * * Es la ID opcional del código de página de la cadena * original. Si no es especificada, es usado el código de * página por defecto. * * Es la ID opcional del código de página de la cadena de * destino. Si no es especificada, es usado el código de * página por defecto. * $RETURNS$ * HB_TRANSLATE() devuelve la cadena de destino convertida a partir de * la cadena original. * $DESCRIPTION$ * HB_TRANSLATE() trata de convertir la cadena original desde un código * de página a otro. Si el código de página no es reconocido, ó no es * enlazado, el código de página por defecto, es usado. * HB_TRANSLATE() es generalmente usado para convertir entre los códigos * de página de DOS y Windows, para un mismo idioma. * * NOTA: Si el código de página de origen y el código de página de * destino, no tienen el mismo número de caracteres, la traducción * no puede ser realizada y la cadena de destino es una copia de * la cadena de origen. * * NOTA: Usted debe solicitar a través del comando 'REQUEST' cada * módulo de código de página que Ud. intente usar. * Por ejemplo: para usar el código de página Ruso: RU866, Ud. debe * agregar lo siguiente a su programa: * REQUEST HB_CODEPAGE_RU866 * $EXAMPLES$ * REQUEST HB_CODEPAGE_DE * REQUEST HB_CODEPAGE_DEWIN * * FUNCTION Main() * LOCAL cTxt := "A" + CHR( 142 ) + "BC" * * ? "Texto Alemán 850 :", cTxt * ? "Texto Alemán ANSI:", HB_TRANSLATE( cTxt, "DE", "DEWIN" ) * RETURN NIL * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una Extensi¢n de Harbour. * * Esta funci¢n es solamente visible si source/rtl/cdpapi.c fué * compilado sin la bandera: HB_CDP_SUPPORT_OFF * $PLATFORMS$ * Todas * $FILES$ * La librer¡as asociadas son rtl, codepage * $SEEALSO$ * HB_LANGSELECT(),HB_SETCODEPAGE(),NATIONMSG(),REQUEST * $END$ */
c:\harbour\doc\es\license.txt
/*
 * $Id: license.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de license.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Licencia
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Licencia Actual Del Proyecto Harbour
 *  $DESCRIPTION$
 *
 *      LICENCIA
 *
 *      Traducci¢n: Alejandro de G rate.    
 *
 *      Nota del traductor:
 *      Se encar¢ la traducci¢n de la licencia de Harbour de su original
 *      en ingl‚s al espa¤ol, debido a que su comprensi¢n podr¡a aportar
 *      beneficios en los alcances del uso de Harbour y evitar algunos
 *      malentendidos ya sea para uso personal ¢ comercial.
 *
 *      Soy conciente que la presente traducci¢n puede contener alg£n
 *      error u omisi¢n, aunque he hecho los esfuerzos posibles para
 *      que ello no ocurra.
 *
 *      Para mayor informaci¢n sobre que opina la FSF acerca de las
 *      traducciones de la GPL consulte:
 *        
 *
 *
 *      Nota Previa al texto de la licencia: (requisito de la FSF)
 *
 *      This is an unofficial translation of the GNU General Public License
 *      into spanish. It was not published by the Free Software Foundation,
 *      and does not legally state the distribution terms for software that
 *      uses the GNU GPL--only the original English text of the GNU GPL does
 *      that. However, we hope that this translation will help spanish
 *      speakers understand the GNU GPL better.
 *
 *      Esta es una traducci¢n no oficial de la Licencia Publica General GNU
 *      al espa¤ol. No fue publicada por la Fundaci¢n de Software Libre, y
 *      no establece legalmente los t‚rminos de distribuci¢n para software
 *      que usa la GPL GNU--s¢lo el texto original en ingl‚s de la GPL GNU
 *      lo hace. Sin embargo, esperamos que esta traducci¢n ayude a gente de
 *      habla hispana a entender mejor la GNU GPL.
 *
 *
 *
 *      LICENCIA ACTUAL DEL PROYECTO HARBOUR
 *      ====================================
 *
 *      (Actualizada al 10/06/2001)
 *
 *      "Este programa es software libre; Ud. puede redistribuirlo y/o
 *      modificarlo bajo los t‚rminos de la Licencia P£blica General GNU
 *      como fu‚ publicada por la Fundaci¢n de Software Libre; sea la
 *      versi¢n 2 de la Licencia, ¢ (a su elecci¢n) alguna versi¢n posterior.
 *
 *      Este programa es distribuido con la esperanza que le pueda ser £til,
 *      pero SIN NINGUNA GARANTIA;  a£n sin la garant¡a impl¡cita de
 *      COMERCIALIZACION ¢ DESTINO PARA ALGUN PROPOSITO PARTICULAR.
 *      Consulte la License P£blica General GNU para mayores detalles.
 *
 *      Ud. deber¡a haber recibido una copia de la Licencia P£blica General
 *      GNU junto con este programa; Vea el archivo COPYING. Si no, escriba
 *      a la Fundaci¢n de Software Libre:
 *
 *         Free Software Foundation, Inc.,
 *         59 Temple Place, Suite 330,
 *         Boston, MA 02111-1307 USA
 *      (¢ visite su sitio Web en http://www.gnu.org/).
 *
 *      Como una especial excepci¢n, el proyecto Harbour da permiso para
 *      usos adicionales del texto contenido en esta liberaci¢n de Harbour.
 *
 *      La excepci¢n es que, si Ud. enlaza (link) la Librer¡as de Harbour
 *      con otros archivos para producir un ejecutable, esto por s¡ mismo
 *      no causa que el ejecutable resultante sea cubierto por la Licencia
 *      P£blica General GNU.
 *      El uso de ese ejecutable por parte suya no esta en ninguna forma
 *      restringido, en cuenta del enlazado del c¢digo de librer¡a de
 *      Harbour dentro de ‚l.
 *
 *      Esta excepci¢n sin embargo, no invalida algunas otras razones por
 *      las cuales el archivo ejecutable podr¡a estar cubierto por la
 *      Licencia P£blica General GNU.
 *
 *      Esta excepci¢n se aplica:  solamente al c¢digo liberado por el
 *      Proyecto Harbour bajo el nombre "Harbour".  Si Ud. copia c¢digo
 *      desde otro Proyecto Harbour ¢ desde alguna liberaci¢n de la
 *      Fundaci¢n de Software Libre, dentro de una copia de Harbour, tal
 *      como la Licencia P£blica General lo permite, la excepci¢n no se
 *      aplica al c¢digo que Ud. agrega de esta forma.  Para evitar enga¤os
 *      a alguien con el estado de estos archivos modificados, Ud. debe
 *      borrar el aviso de excepci¢n de ellos.
 *
 *      Si Ud. escribe modificaciones de su propia creaci¢n para Harbour,
 *      es su elecci¢n, cu ndo permitir que esta excepci¢n se aplique a
 *      sus modificaciones.
 *      Si Ud. no desea eso, borre el aviso de excepci¢n."
 *
 *
 *  $SEEALSO$
 *      PANORAMA
 *  $END$
 */ 


c:\harbour\doc\es\macro.txt
/*
 * $Id: macro.txt 6075 2003-07-13 18:08:15Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2002 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:  
 *        Compilador Macro, HB_SETMACRO()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Compilador Macro
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Compilador Macro
 *  $DESCRIPTION$
 *
 *      Invocando al compilador de Macros: 
 *      =================================
 *
 *         &variable                     
 *      ¢
 *         &( expresi¢n )               
 *      ¢
 *         &variable.text                
 *
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HB_SETMACRO()
 *  $CATEGORY$
 *      Compilador Macro
 *  $ONELINER$
 *      Habilita/Inhabilita las caracter¡sticas del Compilador Macro
 *  $SYNTAX$
 *      HB_SETMACRO( , [] ) --> 
 *  $ARGUMENTS$
 *       Una de las constantes HB_SM_* definidas en set.ch.
 *
 *        Usar .T. para habilitar ¢ .F. para Inhabilitar una 
 *                caracter¡stica.
 *  $RETURNS$
 *      HB_SETMACRO() retorna el estado anterior de la caracter¡stica
 *      solicitada.
 *  $DESCRIPTION$
 *      Esta funci¢n Habilita / Inhabilita algunas de las caracter¡sticas 
 *      del Compilador de Macros. Harbour extiende las caracter¡sticas para
 *      macros comparadas con el conjunto original en Clipper. 
 *      Habilitando / Inhabilitando algunas de ellas permite mantener una 
 *      estricta compatibilidad con Clipper.
 *
 *      Las caracter¡sticas disponibles son:
 *
 *      HB_SM_HARBOUR - Habilita las extensiones de Harbour:
 *            operadores: ++, --, +=, -=, *=, /=, ^=
 *            objetos:    asignaciones a una variable de instancia
 *
 *      HB_SM_XBASE - Habilita extensiones de otros dialectos xbase:
 *            Expansi¢n de listas de expresiones
 *
 *      HB_SM_SHORTCUTS - Habilita la evaluaci¢n optimizada de los
 *            operadores l¢gicos (.AND., .OR.)
 *
 *      HB_SM_PREPROC - Habilita el preprocesamiento de comandos
 *            Esto es significativo si Harbour es compilado con la bandera
 *            HB_MACRO_STATEMENTS establecida.
 *
 *  $EXAMPLES$
 *      INIT PROCEDURE IWANTCLIPPER()
 *        HB_SETMACRO( HB_SM_HARBOUR, .F. )
 *        HB_SETMACRO( HB_SM_XBASE, .F. )
 *      RETURN
 *
 *  
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El archivo de cabecera es ..\include\set.ch
 *      La Librer¡a es macro
 *  $SEEALSO$
 *      Compilador Macro
 *  $END$
 */ 


c:\harbour\doc\es\math.txt
/*
 * $Id: math.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Ricardo Ram¡rez R. 
 * Documentaci¢n en Espa¤ol de: ABS(), EXP(), LOG(), INT(), MAX()
 *                              MIN(), SQRT(), ROUND()
 *
 *      Basado en ../en/math.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ABS()
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Devuelve el valor absoluto de un n£mero.
 *  $SYNTAX$
 *      ABS() --> 
 *  $ARGUMENTS$
 *       Cualquier n£mero.
 *  $RETURNS$
 *       El valor absoluto de un n£mero.
 *  $DESCRIPTION$
 *      Esta funci¢n entrega el valor absoluto de un valor o una expresi¢n
 *      .
 *  $EXAMPLES$
 *      Function Main()
 *
 *         Local nNumero  := 50
 *         Local nNumero1 := 27
 *
 *         qout( nNumero - nNumero1 )
 *         qout( nNumero1 - nNumero )
 *         qout( ABS(nNumero - nNumero1 ) )
 *         qout( ABS(nNumero1 - nNumero ) )
 *         qout( ABS( -1 * 345 ) )
 *      Return Nil
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      EXP(),INT()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      EXP()
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Calcula el valor de e elevado a la potencia indicada.
 *  $SYNTAX$
 *      EXP(  ) --> 
 *  $ARGUMENTS$
 *       Cualquier n£mero real.
 *  $RETURNS$
 *        El anti-logaritmo de .
 *  $DESCRIPTION$
 *      Esta function devuelve el valor de e elevado a la potencia indicada
 *      en .  Es la contraria de LOG().
 *  $EXAMPLES$
 *      ? EXP(45)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      LOG(),SET DECIMALS,SET FIXED
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      INT()
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Devuelve la parte entera de un valor n£merico.
 *  $SYNTAX$
 *      INT(  ) --> 
 *  $ARGUMENTS$
 *       Cualquier valor n£merico.
 *  $RETURNS$
 *       La parte entera de un valor n£merico.
 *  $DESCRIPTION$
 *      Esta funci¢n convierte una expresi¢n num‚rica en entero.  Todos
 *      lo d¡gitos decimales son truncados.  Esta funci¢n no redondea el
 *      valor ni por encima ni por debajo; simplemente trunca el valor
 *      desde el punto decimal.
 *  $EXAMPLES$
 *      SET Decimal to 5
 *      ? INT( 632512.62541 )
 *      ? INT( 845414111.91440 )
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      ROUND(),STRZERO()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      LOG()
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Devuelve el logaritmo natural de un n£mero.
 *  $SYNTAX$
 *      LOG(  ) --> 
 *  $ARGUMENTS$
 *       Cualquier expresi¢n num‚rica.
 *  $RETURNS$
 *       El logaritmo natural de .
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve el logaritmo natural del n£mero .
 *      Si  es 0 o menor que 0, se produce un desbordamiento
 *      num‚rico, el cual es mostrado en la pantalla como una serie de
 *      asteriscos.
 *      Esta funci¢n es la contraria de EXP().
 *  $EXAMPLES$
 *      ? LOG(632512)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      EXP(),SET DECIMALS,SET FIXED
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      MAX()
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Devuelve el mayor de dos n£meros o fechas.
 *  $SYNTAX$
 *      MAX(,)  --> 
 *  $ARGUMENTS$
 *       Cualquier fecha o valor n£merico.
 *
 *       Cualquier fecha o valor n£merico (con el mismo tipo de
 *                ).
 *  $RETURNS$
 *       El n£mero mayor (o la fecha mayor).
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve el mayor de las dos expresiones pasadas. Si
 *       y  son del tipo n£merico, el valor devuelto
 *      por esta funci¢n ser  tambien num‚rico y ser  el mayor de los
 *      numeros pasados a dicha funci¢n. Si  y  son del
 *      tipo fecha el valor devuelto ser  tambien de tipo fecha.  Este ser 
 *      la mayor de ellas.
 *  $EXAMPLES$
 *      ? MAX( 214514214,6251242142 )
 *      ? MAX( CTOD('11/11/2000'), CTOD('21/06/2014') )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      MIN()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      MIN()
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Determina el menor de dos n£meros o fechas.
 *  $SYNTAX$
 *      MIN(,)  --> 
 *  $ARGUMENTS$
 *        Cualquier fecha o valor num‚rico.
 *
 *       Cualquier fecha o valor num‚rico (con el mismo tipo de
 *                ).
 *  $RETURNS$
 *        El valor o fecha menor.
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve el menor valor del par de expresiones
 *      recibidas  y  deben ser del mismo tipo. Si es
 *      num‚rico, el menor valor es devuelto.  Si es fecha, la fecha menor
 *      es devuelta.
 *  $EXAMPLES$
 *      ? MIN(214514214,6251242142)
 *      ? MIN(CTOD('11/11/2000'),CTOD('21/06/2014')
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      MAX()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      MOD() *
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Devuelve el residuo de dos n£meros.
 *  $SYNTAX$
 *      MOD( ,) -->  
 *  $ARGUMENTS$
 *         Numerador en una expresi¢n de divisi¢n.
 *
 *        Denominador en una expresi¢n de divisi¢n.
 *  $RETURNS$
 *        El residuo despues de la operaci¢n de divisi¢n.
 *  $DESCRIPTION$
 *      Esta funci¢n devuleve el residuo de un n£mero dividido entre otro.
 *  $EXAMPLES$
 *      ? MOD( 12,8.521 )
 *      ? MOD( 12,0 )
 *      ? MOD( 62412.5142,4522114.12014 )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      %
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      SQRT()
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Calcula la ra¡z cuadrada de un n£mero.
 *  $SYNTAX$
 *      SQRT(  ) --> 
 *  $ARGUMENTS$
 *       Cualquier valor num‚rico.
 *  $RETURNS$
 *         La ra¡z cuadrada de .
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve la ra¡z cuadrada de .  La presici¢n
 *      de esta evaluaci¢n esta basada £nicamente en la asignaci¢n del
 *      comando SET DECIMAL TO
 *      Cualquier n£mero negativo pasado como  siempre retornar  0.
 *  $EXAMPLES$
 *      SET Decimal to 5
 *      ? SQRT( 632512.62541 )
 *      ? SQRT( 845414111.91440 )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      ROUND(),SET DECIMALS,SET FIXED
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ROUND()
 *  $CATEGORY$
 *      Matem ticas
 *  $ONELINER$
 *      Redondea una expresi¢n num‚rica.
 *  $SYNTAX$
 *      ROUND( ,  ) --> 
 *  $ARGUMENTS$
 *          Cualquier valor num‚rico.
 *
 *         El n£mero de lugares decimales a redondear.
 *  $RETURNS$
 *       El n£mero redondeado.
 *  $DESCRIPTION$
 *      Esta funci¢n redondea el valor de  a la cantidad de lugares
 *      decimales especificados en . Si el valor de  es
 *      un n£mero negativo, la funci¢n intentar  redondear  en el
 *      n£mero completo. N£meros de 5 a 9 ser n redondeados hacia arriba, el
 *      resto redondeados hacia abajo.
 *  $EXAMPLES$
 *      ? ROUND(632512.62541,5)
 *      ? ROUND(845414111.91440,3)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $SEEALSO$
 *      INT(),SET DECIMALS,SET FIXED,STR(),VAL()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_getMathError()
 *  $CATEGORY$
 *      Matem ticas API
 *  $ONELINER$
 *      Obtener el £ltimo error de la librer¡a matem tica.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_getMathError (void) --> int iMathError
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Retorna el £ltimo error matem tico
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_setMathError(),hb_resetMathError()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_resetMathError()
 *  $CATEGORY$
 *      Matem ticas API
 *  $ONELINER$
 *      Inicializa el error matem tico.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_resetMathError (void) --> void
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Pone en cero (No hay error) a la variable donde se conservan los
 *      errores matem ticos
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_isMathHandler()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_isMathHandler()
 *  $CATEGORY$
 *      Matem ticas API
 *  $ONELINER$
 *      Verifica si el manejador de errores de Harbour esta disponible.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_isMathHandler (void) --> int iIsMathHandler
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_installMathHandler(),hb_getMathHandlerStatus()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_installMathHandler()
 *  $CATEGORY$
 *      Matem ticas API
 *  $ONELINER$
 *      Agrega un manejador de errores definido por el usuario
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_installMathHandler (HB_MATH_HANDLERPROC handlerproc)
 *                              --> HB_MATH_HANDLERHANDLE handle
 *  $ARGUMENTS$
 *       Manejador para el manejador de errores
 *  $RETURNS$
 *            Identificador del manejador en la cadena de
 *                    identificadores.
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_deinstallMathHandler()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_deinstallMathHandler()
 *  $CATEGORY$
 *      Matem ticas API
 *  $ONELINER$
 *      Quita un manejador de errores definido por el usuario.
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_deinstallMathHandler (HB_MATH_HANDLERHANDLE handle)
 *                                --> int iSuccess
 *  $ARGUMENTS$
 *            Identificador devuelto por hb_installMathHandler()
 *  $RETURNS$
 *          Como termino el proceso.
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_installMathHandler()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_setMathHandlerStatus()
 *  $CATEGORY$
 *      Matem ticas API
 *  $ONELINER$
 *      Pone el estado del manejador de errores definido por el usuario
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_setMathHandlerStatus (HB_MATH_HANDLERHANDLE handle, int status)
 *                                --> int iSuccess
 *  $ARGUMENTS$
 *            Identificador devuelto por hb_installMathHandler()
 *            nuevo valor del estado, puede ser uno de los
 *                    siguientes:
 *                       HB_MATH_HANDLER_STATUS_INACTIVE
 *                         --> identificador presente pero no activo
 *                       HB_MATH_HANDLER_STATUS_ACTIVE
 *                         --> identificador presente y activo
 *  $RETURNS$
 *      iSuccess      Como termino el proceso.
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_getMathHandlerStatus()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      hb_getMathHandlerStatus()
 *  $CATEGORY$
 *      Matem ticas API
 *  $ONELINER$
 *      Lee el estado del manejador de errores definido por el usuario
 *  $SYNTAX$
 *      C Prototype
 *
 *      #include 
 *      hb_getMathHandlerStatus (HB_MATH_HANDLERHANDLE handle)
 *                                --> int iStatus
 *  $ARGUMENTS$
 *            Identificador devuelto por hb_installMathHandler()
 *  $RETURNS$
 *           Estado del manejador de errores.
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Compatibilidad no es aplicable a las llamadas a las APIs.
 *  $FILES$
 *      Se encuentra en la librer¡a rtl
 *  $PLATFORMS$
 *      Todas
 *  $SEEALSO$
 *      hb_setMathHandlerStatus()
 *  $END$
 */


c:\harbour\doc\es\memo.txt
/*
 * $Id: memo.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000-2003 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: MEMOTRAN(), HARDCR()
 *                              MEMOREAD(), MEMOWRIT()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      MEMOTRAN()
 *  $CATEGORY$
 *      Cadenas
 *  $ONELINER$
 *      Reemplaza los retornos del carro/nueva linea de una cadena
 *  $SYNTAX$
 *      MEMOTRAN( , ,  ) --> 
 *  $ARGUMENTS$
 *       es la cadena de caracteres a convertir.
 *
 *       es el car cter para reemplazar los retornos de carro "duro".
 *              Si no es especificado por defecto es el punto y coma.
 *
 *       es el c racter para reemplazar los retornos de carro
 *               "blandos". Si no es especificado, por defecto es un espacio
 *                en blanco.
 *  $RETURNS$
 *      MEMOTRAN() retorna , la cadena transformada.
 *  $DESCRIPTION$
 *      Esta funci¢n retorna una cadena donde los caracteres de retorno de
 *      carro han sido convertidos a los caracteres especificados.
 *  $EXAMPLES$
 *      * El siguiente ejemplo formatea un campo memo conteniendo un mensaje
 *        de error en una cadena adecuada para ser enviada a la funci¢n
 *        ALERT()
 *
 *        cMensaje = MEMOTRAN( Errores->MENSAJE )
 *        ALERT( cMensaje, aOpciones )
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a asociada es rtl
 *  $SEEALSO$
 *      HARDCR(),STRTRAN()
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      HARDCR()
 *  $CATEGORY$
 *      Cadenas
 *  $ONELINER$
 *       Reemplaza los CHR(141) por retornos de carro normal CHR(13)
 *  $SYNTAX$
 *      HARDCR(  ) --> 
 *  $ARGUMENTS$
 *       es la cadena de caracteres a convertir.
 *  $RETURNS$
 *      HARDCR() retorna , la cadena transformada.
 *  $DESCRIPTION$
 *      Esta funci¢n retorna una cadena/memo donde los caracteres de retorno
 *      de carro automaticos ¢ "blandos" ( CHR(141) ) son convertidos a
 *      caracteres de retorno de carro forzado ¢ "duro" CHR(13).
 *  $EXAMPLES$
 *      * El siguiente ejemplo asigna a una variable de cadena, el campo memo
 *        NOTAS existente en la base Clientes, transformado para mostrarlo
 *        por pantalla.
 *        cNotas = HARDCR( Clientes->NOTAS )
 *        ? cNotas
 *
 *      * El siguiente ejemplo envia a la impresora el contenido de un campo
 *        memo.
 *
 *        SET DEVICE TO PRINTER
 *        DEVPOS( nFil, nCol)
 *        DEVOUT( HARDCR( Clientes->NOTAS ) )
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a asociada es rtl
 *  $SEEALSO$
 *      MEMOTRAN(),STRTRAN()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      MEMOREAD()
 *  $CATEGORY$
 *      Campo Memo
 *  $ONELINER$
 *      Retorna el contenido de un archivo como cadena de caracteres
 *  $SYNTAX$
 *      MEMOREAD(  ) --> 
 *  $ARGUMENTS$
 *       Nombre del archivo a leer. Debe incluir la extensi¢n.
 *                 Si el archivo se encuentra en otro subdirectorio, se
 *                 debe incluir el path.
 *  $RETURNS$
 *      Retorna el contenido de un archivo de texto como una cadena de
 *      caracteres .
 *      El tama¤o m ximo del archivo, que puede ser le¡do, es el mismo que
 *      el tama¤o m ximo de una cadena de caracteres (m s de 2 Mb). Harbour
 *      no tiene el l¡mite de 64 Kb como en Clipper.
 *      Si  no puede ser encontrado o le¡do, la funci¢n retorna
 *      una cadena de caracteres, vacia ("").
 *  $DESCRIPTION$
 *      MEMOREAD() es una funci¢n que lee el contenido de un archivo de texto
 *      (hasta ahora) desde un archivo en disco (floppy, HD, CD-ROM, etc.)
 *      De esa forma Ud. puede manipular el contenido como cualquier cadena
 *      de caracteres ¢ asignarlo a un campo memo para ser guardado en una
 *      base de datos.
 *
 *      La funci¢n MEMOREAD() es usada junto con MEMOWRIT() y MEMOEDIT()
 *      para obtener de disco, texto de diferentes fuentes y que podr¡a ser
 *      objeto de edici¢n, b£squeda, reemplazo, visualizaci¢n, etc. y luego
 *      ser escrito a la base de datos.
 *
 *      Es usada para importar datos desde otras fuentes a la base de datos.
 *
 *      Nota:
 *      MEMOREAD() no usa los seteos SET DEFAULT y SET PATH para buscar por
 *      .
 *      Esta funci¢n busca por  en el directorio actual.
 *      Si el archivo no se encuentra, entonces MEMOREAD() busca en el path
 *      del D.O.S.
 *
 *      Sobre un entorno de red, MEMOREAD() intenta abrir el archivo
 *       en modo de s¢lo-lectura y compartido. Si el archivo es
 *      usado en modo exclusivo (no compartido) por otro proceso o programa
 *      la funci¢n devolver  una cadena vacia ("").
 *
 *      Es una de las funciones de Clipper m s £til, realmente lo hace f cil.
 *  $EXAMPLES$
 *      *  Este ejemplo usa MEMOREAD() para asignar el contenido de un
 *         archivo de texto a una variable para una b£squeda posterior.
 *
 *         cFile   := "account.prg"
 *         cString := MEMOREAD( cFile )
 *
 *         IF AT( "Melina", cString) == 0             // chequea el copyright
 *            MEMOWRIT( cFile, cCopyright + cString ) // si falta, ponerlo !
 *         ENDIF
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a asociada es rtl
 *  $SEEALSO$
 *      MEMOEDIT(),MEMOWRIT(),REPLACE
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      MEMOWRIT()
 *  $CATEGORY$
 *      Campo Memo
 *  $ONELINER$
 *      Escribe un campo memo ¢ una cadena a un archivo de texto en disco
 *  $SYNTAX$
 *      MEMOWRIT( , , [] ) --> lExito
 *  $ARGUMENTS$
 *       Nombre del archivo a leer. Debe incluir la extensi¢n.
 *                 Si el archivo se encuentra en otro subdirectorio, se
 *                 debe incluir el path.
 *
 *         Es un campo memo o una cadena de caracteres, a ser
 *                  escrita en .
 *
 *       Es una variable l¢gica que determina si el car cter
 *                    de fin de archivo - CHR(26) - se escribe a disco.
 *                    Este par metro es opcional. Su valor por defecto es
 *                    verdadero (.T.)
 *  $RETURNS$
 *      La funci¢n devuelve verdadero (.T.) si la operacion de escritura fue
 *      exitosa, de otro modo, ‚sta devuelve falso (.F.).
 *  $DESCRIPTION$
 *      Esta es una funci¢n que escribe un campo memo ¢ una cadena de
 *      caracteres a un archivo de texto en disco (floppy, HD, CD-ROM, etc.)
 *      Si Ud. no especifica un path, MEMOWRIT() escribe  en el
 *      directorio actual. Si  existe ‚ste ser  sobreescrito.
 *
 *      Nota:
 *      Existe un tercer par metro opcional  (que est  ausente
 *      en Clipper), el cual le permite al programador cambiar en tiempo de
 *      ejecuci¢n el comportamiento (por defecto) de escribir - siempre -
 *      el car cter de fin de archivo, CHR(26) como en Clipper.
 *      Si no existe un tercer parametro, nada cambia, EOF es escrito como
 *      en Clipper, lo mismo ocurre cuando  es puesto en .T.
 *      Pero, si  es puesto en .F., el car cter EOF no es
 *      escrito al final del archivo.
 *
 *      La funci¢n MEMOWRIT() es usada junto con MEMOREAD() y MEMOEDIT() para
 *      grabar a disco texto de diferentes fuentes y que pudo haber sido
 *      objeto de edici¢n, b£squeda, reemplazo, visualizaci¢n, etc.
 *
 *      Esta funci¢n es usada para exportar la base de datos a otro formato.
 *
 *      Nota:
 *      MEMOWRIT() no usa el seteo de directorio SET DEFAULT.
 *
 *      Es una de las funciones de Clipper m s £til, realmente lo hace f cil.
 *  $EXAMPLES$
 *      *  Este ejemplo usa MEMOWRIT() para escribir el contenido de una
 *         variable de caracteres a un archivo de texto
 *
 *         cFile   := "account.prg"
 *         cString := MEMOREAD( cFile )
 *
 *         IF AT( "Melina", cString) == 0             // chequea el copyright
 *            MEMOWRIT( cFile, cCopyright + cString ) // si falta, ponerlo !
 *         ENDIF
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a asociada es rtl
 *  $SEEALSO$
 *      MEMOEDIT(),MEMOREAD()
 *  $END$
 */




c:\harbour\doc\es\memvar2.txt
/*
 * $Id: memvar2.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2003 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *   FIELD, LOCAL, MEMVAR
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      FIELD
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Declara una lista de nombres de campo de una base de datos
 *  $SYNTAX$
 *      FIELD  [,  [in ]
 *  $ARGUMENTS$
 *          Un nombre de campo válido
 *
 *         Nombres de campo adicionales
 *
 *       Un nombre de alias válido
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Este comando declara los nombres de los campos  y siguientes
 *       con una identificador opcional de alias  para
 *      cada uno.
 *      Este comando le permite a Harbour resolver cualquier referencia a un
 *      campo especificado en la lista de campos, viéndolo como un campo
 *      cuando no es referenciado por un alias.
 *      Si un campo no está mencionado en la lista y no está explicitamente
 *      marcado con el identificador de alias, éste puede ser visto como una
 *      variable de memoria, lo cual puede causar errores de ejecución.
 *
 *      Este comando no tiene efecto sobre variables de memoria ó sobre
 *      referencias a campos metidos dentro de una macro-expresión.
 *  $EXAMPLES$
 *      FUNCTION MAIN
 *        FIELD iD
 *        FIELD Name
 *        USE TESTS NEW
 *        name := "Sales"
 *        Id := 5
 *        USE
 *      RETURN NIL
 *  $TESTS$
 *      Ver ../tests/testwarn.prg
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Este comando trabaja exactamente como en CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Ninguno
 *  $SEEALSO$
 *      MEMVAR,PRIVATE,PUBLIC,STATIC
 *  $END$
 */


/*  $DOC$
 *  $COMMANDNAME$
 *      LOCAL
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Crea e inicializa una variable de memoria ó un array LOCAL
 *  $SYNTAX$
 *      LOCAL  [:=  ]
 *      LOCAL [:= ], ..., [:= ]
 *  $ARGUMENTS$
 *          Nombre de variable de Memoria ó array.
 *
 *         Valor a ser asignado a la variable ó array
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Este comando Crea una variable de memoria ó un array LOCAL
 *      El nombre de cualquiera es especificado en .
 *      Si más de una variable está siendo inicializada con la sentencia
 *      LOCAL, separe cada una de ellas con una coma.
 *      Si una variable ó un array le va a ser asignado un valor de inicio
 *      esa expresión puede ser especificada en , usando el operador
 *      de asignación en línea <:=>
 *
 *      Nota:
 *      Si el modo de compilación "Fuertemente Tipeado" (Strong type) es
 *      usado, el compilador chequeará si el valor recibido coincide con el
 *      tipo especificado en .
 *
 *      Las Variables LOCALes son símbolos generados en tiempo de ejecución
 *      y son resueltos en tiempo de compilación (???).
 *      La visibilidad y tiempo de vida de una variable ó array LOCAL está
 *      limitada a la función ó procedimiento en la cual ésta es definida.
 *
 *      Ninguna macro-expansión es permitida de una sentencia de declaración
 *      LOCAL.
 *
 *      Ningún comando de Harbour distinto a FUNCTION, PROCEDURE, PUBLIC,
 *      PRIVATE, PARAMETERS, MEMVAR, STATIC y FIELD, pueden preceder a la
 *      sentencia LOCAL (esto esta mal)
 *
 *      Las referencias a un array LOCAL pueden no ser inicializadas (por
 *      ej. asignarle un valor) en la misma línea de comando junto con la
 *      sentencia LOCAL. Esto puede ser hecho luego en el programa.
 *
 *      Variables y arrays de tipo LOCAL no son afectadas por el comando
 *      RELEASE.
 *  $EXAMPLES$
 *      Function Main2()
 *      Local n , lVar
 *
 *      n := IIF( lVar, 'A', 3 )
 *      n := 2
 *      n := 'a'
 *      n := seconds() + 2
 *      n := int( seconds() + 2 )
 *      Return( NIL )
 *  $TESTS$
 *      Ver ../tests/testwarn.prg por más ejemplos
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Este comando trabaja exactamente como en CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Ninguno
 *  $SEEALSO$
 *      FIELD,PRIVATE,PUBLIC,STATIC,MEMVAR
 *  $END$
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      MEMVAR
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Declara variables PRIVATE, PUBLIC y arrays.
 *  $SYNTAX$
 *      MEMVAR 
 *  $ARGUMENTS$
 *       Nombre de variable de Memoria
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Este comando le dice al compilador como resolver alguna referencia
 *      a una variable de memoria designada dentro de esta lista ó si posee
 *      un alias explícito con el prefijo "M->" ó bien "MEMVAR->"
 *      Solamente aquellas variables de memoria que no contengan ese prefijo
 *      son afectadas por este comando. Aquellas variables de memoria dentro
 *      de expansiones macro, no son afectadas por este comando.
 *
 *      La declaración MEMVAR debe aparecer antes que cualquier comando
 *      ejecutable; esta es similar a las sentencias LOCAL, STATIC, FIELD,
 *      PARAMETERS, FUNCTION y PROCEDURE
 *  $EXAMPLES$
 *      MEMVAR y As Numeric
 *      Function Main2()
 *      LOCAL n , lVar
 *
 *      n := IIF( lVar, 'A', 3 )
 *      n := 2
 *      n := 'a'
 *      n := seconds() + 2
 *      n := int( seconds() + 2 )
 *      y := n
 *      ? y
 *      Return( NIL )
 *  $TESTS$
 *      Ver ../tests/testwarn.prg por más ejemplos
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Este comando trabaja exactamente como en CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      Ninguno
 *  $SEEALSO$
 *      LOCAL,STATIC,FIELD,PRIVATE,PUBLIC
 *  $END$
 */


c:\harbour\doc\es\misc.txt
/*
 * $Id: misc.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2003 Alejandro de G rate 
 * Documentaci½n en Espa¤ol de:
 *           OS(), VERSION(), GETENV(), __RUN(), TONE(), RUN
 *
 * Copyright 2000 Chen Kedem 
 * Documentaci¢n en Ingl‚s de: TONE()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      OS()
 * $ONELINER$
 *      Retorna el sistema operativo subyacente.
 *  $SYNTAX$
 *      OS() --> 
 *  $CATEGORY$
 *      DOS
 *  $RETURNS$
 *        el actual sistema operativo
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve el actual sistema operativo como una cadena
 *      de caracteres.
 *  $EXAMPLES$
 *      ? OS()
 *  $TESTS$
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El c¢digo fuente esta en ../source/rtl/version.c
 *      La librer¡a es rtl
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      VERSION()
 *  $CATEGORY$
 *      Entorno
 *  $ONELINER$
 *      Retorna la Versi¢n de HARBOUR
 *  $SYNTAX$
 *      VERSION()  --> 
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *         Cadena conteniendo la versi¢n de Harbour
 *  $DESCRIPTION$
 *      Esta funci¢n devuelve la actual versi¢n de Harbour.
 *  $EXAMPLES$
 *      // Visualiza algo similar a: Harbour Alpha build 40.0 Intl. (Flex)
 *      ? QOUT( VERSION() )
 *  $TESTS$
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El c¢digo fuente esta en ../source/rtl/version.c
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      OS()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      GETENV()
 *  $CATEGORY$
 *      Entorno
 *  $ONELINER$
 *      Obtiene datos de las Variables de Entorno del Sistema Operativo
 *  $SYNTAX$
 *      GETENV(,  )  --> 
 *  $ARGUMENTS$
 *            Variable de Entorno a obtener
 *
 *       Valor opcional a retornar si la variable 
 *                       no es encontrada.
 *  $RETURNS$
 *           Valor de la variable de Entorno
 *  $DESCRIPTION$
 *      Esta funci¢n produce una cadena que es el valor de la variable de
 *      Entorno , la cual es almacenada a nivel del sistema
 *      operativo con el comando SET del mismo.
 *      Si ninguna variable de Entorno puede ser encontrada, el valor que
 *      retorne la funci¢n ser   si ‚ste es pasado, ¢ de lo
 *      contrario una cadena vac¡a.
 *  $EXAMPLES$
 *      QOUT( GETENV('PATH'))
 *      QOUT( GETENV('CONFIG'))
 *      QOUT( GETENV('HARBOURCMD', '-n -l -es2'))
 *      
 *  $TESTS$
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *      El par metro  es una extensi¢n de Harbour.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El c¢digo fuente esta en ../source/rtl/gete.c
 *      La librer¡a es rtl
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __RUN()
 *  $CATEGORY$
 *      DOS
 *  $ONELINER$
 *      Corre/Ejecuta un programa externo.
 *  $SYNTAX$
 *      __RUN(  )
 *  $ARGUMENTS$
 *        Comando a ejecutar
 *  $DESCRIPTION$
 *      Este Comando ejecuta un programa externo. Por favor aseg£rese que
 *      Ud. tiene sufuciente memoria libre para poder ejecutar el programa
 *      externo.
 *      No lo use para correr programas que permanecen residentes (en el
 *      caso del sistema operativo DOS) porque puede causar muchos problemas
 *
 *      Nota: El comando RUN es preprocesado en esta funci¢n.
 *            Se considera una mala pr ctica usar esta funci¢n directamente
 *            Use el comando RUN en su lugar.
 *  $EXAMPLES$
 *      __Run( "edit " + cMyTextFile )    // Corre un Editor externo
 *      __Run( "command" )                // Da el prompt del DOS (s¢lo DOS)
 *      
 *  $TESTS$
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El c¢digo fuente esta en ../source/rtl/run.c
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      RUN
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      TONE()
 *  $CATEGORY$
 *      Miscelanea
 *  $ONELINER$
 *      Suena un tono con una frecuencia y duraci¢n especificada.
 *  $SYNTAX$
 *      TONE( ,  ) --> NIL
 *  $ARGUMENTS$
 *        Un valor num‚rico no negativo que especifica la
 *                     frecuencia del tono en Hertzios (ciclos por segundo)
 *
 *         Un valor num‚rico positivo que especifica la duraci¢n
 *                    del tono en unidades de 1/18 avo de segundo.
 *  $RETURNS$
 *      TONE() siempre devuelve NIL.
 *  $DESCRIPTION$
 *      TONE() es una funci¢n de sonido que podr¡a ser usada para irritar
 *      al usuario final, a su perro y al vecindario que lo rodea.
 *      La frecuencia est  limitada al rango 0 to 32767 Hz. Las frecuencias
 *      por debajo de 20 Hz son inaudibles.
 *      Si hay decimales en los argumentos estos se truncan.
 *  $EXAMPLES$
 *      IF lOk   // Suena bien
 *         TONE(  500, 1 )
 *         TONE( 4000, 1 )
 *         TONE( 2500, 1 )
 *      ELSE     // Suena mal
 *         TONE(  300, 1 )
 *         TONE(  499, 5 )
 *         TONE(  700, 5 )
 *      ENDIF
 *      
 *  $TESTS$
 *      TONE( 800, 1 )                       // igual que ? CHR(7)
 *      TONE( 32000, 200 )                   // algun perro alrededor ?
 *      TONE( 261, 1 )                       // nota musical - C (DO medio)
 *      TONE( 400, 0 )                       // pitido corto
 *      TONE( 700 )                          //
 *      TONE( 10, 18.2 )                     // demora de 1 segundo
 *      TONE( -1 )                           // demora de 1/18.2 segundo
 *      TONE( )                              // demora de 1/18.2 segundo
 *      
 *  $TESTS$
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      Esta es una funci¢n compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      CHR(),SET BELL
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      RUN
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Corre/Ejecuta un programa externo.
 *  $SYNTAX$
 *      RUN  
 *  $ARGUMENTS$
 *        Comando a ejecutar
 *  $DESCRIPTION$
 *      Este Comando ejecuta un programa externo. Por favor aseg£rese que
 *      Ud. tiene sufuciente memoria libre para poder ejecutar el programa
 *      externo.
 *      No lo use para correr programas que permanecen residentes (en el
 *      caso del sistema operativo DOS) porque puede causar muchos problemas.
 *  $EXAMPLES$
 *      RUN  "edit " + cMyTextFile      // Corre un Editor externo
 *      RUN  "command"                  // Da el prompt del DOS (s¢lo DOS)
 *  $TESTS$
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Este es un Comando compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      El c¢digo fuente esta en ../source/rtl/run.c
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      RUN
 *  $END$
 */


c:\harbour\doc\es\nation.txt
/*
 * $Id: nation.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: ISAFFIRM(), ISNEGATIVE(), NATIONMSG()
 *
 * Copyright 1999 Jose Lalin 
 * Documentaci¢n en Ingles de:  ISAFFIRM(), ISNEGATIVE(), NATIONMSG()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ISAFFIRM()
 *  $CATEGORY$
 *      Nacion
 *  $ONELINER$
 *      Chequea si el caracter pasado es el caracter de afirmaci¢n
 *  $SYNTAX$
 *      ISAFFIRM(  ) --> 
 *  $ARGUMENTS$
 *        es un char ¢ cadena de caracteres
 *  $RETURNS$
 *        Verdadero si el caracter pasado es el caracter de
 *                      afirmaci¢n, ¢ Falso de otro modo.
 *  $DESCRIPTION$
 *      Esta funci¢n es usada para chequear si la entrada del usuario es
 *      verdadera ¢ no, de acuerdo al m¢dulo msgxxx usado.
 *      En Clipper el m¢dulo por defecto depende de la versi¢n usada, en
 *      Harbour el m¢dulo por defecto es el Ingl‚s.
 *      En ingl‚s la opci¢n v lida es "Y", en español "S"
 *  $EXAMPLES$
 *      // Esperar hasta que el usuario ingrese "Y"
 *      DO WHILE ! ISAFFIRM( cYesNo )
 *         ACCEPT "Esta Seguro ?: " TO cYesNo
 *      END DO
 *  
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      ISNEGATIVE(),NATIONMSG()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ISNEGATIVE()
 *  $CATEGORY$
 *      Nacion
 *  $ONELINER$
 *      Chequea si el caracter pasado es el caracter de negaci¢n
 *  $SYNTAX$
 *      ISNEGATIVE(  ) --> 
 *  $ARGUMENTS$
 *        es un char ¢ cadena de caracteres
 *  $RETURNS$
 *        Verdadero si el caracter pasado es el caracter de
 *                      negaci¢n, ¢ Falso de otro modo.
 *  $DESCRIPTION$
 *      Esta funci¢n es usada para chequear si la entrada del usuario es
 *      verdadera ¢ no, de acuerdo al m¢dulo msgxxx usado.
 *      En Clipper el m¢dulo por defecto depende de la versi¢n usada, en
 *      Harbour el m¢dulo por defecto es el Ingl‚s.
 *      En ingl‚s la opci¢n v lida es "N", en español "N"
 *  $EXAMPLES$
 *      // Esperar hasta que el usuario ingrese "N"
 *      DO WHILE ! ISNEGATIVE( cYesNo )
 *         ACCEPT "Esta Seguro ?: " TO cYesNo
 *      END DO
 *  
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      ISAFFIRM(),NATIONMSG()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      NATIONMSG()
 *  $CATEGORY$
 *      Nacion
 *  $ONELINER$
 *      Retorna cadenas de mensajes internacionales.
 *  $SYNTAX$
 *      NATIONMSG(  ) --> 
 *  $ARGUMENTS$
 *        es el n£mero de Mensaje que Ud. quiere obtener.
 *  $RETURNS$
 *       Si  es un selector de mensaje v lido, entonces se
 *      retorna el mensaje.
 *      Si  es NIL, retorna "Invalid Argument", y si  no es de
 *      tipo NUMERIC esta retorna una cadena vacia.
 *  $DESCRIPTION$
 *      NATIONMSG() retorna las descripciones internacionales de mensajes.
 *      En Clipper el m¢dulo por defecto depende de la versi¢n usada, en
 *      Harbour el m¢dulo por defecto es el Ingl‚s.
 *  $EXAMPLES$
 *      // Visualiza "Seguro Y/N: "  y espera hasta que el usuario entra "Y"
 *      // Y/N es la cadena NATIONMSG( 12 ) con el m¢dulo natmsg por
 *      // defecto.
 *      DO WHILE ! ISAFFIRM( cYesNo )
 *         ACCEPT "Esta Seguro " + NATIONMSG( 12 ) + ": " TO cYesNo
 *      END DO
 *  
 *  $STATUS$
 *      C
 *  $COMPLIANCE$
 *      Esta funci¢n es totalmente compatible con CA-Cl*pper.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      ISAFFIRM(),ISNEGATIVE()
 *  $END$
 */


c:\harbour\doc\es\objfunc.txt
/*
 * $Id: objfunc.txt 6075 2003-07-13 18:08:15Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *                 __objHasData(), __objHasMethod(), __objGetMsgList(),
 *                 __objGetMethodList(), __objGetValueList(),
 *                 __ObjSetValueList(), __objAddMethod(),
 *                 __objAddInline(), __objAddData(), __objModMethod(),
 *                 __objModInline(), __objDelMethod(), __objDelInline(),
 *                 __objDelData(), __objDerivedFrom()
 *
 * Copyright 1999-2000 Chen Kedem 
 * Documentaci¢n en Ingles de:
 *                 __objHasData(), __objHasMethod(), __objGetMsgList(),
 *                 __objGetMethodList(), __objGetValueList(),
 *                 __ObjSetValueList(), __objAddMethod(),
 *                 __objAddInline(), __objAddData(), __objModMethod(),
 *                 __objModInline(), __objDelMethod(), __objDelInline(),
 *                 __objDelData(), __objDerivedFrom()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __objHasData()
 *  $CATEGORY$
 *      Manejo de objetos
 *  $ONELINER$
 *      Determina cuando un s¡mbolo existe en un objeto como DATA
 *  $SYNTAX$
 *      __objHasData( ,  ) --> lExiste
 *  $ARGUMENTS$
 *        es el objeto a inspeccionar
 *
 *       es el nombre del s¡mbolo a buscar
 *  $RETURNS$
 *      __objHasData() retorna .T. si el  dado existe como DATA
 *      (variable de instancia) en el objeto 
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      __objHasData() es una extensi¢n de Harbour.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      __ObjGetMethodList(),__objGetMsgList(),__objHasMethod()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __objHasMethod()
 *  $CATEGORY$
 *      Manejo de objetos
 *  $ONELINER$
 *      Determina cuando un s¡mbolo existe en un objeto como METHOD
 *  $SYNTAX$
 *      __objHasMethod( ,  ) --> lExist
 *  $ARGUMENTS$
 *        es el objeto a inspeccionar
 *
 *       es el nombre del s¡mbolo a buscar
 *  $RETURNS$
 *      __objHasMethod() retorna .T. si el  dado existe como
 *      METHOD (funci¢n de clase) en el Objeto 
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      __objHasMethod() es una extensi¢n de Harbour.
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      __ObjGetMethodList(),__objGetMsgList(),__objHasData()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __objGetMsgList()
 *  $CATEGORY$
 *      Manejo de objetos
 *  $ONELINER$
 *      Retorna los nombres de todos los DATA o METHOD para un Objeto dado
 *  $SYNTAX$
 *      __objGetMsgList( , [], [nClassType] ) --> aNombres
 *  $ARGUMENTS$
 *       es un Objeto a inspeccionar
 *
 *       es un valor l¢gico opcional que especifica la informaci¢n
 *      a retornar. Un valor .T. instruye a la funci¢n a devolver una lista
 *      todos los nombres DATA, un valor de .F. instruye a la funci¢n a
 *      devolver una lista de todos los nombres de METHODos.
 *      El valor por defecto es .T.
 *
 *       es un c¢digo num‚rico opcional para seleccionar cual
 *      tipo de clase se va retornar.
 *      El valor por defecto es HB_MSGLISTALL, retornando la lista entera.
 *  $RETURNS$
 *      __objGetMsgList() devuelve un array de cadenas  con los
 *      nombres de todos los DATA o todos los METHOD para un objeto dado.
 *      __objGetMsgList() podr¡a retornar un array vacio, {} si el objeto
 *      dado no contiene la informaci¢n solicitada.
 *  $DESCRIPTION$
 *      __objGetMsgList() es una funci¢n de soporte de clases de bajo nivel
 *      que le permite a Ud. encontrar todas las variables de instancia o
 *      los nombre de los metodos para un Objeto dado.
 *
 *      Si es es especificada, la siguiente tabla muestra los valores para
 *       que le permiten a Ud. distinguir entre DATA y
 *      CLASSDATA:
 *
 *     
 *      hboo.ch           Valor    Significado
 *
 *      HB_MSGLISTALL      0       Todos los tipos
 *      HB_MSGLISTCLASS    1       CLASSDATA solamente
 *      HB_MSGLISTPURE     2       DATA solamente
 *     
* * DATA son variables de instancia usables dentro de cada objeto desde * una clase, donde cada Objeto tiene sus propios DATAs. * * Las CLASSDATA son compartidas por todos los objetos desde una Clase, * asi el valor cambiado dentro del Objeto1 sera reflejado cuando se * acceda la CLASSDATA desde el Objeto2. * $EXAMPLES$ * // Muestra informaci¢n sobre la clase TBrowse * oB := TBrowseNew( 0, 0, 24, 79 ) * aData := __objGetMsgList( oB, .T. ) * aClassData := __objGetMsgList( oB, .T., HB_MSGLISTCLASS ) * aMethod := __objGetMsgList( oB, .F. ) * * FOR i = 1 to len ( aData ) * ? "nombre de DATA:", aData[ i ] * NEXT * * FOR i = 1 to len ( aClassData ) * ? "nombre de CLASSDATA:", aClassData[ i ] * NEXT * * FOR i = 1 to len ( aMethod ) * ? "nombre de METHOD:", aMethod[ i ] * NEXT * * $STATUS$ * R * $COMPLIANCE$ * __objGetMsgList() es una extensi¢n de Harbour. * $FILES$ * El archivo de cabecera es hboo.ch * La librer¡a es rtl * $SEEALSO$ * __ObjGetMethodList(),__ObjGetValueList(),__objHasData(),__objHasMethod() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objGetMethodList() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Retorna un array con los nombres de todos los METHOD de un Objeto * $SYNTAX$ * __objGetMethodList( ) --> aNombreMetodos * $ARGUMENTS$ * es el objeto a inspeccionar * $RETURNS$ * __objGetMethodList() devuelve un array de cadenas * con los nombres de todos los METHOD para un objeto dado. * __objGetMethodList() podria retornar un array vacio, {} si el * objeto dado no contiene ningun metodo. * $DESCRIPTION$ * __objGetMethodList() es una funci¢n de soporte de clases de bajo * nivel que le permite a Ud. encontrar todos los nombres de las * funciones de clase para un Objeto dado. * Es el equivalente a __objGetMsgList( oObjeto, .F. ). * $EXAMPLES$ * // Muestra informaci¢n sobre la clase TBrowse * oB := TBrowseNew( 0, 0, 24, 79 ) * aMethod := __objGetMethodList( oB ) * * FOR i = 1 to len ( aMethod ) * ? "METHOD name:", aMethod[ i ] * NEXT * * $STATUS$ * R * $COMPLIANCE$ * __objGetMethodList() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objGetMsgList(),__ObjGetValueList(),__objHasData(),__objHasMethod() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objGetValueList() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Retorna un array con los nombres de DATA y valores de un Objeto * $SYNTAX$ * __objGetValueList( , [] ) --> aData * $ARGUMENTS$ * es el objeto a inspeccionar * * es un array opcional con los nombres de los DATA que Ud. * desea excluir de la inspeccion. * $RETURNS$ * __objGetValueList() retorna un array bidimensional que contiene * pares de nombre del s¡mbolo DATA y el valor de DATA. * __objGetValueList() podria retornar un array vacio, {} si el * objeto dado no contiene la informaci¢n solicitada. * $DESCRIPTION$ * __objGetValueList() es una funci¢n de soporte de clases de bajo * nivel que retorna un array con los nombres de DATA y valores. * Cada elemento del array es un par de: * aData[ i, HB_OO_DATA_SYMBOL ] contiene nombre del s¡mbolo * aData[ i, HB_OO_DATA_VALUE ] contiene el valor de DATA * $EXAMPLES$ * // Muestra informaci¢n sobre la clase TBrowse * oB := TBrowseNew( 0, 0, 24, 79 ) * aData := __objGetValueList( oB ) * * FOR i = 1 to len ( aData ) * ? "Nombre de DATA:", aData[ i, HB_OO_DATA_SYMBOL ], ; * " valor =", aData[ i, HB_OO_DATA_VALUE ] * NEXT * * $STATUS$ * R * $COMPLIANCE$ * __objGetValueList() es una extensi¢n de Harbour. * $FILES$ * El archivo de cabecera es hboo.ch * La librer¡a es rtl * $SEEALSO$ * __objGetMethodList(),__objGetMsgList(),__objHasData(),__objHasMethod(),__ObjSetValueList() * $END$ */ /* $DOC$ * $FUNCNAME$ * __ObjSetValueList() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Establece un Objeto con un array de nombres de DATA y valores * $SYNTAX$ * __ObjSetValueList( , ) --> oObjeto * $ARGUMENTS$ * es el objeto a establecer * * es un array bidimensional con un par de variables de * instancia y valores para asignar a aquellas variables. * $RETURNS$ * __ObjSetValueList() retorna una referencia a . * $DESCRIPTION$ * __ObjSetValueList() es una funci¢n de soporte de clases de bajo * nivel que le permite a Ud. establecer un grupo de variables de * instancia con valores. * Cada elemento del array en es un par de: * aData[ i, HB_OO_DATA_SYMBOL ] contiene nombre de variable a setear * aData[ i, HB_OO_DATA_VALUE ] contiene el nuevo valor de variable * $EXAMPLES$ * // set some TBrowse instance variable * oB := TBrowse():New() * aData := array( 4, 2 ) * aData[ 1, HB_OO_DATA_SYMBOL ] = "nTop" * aData[ 1, HB_OO_DATA_VALUE ] = 1 * aData[ 2, HB_OO_DATA_SYMBOL ] = "nLeft" * aData[ 2, HB_OO_DATA_VALUE ] = 10 * aData[ 3, HB_OO_DATA_SYMBOL ] = "nBottom" * aData[ 3, HB_OO_DATA_VALUE ] = 20 * aData[ 4, HB_OO_DATA_SYMBOL ] = "nRight" * aData[ 4, HB_OO_DATA_VALUE ] = 70 * __ObjSetValueList( oB, aData ) * ? oB:nTop // 1 * ? oB:nLeft // 10 * ? oB:nBottom // 20 * ? oB:nRight // 70 * * $STATUS$ * R * $COMPLIANCE$ * __ObjSetValueList() es una extensi¢n de Harbour. * $FILES$ * El archivo de cabecera es hboo.ch * La librer¡a es rtl * $SEEALSO$ * __ObjGetValueList() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objAddMethod() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Agrega un METHOD a una clase ya existente * $SYNTAX$ * __objAddMethod( , , ) --> oObjeto * $ARGUMENTS$ * es el objeto con el cual se va a trabajar * * es el nombre del s¡mbolo del nuevo METHOD a agregar * * es un puntero a la funci¢n a asociar con el m‚todo * $RETURNS$ * __objAddMethod() retorna una referencia a . * $DESCRIPTION$ * __objAddMethod() es una funci¢n de soporte de clases de bajo * nivel que agrega un nuevo METHOD a un Objeto. * * El permanece sin cambios si el s¡mbolo con el nombre * ya existe en . * * Note que es un especial puntero a una funci¢n que fue * creado usando el operador @ , vea un ejemplo a continuacion. * $EXAMPLES$ * // crea un nueva clase THappy y le agrega un m‚todo Smile * oHappy := HBClass():New( "THappy" ) * __objAddMethod( oHappy, "Smile", @MySmile() ) * ? oHappy:Smile( 1 ) // :) * ? oHappy:Smile( 2 ) // ;) * ? oHappy:Smile( 3 ) // *SMILE* * * STATIC FUNCTION MySmile( nType ) * LOCAL cSmile * DO CASE * CASE nType == 1 * cSmile := ":)" * CASE nType == 2 * cSmile := ";)" * CASE nType == 3 * cSmile := "*SMILE*" * ENDCASE * RETURN cSmile * * $STATUS$ * R * $COMPLIANCE$ * __objAddMethod() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objAddInline(),__objAddData(),__objDelMethod(),__ObjGetMethodList(),__objGetMsgList(),__objHasMethod(),__objModMethod() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objAddInline() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Agrega un INLINE a una clase ya existente * $SYNTAX$ * __objAddInline( , , ) --> oObjeto * $ARGUMENTS$ * es el objeto con el cual se va a trabajar * * es el nombre del s¡mbolo del nuevo INLINE a agregar * * es un codeblock a asociar con el m‚todo INLINE * $RETURNS$ * __objAddInline() retorna una referencia a . * $DESCRIPTION$ * __objAddInline() es una funci¢n de soporte de clases de bajo * nivel que agrega un nuevo m‚todo INLINE a un Objeto. * * El permanece sin cambios si el s¡mbolo con el nombre * ya existe en . * $EXAMPLES$ * // crea un nueva clase THappy y le agrega un m‚todo INLINE Smile * oHappy := HBClass():New( "THappy" ) * bInline := { | nType | { ":)", ";)", "*SMILE*" }[ nType ] } * * __objAddInline( oHappy, "Smile", bInline ) * * ? oHappy:Smile( 1 ) // :) * ? oHappy:Smile( 2 ) // ;) * ? oHappy:Smile( 3 ) // *SMILE* * * $STATUS$ * R * $COMPLIANCE$ * __objAddInline() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objAddData(),__objAddMethod(),__objDelInline(),__ObjGetMethodList(),__objGetMsgList(),__objHasMethod() ,__objModInline() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objAddData() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Agrega un DATA a una clase ya existente * $SYNTAX$ * __objAddData( , ) --> oObjeto * $ARGUMENTS$ * es el objeto con el cual se va a trabajar * * es el nombre del s¡mbolo del nuevo DATA a agregar * $RETURNS$ * __objAddData() retorna una referencia a . * $DESCRIPTION$ * __objAddData() es una funci¢n de soporte de clases de bajo * nivel que agrega un nuevo DATA a un Objeto. * * El permanece sin cambios si el s¡mbolo con el nombre * ya existe en . * $EXAMPLES$ * // crea un nueva clase THappy y le agrega un DATA lHappy * oHappy := HBClass():New( "THappy" ) * * __objAddData( oHappy, "lHappy" ) * oHappy:lHappy := .T. * * IF oHappy:lHappy * ? "Happy, Happy, Joy, Joy !!!" * ELSE * ? ":(..." * ENDIF * * $STATUS$ * R * $COMPLIANCE$ * __objAddData() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objAddInline(),__objAddMethod(),__objDelData(),__objGetMsgList(),__ObjGetValueList(),__objHasData(),__ObjSetValueList() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objModMethod() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Modifica (reemplaza) un METHOD en una clase ya existente * $SYNTAX$ * __objModMethod( , , ) --> oObjeto * $ARGUMENTS$ * es el objeto con el cual se va a trabajar * * es el nombre del s¡mbolo del METHOD a modificar * * es un puntero a una nueva funci¢n a asociar con * el metodo. * $RETURNS$ * __objModMethod() retorna una referencia a . * $DESCRIPTION$ * __objModMethod() es una funci¢n de soporte de clases de bajo * nivel que modifica un METHOD en un Objeto y lo reemplaza con * una nueva funci¢n. * El permanece sin cambios si el s¡mbolo con el nombre * ya existe en . * __objModMethod() es usado en el mecanismo de herencia. * * Note que es un especial puntero a una funci¢n que fue * creado usando el operador @ , vea un ejemplo a continuacion. * * $EXAMPLES$ * // crea un nueva clase THappy y le agrega un m‚todo Smile * oHappy := HBClass():New( "THappy" ) * __objAddMethod( oHappy, "Smile", @MySmile() ) * ? oHappy:Smile( 1 ) // :) * ? oHappy:Smile( 2 ) // ;) * * // reemplaza el m‚todo Smile con una nueva funci¢n * __objAddMethod( oHappy, "Smile", @YourSmile() ) * ? oHappy:Smile( 1 ) // *SMILE* * ? oHappy:Smile( 2 ) // *WINK* * * STATIC FUNCTION MySmile( nType ) * LOCAL cSmile * DO CASE * CASE nType == 1 * cSmile := ":)" * CASE nType == 2 * cSmile := ";)" * ENDCASE * RETURN cSmile * * STATIC FUNCTION YourSmile( nType ) * LOCAL cSmile * DO CASE * CASE nType == 1 * cSmile := "*SMILE*" * CASE nType == 2 * cSmile := "*WINK*" * ENDCASE * RETURN cSmile * * $STATUS$ * R * $COMPLIANCE$ * __objModMethod() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objAddMethod(),__objDelMethod(),__ObjGetMethodList(),__objGetMsgList(),__objHasMethod() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objModInline() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Modifica (reemplaza) un m‚todo INLINE en una clase ya existente * $SYNTAX$ * __objModInline( , , ) --> oObjeto * $ARGUMENTS$ * es el objeto con el cual se va a trabajar * * es el nombre del s¡mbolo del m‚todo INLINE a * modificar. * * es un nuevo codeblock a asociar con el m‚todo INLINE * $RETURNS$ * __objModInline() retorna una referencia a . * $DESCRIPTION$ * __objModInline() es una funci¢n de soporte de clases de bajo * nivel que modifica un m‚todo INLINE en un Objeto y lo reemplaza con * una nuevo bloque de codigo. * * El permanece sin cambios si el s¡mbolo con el nombre * no existe en . * * __objModInline() es usado en el mecanismo de herencia. * $EXAMPLES$ * // crea un nueva clase THappy y le agrega un m‚todo INLINE Smile * oHappy := HBClass():New( "THappy" ) * bMyInline := { | nType | { ":)", ";)" }[ nType ] } * bYourInline := { | nType | { "*SMILE*", "*WINK*" }[ nType ] } * * __objAddInline( oHappy, "Smile", bMyInline ) * ? oHappy:Smile( 1 ) // :) * ? oHappy:Smile( 2 ) // ;) * * // reemplaza el m‚todo INLINE Smile con un nuevo codeblock * __objModInline( oHappy, "Smile", bYourInline ) * ? oHappy:Smile( 1 ) // *SMILE* * ? oHappy:Smile( 2 ) // *WINK* * * $STATUS$ * R * $COMPLIANCE$ * __objModInline() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objAddInline(),__objDelInline(),__ObjGetMethodList(),__objGetMsgList(),__objHasMethod() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objDelMethod() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Borra un METHOD de una clase * $SYNTAX$ * __objDelMethod( , ) --> oObjeto * $ARGUMENTS$ * es el objeto con el cual se va a trabajar * * es el nombre del s¡mbolo del METHOD o del m‚todo * INLINE a ser borrado (removido) del Objeto. * $RETURNS$ * __objDelMethod() retorna una referencia a . * $DESCRIPTION$ * __objDelMethod() es una funci¢n de soporte de clases de bajo nivel * que borra (remueve) un METHOD o un m‚todo INLINE de un Objeto. * * El permanece sin cambios si el s¡mbolo con el nombre * no existe en . * * __objDelInline() es exactamente la misma que __objDelMethod(). * $EXAMPLES$ * // crea un nueva clase THappy y le agrega un m‚todo Smile * oHappy := HBClass():New( "THappy" ) * * __objAddMethod( oHappy, "Smile", @MySmile() ) * ? __objHasMethod( oHappy, "Smile" ) // .T. * * // borra el m‚todo Smile * __objDelMethod( oHappy, "Smile" ) * ? __objHasMethod( oHappy, "Smile" ) // .F. * * STATIC FUNCTION MySmile( nType ) * LOCAL cSmile * DO CASE * CASE nType == 1 * cSmile := ":)" * CASE nType == 2 * cSmile := ";)" * ENDCASE * RETURN cSmile * * $STATUS$ * R * $COMPLIANCE$ * __objDelMethod() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objAddInline(),__objAddMethod(),__ObjGetMethodList(),__objGetMsgList(),__objHasMethod(),__objModInline(),__objModMethod() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objDelInline() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Borra un METHOD INLINE de una clase * $SYNTAX$ * __objDelInline( , ) --> oObjeto * $ARGUMENTS$ * es el objeto con el cual se va a trabajar * * es el nombre del s¡mbolo del METHOD o del m‚todo * INLINE a ser borrado (removido) del Objeto. * $RETURNS$ * __objDelInMethod() retorna una referencia a . * $DESCRIPTION$ * __objDelInMethod() es una funci¢n de soporte de clases de bajo nivel * que borra (remueve) un METHOD o un m‚todo INLINE de un Objeto. * * El permanece sin cambios si el s¡mbolo con el nombre * no existe en . * $EXAMPLES$ * // crea un nueva clase THappy y le agrega un m‚todo Smile * oHappy := HBClass():New( "THappy" ) * __objAddMethod( oHappy, "Smile", @MySmile() ) * ? __objHasMethod( oHappy, "Smile" ) // .T. * * // borra el m‚todo Smile * __objDelInMethod( oHappy, "Smile" ) * ? __objHasMethod( oHappy, "Smile" ) // .F. * * STATIC FUNCTION MySmile( nType ) * LOCAL cSmile * DO CASE * CASE nType == 1 * cSmile := ":)" * CASE nType == 2 * cSmile := ";)" * ENDCASE * RETURN cSmile * * $STATUS$ * R * $COMPLIANCE$ * __objDelMethod() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objAddInline(),__objAddMethod(),__ObjGetMethodList(),__objGetMsgList(),__objHasMethod(),__objModInline(),__objModMethod() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objDelData() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Borra un DATA (variable de instancia) de una clase * $SYNTAX$ * __objDelMethod( , ) --> oObjeto * $ARGUMENTS$ * es el objeto con el cual se va a trabajar * * es el nombre del s¡mbolo DATA a ser borrado * (removido) del Objeto. * $RETURNS$ * __objDelData() retorna una referencia a . * $DESCRIPTION$ * __objDelData() es una funci¢n de soporte de clases de bajo nivel * que borra (remueve) un DATA de un Objeto. * * El permanece sin cambios si el s¡mbolo con el nombre * no existe en . * $EXAMPLES$ * // crea un nueva clase THappy y le agrega un DATA lHappy * oHappy := HBClass():New( "THappy" ) * * __objAddData( oHappy, "lHappy" ) * ? __objHasData( oHappy, "lHappy" ) // .T. * * // borra el DATA, lHappy * __objDelData( oHappy, "lHappy" ) * ? __objHasData( oHappy, "lHappy" ) // .F. * * $STATUS$ * R * $COMPLIANCE$ * __objDelData() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objAddData(),__objGetMsgList(),__ObjGetValueList(),__objHasData(),__ObjSetValueList() * $END$ */ /* $DOC$ * $FUNCNAME$ * __objDerivedFrom() * $CATEGORY$ * Manejo de objetos * $ONELINER$ * Determina cuando una clase es derivada de otra clase * $SYNTAX$ * __objDerivedFrom( , ) --> lIsParent * $ARGUMENTS$ * es el objeto a inspeccionar * * es el objeto que puede ser un padre. puede * ser o bien un Objeto o una cadena de caracteres con el * nombre de la clase. * $RETURNS$ * __objDerivedFrom() retorna un valor logico TRUE (.T.) si el * es derivado de . * $DESCRIPTION$ * __objDerivedFrom() es una funci¢n de soporte de clases de bajo * nivel que chequea si una clase es una Superclase de la otra, o en * otras palabras si la clase es una clase hija o * descendiente de . * $EXAMPLES$ * // Crea tres clases y chequea sus relaciones * * #include "hbclass.ch" * FUNCTION main() * LOCAL oSuper, oObjeto, oDress * oSuper := TMood():New() * oObjeto := THappy():New() * oDress := TShirt():New() * ? __objDerivedFrom( oObjeto, oSuper ) // .T. * ? __objDerivedFrom( oSuper, oObjeto ) // .F. * ? __objDerivedFrom( oObjeto, oDress ) // .F. * RETURN NIL * * CLASS TMood * METHOD New() INLINE Self * ENDCLASS * * CLASS THappy FROM TMood * METHOD Smile() INLINE qout( "*smile*" ) * ENDCLASS * * CLASS TShirt * DATA Color * DATA Size * METHOD New() INLINE Self * ENDCLASS * * $STATUS$ * R * $COMPLIANCE$ * __objDerivedFrom() es una extensi¢n de Harbour. * $FILES$ * La librer¡a es rtl * $SEEALSO$ * __objHasData(),__ObjHasMethod() * $END$ */
c:\harbour\doc\es\pcode.txt
/*
 * $Id: pcode.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Antonio Linares
 *   Documentaci¢n en Ingl‚s
 *
 * Copyright 2001 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol de pcode.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


El OBJ de Clipper y el modelo pcode (GNU|Open|Clipper project)
==============================================================

Consideremos el siguiente ejemplo de Clipper, test.prg:

function Main()

   ? "Hola mundo!"

return nil

Una vez que esto se compila dentro de un OBJ, qu‚ es lo que hay dentro 
de ‚l ?
En efecto, lo que nosostros tenemos es un equivalente a la siguiente 
aplicaci¢n de lenguaje C:

SYMBOL symbols[] = { ... };

void MAIN( void )
{
   BYTE pcode[] = { ... };

   VirtualMachine( pcode, symbols );
}

B sicamente, el c¢digo fuente de test.prg ha sido convertido en una 
secuencia de bytes pcode contenidos en el array pcode[] = {...}
Todo lo que nuestra funci¢n MAIN hace es invocar, en tiempo de ejecuci¢n
a la funci¢n de VirtualMachine() que procesar  aquellos bytes de pcodes.

Vamos a revisar la estructura de pcodes de test.prg con m s detalle:

0000 (2A) LINE 0                    2A 00 00
0003 (2A) LINE 3                    2A 03 00
0006 (13)   SYMF [QOUT]             13 02 00
0009 (01)   PUSHC "Hello world!"    01 ...
0018 (27)   DO(1)                   27 01 00
001B (2A) LINE 5                    2A 05 00
001E (7B)   UNDEF                   7B
001F (79)   SAVE_RET                79
0020 (1E)   JMP 0023                1E 00 00
0023 (60) ENDPROC                   60

Nosotros podemos definir un archivo hbpcode.h para leer mejor aquellos 
pcode:

----------------------
hbpcode.h

#define  LINE    0x2A
#define  SYMF    0x13
#define  PUSHC   0x01
#define  DO      0x27
#define  UNDEF   0x7B
...
----------------------

As¡ finalmente esto quedar¡a como:

BYTE pcode[] =
     { LINE, 0, 0,
       LINE, 3, 0,
       SYMF, 2, 0,
       PUSHC, 'H', 'o', 'l', 'a', ' ', 'm', 'u', 'n', 'd', 'o', '!', '0',
       DO,   1, 0,
       LINE, 5, 0,
       UNDEF,
       SAVE_RET,
       JMP, 0, 0,
       ENDPROC };

Y qu‚ es SYMBOL symbols[] ?
Cliper crea una tabla de s¡mbolos en el archivo OBJ que luego ser  usada 
para crear una tabla din mica de s¡mbolos compartida por la aplicaci¢n
entera. cada uno de esos s¡mbolos tiene la siguiente estructura:

   typedef struct
   {
      char * szName;  // Clipper de hecho mantiene un array aqu¡ (11 bytes)
      BYTE   bScope;
      LPVOID pVoid;
   } SYMBOL;

#define PUBLIC 0    // el alcance de la funci¢n !

SYMBOL symbols[] = { { "MAIN",  PUBLIC, MAIN },
                     { "QQOUT", PUBLIC, QQOUT } };

Recordemos que el nombre de una funci¢n (MAIN, QQOUT) es la direcci¢n de 
la funci¢n, as¡ nuestra tabla de s¡mbolos estar  lista para usarla para 
saltar y ejecutar cualquier funci¢n enlazada (linkeada). 

De hecho, el pcode SYMF 2, 0 en nuestro ejemplo, instruir  a la funci¢n
VirtualMachine(), para usar el 2do s¡mbolo que es QQOUT.

Vamos a leer el pcode:

LINE 0, 0   =>  Nosotros estamos ubicados en la l¡nea 0
LINE 3, 0   =>  Nosotros estamos ubicados en la l¡nea 3
SYMF 2, 0   =>  Vamos a llamar a QQOUT desde nuestra tabla de s¡mbolos
PUSHC ...   =>  Esta cadena va a ser usada como un par metro
DO   1, 0   =>  ok, saltemos a QQOUT y recordemos que le dimos 1 par metro
LINE 5, 0   =>  Estamos de vuelta desde QQOUT y estamos ubicados en l¡nea 5
UNDEF       =>  Nosotros vamos a retornar este valor (NIL)
SAVE_RET    =>  Ok, retornemoslo
JMP  0      =>  No saltamos dondequiera, continuamos con el pr¢ximo pcode
ENDPROC     =>  Es el fin. hemos completado la ejecuci¢n de esta funci¢n

Todas estas funciones ser n evaluadas desde nuestra funci¢n 
VirtualMachine(), (Clipper la llama _plankton() ). Todas las funciones 
terminan usando ENDPROC, as¡ cuando VirtualMachine() encuentra ENDPROC 
sabe que ha alcanzado el final de una funci¢n pcode.

Ahora que nosotros entendemos claramente el modelo b sico, nosotros 
estamos en condiciones de comenzar a implementar "reglas de producci¢n" 
en nuestra sintaxis yacc (harbour.y) para generar el archivo de salida 
espec¡fico (test.c) con la estructura de arriba (¢ nosotros podemos 
f cilmente generar el archivo OBJ para ‚l). 

Continuar ...

Antonio Linares
  


c:\harbour\doc\es\pragma.txt
/*
 * $Id: pragma.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Jose Lalin 
 *   Documentaci¢n en Ingl‚s
 *
 * Copyright 2001 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol de pragma.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


DIRECTIVA #pragma
=================  


INTRODUCCION
============
Este archivo explica qu‚ es y c¢mo usar la directiva #pragma con Harbour.
Primariamente esto le da control sobre los switches de la l¡nea de 
comandos del compilador, desde adentro de su c¢digo fuente.


QUE ES ?
========
#pragma es una directiva usada dentro del c¢digo fuente en muchos 
compiladores para cambiar el comportamiento del compilador en tiempo 
de compilaci¢n.


USO
===

La directiva #pragma puede ser usada en dos formas:
1- el modo switch
2- modo comando

La sintaxis es: #pragma [=On/Off] ¢
                #pragma -CompilerFlag[+|-]

Ud. puede usar ambos modos mezclados en el mismo m¢dulo y en may£sculas ¢
min£sculas sin preocuparse.

Para habilitar ¢ deshabilitar un comando ¢ un switch Ud simplemente haga:

  * Modo Comando                      Modo Switch 
  --------------------------------------------------------------
  * #pragma =On/Off      #pragma /+/-

  Ejemplo: 
     #pragma AddDebugInfo=Off    /* Suprime informaci¢n de depuraci¢n */
     #pragma /B+                 /* Agrega informaci¢n de depuraci¢n 
                                        desde aqu¡                    */


IMPLEMENTACION
==============

Esta es la lista de los comandos soportados y switches:

  * Comando                           Switch
  -----------------------------------------------
  * AUTOMEMVARS         =     /A<+/->
  * DEBUGINFO           =     /B<+/->
  * ENABLEWARNINGS      =     /W<+/->
  * EXITSEVERITY        =     /E
  * FORCEMEMVARS        =     /V<+/->
  * LINEINFO            =     /L<+/->
  * NOSTARTPROC         =     /N<+/->
  * PREPROCESSING       =     /P<+/->
  * WARNINGLEVEL        =     /W
  * SHORTCUTTING        =     /Z<+/->

  Los switches tienen el mismo comportamiento que los del compilador  
  y los comandos son sin¢nimos de los switches.

  * TRACEPRAGMAS (Rastreo de pragmas)
  Este comando muestra la actividad de los pragmas en tiempo de 
  compilaci¢n cuando est n habilitados.

  NOTA: Ud. puede usar el modo de comando abreviado tipeando solamente 
        los ocho primeros caracteres.


NOTAS:
======
Esta directiva no es soportada en la versi¢n aislada del preprocesador 
de Harbour.


EJEMPLOS
========
#pragma NoStartProc=Off
/* #pragma /N- */

function Test()
return nil

Esto es lo mismo que llamar a Harbour con el switch -n en la l¡nea de
comandos pero con el gran beneficio que si Ud. olvida pasar el switch, 
este podr  ser usado de todas maneras, porque est  incluido dentro del 
c¢digo fuente.






c:\harbour\doc\es\rdd.txt
/*
 * $Id: rdd.txt 9190 2008-08-19 10:50:19Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2003 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: 
 *    DB*(), ORD*(), RDD*()
 *
 * Copyright 1999 Luiz Rafael Culik 
 * Documentaci¢n en Ingl‚s de: 
 *    DB*(), ORD*(), RDD*()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      RDDLIST()
 *  $CATEGORY$
 *      Base de Datos
 *  $ONELINER$
 *      Retorna un array con los Manejadores de Bases de Datos disponibles
 *  $SYNTAX$
 *      RDDLIST([]) --> aRDDLista
 *  $ARGUMENTS$
 *        es un entero que representa el tipo de RDD que Ud. desea
 *                  listar.  Las constantes RDT_FULL y RDT_TRANSFER 
 *                  representan los dos tipos de RDDs actualmente disponibles
 *
 *      Resumen de Tipo de RDDs 
 *      ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
 *      Constante      Valor       Significado
 *      ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
 *      RDT_FULL         1         Implementaci¢n Completa de RDD
 *      RDT_TRANSFER     2         Solamente driver Importar/Exportar
 *      ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
 *
 *      RDT_FULL identifica a los RDDs que tienen todas las capacidades que
 *      se asocian con un RDD.
 *
 *      RDT_TRANSFER identifica a RDDs de capcidad limitada. Estos solamente
 *      pueden transferir registros entre archivos. Ud. no puede usar estos 
 *      limitados drivers para abrir un archivo en un  rea de trabajo.
 *      Los manejadores SDF y DELIM son ejemplos de este tipo de RDD.
 *      Ellos solamente son usados en la implementaci¢n de APPEND FROM y 
 *      COPY TO con archivos SDF ¢ DELIMITED.
 *  $RETURNS$
 *      RDDLIST() retorna un array unidimensional de los nombres de RDD 
 *      registrados con la aplicaci¢n como .
 *  $DESCRIPTION$
 *      RDDLIST() es una funci¢n que devuelve una array de una dimensi¢n
 *      que contiene los nombres de todos los RDD disponibles.
 *
 *      Si Ud. no especifica , ser n devueltos todos los RDD 
 *      disponibles sin importar el tipo.
 *  $EXAMPLES$
 *      En este ejemplo RDDLIST() retorna un array conteniendo las cadenas 
 *      de caracteres: "DBF", "SDF", "DELIM", "DBFCDX", and "DBFNTX":
 *
 *      REQUEST DBFCDX
 *      .
 *      . < sentencias >
 *      .
 *      aRDDs := RDDLIST()   // Retorna 
 *                           // {"DBF", SDF", "DELIM", "DBFCDX", "DBFNTX" }
 *
 *
 *      En este ejemplo RDDLIST() retorna un array conteniendo las
 *      cadenas de caracteres: "SDF" and "DELIM":
 *
 *      #include "rddsys.ch"
 *      .
 *      . < sentencias >
 *      .
 *      aImpExp := RDDLIST( RDT_TRANSFER )
 *
 *  $TESTS$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *
 *  $SEEALSO$
 *      RDDNAME()
 *  $INCLUDE$
 *      El archivo de cabecera es rddsys.ch
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      RDDNAME()
 *  $CATEGORY$
 *      Base de Datos
 *  $ONELINER$
 *      Retorna el nombre del RDD actualmente activo
 *  $SYNTAX$
 *      RDDNAME() --> cNombreRDD
 *  $ARGUMENTS$
 *      Ninguno
 *  $RETURNS$
 *      Retorna una cadena de caracteres, el nombre registrado del RDD activo
 *      en el  rea de trabajo actual ¢ en el  rea especificada.
 *  $DESCRIPTION$
 *      RDDNAME() es una funci¢n que devuelve una cadena de caracteres con el
 *      nombre registrado del RDD activo en el  rea de trabajo actual ¢ en el 
 *       rea especificada.
 *
 *      Ud. puede especificar un  rea de trabajo distinta de la actual usando
 *      un alias con la funci¢n.
 *  $EXAMPLES$
 *      USE Customer VIA "DBFNTX" NEW
 *      USE Sales    VIA "DBFCDX" NEW
 *
 *      ? RDDNAME()                   // Retorna: DBFCDX (area actual)
 *      ? Customer->( RDDNAME() )     // Retorna: DBFNTX (area especificada)
 *      ? Sales->( RDDNAME() )        // Retorna: DBFCDX (area especificada)
 *  $TESTS$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *
 *  $SEEALSO$
 *      RDDLIST()
 *  $INCLUDE$
 *
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      RDDSETDEFAULT()
 *  $CATEGORY$
 *      Base de Datos
 *  $ONELINER$
 *      Establece ¢ retorna el RDD por defecto para la aplicaci¢n.
 *  $SYNTAX$
 *      RDDSETDEFAULT( [] ) --> cPreviousDefaultRDD
 *
 *  $ARGUMENTS$
 *       es una cadena de caracteres, el nombre del RDD que
 *                       va a ser hecho el nuevo RDD por defecto para la 
 *                       aplicaci¢n.
 *  $RETURNS$
 *      RDDSETDEFAULT() retorna una cadena de caracteres conteniendo el 
 *      nombre del manejador por defecto anterior . 
 *  $DESCRIPTION$
 *      RDDSETDEFAULT() es una funci¢n que devuelve el nombre del manejador
 *      (driver) por defecto anterior  y opcionalmente 
 *      establece el manejador actual, especificado por .
 *
 *      Si  no es especificado, el nombre del manejador por 
 *      defecto actual es devuelto y ‚ste contin£a siendo el manejador por 
 *      defecto. El manejador por defecto es el driver que Harbour usa si Ud.
 *      no especifica expl¡citamente un RDD con la cl usula VIA en el comando
 *      USE.
 *
 *      Esta funci¢n reemplaza a la funci¢n DBSETDRIVER() 
 *  $EXAMPLES$
 *      // Si el manejador por defecto no es DBFNTX, ponerlo por defecto
 *
 *      IF ( RDDSETDEFAULT() != "DBFNTX" )
 *           cOldRdd := RDDSETDEFAULT( "DBFNTX" )
 *      ENDIF
 *  $TESTS$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *
 *  $SEEALSO$
 *      DBSETDRIVER()
 *  $INCLUDE$
 *
 *  $END$
 */


/*  $DOC$
 *  $FUNCNAME$
 *      __RDDSETDEFAULT()
 *  $CATEGORY$
 *      Base de Datos
 *  $ONELINER$
 *      Establece ¢ retorna el RDD por defecto para la aplicaci¢n.
 *  $SYNTAX$
 *      __RDDSETDEFAULT( [] ) --> cPreviousDefaultRDD
 *  $ARGUMENTS$
 *       es una cadena de caracteres, el nombre del RDD que
 *                       va a ser hecho el nuevo RDD por defecto para la 
 *                       aplicaci¢n.
 *  $RETURNS$
 *      __RDDSETDEFAULT() retorna una cadena de caracteres conteniendo el 
 *      nombre del manejador por defecto anterior . 
 *  $DESCRIPTION$
 *      __RDDSETDEFAULT() es una funci¢n que devuelve el nombre del manejador
 *      (driver) por defecto anterior  y opcionalmente 
 *      establece el manejador actual, especificado por .
 *
 *      Si  no es especificado, el nombre del manejador por 
 *      defecto actual es devuelto y ‚ste contin£a siendo el manejador por 
 *      defecto. El manejador por defecto es el driver que Harbour usa si Ud.
 *      no especifica expl¡citamente un RDD con la cl usula VIA en el comando
 *      USE.
 *      Esta es una funci¢n de bajo nivel y debe usarse RDDSETDEFAULT() en su
 *      lugar.
 *      Esta funci¢n reemplaza a la funci¢n DBSETDRIVER() 
 *  $EXAMPLES$
 *      // Si el manejador por defecto no es DBFNTX, ponerlo por defecto
 *
 *      IF ( __RDDSETDEFAULT() != "DBFNTX" )
 *           cOldRdd := __RDDSETDEFAULT( "DBFNTX" )
 *      ENDIF
 *  $TESTS$
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *
 *  $SEEALSO$
 *      DBSETDRIVER()
 *  $INCLUDE$
 *
 *  $END$
 */ 



c:\harbour\doc\es\readme.txt
/*
 * $Id: readme.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001
 *   Documentaci¢n en Ingl‚s de: readme.txt
 *
 * Copyright 2002 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de: readme.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      PANORAMA
 *  $CATEGORY$
 *      Documento
 *  $ONELINER$
 *      Leame de HARBOUR
 *  $DESCRIPTION$
 *
 *                        El Proyecto Harbour
 *
 *      ************************************************************ 
 *      * Este archivo contiene informaci¢n sobre como obtener,    * 
 *      * instalar y usar Harbour.                                 * 
 *      * Por favor l‚alo -completamente- antes de solicitar ayuda * 
 *      ************************************************************ 
 *
 *       Harbour es una implementaci¢n libre (en todo sentido) de un
 *      compilador de lenguaje xBase. Este est  designado para ser compatible
 *      con el c¢digo fuente del compilador CA-Cl*pper (c).
 *      Esto significa que si Ud. tiene alg£n c¢digo que deber¡a compilar
 *      usando CA-Cl*pper(c) entonces este deber¡a compilar tambi‚n bajo
 *      Harbour.
 *
 *      La p gina web del Proyecto Harbour es:
 *               http://www.harbour-project.org/
 *
 *      El estado del proyecto y cualquier otra informaci¢n est  siempre
 *      disponible desde el sitio web.
 *      Hay tres listas de correo de Harbour. la lista de correo de los
 *      desarrolladores, la lista de correo de los usuarios de Harbour y la
 *      lista de correo de Conversaci¢n sobre temas relacionados a Harbour,
 *      aunque cualquiera es bienvenido para unirse a las discusiones.
 *
 *      Nos gustar¡a que Ud. se uniera al equipo de desarrollo de Harbour.
 *      Si Ud. esta interesado, puede subscribirse a nuestra lista de correo
 *      y comenzar contribuyendo a este proyecto p£blico libre.
 *
 *      Por favor si‚ntase con libertad de hacer preguntas, reportar ideas,
 *      sugestiones, correcciones, c¢digo, etc.
 *      Con la ayuda de todos Uds., el compilador Harbour y las librer¡as de
 *      ejecuci¢n se har  realidad muy pronto.
 *
 *
 *      Qu‚ es lo que esta distribuci¢n contiene ?
 *      ==========================================
 *
 *      Esta distribuci¢n es solamente una distribuci¢n de c¢digo fuente.
 *      Esta no contiene ning£n archivo ejecutable. Las versiones ejecutables
 *      de Harbour est n disponibles desde el sitio web.
 *      Las versiones ejecutables de Harbour NO crean programas ejecutables
 *      Harbour hasta este momento produce c¢digo de lenguaje C de salida,
 *      el cual debe ser compilado con la VM (M quina Virtual de Harbour) y
 *      las librer¡as de soporte para crear programas funcionales.
 *      Por favor haga tests, corriendo Harbour contra su c¢digo fuente en
 *      Clipper y reportando cualquier problema que pudiera ocurrir.
 *
 *      Muy importante: El pre-procesador esta ahora trabajando correctamente
 *
 *
 *      Instalaci¢n
 *      -----------
 *
 *      1. Deszipee el archivo zip de Harbour usando pkunzip ¢ equivalente.
 *              Por ej.: pkunzip -d build37.zip
 *         Esto crear  el directorio Harbour y todos los subdirectorios
 *         relevantes.
 *
 *      2. Compile Harbour usando su compilador de lenguaje C. Archivos make
 *         para diferentes plataformas est n incluidos.
 *
 *
 *      --- COPYRIGHT ---
 *
 *      Qu‚ informaci¢n de copyright tenemos ?
 *
 *
 *      --- LICENCIA ---
 *
 *      Informaci¢n sobre la Licencia de uso de Harbour est  disponible en
 *      el archivo license.txt
 *
 *
 *      --- RENUNCIA ---
 *
 *      Los participantes del Proyecto Harbour no asumen responsibilidad por
 *      errores u omisiones en estos materiales.
 *
 *      ESTOS MATERIALES SON PROVISTOS "COMO ESTAN" SIN NINGUNA GARANTIA
 *      DE NINGUN TIPO, SEA EXPRESA O IMPLICITA, INCLUYENDO PERO NO
 *      LIMITADA A LAS GARANTIAS IMPLICITAS DE COMERCIALIZACION, O EL
 *      USO PARA UN PROPOSITO PARTICULAR.
 *
 *      Los participantes del Proyecto Harbour no garantizan la exactitud ¢
 *      completitud del c¢digo, informaci¢n, texto, salida ¢ cualquier otro
 *      ¡tem contenido dentro de esos materiales. Los participantes del
 *      Proyecto Harbour no ser n responsables por ning£n da¤o especial,
 *      directo, indirecto, incidental, ¢ consecuente, incluyendo pero no
 *      limitado a la p‚rdida de ingresos ¢ ganancias, los cuales pueden
 *      resultar del uso ¢ mal uso de estos materiales.
 *
 *      La informaci¢n en el Proyecto Harbour est  sujeta a cambios sin
 *      previo aviso y no representa ning£n compromiso futuro para los
 *      participantes del Proyecto Harbour.
 *
 *      El Proyecto Harbour
 *
 *  $SEEALSO$
 *      Licencia
 *  $END$
 */


c:\harbour\doc\es\sayget.txt
/*
 * $Id: sayget.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2003 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *          @...GET, @...SAY
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $COMMANDNAME$
 *      @...GET
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Crea un objeto GET y lo visualiza en pantalla
 *  $SYNTAX$
 *      @ , [SAY  [PICTURE ] COLOR  ]
 *                        GET  [PICTURE ] [COLOR ]
 *                  [WHEN ] [VALID  / RANGE ,]
 *  $ARGUMENTS$
 *           La fila donde se visualiza el SAY/GET
 *
 *            La columna donde se visualiza el SAY/GET
 *
 *            Mensaje a visualizar
 *
 *        Expresi¢n de Caracteres para el PICTURE del SAY
 *
 *       Color a ser Usado por la expresi¢n SAY.
 *
 *            El nombre de la variable/campo
 *
 *        Expresi¢n de Caracteres para el PICTURE del GET
 *
 *           Expresi¢n l¢gica para permitir el GET.
 *
 *         Expresi¢n l¢gica para validar la entrada del GET
 *
 *         Valor inferior de RANGE
 *
 *            Valor superior de RANGE.
 *
 *       Cadena de Color a ser usada por la expresi¢n GET
 *  $RETURNS$
 *      Ninguno
 *  $DESCRIPTION$
 *      Este comando agrega un objeto GET al array p£blico reservado llamado
 *      GETLIST[] y lo muestra en pantalla. El campo ¢ variable a ser
 *      agregada al objeto GET es especificada en  y es visualizada
 *      en las coordenadas fila, columna , .
 *
 *      Si la cl usula SAY es usada el mensaje  ser  visualizado
 *      comenzando en ,, mientras que la variable de campo
 *       ser  visualizada en ROW(), COL()+ 1.
 *
 *      Si la cl usula PICTURE es usada para la expresi¢n SAY, el molde
 *       es usado, todas las reglas de formato contenidas en ‚l se
 *      aplicar n. Vea la funci¢n TRANSFORM I, para mayor informaci¢n.
 *
 *      Si  es especificado, la cl usula PICTURE de  ser 
 *      usada para el objeto GET y todas las reglas de formato ser n
 *      aplicadas. Vea las reglas de formato para GET en la tabla m s abajo.
 *
 *      Si la cl usula WHEN es especificada, entonces  se eval£a por
 *      una condici¢n l¢gica (.T.) y en ese caso el objeto GET ser  activado
 *      De otro modo el objeto GET ser  saltado y ninguna informaci¢n ser 
 *      obtenida a trav‚s de la pantalla. El nombre de una funci¢n definida
 *      por el usuario que retorne true (.T.) ¢ false ( F.) ¢ un codeblock
 *      puede ser especificado en . Esta cl usula no ser  activada
 *      hasta que un comando READ ¢ una funci¢n READMODAL() sea ejecutada.
 *
 *      Si la cl usula VALID es especificada,  se eval£a por una
 *      condici¢n l¢gica (.T.), si se cumple, el GET actual se considera
 *      v lido y la operatoria del GET continuar  hasta encontrar el pr¢ximo
 *      objeto GET activo. De lo contrario el cursor permanecer  en este
 *      objeto GET hasta que la operaci¢n se aborte ¢ la condici¢n en
 *       se cumpla (.T.).  El nombre de una funci¢n definida por
 *      el usuario que retorne true (.T.) ¢ false ( F.) ¢ un codeblock
 *      puede ser especificado en . Esta cl usula no ser  activada
 *      hasta que un comando READ ¢ una funci¢n READMODAL() sea ejecutada.
 *
 *      Si la cl usula RANGE (rango) es especificada, en lugar de la cl usula
 *      VALID, los dos valores que limitan el rango deben ser especificados
 *      en  y . La variable que se eval£a debe ser del mismo
 *      tipo que las que constituyen el rango. Si la variable  es del
 *      tipo de fecha (DATE),  y  deben ser tambi‚n del tipo
 *      DATE.  Si la variable  es del tipo NUMERICo  y 
 *      deben ser tambi‚n del tipo num‚rico. Si un valor falla el test RANGE,
 *      un mensaje de "OUT OF RANGE" (fuera de rango) aparecer  en el area
 *      SCOREBOARD (fila = 0, col. = 60). El mensaje de RANGE puede ser
 *      desactivado si el comando SET SCOREBOARD ¢ la funcion SET() apropiada
 *      es puesta a .F.
 *
 *      
 *      
 *      Funci¢n     Reglas de Formateo del GET
 *        @A        Permite solamente caracteres alfab‚ticos
 *        @B        Los n£meros ser n justificados a la izquierda
 *        @C        Todos los n£meros positivos ser n seguidos por CR
 *        @D        Todas las fechas usar n el formato SET DATE
 *        @E        Las fechas estar n en formato Brit nico y los n£meros
 *                  en formato Europeo.
 *        @K        Permite que un valor sugerido sea visto dentro del GET
 *                  pero borrado si se presiona alguna tecla que no sea la
 *                  de cursores cuando el cursor esta en la primera posici¢n
 *                  en el  rea del GET.
 *        @R        Los caracteres que se indican ser n insertados
 *        @S Permite el desplazamiento horizontal de un campo ¢
 *                  variable que es de  caracteres de ancho.
 *        @X        Todos los n£meros negativos ser n seguidos por DB
 *        @Z        Visualiza los valores num‚ricos cero como blancos
 *        @!        Fuerza la conversi¢n a may£sculas de los caracteres
 *        @(        Visualiza los n£meros negativos en parentesis con
 *                  espacios adelante
 *        @)        Visualiza los n£meros negativos en parentesis sin
 *                  espacios adelante
 *      
*
* * * * Molde Reglas de Formateo del GET * A S¢lo caracteres alfab‚ticos son permitidos * N S¢lo caracteres alfab‚ticos y num‚ricos son permitidos * X Cualquier caracter es permitido * L S¢lo T ¢ F son permitidos para datos l¢gicos * Y S¢lo Y ¢ N son permitidos para datos l¢gicos * 9 S¢lo digitos, incluyendo signos ser n permitidos * # S¢lo digitos, signos y espacios ser n permitidos * ! Caracteres alfab‚ticos son convertidos a May£sculas * S El signo Pesos ser  visualizado en lugar de espacios, delante * del tipo de dato num‚rico (aqui visto cmo una "S") * * El signo Asterisco ser  visualizado en lugar de espacios * delante del tipo de dato num‚rico * . Punto, define la posici¢n del punto decimal * , Coma, define la posici¢n del separado de miles. *
*
* Nota: * Las funciones de formateo para PICTURE pueden ser agrupadas juntas * cuando sean usandas conjuntamente con los moldes para PICTURE. * Sin embargo un espacio en blanco debe ser insertado en la cadena de * PICTURE si existen ambas: funciones y moldes. * $EXAMPLES$ * FUNCTION Main() * LOCAL cVar := Space(50) * LOCAL nId := 0 * CLS * @ 3,1 SAY "Nombre" GET cVar PICTURE "@!S 30" * @ 4,1 SAY "Ident." GET nId PICTURE "999.999" * READ * ? "El nombre que Ud. ingres¢ es:", cVar * ? "La Ident. que Ud. ingres¢ es:", nId * RETURN NIL * $TESTS$ * Ver ejemplos * $STATUS$ * R * $COMPLIANCE$ * Este comando es totalmente compatible con CA-Cl*pper. * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * @...SAY,READ,TRANSFORM() * $END$ */ /* $DOC$ * $COMMANDNAME$ * @...SAY * $CATEGORY$ * Comando * $ONELINER$ * Visualiza datos en las coordenadas dadas en el dispositivo actual * $SYNTAX$ * @ , SAY [ PICTURE ] [COLOR ] * $ARGUMENTS$ * La fila donde se visualiza el SAY * * La columna donde se visualiza el SAY * * Valor a visualizar * * Formato para el PICTURE * * Cadena de Color * $RETURNS$ * Ninguno * $DESCRIPTION$ * Este comando visualiza el contenido de en las coordenadas * , . Una cl usula PICTURE puede ser especificada en * . Si el dispositivo actual es establecido a la impresora, la * salida ir  a la impresora; Por defecto todas las salidas son * dirigidas a la pantalla. * * Para una lista completa de los Moldes y Funciones para PICTURES, vea * el comando @...GET * $EXAMPLES$ * FUNCTION Main * CLS * @ 2,1 SAY "Harbour" * @ 3,1 SAY "is" COLOR "b/r+" * @ 4,1 SAY "Power" PICTURE "@!" * RETURN NIL * $TESTS$ * Ver ejemplos * $STATUS$ * R * $COMPLIANCE$ * Este comando es totalmente compatible con CA-Cl*pper. * $PLATFORMS$ * Todas * $FILES$ * La librer¡a asociada es rtl * $SEEALSO$ * @...GET,SET DEVICE,TRANSFORM() * $END$ */
c:\harbour\doc\es\setmode.txt
/*
 * $Id: setmode.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: 
 *    SETMODE()
 *
 * See doc/license.txt for licensing terms.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      SETMODE()
 *  $CATEGORY$
 *      Entorno
 *  $ONELINER$
 *      Cambia el modo de video a un n£mero dado de filas y columnas
 *  $SYNTAX$
 *      SETMODE( ,  ) --> lSatisfactorio
 *  $ARGUMENTS$
 *       es el n£mero de filas para el modo de video deseado.
 *
 *       es el n£mero de columnas para el modo de video deseado.
 *
 *  $RETURNS$
 *      SETMODE() devuelve verdadero si el cambio en el modo de video fue
 *      satisfactorio, de otra manera devuelve falso.
 *
 *  $DESCRIPTION$
 *      SETMODE() es una funci¢n que cambia el modo de video (dependiendo de
 *      la combination de tarjeta de video y monitor), para que coincida con
 *      el n£mero de filas y columnas especificado.
 *      N¢tese que s¢lo hay realmente unas pocas combinaciones de pares de
 *      filas/columnas que produzcan el cambio en el modo de video.
 *      Los siguientes estan disponibles para D.O.S:
 *          12 filas x 40 columnas            12 filas x 80 columnas
 *          25 filas x 40 columnas            25 filas x 80 columnas
 *          28 filas x 40 columnas            28 filas x 80 columnas
 *          50 filas x 40 columnas            43 filas x 80 columnas
 *                                            50 filas x 80 columnas
 *      Algunas modos s¢lo estan disponibles para monitor color y/o VGA.
 *      Cualquier cambio producido en el tama¤o de la pantalla es actualizado
 *      en los valores devueltos por MAXROW() y MAXCOL().
 *
 *  $EXAMPLES$
 *   þ  El primer ejemplo cambia al modo de visualizacion de 12 lineas:
 *
 *      IF SETMODE( 12, 40)
 *         ? "Oye hombre, eres tu chicato ?"
 *      ELSE
 *         ? "Mam  tr eme los anteojos !"
 *      ENDIF
 *
 *   þ  El pr¢ximo ejemplo cambia al modo de visualizacion de 50 lineas:
 *      IF SETMODE( 50, 80)
 *         ? "Este maravilloso modo de video ha sido seteado"
 *      ELSE
 *         ? "Oye Manuel que este monitor no est  hecho de goma !"
 *      ENDIF
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Algunos de estos modos no estan disponibles en Clipper
 *  $PLATFORMS$
 *      DOS
 * $FILES$
 *      El Achivo fuente es ..\source\rtl\gtdos\gtdos.c
 *  $SEEALSO$
 *      MAXCOL(), MAXROW()
 *  $END$
 */ 


c:\harbour\doc\es\statics.txt
/*
 * $Id: statics.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Antonio Linares
 *   Documentaci¢n en Ingl‚s de statics.txt
 *
 * Copyright 2001 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol de statics.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


 
VARIABLES ESTÁTICAS
===================

Comenc‚ la implementaci¢n de Clases y creaci¢n de objetos cuando 
Harbour a£n no estaba manejando variables est ticas. (Harbour las 
reconoc¡a pero no generaba el pcode apropiado para ellas) .

As¡ Yo podr¡a hacer una introducci¢n al manejo de las variables 
est ticas como es, un sofisticado sistema, que Harbour esta yendo
a implementar.

Es algo conocido p£blicamente que las variables est ticas en Clipper 
est n localizadas al final del segmento de datos. Esto ha causado 
todo tipo de problemas. Esto explica por qu‚, cuando he dise¤ado 
FiveWin lo hice en una forma que no pudiera causar ning£n problema 
en el futuro.

En Harbour todas las variables est ticas (y quiero significar en todos 
los PRGs) son almacenadas en un s¢lo array de Harbour (un array del 
lenguaje Clipper), esto garantiza que podemos tener tantas variables 
est ticas como deseamos sin limites (s¢lo limitados por la memoria 
disponible).
Este array aStatics no es visible desde la aplicaci¢n (nivel PRG).

Basicamente lo que sucede cuando una funci¢n es llamada y esta 
funci¢n usa variables est ticas, es que la pila establece un puntero
al sector del array donde est n nuestras variables estaticas, as¡ 
desde este momento en adelante, acceder a la static1, static2, ... 
es acceder a alg£n elemento de ese array.

    static1 = statics[ statics_base_for_this_function + 1 ]
 
    ...

    staticn = statics[ statics_base_for_this_function + n ]

En orden de implementar esto nostros solo usamos dos nuevos opcodes:
_STATICS y _SFRAME. 
_STATICS, hace crecer el array global de estaticas lo suficiente para 
para soportar nuestras variables estaticas reci‚n definidas:

    _STATICS  -->  ASize( aStatics, Len( aStatics ) +  )

   _SFRAME --> le dice a la pila (stack) en que ubicaci¢n dentro del
               array aStatics estamos nosotros.

_STATICS, es s¢lo llamada una vez en el todo el PRG desde una funci¢n 
de inicio llamada _INITSTATICS (STATICS$ y SINIT en Clipper). 

Esta funci¢n almacena en un lugar astuto (su propio puntero en la 
tabla de s¡mbolos !) nuestra base est tica y luego _SFRAME 
simplemente la toma de all¡ y la establece en la pila. 
Esta funci¢n _INITSTATICS ejecutar  cualquier inicializaci¢n que 
nuestras globales est ticas puedan tener definidas en aquel PRG).

Uds. van a ver el c¢digo de todo esto. Solo quer¡a darles una 
clara idea sobre como Harbour hace esta magia :-)
 
Antonio Linares

 
 
 
c:\harbour\doc\es\strotype.txt
/*
 * $Id: strotype.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001
 *   Documentaci¢n en Ingl‚s de: strotype.txt
 *
 * Copyright 2002 Alejandro de G rate 
 *   Documentaci¢n en Espa¤ol de: strotype.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Fuertemente tipeado
 *  $CATEGORY$
 *      Documento 
 *  $ONELINER$
 *      Chequeo de Tipo en Tiempo de Compilaci¢n
 *  $DESCRIPTION$
 *      El Strong Type Checking, podr¡a ser tambi‚n descripto como 
 *      "Chequeo de tipo en Tiempo de Compilaci¢n". 
 *      Como Ud. podr¡a saber Clipper genera un error en Tiempo de Ejecuci¢n
 *      ("Type Mismatch") cuando nosotros intentamos realizar algunas 
 *      operaciones con el tipo equivocado de variable.
 *      
 *      Ejemplos:
 *
 *      LOCAL Var1 := "A"
 *
 *      ? Var1 * 3       // Error 
 *
 *      @ Var1, 7 SAY 'Hello'   // Error 
 *
 *      ? SubStr( "Hello", Var1 ) // Error 
 *      
 *      Las 3 l¡neas superiores podr¡an todas resultar en un error de Tiempo 
 *      de Ejecuci¢n, porque Var1 es del tipo CHARACTER, pero las l¡neas de
 *      arriba la usan como si fuera del tipo NUMERIC.
 *      
 *      Usando un chequeo de Tipo Fuerte, ¢ Chequeo de Tipo en Tiempo de 
 *      Compilaci¢n, el problema de arriba podr¡a haber sido descubierto y
 *      y reportado en tiempo de compilaci¢n, antes que esperar que el 
 *      inevitable problema sea descubierto cuando finalmente nosotros 
 *      ejecutemos el programa.
 *      
 *      Los lenguajes fuertemente tipeados permiten al programador "decirle"
 *      al compilador (declarar) cual es el tipo de cada variable, as¡ el
 *      compilador puede advertirle al programador, cuando esa variable
 *      declarada (Strong Typed), es usada en un contexto el cual es 
 *      incompatible con su tipo declarado.
 *      
 *      Por ejemplo si nosotros le "contamos" al compilador que la Var1 de
 *      arriba es del tipo CHARACTER (LOCAL Var1 AS CHARACTER), el compilador
 *      de Harbour, podr¡a en devoluci¢n advertirnos que nosotros intentamos
 *      realizar el calculo:
 *
 *      Var1 * 3
 *      
 *      porque el compilador sabe que nosotros no podemos realizar la 
 *      mutiplicaci¢n de un CHARACTER. (Nosotros podr¡amos hacerlo en alg£n
 *      contexto pero eso esta mas all  del alcance de esta discusi¢n).
 *      Similarmente nosotros podr¡amos haber sido advertidos cuando 
 *      intentamos usar Var1 como un numero de Fila ( @ Var1 ), ¢ como el
 *      segundo operando de la funci¢n SUBSTR(), SUBSTR( "Hello", Var1)
 *      porque el compilador sabe que esas operaciones requieren un tipo
 *      NUMERIC antes que CHARACTER.
 *      
 *      Lo de arriba puede ahorrarnos un mont¢n de tiempo, se¤alandonos un
 *      problema del cual no podemos escapar, porque ese c¢digo nunca 
 *      funcionar  correctamente una vez ejecutado.
 *      As¡ que antes de esperar al ciclo de testeo, para que tales problemas
 *      sean descubiertos, (y algunas veces a£n despu‚s de que nosotros 
 *      hemos distribuido nuestras aplicaciones) en su lugar nosotros podemos
 *      saber de esos problemas tan pronto como nosotros tipeamos:
 *      
 *           HARBOUR ProgName -w3
 *      
 *      Harbour tambi‚n ofrece un modo h¡brido, donde puede reportar este
 *      tipo de problemas, a£n sin el requerimiento que el programador 
 *      declare el tipo de variables. Esta caracter¡stica es referida como
 *      Chequeo Adaptativo de Tipo (Adaptive Type Checking).
 *      No es necesario que el programador haga ning£n cambio en el c¢digo
 *      para tomar ventaja de ‚sta caracter¡stica. Todos los 3 errores de
 *      arriba podr¡an haber sido reportados tan efectivamente como si el
 *      programador hubiera declarado Var1 como de Tipo Fuerte.
 *      
 *      Harbour podr¡a haber sido capaz de reportar tales problemas en 
 *      tiempo de compilaci¢n, porque la asignaci¢n Var1 := "A" implica que
 *      Var1 es del tipo CHARACTER, hasta que a ‚sta le sea asignado otro
 *      valor. As¡ entonces Harbour podr¡a "recordar" que Var1 a "adaptado"
 *      el tipo CHARACTER, y as¡ la multiplicaci¢n subsecuente   Var1 * 3
 *      ser  reportada como un error, tan pronto como Ud. intente compilar
 *      tal c¢digo.
 *      
 *      La parte hermosa de este modo h¡brido, es que a diferencia de las 
 *      variables Strong Typed, Ud. no tiene que declarar el c¢digo, as¡
 *      que no son necesarios cambios en el c¢digo fuente, el Tipo en su
 *      lugar es asumido por implicaci¢n (el Tipo del valor asignado).
 *      El otro beneficio es que, es completamente correcto asignar un nuevo
 *      valor de diferente tipo, en cualquier momento, a esa variable no
 *      declarada (variante). Tan pronto como nosotros asignemos un nuevo
 *      tipo, el compilador entonces nos proteger  de usar la variable en un
 *      contexto incompatible, dado que la variable a "adaptado" este Tipo 
 *      tan pronto como nosotros le hemos asignado un valor, el cual implica
 *      un Tipo.
 *      
 *      Mientras el Chequeo Adaptativo de Tipo puede ser completamente 
 *      efectivo en reportar muchos errores comunes, para tener todos los 
 *      beneficios del Chequeo en Tiempo de Compilaci¢n es recomendado 
 *      declarar el Tipo de las variables, cuando sea posible.
 *      
 *      Las caracter¡sticas del Tipo fuerte (Strong Type), tambi‚n permiten
 *      la declaraci¢n de par metros esperados (incluyendo opcionales) de las
 *      funciones definidas por el usuario, asi como tambi‚n el tipo 
 *      retornado.
 *      Similarmente, Ud. puede declarar el tipo de cualquier variable de
 *      Clase, M‚todos y Par metros de M‚todos.
 *
 *  $END$
 */  
 

c:\harbour\doc\es\subcodes.txt
/*
 * $Id: subcodes.txt 6075 2003-07-13 18:08:15Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2002 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *        subcodes.txt
 *
 * Documentaci¢n en Ingl‚s Luiz Rafael Culik
 *
 * Proposition:
 *
 *   If the error is raised in the same condition as in Clipper then
 *   the same subcode number should be used.
 *   Errors specific to the Harbour and generated in RTL modules
 *   should start from 3000
 *   Errors generated in tools functions should start from 4000
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/* ************************************************************************** */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1003
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Intento de acceder a una variable inexistente u oculta (hidden)
 *  $DESCRIPTION$
 *      La variable especificada no fue hallada.
 *      Si esta variable es un campo de una base de datos, asegurese que la
 *      base de datos este abierta.
 *      Si esta es una variable privada o publica entonces Ud. primero debe
 *      crearla usando la sentencia PRIVATE o PUBLIC.
 *  $FUNCTION$
 *
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1068
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      El dato usado no es del tipo LOGICO.
 *  $FUNCTION$
 *
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1068
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error de limite al intentar acceder al array
 *  $DESCRIPTION$
 *      Se intenta obtener un valor desde un dato que no es array.
 *  $FUNCTION$
 *
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1069
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error de limite al intentar acceder al array
 *  $DESCRIPTION$
 *      Se intenta establecer un valor a un dato que no es array.
 *  $FUNCTION$
 *
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1078
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      Los tipos de los argumentos comparados no coinciden.
 *  $FUNCTION$
 *      ==
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1072
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      Los tipos de los argumentos comparados no coinciden.
 *  $FUNCTION$
 *      <>
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1073
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      Los tipos de los argumentos comparados no coinciden.
 *  $FUNCTION$
 *      <
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1074
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      Los tipos de los argumentos comparados no coinciden.
 *  $FUNCTION$
 *      <=
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1075
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      Los tipos de los argumentos comparados no coinciden.
 *  $FUNCTION$
 *      >
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1076
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      Los tipos de los argumentos comparados no coinciden.
 *  $FUNCTION$
 *      >=
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1077
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      La operaci¢n no esta permitida para los argumentos pasados.
 *      El argumento no es un valor del tipo LOGICAL.
 *  $FUNCTION$
 *      !, .NOT.
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1078
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      El tipo de uno ¢ ambos argumentos no es del tipo LOGICAL.
 *  $FUNCTION$
 *      .AND.
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1079
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      El tipo de uno ¢ ambos argumentos no es del tipo LOGICAL.
 *  $FUNCTION$
 *      .OR.
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1076
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      El valor del argumento no puede ser incrementado.
 *  $FUNCTION$
 *      ++
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1081
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      La operaci¢n de suma no esta permitida para los argumentos usados.
 *  $FUNCTION$
 *      +
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1082
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      La operaci¢n de resta no esta permitida para los argumentos
 *      usados.
 *  $FUNCTION$
 *      -
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1100
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El argumento especificado no es una cadena.
 *  $FUNCTION$
 *      RTRIM(), TRIM()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1101
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El argumento especificado no es una cadena.
 *  $FUNCTION$
 *      LTRIM()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1102
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El primer argumento pasado a la funci¢n no es una cadena.
 *  $FUNCTION$
 *      UPPER()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1103
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El primer argumento pasado a la funci¢n no es una cadena.
 *  $FUNCTION$
 *      LOWER()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1104
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El argumento especificado no es un valor numerico.
 *  $FUNCTION$
 *      CHR
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1105
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      Los argumentos pasados a la funci¢n son de un tipo incorrecto.
 *  $FUNCTION$
 *      SPACE()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1106
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      Los argumentos pasados a la funci¢n son de un tipo incorrecto.
 *  $FUNCTION$
 *      REPLICATE()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1107
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El argumento especificado no es una cadena.
 *  $FUNCTION$
 *      ASC()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1108
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El argumento especificado no es una cadena.
 *  $FUNCTION$
 *      AT()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1076
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      Los argumentos del operador pesos '$' no son cadenas.
 *  $FUNCTION$
 *      Simbolo pesos ($)
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1110
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El primer argumento pasado a la funci¢n no es una cadena.
 *  $FUNCTION$
 *      SUBSTR()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1110
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El tipo de argumento pasado no es una cadena ni un array.
 *  $FUNCTION$
 *      LEN()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1112
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n son del tipo
 *      incorrecto.
 *  $FUNCTION$
 *      YEAR()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1113
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n son del tipo
 *      incorrecto.
 *  $FUNCTION$
 *      MONTH
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1114
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n son del tipo
 *      incorrecto.
 *  $FUNCTION$
 *      DAY()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1115
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n son del tipo
 *      incorrecto.
 *  $FUNCTION$
 *      DOW()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1116
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n son del tipo
 *      incorrecto.
 *  $FUNCTION$
 *      CMONTH()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1117
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n son del tipo
 *      incorrecto.
 *  $FUNCTION$
 *      CDOW()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1120
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n son del tipo
 *      incorrecto.
 *  $FUNCTION$
 *      DTOS
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1122
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n son del tipo
 *      incorrecto.
 *  $FUNCTION$
 *      TRANSFORM()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1124
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El primer argumento pasado a la funci¢n no es una cadena.
 *  $FUNCTION$
 *      LEFT()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1126
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El primer argumento pasado a la funci¢n no es una cadena.
 *  $FUNCTION$
 *      STRTRAN()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1132
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error de limite al acceder al array
 *  $DESCRIPTION$
 *      El indice especificado para el array es mayor que el numero de
 *      elementos en el array.
 *  $FUNCTION$
 *
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1133
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error de Limites en la asignaci¢n al array
 *  $DESCRIPTION$
 *      El indice especificado para el array es mayor que el numero de
 *      elementos en el array.
 *  $FUNCTION$
 *
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1068
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error de Limites en la asignaci¢n del elemento al array
 *  $DESCRIPTION$
 *      El indice especificado para el array es mayor que el numero de
 *      elementos en el array.
 *  $FUNCTION$
 *
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1085
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      MOD
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1089
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      ABS()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1090
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      INT()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1092
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      MIN()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1093
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      MAX()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1094
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      ROUND
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1095
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      LOG()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1096
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      EXP()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1097
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      SQRT()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1098
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      caracter.
 *  $FUNCTION$
 *      VAL()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/1099
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El argumento (o argumentos) pasados a la funci¢n no son del tipo
 *      numerico.
 *  $FUNCTION$
 *      STR()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/* ************************************************************************** */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/2010
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El argumento pasado no era una cadena conteniendo el nombre de
 *      archivo a copiar.
 *  $FUNCTION$
 *      __COPYFILE()
 *  $COMPLIANCE$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/2012
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error de archivo
 *  $DESCRIPTION$
 *      Un error ha ocurrido durante el intento de abrir, crear o escribir
 *      durante la operaci¢n de copia.
 *  $FUNCTION$
 *      __COPYFILE()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/2017
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El primer argumento pasado no es un array, y/o el segundo argumento
 *      no es un codeblock
 *  $FUNCTION$
 *      AEVAL()
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/2020
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El valor asado es negativo. Solamente valores mayores a cero son
 *      permitidos.
 *  $FUNCTION$
 *      SET DECIMALS
 *      SET EPOCH
 *      SET MARGIN
 *      SET MESSAGE
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */

/* ************************************************************************** */


/*  $DOC$
 *  $SUBCODE$
 *      BASE/3001
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      El tipo de argumento pasado no es un objeto. Solamente datos del
 *      tipo OBJECT pueden ser clonados por esta funci¢n.
 *  $FUNCTION$
 *      OCLONE()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3002
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      La Superclase no retorna un objeto
 *  $DESCRIPTION$
 *      El argumento pasado no es un nombre de una clase definida o la
 *      clase especificada no tiene una Superclase.
 *  $FUNCTION$
 *      __INSTSUPER()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3003
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      No se puede encontrar la Superclase
 *  $DESCRIPTION$
 *      El argumento pasado no es un nombre de una clase definida.
 *  $FUNCTION$
 *      __INSTSUPER()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3004
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      No se puede modificar un item DATA en una calse
 *  $DESCRIPTION$
 *      Un intento de modificar un miembro de una case fue hecho.
 *      Solamente INLINE y METHOD pueden ser modificados.
 *  $FUNCTION$
 *      CLASSMOD()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3005
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Incorrect arguments type
 *  $DESCRIPTION$
 *      O bien el primer argumento no era un objeto o el segundo argumento
 *      no era una cadena.
 *  $FUNCTION$
 *      ISMESSAGE(), OSEND()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */


/*  $DOC$
 *  $SUBCODE$
 *      BASE/3007
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento Incorrecto
 *  $DESCRIPTION$
 *      Los argumentos pasados estan causando un conflicto en el manejo
 *      de la solicitud.
 *      No hay ningun sentido en esperar por siempre cuando no hay
 *      eventos de entrada !
 *  $FUNCTION$
 *      INKEY()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3008
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Tipo de argumento no v lido
 *  $DESCRIPTION$
 *      Los argumentos pasado no son una cadena. Deberia ser una cadena
 *      con un nombre de variable o array unidimensional de cadenas.
 *  $FUNCTION$
 *      __MVPRIVATE(), __MVPUBLIC()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3009
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento incorrecto pasado a la funci¢n __MVGET
 *  $DESCRIPTION$
 *      La funci¢n __MVGET espera solamente un argumento: una cadena con un
 *      nombre de variable. El valor de esta variable sera devuelto.
 *  $FUNCTION$
 *      __MVGET()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3010
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento incorrecto pasado a la funci¢n __MVPUT
 *  $DESCRIPTION$
 *      La funci¢n __MVPUT espera al menos un argumento: una cadena con un
 *      nombre de variable. El valor de esta variable sera establecido.
 *  $FUNCTION$
 *      __MVPUT()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3011
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      Se intento obtener el argumento de la funci¢n, que no fue pasado.
 *      El numero de los argumentos requeridos es mayor que el numero
 *      de argumentos pasados.
 *  $FUNCTION$
 *      PVALUE()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3012
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El primer argumento no es una cadena con el nombre de la
 *      function / procedure que deberia ser llamado.
 *  $FUNCTION$
 *      DO
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3101
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a una funci¢n object/class
 *  $DESCRIPTION$
 *      Uno de los argumentos no es del tipo requerido.
 *  $FUNCTION$
 *      __OBJ*()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3102
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error al intentar modificar o borrar un s¡mbolo de la clase
 *  $DESCRIPTION$
 *      Un s¡mbolo deberia ser modificado o borrado de una clase, pero el
 *      s¡mbolo no existe.
 *  $FUNCTION$
 *      __OBJ*()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $SUBCODE$
 *      BASE/3103
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error al intentar agregar un s¡mbolo a la clase
 *  $DESCRIPTION$
 *      Un s¡mbolo deberia ser agregado a la clase, pero el s¡mbolo ya
 *      existe.
 *  $FUNCTION$
 *      __OBJ*()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

 /* ************************************************************************** */

/*  $DOC$
 *  $SUBCODE$
 *      TOOLS/4001
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Argumento no v lido pasado a la funci¢n
 *  $DESCRIPTION$
 *      El segundo argumento pasado a la funci¢n no es una cadena.
 *  $FUNCTION$
 *      ISLEAPYEAR()
 *  $STATUS$
 *      Especifico de Harbour
 *  $SEEALSO$
 *
 *  $END$
 */

/* ************************************************************************** */

/*  $DOC$
 *  $SUBCODE$
 *      TERM/2013
 *  $CATEGORY$
 *      Errores de ejecucion
 *  $ONELINER$
 *      Error al crear el archivo
 *  $DESCRIPTION$
 *      El archivo especificado no puede ser creado debido a algun error
 *      del sistema operativo.
 *  $FUNCTION$
 *      SET, SET ALTERNATE TO
 *  $STATUS$
 *      Clipper
 *  $SEEALSO$
 *
 *  $END$
 */ 


c:\harbour\doc\es\tbrowse.txt
/*
 * $Id: tbrowse.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2002 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *      TBrowseNew()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $CLASSDOC$
 *  $FUNCNAME$
 *      TBrowseNew()
 *  $CATEGORY$
 *      Clase TBrowse
 *  $ONELINER$
 *      Crea un Objeto Browse
 *  $CONSTRUCTOR$
 *      TBrowseNew( ,,, ) --> 
 *  $ARGUMENTS$
 *         Fila Superior
 *
 *            Columna Superior Izquierda
 *
 *          Fila Inferior
 *
 *        Columna Inferior Derecha
 *  $RETURNS$
 *        Un nuevo Objeto Browse
 *  $DESCRIPTION$
 *      Esta función establece una ventana de desplazamiento en las
 *      coordenadas establecidas por , , , 
 *      Para visualizar una base de datos use la función TBrowseDB() en
 *      su lugar.
 *  $DATANOLINK$
 *      :aColumns       Array para guardar todas las columnas del browse
 *
 *      :autoLite       Valor Lógico para controlar el color brillante
 *
 *      :cargo          Variable definida por el usuario
 *
 *      :colorSpec      Tabla de Color para la visualización del TBrowse
 *
 *      :colPos         Columna de posición actual del cursor
 *
 *      :colSep         Caracter separador de Columnas
 *
 *      :footSep        Caracter separador de Notas al pie
 *
 *      :freeze         Número de columnas a Congelar
 *
 *      :goBottomBlock  Codeblock ejecutado por TBrowse:goBottom()
 *
 *      :goTopBlock     Codeblock ejecutado por TBrowse:goTop()
 *
 *      :headSep        Caracter separador de Encabezados
 *
 *      :hitBottom      Indica el fin de los datos disponibles
 *
 *      :hitTop         Indica el comienzo de los datos disponibles
 *
 *      :leftVisible    Indica la posición de la columna no congelada
 *                      más a la izquierda en la pantalla
 *
 *      :nBottom        Número de la Fila Inferior para la visualización
 *                      del objeto TBrowse
 *
 *      :nLeft          Columna más a la Izquierda para la visualización
 *                      del objeto TBrowse
 *
 *      :nRight         Columna más a la Derecha para la visualización
 *                      del objeto TBrowse
 *
 *      :nTop           Número de la Fila Superior para la visualización
 *                      del objeto TBrowse
 *
 *      :rightVisible   Indica la posición de la columna no congelada
 *                      más a la Derecha en la pantalla
 *
 *      :rowCount       Número de filas de datos visibles en el TBrowse
 *
 *      :rowPos         Fila de posición actual del cursor
 *
 *      :skipBlock      Codeblock usado para la reposicion de datos
 *
 *      :stable         Indica si el objeto TBrowse es estable
 *
 *      :aRedraw        Array de items lógicos indicando si es apropiado
 *                      cuales filas necesitan ser redibujadas
 *
 *      :RelativePos    Indica la posición del registro relativa a la
 *                      posición del primer registro en la pantalla
 *
 *      :lHeaders       Variable interna que indica cuando hay cabeceras
 *                      de columnas para dibujar
 *
 *      :lFooters       Variable interna que indica cuando hay pie de
 *                      columnas para dibujar
 *
 *      :aRect          El rectangulo especificado con ColorRect()
 *
 *      :aRectColor     Los colores para usar en el rectangulo especificado
 *                      con ColorRect()
 *
 *      :aKeys          Mantiene las teclas de movimiento por defecto
 *
 *  $METHODSLINK$
 *      AddColumn()     Agrega un nuevo objeto TBColumn al Browse actual
 *
 *      Applykey()      Ejecuta el movimiento de teclas del Browse
 *
 *      SetKey()        Agrega una nueva tecla al diccionario de teclado
 *  $METHODSNOLINK$
 *      New(nTop, nLeft, nBottom, nRight)
 *                        Crea una nueva clase Browse y establece los
 *                        valores por defecto
 *
 *      Down()            Mueve el cursor una fila hacia abajo
 *
 *      End()             Mueve el cursor a la columna de datos más hacia
 *                        la derecha que esté visible.
 *
 *      GoBottom()        Reposiciona los datos fuentes al final del archivo
 *
 *      GoTop()           Reposiciona los datos fuentes al inicio del
 *                        archivo
 *
 *      Home()            Mueve el cursor a la columna visible más hacia la
 *                        izquierda
 *
 *      Left()            Mueve el cursor una columna hacia la izquierda
 *
 *      PageDown()        Reposiciona los datos fuentes hacia abajo
 *
 *      PageUp()          Reposiciona los datos fuentes hacia arriba
 *
 *      PanEnd()          Mueve el cursor a la columna de datos más a la
 *                        derecha
 *
 *      PanHome()         Mueve el cursor a la columna de datos más a la
 *                        izquierda
 *
 *      PanLeft()         Se desplaza hacia la izquierda sin cambiar la
 *                        posición del cursor
 *
 *      PanRight()        Se desplaza hacia la derecha sin cambiar la
 *                        posición del cursor
 *
 *      Right()           Mueve el cursor una columna hacia la derecha
 *
 *      Up()              Mueve el cursor una fila hacia arriba
 *
 *      ColCount()        Retorna el número actual de columnas
 *
 *      ColorRect()       Altera el color de un grupo rectangular de celdas
 *
 *      ColWidth(nCol)    Retorna el ancho de visualización de una columna
 *                        particular
 *
 *      Configure( nMode)      Reconfigura los seteos internos del objeto
 *                             TBrowse.  es un parámetro no
 *                             documentado en CA-Cl*pper
 *
 *      LeftDetermine()        Determina la columna no congelada más a la
 *                             izquierda en la pantalla
 *
 *      DeHilite()             Saca el color brillante a la celda actual
 *
 *      DelColumn( nPos )      Borra un objeto Column de un Browse
 *
 *      ForceStable()          Ejecuta una estabilización total
 *
 *      GetColumn( nColumn )   Obtiene un objeto TBColumn específico
 *
 *      Hilite()               Resalta la celda actual
 *
 *      InsColumn( nPos, oCol) Inserta un objeto TBColumn de un Browse
 *
 *      Invalidate()           Fuerza un redibujo completo durante la
 *                             próxima estabilización
 *
 *      RefreshAll()           Causa que todos los datos sean recalculados
 *                             durante la próxima estabilización
 *
 *      RefreshCurrent()       Causa que la fila actual sea rellenada y
 *                             redibujada en la próxima estabilización
 *
 *      SetColumn( nColumn, oCol) Reemplaza un objeto TBColumn con otro
 *
 *      Stabilize()             Ejecuta una estabilización incremental
 *
 *      DispCell( nCol, cColor) Visualiza una sola celda en el color dado
 *
 *  $EXAMPLES$
 *      Vea el archivo ../tests/testbrw.prg
 *  $TESTS$
 *      Vea el archivo ../tests/testbrw.prg
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      Estas funciones son compatibles con CA-Cl*pper 5.2
 *      Los métodos Applykey() y Setkey() solamente son visibles si la
 *      compatibilidad con Clipper 5.3 ( HB_COMPAT_C53 ) está definida.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librería asociada es rtl
 *  $SEEALSO$
 *      TBROWSENEW(),TBCOLUMNNEW()
 *  $END$
 */


/*  $CLASSDOC$
 *  $METHOD$
 *      SetKey()
 *  $CATEGORY$
 *      TBrowse Method
 *  $ONELINER$
 *      Obtiene y/o Establece un bloque de código asociado a una tecla
 *  $SYNTAX$
 *      SetKey(  [,] ) --> bOldBlock
 *  $ARGUMENTS$
 *          Un código de tecla (inkey) válido
 *
 *        Una ación opcional a asociar con el valor de la tecla
 *  $RETURNS$
 *        Si al presionar una tecla, se cambia el codeblock
 *                   se devolverá el bloque previo, de otro modo este
 *                   método devolverá el codeblock actual.
 *  $DESCRIPTION$
 *      Este método Obtiene y opcionalmente Establece un bloque de código
 *      que es asociado con el valor de una tecla.
 *      La tabla inferior muestra las definiciones de teclas/codeblocks
 *
 *      
 *      Valor Tecla    Bloque de Código
 *
 *      K_DOWN         {|Ob, nKey| Ob:Down(), 0}
 *      K_END          {|Ob, nKey| Ob:End(),  0}
 *      K_CTRL_PGDN    {|Ob, nKey| Ob:GoBottom(), 0}
 *      K_CTRL_PGUP    {|Ob, nKey| Ob:GoTop(), 0}
 *      K_HOME         {|Ob, nKey| Ob:Home(),  0}
 *      K_LEFT         {|Ob, nKey| Ob:Left(),  0}
 *      K_PGDN         {|Ob, nKey| Ob:PageDown(), 0}
 *      K_PGUP         {|Ob, nKey| Ob:PageUp(), 0}
 *      K_CTRL_END     {|Ob, nKey| Ob:PanEnd(), 0}
 *      K_CTRL_HOME    {|Ob, nKey| Ob:PanHome(), 0}
 *      K_CTRL_LEFT    {|Ob, nKey| Ob:PanLeft(), 0}
 *      K_CTRL_RIGHT   {|Ob, nKey| Ob:PanRight(),0}
 *      K_RIGHT        {|Ob, nKey| Ob:Right(), 0}
 *      K_UP           {|Ob, nKey| Ob:Up(), 0}
 *      K_ESC          {|Ob, nKey| -1 }
 *      
* * Los manejadores de tecla pueden ser consultados, agregados, * reemplazados y removidos del dicccionario interno de teclado. * Por ejemplo * * oTb:SETKEY( K_TAB, {|oTb, nKey| -1} ) * * Un manejador de teclas por defecto, puede ser declarado al * especificar un valor de cero para . esto asocia el codeblock * que será evaluado cada vez que TBrowse:Applykey() sea llamado con * un valor de tecla que no este contenida en el diccionario. * Por ejemplo * * oTb:SetKey( 0, {|oTb, nKey| DefKeyHandler( otb, nkey) }) * Esto llama a una función llamada DefKeyHandler() cuando nKey no * está contenida en el diccionario. * * Para remover una definición presion de tecla/codeblock, especifique * NIl para * oTb:SetKey( K_ESC, NIL ) * $EXAMPLES$ * oTb:SeyKey( K_F10, {|otb,nkey| ShowListByname(otb) } * $STATUS$ * S * $COMPLIANCE$ * El método Setkey() solamente es visible si la compatibilidad con * Clipper 5.3 ( HB_COMPAT_C53 ) está definida. * $PLATFORMS$ * Todas * $FILES$ * La librería asociada es rtl * $SEEALSO$ * Applykey() * $END$ */ /* $CLASSDOC$ * $METHOD$ * Applykey() * $CATEGORY$ * TBrowse Method * $ONELINER$ * Evalúa un codeblock asociado con una tecla especifica * $SYNTAX$ * ApplyKey( ) --> nResultado * $ARGUMENTS$ * Un código de tecla (inkey) válido * $RETURNS$ * Valor devuelto para el codeblock evaluado * Ver Tabla abajo * * * Valor Significado * -1 El usuario solicita que el browse pierda foco de entrada * 0 El codeblock asociado con fue evaluado * 1 Imposible de localizar en el diccionario, la tecla * no fué procesada *
* $DESCRIPTION$ * Este método evalúa un bloque de código asociado con que * está contenida en el diccionario TBrowse:setkey() * $EXAMPLES$ * WHILE .T. * oTb:forceStable() * * IF( oTb:applykey( inkey(0) ) == -1 ) * EXIT * ENDIF * * ENDDO * $STATUS$ * S * $COMPLIANCE$ * El método Applykey() solamente es visible si la compatibilidad con * Clipper 5.3 ( HB_COMPAT_C53 ) está definida. * $PLATFORMS$ * Todas * $FILES$ * La librería asociada es rtl * $SEEALSO$ * SetKey() * $END$ */ /* $CLASSDOC$ * $METHOD$ * AddColumn() * $CATEGORY$ * TBrowse Method * $ONELINER$ * Agrega una nueva Column a un Objeto TBrowse * $SYNTAX$ * AddColumn( oCol ) --> Self * $ARGUMENTS$ * Es un Objeto TBColumn * $RETURNS$ * El Objeto actual * $DESCRIPTION$ * Este método agrega un nuevo Objeto TBColumn especificado como * al objeto de browsing asignado. * $STATUS$ * R * $COMPLIANCE$ * Esta función es compatible con CA-Cl*pper 5.2 * $PLATFORMS$ * Todas * $FILES$ * La librería asociada es rtl * $SEEALSO$ * TBColumnNew() * $END$ */
c:\harbour\doc\es\tclass.txt
/*
 * $Id: tclass.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2000 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *
 * Copyright 2000 Brian Hays 
 *    Documentaci¢n en Ingles
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      HBClass()
 *  $CATEGORY$
 *      Clases
 *  $ONELINER$
 *      HBClass() es usada en la creaci¢n de todas las clases
 *  $SYNTAX$
 *      oClass := HBClass():New("TMyClass")
 *
 *      HBClass() es usualmente utilizada para definir una clase con los
 *      comandos definidos en hbclass.h:
 *        CLASS HBGetList   // Llama a HBClass() para crear la clase
 *           ...            // HBGetList
 *        ENDCLASS
 *  $ARGUMENTS$
 *
 *  $RETURNS$
 *      Una instancia de la Clase HBClass. Un objeto especial, el m‚todo
 *      :New() puede entonces crear las clases que Ud. define.
 *  $DESCRIPTION$
 *      HBClass es una clase que  ...
 *      Los m‚todos de clase son los siguientes:
 *
 *        New()                 Crea una nueva instancia de la clase
 *
 *  $EXAMPLES$
 *      FUNCTION TestObject()
 *      LOCAL oObject
 *
 *      oObject := HBClass():New("TMyClass")
 *      oObject:End()
 *
 *     RETURN NIL
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      La sintaxis Orientada a Objetos en Harbour es compatible con
 *      CA-Cl*pper.
 *      Pero Clipper solamente permite la creaci¢n de objetos a partir
 *      de unas pocas clases estandares, y NO le permite al programador
 *      crear nuevas clases.
 *      En Harbour, Ud. puede crear sus propias clases completamente con
 *      M‚todos, Variables de Instancia, Variables de Clase y Herencia.
 *      Aplicaciones enteras pueden ser designadas y codificadas en el
 *      estilo Orientado a Objetos.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      __objHasData(),Programacion Orientada a Objeto,CLASS
 *  $END$
 */



c:\harbour\doc\es\tgetlist.txt
/*
 * $Id: tgetlist.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2002 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *
 * Copyright 1999 Chen Kedem 
 *    Documentaci¢n en Ingl‚s de: READVAR()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      READVAR()
 *  $CATEGORY$
 *      Data input and output
 *  $ONELINER$
 *      Retorna el nombre de la variable del actual GET ¢ MENU
 *  $SYNTAX$
 *      READVAR( [] ) --> cViejoNombreVar
 *  $ARGUMENTS$
 *       es el nuevo nombre de la variable a establecer
 *  $RETURNS$
 *      READVAR() retorna el viejo nombre de la variable .
 *      Si ninguna variable fue establecida anteriormente, READVAR() retorna
 *      una cadena vac¡a.
 *  $DESCRIPTION$
 *      READVAR() es establecida dentro del comando READ ¢ MENU TO para
 *      mantener el nombre en may£sculas de la variable del GET / MENU TO
 *      actual y volverla de nuevo al viejo valor cuando aquellos comandos
 *      finalizan.
 *      Ud. no deber¡a normalmente establecer un nombre de variable, sino
 *      usarlo para obtener el nombre de la variable de un GET cuando se
 *      ejecuta una clausula VALID ¢ WHEN. ¢ durante la ejecuci¢n de un
 *      SET KEY y Ud. esta dentro de un READ ¢ MENU TO.
 *  $EXAMPLES$
 *      // Visualiza un menu, presione  para ver el nombre de la
 *      // variable de MENU TO
 *      CLS
 *      @ 1, 10 PROMPT "insecto chupador de sangre que infecta camas"
 *      @ 2, 10 PROMPT "germen; infeccion viral                     "
 *      @ 3, 10 PROMPT "defecto; snag; (fuente de) malfuncionamiento"
 *      @ 4, 10 PROMPT "peque¤o microfono oculto                    "
 *      @ 6, 10 SAY "(Presione F1 por una pista)"
 *      SET KEY 28 TO ShowVar
 *      MENU TO What_Is_Bug
 *
 *      PROCEDURE ShowVar
 *       ALERT( READVAR() )        // WHAT_IS_BUG in red ALERT() box
 *      RETURN
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      READVAR() trabaja exactamente como la funci¢n READKEY() de Clipper.
 *      Note sin embargo que el par metro  no est  documentado
 *      y es usado internamente por CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La Librer¡a es rtl
 *  $SEEALSO$
 *      @...GET,@...PROMPT,MENU TO,READ,SET KEY,__AtPrompt(),__MenuTo()
 *  $END$
 */


c:\harbour\doc\es\tlabel.txt
/*
 * $Id: tlabel.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2002 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de: LABEL FORM
 *
 * Copyright 1999 Luiz Rafael Culik 
 *    Documentacion en Ingl‚s
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      LABEL FORM
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Visualiza etiquetas en la pantalla ¢ en alg£n dispositivo alterno
 *  $SYNTAX$
 *      LABEL FORM  [TO PRINTER] [TO FILE ]
 *                 [] [WHILE  ] [FOR  ]
 *                 [SAMPLE] [NOCONSOLE]
 *  $ARGUMENTS$
 *         Nombre del archivo de etiquetas
 *
 *                Nombre de un archivo alterno
 *
 *                Expresi¢n de una condici¢n de ambito ¢ alcance
 *
 *                  Expresi¢n l¢gica de una Condici¢n WHILE
 *
 *                    Expresi¢n l¢gica de una Condici¢n FOR
 *  $DESCRIPTION$
 *      Este comando permite imprimir etiquetas basadas en el formato
 *      establecido en el archivo LBL, a un archivo especificado en
 *      .
 *      Por defecto la salida ir  a la pantalla, sin embargo esta salida
 *      puede ser redirigida ¢ bien a la impresora usando la cl usula
 *      TO PRINTER, ¢ bien a un archivo usando la cl usula TO FILE.
 *
 *      Si la cl usula TO FILE es especificada, el nombre del archivo de
 *      texto ASCII conteniendo las etiquetas generadas ser  .
 *
 *      Si ninguna extensi¢n de archivo es especificada, la extensi¢n .txt
 *      es agregada.
 *
 *       es la condici¢n de alcance para este comando. Alcances
 *      v lidos incluyen:
 *      NEXT  (n£mero de registros a ser visualizados donde 
 *            es el n£mero de registros)
 *      RECORD  (un registro espec¡fico a ser impreso)
 *      REST  (todos los registros comenzando desde la posici¢n del registro
 *            actual.
 *      ALL (todos los registros)
 *      Por defecto es ALL (todo).
 *
 *      Ambas expresiones l¢gicas pueden trabajar en conjunci¢n con la otra
 *      Donde  es la expresi¢n l¢gica para la condici¢n FOR (para los
 *      registros a ser visualizados dentro de un rango dado).
 *       es la expresi¢n l¢gica para la condici¢n WHILE (para los
 *      registros a ser visualizados hasta que se deje de cumplir la
 *      condici¢n.
 *
 *      Si la cl usula SAMPLE es especificada, etiquetas de prueba ser n
 *      generadas.
 *
 *      Si la cl usula NOCONSOLE es especificada, la salida a la consola ser 
 *      desactivada mientras este comando este siendo ejecutado.
 *
 *      Este comando sigue el criterio de ambito establecido en el comando
 *      SET PATH TO. El camino puede ser especifficado junto con la letra
 *      del disco en .
 *  $EXAMPLES$
 *      FUNCTION MAIN()
 *        USE Test New
 *        LABEL FORM EE
 *        USE
 *      RETURN NIL
 *
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Este comando es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer¡a es rtl
 *  $SEEALSO$
 *      REPORT FORM
 *  $END$
 */


c:\harbour\doc\es\tracing.txt
/*
 * $Id: tracing.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Gonzalo A. Diethelm  
 *   Documentaci¢n en Ingl‚s
 *
 * Copyright 2001 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */


INTRODUCCION AL SEGUIMIENTO DE LA EJECUCION (rastrear)
======================================================

Este archivo explica como habilitar el seguimiento en Harbour.


SEGUIMIENTO
===========

Harbour implementa el seguimiento al agregar llamadas a la siguiente
macro en c¢digo C:

    HB_TRACE(level, ("parametros estilo printf", arg1, arg2));

El nivel epecificado por la llamada a HB_TRACE afecta a Harbour en
dos formas: tiempo de compilaci¢n y tiempo de ejecuci¢n.


TIEMPO DE COMPILACION
=====================

En tiempo de compilaci¢n, la macro chequea cuando la constante del
preprocesador HB_TR_LEVEL es establecida a alguno de los siguientes
valores:

  #define HB_TR_ALWAYS     0
  #define HB_TR_FATAL      1
  #define HB_TR_ERROR      2
  #define HB_TR_WARNING    3
  #define HB_TR_INFO       4
  #define HB_TR_DEBUG      5

Si no es establecida a alguna de estas, la macro es seteada al valor
HB_TR_DEFAULT, la cual est  actualmente establecida (en hbtrace.h) a
HB_TR_WARNING.

Cuando el usuario expl¡citamente establece HB_TR_LEVEL ¢ este es
establecido por el compilador, sus efectos son como sigue: cualquier
llamada en el c¢digo con un nivel mayor que HB_TR_LEVEL son borradas
del c¢digo; estas llamadas simplemente desaparecen, y no hay efecto en
la perfomance del c¢digo despu‚s de eso.


TIEMPO DE EJECUCIÓN
===================

En tiempo de ejecuci¢n, el usuario puede establecer la variable de
entorno HB_TR_LEVEL a una de:

  HB_TR_ALWAYS
  HB_TR_FATAL
  HB_TR_ERROR
  HB_TR_WARNING
  HB_TR_INFO
  HB_TR_DEBUG

con el siguiente efecto: cualquiera de las llamadas a HB_TRACE que
fueron dejadas por el compilador y que tenga un nivel inferior ¢ igual
a HB_TR_LEVEL imprimir  sus argumentos a la salida stderr (pantalla).


EJEMPLOS
========

HB_TR_LEVEL    HB_TR_LEVEL    Descripci¢n
compilaci¢n    ejecuci¢n
----------------------------------------------------------------------
HB_TR_INFO     HB_TR_ERROR    Todas las llamadas con niveles HB_DEBUG
                              son eliminadas del c¢digo, as¡ ellas no
                              tienen efecto en la perfomance; solamente
                              llamadas con niveles de HB_TR_ERROR,
                              HB_TR_FATAL y HB_TR_ALWAYS son impresas.

HB_TR_WARNING  HB_TR_INFO     Todas las llamadaa con niveles HB_INFO y
                              HB_DEBUG son eliminadas del c¢digo, as¡
                              ellas no tienen efecto en la perfomance;
                              solamente llamadas con niveles de
                              HB_TR_ERROR, HB_TR_FATAL y HB_TR_ALWAYS
                              son impresas. Note como estableciendo
                              HB_TR_INFO en tiempo de ejecuci¢n no
                              tiene ning£n efecto, porque el c¢digo fu‚
                              compilado con un menor nivel de rastreo.

Por ejemplo, Yo compilo Harbour en WinNT con gcc (MINGW32), as¡
usualmente establezco la variable de entorno C_USR a algo as¡:

  export C_USR="-DHARBOUR_USE_WIN_GTAPI -DHB_TR_LEVEL=HB_TR_INFO"

y me aseguro que tengo todo el seguimiento para los niveles INFO,
WARNING, ERROR, FATAL y ALWAYS. Si obtengo demasiada informaci¢n,
en tiempo de ejecuci¢n, yo puedo cambiar la variable de entorno a:

  export HB_TR_LEVEL=HB_TR_WARNING

y mantener alejado todo el seguimiento del nivel INFO. En este caso
todas las llamadas a la funci¢n de seguimiento para el nivel INFO
ser n hechas de todas formas, as¡ que habr  un p‚rdida de perfomance.


USO
===

Cuando Harbour es compilado / ejecutado con alg£n nivel de seguimiento
y, entonces usado para compilar una aplicaci¢n regular de Harbour, la
aplicaci¢n producir  MONTONES de informaci¢n a la salida stderr.
Si Ud. est  usando un sensible shell de comando (como ser bash) Ud.
puede redirigir la salida stderr a un archivo como en:

  mi_aplic >rastro.txt


REDIRECCION
===========

La salida generada mientras se efect£a el seguimiento, va a stderr por
defecto. Ud. puede controlar esto en tiempo de ejecuci¢n al establecer
la variable de entorno HB_TR_OUTPUT al nombre del archivo donde Ud.
podr¡a querer que la salida de seguimiento sea dirigida. Si hay alg£n
problema abriendo el archivo para escritura, la salida se revierte a
stderr.


RASTREANDO EL PREPROCESADOR Y EL COMPILADOR
===========================================

Usualmente, Ud, no desear  habilitar el seguimiento en el preprocesador
y en el compilador; de otra menera Ud. ver  la salida de seguimiento
mientras compila a Harbour mismo. Si Ud. REALMENTE quiere habilitar el
seguimiento en el pre-procesador y/o el compilador, Ud. debe definir
en adici¢n a como se describe arriba, la siguiente variable, y entonces
recompilar el preprocesador / compilador:

  HB_TRACE_UTILS

El valor no tiene ninguna importancia.


SEGUIMIENTO Y EJECUCION
=======================

Es tambi‚n posible habilitar y deshabilitar el seguimiento en tiempo
de ejecuci¢n y averiguar y establecer el nivel de seguimiento. Desde
c¢digo C:

* Para averiguar el estado actual de seguimiento, y opcionalmente
  cambiar el estado actual a un valor dado (el cual deber¡a estar
  en el rango [0,1], de otra manera, el estado actual permanece sin
  cambios):

    hb_tracestate( estado );

  Por lo tanto, para s¢lo averiguar el estado actual, Ud. puede llamar
  en forma segura:

    estado_actual = hb_tracestate(-1);


  Para desactivar completamente el seguimiento:

    hb_tracestate(0);


  Para activar el seguimiento:

    hb_tracestate(1);


* Para averiguar el nivel actual de seguimiento, y opcionalemente
  cambiar el nivel actual a un valor dado (cual deber¡a estar en el
  rango [0,5], de otra manera, el estado actual permanece sin cambios):

    hb_tracelevel( nivel );


  Por lo tanto, para s¢lo averiguar el nivel actual, Ud. puede llamar
  en forma segura:

    nivel_actual = hb_tracelevel(-1);




Hay funciones para ser llamadas desde c¢digo Clipper:
(en realidad desde Harbour)

  current_state := HB_TRACESTATE( [new_state] )
  current_level := HB_TRACELEVEL( [new_level] )
 

  


c:\harbour\doc\es\treport.txt
/*
 * $Id: treport.txt 9193 2008-08-19 15:07:28Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2002 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *      REPORT FORM
 *
 * Copyright 1999 Luiz Rafael Culik 
 *    Documentacion
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      REPORT FORM
 *  $CATEGORY$
 *      Comando
 *  $ONELINER$
 *      Visualiza un reporte
 *  $SYNTAX$
 *      REPORT FORM  [TO PRINTER] [TO FILE ]
 *                  []  [WHILE  ] [FOR  ]
 *                  [PLAIN |HEADING ] [NOEJECT] [SUMMARY]
 *                  [NOCONSOLE]
 *  $ARGUMENTS$
 *       Nombre del archivo de reporte
 *
 *             Nombre de un archivo alterno
 *
 *             Ambito ¢ alcance
 *
 *               Expresi¢n l¢gica de una Condici¢n WHILE
 *
 *                 Expresi¢n l¢gica de una Condici¢n FOR
 *
 *          Encabezado del Reporte
 *  $RETURNS$
 *      NIL
 *  $DESCRIPTION$
 *      Este comando imprime un informe ¢ reporte llamado ,
 *      el cual es un archivo estandar FRM. La extensi¢n del archivo no es
 *      necesaria porque la extensi¢n .frm es asumida por defecto.
 *      Los comandos SET PATH TO y SET DEFAULT TO afectan la b£squeda del
 *      archivo ; a menos que la unidad de disco y el path
 *      sean especificados en , REPORT buscar  dentro del
 *      path especificado en el comando SET PATH y si no puede encontrar
 *      el modelo de reporte en el directorio actual.
 *
 *      La salida del reporte ser  desplazada basada en el valor de
 *      SET MARGIN TO.
 *
 *      Por defecto la salida ir  a la pantalla, sin embargo esta salida
 *      puede ser redirigida ¢ bien a la impresora usando la cl usula
 *      TO PRINTER, ¢ bien a un archivo usando la cl usula TO FILE.
 *
 *      Si la cl usula TO FILE es especificada, el nombre de un archivo
 *      alterno es especificado en .
 *      Si ninguna extensi¢n de archivo es especificada, la extensi¢n .txt
 *      es agregada.
 *
 *       es la condici¢n de alcance para este comando. Alcances
 *      v lidos incluyen:
 *      NEXT  (n£mero de registros a ser visualizados donde 
 *            es el n£mero de registros)
 *      RECORD  (un registro espec¡fico a ser impreso)
 *      REST  (todos los registros comenzando desde la posici¢n del registro
 *            actual.
 *      ALL (todos los registros)
 *      Por defecto es ALL (todo).
 *
 *      Ambas expresiones l¢gicas pueden trabajar en conjunci¢n con la otra
 *      Donde  es la expresi¢n l¢gica para la condici¢n FOR (para
 *      registros a ser visualizados dentro de un rango dado).
 *       es la expresi¢n l¢gica para la condici¢n WHILE (para los
 *      registros a ser visualizados hasta que se deje de cumplir la
 *      condici¢n.
 *
 *      Si la cl usula PLAIN es especificada, la fecha y los n£meros de
 *      pagina son suprimidos. En adicion no hay salto autom tico de p gina
 *      y el t¡tulo del reporte y los encabezados de columna aparecen una
 *      sola vez al principio del reporte.
 *
 *      Si la cl usula HEADING es usada,  es visualizado en el
 *      t¡tulo de cada p gina del reporte. El valor de  es
 *      evaluado solamente una vez antes de la ejecuci¢n del reporte; variar
 *      los valores de  no est  permitido.  La cl usula PLAIN
 *      tiene precedencia sobre la cl usula HEADING si ambas son incluidas.
 *
 *      Si la cl usula NOEJECT es usada, la eyecci¢n de la p gina inicial
 *      en el reporte no ser  realizado cuando la cl usula TO PRINTER sea
 *      especificada.
 *      De otro modo esta cl usula no tendr  efecto.
 *
 *      Si la cl usula SUMMARY es especificada, el reporte contendr 
 *      solamente grupos, subgrupos e informaci¢n de totales. La informaci¢n
 *      detallada del elemento t¡tulo ser  ignorada.
 *
 *      Si la cl usula NOCONSOLE es especificada, la salida a la consola ser
 *      desactivada mientras este comando este siendo ejecutado.
 *  $EXAMPLES$
 *      FUNCTION() MAIN
 *        USE Test New
 *        Report FORM EE
 *        USE
 *      RETURN NIL
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Este comando es totalmente compatible con CA-Cl*pper.
 *  $PLATFORMS$
 *      Todas
 *  $FILES$
 *      La librer­a es rtl
 *  $SEEALSO$
 *      LABEL FORM
 *  $END$
 */


c:\harbour\doc\es\var.txt
/*
 * $Id: var.txt 9191 2008-08-19 13:11:22Z vszakats $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2003 Alejandro de G rate 
 * Documentaci¢n en Espa¤ol de:
 *   __MVPUBLIC(), __MVPRIVATE(), __MVXRELEASE(),
 *   __MVRELEASE(), __MVSCOPE(), __MVCLEAR(),
 *   __MVDBGINFO(), __MVEXIST(), __MVGET(), __MVPUT(), MEMVARBLOCK(),
 *   FIELDBLOCK(), FIELDWBLOCK(), TYPE(), VALTYPE(), HB_ISBYREF()
 *
 * Copyright 1999 Ryszard Glab 
 * Documentaci¢n en Ingl‚s de:
 *   __MVPUBLIC(), __MVPRIVATE(), __MVXRELEASE(),
 *  __MVRELEASE(), __MVSCOPE(), __MVCLEAR(),
 *  __MVDBGINFO(), __MVGET(), __MVPUT(), MEMVARBLOCK(),
 *  TYPE()
 *
 * Copyright 1999 Chen Kedem 
 * Documentaci¢n en Ingl‚s de: FIELDBLOCK(), FIELDWBLOCK()
 *
 * Copyright 2001 Chen Kedem 
 * Documentaci¢n en Ingl‚s de: __MVEXIST()
 *
 * Copyright 2002 Walter Negro 
 * Documentaci¢n en Ingl‚s de: HB_ISBYREF()
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __MVPUBLIC()
 *  $CATEGORY$
 *      Variable Management
 *  $ONELINER$
 *      Esta funci¢n crea una variable PUBLIC
 *  $SYNTAX$
 *      __MVPUBLIC(  )
 *  $ARGUMENTS$
 *        Es ¢ bien una cadena que contiene el nombre de la
 *                         variable ¢ un array unidimensional de cadenas con
 *                         nombres de variables.
 *                         Los esqueletos ¢ comodines no estan permitidos.
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Esta funci¢n puede ser llamada por el compilador Harbour ¢ bien por
 *      el usuario.
 *      El compilador siempre pasa un item de tipo IT_SYMBOL que almacena el
 *      nombre de la variable.
 *      Si una variable con el mismo nombre ya existe, entonces la nueva
 *      variable no es creada, el valor previo permanece sin cambios.
 *      Si esta es la primera variable con ese nombre, entonces la variable
 *      es inicializada con el valor .T.
 *  $EXAMPLES$
 *      Ninguno disponible
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      __MVPRIVATE(),__MVXRELEASE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __MVPRIVATE()
 *  $CATEGORY$
 *      Variable Management
 *  $ONELINER$
 *      Esta funci¢n crea una variable PRIVATE
 *  $SYNTAX$
 *      __MVPRIVATE(  )
 *  $ARGUMENTS$
 *        Es ¢ bien una cadena que contiene el nombre de la
 *                         variable ¢ un array unidimensional de cadenas con
 *                         nombres de variables.
 *                         Los esqueletos ¢ comodines no estan permitidos.
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Esta funci¢n puede ser llamada por el compilador Harbour ¢ bien por
 *      el usuario.
 *      El compilador siempre pasa un item de tipo IT_SYMBOL que almacena el
 *      nombre de la variable.
 *      Si una variable con el mismo nombre ya existe, entonces el valor de
 *      la vieja variable es ocultado hasta que la nueva variable sea
 *      liberada.
 *      La nueva variable es siempre inicializada con el valor NIL.
 *  $EXAMPLES$
 *      Ninguno disponible
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      __MVPUBLIC(),__MVRELEASE(),__MVXRELEASE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __MVXRELEASE()
 *  $CATEGORY$
 *      Variable Management
 *  $ONELINER$
 *      Libera un valor almacenado en una variable PRIVATE or PUBLIC
 *  $SYNTAX$
 *      __MVXRELEASE(  )
 *  $ARGUMENTS$
 *        Es ¢ bien una cadena que contiene el nombre de la
 *                         variable ¢ un array unidimensional de cadenas con
 *                         nombres de variables.
 *                         Los esqueletos ¢ comodines no estan permitidos.
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Esta funci¢n libera valores almacenados en variable de memoria. Esta
 *      NO DEBE ser llamada directamente, sino que debe ser puesta dentro
 *      del comando RELEASE.
 *      Si la variable liberada es una variable PRIVATE entonces la variable
 *      previamente ocultada con el mismo nombre se vuelve visible despu‚s
 *      de salir del procedimiento donde la variable liberada fu‚ creada.
 *      Si Ud. accede la variable liberada en el mismo procedimiento/funci¢n
 *      donde esta fu‚ creada el valor NIL es devuelto. Ud. puede sin embargo
 *      asignar un nuevo valor a la variable liberada sin ning£n efecto
 *      colateral.
 *
 *      Esto libera la variable, a£n si esta variable fue creada en un
 *      procedimiento diferente.
 *  $EXAMPLES$
 *
 *      PROCEDURE MAIN()
 *        PRIVATE mPrivate
 *        mPrivate :="PRIVATE from MAIN()"
 *        ? mPrivate     //PRIVATE from MAIN()
 *        Test()
 *        ? mPrivate     //PRIVATE from MAIN()
 *      RETURN
 *
 *
 *      PROCEDURE Test()
 *        PRIVATE mPrivate
 *        mPrivate :="PRIVATE from Test()"
 *        ? mPrivate           //PRIVATE from TEST()
 *        RELEASE mPrivate
 *        ? mPrivate           //NIL
 *        mPrivate :="Again in Test()"
 *      RETURN
 *      
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      __MVPRIVATE(),__MVPUBLIC()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __MVRELEASE()
 *  $CATEGORY$
 *      Variable Management
 *  $ONELINER$
 *      Esta funci¢n libera variables PRIVATE
 *  $SYNTAX$
 *      __MVRELEASE( ,  )
 *  $ARGUMENTS$
 *        Cadena que contiene la m scara comod¡n para los nombres
 *                  de variables que ser n liberadas. Los comodines
 *                  soportados son: '*' y '?'
 *
 *       Valor l¢gico que esecifica si las variables
 *                  que coinciden con la m scara debieran ser borradas (.T.)
 *                  ¢ excluidas del borrado si es .F.
 *  $RETURNS$
 *      Nada
 *  $DESCRIPTION$
 *      Esta funci¢n libera valores almacenados en variable de memoria. Esta
 *      NO DEBE ser llamada directamente, sino que debe ser puesta dentro
 *      del comando RELEASE ALL.
 *      Si la variable liberada es una variable PRIVATE entonces la variable
 *      previamente ocultada con el mismo nombre se vuelve visible despu‚s
 *      de salir del procedimiento donde la variable liberada fu‚ creada.
 *      Si Ud. accede la variable liberada en el mismo procedimiento/funci¢n
 *      donde esta fu‚ creada el valor NIL es devuelto. Ud. puede sin embargo
 *      asignar un nuevo valor a la variable liberada sin ning£n efecto
 *      colateral.
 *      Variables PUBLIC no son cambiadas por esta funci¢n.
 *  $EXAMPLES$
 *      Ninguno
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      Esta funci¢n es una extensi¢n de Harbour.
 *  $FILES$
 *      La librer¡a asociada es vm
 *  $SEEALSO$
 *      __MVPRIVATE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      __MVSCOPE()
 *  $CATEGORY$
 *      Variable Management
 *  $ONELINER$
 *      Si la variable existe, entonces retorna su alcance
 *  $SYNTAX$
 *      __MVSCOPE(  )
 *  $ARGUMENTS$
 *         Una cadena con el nombre de una variable a chequear
 *  $RETURNS$
 *      Los valores simb¢licos son definidos en ../include/hbmemvar.ch
 *
 *      
 *      Macro                Significado
 *
 *      HB_MV_NOT_FOUND      La variable no est  declarada (no fu‚ encontrada
 *                           en la tabla de s¡mbolos)
 *      HB_MV_UNKNOWN        Si la variable No existe (pero fu‚ encontrada
 *                           en la tabla de s¡mbolos)
 *      HB_MV_ERROR          Si la informaci¢n No puede ser obtenida (error
 *                           de memoria ¢ error de argumento).
 *      HB_MV_PUBLIC         para variables p£blicas
 *      HB_MV_PRIVATE_GLOBAL para variables private declaradas fuera del
 *                           actual FUNCTION/PROCEDURE
 *      HB_MV_PRIVATE_LOCAL  para variables private declaradas dentro del
 *                           actual FUNCTION/PROCEDURE
 *      
* * $EXAMPLES$ * * PROCEDURE MAIN() * PUBLIC mPublic * PRIVATE mPrivateGlobal * * CallProc() * ? __mvScope( "mPrivateLocal" ) // HB_MV_UNKNOWN * RETURN * * * PROCEDURE CallProc() * PRIVATE mPrivateLocal * * ? __mvScope( "mPublic" ) // HB_MV_PUBLIC * ? __mvScope( "mPrivateGlobal" ) // HB_MV_PRIVATE_GLOBAL * ? __mvScope( "mPrivateLocal" ) // HB_MV_PRIVATE_LOCAL * ? __mvScope( "mFindMe" ) // HB_MV_NOT_FOUND * * IF( __mvScope( "mPublic" ) > HB_MV_ERROR ) * ? "la Variable existe" * ELSE * ? "la Variable no fu‚ creada a£n" * ENDIF * * RETURN * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una extensi¢n de Harbour. * $FILES$ * El archivo de cabecera es ../include/hbmemvar.ch * La librer¡a asociada es vm * $SEEALSO$ * __MVPRIVATE(),__MVPUBLIC() * $END$ */ /* $DOC$ * $FUNCNAME$ * __MVCLEAR() * $CATEGORY$ * Variable Management * $ONELINER$ * Borra todas las variables PRIVATE y PUBLIC * $SYNTAX$ * __MVCLEAR() * $ARGUMENTS$ * Ninguno * $RETURNS$ * Nada * $DESCRIPTION$ * Esta funci¢n borra todas las variables PRIVATE y PUBLIC. * Esta es usada para implementar la sentencia CLEAR MEMORY. * La memoria ocupada por todas las variables es liberada. * Cualquier intento de acceder a la variable resultar  en un error * de ejecuci¢n. * Ud tiene que reusar la sentencia PRIVATE ¢ PUBLIC para crear de nuevo * la variable que fue borrada por esta funci¢n. * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una extensi¢n de Harbour. * $FILES$ * La librer¡a asociada es vm * $SEEALSO$ * __MVPRIVATE(),__MVPUBLIC() * $END$ */ /* $DOC$ * $FUNCNAME$ * __MVDBGINFO() * $CATEGORY$ * Variable Management * $ONELINER$ * Retorna informaci¢n sobre las variables para el debugger * $SYNTAX$ * __MVDBGINFO( [, [, @] ] ) * $ARGUMENTS$ * El alcance de las variables sobre las que la informaci¢n * es solicitada. * Valores Soportados (definidos en hbmemvar.ch): * HB_MV_PUBLIC * HB_MV_PRIVATE (or any other value) * * La posici¢n de la variable solicitada en la lista de * variables con el alcance especificado. Esta deberia * comenzar desde la posici¢n 1 * * El valor es llenado con un nombre de variable si es * pasada por referencia y es especificada * $RETURNS$ * El valor retornado depende del n£mero de par metros pasados * $DESCRIPTION$ * Esta funci¢n obtiene informaci¢n acerca de las variables memvar. * Esta devuelve ¢ bien el n£merode variables con un alcance dado * (Cuando el primer argumento es pasado solamente) ¢ un valor de * variable identificada por su posici¢n en la la lista de variables * (Cuando el segundo argumento es pasado). * Esta tambi‚n devuelve el nombre de la variable si el tercer argumento * opcional es pasado por referencia. * * Si la variable solicitada no existe (la posici¢n solicitada es mayor * que el n£mero de variables definidas), entonces el valor NIL es * devuelto y el nombre de la variable es puesto a "?" * * Como la tabla din mica de s¡mbolos es usada para encontrar una * variable PUBLIC, las variables PUBLICas son siempre ordenadas * alfab‚ticamente. Las variables PRIVATE son ordenadas en el orden * de su creaci¢n. * * Nota: * Debido a la naturaleza din mica de las variables memvar no hay * garant¡a que sucesivas llamadas para recuperar el valor de la * variable PUBLIC retornar  el valor de la misma variable. * $EXAMPLES$ * #include * * LOCAL nCount, i, xValue, cName * * nCount =_mvDBGINFO( HB_MV_PUBLIC ) * * FOR i:=1 TO nCount * xValue =__mvDBGINFO( HB_MV_PUBLIC, i, @cName ) * ? i, cName, xValue * NEXT * * $TESTS$ * #include * PROCEDURE MAIN() * * ? 'PUBLIC=', __mvDBGINFO( HB_MV_PUBLIC ) * ? 'PRIVATE=', __mvDBGINFO( HB_MV_PRIVATE ) * * PUBLIC cPublic:='cPublic in MAIN' * * ? 'PUBLIC=', __mvDBGINFO( HB_MV_PUBLIC ) * ? 'PRIVATE=', __mvDBGINFO( HB_MV_PRIVATE ) * * PRIVATE cPrivate:='cPrivate in MAIN' * * ? 'PUBLIC=', __mvDBGINFO( HB_MV_PUBLIC ) * ? 'PRIVATE=', __mvDBGINFO( HB_MV_PRIVATE ) * * CountMemvars() * * ? 'Back in Main' * ? 'PUBLIC=', __mvDBGINFO( HB_MV_PUBLIC ) * ? 'PRIVATE=', __mvDBGINFO( HB_MV_PRIVATE ) * * RETURN * * * PROCEDURE CountMemvars() * LOCAL i, nCnt, xVal, cName * PUBLIC ccPublic:='ccPublic' * PRIVATE ccPrivate:='ccPrivate' * * ? 'In CountMemvars' * ? 'PUBLIC=', __mvDBGINFO( HB_MV_PUBLIC ) * ? 'PRIVATE=', __mvDBGINFO( HB_MV_PRIVATE ) * * PRIVATE cPublic:='cPublic' * * ? 'PUBLIC=', __mvDBGINFO( HB_MV_PUBLIC ) * ? 'PRIVATE=', __mvDBGINFO( HB_MV_PRIVATE ) * * nCnt =__mvDBGINFO( HB_MV_PRIVATE ) +1 * * FOR i :=1 TO nCnt * xVal =__mvDBGINFO( HB_MV_PRIVATE, i, @cName ) * ? i, '=', cName, xVal * NEXT * * nCnt = __mvDBGINFO( HB_MV_PUBLIC ) + 1 * * FOR i :=1 TO nCnt * xVal = __mvDBGINFO( HB_MV_PUBLIC, i, @cName ) * ? i, '=', cName, xVal * NEXT * * RETURN * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n deber¡a ser llamada solamente desde el depurador. * $FILES$ * La librer¡a asociada es vm * $SEEALSO$ * __MVSCOPE() * $END$ */ /* $DOC$ * $FUNCNAME$ * __MVEXIST() * $CATEGORY$ * Variable Management * $ONELINER$ * Determina si un nombre dado es una variable PUBLIC ¢ PRIVATE * $SYNTAX$ * __MVEXIST( ) --> * $ARGUMENTS$ * Cadena con el nombre de la variable a chequear * $RETURNS$ * __MVEXIST() retorna TRUE (.T.) si una MEMVAR llamada * existe actualmente. * $DESCRIPTION$ * Esta funci¢n determina si una variable PUBLIC ¢ PRIVATE con el * nombre existe ¢ no. * $EXAMPLES$ * LOCAL TheLocal * STATIC TheStatic * PUBLIC ThePublic * PRIVATE ThePrivate * ? __MVEXIST( "NotExist" ) // .F. * ? __MVEXIST( "TheLocal" ) // .F. * ? __MVEXIST( "TheStatic" ) // .F. * ? __MVEXIST( "ThePublic" ) // .T. * ? __MVEXIST( "ThePrivate" ) // .T. * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una extensi¢n de Harbour. * $FILES$ * La librer¡a asociada es vm * $SEEALSO$ * MEMVAR, PRIVATE, PUBLIC * $END$ */ /* $DOC$ * $FUNCNAME$ * __MVGET() * $CATEGORY$ * Variable Management * $ONELINER$ * Esta funci¢n retorna el valor de una variable de memoria (MEMVAR) * $SYNTAX$ * __MVGET( ) --> * $ARGUMENTS$ * Cadena con el nombre de la variable * $RETURNS$ * el valor de la variable * $DESCRIPTION$ * Esta funci¢n devuelve el valor de una variable de memoria PRIVATE ¢ * PUBLIC si la variable existe, de otro modo genera un error en tiempo * de ejecuci¢n. * La variable es especificada por su nombre pasado como par metro a la * funci¢n. * $EXAMPLES$ * FUNCTION MEMVARBLOCK( cMemvar ) * RETURN {|x| IIF( PCOUNT()==0, __MVGET( cMemvar ),; * __MVPUT( cMemvar, x ) ) } * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una extensi¢n de Harbour. * $FILES$ * La librer¡a asociada es vm * $SEEALSO$ * __MVPUT() * $END$ */ /* $DOC$ * $FUNCNAME$ * __MVPUT() * $CATEGORY$ * Variable Management * $ONELINER$ * Esta funci¢n establece el valor de una variable de memoria * $SYNTAX$ * __MVGET( [, ] ) --> * $ARGUMENTS$ * Cadena con el nombre de la variable * * Un valor de cualquier tipo que puede ser establecido * Si no es especificado, entonces NIL es asumido. * $RETURNS$ * Un valor asignado a la variable dada. * $DESCRIPTION$ * Esta funci¢n establece el valor de una variable de memoria PRIVATE ¢ * PUBLIC si la variable existe, de otro modo genera un error en tiempo * de ejecuci¢n. * La variable es especificada por su nombre pasado como par metro a la * funci¢n. * Si un valor no es especificado, entonces NIL es asumido. * $EXAMPLES$ * FUNCTION MEMVARBLOCK( cMemvar ) * RETURN {|x| IIF( PCOUNT()==0, __MVGET( cMemvar ),; * __MVPUT( cMemvar, x ) ) } * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es una extensi¢n de Harbour. * $FILES$ * La librer¡a asociada es vm * $SEEALSO$ * __MVPUT() * $END$ */ /* $DOC$ * $FUNCNAME$ * MEMVARBLOCK() * $CATEGORY$ * Variable Management * $ONELINER$ * Retorna un codeblock que establece/obtiene el valor de variable * $SYNTAX$ * MEMVARBLOCK( ) --> * $ARGUMENTS$ * Cadena con el nombre de la variable * $RETURNS$ * un codeblock que establece/obtiene el valor de variable * $DESCRIPTION$ * Esta funci¢n devuelve un codeblock que establece/obtiene el valor de * una variable PRIVATE ¢ PUBLIC. Cuando este codeblock es evaluado * sin ning£n par metro pasado, entonces este devuelve el valor actual * de la variable dada. * Si el segundo par metro es pasado para la evaluaci¢n del codeblock * entonces este valor es usado para establecer el nuevo valor de la * variable dada, el valor pasado es tambi‚n retornado como un valor * la evaluaci¢n del codeblock. * $EXAMPLES$ * PROCEDURE MAIN() * LOCAL cbSetGet * PUBLIC xPublic * * cbSetGet = MEMVARBLOCK( "xPublic" ) * EVAL( cbSetGet, "nuevo valor" ) * ? "Valor de la variable xPublic:", EVAL( cbSetGet ) * * RETURN * * $STATUS$ * R * $COMPLIANCE$ * Esta funci¢n es compatible con CA-Cl*pper * $FILES$ * La Librer¡a es rtl * $SEEALSO$ * __MVGET(),__MVPUT() * $END$ */ /* $DOC$ * $FUNCNAME$ * FIELDBLOCK() * $CATEGORY$ * Code Block * $ONELINER$ * Retorna un codeblock que establece/obtiene el valor de un campo * $SYNTAX$ * FIELDBLOCK( ) --> bFieldBlock * $ARGUMENTS$ * Es una cadena que contiene el nombre de un campo. * $RETURNS$ * FIELDBLOCK() retorna un codeblock que cuando es evaluado puede * obtener el valor del campo ¢ asignar un nuevo valor al campo. * Si no es especificado ¢ es de otro tipo distinto a * CHARACTER, FIELDBLOCK() retorna NIL. * $DESCRIPTION$ * FIELDBLOCK() retorna un codeblock que establece/obtiene el valor de * un campo. * Cuando este campo es evaluado sin ning£n par metro pasado entonces * este devuelve el valor actual del campo dado. * Si el codeblock es evaluado con un par metro, entonces su valor es * usado para establecer un nuevo valor para el campo, este valor es * tambi‚n retornado por el bloque. * Si el bloque es evaluado y no hay ning£n campo con el nombre * en el  rea actual de trabajo el codeblock devuelve NIL. * * Note que FIELDBLOCK() trabaja en el  rea actual de trabajo, si Ud. * necesita usar un  rea de trabajo distinta a la actual, use * FIELDWBLOCK() en su lugar. * $EXAMPLES$ * // Abre un archivo llamado Test que tiene un campo llamado "name" * LOCAL bField * bFiled := FIELDBLOCK( "name" ) * USE Test * * ? 'Valor Original del campo "name" :', EVAL( bField ) * EVAL( bField, "Mr X new name" ) * ? 'Nuevo valor para el campo "name" :', EVAL( bField ) * * $STATUS$ * R * $COMPLIANCE$ * Si el bloque es evaluado y no hay ning£n campo con el nombre * en el  rea actual de trabajo, el codeblock devuelve NIL. * * CA-Cl*pper produce un error BASE/1003 si el campo no existe. * $FILES$ * La Librer¡a es rtl * $SEEALSO$ * EVAL(),FIELDWBLOCK(),MEMVARBLOCK() * $END$ */ /* $DOC$ * $FUNCNAME$ * FIELDWBLOCK() * $CATEGORY$ * Code Block * $ONELINER$ * Retorna un codeblock que setea/obtiene un campo en una  rea dada * $SYNTAX$ * FIELDWBLOCK( , ) --> bFieldBlock * $ARGUMENTS$ * Es una cadena que contiene el nombre de un campo. * * N£mero de  rea de trabajo en la cual existe * * $RETURNS$ * FIELDWBLOCK() retorna un codeblock que cuando es evaluado puede * obtener el valor del campo ¢ asignar un nuevo valor al campo en un *  rea de trabajo dada. * Si no es especificado ¢ es de otro tipo distinto a * CHARACTER, ¢ si no es especificada ¢ no es NUMERICa * FIELDWBLOCK() retorna NIL. * $DESCRIPTION$ * FIELDWBLOCK() retorna un codeblock que establece/obtiene el valor de * un campo para un  rea de trabajo dada. * Cuando este campo es evaluado sin ning£n par metro pasado entonces * este devuelve el valor actual del campo dado. * Si el codeblock es evaluado con un par metro, entonces su valor es * usado para establecer un nuevo valor para el campo, este valor es * tambi‚n retornado por el bloque. * Si el bloque es evaluado y no hay ning£n campo con el nombre * en el  rea de trabajo especificada, el codeblock * devuelve NIL. * $EXAMPLES$ * LOCAL bField * // Este bloque trabaja sobre campo "name" que existe en el area 2 * bFiled := FIELDBLOCK( "name", 2 ) * * // Abre el archivo llamado One en el area 1, * // que tiene un campo llamado "name" * SELECT 1 * USE One * * // Abre el archivo llamado Two en el area 2, * // que tambien tiene un campo llamado "name" * SELECT 2 * USE Two * SELECT 1 * ? "Nombres Originales: ", One->name, Two->name * ? "Nombre para el archivo dos:", EVAL( bField ) * EVAL( bField, "Two tiene un nuevo nombre" ) * ? "y ahora: ", One->name, Two->name * * $STATUS$ * R * $COMPLIANCE$ * Si el bloque es evaluado y no hay ning£n campo con el nombre * en el  rea de trabajo dada, el codeblock devuelve NIL. * * CA-Cl*pper produce un error BASE/1003 si el campo no existe. * $FILES$ * La Librer¡a es rtl * $SEEALSO$ * EVAL(),FIELDBLOCK(),MEMVARBLOCK() * $END$ */ /* $DOC$ * $FUNCNAME$ * TYPE() * $CATEGORY$ * Miscelanea * $ONELINER$ * Obtiene el tipo de una expresi¢n * $SYNTAX$ * TYPE( ) --> * $ARGUMENTS$ * debe ser una expresi¢n de caracteres * $RETURNS$ * Una cadena indicando el tipo de la expresi¢n pasada. * * * cRetType Significado * * "A" Array * "B" Block * "C" Cadena de Caracteres * "D" Fecha (Date) * "L" L¢gico * "M" Memo * "N" Numerico * "O" Objeto * "U" Variable NIL, local, static, ¢ no enlazada en la funci¢n * "UE" Error sintaxis en expression ¢ argumentos invalidos * "UI" Funcion con nombre no-reservado fue solicitada *
* * $DESCRIPTION$ * Esta funci¢n devuelve una cadena que representa el tipo de datos del * argumento. Esta puede ser cualquier expresi¢n v lida de Harbour. * * Si hay un error de sintaxis en la expresi¢n pasada entonces * "UE" es devuelto. * * Si hay una llamada a alguna funci¢n de Harbour no-reservada entonces * "UI" es devuelto (en otras palabras, no hay llamada a la funci¢n UDF * durante la determinaci¢n de tipo - este es un comportamiento * compatible con Clipper). Adicionalmente si la funci¢n de usuario * solicitada no es enlazada dentro del ejecutable final, entonces "U" * es devuelto. * * El tipo de dato de esta expresi¢n es chequeado al invocar al * compilador de macros y por la evaluaci¢n del c¢digo generado (si es * que no hay errores de sintaxis). * Esto causa que TYPE() no pueda determinar un tipo de variable LOCAL * ¢ STATIC, solamente s¡mbolos visibles en tiempo de ejecuci¢n pueden * ser chequeados. * * N¢tese la sutil diferencia entre las funciones TYPE y VALTYPE. * La funci¢n VALTYPE() no llama al compilador de macros, esta * simplemente chequea el tipo del argumento pasado, que puede ser de * cualquier tipo. * La funci¢n TYPE() requiere un argumento de cadena de caracteres con * una expresi¢n v lida de Harbour. El tipo de dato de esta expresi¢n * es retornado. * $EXAMPLES$ * ? TYPE( "{ 1, 2 }" ) // prints "A" * ? TYPE( "IIF(.T., SUBSTR('TYPE',2,1), .F.)" ) // prints "C" * ? TYPE( "AT( 'OK', MyUDF())>0" ) // prints "UI" * ? TYPE( "{ 1, 2 }[ 5 ]" ) // prints "UE" * * //-------------------------------------------------------- * * LOCAL c * PRIVATE a:="A", b:="B" * ? TYPE( "a + b + c" ) //prints: "U" (variable 'C' es local) * * //-------------------------------------------------------- * * LOCAL cFilter := SPACE( 60 ) * ACCEPT "Ingrese la expresi¢n de filtro:" TO cFilter * * IF( TYPE( cFilter ) $ "CDLMN" ) ) * // Esta es una expresi¢n v lida * SET FILTER TO &cFilter * ENDIF * * $STATUS$ * R * $COMPLIANCE$ * * - Incompatibilidad con Clipper: * En el c¢digo siguiente: * * PRIVATE lCond := 0 * ? TYPE( "IIF( lCond, 'true', MyUDF() )" ) * * Clipper imprimir  "UE" - en Harbour la salida ser  "UI" * * - Si "UI" es retornada entonces la sintaxis de la expresi¢n es * correcta. Sin embargo argumentos inv lidos pueden ser pasados * a una function/procedure que cause errores de ejecuci¢n durante * la evaluaci¢n de la expresi¢n. * $FILES$ * La Librer¡a es rtl * $SEEALSO$ * VALTYPE() * $END$ */ /* $DOC$ * $FUNCNAME$ * VALTYPE() * $CATEGORY$ * Miscelanea * $ONELINER$ * Obtiene el tipo de dato de una expresi¢n * $SYNTAX$ * VALTYPE( ) --> * $ARGUMENTS$ * es cualquier expresi¢n v lida * $RETURNS$ * una caracter indicando el tipo de la expresi¢n pasada * $DESCRIPTION$ * Esta funci¢n devuelve un s¢lo car cter el cual representa el tipo de * dato del argumento recibido. * $EXAMPLES$ * Ver Test * * $TESTS$ * FUNCTION Test() * ? ValType( Array( 1 ) ) --> "A" * ? ValType( {|| 1 + 1 } ) --> "B" * ? ValType( "HARBOUR" ) --> "C" * ? ValType( Date() ) --> "D" * ? ValType( .T. ) --> "L" * ? ValType( 1 ) --> "N" * ? ValType( TBrowse() ) --> "O" * ? ValType( NIL ) --> "U" * RETURN NIL * * $STATUS$ * R * $COMPLIANCE$ * VALTYPE() es totalmente compatible con CA-Cl*pper. * $FILES$ * La Librer¡a es rtl * $SEEALSO$ * TYPE() * $END$ */ /* $DOC$ * $FUNCNAME$ * HB_ISBYREF() * $CATEGORY$ * Miscelanea * $ONELINER$ * Informa si la variable es pasada por referencia. * $SYNTAX$ * HB_ISBYREF( @ ) --> * $ARGUMENTS$ * @ es la variable a testear pasada por referencia. * $RETURNS$ * Un valor l¢gico indicando si la variable es pasada por * referencia a la funci¢n ¢ procedimiento actual. * $DESCRIPTION$ * Esta funci¢n devuelve un valor l¢gico indicando si la variable es * pasada por referencia a la funci¢n ¢ procedimiento actual. * * ATENCION: * La variable a testear debe ser pasada por referencia. Si no lo es * la funci¢n retorna NIL. * Esta funci¢n esta basada en la forma que Harbour maneja las variables * por referencia. Cuando una variable es pasada de este modo, la * funci¢n ¢ procedimiento que la recibe, recibe un puntero a la * variable previa, sea esta la variable contenedora de los datos, ¢ un * puntero a otra variable. La funci¢n observa si la variable pasada * apunta a una variable com£n ¢ a la variable pasada por referencia. * $EXAMPLES$ * Ver Test * $TESTS$ * FUNCTION Main() * local cVar := "Test local" * private nVar := 0 * * Test( @cVar, @nVar, cVar, nVar ) * RETURN NIL * * PROCEDURE Test( Arg1, Arg2, Arg3, Arg4 ) * ? hb_isbyref( @Arg1 ) // .T. * ? hb_isbyref( @Arg2 ) // .T. * ? hb_isbyref( @Arg3 ) // .F. * ? hb_isbyref( @Arg4 ) // .F. * RETURN * * $STATUS$ * S * $COMPLIANCE$ * Esta funci¢n es una extensi¢n de Harbour. * $FILES$ * La Librer¡a es rtl * $SEEALSO$ * VALTYPE() * $END$ */
c:\harbour\doc\es\vm.txt
/*
 * $Id: vm.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Antonio Linares
 *   Documentaci¢n en Ingl‚s de vm.txt
 *
 * Copyright 2001 Alejandro de G rate 
 *   Traducci¢n al Espa¤ol de vm.txt
 *
 * Vea doc/license.txt por los t‚rminos de la licencia.
 *
 */
 

La M quina Virtual de Harbour (Virtual Machine ¢ VM) 
====================================================

La VM es un bucle de ejecuci¢n infinita mientras se ejecute el programa.
La VM esta formada por el bucle principal de ejecuci¢n y varios 
subsistemas, cada uno de los cuales puede ser te¢ricamente reemplazado, 
suponiendo que Ud. respete la interfaz de cada subsistema.

El bucle principal de ejecuci¢n esta definido en una funcion de C 
llamada VirtualMachine(), la cual recibe 2 parametros: la intrucciones 
pcode para ejecutar y la tabla local de s¡mbolos (una porci¢n de la 
tabla de s¡mbolos OBJs (estatica) ) usada para ese pcode. 
Por favor revise hbpcode.h para la implementacion actual de los pcode 
de los opcodes. 

VM( pcode, local symbols )

La VM puede invocar a la VM de nuevo (a s¡ misma). Esto permite al 
lenguaje Clipper acceder a funciones y metodos Clipper y funciones 
externas en lenguaje C una vez y otra vez. La VM organiza estos 
m£ltiples accesos en una forma ordenada y totalmente controlada e 
implementa servicios para acceder a esos m£ltiples niveles de ejecuci¢n 
(ProcName(), ProcLine(), depuraci¢n y acceso a las variables de la pila).

Los subsistemas VM son continuamente usados por el bucle principal de
ejecuci¢n. Vamos a revisar esos subsistemas VM.


 El Arranque:
 La Pila (stack):
 La tabla est tica de s¡mbolos:
 La tabla din mica de s¡mbolos:
 Variables est ticas y p£blicas:
 La memoria:
 El sistema extendido:
 Arrays Multidimensionales:
 El motor de Objetos:
 El subsistema macro:
 El subsistema de areas de trabajo:


El Arranque: 
============
Controla la inicializaci¢n de los diferentes subsistemas de la VM,
esta es invocada al principio de la aplicaci¢n. Esta tambi‚n controla 
la salida de la aplicaci¢n.
 


La Pila (stack): 
================
La VM No usa la pila de la computadora directamente, esta usa en su 
lugar su propia pila para manipular valores (parametros, valores 
retornados y s¡mbolos) como lo hace la pila de hardware.


La tabla est tica de s¡mbolos: 
=============================
Es creada por el compilador en tiempo de compilaci¢n y agrupada por 
el enlazador (linker) en los OBJs, Este subsistema es responsable por 
un inmediato acceso a la ubicaci¢n de las funciones y est  altamente 
relacionada a la tabla din mica de s¡mbolos en tiempo de ejecuci¢n.
Esta tabla contiene muchos s¡mbolos duplicados que ser n optimizados 
por la tabla din mica de s¡mbolos.


La tabla din mica de s¡mbolos: 
==============================
Es din micamente generada desde el subsistema de inicio al principio 
de la aplicaci¢n. Esta organiza en una forma eficiente la tabla 
est tica de s¡mbolos creando un ¡ndice alfabetico que permite, una 
b£squeda dicotomica de los s¡mbolos. Este subsistema es responsable 
por el r pido acceso a los s¡mbolos (funciones, variables, campos y 
alias de las  reas de trabajo).


Variables est ticas y p£blicas: 
===============================
Responsable por el almacenamiento de variables p£blicas y est ticas.


La memoria: 
===========
Responsable por la ubicaci¢n, reubicaci¢n, bloqueo, desbloqueo y 
liberaci¢n de memoria.


El sistema extendido: 
=====================
Define la interfaz (_parc(), ..., _retc() ) desde un bajo nivel 
(lenguaje C) hasta un alto nivel (lenguaje Clipper). Este subsistema 
es responsable por conectar en una forma adecuada las funciones en 
lenguaje C a la aplicaci¢n entera.


Arrays Multidimensionales: 
==========================
Este subsistema permite la creaci¢n de arrays, y los servicios para 
manipular estos en todas sus formas. Los arrays son extensivamente 
usados por el lenguaje Clipper y tambi‚n ellos son la fundaci¢n de 
los Objetos (los Objetos son s¢lo arrays referidos a una Clase 
espec¡fica).


El motor de Objetos: 
====================
Responsable por la creaci¢n de Clases y Objetos. Este tambi‚n define 
la forma de acceso a un m‚todo espec¡fico de clase para ser invocados 
por la VM y provee todo tipo de informaci¢n de clases que pueden ser 
requeridos al tiempo de la ejecuci¢n.


El subsistema macro: 
====================
Este implementa un compilador reducido que puede ser usado en tiempo 
de ejecuci¢n para generar pcodes para ser usados por la aplicaci¢n.
En efecto esta es una parte de la especificaciones de yacc (Bison) 
para Harbour.


El subsistema de  reas de trabajo: 
==================================
Responsable por el manejo de las bases de datos. Este subsistema 
define la ubicaci¢n donde las areas de trabajos ser n almacenadas 
y provee todas las funciones de acceso a esas areas de trabajo. 
Este tambi‚n implementa la interfaz para el controlador de base de 
datos reemplazable.

Pregunta:

  Los opcodes de Harbour imitar n a los de Clipper ? (habr  una 
relaci¢n 1:1 entre ellos) Si es as¡, est n los opcodes de Clipper 
descriptos en alg£n lado ?.

Respuesta:
                  Lenguaje Clipper pcode de opcodes
    DEFINE        NOMBRE           VALOR     BYTES
    #define       NOP              0x00      1
    #define       PUSHC            0x01      3 + literal
    #define       PUSHN            0x05      3
    #define       POPF             0x06      3
    #define       POPM             0x07      3
    #define       POPQF            0x08      3
    #define       PUSHA            0x09      3
    #define       PUSHF            0x0A      3
    #define       PUSHM            0x0B      3
    #define       PUSHMR           0x0C      3
    #define       PUSHP            0x0D      3
    #define       PUSHQF           0x0E      3
    #define       PUSHV            0x0F      3
    #define       SFRAME           0x10      3
    #define       SINIT            0x11      3
    #define       SYMBOL           0x12      3
    #define       SYMF             0x13      3
    #define       BEGIN_SEQ        0x19      3
    #define       JDBG             0x1A      3
    #define       JF               0x1B      3
    #define       JFPT             0x1C      3
    #define       JISW             0x1D      3
    #define       JMP              0x1E      3
    #define       JNEI             0x1F      3
    #define       JT               0x20      3
    #define       JTPF             0x21      3
    #define       PUSHBL           0x23      3
    #define       ARRAYATI         0x24      3
    #define       ARRAYPUTI        0x25      3
    #define       CALL             0x26      3
    #define       DO               0x27      3
    #define       FRAME            0x28      3
    #define       FUNC             0x29      3
    #define       LINE             0x2A      3
    #define       MAKEA            0x2B      3
    #define       MAKELA           0x2C      3
    #define       PARAMS           0x2D      3
    #define       POPFL            0x2E      3
    #define       POPL             0x2F      3
    #define       POPS             0x30      3
    #define       PRIVATES         0x31      3
    #define       PUBLICS          0x33      3
    #define       PUSHFL           0x34      3
    #define       PUSHFLR          0x35      3
    #define       PUSHI            0x36      3
    #define       PUSHL            0x37      3
    #define       PUSHLR           0x38      3
    #define       PUSHS            0x39      3
    #define       PUSHSR           0x3A      3
    #define       PUSHW            0x3B      3
    #define       SEND             0x3C      3
    #define       XBLOCK           0x3D      3
    #define       MPOPF            0x4A      5
    #define       MPOPM            0x4B      5
    #define       MPOPQF           0x4C      5
    #define       MPUSHA           0x4D      5
    #define       MPUSHF           0x4E      5
    #define       MPUSHM           0x4F      5
    #define       MPUSHMR          0x50      5
    #define       MPUSHP           0x51      5
    #define       MPUSHQF          0x52      5
    #define       MPUSHV           0x53      5
    #define       MSYMBOL          0x54      5
    #define       MSYMF            0x55      5
    #define       ABS              0x56      1
    #define       AND              0x57      1
    #define       ARRAYAT          0x58      1
    #define       ARRAYPUT         0x59      1
    #define       BREAK            0x5A      1
    #define       DEC              0x5B      1
    #define       DIVIDE           0x5C      1
    #define       DOOP             0x5D      1
    #define       EEQ              0x5E      1
    #define       ENDBLOCK         0x5F      1
    #define       ENDPROC          0x60      1
    #define       END_SEQ          0x61      1
    #define       EQ               0x62      1
    #define       EVENTS           0x63      1
    #define       FALSE            0x64      1
    #define       GE               0x65      1
    #define       GT               0x66      1
    #define       INC              0x67      1
    #define       LE               0x68      1
    #define       LT               0x69      1
    #define       MINUS            0x6A      1
    #define       MULT             0x6B      1
    #define       NE               0x6C      1
    #define       NEGATE           0x6E      1
    #define       NOP2             0x6F      1
    #define       NOT              0x70      1
    #define       NULL             0x71      1
    #define       ONE1             0x72      1
    #define       OR               0x73      1
    #define       PCOUNT           0x74      1
    #define       PLUS             0x75      1
    #define       POP              0x76      1
    #define       PUSHRV           0x77      1
    #define       QSELF            0x78      1
    #define       SAVE_RET         0x79      1
    #define       TRUE             0x7A      1
    #define       UNDEF            0x7B      1
    #define       ZER0             0x7C      1
    #define       ZZBLOCK          0x7D      1
    #define       AXPRIN           0x7E      1
    #define       AXPROUT          0x7F      1
    #define       BOF              0x80      1
    #define       DELETED          0x81      1
    #define       EOF              0x82      1
    #define       FCOUNT           0x83      1
    #define       FIELDNAME        0x84      1
    #define       FLOCK            0x85      1
    #define       FOUND            0x86      1
    #define       FSELECT0         0x87      1
    #define       FSELECT1         0x88      1
    #define       LASTREC          0x89      1
    #define       LOCK             0x8A      1
    #define       RECNO            0x8B      1
    #define       BNAMES           0x8C      1
    #define       LNAMES           0x8D      1
    #define       SNAMES           0x8E      1
    #define       SRCNAME          0x8F      1
    #define       TYPE             0x90      1
    #define       WAVE             0x91      1
    #define       WAVEA            0x92      1
    #define       WAVEF            0x93      1
    #define       WAVEL            0x94      1
    #define       WAVEP            0x95      1
    #define       WAVEPOP          0x96      1
    #define       WAVEPOPF         0x97      1
    #define       WAVEPOPQ         0x98      1
    #define       WAVEQ            0x99      1
    #define       WSYMBOL          0x9A      1
    #define       AADD             0x9B      1
    #define       ASC              0x9C      1
    #define       AT               0x9D      1
    #define       CDOW             0x9E      1
    #define       CHR              0x9F      1
    #define       CMONTH           0xA0      1
    #define       CTOD             0xA1      1
    #define       DATE             0xA2      1
    #define       DAY              0xA3      1
    #define       DOW              0xA4      1
    #define       DTOC             0xA5      1
    #define       DTOS             0xA6      1
    #define       EMPTY            0xA7      1
    #define       QEXP             0xA8      1
    #define       EXPON            0xA9      1
    #define       INSTR            0xAA      1
    #define       INT              0xAB      1
    #define       LEFT             0xAC      1
    #define       LEN              0xAD      1
    #define       LOGQ             0xAE      1
    #define       LOWER            0xAF      1
    #define       LTRIM            0xB0      1
    #define       MAX              0xB1      1
    #define       MIN              0xB2      1
    #define       MODULUS          0xB3      1
    #define       MONTH            0xB4      1
    #define       REPLICATE        0xB5      1
    #define       ROUND            0xB6      1
    #define       SECONDS          0xB7      1
    #define       SPACE            0xB8      1
    #define       QSQRT            0xB9      1
    #define       STR1             0xBA      1
    #define       STR2             0xBB      1
    #define       STR3             0xBC      1
    #define       SUB2             0xBD      1
    #define       SUB3             0xBE      1
    #define       TIME             0xBF      1
    #define       TRIM             0xC0      1
    #define       UPPER            0xC1      1
    #define       VAL              0xC2      1
    #define       VALTYPE          0xC3      1
    #define       WORD             0xC4      1
    #define       YEAR             0xC5      1
    #define       TRANS            0xC6      1
    #define       COL              0xC7      1
    #define       DEVPOS           0xC8      1
    #define       INKEY0           0xC9      1
    #define       INKEY1           0xCA      1
    #define       PCOL             0xCB      1
    #define       PROW             0xCC      1
    #define       ROW              0xCD      1
    #define       SETPOS           0xCE      1
    #define       SETPOSBS         0xCF      1

Harbour no implementar  todos ellos porque nosotros queremos proveer 
la mayor libertad a los programadores para extender y modificar 
Harbour tanto como se necesite. Por ejemplo:
El lenguaje Clipper usa opcodes para Row(), Col(), Upper(), Space(),
Replicate(), InKey(), Year(), Month(), etc... donde nosotros s¢lo 
queremos llamar a una funci¢n estandar de lenguaje C, que use el 
sistema extendido est ndar y que pueda ser facilmente modificada.
As¡ Harbour usar  muchos menos opcodes que el lenguaje Clippper. 
Esto ayudar  a tener un compilador y una VM m s simple y f cil de 
mantener.

Pregunta:

   He visto que, por ejemplo Clipper tiene un opcode llamado 
"PUSHWORD" (06), mientras Valkyirie lo llama "PUSHW"(3B): 
Diferentes nombres, diferentes c¢digos. No es deseable que el pCode 
de Harbour sea binario-compatible con Clipper ?. Si fuera as¡ la VM 
de Harbour podr¡a interpretar c¢digo de Clipper y viceversa.

Respuesta:

Los opcodes de Harbour estan definidos en hbpcode.h 
Nosotros estamos tratando que los mnem¢nicos sean muy f ciles de 
usar, as¡ PUSHWORD parece mas f cil que PUSHW. Los valores de los 
opcodes son de poco valor porque ellos son solo usados por una 
sentencia switch del lenguaje C (en realidad hay una poderosa 
optimizaci¢n la cual es: usar el mismo pcode de los opcodes como un 
¡ndice al array de punteros de las funciones de la VM, as¡ la 
velocidad de ejecuci¢n de la VM puede incrementarse). 
Clipper usa esto.

Nosotros no estamos implementando totalmente el modelo de OBJs del 
lenguaje Clipper (por ej. para proveer identificadores de nombre 
de longitud mayor a 10 caracteres) as¡ los OBJ de Harbour no ser n 
soportados por Clipper y viceversa.
 
 
 

Page url: http://www.yourdomain.com/help/index.html?es.htm