From 77c032df1e93152f0b3110d1ab99be22259d8d00 Mon Sep 17 00:00:00 2001 From: Luiz Rafael Culik Date: Sun, 6 Feb 2000 22:53:14 +0000 Subject: [PATCH] See changelog 20000206 20:45 --- harbour/source/rdd/dbcmd.c | 336 ++++++++++------------------ harbour/source/rtl/mouse/mousedos.c | 165 ++++++-------- harbour/source/tools/html.prg | 11 +- 3 files changed, 189 insertions(+), 323 deletions(-) diff --git a/harbour/source/rdd/dbcmd.c b/harbour/source/rdd/dbcmd.c index b34df7262e..efc268c699 100644 --- a/harbour/source/rdd/dbcmd.c +++ b/harbour/source/rdd/dbcmd.c @@ -2285,107 +2285,73 @@ HARBOUR HB___DBCONTINUE() * $CATEGORY$ * DATA BASE * $ONELINER$ - * Create a database file from a database structure array + * Creates an empty database from a array. * $SYNTAX$ - * DBCREATE(, ,[]) --> NIL - * + * DBCREATE(, ,[],[],[]) --> NIL * $ARGUMENTS$ - * is the name of the new database file, with an optional - * drive and directory, specified as a character string. If specified - * without an extension (.dbf) is assumed. - * - * is an array that contains the structure of as - * a series of subarrays, one per field. Each subarray contains the - * definition of each field's attributes and has the following structure: - * - * Field Definition Subarray - * ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ - * Position Metasymbol Dbstruct.ch - * ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ - * 1 cName DBS_NAME - * 2 cType DBS_TYPE - * 3 nLength DBS_LEN - * 4 nDecimals DBS_DEC - * ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ - * - * specifies the replaceable database driver (RDD) to use to - * process the current work area. is name of the RDD specified - * as a character expression. If you specify as a literal value, - * you must enclose it in quotes. - * + * Name of database to be create + * Name of a multidimensional array that contains the a database + * structure + * Name of the RDD + * Toggle to Open the create File + * Name of database Alias * $RETURNS$ - * DBCREATE() always returns NIL. + * DBCREATE() always returns NIL. * $DESCRIPTION$ - * DBCREATE() is a database function that creates a database file from an - * array containing the structure of the file. You may create the array - * programmatically or by using DBSTRUCT(). DBCREATE() is similar to the - * CREATE FROM command which creates a new database file structure from a - * structure extended file. Use CREATE or COPY STRUCTURE EXTENDED commands - * to create a structure extended file. + * This function creates the database file specified as from the + * multidimensional array .If no file extension is use with + * the .DBF extension is assumed. + * The array specified in must follow a few guidelines when being + * built prior to a call to DBCREATE(): * - * Before using DBCREATE(), you must first create the array and - * fill it with the field definition arrays according to the structure in - * Field Definition Subarray table (above). There are some specific rules - * for creating a field definition array, including: + * - All subscripts values in the second dimension must be set to proper values * - * Specify all field attributes with a value of the proper data - * type for the attribute. The decimals attribute must be - * specified--even for non-numeric fields. If the field does not have a - * decimals attribute, specify zero. + * - The fourth subscript value in the second dimension - which contains + * the decimal value-must he specified. even 1kw nonnumeric fields. + * + * - The second subscript value in the second dimension-which contains + * the field data type-must contain a proper value: C, D, L, M or N + * It is possible to use additional letters (or clarity (e.g., 'Numeric' + * for 'N'): however, the first letter of this array element must + * be a proper value. + * + * The DBCREATE( ) function does not use the decimal field to + * calculate the length of a character held longer than 256. Values + * up to the maximum length of a character field (which is 65,519 bytes) + * are stored directly in the database in the length attribute if that + * database was created via this function. However, a file containing + * fields longer than 256 bytes is not compatible with any interpreter. * - * Specify the type attribute using the first letter of the data - * type as a minimum. Use longer and more descriptive terms for - * readability. For example, both "C" and "Character" can be specified - * as the type attribute for character fields. - * - * In CA-Clipper, character fields contain up to 64,000 - * characters. Unlike the CREATE FROM command, DBCREATE() does not use - * the decimals attribute to specify the high-order part of the field - * length. Specify the field length directly, regardless of its - * magnitude. - * - * To make references to the various elements of the field definition - * subarray more readable, the header file called Dbstruct.ch is supplied - * which contains the #defines to assign a name to the array position for - * each field attribute. It is located in \CLIPPER5\INCLUDE. - * + * The parameter specifies the name of the Replaceable Da- + * tabase Driver to use to create the database. If it is not specified, then the + * Replaceable Database Driver in the current work area is tised. + * The parameter specifies if the already created database is to be opened, + * The parameter specifies the alias name for the new opened database * $EXAMPLES$ - * This example creates an empty array and then adds field - * definition subarrays using the AADD() function before creating - * People.dbf. You might use this technique to add field definitions to - * your structure array dynamically: + * function main() * - * aDbf := {} - * AADD(aDbf, { "Name", "C", 25, 0 }) - * AADD(aDbf, { "Address", "C", 1024, 0 }) - * AADD(aDbf, { "Phone", "N", 13, 0 }) - * // - * DBCREATE("People", aDbf) + * local nI, aStruct := { { "CHARACTER", "C", 25, 0 }, ; + * { "NUMERIC", "N", 8, 0 }, ; + * { "DOUBLE", "N", 8, 2 }, ; + * { "DATE", "D", 8, 0 }, ; + * { "LOGICAL", "L", 1, 0 }, ; + * { "MEMO1", "M", 10, 0 }, ; + * { "MEMO2", "M", 10, 0 } } * - * This example performs the same types of actions but declares - * the structure array as a two-dimensional array, and then uses - * subscript addressing to specify the field definitions. It will be - * created using the DBFMDX RDD: + * REQUEST DBFCDX * - * #include "Dbstruct.ch" - * // - * LOCAL aDbf[1][4] - * aDbf[1][ DBS_NAME ] := "Name" - * aDbf[1][ DBS_TYPE ] := "Character" - * aDbf[1][ DBS_LEN ] := 25 - * aDbf[1][ DBS_DEC ] := 0 - * // - * DBCREATE("Name", aDbf, "DBFMDX") + * dbCreate( "testdbf", aStruct, "DBFCDX", .t., "MYALIAS" ) + * + * RETURN NIL * $TESTS$ - * * $STATUS$ - * R + * R * $COMPLIANCE$ - * + * This function is Not CA-Clipper compilant * $SEEALSO$ - * AFIELDS(),DBSTRUCT() + * AFIELDS(),DBSTRUCT() * $INCLUDE$ - * "Dbstruct.ch" + * "Dbstruct.ch" * $END$ */ @@ -3773,19 +3739,15 @@ HARBOUR HB_DBSETFILTER( void ) * LEN(DBSTRUCT()) is equal to the value obtained from FCOUNT(). * Each subscript position * $EXAMPLES$ - * This example opens two database files then creates an array - * containing the database structure using DBSTRUCT() within an aliased - * expression. The field names are then listed using AEVAL(): - * - * #include "Dbstruct.ch" - * // - * LOCAL aStruct - * USE Customer NEW - * USE Invoices NEW - * // - * aStruct := Customer->(DBSTRUCT()) - * AEVAL( aStruct, {|aField| QOUT(aField[DBS_NAME])} ) - * + * FUNCTION Main() + * LOCAL aStru,x + * USE Tests NEW + * aStru:=DBSTRUCT() + * FOR x:=1 TO LEN(aStru) + * ? aStru[x,1] + * NEXT + * USE + * RETURN NIL * $TESTS$ * * $STATUS$ @@ -3886,7 +3848,7 @@ HARBOUR HB_DBTABLEEXT( void ) * $CATEGORY$ * Data Base * $ONELINER$ - * Release all locks for the current work area + * Unlock a record or release a file lock * $SYNTAX$ * DBUNLOCK() --> NIL * $ARGUMENTS$ @@ -3894,44 +3856,25 @@ HARBOUR HB_DBTABLEEXT( void ) * $RETURNS$ * DBUNLOCK() always returns NIL. * $DESCRIPTION$ - * DBUNLOCK() releases any record or file locks obtained by the current - * process for the current work area. DBUNLOCK() is only meaningful on a - * shared database in a network environment. - * - * DBUNLOCK() performs the same function as the standard UNLOCK command. - * For more information, refer to the UNLOCK command. - * - * Notes - * - * Network environment: Releasing locks may cause updates to the - * database to become visible to other processes. - * + * This function releases the file or record lock in the currently selected + * or aliased work area.It will not unlock an associated lock in a related data- + * bases. * $EXAMPLES$ - * The following example illustrates a basic use of the - * DBUNLOCK() function: - * - * cLast := "Winston" - * USE Sales SHARED NEW VIA "DBFNTX" - * DBSETINDEX( "LASTNAME" ) - * // - * IF ( Sales->(DBSEEK(cLast)) ) - * IF Sales->( RLOCK() ) - * Sales->( DBDELETE() ) - * ? "Record deleted: ", Sales( DELETED() ) - * Sales->( DBUNLOCK() ) + * nId:=10 + * USE TestId INDEX TestId NEW + * IF TestId->(DBSEEK(nId)) + * IF TestId->(RLOCK()) + * DBDELETE() * ELSE - * ? "Unable to lock record..." + * DBUNLOCK() * ENDIF - * ELSE - * ? "Not found" * ENDIF - * + * USE * $TESTS$ - * * $STATUS$ * R * $COMPLIANCE$ - * + * This function is CA-Clipper compatible. * $SEEALSO$ * DBUNLOCKALL(),FLOCK(),RLOCK() * $INCLUDE$ @@ -3953,7 +3896,7 @@ HARBOUR HB_DBUNLOCK( void ) * $CATEGORY$ * Data Base * $ONELINER$ - * Release all locks for all work areas + * Unlocks all records and releases all file locks in all work areas. * $SYNTAX$ * DBUNLOCKALL() --> NIL * $ARGUMENTS$ @@ -3961,43 +3904,21 @@ HARBOUR HB_DBUNLOCK( void ) * $RETURNS$ * DBUNLOCKALL() always returns NIL. * $DESCRIPTION$ - * DBUNLOCKALL() releases any record or file locks obtained by the current - * process for any work area. DBUNLOCKALL() is only meaningful on a shared - * database in a network environment. It is equivalent to calling - * DBUNLOCK() on every occupied work area. - * - * DBUNLOCKALL() performs the same function as the UNLOCK ALL command. For - * more information, refer to the UNLOCK ALL command. - * + * This function will remove all file and record locks in all work area. * $EXAMPLES$ - * The following example marks a record for deletion if an - * RLOCK() attempt is successful, then clears all locks in all work - * areas: - * - * cLast := "Winston" - * USE Sales SHARED NEW VIA "DBFNTX" - * DBSETINDEX( "SALEFNAM" ) - * DBSETINDEX( "SALELNAM" ) - * // - * USE Colls SHARED NEW VIA "DBFNTX" - * DBSETINDEX( "COLLFNAM" ) - * DBSETINDEX( "COLLLNAM" ) - * // - * DBSELECTAREA( "Sales" ) * // select "Sales" work area - * // - * IF ( Colls->(DBSEEK(cLast)) ) - * IF Colls->( DELETED() ) - * ? "Record deleted: ", Colls->( DELETED() ) - * IF Colls->( RLOCK() ) - * Colls->( DBRECALL() ) - * ? "Record recalled..." - * ENDIF + * nId:=10 + * USE Tests INDEX TestId NEW + * USE Tests1 INDEX Tests NEW + * IF TestId->(DBSEEK(nId)) + * IF TestId->(RLOCK()) + * DBDELETE() + * ELSE + * DBUNLOCK() * ENDIF * ELSE - * ? "Not found" - * DBUNLOCKALL() // remove all locks in - * ENDIF // all work areas - * + * DBUNLOCKALL() + * ENDIF + * USE * $TESTS$ * * $STATUS$ @@ -4029,78 +3950,49 @@ HARBOUR HB_DBUNLOCKALL( void ) * $CATEGORY$ * Data Base * $ONELINER$ - * Use a database file in a work area + * Opens a work area and uses a database file. * $SYNTAX$ * DBUSEAREA( [], [], , [], * [], []) --> NIL * $ARGUMENTS$ - * is an optional logical value. A value of true (.T.) - * selects the lowest numbered unoccupied work area as the current work - * area before the use operation. If is false (.F.) or omitted, - * the current work area is used; if the work area is occupied, it is - * closed first. - * - * is an optional character value. If present, it specifies - * the name of the database driver which will service the work area. If - * is omitted, the current default driver is used (see note - * below). - * - * specifies the name of the database (.dbf) file to be opened. - * - * is an optional character value. If present, it specifies - * the alias to be associated with the work area. The alias must - * constitute a valid HARBOUR identifier. A valid may be any - * legal identifier (i.e., it must begin with an alphabetic character and - * may contain numeric or alphabetic characters and the underscore). - * Within a single application, HARBOUR will not accept duplicate - * aliases. If is omitted, a default alias is constructed from - * . - * - * is an optional logical value. If present, it specifies - * whether the database (.dbf) file should be accessible to other processes - * on a network. A value of true (.T.) specifies that other processes - * should be allowed access; a value of false (.F.) specifies that the - * current process is to have exclusive access. If is omitted, - * the current global _SET_EXCLUSIVE setting determines whether shared - * access is allowed. - * - * is an optional logical value that specifies whether - * updates to the work area are prohibited. A value of true (.T.) - * prohibits updates; a value of false (.F.) permits updates. A value of - * true (.T.) also permits read-only access to the specified database - * (.dbf) file. If is omitted, the default value is false - * (.F.). + * A optional logical expression for the new work area + * Database driver name + * File Name + * Alias name + * Shared/exclusive status flag + * Read-write status flag. * $RETURNS$ * DBUSEAREA() always returns NIL. * $DESCRIPTION$ - * DBUSEAREA() associates the specified database (.dbf) file with the - * current work area. - * - * DBUSEAREA() performs the same function as the standard USE command. For - * more information, refer to the USE command. - * - * Notes - * - * Current driver: If no driver is specified in the call to - * DBUSEAREA() the default driver is used. If more than one driver is - * available to the application, the default driver is the driver - * specified in the most recent call to DBSETDRIVER(). If DBSETDRIVER() - * has not been called, the name of the default driver is undetermined. - * + * This function opens an existing database named in the current + * work area. If is set to a logical true (.T.) value, then + * the database will be opened in the next available and unused + * work area. The default value of is a logical false (.F.). + * If used, is the name of the database driver associated with + * the file that is opened. The default for this will be the value + * of DBSETDRlVER(). + * IF used, contains the alias name for that work area, If not + * specified, the root name of the database specified in will be + * used. + * If is set to a logical true (.T.) value, the database that + * is specified in will be opened by the user EXCLUSIVELY. Thus + * locking it from all other nodes or users on the network. If is + * set to a logical false (.F.) value, then the database will be in SHARED + * mode. If is not passed, then the function will turn to the + * internal setting of SET EXCLUSIVE to determine a setting. + * If is specified, the file will be set to READ ONLY mode. + * If it is not specified, the file will he opened in normal read-write + * mode. * $EXAMPLES$ - * This example is a typical use of the DBUSEAREA() function: - * - * DBUSEAREA(.T., "DBFNDX", "Employees") - * + * DBUSEAREA(.T.,,"Tests") * $TESTS$ * * $STATUS$ * R * $COMPLIANCE$ - * + * This function is CA-Clipper compilante * $SEEALSO$ - * DBCLOSEAREA(),DBSETDRIVER(),SELECT(),SET() - * + * DBCLOSEAREA(),DBSETDRIVER(),SELECT(),SET() * $INCLUDE$ * * $END$ diff --git a/harbour/source/rtl/mouse/mousedos.c b/harbour/source/rtl/mouse/mousedos.c index 904c51450c..eb10e70ba6 100644 --- a/harbour/source/rtl/mouse/mousedos.c +++ b/harbour/source/rtl/mouse/mousedos.c @@ -35,11 +35,9 @@ */ /* TOFIX: Change this to something better */ -/* #define BORLANDC */ - -#ifdef BORLANDC - #pragma inline - +/*#define BORLANDC */ +#define MOUSE_INTERRUPT 0x33 +#if defined(__DJGPP__) || defined(__BORLANDC__) #include #endif @@ -58,21 +56,20 @@ void hb_mouse_Init( void ) { /* TODO: */ -#ifdef BORLANDC - asm - { - xor ax, ax - int MOUSE_INTERRUPT - mov s_bPresent, ax - mov s_iButtons, bx - } - +#if defined(__DJGPP__) || defined(__BORLANDC__) + union REGS Mousereg; + Mousereg.x.ax=0; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); + s_bPresent=Mousereg.x.ax; + s_iButtons= Mousereg.x.bx; if( s_bPresent ) { s_iInitCol = hb_mouse_Col(); s_iInitRow = hb_mouse_Row(); } + #endif + } void hb_mouse_Exit( void ) @@ -92,14 +89,11 @@ void hb_mouse_Show( void ) if( s_bPresent ) { -#ifdef BORLANDC - asm - { - mov ax, 1 - int MOUSE_INTERRUPT - } - - s_iCursorVisible = TRUE; +#if defined(__DJGPP__) ||defined(__BORLANDC__) + union REGS Mousereg; + Mousereg.x.ax=1; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); + s_iCursorVisible = TRUE; #endif } @@ -111,14 +105,11 @@ void hb_mouse_Hide( void ) if( s_bPresent ) { -#ifdef BORLANDC - asm - { - mov ax, 2 - int MOUSE_INTERRUPT - } - - s_iCursorVisible = FALSE; +#if defined(__DJGPP__)||defined(__BORLANDC__) + union REGS Mousereg; + Mousereg.x.ax=2; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); + s_iCursorVisible = FALSE; #endif } } @@ -129,17 +120,14 @@ int hb_mouse_Col( void ) if( s_bPresent ) { -#ifdef BORLANDC + int iCol; - - asm - { - mov ax, 3 - int MOUSE_INTERRUPT - mov iCol, cx - } - - return iCol / 8; +#if defined(__DJGPP__)||defined(__BORLANDC__) + union REGS Mousereg; + Mousereg.x.ax=3; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); + iCol=Mousereg.x.cx; + return iCol / 8; #else return 0; #endif @@ -150,21 +138,14 @@ int hb_mouse_Col( void ) int hb_mouse_Row( void ) { - /* TODO: */ - if( s_bPresent ) { -#ifdef BORLANDC int iRow; - - asm - { - - mov ax, 3 - int MOUSE_INTERRUPT - mov iRow, dx - } - return iRow / 8; +#if defined(__DJGPP__)||defined(__BORLANDC__) + union REGS Mousereg; + Mousereg.x.ax=3; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); + iRow=Mousereg.x.dx; #else return 0; #endif @@ -179,18 +160,12 @@ void hb_mouse_SetPos( int iRow, int iCol ) if( s_bPresent ) { -#ifdef BORLANDC - iRow *= 8; - iCol *= 8; + union REGS Mousereg; + Mousereg.x.ax=4; + Mousereg.x.cx=iRow*8; + Mousereg.x.dx=iCol*8; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); - asm - { - mov ax, 4 - mov cx, iRow - mov dx, iCol - int MOUSE_INTERRUPT - } -#endif } } @@ -200,20 +175,16 @@ BOOL hb_mouse_IsButtonPressed( int iButton ) if( s_bPresent ) { -#ifdef BORLANDC + int iReturn = 0; +#if defined(__DJGPP__) ||defined(__BORLANDC__) - asm - { - mov ax, 5 - int MOUSE_INTERRUPT - mov iReturn, bx - } - - /* Convert the button number (1 -> x) to a bitmask and check */ - /* TODO: Test if this works */ - - return ( ( 2 ** ( iButton - 1 ) ) && iReturn ); + union REGS Mousereg; + Mousereg.x.ax=5; + Mousereg.x.bx=iButton; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); + iReturn=Mousereg.x.bx; + return ( iReturn); #else return FALSE; #endif @@ -230,13 +201,12 @@ int hb_mouse_CountButton( void ) if( s_bPresent ) { -#ifdef BORLANDC - asm - { - mov ax,3 - int MOUSE_INTERRUPT - mov iButton,bx - } +#if defined(__DJGPP__) || defined(__BORLANDC__) + + union REGS Mousereg; + Mousereg.x.ax=3; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); + iButton=Mousereg.x.bx; #endif } @@ -249,28 +219,25 @@ void hb_mouse_SetBounds( int iTop, int iLeft, int iBottom, int iRight ) if( s_bPresent ) { -#ifdef BORLANDC +#if defined(__DJGPP__) ||defined(__BORLANDC__) + union REGS Mousereg; + iLeft *= 8; iRight *= 8; + Mousereg.x.ax=7; + Mousereg.x.cx=iLeft; + Mousereg.x.dx=iRight; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); - asm - { - mov ax, 7 - mov cx, iLeft - mov dx, iRight - int MOUSE_INTERRUPT - } + iTop *= 8; + iBottom *= 8; + + Mousereg.x.ax=8; + Mousereg.x.cx=iTop; + Mousereg.x.dx=iBottom; + int86(MOUSE_INTERRUPT,&Mousereg,&Mousereg); - iTop *= 8; - iBottom *= 8; - asm - { - mov ax, 8 - mov cx, iTop - mov dx, iBottom - int MOUSE_INTERRUPT - } #endif } } diff --git a/harbour/source/tools/html.prg b/harbour/source/tools/html.prg index efcca9266b..0d87e19ce7 100644 --- a/harbour/source/tools/html.prg +++ b/harbour/source/tools/html.prg @@ -52,6 +52,7 @@ CLASS THTML METHOD WritePar( cPar ) METHOD WriteParBold( cPar ) METHOD WriteLink( cLink ) + METHOD WriteText(cText) METHOD CLOSE() ENDCLASS @@ -79,6 +80,11 @@ METHOD WritePar( cPar ) CLASS THTML cPar:=STRTRAN(cPar,">",">") FWRITE( Self:nHandle, "

" + Alltrim(cPar) + '

' + CRLF ) +RETURN Self +METHOD WriteText( cPar ) CLASS THTML + + FWRITE( Self:nHandle, "

" + Alltrim(cPar) + '

' + CRLF ) + RETURN Self METHOD WriteParBold( cPar ) CLASS THTML @@ -110,7 +116,7 @@ METHOD WriteLink( cLink ,cName ) CLASS THTML cLink:=cName ENDIF - FWRITE( Self:nHandle, "

" + cLink + "

" + CRLF ) + FWRITE( Self:nHandle, "

" + cLink + "

" + CRLF ) RETURN Self @@ -137,7 +143,8 @@ RETURN Self * WriteTitle() Write the file title * WritePar() Writes a paragrafer * WriteParBold() Same as WritePar(), but the text is bold style. - * WriteLink() Write a link to another topic + * WriteLink(,) Write a link to another topic + * WriteText() Write any text * $EXAMPLES$ * FUNCTION MAIN() *