See Changelog 20000217 09:00
This commit is contained in:
@@ -1,3 +1,27 @@
|
||||
20000217-09:00 GMT-3 Luiz Rafael Culik <culik@sl.conex.net>
|
||||
*doc/vm.txt
|
||||
doc/harbext.txt
|
||||
doc/tracing.txt
|
||||
doc/statics.txt
|
||||
doc/readme.txt
|
||||
doc/pragma.txt
|
||||
doc/pcode.txt
|
||||
doc/gmake.txt
|
||||
doc/cvshowto.txt
|
||||
doc/compiler.txt
|
||||
*Small formating by Brian Hays
|
||||
*source/rtl/typefile.prg
|
||||
*Fixed a worning reported by Victor
|
||||
*utils/hbdoc/hbdoc.prg
|
||||
*utils/hbdoc/genos2.prg
|
||||
*utils/hbdoc/gentrf.prg
|
||||
*utils/hbdoc/genng.prg
|
||||
*utils/hbdoc/genhtm.prg
|
||||
*utils/hbdoc/genrtf.prg
|
||||
*utils/hbdoc/genhpc.prg
|
||||
*utils/hbdoc/genasc.prg
|
||||
*Small fixes
|
||||
|
||||
20000217-10:08 GMT+3 Alexander Kresin
|
||||
* source/pp/hbpplib.c
|
||||
* added hb_comp_files declaration to fix error while hbrun compiling
|
||||
|
||||
@@ -27,12 +27,12 @@
|
||||
* The Harbour command line options:
|
||||
* =================================
|
||||
*
|
||||
* /a automatic memvar declaration"
|
||||
* /a automatic memvar declaration
|
||||
* -----------------
|
||||
* This causes that all variables declared by PRIVATE or PUBLIC
|
||||
* statements are automatically declared as MEMVAR variables.
|
||||
* This causes all variables declared by PARAMETER, PRIVATE or PUBLIC
|
||||
* statements to be automatically declared as MEMVAR variables.
|
||||
*
|
||||
* /b debug info"
|
||||
* /b debug info
|
||||
* -----------------
|
||||
* The compiler generates all information required for debugging
|
||||
*
|
||||
@@ -47,7 +47,7 @@
|
||||
* is equal to 0 if there are no errors in compiled
|
||||
* source file.
|
||||
* /es1 - all warnings are ignored and exit code returned by
|
||||
* the compiler is set to non-zero value.
|
||||
* the compiler is set to a non-zero value.
|
||||
* /es2 - all warnings are treated as errors and no output
|
||||
* file is created. The exit code is set to non-zero
|
||||
* value.
|
||||
@@ -71,33 +71,33 @@
|
||||
* the output file. The PROCLINE() function will return 0 for
|
||||
* modules compiled using this option.
|
||||
*
|
||||
* /m compile module only
|
||||
* /m compile current module only
|
||||
* -----------------
|
||||
*
|
||||
* /n no implicit starting procedure
|
||||
* -----------------
|
||||
* The compiler does not create a procedure with the same name as
|
||||
* the compiled file. This causes that any declarations placed
|
||||
* before the first PROCEDURE or FUNCTION statement have the file
|
||||
* the compiled file. This means that any declarations placed
|
||||
* before the first PROCEDURE or FUNCTION statement have file-
|
||||
* wide scope and can be accessed/used in all functions/procedures
|
||||
* defined in the compiled source file. All executable statements
|
||||
* placed on the beginning of the file and before the first
|
||||
* placed at the beginning of the file and before the first
|
||||
* PROCEDURE/FUNCTION statement are ignored.
|
||||
*
|
||||
* /o<path> object file drive and/or path
|
||||
* /o<path> output file drive and/or path
|
||||
* -----------------
|
||||
*
|
||||
* /p generate pre-processed output (.ppo) file
|
||||
* -----------------
|
||||
* The compiler creates the file that contain the result of
|
||||
* pre-processing of the source file.
|
||||
* The compiler only creates the file that contains the result of
|
||||
* pre-processing the source file.
|
||||
*
|
||||
* /q quiet
|
||||
* -----------------
|
||||
* The compiler does not print any messages during compiling
|
||||
* (except the copyright info).
|
||||
*
|
||||
* /q0 be really quiet and don't display even copyright info
|
||||
* /q0 be really quiet and don't display even the copyright info
|
||||
*
|
||||
* /r[<lib>] request linker to search <lib> (or none)
|
||||
* -----------------
|
||||
@@ -109,10 +109,10 @@
|
||||
*
|
||||
* /t<path> path for temp file creation
|
||||
* -----------------
|
||||
* Currently not used in Harbour (the Harbour compile does not
|
||||
* create any temporary files at this moment).
|
||||
* Currently not used in Harbour (the Harbour compiler does not
|
||||
* create any temporary files).
|
||||
*
|
||||
* /u[<file>] use command def set in <file> (or none)
|
||||
* /u[<file>] use command definition set in <file> (or none)
|
||||
* -----------------
|
||||
* Not supported yet.
|
||||
*
|
||||
@@ -127,7 +127,7 @@
|
||||
*
|
||||
* /w0 - no warnings
|
||||
* /w or /w1 - Clipper compatible warnings
|
||||
* /w2 - some usefull warnings missed in Clipper
|
||||
* /w2 - some useful warnings missed in Clipper
|
||||
* /w3 - warnings generated for Harbour language extensions
|
||||
*
|
||||
* /x[<prefix>] set symbol init function name prefix (for .c only)
|
||||
@@ -142,9 +142,9 @@
|
||||
* -----------------
|
||||
* The Harbour compiler uses the FLEX and YACC utilities to parse
|
||||
* the source code and to generate the required output file. This
|
||||
* option allows to trace the activity of these utilities.
|
||||
* option traces the activity of these utilities.
|
||||
*
|
||||
* /z suppress shortcutting (.and. & .or.)
|
||||
* /z suppress logical shortcutting (.and. & .or.)
|
||||
* -----------------
|
||||
*
|
||||
* /10 restrict symbol length to 10 characters
|
||||
@@ -165,25 +165,25 @@
|
||||
* =============================================================
|
||||
*
|
||||
* NOTE:
|
||||
* If you want 100% compatible compiler and runtime libraries then
|
||||
* you have to define HARBOUR_STRICT_CLIPPER_COMPATIBILITY option. This
|
||||
* option should be defined in include/hbsetup.h file (in fact this
|
||||
* option is placed into comment by default - you need remove /* */
|
||||
* characters only). This change have to be done before invoking
|
||||
* If you want a 100% compatible compile and runtime libraries then
|
||||
* you have to define HARBOUR_STRICT_CLIPPER_COMPATIBILITY. This
|
||||
* option should be defined in the file include/hbsetup.h (in fact this
|
||||
* option is placed in a comment by default - you need to remove the
|
||||
* /* */ characters only). This change has to be done before invoking
|
||||
* the make utility.
|
||||
*
|
||||
*
|
||||
* Handling of undeclared variables
|
||||
* --------------------------------
|
||||
* When a value is assigned to an undeclared variable and '-v'
|
||||
* command line option is not used then the Clipper compiler assumes
|
||||
* When a value is assigned to an undeclared variable and the '-v'
|
||||
* command line option is not used, then the Clipper compiler assumes
|
||||
* that the variable is a PRIVATE or a PUBLIC variable and generates
|
||||
* POPM (pop memvar) opcode.
|
||||
*
|
||||
* When a value of undeclared variable is accessed and '-v' command
|
||||
* line option is not used the Clipper compiler generates PUSHV (push
|
||||
* variable) opcode that determines the type of variable at runtime.
|
||||
* If the field with requested name exists in a current workarea then
|
||||
* When the value of an undeclared variable is accessed and the '-v'
|
||||
* command line option is not used, the Clipper compiler generates PUSHV
|
||||
* (push variable) opcode that determines the type of variable at runtime.
|
||||
* If a field with the requested name exists in the current workarea then
|
||||
* its value is used. If there is no field then a PRIVATE or a PUBLIC
|
||||
* variable is used (if exists).
|
||||
*
|
||||
@@ -221,19 +221,19 @@
|
||||
* -----------------------------------------------
|
||||
* The Clipper compiler uses the special opcode PUSHP to pass a
|
||||
* reference to an undeclared variable ( '@' operator ). The type of
|
||||
* passed variable is checked at runtime (field or memvar). However the
|
||||
* field variables cannot be passed by the reference. It causes that
|
||||
* passed variable is checked at runtime (field or memvar). However,
|
||||
* field variables cannot be passed by reference. This means that
|
||||
* Clipper checks the memvar variable only and doesn't look for a field.
|
||||
* This is the reason why the Harbour compiler uses the usual
|
||||
* PUSHMEMVARREF opcode in such cases. Notice that the runtime behavior
|
||||
* is the same in Clipper and in Harbour - the generated opcodes are
|
||||
* different only.
|
||||
* is the same in Clipper and in Harbour - only the generated opcodes
|
||||
* are different.
|
||||
*
|
||||
*
|
||||
* Handling of object messages
|
||||
* ---------------------------
|
||||
* The HARBOUR_STRICT_CLIPPER_COMPATIBILITY setting determines
|
||||
* the way the chained send messages are handled.
|
||||
* the way chained send messages are handled.
|
||||
*
|
||||
* For example, the following code:
|
||||
*
|
||||
@@ -249,9 +249,9 @@
|
||||
*
|
||||
* in non-strict mode.
|
||||
*
|
||||
* In practice in Clipper it will call COUNT() function two times:
|
||||
* the first time before addition and the second one after addition,
|
||||
* in Harbour COUNT() function will be called only once, before addition.
|
||||
* In practice, Clipper will call the COUNT() function two times:
|
||||
* the first time before addition and the second one after addition.
|
||||
* In Harbour, COUNT() will be called only once, before addition.
|
||||
*
|
||||
* The Harbour (non-strict) method is:
|
||||
* 1) faster
|
||||
@@ -263,9 +263,9 @@
|
||||
* Initialization of static variables
|
||||
* ----------------------------------
|
||||
*
|
||||
* There is a difference in handling of initialization of static
|
||||
* There is a difference in the initialization of static
|
||||
* variables that are initialized with a codeblock that refers to
|
||||
* a local variarble. For example:
|
||||
* a local variable. For example:
|
||||
*
|
||||
* PROCEDURE TEST()
|
||||
* LOCAL MyLocalVar
|
||||
@@ -276,22 +276,22 @@
|
||||
*
|
||||
* RETURN
|
||||
*
|
||||
* The above code compiles fine in Clipper however it generates a
|
||||
* The above code compiles fine in Clipper, but it generates a
|
||||
* runtime error Error/BASE 1132 Bound error: array access
|
||||
* Called form (b)STATICS$(0)
|
||||
*
|
||||
* In Harbour this code generates a compile time error:
|
||||
* Error E0009 Illegal variable (b) initializer: 'MyLocalVar'
|
||||
*
|
||||
* Both Clipper and Harbour are handing all local variables used in a
|
||||
* Both Clipper and Harbour are handling all local variables used in a
|
||||
* codeblock in a special way: they are detached from the local stack
|
||||
* of function/procedure where they are declared. This allows to access
|
||||
* these variables after the exit from a function/procedure. However
|
||||
* of function/procedure where they are declared. This allows access to
|
||||
* these variables after the exit from a function/procedure. However,
|
||||
* all static variables are initialized in a separate procedure
|
||||
* ('STATICS$' in Clipper and '(_INITSTATICS)' in Harbour) before the
|
||||
* main procedure and before all INIT procedures. The local variables
|
||||
* don't exist on the eval stack when static variables are initialized
|
||||
* then they cannot be detached.
|
||||
* don't exist on the eval stack when static variables are initialized,
|
||||
* so they cannot be detached.
|
||||
*
|
||||
* $END$
|
||||
*/
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
Here's how to upload you changes to the CVS server
|
||||
Here's how to upload your changes to the CVS server
|
||||
==================================================
|
||||
|
||||
1.) Do the changes in the source, and in parallel modify ChangeLog
|
||||
@@ -15,10 +15,10 @@ Here's how to upload you changes to the CVS server
|
||||
8.) New email message, paste the new ChangeLog entry
|
||||
9.) Copy and paste the date&time to the subject after "CHANGELOG: "
|
||||
10.) The CVS pops up a window with the changed filenames
|
||||
11.) Check if all the changed filenames are referred in the ChangeLog entry,
|
||||
11.) Check if all the changed filenames are referred in the ChangeLog entry,
|
||||
if not, make the corrections and start again
|
||||
12.) Paste the date&time to the CVS window, save, exit
|
||||
13.) CVS is now uploading,
|
||||
13.) CVS is now uploading,
|
||||
if there are any errors, make the corrections and start again
|
||||
14.) Send the email message containing the changes
|
||||
15.) Go offline
|
||||
|
||||
@@ -18,9 +18,9 @@ usually more powerful than any native make.
|
||||
|
||||
Each directory in the project contains one makefile, called Makefile,
|
||||
which lists the data (file names, directory names, etc.) that is used
|
||||
to determine how to bring ever target up to date within that
|
||||
to determine how to bring every target up to date within that
|
||||
directory. There are no rules in the Makefiles, to keep them
|
||||
platform-independent. The rules itself are included from the
|
||||
platform-independent. The rules themselves are included from the
|
||||
"appropriate" configuration file.
|
||||
|
||||
For example, this could be the Makefile for the VM library:
|
||||
@@ -125,7 +125,7 @@ compiled with gcc). This has two advantages:
|
||||
USAGE
|
||||
=====
|
||||
|
||||
To use the system, you need to install GNU-make 3.75 or later in your
|
||||
To use the system, you need to install GNU-make 3.75 or later on your
|
||||
system. To check this, type "make -v"; you should see
|
||||
|
||||
GNU Make version 3.75, by Richard Stallman and Roland McGrath.
|
||||
@@ -248,4 +248,4 @@ program in tests/working by using the build batch file. For example,
|
||||
can also be used for modules that aren't in the Makefile. You can also
|
||||
pass parameters to the program. For example, 'build readfile harbour.ini'
|
||||
will rebuild the readfile.prg program and run it with 'harbour.ini' as a
|
||||
command line parameter.
|
||||
command line parameter.
|
||||
|
||||
@@ -5,13 +5,34 @@
|
||||
Language extensions:
|
||||
--------------------
|
||||
|
||||
* Classes generation and management (Clipper never provided this)
|
||||
* @<FunctionName>() --> returns the pointer (address) to a function
|
||||
* Class TGetList --> object oriented support for GetLists management
|
||||
* ProcName() support for methods names.
|
||||
* Memory() new returned values.
|
||||
* Class generation and management.
|
||||
|
||||
Clipper only allowed creation of objects from a few standard
|
||||
classes.
|
||||
In Harbour, you can create your own classes--complete with
|
||||
Methods, Instance Variables, Class Variables and Inheritance.
|
||||
Entire applications can be designed and coded in Object Oriented
|
||||
style.
|
||||
|
||||
* @<FunctionName>()
|
||||
Returns the pointer (address) to a function.
|
||||
|
||||
* Class TGetList
|
||||
Object oriented support for GetLists management.
|
||||
|
||||
* ProcName() support for class Method names.
|
||||
Class Methods can be retrieved from the call stack.
|
||||
|
||||
* Memory() has new return values.
|
||||
See hbmemory.ch
|
||||
|
||||
* Transform() --> new function in format string
|
||||
@0 Make a zero padded string out of the number.
|
||||
|
||||
* Optional Compile Time STRONG TYPE declaration (and compile time TYPE
|
||||
MISMATCH warnings) Ex.: LOCAL/STATIC Var AS ...
|
||||
MISMATCH warnings)
|
||||
Example: LOCAL/STATIC Var AS ...
|
||||
|
||||
* The Harbour debugger provides new interesting classes:
|
||||
- Class TDbWindow could be the foundation for a generic multiplatform
|
||||
- Class TForm
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
The Clipper OBJ and pcode model (GNU|Open|Clipper project)
|
||||
==========================================================
|
||||
|
||||
Lets consider the following Clipper sample Test.prg:
|
||||
Let's consider the following Clipper sample Test.prg:
|
||||
|
||||
|
||||
function Main()
|
||||
@@ -15,7 +15,7 @@ function Main()
|
||||
return nil
|
||||
|
||||
|
||||
Once it gets compiled into a OBJ, what is there inside it ?
|
||||
Once it gets compiled into a OBJ, what is there inside it?
|
||||
In fact, what we get is the equivalent to the following C language
|
||||
application:
|
||||
|
||||
@@ -29,23 +29,23 @@ void MAIN( void )
|
||||
VirtualMachine( pcode, symbols );
|
||||
}
|
||||
|
||||
|
||||
|
||||
Basically, Test.prg source code has been converted into a sequence
|
||||
of pcode bytes contained into the array pcode[] = { ... } and all our MAIN()
|
||||
function does is invoke, at run-time, a Clipper VirtualMachine() that will
|
||||
of pcode bytes contained in the array pcode[] = { ... }. All our MAIN()
|
||||
function does is invoke, at run-time, a Clipper VirtualMachine() that will
|
||||
process those pcode bytes.
|
||||
|
||||
Lets review the Test.prg pcode structure in more detail:
|
||||
Let's review the Test.prg pcode structure in more detail:
|
||||
|
||||
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
|
||||
001B (2A) LINE 5 2A 05 00
|
||||
001E (7B) UNDEF 7B
|
||||
001F (79) SAVE_RET 79
|
||||
0020 (1E) JMP 0023 1E 00 00
|
||||
0020 (1E) JMP 0023 1E 00 00
|
||||
0023 (60) ENDPROC 60
|
||||
|
||||
|
||||
@@ -61,10 +61,10 @@ pcode.h
|
||||
...
|
||||
|
||||
|
||||
So finally it may looks like:
|
||||
So finally it will look like:
|
||||
|
||||
BYTE pcode[] = { LINE, 0, 0,
|
||||
LINE, 3, 0,
|
||||
BYTE pcode[] = { LINE, 0, 0,
|
||||
LINE, 3, 0,
|
||||
SYMF, 2, 0,
|
||||
PUSHC, 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '0',
|
||||
DO, 1, 0,
|
||||
@@ -75,17 +75,17 @@ BYTE pcode[] = { LINE, 0, 0,
|
||||
ENDPROC };
|
||||
|
||||
|
||||
And what is it SYMBOL symbols[] ? Clipper creates a symbol table into
|
||||
the OBJ that later on will be used to create a dynamic symbol table
|
||||
shared by the entire application. Each of those symbols have the following
|
||||
And what is SYMBOL symbols[] ? Clipper creates a symbol table in
|
||||
the OBJ that later on will be used to create a dynamic symbol table
|
||||
shared by the entire application. Each of those symbols has the following
|
||||
structure:
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char * szName; // Clipper infact keeps an array here (11 bytes).
|
||||
char * szName; // Clipper in fact keeps an array here (11 bytes).
|
||||
BYTE bScope;
|
||||
LPVOID pVoid;
|
||||
} SYMBOL;
|
||||
} SYMBOL;
|
||||
|
||||
#define PUBLIC 0 // the scope of the function!
|
||||
|
||||
@@ -93,34 +93,34 @@ SYMBOL symbols[] = { { "MAIN", PUBLIC, MAIN },
|
||||
{ "QQOUT", PUBLIC, QQOUT } };
|
||||
|
||||
|
||||
Lets remember that the name of a function (MAIN, QQOUT) it is the address of the
|
||||
function, so our symbol table will be ready to use it to jump and execute any
|
||||
Let's remember that the name of a function (MAIN, QQOUT) is the address of the
|
||||
function, so our symbol table will be ready to use it to jump and execute any
|
||||
linked function.
|
||||
|
||||
In fact, the pcode SYMF 2, 0 in our sample, will instruct the VirtualMachine()
|
||||
to use the 2 symbol which it is QQOUT.
|
||||
to use the 2 symbol, which is QQOUT.
|
||||
|
||||
Lets read the pcode:
|
||||
Let's read the pcode:
|
||||
|
||||
LINE 0, 0 => We are located at line 0
|
||||
LINE 3, 0 => We are located at line 3
|
||||
SYMF 2, 0 => We are going to call QQOUT from our symbol table
|
||||
PUSHC ... => This string is going to be used as a parameter
|
||||
DO 1, 0 => ok, jump to QQOUT and remember we have just suplied 1 parameter
|
||||
DO 1, 0 => ok, jump to QQOUT and remember we have just supplied 1 parameter
|
||||
LINE 5, 0 => We are back from QQOUT and we are located at line 5
|
||||
UNDEF => we are going to return this value (NIL)
|
||||
SAVE_RET => Ok, return it
|
||||
JMP 0 => We don't jump to elsewhere, just continue to next pcode byte
|
||||
ENDPROC => This is the end. We have completed this function execution
|
||||
|
||||
All these instructions will be evaluated from our VirtualMachine() function
|
||||
(Clipper names it _plankton()). All functions end using ENDPROC, so when
|
||||
the VirtualMachine() finds ENDPROC it knows it has reached the end of a
|
||||
All these instructions will be evaluated from our VirtualMachine() function
|
||||
(Clipper names it _plankton()). All functions end using ENDPROC, so when
|
||||
the VirtualMachine() finds ENDPROC it knows it has reached the end of a
|
||||
function pcode.
|
||||
|
||||
Now that we clearly understand this basic model we are ready to start
|
||||
implementing 'production rules' on our yacc (clipper.y) syntax to generate
|
||||
the specific output file (test.c) with the above structure (or we could
|
||||
the specific output file (test.c) with the above structure (or we could
|
||||
easily just generate the OBJ file for it).
|
||||
|
||||
to be continued...
|
||||
|
||||
@@ -5,13 +5,14 @@
|
||||
INTRODUCTION
|
||||
============
|
||||
This file explains what is and how to use the #pragma directive
|
||||
with Harbour.
|
||||
with Harbour. Primarily, it gives you control over the compiler's
|
||||
command-line switches within your source code.
|
||||
|
||||
|
||||
WHAT IS
|
||||
=======
|
||||
The #pragma is a directive used inside the source code in many compilers
|
||||
to change the behaviour of the compiler at compile time.
|
||||
to change the behavior of the compiler at compile time.
|
||||
|
||||
|
||||
USAGE
|
||||
@@ -53,13 +54,13 @@ This is the list of the supported commands and switches:
|
||||
* WARNINGLEVEL =<nLevel> /W<nLevel>
|
||||
* SHORTCUTTING =<On/Off> /Z<+/->
|
||||
|
||||
The switches have the same behaviour as the corresponding compiler ones
|
||||
and the commands are sinonyms for the switches.
|
||||
|
||||
The switches have the same behavior as the corresponding compiler ones
|
||||
and the commands are synonyms for the switches.
|
||||
|
||||
* TRACEPRAGMAS
|
||||
This command shows pragma activity at compile time when enabled.
|
||||
|
||||
NOTE: You can use the abbreviated commands mode by typing only the
|
||||
NOTE: You can use the abbreviated command mode by typing only the
|
||||
first eight chars.
|
||||
|
||||
|
||||
@@ -79,8 +80,8 @@ function Test()
|
||||
return nil
|
||||
|
||||
This is the same as calling Harbour with the -n switch in the command line,
|
||||
but with the great benefit that if you forgot to pass the switch if will be
|
||||
used anyway because it is included inside the source.
|
||||
but with the great benefit that if you forgot to pass the switch, it will
|
||||
be used anyway because it is included inside the source.
|
||||
|
||||
===========
|
||||
Dec 1, 1999
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
*/
|
||||
|
||||
|
||||
The Harbour project
|
||||
|
||||
The Harbour Project
|
||||
|
||||
************************************************************************
|
||||
* This file contains information on obtaining, installing, and using *
|
||||
@@ -44,10 +45,6 @@ in order to create a functioning program.
|
||||
Please test running Harbour against your Clipper source code and report
|
||||
any problems that might occur.
|
||||
|
||||
Very important: The preprocessor functionality is not built in yet. So
|
||||
you may test only Clipper language without preprocessor commands, etc.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
@@ -57,7 +54,7 @@ Installation
|
||||
directories.
|
||||
|
||||
2. Compile Harbour using your C compiler. Make files for different
|
||||
platforms are included in the <WHERE ARE THEY?> directory.
|
||||
platforms are included in the HARBOUR\HARBOUR directory.
|
||||
|
||||
|
||||
--- COPYRIGHT ---
|
||||
@@ -67,7 +64,7 @@ What copyright information do we have
|
||||
--- LICENCE ---
|
||||
|
||||
Information about the License for usage of Harbour is available in the
|
||||
file LICENCE.TXT (when we have a license)
|
||||
file LICENCE.TXT.
|
||||
|
||||
--- DISCLAIMER ---
|
||||
|
||||
|
||||
@@ -3,20 +3,20 @@
|
||||
*/
|
||||
|
||||
I just started implementing Classes and objects creation when I realized
|
||||
Harbour is not managing statics variables yet (Harbour recognizes them but
|
||||
Harbour is not managing static variables yet (Harbour recognizes them but
|
||||
does not generate the proper pcode for them).
|
||||
|
||||
So I would like to make an introduction to statics variables management as
|
||||
So I would like to make an introduction to static variables management as
|
||||
it is a sophisticated system that Harbour is going to implement.
|
||||
|
||||
It is something publically known that Clipper statics variables are
|
||||
located at the bottom of the data segment. This has caused all kind of
|
||||
It is something publically known that Clipper static variables are
|
||||
located at the bottom of the data segment. This has caused all kinds of
|
||||
troubles. This is why when I designed Five I did it in a way that could not
|
||||
cause any trouble in the future.
|
||||
|
||||
In Harbour all statics variables (and I mean on all PRGs) are stored in
|
||||
just one Harbour array (a Clipper language array), this guaranties that we
|
||||
may have as many statics variables as desired without limits (just limited
|
||||
In Harbour all static variables (and I mean on all PRGs) are stored in
|
||||
just one Harbour array (a Clipper language array), this guarantees that we
|
||||
may have as many static variables as desired without limits (just limited
|
||||
by the available memory). This aStatics array is not visible from the
|
||||
application (PRG level).
|
||||
|
||||
@@ -39,10 +39,10 @@ defined statics:
|
||||
|
||||
_SFRAME --> tell the stack from what location into aStatics are ours.
|
||||
|
||||
_STATICS is just called once from an entire PRG from an init function
|
||||
named _INITSTATICS (STATICS$ and SINIT in Clipper). That function stores on
|
||||
_STATICS is just called once for an entire PRG from an init function
|
||||
named _INITSTATICS (STATICS$ and SINIT in Clipper). That function stores in
|
||||
a tricky place (its own function pointer in the symbol table!) our statics
|
||||
base, and later on _SFRAME simply takes it from there and set it in the
|
||||
base, and later on _SFRAME simply takes it from there and sets it in the
|
||||
stack. That _INITSTATICS function will perform whatever initialization our
|
||||
global statics may have defined in that PRG).
|
||||
|
||||
|
||||
@@ -69,19 +69,19 @@ compilation run-time
|
||||
----------- ----------- ----------------------------------------
|
||||
HB_TR_INFO HB_TR_ERROR All calls with levels HB_DEBUG are
|
||||
erased from the code, so they have no
|
||||
performance effect; only calls with
|
||||
levels HB_TR_ERROR, HB_TR_FATAL and
|
||||
HB_TR_ALWAYS are printed.
|
||||
performance effect; only calls with
|
||||
levels HB_TR_ERROR, HB_TR_FATAL and
|
||||
HB_TR_ALWAYS are printed.
|
||||
|
||||
HB_TR_WARNING HB_TR_INFO All calls with levels HB_INFO and
|
||||
HB_DEBUG are erased from the code, so
|
||||
they have no performance effect; only
|
||||
calls with levels HB_TR_WARNING,
|
||||
HB_TR_ERROR, HB_TR_FATAL and
|
||||
HB_TR_ALWAYS are printed. Notice how
|
||||
setting HB_TR_INFO at run-time has no
|
||||
effect, since the code was compiled with
|
||||
a lower tracing level.
|
||||
they have no performance effect; only
|
||||
calls with levels HB_TR_WARNING,
|
||||
HB_TR_ERROR, HB_TR_FATAL and
|
||||
HB_TR_ALWAYS are printed. Notice how
|
||||
setting HB_TR_INFO at run-time has no
|
||||
effect, since the code was compiled with
|
||||
a lower tracing level.
|
||||
|
||||
For example, I compile Harbour on WinNT with gcc (MINGW32), so I
|
||||
usually set the C_USR environment variable like this:
|
||||
@@ -143,7 +143,7 @@ query and set the trace level. From C code:
|
||||
|
||||
* To query the current tracing state, and optionally change the
|
||||
current state to a given value (which should be in the range [0,1],
|
||||
otherwise the current state remains unchanged):
|
||||
otherwise the current state remains unchanged):
|
||||
|
||||
hb_tracestate(state);
|
||||
|
||||
@@ -161,7 +161,7 @@ query and set the trace level. From C code:
|
||||
|
||||
* To query the current tracing level, and optionally change the
|
||||
current level to a given value (which should be in the range [0,5],
|
||||
otherwise the current level remains unchanged):
|
||||
otherwise the current level remains unchanged):
|
||||
|
||||
hb_tracelevel(level);
|
||||
|
||||
|
||||
@@ -25,17 +25,18 @@ opcodes)
|
||||
|
||||
VM( pcode, local symbols )
|
||||
|
||||
The VM may invoke the VM (itself) again. This let the Clipper language to
|
||||
The VM may invoke the VM (itself) again. This lets the Clipper language
|
||||
access Clipper functions and methods and external C language functions again
|
||||
and again. The VM organizes these multiple accesses in a ordered and full
|
||||
controlled way and implements services to access these multiple execution
|
||||
levels (ProcName(), ProcLine(), debugging, and stack variables access).
|
||||
and again. The VM organizes these multiple accesses in an ordered and
|
||||
fully controlled way, and implements services to access these multiple
|
||||
execution levels (ProcName(), ProcLine(), debugging, and stack variables
|
||||
access).
|
||||
|
||||
The VM subsystems are continuously used by the main execution loop. Lets
|
||||
The VM subsystems are continuously used by the main execution loop. Let's
|
||||
review these VM subsystems:
|
||||
|
||||
The startup: Controls the initialization of the different VM subsystems and
|
||||
it is invoked at the beginning of the application. It also controls the
|
||||
The startup: Controls the initialization of the different VM subsystems.
|
||||
It is invoked at the beginning of the application. It also controls the
|
||||
exiting of the application.
|
||||
|
||||
The stack: The VM does not use the stack of the computer directly, it uses
|
||||
@@ -290,7 +291,7 @@ compiler and VM.
|
||||
|
||||
Question :
|
||||
|
||||
I see that, for example, Harbour have an opcode named "PUSHWORD"(06),
|
||||
I see that, for example, Harbour has an opcode named "PUSHWORD"(06),
|
||||
while Valkyre calls it "PUSHW"(3B): Different names, different codes.
|
||||
Isn't it desirable that Harbour pCode be binary-compatible with Clipper? I
|
||||
mean, by doing so, Harbour VM could interpret Clipper pCode and
|
||||
@@ -298,10 +299,10 @@ vice-versa.
|
||||
|
||||
Answer :
|
||||
|
||||
Harbour opcodes are defined at pcode.h. We are trying to use a very easy to
|
||||
Harbour opcodes are defined in pcode.h. We are trying to use very easy to
|
||||
remember mnemonics, so PUSHWORD seems easier than PUSHW. The opcodes values
|
||||
are meaningless as they are just used by a C language switch sentence (in
|
||||
fact there is a powerfull optimization which it is to use the pcode opcodes
|
||||
fact there is a powerful optimization which is to use the pcode opcodes
|
||||
themselves as an index to a VM functions pointers array, so VM execution
|
||||
speed may increase. Clipper uses it).
|
||||
|
||||
|
||||
@@ -67,9 +67,9 @@ IF cFile == NIL
|
||||
Eval(ErrorBlock(), err)
|
||||
ENDIF
|
||||
|
||||
nReadHandle := FT_FUSE(cFile)
|
||||
nHandle := FT_FUSE(cFile)
|
||||
|
||||
IF nReadHandle <0
|
||||
IF nHandle <0
|
||||
err := ErrorNew()
|
||||
err:severity := ES_ERROR
|
||||
err:genCode := EG_OPEN
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define LONGLINE 100
|
||||
#define LONGONELINE 86
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define LONGLINE 100
|
||||
#define LONGONELINE 86
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
@@ -5,4 +5,4 @@ rem
|
||||
|
||||
hbdoc -htm categ.lnk hrbtools.rsp
|
||||
cd htm
|
||||
start harbour.htm
|
||||
rem start harbour.htm
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define LONGLINE 100
|
||||
#define LONGONELINE 86
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
@@ -238,7 +238,7 @@ FUNCTION ProcessWww()
|
||||
FOR j := 1 TO LEN( cTemp )
|
||||
cChar := SUBSTR( cTemp, j, 1 )
|
||||
IF ( cChar >= "0" .AND. cChar <= "9" ) .OR. ;
|
||||
( cChar >= "A" .AND. cChar <= "Z" ) .OR. cChar = "_"
|
||||
( cChar >= "A" .AND. cChar <= "Z" ) .OR. cChar = "_"
|
||||
cFileName += cChar
|
||||
ENDIF
|
||||
NEXT
|
||||
@@ -527,8 +527,9 @@ FUNCTION ProcWwwAlso( nWriteHandle, cSeeAlso )
|
||||
xPos := AT( " ", xTemp )
|
||||
IF xPos > 0
|
||||
nLen -= LEN( xTemp ) + 3
|
||||
|
||||
cTemp := xTemp
|
||||
xTemp:=Substr(xTemp,1,xPos-1 ) + Substr(xTemp,xPos+1)
|
||||
|
||||
ELSE
|
||||
nLen -= LEN( xTemp ) + 2
|
||||
|
||||
@@ -549,8 +550,9 @@ FUNCTION ProcWwwAlso( nWriteHandle, cSeeAlso )
|
||||
xPos := AT( " ", xTemp )
|
||||
IF xPos > 0
|
||||
nLen -= LEN( xTemp ) + 3
|
||||
|
||||
cTemp := xTemp
|
||||
cTemp := xTemp
|
||||
xTemp:=Substr(xTemp,1,xPos-1 )+Substr(xTemp,xPos+1)
|
||||
|
||||
ELSE
|
||||
nLen -= LEN( xTemp ) + 2
|
||||
|
||||
@@ -560,7 +562,7 @@ FUNCTION ProcWwwAlso( nWriteHandle, cSeeAlso )
|
||||
|
||||
ENDIF
|
||||
|
||||
nWriteHandle:WriteLink( ALLTRIM( cTemp ) )
|
||||
nWriteHandle:WriteLink( ALLTRIM( xTemp ),cTemp )
|
||||
cSeeAlso := SUBSTR( cSeeAlso, nPos + 1 )
|
||||
|
||||
IF nLen == 0 .OR. nLen < 0
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 78
|
||||
#define LONGONELINE 66
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define LONGLINE 100
|
||||
#define LONGONELINE 86
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define LONGLINE 100
|
||||
#define LONGONELINE 86
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
#define MODULELINE 12
|
||||
#define LINELINE 14
|
||||
#define ERRORLINE 20
|
||||
#define LONGLINE 78
|
||||
#define LONGONELINE 66
|
||||
#define LONGLINE 100
|
||||
#define LONGONELINE 86
|
||||
#define CRLF HB_OSNewLine()
|
||||
// The delimiter
|
||||
#define DELIM "$" // keyword delimiter
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* HBDOC document Extractoy
|
||||
* HBDOC document Extractor
|
||||
*
|
||||
* Copyright 2000 Luiz Rafael Culik <culik@sl.conex.net>
|
||||
* www - http://www.harbour-project.org
|
||||
@@ -463,14 +463,15 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
|
||||
ELSEIF lWWW
|
||||
oHtm := THTML():New( "htm\harbour.htm" )
|
||||
oHtm:WriteTitle( "Harbour Reference Guide" )
|
||||
oHtm:WriteText('<center><img src="http://www.flexsys-ci.com/harbour-project/images/bannerhrblt.gif" ALIGN="MIDDLE"></IMG></center>')
|
||||
oHtm:WritePar( "HARBOUR" )
|
||||
oHtm:WriteLink( "overview",UpperLower("Harbour Read me" ))
|
||||
oHtm:WriteLink( "license", UpperLower("Harbour License" ))
|
||||
oHtm:WriteLink( "http://www.gnu.org/copyleft/gpl.html","GNU License" )
|
||||
oHtm:WriteLink( "compileroptions.htm","Compiler Options")
|
||||
oHtm:WritePar( "" )
|
||||
oHtm:WritePar("")
|
||||
oHtm:WritePar( "Functions A-M" )
|
||||
oHtm:WritePar("")
|
||||
ASORT( awww,,,{|x,y| x[1]<y[1] })
|
||||
|
||||
FOR nPos := 1 TO LEN( aWww )
|
||||
@@ -479,24 +480,32 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
|
||||
oHtm:WriteLink( Lower(aWww[ nPos ,2]),UpperLower(aWww[nPos,1] ))
|
||||
ENDIF
|
||||
NEXT
|
||||
oHtm:WritePar("")
|
||||
oHtm:WritePar( "Functions N-_" )
|
||||
oHtm:WritePar("")
|
||||
FOR nPos := 1 TO LEN( aWww )
|
||||
cTemp := aWww[ nPos,1 ]
|
||||
IF LEFT( cTemp, 1 ) >= "N" .AND. LEFT( cTemp, 1 ) < "_" .AND. AT( "()", cTemp ) > 0
|
||||
oHtm:WriteLink(Lower(aWww[ nPos ,2]),UpperLower(aWww[nPos,1] ) )
|
||||
ENDIF
|
||||
NEXT
|
||||
oHtm:WritePar("")
|
||||
oHtm:WritePar( "Commands" )
|
||||
oHtm:WritePar("")
|
||||
FOR nPos := 1 TO LEN( aWww )
|
||||
cTemp := aWww[ nPos,1 ]
|
||||
IF AT( "()", cTemp ) == 0 .AND. ctemp <> "LICENSE" .AND. cTemp <> "OVERVIEW" .and. cTemp<>"Compiler Options"
|
||||
IF AT( "()", cTemp ) == 0 .AND. ctemp <> "LICENSE" .AND. cTemp <> "OVERVIEW" .and. cTemp<>"Compiler Options" ;
|
||||
.AND. UPPER(Left(ctemp,4)) <>"BASE" .AND. UPPER(LEFT(cTemp,4))<>"TERM" .and. UPPER(LEFT(cTemp,5))<>"TOOLS"
|
||||
|
||||
oHtm:WriteLink( Lower(aWww[ nPos ,2]),UpperLower(aWww[nPos,1]))
|
||||
ENDIF
|
||||
NEXT
|
||||
oHtm:WritePar("")
|
||||
oHtm:WritePar( "Run Time Error" )
|
||||
oHtm:WritePar("")
|
||||
FOR nPos := 1 TO LEN( aWww )
|
||||
cTemp := aWww[ nPos,1 ]
|
||||
IF AT( "()", cTemp ) == 0 .AND. Left(ctemp,4) =="BASE" .AND. left(cTemp,4)=="TERM" .and. left(cTemp,5)=="TOOLS"
|
||||
IF AT( "()", cTemp ) == 0 .OR. UPPER(Left(ctemp,4)) =="BASE" .OR. UPPER(LEFT(cTemp,4))=="TERM" .OR. UPPER(LEFT(cTemp,5))=="TOOLS"
|
||||
oHtm:WriteLink( Lower(aWww[ nPos ,2]),UpperLower(aWww[nPos,1]))
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
@@ -63,7 +63,6 @@
|
||||
..\..\source\rtl\pvalue.c
|
||||
..\..\source\rtl\readkey.prg
|
||||
..\..\source\rtl\readme.prg
|
||||
..\..\source\rtl\readvar.prg
|
||||
..\..\source\rtl\samples.c
|
||||
..\..\source\rtl\set.c
|
||||
..\..\source\rtl\setcolor.c
|
||||
@@ -90,3 +89,5 @@
|
||||
..\..\source\rtl\word.c
|
||||
..\..\source\rtl\xhelp.c
|
||||
..\..\source\rtl\xsavescr.prg
|
||||
..\..\doc\subcodes.txt
|
||||
..\..\doc\compiler.txt
|
||||
|
||||
@@ -63,7 +63,6 @@
|
||||
..\..\source\rtl\pvalue.c
|
||||
..\..\source\rtl\readkey.prg
|
||||
..\..\source\rtl\readme.prg
|
||||
..\..\source\rtl\readvar.prg
|
||||
..\..\source\rtl\samples.c
|
||||
..\..\source\rtl\set.c
|
||||
..\..\source\rtl\setcolor.c
|
||||
@@ -91,6 +90,7 @@
|
||||
..\..\source\rtl\xhelp.c
|
||||
..\..\source\rtl\xsavescr.prg
|
||||
..\..\source\tools\asciisum.c
|
||||
..\..\source\tools\strasint.c
|
||||
..\..\source\tools\ascpos.c
|
||||
..\..\source\tools\atdiff.c
|
||||
..\..\source\tools\chareven.c
|
||||
@@ -104,25 +104,28 @@
|
||||
..\..\source\tools\ctcrypt.c
|
||||
..\..\source\tools\dates2.c
|
||||
..\..\source\tools\datesx.c
|
||||
..\..\source\tools\dbftools.c
|
||||
..\..\source\tools\fileread.prg
|
||||
..\..\source\tools\hb_f.c
|
||||
..\..\source\tools\html.prg
|
||||
..\..\source\tools\io.c
|
||||
..\..\source\tools\mathx.c
|
||||
..\..\source\tools\nconvert.prg
|
||||
..\..\source\tools\ng.prg
|
||||
..\..\source\tools\numtxten.prg
|
||||
..\..\source\tools\numtxthu.prg
|
||||
..\..\source\tools\os2.prg
|
||||
..\..\source\tools\rtf.prg
|
||||
..\..\source\tools\ng.prg
|
||||
..\..\source\tools\strasint.c
|
||||
..\..\source\tools\strcount.c
|
||||
..\..\source\tools\strleft.c
|
||||
..\..\source\tools\strcspn.c
|
||||
..\..\source\tools\strdiff.c
|
||||
..\..\source\tools\strexpan.c
|
||||
..\..\source\tools\strfmt.c
|
||||
..\..\source\tools\stringp.prg
|
||||
..\..\source\tools\stringsx.c
|
||||
..\..\source\tools\strleft.c
|
||||
..\..\source\tools\strpbrk.c
|
||||
..\..\source\tools\strright.c
|
||||
..\..\source\tools\strpbrk.c
|
||||
..\..\source\tools\troff.prg
|
||||
..\..\doc\subcodes.txt
|
||||
..\..\doc\compiler.txt
|
||||
|
||||
Reference in New Issue
Block a user