{
	"HarbourReference": {
		"Entry": [
			{
				"TEMPLATE": "Document",
				"NAME": "Welcome to Harbour",
				"ONELINER": "A starter's guide",
				"CATEGORY": "Document",
				"SUBCATEGORY": "Intro",
				"DESCRIPTION": "Clipper is a trademark of Computer Associates and will often be referred to as CA-Cl*pper within Harbour documents. Regardless of this variant, Clipper is recognized as Computer Associates' trademark.\nHarbour is a free software compiler for the xBase superset language often referred to as Clipper (the language that is implemented by the compiler Clipper). The goal of Harbour is to produce a cross platform CA-Cl*pper compatible compiler.\nThe Harbour website is at <https://vszakats.github.io/harbour-core/>. If you have any problem with this copy of Harbour please visit our web site and ensure that you are using the latest release.\nIf you are reading this file as part of a source distribution of Harbour you probably want to start by reading doc/dirstruc.txt because this is your map to the Harbour source directories.\nHarbour is a superset of Clipper and is backwards compatible with nearly 100% of all Clipper 5.2x or 5.3 code. Most Clipper S'87 code will also compile and run fine, but may require some modifications to run well.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Document, Intro"
			},
			{
				"TEMPLATE": "Document",
				"NAME": "Compiler Options",
				"CATEGORY": "Document",
				"SUBCATEGORY": "Compiler",
				"DESCRIPTION": "<b>Invoking the Harbour compiler:</b> ==============================\n```\nharbour <file[.prg]> [options]\n```\n or\n```\nharbour [options] <file[.prg]>\n```\n or\n```\nharbour [options] <file[.prg]> [options]\n```\nThe command-line options have to be separated by at least one space. The option can start with either `-` character or `/` character.\n<b>The Harbour command-line options:</b> =================================\n`-a`               automatic memvar declaration\nThis causes all variables declared by PARAMETER, PRIVATE or PUBLIC statements to be automatically declared as MEMVAR variables.\n================= `-b`               debug info\nThe compiler generates all information required for debugging\n================= `-build`           display detailed version info\n================= `-credits`         display credits\n================= `-d<id>[=<val>]`   `#define <id>`\n================= `-es[<level>]`     set exit severity\n`-es` or `-es0` - all warnings are ignored and exit code returned by\nthe compiler is equal to 0 if there are no errors in compiled source file.\n`-es1`      - any warnings generate a non-zero exit code, but\noutput is still created.\n`-es2`      - all warnings are treated as errors and no output\nfile is created. The exit code is set to a non-zero value.\n================= `-fn[:[l|u]|-]`    set file name casing (`l`=lower `u`=upper)\n================= `-fd[:[l|u]|-]`    set directory casing (`l`=lower `u`=upper)\n================= `-fp[:<char>]`     set path separator\n================= `-fs[-]`           turn file name space trimming on or off (default)\n================= `-g<type>`         output type generated is <type>\n`-gc[<type>]`  output type: C source `.c` (default)\n<type>: `0`=compact (default) `1`=normal `2`=verbose\n`3`=generate real C code\n`-gh`          output type: Harbour Portable Object `.hrb`\n`-gd[.<destext>]`  generate dependencies list into `.d` file\n`-ge[<mode>]`      error output <mode>: `0`=Clipper (default)\n`1`=IDE friendly\n================= `-i<path>`         #include file search path\n================= `-i[-|+]`          disable/enable support for INCLUDE envvar\n================= `-j[<file>]`     generate i18n gettext file `.pot`\n================= `-k<mode>`       compilation mode (type `-k?` for more data)\n`-kc`        clear all flags (strict Clipper mode)\n`-kh`        Harbour mode (default)\n`-ko`        allow operator optimizations\n`-ki`        enable support for HB_INLINE (default)\n`-kr`        runtime settings enabled\n`-ks`        allow indexed assignment on all types\n`-kx`        extended Xbase++ mode (default)\n`-ku`        strings in user encoding\n`-kd`        accept macros with declared symbols\n`-km`        turn off macro-text substitution\n`-kj`        turn off jump optimization in pcode\n`-k?`        this info\n================= `-l`               suppress line number information\nThe compiler does not generate the source code line numbers in the output file. The ProcLine() function will return 0 for modules compiled using this option.\n================= `-m`               compile module only\n================= `-n[<type>]`       no implicit starting procedure\n<type>: `0`=no implicit starting procedure\n`1`=no starting procedure at all `2`=add starting procedure if necessary\nThe compiler does not create a procedure with the same name as 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 at the beginning of the file and before the first PROCEDURE/FUNCTION statement are ignored.\n================= `-o<path>`         object file drive and/or path\n================= `-p`               generate pre-processed output `.ppo` file\nThe compiler only creates the file that contains the result of pre-processing the source file.\n================= `-p+`              generate pre-processor trace `.ppt` file\n================= `-q`               quiet\nThe compiler does not print any messages during compiling (except the copyright info).\n`-q0`     quiet and don't display program header\n`-q2`     disable all output messages\n`-ql`     suppress line number information\n================= `-r[<lib>]`        request linker to search <lib> (or none)\nCurrently not supported in Harbour.\n================= `-r=<max>`         sets maximum number of preprocessor iterations\nThis set the maximum number of preprocessor iterations during processing the source code. If this switch is not used then the preprocessor stops after 1024 iterations. This value is used to stop processing of infinite loops, for example: `#command ( => (,7`\n================= `-s[m]`            syntax check only [minimal for dependencies list]\nThe compiler checks the syntax only. No output file is generated.\n================= `-t<path>`         path for temp file creation\nCurrently not used in Harbour (the Harbour compiler does not create any temporary files).\n================= `-u[<file>]`       use command def set in <file> (or none)\n================= `-u+<file>`        add command def set from <file>\n================= `-undef:<id>`      `#undef <id>`\n================= `-v`               variables are assumed `M->`\nAll undeclared or unaliased variables are assumed MEMVAR variables (private or public variables). If this switch is not used then the scope of such variables is checked at runtime.\n================= `-w[<level>]`     set warning level number (0..3, default 1)\n`-w0`         - no warnings\n`-w` or `-w1` - CA-Cl*pper compatible warnings\n`-w2`         - some useful warnings missed in CA-Cl*pper\n`-w3`         - warnings generated for Harbour language extensions\nand also enables strong type checking but only warns against declared types, or types which may be calculated at compile time\n================= `-x[<prefix>]`    set symbol init function name prefix (for `.c` only)\nSets the prefix added to the generated symbol init function name (in C output currently). This function is generated automatically for every PRG module compiled. This additional prefix can be used to suppress problems with duplicated symbols during linking an application with some third party libraries.\n================= `-z`               suppress shortcutting (`.AND.` & `.OR.`)\nCompilation in batch mode. ==========================\n`@file`         compile list of modules in <file>\nNot supported yet.\n<b>Known incompatibilities between Harbour and CA-Cl*pper compilers</b> =============================================================\nNote:\nIf you want a 100% compatible runtime libraries then you have to define HB_CLP_STRICT, using `HB_USER_CFLAGS=-DHB_CLP_STRICT`, then rebuild.\n<b>Passing an undeclared variable by the reference</b> ===============================================\nThe CA-Cl*pper 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, field variables cannot be passed by reference. This means that CA-Cl*pper 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 CA-Cl*pper and in Harbour - only the generated opcodes are different.\nHandling of object messages ===========================\nThe HB_CLP_STRICT setting determines the way chained send messages are handled.\nFor example, the following code:\n`a:b( COUNT() ):c += 1`\nwill be handled as:\n`a:b( COUNT() ):c := a:b( COUNT() ):c + 1`\nin strict CA-Cl*pper compatibility mode and\n`temp := a:b( COUNT() ), temp:c += 1`\nin non-strict mode.\nIn practice, CA-Cl*pper 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.\nThe Harbour (non-strict) method is:\n1) faster\n2) it guarantees that the same instance variable of the same object will be changed\n(See also: include/hbexpra.c, include/hbexprb.c)\n<b>Initialization of static variables</b> ==================================\nThere is a difference in the initialization of static variables that are initialized with a codeblock that refers to a local variable. For example:\n<fixed>\nLOCAL MyLocalVar\nSTATIC s_MyStaticVar := {|| MyLocalVar }\n\nMyLocalVar := 0\n? Eval( s_MyStaticVar )\n</fixed>\nThe above code compiles fine in CA-Cl*pper, but it generates a runtime error `Error/BASE 1132 Bound error: array access Called form (b)STATICS$(0)`\nIn Harbour this code generates a compile time error: `Error E0009 Illegal variable (b) initializer: 'MyLocalVar'`\nBoth CA-Cl*pper 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 access to these variables after the exit from a function/procedure. However, all static variables are initialized in a separate procedure (`STATICS$` in CA-Cl*pper 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, so they cannot be detached.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Document, Compiler"
			},
			{
				"TEMPLATE": "Document",
				"NAME": "Macro compiler",
				"CATEGORY": "Document",
				"SUBCATEGORY": "Compiler",
				"DESCRIPTION": "<b>Invoking the macro compiler:</b>\n```\n&variable\n```\n or\n```\n&( expression )\n```\n or\n```\n&variable.text\n```",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Document, Compiler"
			},
			{
				"TEMPLATE": "Document",
				"NAME": "Harbour Extensions",
				"CATEGORY": "Document",
				"DESCRIPTION": "<b>Language extensions:</b> --------------------\n* Class generation and management.\nCA-Cl*pper only allowed creation of objects from a few standard classes.\nIn 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.\n* `@<FunctionName>()`\nReturns the pointer (address) to a function.\nThe returned value is not useful to application-level programming, but is used at a low level to implement object oriented coding. (Internally, a class method is a static function and there is no symbol for it, so it is accessed via its address).\n* Class HBGetList()\nObject oriented support for GetLists management.\n* ProcName() support for class Method names.\nClass Methods can be retrieved from the call stack.\n* Memory() has new return values.\nSee hbmemory.ch\n* Transform() --> new function in format string\n@0      Make a zero padded string out of the number.\n* SToD() --> dDate\nNew function that converts a `yyyymmdd` string to a Date value.\n* Optional Compile Time *strong type* declaration (and compile time\n*type mismatch* warnings)\nExample: LOCAL/STATIC Var `AS` ...\n* The Harbour debugger provides new interesting classes:\n- Class HBDbWindow() could be the foundation for a generic multi-platform\n- Class HBDbInput()\n- Class HBDbMenu() implement both pull-down and popup menus.\n<b>RTL enhanced functionality:</b> ---------------------------\n- `hb_vfDirSpace( <nDir>, <nType> )`\nThe second parameter is a Harbour (optional) parameter and indicates the type of disk info being requested. See doc/en/diskspac.txt for info.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Document"
			},
			{
				"TEMPLATE": "Document",
				"NAME": "The Garbage Collector",
				"ONELINER": "Readme for Harbour Garbage Collect Feature",
				"CATEGORY": "Document",
				"DESCRIPTION": "The garbage collector uses the following logic: - first collect all memory allocations that can cause garbage; - next scan all variables if these memory blocks are still referenced.\nNotice that only arrays, objects and codeblocks are collected because these are the only datatypes that can cause self-references `a[ 1 ] := a` or circular references `a[ 1 ] := b; b[ 1 ] := c; c[ 1 ] := a` that cannot be properly deallocated by simple reference counting.\nSince all variables in Harbour are stored inside some available tables (the eval stack, memvars table and array of static variables) then checking if the reference is still alive is quite easy and doesn't require any special treatment during memory allocation. Additionally the garbage collector is scanning some internal data used by Harbour objects implementation that also stores some values that can contain memory references. These data are used to initialize class instance variables and are stored in class shared variables.\nIn special cases when the value of a Harbour variable is stored internally in some static area (at C or assembler level), the garbage collector will be not able to scan such values since it doesn't know their location. This could cause some memory blocks to be released prematurely. To prevent the premature deallocation of such memory blocks the static data have to store a pointer to the value created with hb_itemNew() function. Example:\n```c\nstatic HB_ITEM s_item; /* this item can be released by the GC */\n\nstatic PHB_ITEM pItem; /* this item will be maintained correctly */\npItem = hb_itemNew( hb_param( 1, IT_BLOCK ) );\n```\nHowever, scanning of all variables can be a time consuming operation. It requires that all allocated arrays have to be traversed through all their elements to find more arrays. Also all codeblocks are scanned for detached local variables they are referencing. For this reason, looking for unreferenced memory blocks is performed during the idle states.\nThe idle state is a state when there is no real application code executed. For example, the user code is stopped for 0.1 of a second during `Inkey( 0.1 )` - Harbour is checking the keyboard only during this time. It leaves however quite enough time for many other background tasks. One such background task can be looking for unreferenced memory blocks.\nAllocating memory -----------------\nThe garbage collector collects memory blocks allocated with hb_gcAlloc() function calls. Memory allocated by hb_gcAlloc() should be released with hb_gcFree() function.\nThe garbage collecting ----------------------\nDuring scanning of unreferenced memory the GC is using a mark & sweep algorithm. This is done in three steps:\n1) mark all memory blocks allocated by the GC with unused flag;\n2) sweep (scan) all known places and clear unused flag for memory blocks that are referenced there;\n3) finalize collecting by deallocation of all memory blocks that are still marked as unused and that are not locked.\nTo speed things up, the mark step is simplified by swapping the meaning of the unused flag. After deallocation of unused blocks all still alive memory blocks are marked with the same 'used' flag so we can reverse the meaning of this flag to 'unused' state in the next collecting. All new or unlocked memory blocks are automatically marked as 'unused' using the current flag, which assures that all memory blocks are marked with the same flag before the sweep step will start. See hb_gcCollectAll() and hb_gcItemRef()\nCalling the garbage collector from Harbour code -----------------------------------------------\nThe garbage collector can be called directly from the Harbour code. This is useful in situations where there is no idle states available or the application is working in the loop with no user interaction and there is many memory allocations. See hb_gcAll() for explanation of how to call this function from your Harbour code.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Document",
				"SEEALSO": "hb_gcAlloc(), hb_gcFree(), hb_gcCollectAll(), hb_gcItemRef(), hb_gcAll(), hb_idleState()"
			},
			{
				"TEMPLATE": "Document",
				"NAME": "The idle states",
				"ONELINER": "Readme file for Idle States",
				"CATEGORY": "Document",
				"DESCRIPTION": "The idle state is the state of the Harbour virtual machine when it waits for the user input from the keyboard or the mouse. The idle state is entered during Inkey() calls currently. All applications that don't use Inkey() function call can signal the idle states with the call of hb_idleState() function (or hb_idleState() on C level).\nDuring idle states the virtual machine calls the garbage collector and it can call user defined actions (background tasks). It also releases the CPU time slices for some poor platforms that are not smart enough to detect it automatically.\nFor defining the background tasks see the hb_idleAdd() and hb_idleDel() functions.\nFor direct call for background actions see hb_idleState() function.\nFor signaling the idle state from C code see the hb_idleState() API function.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Document",
				"SEEALSO": "hb_idleAdd(), hb_idleDel()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Do()",
				"ONELINER": "Calls a procedure or a function",
				"CATEGORY": "API",
				"SUBCATEGORY": "Application",
				"SYNTAX": "Do( <xFuncProc> [, <xArguments...>] ) --> xRetVal",
				"ARGUMENTS": "<xFuncProc> = Either a string with a function/procedure name to be called or a codeblock to evaluate.\n<xArguments> = arguments passed to a called function/procedure or to a codeblock.",
				"RETURNS": "<xRetVal> A value that was returned from called function.",
				"DESCRIPTION": "This function can be called either by the Harbour compiler or by user. The compiler always passes the item of HB_IT_SYMBOL type that stores the name of procedure specified in `DO <proc> WITH ...` statement.\nIf called procedure/function doesn't exist then a runtime error is generated.\nThis function can be used as replacement of macro operator. It is also used internally to implement `DO <proc> WITH <args...>` In this case <xFuncProc> is of type HB_SYMB.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cFunction := \"MyFunc\"\n\n? Do( cFunction, 1 )  // Old style\nDO &cFunction WITH 2  // Old style with macro\n\n? Do( {| n | MyFunc( n ) }, 3 )\n? Do( @MyFunc(), 4 )\n\nFUNCTION MyFunc( n )  /* must be a public function for old style calls */\n   ? n\n   RETURN n + 1"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Application"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_PValue()",
				"ONELINER": "Retrieves the value of an argument.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Application",
				"SYNTAX": "hb_PValue( <nArg> ) --> xExp",
				"ARGUMENTS": "A number that indicates the argument to check.",
				"RETURNS": "<xExp> Returns the value stored by an argument.",
				"DESCRIPTION": "This function is useful to check the value stored in an argument.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Test( 123, \"abc\" )\nSTATIC PROCEDURE Test( nValue, cString )\n   IF PCount() == 2\n      ? hb_PValue( 1 ), nValue\n      ? hb_PValue( 2 ), cString\n   ENDIF\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Application",
				"SEEALSO": "PCount()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "PCount()",
				"ONELINER": "Retrieves the number of arguments passed to a function.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Application",
				"SYNTAX": "PCount() --> nArgs",
				"ARGUMENTS": "None",
				"RETURNS": "<nArgs> A number that indicates the number of arguments passed to a function or procedure.",
				"DESCRIPTION": "This function is useful to check if a function or procedure has received the required number of arguments.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Test()\nTest( \"abc\" )\nSTATIC PROCEDURE Test( xExp )\n   IF PCount() == 0\n      ? \"This function needs a parameter\"\n   ELSE\n      ? xExp\n   ENDIF\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Application",
				"SEEALSO": "hb_PValue()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ProcFile()",
				"ONELINER": "This function always returns an empty string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Application",
				"SYNTAX": "ProcFile( <xExp> ) --> cEmptyString",
				"ARGUMENTS": "<xExp> is any valid type.",
				"RETURNS": "<cEmptyString> Return an empty string",
				"DESCRIPTION": "This function is added to the RTL for full compatibility. It always returns an empty string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? ProcFile()\n? ProcFile( NIL )\n? ProcFile( 2 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Application",
				"SEEALSO": "ProcName(), ProcLine()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ProcLine()",
				"ONELINER": "Gets the line number of the current function on the stack.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Application",
				"SYNTAX": "ProcLine( <nLevel> ) --> nLine",
				"ARGUMENTS": "<nLevel> is the function level required.",
				"RETURNS": "<nLine> The line number of the function that it is being executed.",
				"DESCRIPTION": "This function looks at the top of the stack and gets the current line number of the executed function if no arguments are passed. Otherwise it returns the line number of the function or procedure at <nLevel>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? ProcLine( 0 )\n? ProcName( 2 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Application",
				"SEEALSO": "ProcName(), ProcFile()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ProcName()",
				"ONELINER": "Gets the name of the current function on the stack",
				"CATEGORY": "API",
				"SUBCATEGORY": "Application",
				"SYNTAX": "ProcName( <nLevel> ) --> cProcName",
				"ARGUMENTS": "<nLevel> is the function level required.",
				"RETURNS": "<cProcName> The name of the function that it is being executed.",
				"DESCRIPTION": "This function looks at the top of the stack and gets the current executed function if no arguments are passed. Otherwise it returns the name of the function or procedure at <nLevel>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// This test will show the functions and procedures in stack.\n// before executing it.\nLOCAL n := 1\nDO WHILE ! Empty( ProcName( n ) )\n   ? ProcName( n++ )\nENDDO"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Application",
				"SEEALSO": "ProcLine(), ProcFile()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AAdd()",
				"ONELINER": "Dynamically add an element to an array",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "AAdd( <aArray>, [<xValue>] ) --> xValue",
				"ARGUMENTS": "<aArray> The name of an array\n<xValue> Element to add to array <aArray>",
				"RETURNS": "<xValue> if specified <xValue>, <xValue> will be returned, otherwise this function returns a NIL value.",
				"DESCRIPTION": "This function dynamically increases the length of the <aArray> by adding one new element to the end of the array and optionally stores the value <xValue> to that newly created element.\n<xValue> may be of an data type, including an array reference pointer, which in turn may be stored to an array's subscript position.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := {}, tmp\nAAdd( aArray, 10 )\nFOR tmp := 1 TO 10\n   AAdd( aArray, tmp )\nNEXT\n? hb_ValToExp( aArray )  // --> { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AIns(), ASize()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AClone()",
				"ONELINER": "Duplicate a  multidimensional array",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "AClone( <aSource> ) --> aDuplicate",
				"ARGUMENTS": "<aSource> Name of the array to be cloned.",
				"RETURNS": "<aDuplicate> A new array pointer reference complete with nested array values.",
				"DESCRIPTION": "This function makes a complete copy of the array expressed as <aSource> and return a cloned set of array values. This provides a complete set of arrays values for all dimensions within the original array <aSource>",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aOne := { \"Harbour\", \" is \", \"POWER\" }\nLOCAL aTwo := AClone( aOne )\n? hb_ValToExp( aTwo )  // --> { \"Harbour\", \" is \", \"POWER\" }\naOne[ 1 ] := \"The Harbour Compiler\"\n? hb_ValToExp( aOne )  // --> { \"The Harbour Compiler\", \" is \", \"POWER\" }\n? hb_ValToExp( aTwo )  // --> { \"Harbour\", \" is \", \"POWER\" }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper will return NIL if the parameter is not an array.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "ACopy(), ADel(), AIns(), ASize()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ACopy()",
				"ONELINER": "Copy elements from one array to another",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "ACopy( <aSource>, <aTarget>, [<nStart>], [<nCount>], [<nTargetPos>] ) --> aTarget",
				"ARGUMENTS": "<aSource> is the array to copy elements from.\n<aTarget> is the array to copy elements to.\n<nStart>  is the beginning subscript position to copy from <aSource>\n<nCount>  the number of subscript elements to copy from <aSource>.\n<nTargetPos> the starting subscript position in <aTarget> to copy elements to.",
				"RETURNS": "<aTarget> an array pointer reference",
				"DESCRIPTION": "This function copies array elements from <aSource> to <aTarget>. <nStart> is the beginning element to be copied from <aSource>; the default is 1.\n<nCount> is the number of elements to be copied from <aSource>; the default is the entire array. <nTargetPos> is the subscript number in the target array, <aTarget>, to which array elements are to be copied; the default is 1.\nThis function will copy all data types in <aSource> to <aTarget>. If an array element in <aSource> is a pointer reference to another array, that array pointer will be copied to <aTarget>; not all subdimensions will be copied from one array to the next. This must be accomplished via the AClone() function.\nNote: If array <aSource> is larger then <aTarget>, array elements will start copying at <nTargetPos> and continue copying until the end of array <aTarget> is reached. The ACopy() function doesn't append subscript positions to the target array, the size of the target array <aTarget> remains constant.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nCount := 2, nStart := 1\nLOCAL aOne := { \"Harbour\", \" is \", \"Power\" }\nLOCAL aTwo := { \"Clipper\", \" was \", \"Power\" }\nACopy( aOne, aTwo, nStart, nCount )\n? hb_ValToExp( aTwo )  // --> { \"Harbour\", \" is \", \"Power\" }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AClone(), ADel(), AEval(), AFill(), AIns(), ASort()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ADel()",
				"ONELINER": "Delete an element from an array.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "ADel( <aArray>, <nPos> ) --> aArray",
				"ARGUMENTS": "<aArray> Name of array from which an element is to be removed.\n<nPos>   Subscript of the element to be removed.",
				"RETURNS": "<aArray> an array pointer reference.",
				"DESCRIPTION": "This function deletes the element found at <nPos> subscript position in the array <aArray>. All elements in the array <aArray> below the given subscript position <nPos> will move up one position in the array.\nIn other words, what was formerly the sixth subscript position will become the fifth subscript position. The length of the array <aArray> will remain unchanged, as the last element in the array will become a NIL data type.\nNote: To completely remove an element and decrease the length of array you can use hb_ADel() that supports auto-sizing.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := { \"Harbour\", \"is\", \"Power\" }\nADel( aArray, 2 )\n? hb_ValToExp( aArray )  // --> { \"Harbour\", \"Power\", NIL }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "hb_ADel(), ACopy(), AIns(), AFill()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AEval()",
				"ONELINER": "Evaluates the subscript element of an array",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "AEval( <aArray>, <bBlock>, [<nStart>], [<nCount>] ) --> aArray",
				"ARGUMENTS": "<aArray> Is the array to be evaluated.\n<bBlock> Is a code block to evaluate for each element processed.\n<nStart> The beginning array element index to evaluate.\n<nCount> The number of elements to process.",
				"RETURNS": "<aArray> an array pointer reference.",
				"DESCRIPTION": "This function evaluates the elements of <aArray>, and executes for each of them the processing that's defined with <bBlock>. By default, all the elements of array are being processed, starting from 1st and up to the last element.\nIf  <nStart> and/or <nCount> parameters are given, then the processing starts from <nStart> element and continues for the next <nCount> elements (if defined) or up to the last element of the array.\nThe <bBlock> code block receives two parameters: the element value and element's index (position) into the array. i.e. `{| xValue, nIndex | ... }` Worth to note that elements are passed to code block 'by value', thus any change being made to this value doesn't  affects the value of element in the array.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL a := { 10, 20, 30 }\nAEval( a, {| e, n | QOut( e * n + 1 , a[ n ] ) } )\n? a[ 1 ], a[ 2 ], a[ 3 ]  // array elements unchanged\n? \"----\"\nAEval( a, {| e, n | QOut( e * n + 1, a[ n ] *= n + 1 ) }, 2, 1 )\n/* Here the 2nd element been changed, because we've explicitly used\n   its pointer 'a[ n ] *= ...' into array */\n? a[ 1 ], a[ 2 ], a[ 3 ]"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "Eval(), dbEval()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AFill()",
				"ONELINER": "Fill an array with a specified value",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "AFill( <aArray>, <xValue>, [<nStart>], [<nCount>] ) --> aArray",
				"ARGUMENTS": "<aArray> Name of array to be filled.\n<xValue> Expression to be globally filled in <aArray>\n<nStart> Subscript starting position\n<nCount> Number of subscript to be filled",
				"RETURNS": "<aArray> pointer to the array.",
				"DESCRIPTION": "This function will fill each element of an array named <aArray> with the value <xValue>. If specified, <nStart> denotes the beginning element to be filled and the array elements will continue to be filled for <nCount> positions.\nIf neither <nStart>/<nCount> specified, the value of <nStart> will be 1, and the value of <nCount> will be the value of `Len( <aArray> )`; thus, all subscript positions in the array <aArray> will be filled with the value of <xValue>.\nThis function will work on only a single dimension of <aArray>. If there are array pointer references within a subscript <aArray>, those values will be lost, since this function will overwrite those values with new values.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := { NIL, 0, 1, 2 }\nAFill( aArray, 5 )\n? hb_ValToExp( aArray )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AAdd(), AEval(), dbStruct()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AIns()",
				"ONELINER": "Insert a NIL value at an array subscript position.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "AIns( <aArray>, <nPos> ) --> aArray",
				"ARGUMENTS": "<aArray> Array name.\n<nPos> Subscript position in <aArray>",
				"RETURNS": "a reference to <aArray>.",
				"DESCRIPTION": "This function inserts a NIL value in the array named <aArray> at the <nPos>th position.\nAll array elements starting with the <nPos>th position will be shifted down one subscript position in the array list and the last item in the array will be removed completely. In other words, if an array element were to be inserted at the fifth subscript position, the element previously in the fifth position would now be located at the sixth position. The length of the array <aArray> will remain unchanged.\nNote: To avoid loosing last element, you can use hb_AIns() which supports auto-sizing of array.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := { \"Harbour\", \"is\", \"Power!\", \"!!!\" }\nAIns( aArray, 4 )\n? hb_ValToExp( aArray )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "hb_AIns(), AAdd(), ACopy(), ADel(), AEval(), AFill(), ASize()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Array()",
				"ONELINER": "Create an uninitialized array of specified length",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "Array( <nElements>[, <nElements>...] ) --> aArray",
				"ARGUMENTS": "<nElements> is the number of elements in the specified dimension.",
				"RETURNS": "<aArray> an array of specified dimensions.",
				"DESCRIPTION": "This function returns an uninitialized array with the length of <nElements>.\nNested arrays are uninitialized within the same array pointer reference if additional parameters are specified.\nEstablishing a memory variable with the same name as the array may destroy the original array and release the entire contents of the array. This depends, of course, on the data storage type of either the array or the variable with the same name as the array.\nCA-Cl*pper v5.x compliant except that arrays in Harbour can have an unlimited number of elements.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := Array( 10 ), tmp\nFOR tmp := 1 TO Len( aArray )\n   aArray[ tmp ] := Array( tmp )\nNEXT\n? hb_ValToExp( aArray )  // --> { { NIL }, { NIL, NIL }, ... }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AAdd(), ADel(), AFill(), AIns()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AScan()",
				"ONELINER": "Scan array elements for a specified condition",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "AScan( <aArray>, <xSearch>, [<nStart>], [<nCount>] ) --> nStoppedAt",
				"ARGUMENTS": "<aArray>    Array to be scanned.\n<xSearch>   Expression to search for in <aTarget>\n<nStart>    Beginning subscript position at which to start the search.\n<nCount>    Number of elements to scan with <aTarget>.",
				"RETURNS": "<nStoppedAt> A numeric value of subscript position where <xSearch> was found, or 0 if <xSearch> is not found.",
				"DESCRIPTION": "This function scan the content of array named <aArray> for the value of <xSearch>. The return value is the position in the array <aArray> in which <xSearch> was found. If it was not found, the return value will be 0.\n<nStart> is the position from which to start scanning. The default is 1. (1st element) <nCount>, if specified, is the number of array elements to be scanned. The default is all elements in the array <aArray>.\nIf <xSearch> is a code block, the operation of the function is slightly different. Each array subscript pointer reference is passed to the code block to be evaluated. The scanning routine will continue until the value obtained from the code block is a logical true (.T.) or until the end of the array has been reached.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"directry.ch\"\nLOCAL aDir := hb_vfDirectory( \"*.prg\" )\n? AScan( aDir,,, ;\n   {| aFile, nPos | HB_SYMBOL_UNUSED( nPos ), aFile[ F_NAME ] == \"test.prg\" } )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "This function is not CA-Cl*pper compatible. CA-Cl*pper AScan() is affected by the `SET EXACT ON`/`OFF` Condition",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AEval()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ASize()",
				"ONELINER": "Adjust the size of an array",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "ASize( <aArray>, <nLen> ) --> aArray",
				"ARGUMENTS": "<aArray> Name of array to be dynamically altered\n<nLen>  Numeric value representing the new size (i.e. number of elements)\nof <aArray>",
				"RETURNS": "The function returns a reference to <aArray>.",
				"DESCRIPTION": "This function will dynamically increase or decrease the size of <aArray> by adjusting the length of the array to <nLen> subscript positions.\nIf the length of the array <aArray> is shortened, the redundant elements are removed from the end of array. If the length of the array is lengthened the new elements are added to the end of array and they are assigned a NIL value.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := { 1 }\n? hb_ValToExp( aArray )  // --> { 1 }\nASize( aArray, 3 )\n? hb_ValToExp( aArray )  // --> { 1, NIL, NIL }\nASize( aArray, 1 )\n? hb_ValToExp( aArray )  // --> { 1 }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "If HB_COMPAT_C53 is defined, the function generates an Error, else it will return the array itself.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AAdd(), ADel(), AFill(), AIns()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ASort()",
				"ONELINER": "Sort an array",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "ASort( <aArray>, [<nStart>], [<nCount>], [<bSort>] ) --> aArray",
				"ARGUMENTS": "<aArray> Array to be sorted.\n<nStart> The first element to start the sort from, default is 1.\n<nCount> Number of elements starting from <nStart> to sort, default\nis all elements.\n<bSort> Code block for sorting order, default is ascending order `{| x, y | x < y }`. The code block should accept two parameters and must return .T. if the sort is in order, .F. if not.",
				"RETURNS": "<aArray> reference to the now sorted <aArray> or NIL if the passed <aArray> is not an array.",
				"DESCRIPTION": "ASort() sort all or part of a given array. If <bSort> is omitted, the function expect <aArray> to be one dimensional array containing single data type (one of: Character, Date, Logical, Numeric) and sort this array in ascending order: Character are sorted by their ASCII value, Dates are sorted chronologically, Logical put .F. values before .T., Numeric are sorted by their value. If <bSort> is specified, it is used to handle the sorting order. With each time the block is evaluate, two array elements are passed to the code block, and <bSort> must return a logical value that state if those elements are in order (.T.) or not (.F.). Using this block you can sort multidimensional array, descending orders or even (but why would you want to do that) sort array that contain different data type.\nCodeblock calling frequency and order differs from CA-Cl*pper, since Harbour uses a different (faster) sorting algorithm (quicksort).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aKeys, bSort, aPair\n\n// Sort numeric values in ascending order\naKeys := { 3, 1, 4, 42, 5, 9 }\nASort( aKeys )\n? hb_ValToExp( aKeys )  // --> { 1, 3, 4, 5, 9, 42 }\n\n// Sort character strings in descending lexical order\naKeys := { \"Ctrl\", \"Alt\", \"Delete\" }\nbSort := {| x, y | Upper( x ) > Upper( y ) }\nASort( aKeys,,, bSort )\n? hb_ValToExp( aKeys )  // --> { \"Delete\", \"Ctrl\", \"Alt\" }\n\n// Sort two-dimensional array according to 2nd element of each pair\naPair := { { \"Sun\", 8 }, { \"Mon\", 1 }, { \"Tue\", 57 }, { \"Wed\", -6 } }\nASort( aPair,,, {| x, y | x[ 2 ] < y[ 2 ] } )\n? hb_ValToExp( aPair )  // --> { { \"Wed\", -6 }, { \"Mon\", 1 }, { \"Sun\", 8 }, { \"Tue\", 57 } }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AScan(), Eval(), SORT"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ATail()",
				"ONELINER": "Returns the last element of an array",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "ATail( <aArray> ) --> xValue",
				"ARGUMENTS": "<aArray> is the array.",
				"RETURNS": "<xValue> the value of the last element in the array.",
				"DESCRIPTION": "This function return the value of the last element in the array named <aArray>. Same as `xValue := aArray[ Len( aArray ) ]`",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := { \"Harbour\", \"is\", \"Supreme\", \"Power\" }\n? ATail( aArray )  // --> \"Power\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "Len(), Array(), ASize(), AAdd()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_ADel()",
				"ONELINER": "Delete an element from an array.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "hb_ADel( <aArray>, [<nPos>], [<lAutoSize>] ) --> aArray",
				"ARGUMENTS": "<aArray> Name of array from which an element is to be removed.\n<nPos>  Subscript of the element to be removed. Default value: 1.\n<lAutoSize> Boolean flag specifying if the array will be resized or not.\nDefault value: .F. (no resize).",
				"RETURNS": "<aArray> an array pointer reference.",
				"DESCRIPTION": "This function deletes the element value (not the element itself!) stored in position <nPos> and shifts all the following values, one position up.\nIf <lAutoSize> is .T., then the last element is removed and the size of the array is decreased by one, otherwise the length of the array remains unchanged and a NIL value will be stored in the last element, just like in ADel().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := { \"Harbour\", \"is\", \"Power\" }\nhb_ADel( aArray, 2 )\n? hb_ValToExp( aArray )  // --> { \"Harbour\", \"Power\", NIL } - length unchanged\nhb_ADel( aArray, 2, .T. )\n? hb_ValToExp( aArray )  // --> a{ \"Harbour\", \"Power\" } - length decreased"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "ADel(), ACopy(), AIns(), AFill()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_AIns()",
				"ONELINER": "Inserts a value at an array subscript position and optionally increases the length of array.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "hb_AIns( <aArray>, [<nPos>], [<xValue>], [<lAutoSize>] ) --> aArray",
				"ARGUMENTS": "<aArray> The array name into which the value <xValue> will be inserted.\n<nPos> Subscript position in <aArray>. Default: 1st position\n<xValue> Value to be inserted\n<lAutoSize> Boolean flag to increase or not the size of <aArray>.\nDefault value: .F.",
				"RETURNS": "A reference to array <aArray>",
				"DESCRIPTION": "This function inserts <xValue> in the <nPos> position of the array, moving all the items one position down in the array list. If <lAutoSize> is .T., a new element will be added at the end of array, making room for the previous last element, which means the length of array will be increased by 1.\nIf <lAutoSize> is .F. (or is not passed) the function behaves like AIns(), that is, the size of <aArray> won't change and the last item of <aArray> will be lost.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aArray := { \"Harbour\", \"Power!\" }\nhb_AIns( aArray, 2, \"is\", .F. )\n? hb_ValToExp( aArray )  // --> { \"Harbour\", \"is\" }\nhb_AIns( aArray, 2, \"is\", .T. )\n? hb_ValToExp( aArray )  // --> { \"Harbour\", \"is\", \"Power!\" }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AIns(), AAdd(), ADel(), AFill(), ASize()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_AScan()",
				"ONELINER": "Scan array elements for a specified condition",
				"CATEGORY": "API",
				"SUBCATEGORY": "Array",
				"SYNTAX": "hb_AScan( <aArray>, <xSearch>, [<nStart>], [<nCount>], [<lExact>] ) --> nPosition",
				"ARGUMENTS": "<aArray>    Array to be scanned.\n<xSearch>   Expression to search for in <aArray>\n<nStart>    Beginning subscript position at which to start the search.\nDefault value: 1\n<nCount>    Number of elements to be scanned within <aArray>.\nDefault value: All elements.\n<lExact>    Boolean flag specifying if an \"Exact\" search will be\nperformed or not. Default value: .F.",
				"RETURNS": "<nPosition> A numeric value > 0 indicating the array position where <xSearch> was found, or 0 if nothing found.",
				"DESCRIPTION": "The function scans (left to right) for <xSearch> into <aArray> and returns <nPosition> of <aArray> in which <xSearch> was found or 0 (zero) if nothing found.\nIf <lExact> is .T., then an exact search will be performed. When <xSearch> is a code block, the operation of the function is slightly different. See AScan() for details.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL a := { \"there\", \"here\" }\nSet( _SET_EXACT, .F. )\n? AScan( a, \"he\" )            // --> 2\n? hb_AScan( a, \"he\",,, .F. )  // --> 2\n? hb_AScan( a, \"he\",,, .T. )  // --> 0"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Array",
				"SEEALSO": "AScan(), AEval()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "HBClass()",
				"ONELINER": "HBClass() is used in the creation of all classes",
				"CATEGORY": "API",
				"SUBCATEGORY": "Classes",
				"SYNTAX": "oClass := HBClass():New( \"TMyClass\" )\n\n  -or-\n\nHBClass() is usually accessed by defining a class with the commands\ndefined in hbclass.ch:\n\nCREATE CLASS HBGetList  // Calls HBClass() to create the HBGetList class\n   ...\nENDCLASS",
				"RETURNS": "An instance of the HBClass() Class. This special object's `:New()` method can then create the classes you define.",
				"DESCRIPTION": "HBClass() is a class that ... The class methods are as follows:\n`:New()`              Create a new instance of the class",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL oObject := HBClass():New( \"TMyClass\" )\n\noObject:End()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Object Oriented syntax in Harbour is compatible with CA-Cl*pper.\nHowever CA-Cl*pper only allowed creation of objects from a few standard classes, and did not let the programmer create new classes.\nIn 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.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Classes",
				"SEEALSO": "__objHasData(), CLASS"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Bin2I()",
				"ONELINER": "Convert signed short encoded bytes into Harbour numeric",
				"CATEGORY": "API",
				"SUBCATEGORY": "Conversion",
				"SYNTAX": "Bin2I( <cBuffer> ) --> nNumber",
				"ARGUMENTS": "<cBuffer> is a character string that contains 16-bit encoded signed short integer (least significant byte first). The first two bytes are taken into account, the rest if any are ignored.",
				"RETURNS": "Bin2I() return numeric integer (or 0 if <cBuffer> is not a string).",
				"DESCRIPTION": "Bin2I() is one of the low level binary conversion functions, those functions convert between Harbour numeric and a character representation of numeric value. Bin2I() take two bytes of encoded 16-bit signed short integer and convert it into standard Harbour numeric value.\nYou might ask what is the need for such functions, well, first of all it allow you to read/write information from/to a binary file (like extracting information from DBF header), it is also a useful way to share information from source other than Harbour (C for instance).\nBin2I() is the opposite of I2Bin()",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Show DBF last update date\n#include \"fileio.ch\"\nLOCAL hFile, cYear, cMonth, cDay\nIF ( hFile := hb_vfOpen( \"test.dbf\", FO_READ ) ) != NIL\n   hb_vfSeek( hFile, 1 )\n   cYear := cMonth := cDay := hb_BChar( 0 )\n   hb_vfRead( hFile, @cYear , hb_BLen( cYear ) )\n   hb_vfRead( hFile, @cMonth, hb_BLen( cMonth ) )\n   hb_vfRead( hFile, @cDay  , hb_BLen( cDay ) )\n   ? \"Last update:\", Bin2I( cYear ), Bin2I( cMonth ), Bin2I( cDay )\n   hb_vfClose( hFile )\nELSE\n   ? \"Cannot open file\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Conversion",
				"SEEALSO": "Bin2L(), Bin2U(), Bin2W(), I2Bin(), L2Bin(), W2Bin(), Word(), U2Bin()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Bin2L()",
				"ONELINER": "Convert signed long encoded bytes into Harbour numeric",
				"CATEGORY": "API",
				"SUBCATEGORY": "Conversion",
				"SYNTAX": "Bin2L( <cBuffer> ) --> nNumber",
				"ARGUMENTS": "<cBuffer> is a character string that contains 32-bit encoded signed long integer (least significant byte first). The first four bytes are taken into account, the rest if any are ignored.",
				"RETURNS": "Bin2L() return numeric integer (or 0 if <cBuffer> is not a string).",
				"DESCRIPTION": "Bin2L() is one of the low level binary conversion functions, those functions convert between Harbour numeric and a character representation of numeric value. Bin2L() take four bytes of encoded 32-bit signed long integer and convert it into standard Harbour numeric value.\nYou might ask what is the need for such functions, well, first of all it allow you to read/write information from/to a binary file (like extracting information from DBF header), it is also a useful way to share information from source other than Harbour (C for instance).\nBin2L() is the opposite of L2Bin()",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Show number of records in DBF\n#include \"fileio.ch\"\nLOCAL hFile, cBuffer := Space( 4 )\nIF ( hFile := hb_vfOpen( \"test.dbf\", FO_READ ) ) != NIL\n   hb_vfSeek( hFile, 4 )\n   hb_vfRead( hFile, @cBuffer, hb_BLen( cBuffer ) )\n   ? \"Number of records in file:\", Bin2L( cBuffer )\n   hb_vfClose( hFile )\nELSE\n   ? \"Cannot open file\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Conversion",
				"SEEALSO": "Bin2I(), Bin2U(), Bin2W(), I2Bin(), L2Bin(), W2Bin(), Word(), U2Bin()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Bin2W()",
				"ONELINER": "Convert unsigned short encoded bytes into Harbour numeric",
				"CATEGORY": "API",
				"SUBCATEGORY": "Conversion",
				"SYNTAX": "Bin2W( <cBuffer> ) --> nNumber",
				"ARGUMENTS": "<cBuffer> is a character string that contains 16-bit encoded unsigned short integer (least significant byte first). The first two bytes are taken into account, the rest if any are ignored.",
				"RETURNS": "Bin2W() return numeric integer (or 0 if <cBuffer> is not a string).",
				"DESCRIPTION": "Bin2W() is one of the low level binary conversion functions, those functions convert between Harbour numeric and a character representation of numeric value. Bin2W() take two bytes of encoded 16-bit unsigned short integer and convert it into standard Harbour numeric value.\nYou might ask what is the need for such functions, well, first of all it allow you to read/write information from/to a binary file (like extracting information from DBF header), it is also a useful way to share information from source other than Harbour (C for instance).\nBin2W() is the opposite of W2Bin()",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Show header length of a DBF\n#include \"fileio.ch\"\nLOCAL hFile, cBuffer := Space( 2 )\nIF ( hFile := hb_vfOpen( \"test.dbf\", FO_READ ) ) != NIL\n   hb_vfSeek( hFile, 8 )\n   hb_vfRead( hFile, @cBuffer, hb_BLen( cBuffer ) )\n   ? \"Length of DBF header in bytes:\", Bin2W( cBuffer )\n   hb_vfClose( hFile )\nELSE\n   ? \"Cannot open file\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Conversion",
				"SEEALSO": "Bin2I(), Bin2L(), Bin2U(), I2Bin(), L2Bin(), W2Bin(), Word(), U2Bin()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Descend()",
				"ONELINER": "Inverts an expression of string, logical, date or numeric type.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Conversion",
				"SYNTAX": "Descend( <xExp> ) --> xExpInverted",
				"ARGUMENTS": "<xExp> is any valid expression.",
				"RETURNS": "Inverted value of the same type as passed.",
				"DESCRIPTION": "This function converts an expression in his inverted form. It is useful to build descending indexes.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n// Seek for Smith in a descending index\ndbSeek( Descend( \"SMITH\" ) )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Conversion",
				"SEEALSO": "INDEX, SEEK"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "I2Bin()",
				"ONELINER": "Convert Harbour numeric into signed short encoded bytes",
				"CATEGORY": "API",
				"SUBCATEGORY": "Conversion",
				"SYNTAX": "I2Bin( <nNumber> ) --> cBuffer",
				"ARGUMENTS": "<nNumber> is a numeric value to convert (decimal digits are ignored).",
				"RETURNS": "I2Bin() return two bytes character string that contains 16-bit encoded signed short integer (least significant byte first).",
				"DESCRIPTION": "I2Bin() is one of the low level binary conversion functions, those functions convert between Harbour numeric and a character representation of numeric value. I2Bin() take a numeric integer value and convert it into two bytes of encoded 16-bit signed short integer.\nYou might ask what is the need for such functions, well, first of all it allow you to read/write information from/to a binary file (like extracting information from DBF header), it is also a useful way to share information from source other than Harbour (C for instance).\nI2Bin() is the opposite of Bin2I()",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Update DBF \"last update\" date\n#include \"fileio.ch\"\nLOCAL hFile, cYear, cMonth, cDay\nUSE test\n? \"Original update date is:\", LUpdate()\ndbCloseArea()\nIF ( hFile := hb_vfOpen( \"test.dbf\", FO_READWRITE ) ) != NIL\n   hb_vfSeek( hFile, 1 )\n   cYear  := I2Bin( 68 )\n   cMonth := I2Bin(  8 )\n   cDay   := I2Bin(  1 )\n   hb_vfWrite( hFile, cYear , 1 )  // write only the first byte\n   hb_vfWrite( hFile, cMonth, 1 )\n   hb_vfWrite( hFile, cDay  , 1 )\n   hb_vfClose( hFile )\n   USE test\n   ? \"New update date is:\", LUpdate()\n   dbCloseArea()\nELSE\n   ? \"Cannot open file\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Conversion",
				"SEEALSO": "Bin2I(), Bin2L(), Bin2U(), Bin2W(), L2Bin(), W2Bin(), Word(), U2Bin()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "L2Bin()",
				"ONELINER": "Convert Harbour numeric into signed long encoded bytes",
				"CATEGORY": "API",
				"SUBCATEGORY": "Conversion",
				"SYNTAX": "L2Bin( <nNumber> ) --> cBuffer",
				"ARGUMENTS": "<nNumber> is a numeric value to convert (decimal digits are ignored).",
				"RETURNS": "L2Bin() return four bytes character string that contains 32-bit encoded signed long integer (least significant byte first).",
				"DESCRIPTION": "L2Bin() is one of the low level binary conversion functions, those functions convert between Harbour numeric and a character representation of numeric value. L2Bin() take a numeric integer value and convert it into four bytes of encoded 32-bit signed long integer.\nYou might ask what is the need for such functions, well, first of all it allow you to read/write information from/to a binary file (like extracting information from DBF header), it is also a useful way to share information from source other than Harbour (C for instance).\nL2Bin() is the opposite of Bin2L()",
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Conversion",
				"SEEALSO": "Bin2I(), Bin2L(), Bin2U(), Bin2W(), I2Bin(), W2Bin(), Word(), U2Bin()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Word()",
				"ONELINER": "Converts double to integer values.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Conversion",
				"SYNTAX": "Word( <nDouble> ) --> nInteger",
				"ARGUMENTS": "<nDouble> is a numeric double value.",
				"RETURNS": "Word() return an integer in the range +-32767",
				"DESCRIPTION": "This function converts double values to integers to use within the CALL command",
				"STATUS": "Ready",
				"COMPLIANCE": "The CA-Cl*pper NG states that Word() will only work when used in CALL commands parameter list, otherwise it will return NIL, in Harbour it will work anywhere.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Conversion",
				"SEEALSO": "CALL"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__dbCopyStruct()",
				"ONELINER": "Create a new database based on current database structure",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "__dbCopyStruct( <cFileName>, [<aFieldList>] )",
				"ARGUMENTS": "<cFileName> is the name of the new database file to create. `.dbf` is the default extension if none is given.\n<aFieldList> is an array where each element is a field name. Names could be specified as uppercase or lowercase.",
				"DESCRIPTION": "__dbCopyStruct() create a new empty database file with a structure that is based on the currently open database in this work-area. If <aFieldList> is empty, the newly created file would have the same structure as the currently open database. Else, the new file would contain only fields that exactly match <aFieldList>.\n__dbCopyStruct() can be use to create a sub-set of the currently open database, based on a given field list.\n`COPY STRUCTURE` command is preprocessed into __dbCopyStruct() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Create a new file that contain the same structure\nUSE test\n__dbCopyStruct( \"mycopy.dbf\" )\n\n// Create a new file that contain part of the original structure\nLOCAL aList\nUSE test\naList := { \"NAME\" }\n__dbCopyStruct( \"onlyname.dbf\", aList )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "COPY STRUCTURE, COPY STRUCTURE EXTENDED, dbCreate(), dbStruct(), __dbCopyXStruct(), __dbCreate(), __dbStructFilter()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__dbCopyXStruct()",
				"ONELINER": "Copy current database structure into a definition file",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "__dbCopyXStruct( <cFileName> ) --> lSuccess",
				"ARGUMENTS": "<cFileName> is the name of target definition file to create. `.dbf` is the default extension if none is given.",
				"RETURNS": "__dbCopyXStruct() returns .F. if no database is *used* in the current work-area, .T. on success, or a run-time error if the file create operation had failed.",
				"DESCRIPTION": "__dbCopyXStruct() create a new database named <cFileName> with a pre-defined structure (also called \"structure extended file\"):\n<table>\n Field name   Type   Length   Decimals\n FIELD_NAME   C      10       0\n FIELD_TYPE   C      1        0\n FIELD_LEN    N      3        0\n FIELD_DEC    N      3        0\n</table>\nEach record in the new file contains information about one field in the original file. `CREATE FROM` could be used to create a database from the structure extended file.\nFor prehistoric compatibility reasons, Character fields which are longer than 255 characters are treated in a special way by writing part of the length in the FIELD_DEC according to the following formula (this is done internally):\n<fixed>\nFIELD->FIELD_DEC := Int( nLength / 256 )\nFIELD->FIELD_LEN :=      nLength % 256\n</fixed>\nLater if you want to calculate the length of a field you can use the following formula:\n<fixed>\nnLength := iif( FIELD->FIELD_TYPE == \"C\", ;\n                FIELD->FIELD_DEC * 256 + FIELD->FIELD_LEN, ;\n                FIELD->FIELD_LEN )\n</fixed>\n`COPY STRUCTURE EXTENDED` command is preprocessed into __dbCopyXStruct() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Open a database, then copy its structure to a new file,\n// Open the new file and list all its records\nUSE test\n__dbCopyXStruct( \"teststru\" )\nUSE teststru\nLIST"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "COPY STRUCTURE, COPY STRUCTURE EXTENDED, CREATE, CREATE FROM, dbCreate(), dbStruct(), __dbCopyStruct(), __dbCreate()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__dbCreate()",
				"ONELINER": "Create structure extended file or use one to create new file",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "__dbCreate( <cFileName>, [<cFileFrom>], [<cRDDName>], [<lNew>], [<cAlias>] ) --> lUsed",
				"ARGUMENTS": "<cFileName> is the target file name to create and then open. `.dbf` is the default extension if none is given.\n<cFileFrom> is an optional structure extended file name from which the target file <cFileName> is going to be built. If omitted, a new empty structure extended file with the name <cFileName> is created and opened in the current work-area.\n<cRDDName> is RDD name to create target with. If omitted, the default RDD is used.\n<lNew> is an optional logical expression, (.T.) opens the target file name <cFileName> in the next available unused work-area and makes it the current work-area. (.F.) opens the target file in the current work-area. Default value is (.F.). The value of <lNew> is ignored if <cFileFrom> is not specified.\n<cAlias> is an optional alias to USE the target file with. If not specified, alias is based on the root name of <cFileName>.",
				"RETURNS": "__dbCreate() returns (.T.) if there is database *used* in the current work-area (this might be the newly selected work-area), or (.F.) if there is no database *used*. Note that on success a (.T.) would be returned, but on failure you probably end up with a run-time error and not a (.F.) value.",
				"DESCRIPTION": "__dbCreate() works in two modes depending on the value of <cFileFrom>:\n<b>1)</b> If <cFileFrom> is empty or not specified a new empty structure extended file with the name <cFileName> is created and then opened in the current work-area (<lNew> is ignored). The new file has the following structure:\n<table>\n Field name   Type   Length   Decimals\n FIELD_NAME   C      10       0\n FIELD_TYPE   C      1        0\n FIELD_LEN    N      3        0\n FIELD_DEC    N      3        0\n</table>\nThe CREATE command is preprocessed into the __dbCopyStruct() function during compile time and uses this mode.\n<b>2)</b> If <cFileFrom> is specified, it is opened and assumed to be a structure extended file where each record contains at least the following fields (in no particular order): FIELD_NAME, FIELD_TYPE, FIELD_LEN and FIELD_DEC. Any other field is ignored. From this information the file <cFileName> is then created and opened in the current or new work-area (according to <lNew>), if this is a new work-area it becomes the current.\nFor prehistoric compatibility reasons, structure extended file Character fields which are longer than 255 characters should be treated in a special way by writing part of the length in the FIELD_DEC according to the following formula:\n<fixed>\nFIELD->FIELD_DEC := Int( nLength / 256 )\nFIELD->FIELD_LEN :=      nLength % 256\n</fixed>\n`CREATE FROM` command is preprocessed into __dbCopyStruct() function during compile time and use this mode.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// CREATE a new structure extended file, append some records and\n// then CREATE FROM this file a new database file\n\n__dbCreate( \"template\" )\ndbAppend()\nFIELD->FIELD_NAME := \"CHANNEL\"\nFIELD->FIELD_TYPE := \"N\"\nFIELD->FIELD_LEN  := 2\nFIELD->FIELD_DEC  := 0\ndbAppend()\nFIELD->FIELD_NAME := \"PROGRAM\"\nFIELD->FIELD_TYPE := \"C\"\nFIELD->FIELD_LEN  := 20\nFIELD->FIELD_DEC  := 0\ndbAppend()\nFIELD->FIELD_NAME := \"REVIEW\"\nFIELD->FIELD_TYPE := \"C\"      // this field is 1000 char long\nFIELD->FIELD_LEN  := 232      // 1000 % 256 = 232\nFIELD->FIELD_DEC  := 3        // 1000 / 256 = 3\ndbCloseArea()\n__dbCreate( \"TV_Guide\", \"template\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "COPY STRUCTURE, COPY STRUCTURE EXTENDED, CREATE, CREATE FROM, dbCreate(), dbStruct(), __dbCopyStruct(), __dbCopyXStruct()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__dbDelim()",
				"ONELINER": "Copies the contents of a database to a delimited text file or appends the contents of a delimited text file to a database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "__dbDelim( <lExport>, <xcFile>, [<xcDelim>], [<aFields>],\n[<bFor>], [<bWhile>], [<nNext>], [<nRecord>], <lRest>  )",
				"ARGUMENTS": "<lExport> If set to .T., copies records to a delimited file. If set to .F., append records from a delimited file.\n<xcFile> The name of the text file to copy to or append from. If a file extension is not specified, \".txt\" is used by default.\n<xcDelim> Either the character to use as the character field delimiter (only the first character is used). or `\"BLANK\"` (not case sensitive), which eliminates the character field delimiters and sets the field separator to a single space instead of a comma.\n<aFields> An array of field names to limit the processing to. If not specified, or if empty, then all fields are processed.\n<bFor> An optional code block containing a FOR expression that will reduce the number of records to be processed.\n<bWhile> An optional code block containing a WHILE expression that will reduce the number of records to be processed.\n<nNext> If present, but nRecord is not present, specifies to process this number of records, starting with the current record. A value of 0 means to process no records.\n<nRecord> If present, specifies the only record to process. A value of 0 means to process no records. Overrides <nNext> and <lRest>.\n<lRest> If <lExport> is .T., then if <lRest> is set to .T. and there are no <nRecord>, <nNext>, or <bWhile> arguments, processes all records from current to last.",
				"DESCRIPTION": "__dbDelim() copies all or selected contents of a database table to an SDF text file or appends all or selected contents of an SDF text file to a database table.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Copy delinquent accounts into a delimited text file.\nUSE accounts NEW\nCOPY TO overdue DELIMITED FOR ! Empty( accounts->duedate ) ;\n   .AND. Date() - accounts->duedate > 30\n// Import new customer records.\nUSE customer NEW\nAPPEND FROM customer DELIMITED"
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Database",
				"SEEALSO": "__dbSDF(), APPEND FROM, COPY TO"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__dbSDF()",
				"ONELINER": "Copies the contents of a database to an SDF text file or appends the contents of an SDF text file to a database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "__dbSDF( <lExport>, <xcFile>, [<aFields>],\n   [<bFor>], [<bWhile>], [<nNext>], [<nRecord>], <lRest> )",
				"ARGUMENTS": "<lExport> If set to .T., copies records to an SDF file. If set to .F., append records from an SDF file.\n<xcFile> The name of the text file to copy to or append from. If a file extension is not specified, \".txt\" is used by default.\n<aFields> An array of field names to limit the processing to. If not specified, or if empty, then all fields are processed.\n<bFor> An optional code block containing a FOR expression that will reduce the number of records to be processed.\n<bWhile> An optional code block containing a WHILE expression that will reduce the number of records to be processed.\n<nNext> If present, but <nRecord> is not present, specifies to process this number of records, starting with the current record. A value of 0 means to process no records.\n<nRecord> If present, specifies the only record to process. A value of 0 means to process no records. Overrides <nNext> and <lRest>.\n<lRest> If <lExport> is .T., then if <lRest> is set to .T. and there are no <nRecord>, <nNext>, or <bWhile> arguments, processes all records from current to last.",
				"DESCRIPTION": "__dbSDF() copies all or selected contents of a database table to an SDF text file or appends all or selected contents of an SDF text file to a database table.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Copy delinquent accounts into an SDF text file.\nUSE accounts NEW\nCOPY TO overdue SDF FOR ;\n   ! Empty( accounts->duedate ) .AND. ;\n   Date() - accounts->duedate > 30\n// Import new customer records.\nUSE customer NEW\nAPPEND FROM customer SDF"
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Database",
				"SEEALSO": "__dbDelim(), APPEND FROM, COPY TO"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__dbStructFilter()",
				"ONELINER": "Filter a database structure array",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "__dbStructFilter( <aStruct>, [<aFieldList>] ) --> aStructFiltered",
				"ARGUMENTS": "<aStruct> is a multidimensional array with database fields structure, which is usually the output from dbStruct(), where each array element has the following structure:\n<table>\n Position   Description    dbstruct.ch\n 1          cFieldName     DBS_NAME\n 2          cFieldType     DBS_TYPE\n 3          nFieldLength   DBS_LEN\n 4          nDecimals      DBS_DEC\n</table>\n<aFieldList> is an array where each element is a field name. Names could be specified as uppercase or lowercase.",
				"RETURNS": "__dbStructFilter() return a new multidimensional array where each element is in the same structure as the original <aStruct>, but the array is built according to the list of fields in <aFieldList>. If <aFieldList> is empty, __dbStructFilter() return reference to the original <aStruct> array.",
				"DESCRIPTION": "__dbStructFilter() can be use to create a sub-set of a database structure, based on a given field list.\nNote that field names in <aStruct> _must_ be specified in uppercase or else no match would be found.\n`SET EXACT` has no effect on the return value.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\nLOCAL aStruct, aList, aRet\naStruct := { ;\n   { \"CODE\",  \"N\",  4, 0 }, ;\n   { \"NAME\",  \"C\", 10, 0 }, ;\n   { \"PHONE\", \"C\", 13, 0 }, ;\n   { \"IQ\",    \"N\",  3, 0 } }\naList := { \"IQ\", \"NAME\" }\naRet := __dbStructFilter( aStruct, aList )\n                   // { { \"IQ\", \"N\", 3, 0 }, { \"NAME\", \"C\", 10, 0 } }\n\naRet := __dbStructFilter( aStruct, {} )\n? aRet == aStruct  // .T.\n\naList := { \"iq\", \"NOTEXIST\" }\naRet := __dbStructFilter( aStruct, aList )\n                   // { { \"IQ\", \"N\", 3, 0 } }\n\naList := { \"NOTEXIST\" }\naRet := __dbStructFilter( aStruct, aList )  // --> {}\n\n// Create a new file that contain part of the original structure\nLOCAL aStruct, aList, aRet\nUSE test\naStruct := dbStruct()\naList := { \"NAME\" }\ndbCreate( \"onlyname.dbf\", __dbStructFilter( aStruct, aList ) )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "__dbStructFilter() is a Harbour extension. CA-Cl*pper has an internal undocumented function named __FLedit() that does exactly the same thing. The new name gives a better description of what this function does.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is dbstruct.ch\nLibrary is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbCreate(), dbStruct(), __dbCopyStruct(), __FLedit()*"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__FLedit()*",
				"ONELINER": "Filter a database structure array",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "__FLedit( <aStruct>, [<aFieldList>] ) --> aStructFiltered",
				"ARGUMENTS": "<aStruct> is a multidimensional array with database fields structure, which is usually the output from dbStruct(), where each array element has the following structure:\n<table>\n Position   Description    dbstruct.ch\n 1          cFieldName     DBS_NAME\n 2          cFieldType     DBS_TYPE\n 3          nFieldLength   DBS_LEN\n 4          nDecimals      DBS_DEC\n</table>\n<aFieldList> is an array where each element is a field name. Names could be specified as uppercase or lowercase.",
				"RETURNS": "__FLedit() return a new multidimensional array where each element is in the same structure as the original <aStruct>, but the array is built according to the list of fields in <aFieldList>. If <aFieldList> is empty, __FLedit() return reference to the original <aStruct> array.",
				"DESCRIPTION": "__FLedit() can be use to create a sub-set of a database structure, based on a given field list.\nNote that field names in <aStruct> _must_ be specified in uppercase or else no match would be found.\n`SET EXACT` has no effect on the return value.\n__FLedit() is a compatibility function and it is synonym for __dbStructFilter() which does exactly the same.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\nLOCAL aStruct, aList, aRet\naStruct := { ;\n   { \"CODE\",  \"N\",  4, 0 }, ;\n   { \"NAME\",  \"C\", 10, 0 }, ;\n   { \"PHONE\", \"C\", 13, 0 }, ;\n   { \"IQ\",    \"N\",  3, 0 } }\naList := { \"IQ\", \"NAME\" }\naRet := __FLedit( aStruct, aList )\n                   // { { \"IQ\", \"N\", 3, 0 }, { \"NAME\", \"C\", 10, 0 } }\n\naRet := __FLedit( aStruct, {} )\n? aRet == aStruct  // .T.\n\naList := { \"iq\", \"NOTEXIST\" }\naRet := __FLedit( aStruct, aList )\n                   // { { \"IQ\", \"N\", 3, 0 } }\n\naList := { \"NOTEXIST\" }\naRet := __FLedit( aStruct, aList )  // {}\n\n// Create a new file that contain part of the original structure\nLOCAL aStruct, aList, aRet\nUSE test\naStruct := dbStruct()\naList := { \"NAME\" }\ndbCreate( \"onlyname.dbf\", __FLedit( aStruct, aList ) )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper has internal undocumented function named __FLedit(), in Harbour we name it __dbStructFilter(). The new name gives a better description of what this function does. In Harbour __FLedit() simply calls __dbStructFilter() and therefor the latter is the recommended function to use.\nThis function is only visible if src/rdd/dbstrux.prg was compiled with the HB_CLP_UNDOC flag.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is dbstruct.ch\nLibrary is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbCreate(), dbStruct(), __dbCopyStruct(), __dbStructFilter()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AFields()*",
				"ONELINER": "Fills referenced arrays with database field information",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "AFields( <aNames>, [<aTypes>], [<aLen>], [<aDecs>] ) --> nFields",
				"ARGUMENTS": "<aNames>  Array of field names\n<aTypes>  Array of field names\n<aLens>  Array of field names\n<aDecs>  Array of field names",
				"RETURNS": "<nFields> Number of fields in a database or work area",
				"DESCRIPTION": "This function will fill a series of arrays with field names, field types, field lengths, and number of field decimal positions for the currently selected or designed database. Each array parallels the different descriptors of a file's structure. The first array will consist of the names of the fields in the current work area. All other arrays are optional and will be filled with the corresponding data. This function will return zero if no parameters are specified or if no database is available in the current work area. Otherwise, the number of fields or the length of the shortest array argument, whichever is smaller, will be returned.\nAFields() is a compatibility function, it is superseded by dbStruct() which returns one multidimensional array.\nNOTE: The destination arrays must be initialized to a given size,\nusually FCount(), before calling this function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "PROCEDURE Main()\n\n   LOCAL nCount\n\n   USE test\n\n   nCount := FCount()\n   ? \"Number of fields:\", nCount\n   PrintFields( nCount )  // Information for all fields\n   PrintFields( 4 )       // Information for first 4 fields\n\n   RETURN\n\nSTATIC PROCEDURE PrintFields( nCount )\n\n   LOCAL aNames  := Array( nCount )\n   LOCAL aTypes  := Array( nCount )\n   LOCAL aLens   := Array( nCount )\n   LOCAL aDecs   := Array( nCount )\n\n   LOCAL nFields := AFields( aNames, aTypes, aLens, aDecs ), i\n\n   ? \"Number of items:\", nFields\n   FOR tmp := 1 TO nFields\n      ? tmp, ;\n         PadR( aNames[ tmp ], 12 ), ;\n         aTypes[ tmp ], ;\n         aLens[ tmp ], ;\n         aDecs[ tmp ]\n   NEXT\n\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbStruct()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Alias()",
				"ONELINER": "Returns the alias name of a work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Alias( [<nWorkArea>] ) --> cWorkArea",
				"ARGUMENTS": "<nWorkArea> Number of a work area",
				"RETURNS": "<cWorkArea> Name of alias",
				"DESCRIPTION": "This function returns the alias of the work area indicated by <nWorkArea>. If <nWorkArea> is not provided, the alias of the current work area is returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test\nSELECT 0\n? iif( Alias() == \"\", \"No Name\", Alias() )\n? test->( Alias() )\n? Alias( 1 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Dbf()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Bof()",
				"ONELINER": "Test for the beginning-of-file condition",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Bof() --> lBegin",
				"RETURNS": "Bof() Logical true (.T.) or false (.F.)",
				"DESCRIPTION": "This function determines if the beginning of the file marker has been reached. If so, the function will return a logical true (.T.); otherwise, a logical false (.F.) will be returned. By default, Bof() will apply to the currently selected database unless the function is preceded by an alias",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? \"Is Bof()\", Bof()\ndbGoTop()\nDO WHILE ! Bof()\n   dbSkip( -1 )\nENDDO\n? \"Is Bof()\", Bof()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Eof(), Found(), LastRec()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbAppend()",
				"ONELINER": "Appends a new record to a database file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbAppend( [<lLock>] ) --> NIL",
				"ARGUMENTS": "<lLock> Toggle to release record locks",
				"RETURNS": "dbAppend() always returns NIL",
				"DESCRIPTION": "This function add a new record to the end of the database in the selected or aliased work area. All fields in that database will be given empty data values - character fields will be filled with blank spaces, date fields with hb_SToD(), numeric fields with 0, logical fields with .F., and memo fields with NULL bytes. The header of the database is not updated until the record is flushed from the buffer and the contents are written to the disk.\nUnder a networking environment, dbAppend() performs an additional operation: It attempts to lock the newly added record. If the database file is currently locked or if a locking assignment is made to `LastRec() + 1`, NetErr() will return a logical true (.T.) immediately after the dbAppend() function. This function does not unlock the locked records.\nIf <lLock> is passed a logical true (.T.) value, it will release the record locks, which allows the application to maintain multiple record locks during an appending operation. The default for this parameter is a logical false (.F.).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cName := \"Harbour\", nAge := 15\nUSE test\ntest->( dbAppend() )\ntest->first := cName\ntest->age   := nAge"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbUnlock(), dbUnlockAll()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbClearFilter()",
				"ONELINER": "Clears the current filter condition in a work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbClearFilter() --> NIL",
				"RETURNS": "dbClearFilter() always returns NIL",
				"DESCRIPTION": "This function clears any active filter conduction for the current or selected work area.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test\nSET FILTER TO hb_LeftEq( test->first, \"An\" )\ndbGoTop()\ndbEval( {|| QOut( test->first ) } )\ndbClearFilter()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbSetFilter(), dbFilter()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbCloseAll()",
				"ONELINER": "Close all open files in all work areas.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbCloseAll() --> NIL",
				"RETURNS": "dbCloseAll() always return NIL",
				"DESCRIPTION": "This function close all open databases and all associated indexes. In addition, it closes all format files and moves the work area pointer to the first position",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbEdit()\nUSE test1 NEW\ndbEdit()\ndbCloseAll()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbUseArea(), dbCloseArea()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbCloseArea()",
				"ONELINER": "Close a database file in a work area.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbCloseArea()",
				"DESCRIPTION": "This function  will close any database open in the selected or aliased work area.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test\ndbEdit()\ntest->( dbCloseArea() )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbUseArea(), dbCloseAll()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbCommit()",
				"ONELINER": "Updates all index and database buffers for a given work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbCommit()",
				"DESCRIPTION": "This function updates all of the information for a give, selected, or active work area. This operation includes all database and index buffers for that work area only. This function does not update all open work areas.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL GetList := {}\nLOCAL cName := Space( 40 )\nLOCAL nAge := 0\n\nUSE test EXCLUSIVE NEW\n\n@ 10, 10 GET cName\n@ 11, 10 GET nAge\nREAD\n\nIF Updated()\n   dbAppend()\n   test->first := cName\n   test->age   := nAge\n   dbCommit()\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbCloseAll(), dbCommitAll(), dbUnlock()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbCommitAll()",
				"ONELINER": "Flushes the memory buffer and performs a hard-disk write",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbCommit()",
				"DESCRIPTION": "This function performs a hard-disk write for all work areas. Before the disk write is performed, all buffers are flushed. open work areas.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\nLOCAL GetList := {}\nLOCAL cName := Space( 40 )\nLOCAL nId := 0\n\nUSE test EXCLUSIVE NEW\nUSE testid NEW INDEX testid\n\n@ 10, 10 GET cName\n@ 11, 10 GET nId\nREAD\n\nIF Updated()\n   dbAppend()\n   test->first := cName\n   test->Id    := nId\n   IF ! testid->( dbSeek( nId ) )\n      testid->( dbAppend() )\n      testid->Id := nId\n   ENDIF\nENDIF\ndbCommitAll()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbCloseAll(), dbCommit(), dbUnlock()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbCreate()",
				"ONELINER": "Creates an empty database from a array.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbCreate( <cFile>, <aStruct>, [<cRDD>], [<lKeepOpen>], [<cAlias>],\n          [<cDelimArg>], [<cCodePage>], [<nConnection>] )",
				"ARGUMENTS": "<cFile>     Name of database file to be create\n<aStruct>   Name of a multidimensional array that contains the\ndatabase structure\n<cRDD>      Name of the RDD\n<lKeepOpen> 3-way toggle to Open the file in New or Current work area:\n<table-noheader>\n                 NIL     The file is not opened.\n                 True    It is opened in a New area.\n                 False   It is opened in the current area.\n</table>\n<cAlias>    Name of database Alias",
				"DESCRIPTION": "This function creates the database file specified as <cDatabase> from the multidimensional array <aStruct>. If no file extension is use with <cDatabase> the .dbf extension is assumed. The array specified in <aStruct> must follow a few guidelines when being built prior to a call to dbCreate():\n- All subscripts values in the second dimension must be set to proper values\n- The fourth subscript value in the second dimension - which contains\nthe decimal value-must he specified. even 1kw non-numeric fields.\n- The second subscript value in the second dimension-which contains\nthe field data type-must contain a proper value: C, D, L, M or N It is possible to use additional letters for clarity (e.g., 'Numeric' for 'N'): however, the first letter of this array element must be a proper value.\nThe 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 65519 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.\nThe <cRDD> parameter specifies the name of the Replaceable Database Driver to use to create the database. If it is not specified, then the Replaceable Database Driver in the current work area is used.\nThe <lKeepOpen> parameter specifies if the already created database is to be opened, and where.  If NIL, the file is not opened. If True, it is opened in a New area, and if False it is opened in the current area (closing any file already occupying that area). The <cAlias> parameter specifies the alias name for the new opened database.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aStruct := { ;\n   { \"CHARACTER\", \"C\", 25, 0 }, ;\n   { \"NUMERIC\",   \"N\",  8, 0 }, ;\n   { \"DOUBLE\",    \"N\",  8, 2 }, ;\n   { \"DATE\",      \"D\",  8, 0 }, ;\n   { \"LOGICAL\",   \"L\",  1, 0 }, ;\n   { \"MEMO1\",     \"M\", 10, 0 }, ;\n   { \"MEMO2\",     \"M\", 10, 0 } }\n\nREQUEST DBFCDX\n\n? dbCreate( \"testdbf\", aStruct, \"DBFCDX\", .T., \"MYALIAS\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "This function is not CA-Cl*pper compliant",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd\nHeader is dbstruct.ch",
				"TAGS": "API, Database",
				"SEEALSO": "AFields()*, dbStruct()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbDelete()",
				"ONELINER": "Mark a record for deletion in a database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbDelete()",
				"DESCRIPTION": "This function marks a record for deletion in the selected or aliased work area. If the DELETED setting is on, the record will still be visible until the record pointer in that work area is moved to another record.\nIn a networking situation, this function requires that the record be locked prior to issuing the dbDelete() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nAge := 50\nUSE test NEW\nINDEX ON field->age TO test\nIF dbSeek( nAge ) .AND. RLock()\n   dbDelete()\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbRecall()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbFilter()",
				"ONELINER": "Return the filter expression in a work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbFilter() --> cFilter",
				"RETURNS": "dbFilter() returns the filter expression.",
				"DESCRIPTION": "This function return the expression of the `SET FILTER TO` command for the current or designated work area. If no filter condition is present, a null string will be returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test INDEX test NEW\nSET FILTER TO field->first = \"Harbour\"\nUSE testid INDEX testid NEW\nSET FILTER TO field->age == 25\nSELECT test\n\n? dbFilter()\n? testid->( dbFilter() )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbRelation(), dbRSelect()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbGoBottom()",
				"ONELINER": "Moves the record pointer to the bottom of the database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbGoBottom()",
				"DESCRIPTION": "This function moves the record pointer in the selected or aliased work area to the end of the file. The position of the record pointer is affected by the values in the index key or by an active FILTER condition. Otherwise, if no index is active or if no filter condition is present, the value of the record pointer will be LastRec().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test\ndbGoTop()\n? RecNo()\ndbGoBottom()\n? RecNo()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Bof(), Eof(), dbSkip(), dbSeek(), dbGoTop()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbGoto()",
				"ONELINER": "Position the record pointer to a specific location.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbGoto( <xRecordNumber> )",
				"ARGUMENTS": "<xRecordNumber> Record number or unique identity",
				"DESCRIPTION": "This function places the record pointer, if working with a .dbf file, in selected or aliased work area at the record number specified by <xRecordNumber>. The position is not affected by an active index or by any environmental SET condition.\nThe parameter <xRecordNumber> may be something other than a record number. In some data formats, for example, the value of <xRecordNumber> is a unique primary key while in other formats, <xRecordNumber> could be an array offset if the data set was an array.\nIssuing a `dbGoto( RecNo() )` call in a network environment will refresh the database and index buffers. This is the same as a `dbSkip( 0 )` call.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// The following example uses dbGoto() to iteratively process\n// every fourth record:\n\ndbUseArea( .T., \"DBFNTX\", \"sales\", \"sales\", .T. )\n\n// toggle every fourth record\nDO WHILE ! Eof()\n   dbGoto( RecNo() + 4 )\n   sales->Group := \"Bear\"\nENDDO"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Bof(), Eof(), dbGoTop(), dbGoBottom(), dbSeek(), dbSkip()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbGoTop()",
				"ONELINER": "Moves the record pointer to the top of the database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbGoTop()",
				"DESCRIPTION": "This function moves the record pointer in the selected or aliased work area to the top of the file. The position of the record pointer is affected by the values in the index key or by an active FILTER condition. Otherwise, if no index is active or if no filter condition is present, the value of RecNo() will be 1.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test\ndbGoTop()\n? RecNo()\ndbGoBottom()\n? RecNo()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Bof(), Eof(), dbSkip(), dbSeek(), dbGoBottom()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbRecall()",
				"ONELINER": "Recalls a record previously marked for deletion.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbRecall()",
				"DESCRIPTION": "This function unmarks those records marked for deletion and reactivates them in the aliased or selected work area. If a record is DELETED and the DELETED setting is on, the record will still be visible for a dbRecall() provided that the database record pointer has not been skipped. Once a record marked for deletion with the DELETE setting ON has been skipped, it no longer can be brought back with dbRecall().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbGoto( 10 )\ndbDelete()\n? Deleted()\ndbRecall()\n? Deleted()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbDelete()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbRLock()",
				"ONELINER": "This function locks the record based on identity",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbRLock( [<xIdentity>] ) --> lSuccess",
				"ARGUMENTS": "<xIdentity> Record identifier",
				"RETURNS": "dbRLock() returns a logical true (.T.) if lock was successful",
				"DESCRIPTION": "This function attempts to lock a record which is identified by <xIdentity> in the active data set. If the lock is successful the function will return a logical true (.T.) value; otherwise a logical false (.F.) will be returned. If <xIdentity> is not passed it will be assumed to lock the current active record/data item.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nRecNo\nUSE test NEW\nFOR nRecNo := 1 TO LastRec()\n   IF ! dbRLock()\n      dbUnlock()\n   ENDIF\nNEXT"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbUnlock(), dbUnlockAll(), FLock(), RLock()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbRLockList()",
				"ONELINER": "This function return a list of locked records in the database work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbRLockList() --> aRecordLocks",
				"RETURNS": "<aRecordList> is an array of lock records",
				"DESCRIPTION": "This function will return an array of locked records in a given and active work area. If the return array is an empty array (meaning no elements in it), then there are no locked records in that work area.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nRecNo\nUSE test NEW\ndbGoto( 10 )\n? RLock()\ndbGoto( 100 )\n? RLock()\nFOR EACH nRecNo IN dbRLockList()\n   ? nRecNo\nNEXT"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "RLock(), dbRLock(), dbRUnlock()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbRUnlock()",
				"ONELINER": "Unlocks a record based on its identifier",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbRUnlock( [<xIdentity>] )",
				"ARGUMENTS": "<xIdentity> Record identifier, typically a record number",
				"DESCRIPTION": "This function will attempt to unlock the record specified as <xIdentity>, which in a .dbf format is the record number. If not specified, them the current active record/data item will be unlocked",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbGoto( 10 )\nIF RLock()\n   ? test->age\n   dbRUnlock()\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "RLock(), dbRLock(), dbRLockList()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbSeek()",
				"ONELINER": "Searches for a value based on an active index.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbSeek( <expKey>, [<lSoftSeek>], [<lFindLast>] ) --> lFound",
				"ARGUMENTS": "<expKey> Any expression\n<lSoftSeek> Toggle SOFTSEEK condition\n<lFindLast> is an optional logical value that set the current record position to the last record if successful",
				"RETURNS": "dbSeek() returns logical true (.T.) if found, otherwise false",
				"DESCRIPTION": "This function searches for the first record in a database file whose index key matches <expKey>. If the item is found, the function will return a logical true (.T.), the value of Found() will be a logical true (.T.), and the value of Eof() will be a logical false (.F.). If no item is found. then the function will return a logical false, the value of Found() will be a logical false (.F.), and the value of Eof() will be a logical true (.T.).\nThis function always \"rewinds\" the database pointer and starts the search from the top of the file.\nIf the SOFTSEEK flag is on or if <lSoftSeek> is set to a logical true (.T.) the value of Found() will be a logical false and Eof() will be false if there is an item in the index key with a greater value than the key expression <expKey>; at this point the record pointer will position itself on that record. However, if there is no greater key in the index, Eof() will return a logical true (.T.) value. If <lSoftSeek> is not passed, the function will look to the internal status of SOFTSEEK before performing the operation. The default of <lSoftSeek> is a logical false (.F.)",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "PROCEDURE Main()\n\n   LOCAL nAge\n\n   USE test NEW\n   INDEX ON field->age TO test\n   dbGoto( 10 )\n   nAge := test->age\n   dbGoTop()\n   IF dbSeek( nAge )\n      ? test->first\n   ENDIF\n\n   RETURN\n\nSTATIC PROCEDURE EmployeeLookup()\n\n   LOCAL cName\n\n   ACCEPT \"Employee name: \" TO cName\n   IF Employee->( dbSeek( cName ) )\n      Employee->( ViewRecord() )\n   ELSE\n      ? \"Not found\"\n   ENDIF\n\n   RETURN\n\nSTATIC PROCEDURE ViewRecord()\n\n   ? field->name\n\n   RETURN"
				},
				"STATUS": "Started",
				"COMPLIANCE": "dbSeek() is  Compatible with CA-Cl*pper 5.3",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbGoBottom(), dbGoTop(), dbSkip(), Eof(), Bof(), Found()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbSelectArea()",
				"ONELINER": "Change to another work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbSelectArea( <xArea> ) --> NIL",
				"ARGUMENTS": "<xArea> Alias or work area",
				"DESCRIPTION": "This function moves the Harbour internal primary focus to the work area designated by <xArea>. If <xArea> is numeric, then it will select the numeric work area; if <xArea> is character, then it will select the work area with the alias name.\n`dbSelectArea( 0 )` will select the next available and unused work area. Up to 65534 work areas are supported. Each work area has its own alias and record pointer, as well as its own Found(), dbFilter(), dbRSelect() and dbRelation() function values.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nAge\nUSE test NEW\nCOPY TO test1\nUSE test1 NEW\nINDEX ON field->age TO test1\ndbSelectArea( \"test\" )\ndbGoto( 100 )\n? nAge := field->age\ndbSelectArea( \"test1\" )\nIF dbSeek( nAge )\n   ? field->first\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbUseArea(), Select()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbSetDriver()",
				"ONELINER": "Establishes the RDD name for the selected work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbSetDriver( [<cDriver>] ) --> cCurrentDriver",
				"ARGUMENTS": "<cDriver> Optional database driver name",
				"RETURNS": "dbSetDriver() returns the name of active driver",
				"DESCRIPTION": "This function returns the name of the current database driver for the selected work area. The default will be \"DBFNTX\". If specified, <cDriver> contains the name of the database driver that should be used to activate and manage the work area. If the specified driver is not available, this function will have no effect.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? dbSetDriver( \"DBFNSX\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbUseArea()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbSetFilter()",
				"ONELINER": "Establishes a filter condition for a work area.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbSetFilter( <bCondition>, [<cCondition>] )",
				"ARGUMENTS": "<bCondition> Code block expression for filtered evaluation.\n<cCondition> Optional character expression of code block.",
				"DESCRIPTION": "This function masks a database so that only those records that meet the condition prescribed by the expression in the code block <bCondition> and literally expressed as <cCondition> are visible. If <cCondition> is not passed to this function, then the dbFilter() function will return an empty string showing no filter in that work area which in fact, would be not correct.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbSetFilter( {|| test->age > 30 }, \"test->age > 30\" )\ndbGoTop()\n? RecNo()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbFilter(), dbClearFilter()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbSkip()",
				"ONELINER": "Moves the record pointer in the selected work area.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbSkip( [<nRecords>] )",
				"ARGUMENTS": "<nRecords> Numbers of records to move record pointer.",
				"DESCRIPTION": "This function moves the record pointer <nRecords> in the selected or aliased work area. The default value for <nRecords> will be 1. A `dbSkip( 0 )` will flush and refresh the internal database buffer and make any changes made to the record visible without moving the record pointer in either direction.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbGoTop()\nDO WHILE ! Eof()\n   ? test->age, test->first\n   dbSkip()\nENDDO"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Bof(), dbGoBottom(), dbGoTop(), dbSeek(), Eof()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbStruct()",
				"ONELINER": "Creates a multidimensional array of a database structure.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbStruct() --> aStruct",
				"RETURNS": "dbStruct() returns an array pointer to database structure",
				"DESCRIPTION": "This function returns a multidimensional array. This array has array pointers to other arrays, each of which contains the characteristic of a field in the active work area. The length of this array is based in the number of fields in that particular work area. In other words, `Len( dbStruct() )` is equal to the value obtained from FCount(). Each subscript position",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"dbstruct.ch\"\nLOCAL field\nUSE test NEW\nFOR EACH field IN dbStruct()\n   ? field[ DBS_NAME ]\nNEXT"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd\nHeader is dbstruct.ch",
				"TAGS": "API, Database",
				"SEEALSO": "AFields()*"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbUnlock()",
				"ONELINER": "Unlock a record or release a file lock",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbUnlock()",
				"DESCRIPTION": "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 databases.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nAge := 30\nUSE test NEW\nINDEX ON field->age TO test\nIF test->( dbSeek( nAge ) )\n   IF test->( RLock() )\n      dbDelete()\n   ELSE\n      dbUnlock()\n   ENDIF\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbUnlockAll(), FLock(), RLock()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbUnlockAll()",
				"ONELINER": "Unlocks all records and releases all file locks in all work areas.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbUnlockAll()",
				"DESCRIPTION": "This function will remove all file and record locks in all work area.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nAge := 50\nUSE test NEW\nINDEX ON field->age TO test\nIF test->( dbSeek( nAge ) )\n   IF test->( RLock() )\n      dbDelete()\n   ELSE\n      dbUnlock()\n   ENDIF\nELSE\n   dbUnlockAll()\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbUnlock(), FLock(), RLock()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "dbUseArea()",
				"ONELINER": "Opens a work area and uses a database file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "dbUseArea( [<lNewArea>], [<cDriver>], <cName>, [<xcAlias>],\n[<lShared>], [<lReadonly>] )",
				"ARGUMENTS": "<lNewArea>  A optional logical expression for the new work area\n<cDriver>   Database driver name\n<cName>     File Name\n<xcAlias>   Alias name\n<lShared>   Shared/exclusive status flag\n<lReadonly> Read-write status flag.",
				"DESCRIPTION": "This function opens an existing database named <cName> in the current work area. If <lNewArea> is set to a logical true (.T.) value, then the database <cName> will be opened in the next available and unused work area. The default value of <lNewArea> is a logical false (.F.). If used, <cDriver> is the name of the database driver associated with the file <cName> that is opened. The default for this will be the value of dbSetDriver().\nIf used, <xcAlias> contains the alias name for that work area, If not specified, the root name of the database specified in <cName> will be used.\nIf <lShared> is set to a logical true (.T.) value, the database that is specified in <cName> will be opened by the user *exclusively*. Thus locking it from all other nodes or users on the network. If <lShared> is set to a logical false (.F.) value, then the database will be in SHARED mode. If <lShared> is not passed, then the function will turn to the internal setting of SET EXCLUSIVE to determine a setting.\nIf <lReadOnly> 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": {
					"_preformatted": "yes",
					"__text": "? dbUseArea( .T.,, \"test\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbCloseArea(), dbSetDriver(), Select(), Set()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Dbf()",
				"ONELINER": "Alias name of a work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Dbf() --> cWorkArea",
				"RETURNS": "<cWorkArea> Name of alias",
				"DESCRIPTION": "This function returns the same alias name of the currently selected work area.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test\nSELECT 0\n? iif( Dbf() == \"\", \"No Name\", Dbf() )\n? test->( Dbf() )\n? Alias( 1 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Alias()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Deleted()",
				"ONELINER": "Tests the record's deletion flag.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Deleted() --> lDeleted",
				"ARGUMENTS": "(This command has no arguments)",
				"RETURNS": "Deleted() return a logical true (.T.) or false (.F.).",
				"DESCRIPTION": "This function returns a logical true (.T.) if the current record in the selected or designated work area has been marked for deletion. If not, the function will return a logical false (.F.).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbGoto( 10 )\ndbDelete()\n? \"Is Record Deleted\", test->( Deleted() )\ndbRecall()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbDelete()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Eof()",
				"ONELINER": "Test for end-of-file condition.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Eof() --> lEnd",
				"ARGUMENTS": "(This command has no arguments)",
				"RETURNS": "<lEnd> A logical true (.T.) or false (.F.)",
				"DESCRIPTION": "This function determines if the end-of-file marker has been reached. If it has, the function will return a logical true (.T.); otherwise a logical false (.F.) will be returned",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbGoTop()\n? \"Is Eof()\", Eof()\ndbGoBottom()\nDO WHILE ! Eof()\n   dbSkip()\nENDDO\n? \"Is Eof()\", Eof()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Bof(), Found(), LastRec()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FCount()",
				"ONELINER": "Counts the number of fields in an active database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "FCount() --> nFields",
				"RETURNS": "<nFields> Return the number of fields",
				"DESCRIPTION": "This function returns the number of fields in the current or designated work area. If no database is open in this work area, the function will return 0.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? \"This database has\", hb_ntos( test->( FCount() ) ), \"field(s)\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "FieldName(), Type()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FieldGet()",
				"ONELINER": "Obtains the value  of a specified field",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "FieldGet( <nField> ) --> ValueField",
				"ARGUMENTS": "<nField> Is the numeric field position",
				"RETURNS": "<ValueField>  Any expression",
				"DESCRIPTION": "This function returns the value of the field at the <nField>th location in the selected or designed work area. If the value in <nField> does not correspond to n available field position in this work area, the function will return a NIL data type.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? test->( FieldGet( 1 ) )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "FieldPut()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FieldName()",
				"ONELINER": "Return the name of a field at a numeric field location.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "FieldName()/Field( <nPosition> ) --> cFieldName",
				"ARGUMENTS": "<nPosition> Field order in the database.",
				"RETURNS": "<cFieldName> returns the field name.",
				"DESCRIPTION": "This function return the name of the field at the <nPosition>th position. If the numeric value passed to this function does not correspond to an existing field in the designated or selected work area, this function will return a NULL byte.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nField\nUSE test NEW\nFOR nField := 1 TO test->( FCount() )\n   ? \"Field Name:\", FieldName( nField )\nNEXT"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbStruct(), FCount(), Len(), ValType()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FieldPos()",
				"ONELINER": "Return the ordinal position of a field.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "FieldPos( <cFieldName> ) --> nFieldPos",
				"ARGUMENTS": "<cFieldName> Name of a field.",
				"RETURNS": "<nFieldPos> is ordinal position of the field.",
				"DESCRIPTION": "This function return the ordinal position of the specified field <cField> in the current or aliased work area. If there isn't field under the name of <cField> or of no database is open in the selected work area, the function will return a 0.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? test->( FieldPos( \"LAST\" ) )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "FieldGet(), FieldPut()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FieldPut()",
				"ONELINER": "Set the value of a field variable",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "FieldPut( <nField>, <expAssign> ) --> ValueAssigned",
				"ARGUMENTS": "<nField> The field numeric position\n<expAssign> Expression to be assigned to the specified field",
				"RETURNS": "<ValueAssigned> Any expression",
				"DESCRIPTION": "This function assigns the value in <expAssing> to the <nField>th field in the current or designated work area. If the operation is successful, the return value of the function will be the same value assigned to the specified field. If the operation is not successful, the function will return a NIL data type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? FieldPut( 1, \"Mr. Jones\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "FieldGet()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FLock()",
				"ONELINER": "Locks a file",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "FLock() --> lSuccess",
				"RETURNS": "<lSuccess> A true (.T.) value, if the lock was successful; otherwise false (.F.)",
				"DESCRIPTION": "This function returns a logical true (.T.) if a file lock is attempted and is successfully placed on the current or designated database. This function will also unlock all records locks placed by the same network station.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nSum\nUSE test NEW\nIF FLock()\n   SUM test->age TO nSum\n   ? nSum\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "RLock()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Found()",
				"ONELINER": "Determine the success of a previous search operation.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Found() --> lSuccess",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "<lSuccess> A logical true (.T.) is successful; otherwise, false (.F.)",
				"DESCRIPTION": "This function is used to test if the previous SEEK, LOCATE, CONTINUE, or FIND operation was successful. Each work area has its own Found() flag, so that a Found() condition may be tested in unselected work areas by using an alias.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nAge := 40\nUSE test NEW\nINDEX ON field->age TO test\nSEEK nAge\nIF Found()\n   ? test->first\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Eof()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Header()",
				"ONELINER": "Return the length of a database file header",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Header() --> nBytes",
				"RETURNS": "<nBytes> The numeric size of a database file header in bytes",
				"DESCRIPTION": "This function returns the number of bytes in the header of the selected database of the database in the designated work area.\nIf used in conjunction with the LastRec(), RecSize() and DiskSpace() functions, this functions is capable of implementing a backup and restore routine.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? Header()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "DiskSpace(), LastRec(), RecSize()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IndexExt()",
				"ONELINER": "Returns the file extension of the index module used in an application",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "IndexExt() --> cExtension",
				"ARGUMENTS": "None.",
				"RETURNS": "<cExtension>   Current driver file extension",
				"DESCRIPTION": "This function returns a string that tells what indexes are to be used or will be created in the compiled application. The default value is `.ntx`. This is controlled by the particular database driver that is linked with the application.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "IF IndexExt() == \".ntx\"\n   ? \"Current driver being used is DBFNTX\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "IndexKey(), IndexOrd()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IndexKey()",
				"ONELINER": "Yields the key expression of a specified index file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "IndexKey( <nOrder> ) --> cIndexKey",
				"ARGUMENTS": "<nOrder>  Index order number",
				"RETURNS": "<cIndexKey>   The index key",
				"DESCRIPTION": "This function returns a character string stored in the header of the index file\nThe index key is displayed for an index file that is designated by <nOrder>, its position in the `USE...INDEX` or `SET INDEX TO` command in the currently selected or designated work area. If there is no corresnponding index key at the specified order position, a NULL byte will be returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\nINDEX ON field->first TO test\n? IndexKey( 1 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "IndexOrd()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IndexOrd()",
				"ONELINER": "Returns the numeric position of the controlling index.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "IndexOrd() --> nPosition",
				"ARGUMENTS": "None.",
				"RETURNS": "<nPosition>   Ordinal position of a controling index",
				"DESCRIPTION": "The IndexOrd() function returns the numeric position of the current controlling index in the selected or designated work area. A returned value of 0 indicated that no active index is controlling the database, which therefore is in the natural order.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\nINDEX ON field->first TO test\nIF IndexOrd() > 0\n   ? \"Current order is\", hb_ntos( IndexOrd() )\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "IndexKey()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "LastRec()",
				"ONELINER": "Returns the number of records in an active work area or database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "LastRec() | RecCount()* --> nRecords",
				"RETURNS": "<nRecords > The number of records",
				"DESCRIPTION": "This function returns the number of records present in the database in the selected or designated work area. If no records are present the value of this function will be 0. Additionally, if no database is in use in the selected or designated work area, this function will return a 0 value as well.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? LastRec(), RecCount()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Eof()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "LUpdate()",
				"ONELINER": "Yields the date the database was last updated.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "LUpdate() --> dModification",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "<dModification>  The date of the last modification.",
				"DESCRIPTION": "This function returns the date recorded by the OS when the selected or designated database was last written to disk. This function will only work for those database files in USE.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? LUpdate()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "FieldName(), LastRec(), RecSize()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "NetErr()",
				"ONELINER": "Tests the success of a network function",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "NetErr( [<lNewError>] ) --> lError",
				"ARGUMENTS": "<lNewError> Is a logical Expression.",
				"RETURNS": "<lError> A value based on the success of a network operation or function.",
				"DESCRIPTION": "This function return a logical true (.T.) is a USE, dbAppend(), or a `USE...EXCLUSIVE` command is issue and fails in a network environment. In the case of USE and `USE...EXCLUSIVE` commands, a NetErr() value of .T. would be returned if another node of the network has the exclusive use of a file. And the case of the dbAppend() command, NetErr() will return a logical true (.T.) if the file or record is locked by another node or the value of LastRec() has been advanced The value of NetErr() may be changed via the value of <lNewError>. This allow the run-time error-handling system to control the way certain errors are handled.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\nIF ! NetErr()\n   INDEX ON field->first TO test\n   SET INDEX TO test\n   test->first := \"Harbour\"\n   IF dbSeek( \"Harbour\" )\n      ? test->first\n   ENDIF\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "FLock(), RLock()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ordBagExt()",
				"ONELINER": "Returns the Order Bag extension",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "ordBagExt() --> cBagExt",
				"ARGUMENTS": "None",
				"RETURNS": "<cBagExt> The RDD extension name.",
				"DESCRIPTION": "This function return th character name of the RDD extension for the order bag. This is determined by the active RDD for the selected work area.\nThis function replaces the IndexOrd() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test VIA \"DBFNTX\"\n? ordBagExt()  // --> \".ntx\"\nUSE test VIA \"DBFCDX\"\n? ordBagExt()  // --> \".cdx\""
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "IndexExt(), ordBagName()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ordBagName()",
				"ONELINER": "Returns the Order Bag Name.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "ordBagName( <nOrder> | <cOrderName> ) --> cOrderBagName",
				"ARGUMENTS": "<nOrder> A numeric value representing the Order bag number.\n<cOrderName> The character name of the Order Bag.",
				"RETURNS": "ordBagName() returns the Order bag name",
				"DESCRIPTION": "This function returns the name of the order bag for the specified work area. If <nOrder> is specidied, it will represent the position in the order list of the target order. If <cOrderName> is specified, it will represent the name of the target order. In essence, it will tell the name of the database (if That RDD is in use) for a given index name or index order number. If <cOrderName> is not specified or <nOrder> is 0, the Current active order will be used.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test VIA \"DBFCDX\" NEW\nSET INDEX TO test\n? ordBagName( \"TeName\" )    // --> \"Customer\"\n? ordBagName( \"TeLast\" )    // --> \"Customer\"\n? ordBagName( \"teZip\" )     // --> \"Customer\"\nordSetFocus( \"TeName\" )\n? ordBagName()              // --> \"Custumer\""
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "IndexOrd(), ordBagExt(), Alias()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "ordCondSet()",
				"ONELINER": "Set the Condition and scope for an order",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "ordCondSet( [<cForCondition>],\n  [<bForCondition>],\n  [<lAll>],\n  [<bWhileCondition>],\n  [<bEval>],\n  [<nInterval>],\n  [<nStart>],\n  [<nNext>],\n  [<nRecord>],\n  [<lRest>],\n  [<lDescend>],\n  [<lAdditive>],\n  [<lCurrent>],\n  [<lCustom>],\n  [<lNoOptimize>] )",
				"ARGUMENTS": "<cForCondition> is a string that specifies the FOR condition for the order.\n<bForCondition> is a code block that defines a FOR condition that each record within the scope must meet in order to be processed. If a record does not meet the specified condition, it is ignored and the next  record is processed. Duplicate keys values are not added to the index file when a FOR condition is Used.",
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "ordCreate()",
				"ONELINER": "Create an Order in an Order Bag",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "ordCreate( <cOrderBagName>,[<cOrderName>], <cExpKey>,\n[<bExpKey>], [<lUnique>] )",
				"ARGUMENTS": "<cOrderBagName>  Name of the file that contains one or more Orders.\n<cOrderName> Name of the order to be created.\n<cExpKey> Key value for order for each record in the current work area\n<bExpKey> Code block that evaluates to a key for the order for each record in the work area.\n<lUnique> Toggle the unique status of the index.",
				"DESCRIPTION": "This function creates an order for the current work area. It is similar to the dbCreateIndex() except that this function allows different orders based on the RDD in effect. The name of the file <cOrderBagName> or the name of the order <cOrderName> are technically both considered to be \"optional\" except that at least one of two must exist in order to create the order.\nThe parameter <cExpKey> is the index key expression; typically in a .dbf driver, the maximum length of the key is 255 characters.\nIf <bExpKey> is not specified, then the code block is create by macro expanding the value of <cExpKey>.\nIf <lUnique> is not specified, then the current internal setting of `SET UNIQUE ON` or OFF will be observed.\nThe active RDD driver determines the capacity in the order for a specific order bag.\nIf the name <cOrderBagName> is found in the order bag can contain a single order, the the name <cOrderBagName> is erased and a new order is added to the order list in the current or specified work area.On the other hand, if it can contain multiples tags and if <cOrderBagName> does not already exist in the order list, then it is added. It is does exist, then the <cOrderBagName> replaces the former name in the order list in the current or specified work area.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test VIA \"DBFNTX\"\n? ordCreate( \"FNAME\",, \"field->first\" )\n\nUSE test VIA \"DBFCDX\"\n? ordCreate( , \"LNAME\", \"field->last\" )"
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbCreateIndex(), ordName(), ordSetFocus()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "ordDestroy()",
				"ONELINER": "Remove an Order from an Order Bag",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "ordDestroy( <cOrderName> [, <cOrderBagName> ] )",
				"ARGUMENTS": "<cOrderName> Name of the order to remove\n<cOrderBagName> Name of the order bag from which order id to be removed",
				"DESCRIPTION": "This function attempts to remove the order named <cOrderName> from the file containing the order bag name <cOrderBagName>. If <cOrderBagName> is not specified, then the name of the file will be based on the value of the ordName() function. If the extension is not included with the name of the order file, then the extension will be obtained from the default extension of the current and active RDD.\nThe DBFNTX driver do not support multiple order bags; therefore, there cannot be an order to \"destroy\" from a bag. This function only works for those drivers with support multiple orders bags (e.q. DBFCDX and RDDADS drivers).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test VIA \"DBFCDX\" NEW\n? ordDestroy( \"lName\", \"test\" )"
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "ordCreate()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ordFor()",
				"ONELINER": "Return the FOR expression of an Order",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "ordFor( <xOrder>[, <cOrderBagName>] ) --> cForExp",
				"ARGUMENTS": "<xOrder>  It the name of the target order, or the numeric position of the order.\n<cOrderBagName> Name of the order bag.",
				"RETURNS": "ordFor() returns a expression containing the FOR condition for an order.",
				"DESCRIPTION": "This function returns a character string that is the expression for the FOR condition for the specified order. The order may be specified if <xOrder> is the name of the order. However, <xOrder> may be an numeric which represent the position in the order list of the desired Order.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW VIA \"DBFCDX\"\nINDEX ON field->first TO test FOR field->age > 50\n? ordFor( \"test\" )        // --> \"field->age > 50\""
				},
				"STATUS": "Started",
				"COMPLIANCE": "This function is CA-Cl*pper compliant with one exception: If the <xOrder> paramter is not specified or <xOrder> is 0, the current active order is used.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "ordKey(), ordCreate(), ordName(), ordNumber()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ordKey()",
				"ONELINER": "Return the key expression of an Order",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "ordKey( <cOrderName> | <nOrder> [, <cOrderBagName>] ) --> cExpKey",
				"ARGUMENTS": "<xOrder>  It the name of the target order, or the numeric position of the order.\n<cOrderBagName> Name of the order bag.",
				"RETURNS": "<cExpKey> Returns a character string, cExpKey.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW VIA \"DBFCDX\"\nINDEX ON field->first TO test FOR field->first > \"CK\"\nINDEX ON field->age   TO testage\n\n? ordKey( \"test\" )  // --> \"field->first\"\nordSetFocus( 2 )\n? ordKey()          // --> \"field->age\""
				},
				"STATUS": "Started",
				"COMPLIANCE": "This function is CA-Cl*pper compliant with one exception: If the <xOrder> paramter is not specified or <xOrder> is 0, the current active order is used.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "ordFor(), ordName(), ordNumber(), ordKey()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "RecCount()",
				"ONELINER": "Counts the number of records in a database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "RecCount()* | LastRec() --> nRecords",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "<nRecords>  The number of records CRIPTION$* This function returns the number of records present in the database in the selected or designated work area. If no records are present the value of this function will be 0. Additionally, if no database is in use in the selected or designated work area, this function will return a 0 value as well.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\n? RecCount()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Eof(), LastRec(), RecNo(), dbGoBottom()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "RecNo()",
				"ONELINER": "Returns the current record number or identity.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "RecNo() --> Identity",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "RecNo() The record number or identity",
				"DESCRIPTION": "This function returns the position of the record pointer in the currently selected of designated work area.\nIf the database file is empty and if the RDD is the traditional .dbf file, the value of this function will be 1.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbGoTop()\n? RecNo()     // --> 1\ndbGoto( 50 )\n? RecNo()     // --> 50"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "dbGoto(), dbGoTop(), dbGoBottom(), LastRec(), Eof(), Bof()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "RecSize()",
				"ONELINER": "Returns the size of a single record in an active database.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "RecSize() --> nBytes",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "<nBytes> The record size.",
				"DESCRIPTION": "This function returns the number of bytes used by a single record in the currently selected or designated database file. If no database is in use in this work area, the return value from this function will be 0.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\ndbGoTop()\n? RecSize()   // --> 1\ndbGoto( 50 )\n? RecSize()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "DiskSpace(), FieldName(), Header(), LastRec()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "RLock()",
				"ONELINER": "Lock a record in a work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "RLock() --> lSuccess",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "RLock() True (.T.) if record lock is successful; otherwise, it returns false (.F.).",
				"DESCRIPTION": "This function returns a logical true (.T.) if an attempt to lock a specific record in a selected or designated work area is successful. It will yield a false (.F.) if either the file or the desired record is currently locked. A record that is locked remains locked until another RLock() is issued or until an UNLOCK command is executed. On a Network environment the follow command need that the record is locked:\n`@...GET`\nDELETE (single record)\nRECALL (single record)\nREPLACE (single record)",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nAge := 50\nUSE test NEW\nINDEX ON field->age TO test\nIF dbSeek( nAge ) .AND. RLock()\n   dbDelete()\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "FLock()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Select()",
				"ONELINER": "Returns the work area number for a specified alias.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Select( [<cAlias>] ) --> nWorkArea",
				"ARGUMENTS": "<cAlias> is the target work area alias name.",
				"RETURNS": "Select() returns the work area number.",
				"DESCRIPTION": "This function returns the work area number for the specified alias name <cAlias>. If no parameter is specified, the current work area will be the return value of the function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cOldArea\nUSE test NEW\nUSE names NEW\ncOldArea := Select( \"names\" )\nSELECT test\nLIST\nSELECT cOldArea"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Alias(), Used()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Used()",
				"ONELINER": "Checks whether a database is in use in a work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "Database",
				"SYNTAX": "Used() --> lDbfOpen",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "<lDbfOpen> True is a database is Used;otherwise False",
				"DESCRIPTION": "This function returns a logical true (.T.) if a database file is in USE in the current or designated work area. If no alias is specified along with this function , it will default to the currently selected work area.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\nUSE names NEW\n? Used()            // --> .T.\n? test->( Used() )  // --> .T.\ndbCloseArea()\n? Used()            // --> .F.\nSELECT test\n? Used()            // --> .T."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Database",
				"SEEALSO": "Alias(), Select()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "CDoW()",
				"ONELINER": "Converts a date to the day of week",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "CDoW( <dDate> ) --> cDay",
				"ARGUMENTS": "<dDate>  Any date expression.",
				"RETURNS": "<cDay>  The current day of week.",
				"DESCRIPTION": "This function returns a character string of the day of the week, from a date expression <dDate> passed to it. If a NULL date is passed to the function, the value of the function will be a NULL byte.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? CDoW( Date() )\nIF CDoW( Date() + 10 ) == \"Sunday\"\n   ? \"This is a sunny day.\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Day(), DoW(), Date(), CMonth()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "CMonth()",
				"ONELINER": "Return the name of the month.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "CMonth( <dDate> ) --> cMonth",
				"ARGUMENTS": "<dDate>  Any date expression.",
				"RETURNS": "<cMonth>  The current month name",
				"DESCRIPTION": "This function returns the name of the month (January, February, etc.) from a date expression <dDate> passed to it. If a NULL date is passed to the function, the value of the function will be a NULL byte.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? CMonth( Date() )\nIF CMonth( Date() + 10 ) == \"March\"\n   ? \"Have you done your system backup?\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "CDoW(), Date(), Month(), Year(), DoW(), DToC()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "CToD()",
				"ONELINER": "Converts a character string to a date expression",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "CToD( <cDateString> ) --> dDate",
				"ARGUMENTS": "<cDateString> A character date in format \"mm/dd/yy\"",
				"RETURNS": "<dDate> A date expression",
				"DESCRIPTION": "This function converts a date that has been entered as a character expression to a date expression. The character expression will be in the form `MM/DD/YY` (based on the default value in `SET DATE`) or in the appropriate format specified by the `SET DATE TO` command. If an improper character string is passed to the function, an empty date value will be returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Set( _SET_DATEFORMAT, \"yyyy-mm-dd\" )\n? CToD( \"2000-12-21\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "SET DATE, Date(), DToS()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Date()",
				"ONELINER": "Return the Current OS Date",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "Date() --> dCurDate",
				"ARGUMENTS": "None",
				"RETURNS": "<dCurDate>  Current system date.",
				"DESCRIPTION": "This function returns the current system date.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Date()\n? \"Today is\", hb_ntos( Day( Date() ) ), \"of\", CMonth( Date() ), \"of\", StrZero( Year( Date() ), 4 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "CToD(), DToS(), DToC(), Day(), Month(), CMonth()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Day()",
				"ONELINER": "Return the numeric day of the month.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "Day( <cDate> ) --> nMonth",
				"ARGUMENTS": "<cDate> Any valid date expression.",
				"RETURNS": "<nMonth> Numeric value of the day of month.",
				"DESCRIPTION": "This function returns the numeric value of the day of month from a date.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Day( Date() )\n? Day( Date() + 6325 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "CToD(), DToS(), DToC(), Date(), Month(), CMonth()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Days()",
				"ONELINER": "Convert elapsed seconds into days",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "Days( <nSecs> ) --> nDay",
				"ARGUMENTS": "<nSecs> The number of seconds",
				"RETURNS": "<nDay>  The number of days",
				"DESCRIPTION": "This function converts <nSecs> seconds to the equivalent number of days; 86399 seconds represents one day, 0 seconds being midnight.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Days( 2434234 )\n? Days( 63251 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Seconds(), Secs(), ElapTime()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "DoW()",
				"ONELINER": "Value for the day of week.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "DoW( <dDate> ) --> nDay",
				"ARGUMENTS": "<dDate>  Any valid date expression",
				"RETURNS": "<nDay>  The current day number",
				"DESCRIPTION": "This function returns the number representing the day of the week for the date expressed as <dDate>. Returned value range is from 1 (Sunday) to 7 (Saturday).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? DoW( Date() )\n? DoW( Date() - 6584 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "DToC(), CDoW(), Date(), DToS(), Day()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "DToC()",
				"ONELINER": "Date to character conversion",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "DToC( <dDateString> ) --> cDate",
				"ARGUMENTS": "<dDateString> Any date",
				"RETURNS": "<dDate> Character representation of date",
				"DESCRIPTION": "This function converts any date expression (a field or variable) expressed as <dDateString> to a character expression in the default format `MM/DD/YY`. The date format expressed by this function is controlled in part by the date format specified in the `SET DATE` command",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? DToC( Date() )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "SET DATE, Date(), DToS()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "DToS()",
				"ONELINER": "Date to string conversion",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "DToS( <dDateString> ) --> cDate",
				"ARGUMENTS": "<dDateString> Any date",
				"RETURNS": "<dDate> String notation of the date",
				"DESCRIPTION": "This function returns the value of <dDateString> as a character string in the format of `YYYYMMDD`. If the value of <dDateString> is an empty date, this function will return eight blank spaces.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? DToS( Date() )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "DToC(), Date(), DToS()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ElapTime()",
				"ONELINER": "Calculates elapsed time.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "ElapTime( <cStartTime>, <cEndTime> ) --> cDifference",
				"ARGUMENTS": "<cStartTime> Start in time as a string format <cEndTime>   End time as a string format",
				"RETURNS": "<cDifference>  Difference between the times",
				"DESCRIPTION": "This function returns a string that shows the difference between the starting time represented as <cStartTime> and the ending time as <cEndTime>. If the stating time is greater then the ending time, the function will assume that the date changed once.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "STATIC s_cStartTime\nINIT PROCEDURE Startup()\n   s_cStartTime := Time()\n   RETURN\nEXIT PROCEDURE StartExit()\n   ? \"You used this program by\", ElapTime( s_cStartTime, Time() )\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Secs(), Seconds(), Time(), Day()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_DToT()",
				"ONELINER": "Create a <tDateTime> value from a <dDate> parameter",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "hb_DToT( <dDate> [, <cTime|nSeconds>] ) --> <tDateTime>",
				"ARGUMENTS": "<dDate> Any valid date expression.\nOptional: <cTime|nSeconds> representing a time of the day value. <cTime> is a string in a valid time format: \"hh:mm:ss.nnn\". <nSeconds> is a numeric value in seconds in the range from 0 to 86399.999~ ( 60 secs * 60 mins * 24 hours - 1 millisecond )",
				"RETURNS": "<tDateTime> a dateTime value",
				"DESCRIPTION": "This function returns a <tDateTime> value from a <dDate> value. Optionally, a second parameter with the time of the day value can be provided which can be represented by either of a string time value or a numeric value in seconds.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? hb_DToT( Date() )  // a dateTime with a empty time part\n? hb_DToT( Date(), \"14:30:00.500\" )  // a dateTime with time part 14:30pm with 500 milliseconds\n? hb_DToT( Date(), 3600 )  // a dateTime with time part 1:00am (one hour)"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Date()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_Week()",
				"ONELINER": "Returns the week number of year.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "hb_Week( <dDate>, [@<nYear>], [@<nDayOfWeek>] ) --> nWeekNumber",
				"ARGUMENTS": "<dDate> Any valid date expression.\n<nYear> Optional parameter to hold the year of the given date.\n<nDayOfWeek> Optional parameter to hold the day number of week.",
				"RETURNS": "<nWeekNumber> The ordinal week number of the year into which falls\nthe given <dDate>.",
				"DESCRIPTION": "This function returns the week number of year for the given <dDate>. The returned value is an ISO 8601 compliant week number. Optionally, can also be obtained the year and/or the day number of the week of the given <dDate>, if the <nYear> and/or <nDayOfWeek> parameters have been passed by reference. If <dDate> is an empty date expression, the function returns zero(s). Note: new function available after 2017-02-08 19:36 UTC+0100 commit,\nnot found in earlier versions.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nYear, nDayOfWeek\n? hb_Week( 0d20170215, @nYear, @nDayOfWeek ), nYear, nDayOfWeek  // --> 7, 2017, 3\n? hb_Week( 0d00000000, @nYear, @nDayOfWeek ), nYear, nDayOfWeek  // --> 0, 0, 0"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Year(), Month(), Day()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Month()",
				"ONELINER": "Converts a date expression to a month value",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "Month( <dDate> ) --> nMonth",
				"ARGUMENTS": "<dDate> Any valid date expression",
				"RETURNS": "<nMonth> Corresponding number of the month in the year, ranging from\n0 to 12",
				"DESCRIPTION": "This function returns a number that represents the month of a given date expression <dDate>. If a NULL date (`hb_SToD()`) is passed to the function, the value of the function will be 0.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Month( Date() )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "CDoW(), DoW(), Year(), CMonth()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Seconds()",
				"ONELINER": "Returns the number of elapsed seconds past midnight.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "Seconds() --> nSeconds",
				"ARGUMENTS": "None",
				"RETURNS": "<nSeconds> Number of seconds since midnight",
				"DESCRIPTION": "This function returns a numeric value representing the number of elapsed seconds based on the current system time. The system time is considered to start at 0 (midnight); it continues up to 86399 seconds. The value of the return expression is displayed in both seconds and hundredths of seconds.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Seconds()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Time()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Secs()",
				"ONELINER": "Return the number of seconds from the system date.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "Secs( <cTime> ) --> nSeconds",
				"ARGUMENTS": "<cTime> Character expression in a time string format",
				"RETURNS": "<nSeconds> Number of seconds",
				"DESCRIPTION": "This function returns a numeric value that is a number of elapsed seconds from midnight based on a time string given as <cTime>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Secs( Time() )\n? Secs( Time() - 10 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Seconds(), ElapTime(), Time()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Time()",
				"ONELINER": "Returns the system time as a string",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "Time() --> cTime",
				"ARGUMENTS": "None",
				"RETURNS": "<cTime> Character string representing time",
				"DESCRIPTION": "This function returns the system time represented as a character expression in the format of `HH:MM:SS`",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Time()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Date(), Seconds()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Year()",
				"ONELINER": "Extracts the year designator of a given date as a numeric value",
				"CATEGORY": "API",
				"SUBCATEGORY": "Date/Time",
				"SYNTAX": "Year( <dDate> ) --> nYear",
				"ARGUMENTS": "<dDate> Any valid date expression",
				"RETURNS": "<nYear> The year portion of the date.",
				"DESCRIPTION": "This function returns the numeric value for the year in <dDate>. The returned value is not affected by the `SET CENTURY` and `SET DATE` settings and will always be a four-digit year number, unless the <dDate> is an empty date expression, in which case it will be zero.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Year( Date() )\n? Year( 0d32510125 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Date/Time",
				"SEEALSO": "Day(), Month()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__Run()",
				"ONELINER": "Run an external program.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "__Run( <cCommand> )",
				"ARGUMENTS": "<cCommand> Command to execute.",
				"DESCRIPTION": "This command runs an external program. Ensure that you have enough free memory to be able to run the external program. Do not use it to run 'Terminate and Stay Resident' programs (in case of MS-DOS) since that causes several problems.\nNote: This function is what the RUN command preprocesses into.\nIt is considered bad form to use this function directly. Use the RUN command instead.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__Run( \"edit \" + cMyTextFile )    // Runs an external editor\n__Run( \"command\" )                // Gives a OS shell"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "RUN, hb_run()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__SetCentury()",
				"ONELINER": "Set the Current Century",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "__SetCentury([<lFlag> | <cOnOff> ] ) --> lPreviousValue",
				"ARGUMENTS": "optional <lFlag> or <cOnOff> (not case sensitive)\n.T. or `\"ON\"` to enable the century setting (4-digit years) .F. or `\"OFF\"` to disable the century setting (2-digit years)",
				"RETURNS": "Either the current or previous century setting as a logical value",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "GetE()",
				"ONELINER": "Obtains a system environmental setting.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "GetE( <cEnviroment> ) --> cReturn",
				"ARGUMENTS": "<cEnviroment> Environmental variable to obtain.",
				"RETURNS": "<cReturn>     Value of the Environment Variable.",
				"DESCRIPTION": "This function yields a string that is the value of the environment variable <cEnviroment>, which is stored at the system level.\nIf no environment variable is found, an empty string is returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? GetE( \"PATH\" )\n? GetE( \"CONFIG\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "GetEnv()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "GetEnv()",
				"ONELINER": "Obtains a system environmental setting.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "GetEnv( <cEnviroment> ) --> cReturn",
				"ARGUMENTS": "<cEnviroment> Environmental variable to obtain.",
				"RETURNS": "<cReturn>     Value of the Environment Variable.",
				"DESCRIPTION": "This function yields a string that is the value of the environment variable <cEnviroment>, which is stored at the system level.\nIf no environment variable is found, an empty string is returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? GetEnv( \"PATH\" )\n? GetEnv( \"CONFIG\" )\n? GetEnv( \"HARBOURCMD\", \"-n -l -es2\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "GetE()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_eol()",
				"ONELINER": "Returns the newline character(s) to use with the current OS",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "hb_eol() --> cString",
				"RETURNS": "<cString> A character string containing the character or characters required to move the screen cursor or print head to the start of a new line.",
				"DESCRIPTION": "Returns a character string containing the character or characters required to move the screen cursor or print head to the start of a new line for the operating system that the program is running on (or thinks it is running on, if an OS emulator is being used).\nUnder HB_OS_UNIX operating system the return value is the Line-Feed character (0x0a, `Chr( 10 )` ); with other operating systems (like DOS) the return value is the Carriage-Return plus Line-Feed characters (0x0d 0x0a, `Chr( 13 ) + Chr( 10 )`).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Get the newline character(s) for the current OS.\nOutStd( \"Hello World!\" + hb_eol() )\n? HB_ISSTRING( hb_eol() )\n? Len( hb_eol() ) <= 2"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "OS(), OutStd(), OutErr()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_GetEnv()",
				"ONELINER": "Obtains a system environmental setting.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "hb_GetEnv( <cEnviroment>, [<cDefaultValue>] ) --> cReturn",
				"ARGUMENTS": "<cEnviroment> Environmental variable to obtain.\n<cDefaultValue> Optional value to return if <cEnvironment> is not found.",
				"RETURNS": "<cReturn>     Value of the environment variable or <cDefaultValue> or an empty string.",
				"DESCRIPTION": "This function yields a string that is the value of the environment variable <cEnviroment>, which is stored at the system level.\nIf no environment variable can be found, the value of the function will be <cDefaultValue> if it is passed, else an empty string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? hb_GetEnv( \"PATH\" )\n? hb_GetEnv( \"CONFIG\" )\n? hb_GetEnv( \"HARBOURCMD\", \"-n -l -es2\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "GetEnv(), GetE()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "OS()",
				"ONELINER": "Return the current operating system.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "OS() --> cOperatingSystem",
				"RETURNS": "<cOperatinSystem> The current operating system.",
				"DESCRIPTION": "This function will return the current operating system.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? OS()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Environment"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "RUN",
				"ONELINER": "Run an external program.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "RUN <cCommand>",
				"ARGUMENTS": "<cCommand> Command to execute.",
				"DESCRIPTION": "This command runs an external program. Please make sure that you have enough free memory to be able to run the external program. Do not use it to run Terminate and Stay Resident programs (in case of DOS) since that causes several problems.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "RUN ( \"edit \" + cMyTextFile )  // Runs an external editor\nRUN command                    // Gives a OS shell"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "RUN"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Set()",
				"ONELINER": "Changes or evaluated environmental settings",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "Set( <nSet> [, <xNewSetting> [, <xOption> ] ] ) --> xPreviousSetting",
				"ARGUMENTS": "<nSet> Set Number\n<xNewSetting> Any expression to assign a value to the setting\n<xOption> Logical expression\n<nSet>            <xNewSetting>          <xOption>\n`_SET_ALTERNATE`   <lFlag> | <cOnOff>\nIf enabled, QOut() and QQOut() write to the screen and to a file, provided that a file has been opened or created with `_SET_ALTFILE`. If disabled, which is the default, QOut() and QQOut() only write to the screen (and/or to the PRINTFILE). Defaults to disabled.\n`_SET_ALTFILE`     <cFileName>             <lAdditive>\nWhen set, creates or opens file to write QOut() and QQOut() output to. If <lAdditive> is TRUE and the file already exists, the file is opened and positioned at end of file. Otherwise, the file is created. If a file is already opened, it is closed before the new file is opened or created (even if it is the same file). The default file extension is `.txt`. There is no default file name. Call with an empty string to close the file.\n`_SET_AUTOPEN`     <lFlag> | <cOnOff>\nTODO: Document\n`_SET_AUTORDER`    <lFlag> | <cOnOff>\nTODO: Document\n`_SET_AUTOSHARE`   <lFlag> | <cOnOff>\nTODO: Document\n`_SET_BELL`        <lFlag> | <cOnOff>\nWhen enabled, the bell sounds when the last position of a GET is reached and/or when a GET validation fails. Disabled by default.\n`_SET_CANCEL`      <lFlag> | <cOnOff>\nWhen enabled, which is the default, pressing <Alt+C> or <Ctrl+Break> terminates the program. When disabled, both keystrokes can be read by Inkey(). Note: `SET KEY` has precedence over `SET CANCEL`.\n`_SET_COLOR`       <cColorSet>\nSets the current color scheme, using color pairs in the sequence `\"<standard>, <enhanced>, <border>, <background>, <unselected>\"`. Each color pair uses the format `\"<foreground>/<background>\"`. The color codes are space or `\"N\"` for black, `\"B\"` for blue, `\"G\"` for green, `\"BG\"` for Cyan, `\"R\"` for red, `\"RB\"` for magenta, `\"GR\"` for brown, `\"W\"` for white, `\"N+\"` for gray, `\"B+\"` for bright blue, `\"G+\"` for bright green, `\"BG+\"` for bright cyan, `\"R+\"` for bright red, `\"RB+\"` for bright magenta, `\"GR+\"` for yellow, and `\"W+\"` for bright white. Special codes are `\"I\"` for inverse video, `\"U\"` for underline on a monochrome monitor (blue on a color monitor), and `\"X\"` for blank. The default color is `\"W/N,N/W,N,N,N/W\"`.\n`_SET_CONFIRM`     <lFlag> | <cOnOff>\nIf enabled, an exit key must be pressed to leave a GET. If disabled, which is the default, typing past the end will leave a GET.\n`_SET_CONSOLE`     <lFlag> | <cOnOff>\nIf enabled, which is the default, all screen output goes to the screen. When disabled, screen output is suppressed (Note: This setting does not affect OutStd() or OutErr()).\n`_SET_CURSOR`      <nCursorType>\nIf enabled, which is the default, the cursor is displayed on screen. If disabled, the screen cursor is hidden.\n`_SET_DATEFORMAT`  <cDateFormat>\nSets the default date format for display, date input, and date conversion. Defaults to American `mm/dd/yy`. Other formats include ANSI `yy.mm.dd`, British `dd/mm/yy`, French `dd/mm/yy`, German `dd.mm.yy`, Italian `dd-mm-yy`, Japan `yy/mm/dd`, and USA `mm-dd-yy`. `SET CENTURY` modifies the date format. `SET CENTURY ON` replaces the `y`s with `YYYY`. `SET CENTURY OFF` replaces the `y`s with `YY`.\n`_SET_DEBUG`       <lStatus>\nWhen set to .T., pressing <Alt+D> activates the debugger. When set to .F., which is the default, <Alt+D> can be read by Inkey(). (Also affected by `AltD( 1 )` and `AltD( 0 )`)\n`_SET_DECIMALS`    <nNumberOfDecimals>\nSets the number of decimal digits to use when displaying printing numeric values when `SET FIXED` is ON. Defaults to 2. If `SET FIXED` is OFF, then `SET DECIMALS` is only used to determine the number of decimal digits to use after using Exp(), Log(), Sqrt(), or division. Other math operations may adjust the number of decimal digits that the result will display. Note: This never affects the precision of a number. Only the display format is affected.\n`_SET_DEFAULT`     <cDefaultDirectory>\nSets the default directory in which to open, create and check for files. Defaults to current directory (blank).\n`_SET_DELETED`     <lFlag> | <cOnOff>\nIf enabled, deleted records will be processed. If disabled, which is the default, deleted records will be ignored.\n`_SET_DELIMCHARS`  <cDelimiters>\nSets the GET delimiter characters. Defaults to `\"::\"`.\n`_SET_DELIMITERS`  <lFlag> | <cOnOff>\nIf enabled, GETs are delimited on screen. If disabled, which is the default, no GET delimiters are used.\n`_SET_DEVICE`      <cDeviceName>\nSelects the output device for DevOut(). When set to `\"PRINTER\"`, all output is sent to the printer device or file set by `_SET_PRINTFILE`. When set to anything else, all output is sent to the screen. Defaults to `\"SCREEN\"`.\n`_SET_EOF`         <lFlag> | <cOnOff>\nDefaults to FALSE on *nix, but defaults to TRUE on everything else. If set to FALSE, then `Chr( 26 )` does not get written when using `COPY TO DELIMITED`, `COPY TO SDF`, or when closing any of the various text files that are created using various SET values. [This is a Harbour extension]\n`_SET_EPOCH`       <nYear>\nDetermines how to handle the conversion of 2-digit years to 4 digit years. When a 2-digit year is greater than or equal to the year part of the epoch, the century part of the epoch is added to the year. When a 2-digit year is less than the year part of the epoch, the century part of the epoch is incremented and added to the year. The default epoch is 1900, which converts all 2-digit years to 19xx. Example: If the epoch is set to 1950, 2-digit years in the range from 50 to 99 get converted to 19xx and 2-digit years in the range 00 to 49 get converted to 20xx.\n`_SET_ESCAPE`      <lFlag> | <cOnOff>\nWhen enabled, which is the default, pressing <Esc> will exit a READ. When disabled, pressing <Esc> during a READ is ignored, unless the <Esc> key has been assigned to a function using `SET KEY`.\n`_SET_EVENTMASK`   <nEventCodes>\nDetermines which events Inkey() will respond to. INKEY_MOVE allows mouse movement events. INKEY_LDOWN allows the left mouse button down click. INKEY_LUP allows the left mouse button up click. INKEY_RDOWN allows the right mouse button down click. INKEY_RUP allows the right mouse button up clock. INKEY_KEYBOARD allows keyboard keystrokes. INKEY_ALL allows all of the preceding events. Events may be combined (e.g., using `INKEY_LDOWN + INKEY_RUP` will allow left mouse button down clicks and right mouse button up clicks). The default is INKEY_KEYBOARD.\n`_SET_EXACT`       <lFlag> | <cOnOff>\nWhen enabled, all string comparisons other than `==` exclude trailing spaces when checking for equality. When disabled, which is the default, all string comparisons other than `==` treat two strings as equal if the right hand string is \"\" or if the right hand string is shorter than or the same length as the left hand string and all of the characters in the right hand string match the corresponding characters in the left hand string.\n`_SET_EXCLUSIVE`   <lFlag> | <cOnOff>\nWhen enabled, which is the default, all database files are opened in exclusive mode. When disabled, all database files are opened in shared mode. Note: The EXCLUSIVE and SHARED clauses of the USE command can be used to override this setting.\n`_SET_EXIT`        <lFlag> | <cOnOff>\nToggles the use of <Up> and <Down> as READ exit keys. Specifying true (.T.) enables them as exit keys, and false (.F.) disables them. Used internally by the ReadExit() function.\n`_SET_EXTRA`       <lFlag> | <cOnOff>\nQUESTION: What is this for? It does not affect `_SET_EXTRAFILE` in CA-Cl*pper!\n`_SET_EXTRAFILE`   <cFileName>             <lAdditive>\nWhen set, creates or opens file to write QOut() and QQOut() output to. If <lAdditive> is TRUE and the file already exists, the file is opened and positioned at end of file. Otherwise, the file is created. If a file is already opened, it is closed before the new file is opened or created (even if it is the same file). The default file extension is `.prn`. There is no default file name. Call with an empty string to close the file.\n`_SET_FIXED`       <lFlag> | <cOnOff>\nWhen enabled, all numeric values will be displayed and printed with the number of decimal digits set by `SET DECIMALS`, unless a PICTURE clause is used. When disabled, which is the default, the number of decimal digits that are displayed depends upon a variety of factors. See `_SET_DECIMALS` for more.\n`_SET_INSERT`      <lFlag> | <cOnOff>\nWhen enabled, characters typed in a GET or MemoEdit() are inserted. When disabled, which is the default, characters typed in a GET or MemoEdit() overwrite. Note: This setting can also be toggled between on and off by pressing the Insert key during a GET or MemoEdit().\n`_SET_INTENSITY`   <lFlag> | <cOnOff>\nWhen enabled, which is the default, GETs and PROMPTs are displayed using the enhanced color setting. When disabled, GETs and PROMPTs are displayed using the standard color setting.\n`_SET_LANGUAGE`    <cLanguageID>\nSpecifies the language to be used for Harbour messages. [This is a Harbour extension]\n`_SET_MARGIN`      <nColumns>\nSets the left margin for all printed output. The default value is 0. Note: PCol() reflects the printer's column position including the margin (e.g., `SET MARGIN TO 5` followed by `DevPos( 5, 10 )` makes PCol() return 15).\n`_SET_MBLOCKSIZE` <nMemoBlockSize>\nTODO: Document\n`_SET_MCENTER`     <lFlag> | <cOnOff>\nIf enabled, display PROMPTs centered on the MESSAGE row. If disabled, which is the default, display PROMPTS at column position 0 on the MESSAGE row.\n`_SET_MESSAGE`     <nRow>\nIf set to 0, which is the default, PROMPTs are always suppressed. Otherwise, PROMPTs are displayed on the set row. Note: It is not possible to display prompts on the top-most screen row, because row 0 is reserved for the SCOREBOARD, if enabled.\n`_SET_MFILEEXT`    <cMemoFileExt>\nTODO: Document\n`_SET_OPTIMIZE`    <lFlag> | <cOnOff>\nTODO: Document\n`_SET_PATH`        <cDirectories>\nSpecifies a path of directories to search through to locate a file that can't be located in the DEFAULT directory. Defaults to no path `\"\"`. Directories must be separated by a semicolon (e.g., `/hb/bin;/hb/tests`).\n`_SET_PRINTER`     <lFlag> | <cOnOff>\nIf enabled, QOut() and QQOut() write to the screen and to a file, provided that a file has been opened or created with `_SET_ALTFILE`. If disabled, which is the default, QOut() and QQOut() only write to the screen (and/or to the ALTFILE).\n`_SET_PRINTFILE`   <cFileName>             <lAdditive>\nWhen set, creates or opens file to write QOut(), QQOut() and DevOut() output to. If <lAdditive> is TRUE and the file already exists, the file is opened and positioned at end of file. Otherwise, the file is created. If a file is already opened, it is closed before the new file is opened or created (even if it is the same file). The default file extension is `.prn`. The default file name is `PRN`, which maps to the default printer device. Call with an empty string to close the file.\n`_SET_SCOREBOARD`  <lFlag> | <cOnOff>\nWhen enabled, which is the default, READ and MemoEdit() display status messages on screen row 0. When disabled, READ and MemoEdit() status messages are suppressed.\n`_SET_SCROLLBREAK` <lFlag> | <cOnOff>\nQUESTION: What is this flag for?\n`_SET_SOFTSEEK`    <lFlag> | <cOnOff>\nWhen enabled, a SEEK that fails will position the record pointer to the first key that is higher than the sought after key or to `LastRec() + 1` if there is no higher key. When disabled, which is the default, a SEEK that fails will position the record pointer to `LastRec() + 1`.\n`_SET_STRICTREAD`  <lFlag> | <cOnOff>\nTODO: Document\n`_SET_TYPEAHEAD`   <nKeyStrokes>\nSets the size of the keyboard typeahead buffer. Defaults to 50. The minimum is 16 and the maximum is 4096.\n`_SET_UNIQUE`      <lFlag> | <cOnOff>\nWhen enabled, indexes are not allowed to have duplicate keys. When disabled, indexes are allowed duplicate keys.\n`_SET_VIDEOMODE`   <nValue>\nTODO: Document\n`_SET_WRAP`        <lFlag> | <cOnOff>\nWhen enabled, lightbar menus can be navigated from the last position to the first and from the first position to the last. When disabled, which is the default, there is a hard stop at the first and last positions.",
				"RETURNS": "Set() The current or previous setting",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "SetMode()",
				"ONELINER": "Change the video mode to a specified number of rows and columns",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SetMode( <nRows>, <nCols> ) --> lSuccess",
				"ARGUMENTS": "<nRows> is the number of rows for the video mode to set.\n<nCols> is the number of columns for the video mode to set.",
				"RETURNS": "SetMode() returns true if the video mode change was successful; otherwise, it returns false.",
				"DESCRIPTION": "SetMode() is a function that change the video mode depend on the video card and monitor combination, to match the number of rows and columns specified. Note that there are only a real few combination or rows/cols pairs that produce the video mode change. The followings are available for GTDOS:\n<table-noheader>\n   12 rows x 40 columns   12 rows x 80 columns\n   25 rows x 40 columns   25 rows x 80 columns\n   28 rows x 40 columns   28 rows x 80 columns\n   50 rows x 40 columns   43 rows x 80 columns\n                          50 rows x 80 columns\n</table>\nThe follow modes are available to Windows\n<table-noheader>\n   25 rows x 40 columns   25 rows x 80 columns\n   50 rows x 40 columns   43 rows x 80 columns\n   50 rows x 80 columns\n</table>\nSome modes only are available for color and/or VGA monitors. Any change produced on the screen size is updated in the values returned by MaxRow() and MaxCol().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// The first example change to a 12 lines of display mode:\nIF SetMode( 12, 40 )\n   ? \"Hey man are you blind?\"\nELSE\n   ? \"Mom, bring me my glasses!\"\nENDIF\n\n// Next example change to a 50 lines mode:\nIF SetMode( 50, 80 )\n   ? \"This wonderful mode was successfully set\"\nELSE\n   ? \"Wait. this monitor is not made of rubber!\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Some of these modes are not available in CA-Cl*pper",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Environment",
				"SEEALSO": "MaxCol(), MaxRow()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "SetTypeahead()",
				"ONELINER": "Sets the typeahead buffer to given size.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SetTypeahead( <nSize> ) --> nPreviousSize",
				"ARGUMENTS": "<nSize> is a valid typeahead size.",
				"RETURNS": "<nPreviousSize> The previous state of `_SET_TYPEAHEAD`",
				"DESCRIPTION": "This function sets the typeahead buffer to a valid given size as is `Set( _SET_TYPEAHEAD )` where used.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Sets typeahead to 12\nSetTypeahead( 12 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "__Accept(), __Input()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Tone()",
				"ONELINER": "Sound a tone with a specified frequency and duration.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "Tone( <nFrequency>, <nDuration> ) --> NIL",
				"ARGUMENTS": "<nFrequency>  A non-negative numeric value that specifies the frequency of the tone in hertz.\n<nDuration>   A positive numeric value which specifies the duration of the tone in 1/18 of a second units.",
				"RETURNS": "Tone() always returns NIL.",
				"DESCRIPTION": "Tone() is a sound function that could be used to irritate the end user, his or her dog, and the surrounding neighborhood. The frequency is limited to the range 0 to 32767 Hz.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Good sound\nTone(  500, 1 )\nTone( 4000, 1 )\nTone( 2500, 1 )\n\n// Bad sound\nTone(  300, 1 )\nTone(  499, 5 )\nTone(  700, 5 )\n\nTone( 800, 1 )      // same as hb_BChar( 7 )\nTone( 32000, 200 )  // any dogs around yet?\nTone( 130.80, 1 )   // musical note - C\nTone( 400, 0 )      // short beep\nTone( 700 )         // short beep\nTone( 10, 18.2 )    // 1 second delay\nTone( -1 )          // 1/18.2 second delay\nTone()              // 1/18.2 second delay"
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "Chr(), SET BELL"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Version()",
				"ONELINER": "Returns the version of Harbour compiler",
				"CATEGORY": "API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "Version() --> cReturn",
				"ARGUMENTS": "None",
				"RETURNS": "<cReturn>   String containing the Harbour version",
				"DESCRIPTION": "This function returns the current Harbour version.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Version()"
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Environment",
				"SEEALSO": "OS()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "Break()",
				"ONELINER": "Exits from a `BEGIN SEQUENCE` block",
				"CATEGORY": "API",
				"SUBCATEGORY": "Error",
				"SYNTAX": "Break( <xExp> )",
				"ARGUMENTS": "<xExp> is any valid expression. It is always required. If do not want to pass any argument, just use NIL.",
				"DESCRIPTION": "This function passes control to the RECOVER statement in a `BEGIN SEQUENCE` block.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Break( NIL )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Error",
				"SEEALSO": "BEGIN SEQUENCE"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ErrorSys()",
				"ONELINER": "Install default error handler",
				"CATEGORY": "API",
				"SUBCATEGORY": "Error",
				"SYNTAX": "ErrorSys() --> NIL",
				"ARGUMENTS": "None.",
				"RETURNS": "ErrorSys() always return NIL.",
				"DESCRIPTION": "ErrorSys() is called upon startup by Harbour and installs the default error handler. Normally you should not call this function directly, instead use ErrorBlock() to install your own error handler.",
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Error",
				"SEEALSO": "ErrorBlock(), Error class"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__Quit()",
				"ONELINER": "Terminates an application.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Events",
				"SYNTAX": "__Quit()",
				"ARGUMENTS": "None",
				"DESCRIPTION": "This function terminates the current application and returns to the system.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "EndApp( .F. )\nEndApp( .T. )\nSTATIC PROCEDURE EndApp( lYesNo )\n   IF lYesNo\n      __Quit()\n   ENDIF\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Events",
				"SEEALSO": "QUIT"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__SetFunction()",
				"ONELINER": "Assign a character string to a function key",
				"CATEGORY": "API",
				"SUBCATEGORY": "Events",
				"SYNTAX": "__SetFunction( <nFunctionKey>, [<cString>] ) --> NIL",
				"ARGUMENTS": "<nFunctionKey> is a number in the range 1..40 that represent the function key to be assigned.\n<cString> is a character string to set. If <cString> is not specified, the function key is going to be set to NIL releasing by that any previous __SetFunction() or SetKey() for that function.",
				"RETURNS": "__SetFunction() always return NIL.",
				"DESCRIPTION": "__SetFunction() assign a character string with a function key, when this function key is pressed, the keyboard is stuffed with this character string. __SetFunction() has the effect of clearing any SetKey() previously set to the same function number and vice versa.\n<table>\n nFunctionKey   Key to be set\n  1 .. 12       <F1> .. <F12>\n 13 .. 20       <Shift+F3> .. <Shift+F10>\n 21 .. 30       <Ctrl+F1> .. <Ctrl+F10>\n 31 .. 40       <Alt+F1> .. <Alt+F10>\n</table>\n`SET FUNCTION` command is preprocessed into __SetFunction() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\nLOCAL cTest, GetList := {}\n// Associate <F1> with a string\n__SetFunction( 1, \"I Am Lazy\" + Chr( K_ENTER ) )\nCLS\ncTest := Space( 20 )\n@ 10, 0 SAY \"type something or <F1> for lazy mode\" GET cTest\nREAD\n? cTest"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour use 11 and 12 to represent <F11> and <F12>, while CA-Cl*pper use 11 and 12 to represent <Shift+F1> and <Shift+F2>.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Events",
				"SEEALSO": "Inkey(), SetKey(), __Keyboard(), SET KEY"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__Wait()",
				"ONELINER": "Stops the application until a key is pressed.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Events",
				"SYNTAX": "__Wait( <cMessage> ) --> cKey",
				"ARGUMENTS": "<cMessage> is a string.",
				"RETURNS": "Pressed key.",
				"DESCRIPTION": "This function stops the application until a key is pressed. The key must be in the range 32..255. Control keys are not processed.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cKey\n// Wait for a key stroke\n__Wait( \"Press a key to continue\" )\n\nDO WHILE ! cKey == \"Q\"\n   cKey := __Wait( \"Press 'Q' to continue\" )\nENDDO"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Events",
				"SEEALSO": "__Accept(), __Input()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_SetKeyCheck()",
				"ONELINER": "Implements common hot-key activation code",
				"CATEGORY": "API",
				"SUBCATEGORY": "Events",
				"SYNTAX": "hb_SetKeyCheck( <nKey> [, <p1> ][, <p2> ][, <p3> ] )",
				"ARGUMENTS": "<nKey> is a numeric key value to be tested code-block, if executed\n<p1>..<p3> are optional parameters that will be passed to the code-block",
				"RETURNS": "True if there is a hot-key associated with <nKey> and it was executed; otherwise False If there is a hot-key association (before checking any condition): - if there is a condition-block, it is passed one parameter - <nKey> - when the hot-key code-block is called, it is passed 1 to 4 parameters, depending on the parameters passed to hb_SetKeyCheck().  Any parameters so passed are directly passed to the code-block, with an additional parameter being <nKey>",
				"DESCRIPTION": "hb_SetKeyCheck() is intended as a common interface to the SetKey() functionality for such functions as AChoice(), dbEdit(), MemoEdit(), ACCEPT, INPUT, READ, and WAIT",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n#include \"inkey.ch\"\n// within ReadModal()\nIF hb_SetKeyCheck( K_ALT_X, GetActive() )\n   // some other processing ...\nENDIF\n// within TBrowse handler\nCASE hb_SetKeyCheck( nInkey, oTBrowse )\n   RETURN\nCASE nInKey == K_ESC\n   // some other processing ..."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Events",
				"SEEALSO": "SetKey(), hb_SetKeySave()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_SetKeyGet()",
				"ONELINER": "Determine a set-key code block and condition-block",
				"CATEGORY": "API",
				"SUBCATEGORY": "Events",
				"SYNTAX": "hb_SetKeyGet( <nKey> [, <bConditionByRef> ] )",
				"ARGUMENTS": "<anKey> is an numeric key value\n<bConditionByRef> is an optional return-parameter",
				"RETURNS": "Current assigned action-block",
				"DESCRIPTION": "The hb_SetKeyGet() function returns the current code-block assigned to a key, and optionally assigns the condition-block to the return-parameter",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\nLOCAL bOldF10, bOldF10Cond\nbOldF10 := hb_SetKeyGet( K_F10, @bOldF10Cond )\n// some other processing ...\nSetKey( K_F10, bOldF10, bOldF10Cond )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Events",
				"SEEALSO": "SetKey(), hb_SetKeySave(), hb_SetKeyCheck()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_SetKeySave()",
				"ONELINER": "Returns a copy of internal set-key list, optionally overwriting",
				"CATEGORY": "API",
				"SUBCATEGORY": "Events",
				"SYNTAX": "hb_SetKeySave( [ <OldKeys> ] )",
				"ARGUMENTS": "<OldKeys> is an optional set-key list from a previous call to hb_SetKeySave(), or NIL to clear current set-key list",
				"RETURNS": "Current set-key list",
				"DESCRIPTION": "hb_SetKeySave() is designed to act like the Set() function which returns the current state of an environment setting, and optionally assigning a new value.  In this case, the \"environment setting\" is the internal set-key list, and the optional new value is either a value returned from a previous call to hb_SetKeySave() - to restore that list, or the value of NIL to clear the current list.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aKeys := hb_SetKeySave( NIL )  // removes all current set=keys\n// some other processing ...\nhb_SetKeySave( aKeys )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Events",
				"SEEALSO": "SetKey()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "SetKey()",
				"ONELINER": "Assign an action block to a key",
				"CATEGORY": "API",
				"SUBCATEGORY": "Events",
				"SYNTAX": "SetKey( <anKey> [, <bAction> [, <bCondition> ] ] )",
				"ARGUMENTS": "<anKey> is either a numeric key value, or an array of such values\n<bAction> is an optional code-block to be assigned\n<bCondition> is an optional condition code-block",
				"RETURNS": "Current assigned action-block",
				"DESCRIPTION": "The SetKey() function returns the current code-block assigned to a key when called with only the key value.  If the action block (and optionally the condition block) are passed, the current block is returned, and the new code block and condition block are stored. A group of keys may be assigned the same code block/condition block by using an array of key values in place on the first parameter.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"getexit.ch\"\n#include \"inkey.ch\"\nLOCAL bOldF10 := SetKey( K_F10, {|| Yahoo() } )\nLOCAL bBlock\n// some other processing ...\nSetKey( K_F10, bOldF10 )\n// some other processing ...\nbBlock := SetKey( K_SPACE )\nIF bBlock != NIL  // ...\n\n   // make <F10> exit current get, but only if in a get - ignores other\n   // wait states such as menus, achoices, etc...\n   SetKey( K_F10, {|| GetActive():State := GE_WRITE }, ;\n      {|| GetActive() != NIL } )\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "SetKey() is mostly CA-Cl*pper compliant. The only difference is the addition of the condition code-block parameter, allowing set-keys to be conditionally turned off or on.  This condition-block cannot be returned once set - see hb_SetKeyGet()",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Events",
				"SEEALSO": "hb_SetKeySave(), hb_SetKeyGet()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbEval()",
				"ONELINER": "Performs a code block operation on the current Database",
				"CATEGORY": "API",
				"SUBCATEGORY": "Execute and Execution",
				"SYNTAX": "dbEval( <bBlock>,\n[<bFor>], [<bWhile>],\n[<nNext>], [<nRecord>],\n[<lRest>] ) --> NIL",
				"ARGUMENTS": "<bBlock> Operation that is to be performed\n<bFor> Code block for the For condition\n<bWhile> Code block for the WHILE condition\n<nNext> Number of NEXT records  to process\n<nRecord> Record number to work on exactly\n<lRest> Toggle to rewind record pointer",
				"RETURNS": "dbEval() always returns NIL",
				"DESCRIPTION": "Performs a code block operation on the current Database",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nCount\n\nUSE test\n\ndbGoto( 4 )\n? RecNo()\nCOUNT TO nCount NEXT 10\n? RecNo(), nCount\nCOUNT TO nCount\n? RecNo(), nCount"
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is rdd",
				"TAGS": "API, Execute and Execution",
				"SEEALSO": "Eval()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Eval()",
				"ONELINER": "Evaluate a code block",
				"CATEGORY": "API",
				"SUBCATEGORY": "Execute and Execution",
				"SYNTAX": "Eval( <bBlock> [, <xVal> [,...] ] ) --> xExpression",
				"ARGUMENTS": "<bBlock>   Code block expression to be evaluated\n<xVal>     Argument to be passed to the code block expression\n<xVal...>  Argument list to be passed to the code block expression",
				"RETURNS": "<xExpression>  The result of the evaluated code block",
				"DESCRIPTION": "This function evaluates the code bloc expressed as <bBlock> and returns its evaluated value. If their are multiple expressions within the code block, the last expression will be value of this function.\nIf the code block requires parameters to be passed to it, they are specified in the parameter list <xVal> and following. Each parameter is separated by a comma within the expression list.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL bBlock := {|| NIL }\n? Eval( 1 )\n? Eval( @bBlock )\n\n? Eval( {| p1 | p1 }, \"A\", \"B\" )\n? Eval( {| p1, p2 | p1 + p2 }, \"A\", \"B\" )\n? Eval( {| p1, p2, p3 | p1 }, \"A\", \"B\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Execute and Execution",
				"SEEALSO": "AEval(), dbEval()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__Dir()*",
				"ONELINER": "Display listings of files",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "__Dir( [<cFileMask>] ) --> NIL",
				"ARGUMENTS": "<cFileMask> File mask to include in the function return. It could contain path and standard wildcard characters as supported by your OS (like * and ?). If <cFileMask> contains no path, then SET DEFAULT path is used to display files in the mask.",
				"RETURNS": "__Dir() always returns NIL.",
				"DESCRIPTION": "If no <cFileMask> is given, __Dir() displays information about all *.dbf in the SET DEFAULT path. This information contains: file name, number of records, last update date and the size of each file.\nIf <cFileMask> is given, __Dir() list all files that match the mask with the following details: Name, Extension, Size, Date.\nDIR command is preprocessed into __Dir() function during compile time.\n__Dir() is a compatibility function, it is superseded by Directory() which return all the information in a multidimensional array.\nIf long file names are available Harbour will use/display the first 15 characters else Harbour will use/display a 8.3 file name consistent with CA-Cl*pper.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__Dir()      // information for all DBF files in current directory\n\n__Dir( \"*.dbf\" )         // list all DBF file in current directory\n\n// list all PRG files in Harbour Run-Time library\n// for MS-DOS compatible operating systems\n__Dir( hb_DirSepToOS( \"src/rtl/*.prg\" ) )\n\n// list all files in the public section on a Unix like machine\n__Dir( hb_DirSepToOS( \"/pub\" ) )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "ADir(), Directory(), SET DEFAULT, DIR"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ADir()",
				"ONELINER": "Fill pre-defined arrays with file/directory information",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "ADir( [<cFileMask>], [<aName>], [<aSize>], [<aDate>],\n      [<aTime>], [<aAttr>] ) --> nDirEntries",
				"ARGUMENTS": "<cFileMask> File mask to include in the function return. It could contain path and standard wildcard characters as supported by your OS (like * and ?). If you omit <cFileMask> or if <cFileMask> contains no path, then the path from SET DEFAULT is used.\n<aName> Array to fill with file name of files that meet <cFileMask>. Each element is a Character string and include the file name and extension without the path. The name is the long file name as reported by the OS and not necessarily the 8.3 uppercase name.\n<aSize> Array to fill with file size of files that meet <cFileMask>. Each element is a Numeric integer for the file size in Bytes. Directories are always zero in size.\n<aDate> Array to fill with file last modification date of files that meet <cFileMask>. Each element is of type Date.\n<aTime> Array to fill with file last modification time of files that meet <cFileMask>. Each element is a Character string in the format HH:mm:ss.\n<aAttr> Array to fill with attribute of files that meet <cFileMask>. Each element is a Character string, see Directory() for information about attribute values. If you pass array to <aAttr>, the function is going to return files with normal, hidden, system and directory attributes. If <aAttr> is not specified or with type other than Array, only files with normal attribute would return.",
				"RETURNS": "ADir() return the number of file entries that meet <cFileMask>",
				"DESCRIPTION": "ADir() return the number of files and/or directories that match a specified skeleton, it also fill a series of given arrays with the name, size, date, time and attribute of those files. The passed arrays should pre-initialized to the proper size, see example below. In order to include hidden, system or directories <aAttr> must be specified.\nADir() is a compatibility function, it is superseded by Directory() which returns all the information in a multidimensional array.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aName, aSize, aDate, aTime, aAttr, tmp\nLOCAL nLen := ADir( \"*.dbf\" )  // Number of JPG files in this directory\nIF nLen > 0\n   aName := Array( nLen )  // make room to store the information\n   aSize := Array( nLen )\n   aDate := Array( nLen )\n   aTime := Array( nLen )\n   aAttr := Array( nLen )\n   ADir( \"*.prg\", aName, aSize, aDate, aTime, aAttr )\n   FOR tmp := 1 TO nLen\n      ? ;\n         aName[ tmp ], ;\n         aSize[ tmp ], ;\n         aDate[ tmp ], ;\n         aTime[ tmp ], ;\n         aAttr[ tmp ]\n   NEXT\nELSE\n   ? \"This directory is clean from smut\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "<aName> is going to be filled with long file name and not necessarily the 8.3 uppercase name.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "Array(), Directory(), SET DEFAULT"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "CurDir()",
				"ONELINER": "Returns the current OS directory name.",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "CurDir( [<cDrive>] ) --> cPath",
				"ARGUMENTS": "<cDrive> OS drive letter",
				"RETURNS": "<cPath> Name of directory",
				"DESCRIPTION": "This function yields the name of the current OS directory on a specified drive. If <cDrive> is not specified, the currently logged drive will be used.\nThis function should not return the leading and trailing (back)slashes.\nIf an error has been detected by the function, or the current OS directory is the root, the value of the function will be a NULL byte.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? CurDir()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "File()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "DirChange()",
				"ONELINER": "Changes the directory",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "DirChange( <cDirectory> ) --> nError",
				"ARGUMENTS": "<cDirectory>  The name of the directory you want do change into.",
				"RETURNS": "<nError> 0 if directory was successfully changed, otherwise the number of the last error.",
				"DESCRIPTION": "This function attempt to change the current directory to the one specified in <cDirectory>. If this function fails, it will return the last OS error code number. See FError() function for the description of the error.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "IF DirChange( hb_DirSepToOS( \"./mydir\" ) ) == 0\n   ? \"Change to directory was successful\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.3 function available in builds with HB_COMPAT_C53 option enabled (default)",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "MakeDir(), DirRemove(), IsDisk(), DiskChange(), DiskName(), FError()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "DirRemove()",
				"ONELINER": "Attempt to remove an directory",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "DirRemove( <cDirectory> ) --> nError",
				"ARGUMENTS": "<cDirectory>  The name of the directory you want to remove.",
				"RETURNS": "<nError> 0 if directory was successfully removed, otherwise the number of the last error.",
				"DESCRIPTION": "This function attempt to remove the specified directory in <cDirectory> If this function fails, it will return the last OS error code number. See FError() function for the description of the error.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cDir\nIF DirRemove( cDir := hb_DirSepToOS( \"./mydir\" ) ) == 0\n   ? \"Removing directory\", cDir, \"was successful\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.3 function available in builds with HB_COMPAT_C53 option enabled (default)",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "MakeDir(), DirChange(), IsDisk(), DiskChange(), DiskName(), FError()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "DiskSpace()",
				"ONELINER": "Get the amount of space available on a disk",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "DiskSpace( [<nDrive>] ) --> nDiskBytes",
				"ARGUMENTS": "<nDrive> The number of the drive you are requesting info on where 1 = A, 2 = B, etc. For 0 or no parameter, DiskSpace will operate on the current drive.  The default is 0",
				"RETURNS": "<nDiskBytes> The number of bytes on the requested disk that match the requested type.",
				"DESCRIPTION": "By default, this function will return the number of bytes of free space on the current drive that is available to the user requesting the information.\nIf information is requested on a disk that is not available, a runtime error 2018 will be raised.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"You can use:\", hb_ntos( DiskSpace() ), \"bytes\"\n\n// See tests/diskspac.prg for another example"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core\nHeader is fileio.ch",
				"TAGS": "API, FileSys"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FClose()",
				"ONELINER": "Closes an open file",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FClose( <nHandle> ) --> lSuccess",
				"ARGUMENTS": "<nHandle> File handle",
				"RETURNS": "<lSuccess>  Logical TRUE (.T.) or FALSE (.F.)",
				"DESCRIPTION": "This function closes an open file with a file handle of <nHandle> and writes the associated buffers to the disk. The <nHandle> value is derived from the FCreate() or FOpen() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"fileio.ch\"\nnHandle := FOpen( \"test.txt\" )\n? FSeek( nHandle, 0, FS_END )\nFClose( nHandle )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "FOpen(), FCreate(), FRead(), FWrite(), FError()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FCreate()",
				"ONELINER": "Creates a file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FCreate( <cFile>, [<nAttribute>] ) --> nHandle",
				"ARGUMENTS": "<cFile> is the name of the file to create.\n<nAttribute> Numeric code for the file attributes.",
				"RETURNS": "<nHandle>  Numeric file handle to be used in other operations.",
				"DESCRIPTION": "This function creates a new file with a file name of <cFile>. The default value of <nAttribute> is 0 and is used to set the attribute byte for the file being created by this function. The return value will be a file handle that is associated with the new file. This number will be between zero to 65535, inclusive. If an error occurs, the return value of this function will be F_ERROR.\nIf the file <cFile> already exists, the existing file will be truncated to a file length of 0 bytes.\nIf specified, the following table shows the value for <nAttribute> and their related meaning to the file <cFile> being created by this function.\n<table>\n <nAttribute>  Meaning\n FC_NORMAL     Normal/Default, Read/Write\n FC_READONLY   Read-only file attribute is set\n FC_HIDDEN     Hidden, Excluded from normal DIR search\n FC_SYSTEM     Create, Excluded from normal DIR search\n</table>",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"fileio.ch\"\nIF ( nh := FCreate( \"test.txt\" ) ) == F_ERROR\n    ? \"Cannot create file\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core\nHeader is fileio.ch",
				"TAGS": "API, FileSys",
				"SEEALSO": "FClose(), FOpen(), FWrite(), FRead(), FError()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FErase()",
				"ONELINER": "Erase a file from disk",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FErase( <cFile> ) --> nSuccess",
				"ARGUMENTS": "<cFile> Name of file to erase.",
				"RETURNS": "<nSuccess> 0 if successful, -1 if not",
				"DESCRIPTION": "This function deletes the file specified in <cFile> from the disk. No extensions are assumed. The drive and path my be included in <cFile>; neither the `SET DEFAULT` not the `SET PATH` command controls the performance of this function. If the drive or path is not used, the function will look for the file only on the currently selected directory on the logged drive.\nIf the function is able to successfully delete the file from the disk, the value of the function will be 0; otherwise a -1 will be returned. If not successful, additional information may be obtained by calling the FError() function.\nNote: Any file to be removed by FErase() must still be closed.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"fileio.ch\"\nIF FErase( \"test.txt\" ) != F_ERROR\n   ? \"File successfully erased\"\nELSE\n   ? \"File cannot be deleted\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "FError(), FRename()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FError()",
				"ONELINER": "Reports the error status of low-level file functions",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FError() --> nErrorCode",
				"RETURNS": "<nErrorCode> Value of the OS error last encountered by a low-level file function.\nFError() Return Values\n<table>\n Error          Meaning\n 0              Successful\n 2              File not found\n 3              Path not found\n 4              Too many files open\n 5              Access denied\n 6              Invalid handle\n 8              Insufficient memory\n 15             Invalid drive specified\n 19             Attempted to write to a write-protected disk\n 21             Drive not ready\n 23             Data CRC error\n 29             Write fault\n 30             Read fault\n 32             Sharing violation\n 33             Lock Violation\n</table>",
				"DESCRIPTION": "After every low-level file function, this function will return a value that provides additional information on the status of the last low-level file function's performance. If the FError() function returns a 0, no error was detected. Below is a table of possibles values returned by the FError() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "IF ( nHandle := FCreate( \"test.txt\" ) ) == F_ERROR\n   ? \"Cannot create file, OS error\", FError()\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "FClose(), FErase(), FOpen(), FWrite()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "File()",
				"ONELINER": "Tests for the existence of file(s)",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "File( <cFileSpec> ) --> lExists",
				"ARGUMENTS": "<cFileSpec> File name skeleton or file name to find.",
				"RETURNS": "<lExists> a logical true (.T.) if the file exists or logical false (.F.).",
				"DESCRIPTION": "This function return a logical true (.T.) if the given file name <cFileSpec> exist.\nFile name skeletons symbols may be used in the file name in <cFileSpec>, as may the drive and/or path name. If a path is not explicitly specified, File() will look for the file in the `SET DEFAULT` path, then in each `SET PATH path`, until the file is found or there are no more paths to search. The PATH environment variable is never searched and the current drive/directory is only searched if `SET DEFAULT` is blank.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? File( hb_DirSepToOS( \"/hb/doc/pp.txt\" ) )\n? File( \"*.txt\" )"
				},
				"STATUS": "S (wild card support is missing)",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "SET DEFAULT, SET PATH, Set()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FOpen()",
				"ONELINER": "Open a file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FOpen( <cFile>, [<nMode>] ) --> nHandle",
				"ARGUMENTS": "<cFile> Name of file to open.\n<nMode> File open mode.",
				"RETURNS": "<nHandle> A file handle.",
				"DESCRIPTION": "This function opens a file expressed as <cFile> and returns a file handle to be used with other low-level file functions. The value of <nMode> represents the status of the file to be opened; the default value is 0. The file open modes are as follows:\n<table>\n nMode          Meaning\n FO_READ        Read only\n FO_WRITE       Write only\n FO_READWRITE   Read/write\n FO_EXCLUSIVE   Exclusive read only\n FO_DENYWRITE   Prevent others from writing\n FO_DENYREAD    Deny read only\n FO_DENYNONE    Not deny, Let to others Read / Write\n FO_SHARED      same as FO_DENYNONE\n</table>\nIf there is an error in opening a file, a F_ERROR will be returned by the function. Files handles may be in the range of 0 to 65535. The status of the `SET DEFAULT TO` and `SET PATH TO` commands has no effect on this function. Directory names and paths must be specified along with the file that is to be opened.\nIf an error has occurred, see the returns values from FError() for possible reasons for the error.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"fileio.ch\"\nIF ( nH := FOpen( \"test.txt\", FO_READWRITE + FO_DENYNONE ) ) == F_ERROR\n   ? \"File can't be opened\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core\nHeader is fileio.ch",
				"TAGS": "API, FileSys",
				"SEEALSO": "FCreate(), FError(), FClose()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FRead()",
				"ONELINER": "Reads a specified number of bytes from a file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FRead( <nHandle>, @<cBuffer>, <nBytes> ) --> nBytes",
				"ARGUMENTS": "<nHandle>     File handle\n<cBuffer>  Character expression passed by reference.\n<nBytes>      Number of bytes to read.",
				"RETURNS": "<nBytes> the number of bytes successfully read from the file. <nHandle>",
				"DESCRIPTION": "This function reads the characters from a file whose file handle is <nHandle> into a character memory variable expressed as <cBuffer>. The function returns the number of bytes successfully read into <cBuffer>.\nThe value of <nHandle> is obtained from either a call to the FOpen() or the FCreate() function.\nThe <cBuffer> expression is passed by reference and must be defined before this function is called. It also must be at least the same length as <nBytes>.\n<nBytes> is the number of bytes to read, starting at the current file pointer position. If this function is successful in reading the characters from the file, the length of <cBuffer> or the number of bytes specified in <nBytes> will be the value returned. The current file pointer advances the number of bytes read with each successive read. The return value is the number of bytes successfully read from the file. If a 0 is returned, or if the number of bytes read matches neither the length of <cBuffer> nor the specified value in <nBytes> an end-of-file condition has been reached.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"fileio.ch\"\ncBuffer := Space( 500 )\nIF ( nH := FOpen( \"test.txt\" ) ) == F_ERROR\n   FRead( nH, @cBuffer, 500 )\n   ? cbuffer\nENDIF\nFClose( nH )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "Bin2I(), Bin2L(), Bin2W(), FError(), FWrite()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FReadStr()",
				"ONELINER": "Reads a string from a file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FReadStr( <nHandle>, <nBytes> ) --> cString",
				"ARGUMENTS": "<nHandle> File handle number.\n<nBytes>  Number of bytes to read.",
				"RETURNS": "<cString> an character expression",
				"DESCRIPTION": "This function returns a character string of <nBytes> bytes from a file whose file handle is <nHandle>.\nThe value of the file handle <nHandle> is obtained from either the FOpen() or FCreate() functions.\nThe value of <nBytes> is the number of bytes to read from the file. The returned string will be the number of characters specified in <nBytes> or the number of bytes read before a zero byte is found.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"fileio.ch\"\nLOCAL cStr\nIF ( nH := FOpen( \"test.txt\" ) ) != F_ERROR\n   cStr := FReadStr( nH, 100 )\n   ? cStr\n   FClose( nH )\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "Bin2I(), Bin2L(), Bin2W(), FError(), FRead(), FSeek()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FRename()",
				"ONELINER": "Renames a file",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FRename( <cOldFile>, <cNewFile> ) --> nSuccess",
				"ARGUMENTS": "<cOldFile> Old file name to be changed\n<cNewFile> New file name",
				"RETURNS": "<nSuccess> If successful, a 0 will be returned otherwise, a -1 will be returned.",
				"DESCRIPTION": "This function renames the specified file <cOldFile> to <cNewFile>. A file name and/or directory name may be specified for either para- meter. However, if a path is supplied as part of <cNewFile> and this path is different from either the path specified in <cOldFile> or (if none is used) the current drive and directory, the function will not execute successfully.\nNeither parameter is subject to the control of the `SET PATH TO` or `SET DEFAULT TO` commands. In attempting to locate the file to be renamed, this function will search the default drive and directory or the drive and path specified in <cOldFile>. It will not search directories named by the `SET PATH TO` and `SET DEFAULT TO` commands or by the PATH environment variable.\nIf the file specified in <cNewFile> exists or the file is open, the function will be unable to rename the file. If the function is unable to complete its operation, it will return a value of -1. If it is able to rename the file, the return value for the function will be 0. A call to FError() function will give additional information about any error found.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"fileio.ch\"\nnResult := FRename( \"test.txt\", \"test1.txt\" )\nIF nResult != 0\n   ? \"File could not be renamed\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "ERASE, FErase(), FError(), File(), RENAME"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FSeek()",
				"ONELINER": "Positions the file pointer in a file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FSeek( <nHandle>, <nOffset>, [<nOrigin>] ) --> nPosition",
				"ARGUMENTS": "<nHandle> File handle.\n<nOffset> The number of bytes to move.\n<nOrigin> The relative position in the file.",
				"RETURNS": "<nPosition> the current position relative to begin-of-file",
				"DESCRIPTION": "This function sets the file pointer in the file whose file handle is <nHandle> and moves the file pointer by <expN2> bytes from the file position designated by <nOrigin>. The returned value is the relative position of the file pointer to the beginning-of-file marker once the operation has been completed.\n<nHandle> is the file handle number. It is obtained from the FOpen() or FCreate() function.\nThe value of <nOffSet> is the number of bytes to move the file pointer from the position determined by <nOrigin>. The value of <nOffset> may be a negative number, suggesting backward movement.\nThe value of <nOrigin> designates the starting point from which the file pointer should he moved, as shown in the following table:\n<table>\n <nOrigin>     File position\n FS_SET        Beginning of file\n FS_RELATIVE   Current file pointer position\n FS_END        End of file\n</table>\nIf a value is not provided for <nOrigin>, it defaults to 0 and moves the file pointer from the beginning of the file.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// here is a function that read one text line from an open file\n\n// nH = file handle obtained from FOpen()\n// cB = a string buffer passed-by-reference to hold the result\n// nMaxLine = maximum number of bytes to read\n\nSTATIC FUNCTION FReadLn( nH, cB, nMaxLine )\n   LOCAL cLine, nSavePos, nEol, nNumRead\n   cLine := Space( nMaxLine )\n   cB := \"\"\n   nSavePos := FSeek( nH, 0, FS_RELATIVE )\n   nNumRead := FRead( nH, @cLine, nMaxLine )\n   IF ( nEol := hb_BAt( hb_eol(), hb_BLeft( cLine, nNumRead ) ) ) == 0\n      cB := cLine\n   ELSE\n      cB := hb_BLeft( cLine, nEol - 1 )\n      FSeek( nH, nSavePos + nEol + 1, FS_SET )\n   ENDIF\n   RETURN nNumRead != 0"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core\nHeader is fileio.ch",
				"TAGS": "API, FileSys",
				"SEEALSO": "FCreate(), FError(), FOpen(), FRead(), FReadStr(), FWrite()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FWrite()",
				"ONELINER": "Writes characters to a file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "FWrite( <nHandle>, <cBuffer>, [<nBytes>] ) --> nBytesWritten",
				"ARGUMENTS": "<nHandle>  File handle number.\n<cBuffer>  Character expression to be written.\n<nBytes>   The number of bytes to write.",
				"RETURNS": "<nBytesWritten> the number of bytes successfully written.",
				"DESCRIPTION": "This function writes the contents of <cBuffer> to the file designated by its file handle <nHandle>. If used, <nBytes> is the number of bytes in <cBuffer> to write.\nThe returned value is the number of bytes successfully written to the file. If the returned value is 0, an error has occurred (unless this is intended). A successful write occurs when the number returned by FWrite() is equal to either `Len( cBuffer )` or <nBytes>.\nThe value of <cBuffer> is the string or variable to be written to the open file <nHandle>.\nThe value of <nBytes> is the number of bytes to write out to the file. The disk write begins with the current file position in <nHandle>. If this variable is not used, the entire contents of <cBuffer> is written to the file. To truncate a file, a call of `FWrite( nHandle, \"\", 0 )` is needed.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "nHandle := FCreate( \"test.txt\" )\nFOR x := 1 TO 10\n   FWrite( nHandle, hb_ntos( x ) )\nNEXT\nFClose( nHandle )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "FClose(), FCreate(), FError(), FOpen(), I2Bin(), L2Bin()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_DiskSpace()",
				"ONELINER": "Get the amount of space available on a disk",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "hb_DiskSpace( [<cDrive>] [, <nType>] ) --> nDiskBytes",
				"ARGUMENTS": "<cDrive> The drive letter you are requesting info on. The default is A:\n<nType> The type of space being requested. The default is HB_DISK_AVAIL.",
				"RETURNS": "<nDiskBytes> The number of bytes on the requested disk that match the requested type.",
				"DESCRIPTION": "By default, this function will return the number of bytes of free space on the current drive that is available to the user requesting the information.\nThere are 4 types of information available:\nHB_DISK_AVAIL  The amount of space available to the user making the\nrequest. This value could be less than HB_FS_FREE if disk quotas are supported by the O/S in use at runtime, and disk quotas are in effect. Otherwise, the value will be equal to that returned for HB_FS_FREE.\nHB_DISK_FREE   The actual amount of free disk space on the drive.\nHB_DISK_USED   The number of bytes in use on the disk.\nHB_DISK_TOTAL  The total amount of space allocated for the user if\ndisk quotas are in effect, otherwise, the actual size of the drive.\nIf information is requested on a disk that is not available, a runtime error 2018 will be raised.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"fileio.ch\"\n\n? \"You can use:\", hb_ntos( hb_DiskSpace() ), \"bytes\"\n? \"Out of a total of:\", hb_ntos( hb_DiskSpace( , HB_DISK_TOTAL ) )\n\n// See tests/diskspac.prg for another example"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core\nHeader is fileio.ch",
				"TAGS": "API, FileSys"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_FEof()",
				"ONELINER": "Check for end-of-file.",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "hb_FEof( <nHandle> ) --> lIsEof",
				"ARGUMENTS": "<nHandle> The handle of an open file.",
				"RETURNS": "<lIsEof> .T. if the file handle is at end-of-file, otherwise .F.",
				"DESCRIPTION": "This function checks an open file handle to see if it is at EOF.\nIf the file handle is missing, not numeric, or not open, then this function returns .T. and sets the value returned by FError() to -1 (F_ERROR) or a C-compiler dependent errno value (EBADF or EINVAL).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nH := FOpen( \"test.txt\" )\n? FReadStr( nH, 80 )\nIF hb_FEof( nH )\n   ? \"End-of-file reached\"\nELSE\n   ? FReadStr( nH, 80 )\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "FError()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_FLock()",
				"ONELINER": "Locks part or all of any file",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "hb_FLock( <nHandle>, <nOffset>, <nBytes> [, <nType ] )\n          --> lSuccess",
				"ARGUMENTS": "<nHandle>  OS file handle\nset>  Offset of the first byte of the region to be locked.\n<nBytes>   Number of bytes to be locked.\ne>    The type (read or write) of lock requested.",
				"RETURNS": "<lSuccess> .T. if the lock was obtained, else .F.",
				"DESCRIPTION": "This function attempts to lock a region of the file whose file handle is <nHandle>. This is a low level file function.  To lock Harbour data files use either the FLock() or RLock() function.\nThe value of <nHandle> is obtained from either a call to the FOpen() or the FCreate() function.\n<nOffset> is the offset (from the beginning of the file) to the first of the region to be locked.  (Offsets from the current position nd of file are not currently supported.)\n<nBytes> is the length of the region to be locked in bytes.\n<nType> is the type of lock requested.  There are two types of locks: exclusive write locks ( <nType> = 0x0000 ) - the default, and shared read locks ( <nType> = 0x0100 ).  Additionally you can specify a blocking version of this function (that is it won't return until either an error has occurred or the lock has been obtained) by adding 0x0200 to the above values.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// refer to tests/tflock.prg"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "hb_FUnlock(), FOpen(), FCreate(), FError(), FClose()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_FUnlock()",
				"ONELINER": "Unlocks part or all of any file",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "hb_FUnlock( <nHandle>, <nOffset>, <nBytes> ) --> lSuccess",
				"ARGUMENTS": "<nHandle>  OS file handle\nset>  Offset of the first byte of the region to be locked.\n<nBytes>   Number of bytes to be locked.",
				"RETURNS": "<lSuccess> .T. if the lock was removed, else .F.",
				"DESCRIPTION": "This function attempts to unlock a region of the file whose file handle is <nHandle>. This is a low level file function.  To unlock Harbour data files use the dbUnlock() function.\nThe value of <nHandle> is obtained from either a call to the FOpen() or the FCreate() function.\n<nOffset> is the offset (from the beginning of the file) to the first of the region to be unlocked.  (Offsets from the current position nd of file are not currently supported.)\n<nBytes> is the length of the region to be unlocked in bytes.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// refer to tests/tflock.prg"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "hb_FLock(), FOpen(), FCreate(), FError(), FClose()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IsDisk()",
				"ONELINER": "Verify if a drive is ready",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "IsDisk( <cDrive> ) --> lSuccess",
				"ARGUMENTS": "<cDrive>  An valid drive letter",
				"RETURNS": "<lSuccess>  .T. is the drive is ready, otherwise .F.",
				"DESCRIPTION": "This function attempts to access a drive. If the access to the drive was successful, it will return true (.T.), otherwise false (.F.). This function is useful for backup function, so you can determine if the drive that will receive the backup data is ready or not.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "IF IsDisk( \"A\" )\n   ? \"Drive is ready\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.3 function available in builds with HB_COMPAT_C53 option enabled (default)",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "DirChange(), MakeDir(), DirRemove(), DiskChange(), DiskName()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MakeDir()",
				"ONELINER": "Create a new directory",
				"CATEGORY": "API",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "MakeDir( <cDirectory> ) --> nError",
				"ARGUMENTS": "<cDirectory>  The name of the directory you want to create.",
				"RETURNS": "<nError> 0 if directory was successfully created, otherwise the number of the last error.",
				"DESCRIPTION": "This function attempt to create a new directory with the name contained in <cDirectory>. If this function fails, it will return the last OS error code number. See FError() function for the description of the error",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cDir\nIF MakeDir( cDir := hb_DirSepToOS( \"./mydir\" ) ) == 0\n   ? \"Directory\", cDir, \"successfully created\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.3 function available in builds with HB_COMPAT_C53 option enabled (default)",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, FileSys",
				"SEEALSO": "DirChange(), DirRemove(), IsDisk(), DiskChange(), DiskName(), FError()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "hb_gcAll()",
				"ONELINER": "Scans the memory and releases all garbage memory blocks.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Garbage Collector",
				"SYNTAX": "hb_gcAll()",
				"ARGUMENTS": "None",
				"DESCRIPTION": "This function releases all memory blocks that are considered as the garbage.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Garbage Collector",
				"SEEALSO": "hb_gcCollectAll()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_gcAlloc()",
				"ONELINER": "Allocates memory that will be collected by the garbage collector.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Garbage Collector",
				"SYNTAX": "#include \"hbapi.h\"\nvoid * hb_gcAlloc( HB_SIZE nSize,\n                   PHB_GARBAGE_FUNC pCleanupFunc );",
				"ARGUMENTS": "<ulSize> Requested size of memory block\n<pCleanupFunc> Pointer to HB_GARBAGE_FUNC function that will be called directly before releasing the garbage memory block or NULL. This function should release all other memory allocated and stored inside the memory block. For example, it releases all items stored inside the array. The functions receives a single parameter: the pointer to memory allocated by hb_gcAlloc().",
				"RETURNS": "The pointer to allocated memory or it generates an internal unrecoverable error.",
				"DESCRIPTION": "hb_gcAlloc() is used to allocate the memory that will be tracked by the garbage collector. It allows to properly release memory in case of self-referencing or cross-referencing Harbour level variables. Memory allocated with this function should be released with hb_gcFree() function or it will be automatically deallocated by the GC if it is not locked or if it is not referenced by some Harbour level variable.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Garbage Collector",
				"SEEALSO": "hb_gcFree()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_gcCollectAll()",
				"ONELINER": "Scans all memory blocks and releases the garbage memory.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Garbage Collector",
				"SYNTAX": "void hb_gcCollectAll( void );",
				"ARGUMENTS": "None.",
				"RETURNS": "Nothing.",
				"DESCRIPTION": "This function scans the eval stack, the memvars table, the array of static variables and table of created classes for referenced memory blocks. After scanning all unused memory blocks and blocks that are not locked are released.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Garbage Collector",
				"SEEALSO": "hb_gcAlloc(), hb_gcFree()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_gcFree()",
				"ONELINER": "Releases the memory that was allocated with hb_gcAlloc().",
				"CATEGORY": "API",
				"SUBCATEGORY": "Garbage Collector",
				"SYNTAX": "void hb_gcFree( void * pMemoryPtr );",
				"ARGUMENTS": "<pMemoryPtr> The pointer to memory for release. This memory\npointer have to be allocated with hb_gcAlloc() function.",
				"RETURNS": "Nothing.",
				"DESCRIPTION": "hb_gcFree() is used to deallocate the memory that was allocated with the hb_gcAlloc() function.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Garbage Collector",
				"SEEALSO": "hb_gcAlloc()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_gcItemRef()",
				"ONELINER": "Marks the memory to prevent deallocation by the garbage collector.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Garbage Collector",
				"SYNTAX": "void hb_gcItemRef( PHB_ITEM pItem );",
				"ARGUMENTS": "<pItem>  The pointer to item structure that will be scanned. The passed item can be of any datatype although arrays, objects and codeblocks are scanned only. Other datatypes don't require locking so they are simply ignored.",
				"RETURNS": "Nothing.",
				"DESCRIPTION": "The garbage collector uses hb_gcItemRef() function during scanning of referenced memory pointers. This function checks the type of passed item and scans recursively all other memory blocks referenced by this item if it is an array, an object or a codeblock.\nNOTE: This function is reserved for the garbage collector only. It\ncannot be called from the user code - calling it can cause unpredicted results (memory blocks referenced by the passed item can be released prematurely during the closest garbage collection).",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Garbage Collector",
				"SEEALSO": "hb_gcAlloc(), hb_gcFree()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_Hash()",
				"ONELINER": "Returns a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_Hash( [ <Key1>, <Value1> ], [ <KeyN>, <ValueN> ], ... ) -> hTable",
				"ARGUMENTS": "<Key1> entry key; can be of type: number, date, datetime, string, pointer\n<Value1> entry value; can be of type: block, string, numeric, date/datetime, logical, nil, pointer, array, hash table\nEquivalent to:\n```\nhTable := { => }\nhTable := { <Key1> => <Value1>, <Key2> => <Value2>, <KeyN> => <ValueN> }\n```",
				"RETURNS": "A hash table built from the initial key/value pairs",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "hb_HAllocate()",
				"ONELINER": "Preallocates a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HAllocate( <hTable>, <nItems> )",
				"ARGUMENTS": "<hTable> a hash table\n<nItems> number of items to preallocate in the hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HAutoAdd()",
				"ONELINER": "Sets the 'auto add' flag for the hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HAutoAdd( <hTable>, [<lFlag>] ) -> <lPreviousFlag>",
				"ARGUMENTS": "<hTable> a hash table\n<lFlag> a logical value indicating to turn on or off the 'auto add' flag of the hash table",
				"RETURNS": "The previous value of the 'auto add' flag",
				"DESCRIPTION": "This function is equivalent to hb_HAutoAdd() but it returns the old flag value rather than the hash table",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL hsTable, lFlag\nhsTable := { \"one\" => 1, \"two\" => 2 }\n// turn 'auto add' on for a new hash table, storing old flag\nlFlag := hb_HAutoAdd( hsTable, .T. )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HBinary()",
				"ONELINER": "Sets the 'binary' flag for the hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HBinary( <hTable>, [<lFlag>] ) -> <lPreviousFlag>",
				"ARGUMENTS": "<hTable> a hash table\n<lFlag> a logical value indicating to turn on or off the 'binary' flag of the hash table",
				"RETURNS": "The previous value of the 'binary' flag",
				"DESCRIPTION": "This function is equivalent to hb_HBinary() but it returns the old flag value rather than the hash table",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL hsTable, lFlag\nhsTable := { \"one\" => 1, \"two\" => 2 }\n// turn 'binary' on for a new hash table, storing old flag\nlFlag := hb_HBinary( hsTable, .T. )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HCaseMatch()",
				"ONELINER": "Sets the 'case match' flag for the hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HCaseMatch( <hTable>, [<lFlag>] ) -> <lPreviousFlag>",
				"ARGUMENTS": "<hTable> a hash table\n<lFlag> a logical value indicating to turn on or off the 'case match' flag of the hash table",
				"RETURNS": "The previous value of the 'case match' flag",
				"DESCRIPTION": "This function returns the old flag value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL hsTable, lFlag\nhsTable := { \"one\" => 1, \"two\" => 2 }\n// turn 'case match' on for a new hash table, storing old flag\nlFlag := hb_HCaseMatch( hsTable, .T. )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HClone()",
				"ONELINER": "Creates a copy of a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HClone( <hTable> ) -> <hsDestination>",
				"ARGUMENTS": "<hTable> a hash table",
				"RETURNS": "A cloned copy of the hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HCopy()",
				"ONELINER": "Adds entries from the source hash table to the destination hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HCopy( <hsDestination>, <hsSource>, [<nStart>], [<nCount>] ) -> <hsDestination>",
				"ARGUMENTS": "<hsDestination> a destination hash table\n<hsSource> a source hash table\n<nStart> starting index, defaults to 1 if omitted\n<nCount> counter, defaults to (length) - <nStart> is omitted",
				"RETURNS": "The destination hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HDefault()",
				"ONELINER": "Returns/sets a default value for a hash table.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HDefault( <hTable>, <DefaultValue> ) -> <OldDefaultValue>",
				"ARGUMENTS": "<hTable> a hash table\n<DefaultValue>",
				"RETURNS": "The previous default value assigned to the hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HDel()",
				"ONELINER": "Removes a key/value pair from a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HDel( <hTable>, <Key> ) -> <hTable>",
				"ARGUMENTS": "<hTable> a hash table\n<Key> key to be removed from the hash table; can be of type: number, date, datetime, string, pointer",
				"RETURNS": "The hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HDelAt()",
				"ONELINER": "Removes an entry from a hash table based on its index position",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HDelAt( <hTable>, <nPosition> ) -> <hTable>",
				"ARGUMENTS": "<hTable> a hash table\n<nPosition> the position of an entry within the hash table that will be deleted",
				"RETURNS": "The hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HEval()",
				"ONELINER": "Evaluate a code block across the contents of a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HEval( <hTable>, <bBlock>, [<nStart>], [<nCount>] ) -> <hTable>",
				"ARGUMENTS": "<hTable> a hash table\n<bBlock> code block to be evaluated\n<nStart> starting index, defaults to 1 if omitted\n<nCount> counter, defaults to (length) - <nStart> is omitted",
				"RETURNS": "The hash table",
				"DESCRIPTION": "The code block is evaluated for every hash table entry starting at <nStart> for <nCount> items.\nThe code block is passed the entry key, value, and numeric position",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HFill()",
				"ONELINER": "Fills a hash table with a value",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HFill( <hTable>, <Value> ) -> <hTable>",
				"ARGUMENTS": "<hTable> a hash table\n<Value> fill value; can be of type: block, string, numeric, date/datetime, logical, nil, pointer, array, hash table",
				"RETURNS": "The hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HGet()",
				"ONELINER": "Returns a hash value",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HGet( <hTable>, <Key> ) -> <Value>",
				"ARGUMENTS": "<hTable> a hash table\n<Key> key to be retrieve from the hash table; can be of type: number, date, datetime, string, pointer",
				"RETURNS": "Either the value within the hash table for the given key.\nAn array access error occurs of the key is not found",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HGetDef()",
				"ONELINER": "Returns a hash value, or a default value if the key is not present",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HGetDef( <hTable>, <Key>, [<DefaultValue>] ) -> <Value>",
				"ARGUMENTS": "<hTable> a hash table\n<Key> key to be retrieve from the hash table; can be of type: number, date, datetime, string, pointer\n<DefaultValue> a default value to be returned if the hash table does not contain the key",
				"RETURNS": "Either the value within the hash table for the given key, or the default value.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HHasKey()",
				"ONELINER": "Determines whether a hash table has an entry with a give key",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HHasKey( <hTable>, <Key> ) -> lExists",
				"ARGUMENTS": "<hTable> a hash table\n<Key> a key value to be queried for; can be of type: number, date, datetime, string, pointer",
				"RETURNS": "A logical value indicating whether the key exists within the hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HKeyAt()",
				"ONELINER": "Gets a hash table key at a given position",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HKeyAt( <hTable>, <nPosition> ) -> <Key>",
				"ARGUMENTS": "<hTable> a hash table\n<nPosition> the position of an entry within the hash table that will be returned",
				"RETURNS": "The key at the given position of the hash table; the type will be one: number, date, datetime, string, pointer",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HKeys()",
				"ONELINER": "Returns an array of the keys of a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HKeys( <hTable> ) -> <aKeys>",
				"ARGUMENTS": "<hTable> a hash table",
				"RETURNS": "An array of all the hash table keys",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HMerge()",
				"ONELINER": "Merges a source hash table into a destination hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HMerge( <hsDestination>, <hsSource>, <bBlock>|<nPosition> ) -> <hsDestination>",
				"ARGUMENTS": "<hsDestination> a destination hash table\n<hsSource> a source hash table\n<bBlock> a code block that will be evaluated for each entry within the source hash table; the code block will be passed the entry key, value and position; if the code block returns a true value, the entry will be added to the destination hash table\n<nPosition> the position of an entry within the source hash table that will be appended to the destination hash table\nTODO: the source code passes either a number or HB_HASH_UNION; research this",
				"RETURNS": "The destination hash table with the contents of the source hash table merged",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HPairAt()",
				"ONELINER": "Returns a two-dimensional array of a hash table entry key/value pair",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HPairAt( <hTable>, <nPosition> ) -> <aKeyValue>",
				"ARGUMENTS": "<hTable> a hash table\n<nPosition> the position of an entry within the hash table that will be returned",
				"RETURNS": "A two-dimensional array of the key/value pair entry of the hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HPos()",
				"ONELINER": "Locates the index of a key within a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HPos( <hTable>, <Key> ) -> nPosition",
				"ARGUMENTS": "<hTable> a hash table\n<Key> key for which its position is to be determined; can be of type: number, date, datetime, string, pointer",
				"RETURNS": "A integer number being the index position of the key within the hash table.\nTODO: what is the return value if the key does not exist?  zero (0)?  RTE?",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HScan()",
				"ONELINER": "Scans a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HScan( <hTable>, <Value>, [<nStart>], [<nCount>, [<lExact>] ) -> nPosition",
				"ARGUMENTS": "<hTable> a hash table\n<Value> to be located within the hash table\n<nStart> starting index, defaults to 1 if omitted\n<nCount> counter, defaults to (length) - <nStart> is omitted\n<lExact> logical value indicating whether the comparison is to be be exact or not",
				"RETURNS": "The position of the located value within the hash table, or zero (0) if not found.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HSet()",
				"ONELINER": "Sets a hash value",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HSet( <hTable>, <Key>, <Value> ) -> <hTable>",
				"ARGUMENTS": "<hTable> a hash table\n<Key> the key of the entry to be set; can be of type: number, date, datetime, string, pointer\n<Value> the entry value",
				"RETURNS": "The hash table",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HSort()",
				"ONELINER": "Reorganizes the internal list of the hash table to be sorted",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HSort( <hTable> ) -> <hsSortedTable>",
				"ARGUMENTS": "<hTable> a hash table",
				"RETURNS": "The hash table sorted\nTODO: is the original table altered?",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HValueAt()",
				"ONELINER": "Gets/sets a hash value at a given position",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HValueAt( <hTable>, <nPosition>, [<NewValue>] ) -> <Value>",
				"ARGUMENTS": "<hTable> a hash table\n<nPosition> the position of an entry within the hash table that will be returned\n<NewValue> a new value to be assigned to the hash table at the given position",
				"RETURNS": "The existing value, or the new value if it is given",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_HValues()",
				"ONELINER": "Returns an array of the values of a hash table",
				"CATEGORY": "API",
				"SUBCATEGORY": "Hash table",
				"SYNTAX": "hb_HValues( <hTable> ) -> <aValues>",
				"ARGUMENTS": "<hTable> a hash table",
				"RETURNS": "An array of all the hash values",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Hash table"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_idleAdd()",
				"ONELINER": "Adds the background task.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Idle states",
				"SYNTAX": "hb_idleAdd( <bAction> ) --> nHandle",
				"ARGUMENTS": "<bAction> is a codeblock that will be executed during idle states. There are no arguments passed to this codeblock during evaluation.",
				"RETURNS": "<nHandle> The handle (an integer value) that identifies the task. This handle can be used for deleting the task.",
				"DESCRIPTION": "hb_idleAdd() adds a passed codeblock to the list of background tasks that will be evaluated during the idle states. There is no limit for the number of tasks.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "nTask := hb_idleAdd( {|| SayTime() } )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour extension similar to ft_OnTick() function available in NanForum library.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Idle states",
				"SEEALSO": "hb_idleDel(), hb_idleState()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_idleDel()",
				"ONELINER": "Removes the background task from the list of tasks.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Idle states",
				"SYNTAX": "hb_idleDel( <nHandle> ) --> bAction",
				"ARGUMENTS": "<nHandle> is the identifier of the task returned by the hb_idleAdd() function.",
				"RETURNS": "<bAction> NIL if invalid handle is passed or a codeblock that was passed to hb_idleAdd() function",
				"DESCRIPTION": "hb_idleDel() removes the action associated with passed identifier from the list of background tasks. The identifier should be the value returned by the previous call of hb_idleAdd() function.\nIf specified task is defined then the codeblock is returned otherwise the NIL value is returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "nTask := hb_idleAdd( {|| SayTime() } )\nInkey( 10 )\nbAction := hb_idleDel( nTask )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Idle states",
				"SEEALSO": "hb_idleAdd(), hb_idleState()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "hb_idleState()",
				"ONELINER": "Evaluates a single background task and calls the garbage collector.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Idle states",
				"SYNTAX": "hb_idleState()",
				"ARGUMENTS": "None",
				"DESCRIPTION": "hb_idleState() requests the garbage collection and executes a single background task defined by the codeblock passed with hb_idleAdd() function. Every call to this function evaluates a different task in the order of task creation. There are no arguments passed during a codeblock evaluation.\nThis function can be safely called even if there are no background tasks defined.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "nTask1 := hb_idleAdd( {|| SayTime() } )\nnTask2 := hb_idleAdd( {|| SaveScreen() } )\nDO WHILE ! bFinished\n   bFinished := DoSomethingVeryImportant()\n   hb_idleState()\nENDDO\ncbAction := hb_idleDel( nTask1 )\nhb_idleDel( nTask2 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour extension similar to ft_IAmIdle() function available in NanForum library.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Idle states",
				"SEEALSO": "hb_idleAdd(), hb_idleDel()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvDbgInfo()",
				"ONELINER": "This function returns the information about the variables for debugger",
				"CATEGORY": "API",
				"SUBCATEGORY": "Internal",
				"SYNTAX": "__mvDbgInfo( <nScope> [, <nPosition> [, @<cVarName>] ] )",
				"ARGUMENTS": "<nScope> = the scope of variables for which an information is asked\nSupported values (defined in hbmemvar.ch)\n<table-noheader>\n HB_MV_PUBLIC\n HB_MV_PRIVATE (or any other value)\n</table>\n<nPosition> = the position of asked variable on the list of variables with specified scope - it should start from position 1 <cVarName> = the value is filled with a variable name if passed by reference and <nPosition> is specified",
				"RETURNS": "The return value depends on the number of arguments passed",
				"DESCRIPTION": "This function retrieves the information about memvar variables. It returns either the number of variables with given scope (when the first argument is passed only) or a value of variable identified by its position in the variables' list (when second argument is passed). It also returns the name of a variable if optional third argument is passed by reference.\nIf requested variable doesn't exist (requested position is greater then the number of defined variables) then NIL value is returned and variable name is set to `?`.\nThe dynamic symbols table is used to find a PUBLIC variable then the PUBLIC variables are always sorted alphabetically. The PRIVATE variables are sorted in the creation order.\nNote:\nDue to dynamic nature of memvar variables there is no guarantee that successive calls to retrieve the value of Nth PUBLIC variable will return the value of the same variable.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbmemvar.ch\"\n\nMEMVAR cPublic\nMEMVAR cPrivate\nMEMVAR ccPublic\nMEMVAR ccPrivate\n\nPROCEDURE Main()\n\n   LOCAL nCount, tmp, xValue, cName\n\n   nCount := __mvDbgInfo( HB_MV_PUBLIC )\n   FOR tmp := 1 TO nCount\n      xValue := __mvDbgInfo( HB_MV_PUBLIC, tmp, @cName )\n      ? tmp, cName, xValue\n   NEXT\n\n   ? \"PUBLIC=\", __mvDbgInfo( HB_MV_PUBLIC )\n   ? \"PRIVATE=\", __mvDbgInfo( HB_MV_PRIVATE )\n\n   PUBLIC cPublic := \"cPublic in MAIN\"\n\n   ? \"PUBLIC=\", __mvDbgInfo( HB_MV_PUBLIC )\n   ? \"PRIVATE=\", __mvDbgInfo( HB_MV_PRIVATE )\n\n   PRIVATE cPrivate := \"cPrivate in MAIN\"\n\n   ? \"PUBLIC=\", __mvDbgInfo( HB_MV_PUBLIC )\n   ? \"PRIVATE=\", __mvDbgInfo( HB_MV_PRIVATE )\n\n   CountMemvars()\n\n   ? \"Back in Main\"\n   ? \"PUBLIC=\", __mvDbgInfo( HB_MV_PUBLIC )\n   ? \"PRIVATE=\", __mvDbgInfo( HB_MV_PRIVATE )\n\n   RETURN\n\nSTATIC PROCEDURE CountMemvars()\n\n   LOCAL nCount, tmp, xValue, cName\n\n   PUBLIC ccPublic := \"ccPublic\"\n   PRIVATE ccPrivate := \"ccPrivate\"\n\n   ? \"In CountMemvars\"\n   ? \"PUBLIC=\", __mvDbgInfo( HB_MV_PUBLIC )\n   ? \"PRIVATE=\", __mvDbgInfo( HB_MV_PRIVATE )\n\n   PRIVATE cPublic := \"cPublic\"\n\n   ? \"PUBLIC=\", __mvDbgInfo( HB_MV_PUBLIC )\n   ? \"PRIVATE=\", __mvDbgInfo( HB_MV_PRIVATE )\n\n   nCount := __mvDbgInfo( HB_MV_PRIVATE ) + 1\n   FOR tmp := 1 TO nCount\n      xValue := __mvDbgInfo( HB_MV_PRIVATE, tmp, @cName )\n      ? tmp, \"=\", cName, xValue\n   NEXT\n\n   nCount := __mvDbgInfo( HB_MV_PUBLIC ) + 1\n   FOR tmp := 1 TO nCount\n      xValue := __mvDbgInfo( HB_MV_PUBLIC, tmp, @cName )\n      ? tmp, \"=\", cName, xValue\n   NEXT\n\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "This function should be called from the debugger only.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Internal"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__SetHelpK()",
				"ONELINER": "Set <F1> as the default help key",
				"CATEGORY": "API",
				"SUBCATEGORY": "Internal",
				"SYNTAX": "__SetHelpK()",
				"ARGUMENTS": "None.",
				"DESCRIPTION": "Set <F1> to execute a function called HELP if such a function is linked into the program.",
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Internal",
				"SEEALSO": "__XHelp(), SET KEY, SetKey()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__TextRestore()",
				"ONELINER": "Restore console output settings as saved by __TextSave()",
				"CATEGORY": "API",
				"SUBCATEGORY": "Internal",
				"SYNTAX": "__TextRestore()",
				"ARGUMENTS": "none.",
				"DESCRIPTION": "__TextRestore() is used in the preprocessing of the TEXT TO command to restore console output settings that were previously saved by __TextSave().",
				"STATUS": "Ready",
				"COMPLIANCE": "Undocumented CA-Cl*pper v5.x function available in builds with HB_CLP_UNDOC option enabled (default)",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Internal",
				"SEEALSO": "Set(), SET ALTERNATE, SET PRINTER, TEXT, __TextSave()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__TextSave()",
				"ONELINER": "Redirect console output to printer or file and save old settings",
				"CATEGORY": "API",
				"SUBCATEGORY": "Internal",
				"SYNTAX": "__TextSave( <cFile> )",
				"ARGUMENTS": "<cFile> is either \"PRINTER\" (note the uppercase) in which console output is SET to PRINTER, or a name of a text file with a default `.txt` extension, that is used to redirect console output.",
				"DESCRIPTION": "__TextSave() is used in the preprocessing of the `TEXT TO` command to redirect the console output while saving old settings that can be restored later by __TextRestore().",
				"STATUS": "Ready",
				"COMPLIANCE": "Undocumented CA-Cl*pper v5.x function available in builds with HB_CLP_UNDOC option enabled (default)",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Internal",
				"SEEALSO": "Set(), SET ALTERNATE, SET PRINTER, TEXT, __TextRestore()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__XHelp()",
				"ONELINER": "Determines whether a HELP() user defined function exists.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Internal",
				"SYNTAX": "__XHelp() --> xValue",
				"ARGUMENTS": "None",
				"RETURNS": "This function returns aleatory values.",
				"DESCRIPTION": "This is an internal undocumented CA-Cl*pper function, which will try to call the user defined function HELP() if it is defined in the current application. This is the default SetKey() handler for the <F1> key.",
				"STATUS": "Ready",
				"COMPLIANCE": "Undocumented CA-Cl*pper v5.x function available in builds with HB_CLP_UNDOC option enabled (default)",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Internal"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "CLIPINIT()",
				"ONELINER": "Initialize various Harbour sub-systems",
				"CATEGORY": "API",
				"SUBCATEGORY": "Internal",
				"SYNTAX": "CLIPINIT() --> NIL",
				"ARGUMENTS": "none.",
				"RETURNS": "CLIPINIT() always return NIL.",
				"DESCRIPTION": "CLIPINIT() is one of the pre-defined INIT PROCEDURE and is executed at program startup. It declare an empty MEMVAR PUBLIC array called GetList that is going to be used by the Get system. It activates the default error handler, and (at least for the moment) calls the function that sets the default help key.",
				"STATUS": "Ready",
				"COMPLIANCE": "It is said that CLIPINIT() should not call the function that sets the default help key since CA-Cl*pper does it in some other place.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Internal",
				"SEEALSO": "INIT PROCEDURE"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetAccept()",
				"ONELINER": "Wait until a socket is ready",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetAccept( <socket> ) --> <SOCKET>",
				"ARGUMENTS": "An INET socket",
				"RETURNS": "<socket> a socket previously created / opened",
				"DESCRIPTION": "Waits until a connection is available on a socket created with hb_inetServer(), returns a socket that can be used to communicate with the incoming client.\nOn error, NIL is returned and error code sets in the passed <SOCKET>.\nThis error can be accessed using hb_inetErrorCode() function.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetAddress()",
				"ONELINER": "Get a remote server address",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetAddress( <socket> ) --> cResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Server address",
				"DESCRIPTION": "Returns a string representing the remote server address in quad dot notation, e.g. \"127.0.0.1\", or the local server address if the socket is server side.\nTODO: have a version that returns a vector of 4 numbers.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "hb_inetCleanup()",
				"ONELINER": "Terminate Harbour INET support",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetCleanup()",
				"ARGUMENTS": "(This function has no arguments)",
				"DESCRIPTION": "Closes inet support; mainly used for Windows. Put it at the end of any program using Inet functions, just before the program exits.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "hb_inetClearError()",
				"ONELINER": "Clear the socket error value",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetClearError( <socket> )",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "hb_inetClearPeriodCallback()",
				"ONELINER": "Clear the periodic callback value of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetClearPeriodCallback( <socket> )",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "hb_inetClearTimeLimit()",
				"ONELINER": "Clear the time limit value of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetClearTimeLimit( <socket> )",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"DESCRIPTION": "Clears the default time limit of the given socket.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "hb_inetClearTimeout()",
				"ONELINER": "Clear the timeout value of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetClearTimeout( <socket> )",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"DESCRIPTION": "Clears the default timeout of the given socket. Default timeout is used in all blocking operations.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetClose()",
				"ONELINER": "Close an INET socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetClose( <socket> ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Returns 0 on success or -1 on error; on error, the error code is set; (actually, on success the socket error code is set to 1 -- socket closed )",
				"DESCRIPTION": "Closes the socket, notifying both ends of the communication pipe that the connection is over.\nIf you have threads waiting for data to be read from this socket, this method will make them stop waiting and return an error (socket closed) to their callers.\nThe method does not destroy the socket, which can be used by subordinate threads to check that the socket is closed, and so they should stop as soon as they can. Don't destroy the socket unless you are sure that no other thread is using it.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetConnect()",
				"ONELINER": "Connect a socket to a remote server by IP address or name",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetConnect( <cAddress>, <nPort> ) --> <SOCKET>\n\nhb_inetConnect( <cAddress>, <nPort>, <socket> ) --> NIL",
				"ARGUMENTS": "<cAddress>\n<nPort>\n<socket>",
				"RETURNS": "(First form) INET socket\n(Second form has no return value)",
				"DESCRIPTION": "Connects to a remote server described by <cAddress>, that can be in quad dot notation (e.g. \"127.0.0.1\") or in DNS name (e.g. \"example.org\"), using the desired port.\nhb_inetConnect() uses \"gethostbyname\" C system call to find the network address of the specified server; this means that this call is an hybrid function doing both a DNS scan and a TCP/IP connection. hb_inetConnect() is not thread safe, and the program must take care that two hb_inetConnect() functions are never called at the same moment from two different threads (or that hb_inetGetHosts() is not called in the same moment as an hb_inetConnect()).\nThe second version of this function accepts a pre-built socket as a parameter. This allows to kill asynchronously a thread waiting for hb_inetConnect() to connect, and then cleaning up the leftover socket data. Also, it is possible to give timeout to the given <SOCKET>, but this timeout will be used only in the connection phase, after that the network address resolution is completed. Use hb_inetGetHosts() and hb_inetConnectIP() for a finer timeout control. On error, the error of the returned socket is set. The error could be due to unavailable name resolving service, host name not valid, host address not reachable and host reachable but port not open.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetConnectIP()",
				"ONELINER": "Connect to a remote server by IP address",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetConnectIP( <cAddress>, <nPort> ) --> <SOCKET>\n\nhb_inetConnectIP( <cAddress>, <nPort>, <socket> ) --> NIL",
				"ARGUMENTS": "<cAddress>\n<nPort>\n<socket>",
				"RETURNS": "(First form) INET socket\n(Second form has no return value)",
				"DESCRIPTION": "Connects to a remote server described by <cAddress>, that can be specified only in quad dot IPv4 notation (e.g. \"127.0.0.1\"), using the desired port. This version of hb_inetConnect() does not use gethostbyname(), and thus is thread safe and can be used in combination with hb_inetGetHosts() to have a finer timeout control while connecting to a server, and a finer error control.\nThe second version of this function accepts a pre-built socket as a parameter. This allows to kill asynchronously a thread waiting for hb_inetConnectIP() to connect, and then cleaning up the leftover socket data. Also, it is possible to give timeout at the given <SOCKET>.\nOn error, the error of the returned socket is set.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetCount()",
				"ONELINER": "Get the number of bytes last read or sent",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetCount( <socket> ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Last socket operation character count",
				"DESCRIPTION": "Returns the amount of characters read or written in the latest socket operation.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetCreate()",
				"ONELINER": "Create an INET socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetCreate( [ <nTimeout> ] ) --> <SOCKET>",
				"ARGUMENTS": "<nTimeout> Socket timeout (optional) TODO: what is the scale (seconds, milliseconds?)",
				"RETURNS": "An INET socket",
				"DESCRIPTION": "Creates the raw data of the socket, that can be passed to a asynchronous connection function (hb_inetConnect() or hb_inetConnectIP()). This will prevent the connection function from allocating some data that could be never used in certain cases, i.e. an asynchronously detected timeout.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetCRLF()",
				"ONELINER": "Get a CRLF sequence for internet protocols",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetCRLF() --> cResult",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "Internet CRLF sequence",
				"DESCRIPTION": "Returns a CRLF sequence used in many internet protocols.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetDataReady()",
				"ONELINER": "Get whether there is data ready in a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetDataReady( <socket>, [ <nMillisec> ] ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<nMillisec>",
				"RETURNS": "If there is data available 1 (one) is returned, 0 (zero) if there is no data and -1 if there is an  error.",
				"DESCRIPTION": "Verifies if some data is available to be read in the socket without blocking execution of the caller.\nIf <nMillisecs> is not given, the function returns immediately 1 if there is some data to be read, 0 if there isn't any data and -1 in case of error.\nIf <nMillisecs> is given, the function will wait up to that amount of milliseconds for data to be available; if some data arrives in the meanwhile, the wait is immediately interrupted.\nThe next hb_inetRecv() function will read all the available data (up to the required length) without blocking.\nOn error, hb_inetErrorCode() and hb_inetErrorDesc() can be use to determine what kind of error happened.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetDGram()",
				"ONELINER": "Create a datagram socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetDGram( [<lBroadcast>] ) --> <SOCKET>",
				"ARGUMENTS": "<lBroadcast>",
				"RETURNS": "An INET socket",
				"DESCRIPTION": "Creates a datagram-oriented socket that will be able to send data and eventually receive data. Since the socket is not bound, the program can't retrieve the address at which this socket appears to be, but a second socket receiving a message sent from this one would be able to reply correctly with a datagram that can be read from a non-bound socket.\nIf <lBroadcast> is set to .T., the routine creates a broadcast capable socket: it will be able to receive and send broadcast messages. On most systems this requires special user privileges.\nReturns the socket, and if an error occurs, the socket error message and code are set.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetDGramBind()",
				"ONELINER": "Create a bound datagram socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetDGramBind( <nPort>, [<cAddress> [, <lBroadcast>] ] ) --> <SOCKET>",
				"ARGUMENTS": "<nPort>\n<cAddress>\n<bBroadcast>",
				"RETURNS": "An INET socket",
				"DESCRIPTION": "Creates a datagram-oriented socket and binds it to a particular port, and eventually to a certain interface if <cAddress> is given and not NIL.\nIf <lBroadcast> is set to .T., the routine creates a broadcast capable socket: it will be able to receive and send broadcast messages. On most systems this requires special user privileges.\nReturns the socket\nIf an error occurs, the socket error message and code are set.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetDGramRecv()",
				"ONELINER": "Get data from a datagram socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetDGramRecv( <socket>, @<cBuffer> [, <nSize> ] ) --> nBytesRead",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<cBuffer> is the target buffer and must be passed by reference\n<nSize>",
				"RETURNS": "Returns number of bytes read, or -1 on error",
				"DESCRIPTION": "Reads at maximum <nSize> bytes incoming from a UDP socket, if <nSize> is given, or reads at maximum <cBuffer> length if <nSize> is not given.\nThere isn't any guarantee that all the data required to be read is really sent from the kernel to the application: the kernel should just return the last complete datagram that has been received, up to <nSize> bytes.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetDGramSend()",
				"ONELINER": "Send data to a datagram socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetDGramSend( <socket>, <cAddress>, <nPort>, <cBuffer> [, <nSize> ] ) --> nBytesSent",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<cAddress>\n<nPort>\n<cBuffer>\n<nSize>",
				"RETURNS": "Returns number of bytes sent, or -1 on error",
				"DESCRIPTION": "Sends a datagram (a fixed length data) to a determined IP address (<cAddress>, to be specified in quad-dot notation) and port.\nIf <nSize> is not specified, all the data in <cBuffer> will be sent; if <nSize> is specified, only the first <nSize> bytes of <cBuffer> will be sent.\nThere isn't any guarantee that all the data required to be written is really sent to the socket: the calling program should check for the numeric return and send iteratively the unsent data to complete the message.\nAnyway, the raw datagram is sent and received as once, and any data less than the system datagram size will be sent and received as a single item.\nIf the socket is created in broadcast mode, the <cAddress> element can be a broadcast address.\nReturns -1 on error, or the number of bytes actually sent on success.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetErrorCode()",
				"ONELINER": "Get the last INET error code",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetErrorCode( <socket> ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Last error code",
				"DESCRIPTION": "Returns the last error code that has been provoked by a network operation, or 0 if none.\nError codes are the ones used for winsock or UnixSockets (they are the same); 1 is reserved for \"connection closed\" message.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetErrorDesc()",
				"ONELINER": "Get the last INET error code description",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetErrorDesc( <socket> ) --> cResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "System-dependent error string",
				"DESCRIPTION": "Returns a string describing the last error that occurred in the socket; the string is system dependent, and should be used only for debugging purposes.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetFD()",
				"ONELINER": "?",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetFD( <socket> [, <lNoSocket> ] ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<lNoSocket>",
				"RETURNS": "?",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetGetAlias()",
				"ONELINER": "Get an array of aliases of a server",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetGetAlias( <cName> ) --> aHosts",
				"ARGUMENTS": "<cName>",
				"RETURNS": "Array of server aliases",
				"DESCRIPTION": "Returns an array containing the aliases ( CNAME DNS records ) by which the server is currently known.\nWhether this function is able to have the complete list of aliases or not depends on the verbosity of the DNS server.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetGetHosts()",
				"ONELINER": "Get an array of IP addresses of a host",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetGetHosts( <cName> ) --> aHosts",
				"ARGUMENTS": "<cName>",
				"RETURNS": "An array of IP addresses",
				"DESCRIPTION": "Returns an array containing all the IP addresses associated with a given host name. The IP addresses returned by this function are strings in quad dot notations, e.g. \"127.0.0.1\", and can be directly used into hb_inetConnectIP().\n<cName> can be any string: valid DNS names (e.g. \"example.org\"), locally available names (e.g. \"localhost\" or windows Network Neighborhood names), or even IP addresses in quad dot notation.\nNOTE: This function is not thread safe (by design), and programmers must be sure not to use it at the same time in two different threads, or not to use it together with a hb_inetConnect(). If this kind of situation should ever arise, you are advised to use a thread MUTEX.\nOn error, and if the server can't be found, the function returns NIL.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetGetRcvBufSize()",
				"ONELINER": "Get the socket receive buffer size",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetGetRcvBufSize( <socket> ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Returns the socket receive buffer size or -1 if the socket is closed or an error occurs",
				"DESCRIPTION": "Returns the socket receive buffer size or -1 if the socket is closed or an error occurs",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetGetSndBufSize()",
				"ONELINER": "Get the socket send buffer size",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetGetSndBufSize( <socket> ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Returns the socket send buffer size or -1 if the socket is closed or an error occurs",
				"DESCRIPTION": "Returns the socket send buffer size or -1 if the socket is closed or an error occurs",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetInit()",
				"ONELINER": "Activate Harbour INET support",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetInit() --> lResult",
				"ARGUMENTS": "(This function has no arguments)",
				"RETURNS": "Returns .T. or .F. whether the internal INET system was successfully initialized",
				"DESCRIPTION": "Activates inet support; mainly used for winsock start up at the moment, but could be used in the future for many other purpose. Put it at the beginning of every program using INET functions.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetIsSocket()",
				"ONELINER": "Get whether a variable is a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetIsSocket( <socket> ) --> lResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Returns whether the passed parameter is a socket",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetPeriodCallback()",
				"ONELINER": "Get or change the periodic callback value of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetPeriodCallback( <socket> [, <xCallback> ] ) --> xPreviousCallback",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<xCallback> a new periodic callback",
				"RETURNS": "The previous periodic callback value",
				"DESCRIPTION": "Sets or returns the socket periodic callback value\n<xCallback> can be one of: a codeblock, an array of (...), or a (symbol) TODO: describe these better",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetPort()",
				"ONELINER": "Get the port a socket is bound to.",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetPort( <socket> ) --> cResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Port name the socket is bound to.",
				"DESCRIPTION": "Returns the port to which this socket is bound, or the remote port if this socket is connected with a remote host or client",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetRecv()",
				"ONELINER": "Read from a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetRecv( <socket>, @<cResult>, [ <nAmount> ] ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<cResult> is the target buffer and must be passed by reference\n<nAmount> is the upper limit of characters to be read from the socket. If not passed this defaults to the length of <cResult>",
				"RETURNS": "The number of the characters read from the socket.",
				"DESCRIPTION": "Reads from the socket into a buffer.\nThe parameter <cString> must be preallocated so that it has enough space to receive the data. The routine will block the thread until some bytes are read from the socket, the socket is closed (either from the receiver or the sender side) or a network error occurs, whichever comes first. In the latter cases, an error is set, and only the characters received until premature end of communications are returned.\nNotice that there is no guarantee that all the available bytes will be read before the function returns, in fact, hb_inetRecv() returns as soon it is able to fill <cString> with one or more bytes. To block the current process until the whole <cString> is filled (or <nAmount> bytes are read), use the hb_inetRecvAll().",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetRecvAll()",
				"ONELINER": "Read from a socket without blocking",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetRecvAll( <socket>, @<cResult>, [ <nAmount> ] ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<cResult> is the target buffer and must be passed by reference\n<nAmount> is the upper limit of characters to be read from the socket. If not passed this defaults to the length of <cResult>",
				"RETURNS": "The number of the characters read from the socket. Might be less than <nAmount> on premature socket closing or on network error.",
				"DESCRIPTION": "This function works exactly as hb_inetRecv() except that it blocks until <nAmount> bytes are read, if <nAmount> is given, or <cString> is filled for its whole length.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetRecvEndblock()",
				"ONELINER": "Read a block from a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetRecvEndblock( <socket> [, <cBlock >[, @<nBytesRead> [, <nMaxLength> [, <nBufSize> ]]]] ) --> cResult",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<cBlock>\n<nBytesRead>\n<nMaxLength>\n<nBufSize>",
				"RETURNS": "Block read",
				"DESCRIPTION": "This function operates exactly the same way as hb_inetRecvLine(), but the \"record termination\" is customizable through the <cBlock> parameter. If not given, this parameter defaults to the CRLF sequence.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetRecvLine()",
				"ONELINER": "Read a line from a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetRecvLine( <socket> [, @<nBytesRead>, [, <nMaxLength> [, <nBufSize> ]]] ) --> cResult",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<nBytesRead> must be passed by reference\n<nMaxLength>\n<nBufSize>",
				"RETURNS": "Line read",
				"DESCRIPTION": "Blocks the calling thread until a sequence CRLF is read from the socket. Incremental allocation and end-of-line checking are done in an efficient way.\nIf an error occurs, or if the stream is closed before a CRLF is read, the function returns nothing and sets the socket error.\nThe returned string does not contain the trailing CRLF sequence, so an empty line is effectively returned as an empty string.\nIf the <nBytesRead> parameter is given, it will contain the number of bytes read from the socket, including the CRLF sequence, so that in normal conditions, <nResult> will report a count equal to the length of the returned string plus 2. <nBytesRead> will be 0 if stream is closed before a CRLF sequence is read, and will be -1 on error.\nAn optional <nMaxLength> parameter can be given to allow a maximum character count before the data is returned anyway. If this number is reached before a CRLF sequence is encountered, <nBytesRead> will contain the value one.\nFinally, a <nBufSize> parameter can be given. If not, memory allocation will be increased by discrete amounts of 80 bytes. The programmer can provide here a different allocation strategy (e.g. setting <nBufSize> equal to <nMaxLength>, memory for reading the line will be allocated only once, at the beginning of the function).",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetstatus()",
				"ONELINER": "Get the status of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetstatus( <socket> ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened",
				"RETURNS": "Returns 1 (one) if the socket exists, -1 if it does not",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetSend()",
				"ONELINER": "Sent data through a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetSend( <socket>, <cBuffer> [, <nLength> ] ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<cBuffer>\n<nLength>",
				"RETURNS": "The amount of data written, 0 (zero) if the socket is closed, or -1 on an error",
				"DESCRIPTION": "Send data being stored in a string over the socket.\nThe <nLength> parameter can be given to allow writing only a part of the string.\nThere is no guarantee that all of <cBuffer> will be sent, as this is a decision that is up to the OS; this function does not take care to ensure that the data is really sent; check the returned number and send the part that has not been sent.\nTo ensure that all the data is sent before the function returns, use the hb_inetSendAll() function.\nOn error, the error in the socket is set.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetSendAll()",
				"ONELINER": "Send data through a socket with blocking",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetSendAll( <socket>, <cBuffer> [, <nLength> ] ) --> nResult",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<cBuffer>\n<nLength>",
				"RETURNS": "The amount of data written, 0 (zero) if the socket is closed, or -1 on an error",
				"DESCRIPTION": "This function works exactly as hb_inetSend() but it ensures that all the data to be sent is written before returning.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetServer()",
				"ONELINER": "Create a socket bound to a port",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetServer( <port> [, <cBindAddr> [, <nListenLimit> ]]  ) --> <SOCKET>",
				"ARGUMENTS": "<port>\n<cBindAddr>\n<nListenLimit> is an internal parameter and rarely needs to be passed, defaults to 10",
				"RETURNS": "An INET socket",
				"DESCRIPTION": "Creates a server that can accept connections from client on a certain port.\nIf the computer on which hb_inetServer() is called has more than one logical interface (e.g. one network card, one loopback and one PPP address), <cBindAddr> can be specified to select only one of these interfaces to accept connections for this process. This is useful when a server is present on two networks, and the service is to be available only in one of them. Also, the same port on other addresses is left free to be used, so you can have different server programs running for different networks but managing the same service. For example, an FTP server available to the internal network could be radically different from an FTP server available for the internet.\n<nListenLimit> is the number of incoming connections accepted by kernel before the kernel has the chance to report them to the application program. If the sockets receive <nListenLimit> connections before accepting them all, the `nListenLimit + 1` connection will be notified to be \"busy\" by the kernel. The default value of 10 is enough for even a heavy duty server.\nOn error, sets error description in the newly returned socket.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetSetRcvBufSize()",
				"ONELINER": "Set the receive buffer size of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetSetRcvBufSize( <socket>, <nSize> ) --> nSize",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<nSize>",
				"RETURNS": "Returns the passed <nSize> or -1 on error",
				"DESCRIPTION": "Sets the receive buffer size of a socket",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetSetSndBufSize()",
				"ONELINER": "Set the send buffer size of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetSetSndBufSize( <socket>, <nSize> ) --> nSize",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<nSize>",
				"RETURNS": "Returns the passed <nSize> or -1 on error",
				"DESCRIPTION": "Sets the send buffer size of a socket",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetTimeLimit()",
				"ONELINER": "Get or change the time limit value of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetTimeLimit( <socket> [, <nTimeLimit> ) --> NIL",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<nTimeLimit>",
				"RETURNS": "Returns the previous time limit value of the socket",
				"DESCRIPTION": "Sets or changes the time limit value of the socket.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_inetTimeout()",
				"ONELINER": "Get or change the timeout value of a socket",
				"CATEGORY": "API",
				"SUBCATEGORY": "INET",
				"SYNTAX": "hb_inetTimeout( <socket> [, <nTimeout> ] ) --> nPreviousTimeout",
				"ARGUMENTS": "<socket> a socket previously created / opened\n<nTimeout> is the new socket timeout value",
				"RETURNS": "Returns the previous timeout value of the socket",
				"DESCRIPTION": "Sets or changes the timeout value of the socket.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, INET"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_cdpSelect()",
				"ONELINER": "Select the active code page by language ID",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "hb_cdpSelect( [<cNewLang>] ) --> cOldLang",
				"ARGUMENTS": "<cNewLang>  The optional ID of the language module. Possible values for <cNewLang> are below as defined in the Codepage library, sorted by language.\n<table>\n Language              Codepage       <cNewLang>\n Bulgarian             866            BG866\n Bulgarian             ISO-8859-5     BGISO\n Bulgarian             MIK            BGMIK\n Bulgarian             Windows-1251   BGWIN\n Croatian              437            HR437\n Croatian              852            HR852\n Croatian              Windows-1250   HRWIN\n Czech                 852            CS852\n Czech                 ISO-8859-2     CSISO\n Czech                 KAM            CSKAM\n Czech                 Windoes-1250   CSWIN\n English               437            EN\n French                850            FR850\n German                850            DE850\n German                ISO-8859-1     DEWIN\n Greek                 737            EL737\n Greek                 Windows-1253   ELWIN\n Hungarian (ntxhu852)  852            HU852C\n Hungarian (sixhu852)  852            HU852\n Hungarian (sixhu852)  CWI-2          HUCWI\n Hungarian             ISO-8859-2     HUISO\n Hungarian             Windows-1250   HUWIN\n Italian               437            IT437\n Italian               850            IT850\n Italian               ISO-8859-1b    ITISB\n Italian               ISO-8859-1     ITISO\n Lithuanian            Windows-1257   LTWIN\n Polish                852            PL852\n Polish                ISO-8859-2     PLISO\n Polish                Mazowia        PLMAZ\n Polish                Windows-1250   PLWIN\n Portuguese            850            PT850\n Portuguese            ISO-8859-1     PTISO\n Russian               866            RU866\n Russian               KOI-8          RUKOI8\n Russian               Windows-1251   RU1251\n Serbian               Windows-1251   SRWIN\n Slovak                852            SK852\n Slovak                ISO-8859-2     SKISO\n Slovak                Kamenicky      SKKAM\n Slovak                Windows-1250   SKWIN\n Slovenian             437            SL437\n Slovenian             852            SL852\n Slovenian             ISO-8859-2     SLISO\n Slovenian             Windows-1250   SLWIN\n Spanish               850            ES850\n Spanish               ISO-8859-1     ESWIN\n Spanish Modern        ISO-8859-1     ESMWIN\n Swedish               850            SV850\n Swedish (Clipper)     437            SV437C\n Swedish               ISO-8859-1     SVWIN\n Turkish               857            TR857\n Turkish               Windows-1254   TRWIN\n Ukrainian             866            UA866\n Ukrainian             KOI-8U         UAKOI8\n Ukrainian             Windows-1251   UA1251\n</table>",
				"RETURNS": "<cOldLang>   The old language identifier",
				"DESCRIPTION": "hb_cdpSelect() set the active code page use by Harbour for sorting and comparing strings. The default code page use ASCII order (cLang == \"EN\").\nNOTE: You must REQUEST every code page module you intend to use. For example: to use the French 850 code page you must add the following to your program: `REQUEST HB_CODEPAGE_FR850`",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "REQUEST HB_CODEPAGE_FR850\nhb_cdpSelect( \"EN\" )\n? hb_cdpSelect()\n? hb_UTF8ToStr( \"É < G is\" ), hb_BChar( 144 ) < \"G\"  // --> É < G is .F.\nhb_cdpSelect( \"FR850\" )\n? hb_cdpSelect()\n? hb_UTF8ToStr( \"É < G is\" ), hb_BChar( 144 ) < \"G\"  // --> É < G is .T."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "This function is a Harbour Extension.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "hb_langName(), hb_langSelect(), hb_Translate(), NationMsg(), REQUEST"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_langErrMsg()",
				"ONELINER": "Description of an error code using current language",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "hb_langErrMsg( <nErrorCode> ) --> cErrorMessage",
				"ARGUMENTS": "<nErrorCode> is one of the generic error codes (`EG_...`) defined in error.ch",
				"RETURNS": "hb_langErrMsg() return the error message string represented by the code <nErrorCode>.",
				"DESCRIPTION": "This function return the error message associated with an error code using the current language selected.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"error.ch\"\nREQUEST HB_LANG_ES\n? \"English:\", hb_langErrMsg( EG_ARG )  // --> English: Argument error\nhb_langSelect( \"es\" )\n? \"Spanish:\", hb_langErrMsg( EG_ARG )  // --> Spanish: Error de argumento"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header is error.ch",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "hb_langSelect(), NationMsg()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_langMessage()",
				"ONELINER": "Returns international strings messages and errors",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "hb_langMessage( <nMsg>[, <cLangID>] ) --> cMessage",
				"ARGUMENTS": "<nMsg>    is the message number to get. <cLangID> is an optional language module ID. Uses the currently\nselected language module, if not specified.",
				"RETURNS": "hb_langMessage() return the text associated with the code <nMsg>.",
				"DESCRIPTION": "hb_langMessage() is similar to NationMsg() but give access to the whole list of language messages: Day and month names, generic error messages, internal errors, and others...\nUse the header file hblang.ch for a list of base values for <nMsg>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hblang.ch\"\nREQUEST HB_LANG_ES\n? \"English:\", hb_langMessage( HB_LANG_ITEM_BASE_DAY + 1 )  // --> English: Monday\nhb_langSelect( \"es\" )\n? \"Spanish:\", hb_langMessage( HB_LANG_ITEM_BASE_DAY + 1 )  // --> Spanish: Lunes\n? \"English:\", hb_langMessage( HB_LANG_ITEM_BASE_DAY + 1, \"en\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header is hblang.ch",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "hb_langSelect(), NationMsg(), REQUEST"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_langName()",
				"ONELINER": "Return the name of the language module",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "hb_langName( [<cLangID>] ) --> cLangName",
				"ARGUMENTS": "<cLangID> is an optional language module ID. Uses the currently\nselected language module, if not specified.",
				"RETURNS": "<cLangName>  Name of the language module",
				"DESCRIPTION": "This function return the name of the language module in use or specified.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "REQUEST HB_LANG_PT\nREQUEST HB_LANG_RO\nREQUEST HB_LANG_ES\nREQUEST HB_LANG_PL\n? hb_langName( \"pl\" )\n? hb_langName( \"<non-existent>\" )\nhb_langSelect( \"pt\" )       // Default language is now Portuguese\n? CDoW( Date() )            // --> Segunda-feira\n? \"Current language is\", hb_langName()              // --> Portuguese\n? \"Old language id selected is\", hb_langSelect()    // --> pt\nhb_langSelect( \"ro\" )       // Default language is now Romanian\n? CMonth( Date() )          // --> Mai\n? \"Old language id selected is\", hb_langSelect()    // --> ro\nhb_langSelect( \"es\" )       // Default language is now Spanish\n? \"Current language is\", hb_langName()              // --> Spanish\n? CMonth( Date() )          // --> Mayo\n? CDoW( Date() )            // --> Lunes"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "hb_langSelect(), NationMsg()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_langSelect()",
				"ONELINER": "Select a specific nation message module",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "hb_langSelect( [<cNewLang>][, <cCodepage>] ) --> cOldLang",
				"ARGUMENTS": "<cNewLang>  The optional ID of the language module. Possible values for <cNewLang> are below as defined in the Lang library, sorted by language. <cCodepage>  Optional codepage ID into which the language module strings are automatically converted by Harbour.\n<table>\n Language              <cNewLang>\n Basque                eu\n Belorussian           be\n Bulgarian             bg\n Catalan               ca\n Chinese Traditional   zh\n Chinese Simplified    zh_sim\n Croatian              hr\n Czech                 cs\n Dutch                 nl\n Esperanto             eo\n French                fr\n Galician              gl\n German                de\n Greek                 el\n Hebrew                he\n Hungarian             hu\n Icelandic             is\n Indonesian            id\n Italian               it\n Korean                ko\n Lithuanian            lt\n Polish                pl\n Portuguese            pt\n Romanian              ro\n Russian               ru\n Serbian (cyrillic)    sr_cyr\n Serbian (latin)       sr_lat\n Slovak                sk\n Slovenian             sl\n Spanish               es\n Swedish               sv\n Turkish               tr\n Ukrainian             uk\n</table>",
				"RETURNS": "<cOldLang>   The old language identifier",
				"DESCRIPTION": "This function set a default language module for date/month names, internal warnings, NatMsg messages and internal errors. When a Lang ID is selected all messages will be output with the current language selected until another one is selected or the program ends. The default language is English (cLang == \"EN\").\nNOTE: You must REQUEST every language module you intend to use. For example: to use the Portuguese language you must add the following to your program: `REQUEST HB_LANG_PT`",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "REQUEST HB_LANG_PT\nREQUEST HB_LANG_RO\nREQUEST HB_LANG_ES\nhb_langSelect( \"pt\" )       // Default language is now Portuguese\n? CDoW( Date() )            // --> Segunda-feira\n? \"Old language id selected is\", hb_langSelect()  // --> pt\nhb_langSelect( \"ro\" )       // Default language is now Romanian\n? CMonth( Date() )          // --> Mai\n? \"Old language id selected is\", hb_langSelect()  // --> ro\nhb_langSelect( \"es\" )       // Default language is now Spanish\n? CMonth( Date() )          // --> Mayo\n? CDoW( Date() )            // --> Lunes"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "hb_langName(), hb_cdpSelect(), NationMsg(), REQUEST"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_Translate()",
				"ONELINER": "Translate a string from one code page to the other",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "hb_Translate( <cSrcText>, [<cPageFrom>], [<cPageTo>] ) --> cDstText",
				"ARGUMENTS": "<cSrcText> Is the source string to translate.\n<cPageFrom> Is the optional character code page ID of the source string. If not specified, the default code page is used.\n<cPageTo> Is the optional character code page ID of the destination string. If not specified, the default code page is used.",
				"RETURNS": "hb_Translate() return destination string converted from the source string.",
				"DESCRIPTION": "hb_Translate() try to convert a source string from one code page into the other. If a code page ID is not recognized, or not linked in, the default code page is used. hb_Translate() is used usually to convert between the MS-DOS and the Windows code pages of the same language.\nNOTE: If the source code page and target code page does not have the same number of characters, a translation cannot be done and the destination string is a copy of the source string.\nNOTE: You must REQUEST every code page module you intend to use. For example: to use the CP-850 code page you must add the following to your program: `#include \"hbextcdp.ch\"`",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbextcdp.ch\"\nLOCAL cTxt := \"A\" + hb_BChar( 142 ) + \"BC\"\n? \"CP-850 text:\", hb_StrToHex( cTxt )\n? \"UTF-8 text:\", hb_Translate( cTxt, \"cp850\", \"UTF8\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "This function is a Harbour Extension.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "hb_langSelect(), hb_cdpSelect(), NationMsg(), REQUEST"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IsAffirm()",
				"ONELINER": "Checks if passed char is an affirmation char",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "IsAffirm( <cChar> ) --> lTrueOrFalse",
				"ARGUMENTS": "<cChar> is a char or string of chars",
				"RETURNS": "<lTrueOrFalse> True if passed char is an affirmation char, otherwise false",
				"DESCRIPTION": "This function is used to check if a user's input is true or not according to the msgxxx module used.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Wait until user enters Y\nDO WHILE ! IsAffirm( cYesNo )\n   ACCEPT \"Sure: \" TO cYesNo\nENDDO"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "IsNegative(), NationMsg()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IsNegative()",
				"ONELINER": "Checks if passed char is a negation char.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "IsNegative( <cChar> ) --> lTrueOrFalse",
				"ARGUMENTS": "<cChar> is a char or string of chars",
				"RETURNS": "<lTrueOrFalse> True if passed char is a negation char, otherwise false.",
				"DESCRIPTION": "This function is used to check if a user's input is true or not according to the msgxxx module used.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Wait until user enters N\nDO WHILE ! IsNegative( cYesNo )\n   ACCEPT \"Sure: \" TO cYesNo\nENDDO"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "IsAffirm(), NationMsg()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "NationMsg()",
				"ONELINER": "Returns international strings messages.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Language and Nation",
				"SYNTAX": "NationMsg( <nMsg> ) --> cMessage",
				"ARGUMENTS": "<nMsg> is the message number you want to get.",
				"RETURNS": "<cMessage> if <nMsg> is a valid message selector, returns the message. If <nMsg> is NIL, it returns \"Invalid Argument\", and if <nMsg> is any other type it returns an empty string.",
				"DESCRIPTION": "NationMsg() returns international message descriptions.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Displays \"Sure Y/N: \"  and waits until user enters Y\n// Y/N is the string for NationMsg( 12 ) with default natmsg module.\nDO WHILE ! IsAffirm( cYesNo )\n   ACCEPT \"Sure \" + NationMsg( 12 ) + \": \" TO cYesNo\nENDDO"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Language and Nation",
				"SEEALSO": "IsAffirm(), IsNegative()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_SetMacro()",
				"ONELINER": "Enable/disable the macro compiler runtime features.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Macro",
				"SYNTAX": "hb_SetMacro( <nOption>, [<lOnOff>] ) --> lOldSetting",
				"ARGUMENTS": "<nOption> One of the `HB_SM_*` constants defined in set.ch.\n<lOnOff> .T. to enable or .F. to disable a feature",
				"RETURNS": "hb_SetMacro() return the old state of requested feature.",
				"DESCRIPTION": "This function enables or disables some features of the macro compiler. The Harbour is extending the macro features compared to an original set available in CA-Cl*pper. Enabling/disabling some of them allows to keep strict CA-Cl*pper compatibility.\nAvailable features are:\n`HB_SM_HARBOUR` - enables Harbour extensions:\noperators: `++`, `--`, `+=`, `-=`, `*=`, `/=`, `^=` objects: assignments to an instance variable\n`HB_SM_XBASE` - enables other Xbase++ dialects extensions:\nexpanding of expressions lists\n`HB_SM_SHORTCUTS` - enables optimized evaluation of\nlogical operators (`.AND.`, `.OR.`)\n`HB_SM_PREPROC` - enables preprocessing of commands\nThis is meaningful if Harbour is compiled with HB_MACRO_STATEMENTS flag",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbmacro.ch\"\nINIT PROCEDURE IWANTCLIPPER()\n   ? hb_SetMacro( HB_SM_HARBOUR, .F. )\n   ? hb_SetMacro( HB_SM_XBASE, .F. )\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is set.ch\nLibrary is core",
				"TAGS": "API, Macro",
				"SEEALSO": "Macro compiler"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Abs()",
				"ONELINER": "Return the absolute value of a number.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Abs( <nNumber> ) --> nAbsNumber",
				"ARGUMENTS": "<nNumber> Any number.",
				"RETURNS": "<nAbsNumber> The absolute numeric value.",
				"DESCRIPTION": "This function yields the absolute value of the numeric value or expression <nNumber>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nNumber := 50\nLOCAL nNumber1 := 27\n\n? nNumber - nNumber1\n? nNumber1 - nNumber\n? Abs( nNumber - nNumber1 )\n? Abs( nNumber1 - nNumber )\n? Abs( -1 * 345 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Exp()",
				"ONELINER": "Calculates the value of e raised to the passed power.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Exp( <nNumber> ) --> nValue",
				"ARGUMENTS": "<nNumber> Any  real number.",
				"RETURNS": "<nValue>  The anti-logarithm of <nNumber>",
				"DESCRIPTION": "This function returns the value of e raised to the power of <nNumber>. It is the inverse of Log().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Exp( 45 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math",
				"SEEALSO": "Log()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_matherBlock()",
				"ONELINER": "Set/Get math error handling codeblock",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "hb_matherBlock( [<bNewBlock>] ) --> bOldBlock",
				"ARGUMENTS": "<bNewBlock>",
				"RETURNS": "<bOldBlock> is the current error handler codeblock",
				"STATUS": "Ready",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_matherMode()",
				"ONELINER": "Set/Get math error handling mode",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "hb_matherMode( [<nNewMode>] ) --> nOldMode",
				"ARGUMENTS": "[<nNumber>]   new math error handling mode, one of the following\nconstants, defined in hbmath.ch:\n<table-noheader>\nHB_MATH_ERRMODE_DEFAULT\nHB_MATH_ERRMODE_CDEFAULT\nHB_MATH_ERRMODE_USER\nHB_MATH_ERRMODE_USERDEFAULT\nHB_MATH_ERRMODE_USERCDEFAULT\n</table>",
				"RETURNS": "<nOldMode>    old math error handling mode",
				"STATUS": "Ready",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hbmath.ch\nLibrary is core",
				"TAGS": "API, Math"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Int()",
				"ONELINER": "Return the integer port of a numeric value.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Int( <nNumber> ) --> nIntNumber",
				"ARGUMENTS": "<nNumber> Any  numeric value.",
				"RETURNS": "<nIntNumber> The integer portion of the numeric value.",
				"DESCRIPTION": "This function converts a numeric expression to an integer. All decimal digits are truncated. This function does not round a value upward or downward; it merely truncates a number at the decimal point.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Set( _SET_DECIMALS, 5 )\n? Int( 632512.62541 )\n? Int( 845414111.91440 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math",
				"SEEALSO": "Round(), StrZero()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Log()",
				"ONELINER": "Returns the natural logarithm of a number.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Log( <nNumber> ) --> nLog",
				"ARGUMENTS": "<nNumber> Any numeric expression.",
				"RETURNS": "<nExponent> The natural logarithm of <nNumber>.",
				"DESCRIPTION": "This function returns the natural logarithm of the number <nNumber>. If <nNumber> is 0 or less than 0, a numeric overflow occurs, which is depicted on the display device as a series of asterisks. This function is the inverse of Exp().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Log( 632512 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math",
				"SEEALSO": "Exp()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Max()",
				"ONELINER": "Returns the maximum of two numbers or dates.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Max( <xValue>, <xValue1> ) --> xMax",
				"ARGUMENTS": "<xValue>  Any date or numeric value.\n<xValue1> Any date or numeric value (same type as <xValue>).",
				"RETURNS": "<xMax> The larger numeric (or later date) value.",
				"DESCRIPTION": "This function returns the larger of the two passed expressions. If <xValue> and <xValue1> are numeric data types, the value returned by this function will be a numeric data type as well and will be the larger of the two numbers passed to it. If <xValue> and <xValue1> are date data types, the return value will be a date data type as well. It will be the later of the two dates passed to it.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Max( 214514214, 6251242142 )\n? Max( 0d20001111, 0d20140621 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math",
				"SEEALSO": "Min()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Min()",
				"ONELINER": "Determines the minimum of two numbers or dates.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Min( <xValue>, <xValue1> ) --> xMin",
				"ARGUMENTS": "<xValue>  Any date or numeric value.\n<xValue1> Any date or numeric value.",
				"RETURNS": "<xMin>  The smaller numeric (or earlier date) value.",
				"DESCRIPTION": "This function returns the smaller of the two passed expressions. <xValue> and <xValue1> must be the same data type. If numeric, the smaller number is returned. If dates, the earlier date is returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Min( 214514214, 6251242142 )\n? Min( 0d20001111, 0d20140621 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math",
				"SEEALSO": "Max()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Mod()",
				"ONELINER": "Return the modulus of two numbers.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Mod( <nNumber>, <nNumber1> ) -->  <nRemainder>",
				"ARGUMENTS": "<nNumber>  Numerator in a divisional expression.\n<nNumber1> Denominator in a divisional expression.",
				"RETURNS": "<nRemainder>  The remainder after the division operation.",
				"DESCRIPTION": "This function returns the remainder of one number divided by another.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Mod( 12, 8.521 )\n? Mod( 12, 0 )\n? Mod( 62412.5142, 4522114.12014 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math",
				"SEEALSO": "%"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Round()",
				"ONELINER": "Rounds off a numeric expression.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Round( <nNumber>, <nPlace> ) --> nResult",
				"ARGUMENTS": "<nNumber> Any numeric value.\n<nPlace>  The number of places to round to.",
				"RETURNS": "<nResult> The rounded number.",
				"DESCRIPTION": "This function rounds off the value of <nNumber> to the number of decimal places specified by <nPlace>. If the value of <nPlace> is a negative number, the function will attempt to round <nNumber> in whole numbers. Numbers from 5 through 9 will be rounded up, all others will be rounded down.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Round( 632512.62541, 5 )\n? Round( 845414111.91440, 3 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math",
				"SEEALSO": "Int(), Str(), Val(), SET FIXED"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Sqrt()",
				"ONELINER": "Calculates the square root of a number.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "Sqrt( <nNumber> ) --> nSqrt",
				"ARGUMENTS": "<nNumber> Any  numeric value.",
				"RETURNS": "<nSqrt>   The square root of <number>.",
				"DESCRIPTION": "This function returns the square root of <nNumber>. The precision of this evaluation is based solely on the setting of `_SET_DECIMALS`. Any negative number passed as <nNumber> will always return a 0.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Set( _SET_DECIMALS, 5 )\n? Sqrt( 632512.62541 )\n? Sqrt( 845414111.91440 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Math",
				"SEEALSO": "Round()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objAddData()",
				"ONELINER": "Add a VAR to an already existing class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objAddData( <oObject>, <cDataName> ) --> oObject",
				"ARGUMENTS": "<oObject> is the object to work on.\n<cDataName> is the symbol name of the new VAR to add.",
				"RETURNS": "__objAddData() return a reference to <oObject>.",
				"DESCRIPTION": "__objAddData() is a low level class support function that add a new VAR to an object. <oObject> is unchanged if a symbol with the name <cDataName> already exist in <oObject>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// create a new THappy class and add a lHappy VAR\nLOCAL oHappy := HBClass():New( \"THappy\" )\n__objAddData( oHappy, \"lHappy\" )\noHappy:lHappy := .T.\nIF oHappy:lHappy\n   ? \"Happy, Happy, Joy, Joy !!!\"\nELSE\n   ? \":(...\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objAddInline(), __objAddMethod(), __objDelData(), __objGetMsgList(), __objGetValueList(), __objHasData(), __objSetValueList()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objAddInline()",
				"ONELINER": "Add an INLINE to an already existing class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objAddInline( <oObject>, <cInlineName>, <bInline> ) --> oObject",
				"ARGUMENTS": "<oObject> is the object to work on.\n<cInlineName> is the symbol name of the new INLINE to add.\n<bInline> is a code block to associate with the INLINE method.",
				"RETURNS": "__objAddInline() return a reference to <oObject>.",
				"DESCRIPTION": "__objAddInline() is a low level class support function that add a new INLINE method to an object. <oObject> is unchanged if a symbol with the name <cInlineName> already exist in <oObject>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// create a new THappy class and add a Smile INLINE method\nLOCAL oHappy := HBClass():New( \"THappy\" )\nLOCAL bInline := {| Self, nType | HB_SYMBOL_UNUSED( Self ), ;\n   { \":)\", \";)\", \"*SMILE*\" }[ nType ] }\n__objAddInline( oHappy, \"Smile\", bInline )\n? oHappy:Smile( 1 )       // --> :)\n? oHappy:Smile( 2 )       // --> ;)\n? oHappy:Smile( 3 )       // --> *SMILE*"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objAddData(), __objAddMethod(), __objDelInline(), __objGetMethodList(), __objGetMsgList(), __objHasMethod(), __objModInline()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objAddMethod()",
				"ONELINER": "Add a METHOD to an already existing class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objAddMethod( <oObject>, <cMethodName>, <nFuncPtr> ) --> oObject",
				"ARGUMENTS": "<oObject> is the object to work on.\n<cMethodName> is the symbol name of the new METHOD to add.\n<nFuncPtr> is a pointer to a function to associate with the method.",
				"RETURNS": "__objAddMethod() return a reference to <oObject>.",
				"DESCRIPTION": "__objAddMethod() is a low level class support function that add a new METHOD to an object. <oObject> is unchanged if a symbol with the name <cMethodName> already exist in <oObject>.\nNote that <nFuncPtr> is a special pointer to a function that was created using the @ operator, see example below.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// create a new THappy class and add a Smile method\nLOCAL oHappy := HBClass():New( \"THappy\" )\n__objAddMethod( oHappy, \"Smile\", @MySmile() )\n? oHappy:Smile( 1 )       // --> :)\n? oHappy:Smile( 2 )       // --> ;)\n? oHappy:Smile( 3 )       // --> *SMILE*\n\nSTATIC FUNCTION MySmile( nType )\n   IF HB_ISNUMERIC( nType )\n      SWITCH nType\n      CASE 1 ; RETURN \":)\"\n      CASE 2 ; RETURN \";)\"\n      CASE 3 ; RETURN \"*SMILE*\"\n      ENDSWITCH\n   ENDIF\n   RETURN NIL"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objAddInline(), __objAddData(), __objDelMethod(), __objGetMethodList(), __objGetMsgList(), __objHasMethod(), __objModMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objDelData()",
				"ONELINER": "Delete a VAR (instance variable) from class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objDelMethod( <oObject>, <cDataName> ) --> oObject",
				"ARGUMENTS": "<oObject> is the object to work on.\n<cDataName> is the symbol name of VAR to be deleted (removed) from the object.",
				"RETURNS": "__objDelData() return a reference to <oObject>.",
				"DESCRIPTION": "__objDelData() is a low level class support function that delete (remove) a VAR from an object. <oObject> is unchanged if a symbol with the name <cDataName> does not exist in <oObject>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// create a new THappy class and add a lHappy VAR\nLOCAL oHappy := HBClass():New( \"THappy\" )\n__objAddData( oHappy, \"lHappy\" )\n? __objHasData( oHappy, \"lHappy\" )  // --> .T.\n// remove lHappy VAR\n__objDelData( oHappy, \"lHappy\" )\n? __objHasData( oHappy, \"lHappy\" )  // --> .F."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objAddData(), __objGetMsgList(), __objGetValueList(), __objHasData(), __objSetValueList()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objDelInline()",
				"ONELINER": "Delete a METHOD INLINE from class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objDelInline( <oObject>, <cSymbol> ) --> oObject",
				"ARGUMENTS": "<oObject> is the object to work on.\n<cSymbol> is the symbol name of METHOD or INLINE method to be deleted (removed) from the object.",
				"RETURNS": "__objDelInline() return a reference to <oObject>.",
				"DESCRIPTION": "__objDelInline() is a low level class support function that delete (remove) a METHOD or an INLINE method from an object. <oObject> is unchanged if a symbol with the name <cSymbol> does not exist in <oObject>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// create a new THappy class and add a Smile method\nLOCAL oHappy := HBClass():New( \"THappy\" )\n__objAddMethod( oHappy, \"Smile\", @MySmile() )\n? __objHasMethod( oHappy, \"Smile\" )  // --> .T.\n// remove Smile method\n__objDelInline( oHappy, \"Smile\" )\n? __objHasMethod( oHappy, \"Smile\" )  // --> .F.\n\nSTATIC FUNCTION MySmile( nType )\n   DO CASE\n   CASE nType == 1\n      RETURN \":)\"\n   CASE nType == 2\n      RETURN \";)\"\n   ENDCASE\n   RETURN NIL"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objAddInline(), __objAddMethod(), __objGetMethodList(), __objGetMsgList(), __objHasMethod(), __objModInline(), __objModMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objDelMethod()",
				"ONELINER": "Delete a METHOD  from class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objDelMethod( <oObject>, <cSymbol> ) --> oObject",
				"ARGUMENTS": "<oObject> is the object to work on.\n<cSymbol> is the symbol name of METHOD or INLINE method to be deleted (removed) from the object.",
				"RETURNS": "__objDelMethod() return a reference to <oObject>.",
				"DESCRIPTION": "__objDelMethod() is a low level class support function that deletes (removes) a METHOD or an INLINE method from an object. <oObject> is unchanged if a symbol with the name <cSymbol> does not exist in <oObject>.\n__objDelInline() is exactly the same as __objDelMethod().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// create a new THappy class and add a Smile method\nLOCAL oHappy := HBClass():New( \"THappy\" )\n__objAddMethod( oHappy, \"Smile\", @MySmile() )\n? __objHasMethod( oHappy, \"Smile\" )  // --> .T.\n// remove Smile method\n__objDelMethod( oHappy, \"Smile\" )\n? __objHasMethod( oHappy, \"Smile\" )  // --> .F.\n\nSTATIC FUNCTION MySmile( nType )\n   DO CASE\n   CASE nType == 1\n      RETURN \":)\"\n   CASE nType == 2\n      RETURN \";)\"\n   ENDCASE\n   RETURN NIL"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objAddInline(), __objAddMethod(), __objGetMethodList(), __objGetMsgList(), __objHasMethod(), __objModInline(), __objModMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objDerivedFrom()",
				"ONELINER": "Determine whether a class is derived from another class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objDerivedFrom( <oObject>, <xSuper> ) --> lIsParent",
				"ARGUMENTS": "<oObject> is the object to check.\n<xSuper> is the object that may be a parent. <xSuper> can be either an Object or a Character string with the class name.",
				"RETURNS": "__objDerivedFrom() return a logical TRUE (.T.) if <oObject> is derived from <xSuper>.",
				"DESCRIPTION": "__objDerivedFrom() is a low level class support function that check is one class is a super class of the other, or in other words, does class <oObject> a child or descendant of <xSuper>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Create three classes and check their relations\n\n#include \"hbclass.ch\"\nPROCEDURE Main()\n   LOCAL oSuper  := TMood():New()\n   LOCAL oObject := THappy():New()\n   LOCAL oDress  := TShirt():New()\n   ? __objDerivedFrom( oObject, oSuper )  // --> .T.\n   ? __objDerivedFrom( oSuper, oObject )  // --> .F.\n   ? __objDerivedFrom( oObject, oDress )  // --> .F.\n   RETURN\n\nCREATE CLASS TMood\n   METHOD New() INLINE Self\nENDCLASS\n\nCREATE CLASS THappy INHERIT TMood\n   METHOD Smile() INLINE QOut( \"*smile*\" )\nENDCLASS\n\nCREATE CLASS TShirt\n   VAR Color\n   VAR Size\n   METHOD New() INLINE Self\nENDCLASS"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objHasData(), __objHasMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objGetMethodList()",
				"ONELINER": "Return names of all METHOD for a given object",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objGetMethodList( <oObject> ) --> aMethodNames",
				"ARGUMENTS": "<oObject> is an object to scan.",
				"RETURNS": "__objGetMethodList() return an array of character stings with all METHOD names for a given object. __objGetMethodList() would return an empty array {} if the given object does not contain any METHOD.",
				"DESCRIPTION": "__objGetMethodList() is a low level class support function that let you find all class functions names for a given object. It is equivalent to `__objGetMsgList( oObject, .F. )`.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// show information about TBrowse class\nLOCAL oB := TBrowseNew( 0, 0, 24, 79 ), tmp\nFOR EACH tmp IN __objGetMethodList( oB )\n   ? \"METHOD name:\", tmp\nNEXT"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objGetMsgList(), __objGetValueList(), __objHasData(), __objHasMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objGetMsgList()",
				"ONELINER": "Return names of all VAR or METHOD for a given object",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objGetMsgList( <oObject>, [<lData>], [nClassType] ) --> aNames",
				"ARGUMENTS": "<oObject> is an object to scan.\n<lData> is an optional logical value that specifies the information to return. A value of .T. instruct the function to return list of all VAR names, .F. return list of all METHOD names. Default value is .T.\n<nClassType> is on optional numeric code for selecting which class type to return. Default value is HB_MSGLISTALL, returning the whole list.",
				"RETURNS": "__objGetMsgList() return an array of character stings with all VAR names or all METHOD names for a given object. __objGetMsgList() would return an empty array {} if the given object does not contain the requested information.",
				"DESCRIPTION": "__objGetMsgList() is a low level class support function that let you find all instance variable or method names for a given object.\nIf specified, the following table shows the values for <nClassType> that allow you to distinguish between VAR and CLASS VAR:\n<table>\n hboo.ch           Meaning\n HB_MSGLISTALL     All types\n HB_MSGLISTCLASS   CLASS VAR only\n HB_MSGLISTPURE    VAR only\n</table>\nVAR are instance variable usable within each object from a class, where each object has its own VARs.\nCLASS VAR are shared by all objects from a Class, so the changed value within Object1 will be reflected when accessing the CLASS VAR from Object2.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hboo.ch\"\n// show information about TBrowse class\nLOCAL oB := TBrowseNew( 0, 0, 24, 79 ), tmp\nFOR EACH tmp IN __objGetMsgList( oB, .T. )\n   ? \"VAR name:\", tmp\nNEXT\nFOR EACH tmp IN __objGetMsgList( oB, .T., HB_MSGLISTCLASS )\n   ? \"CLASS VAR name:\", tmp\nNEXT\nFOR EACH tmp IN __objGetMsgList( oB, .F. )\n   ? \"METHOD name:\", tmp\nNEXT"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hboo.ch\nLibrary is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objGetMethodList(), __objGetValueList(), __objHasData(), __objHasMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objGetValueList()",
				"ONELINER": "Return an array of VAR names and values for a given object",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objGetValueList( <oObject>, [<aExcept>] ) --> aData",
				"ARGUMENTS": "<oObject> is an object to scan.\n<aExcept> is an optional array with VAR names you want to exclude from the scan.",
				"RETURNS": "__objGetValueList() return a 2D array that contain pairs of a VAR symbol name and the value of VAR. __objGetValueList() would return an empty array {} if the given object does not contain the requested information.",
				"DESCRIPTION": "__objGetValueList() is a low level class support function that return an array with VAR names and value, each array element is a pair of: `aData[ i ][ HB_OO_DATA_SYMBOL ]` contain the symbol name\n`aData[ i ][ HB_OO_DATA_VALUE  ]` contain the value of VAR",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n// show information about TBrowse class\n#include \"hboo.ch\"\nLOCAL oB := TBrowseNew( 0, 0, 24, 79 ), tmp\nFOR EACH tmp IN __objGetValueList( oB )\n   ? ;\n     \"VAR name:\", tmp[ HB_OO_DATA_SYMBOL ], ;\n     \"   value=\", tmp[ HB_OO_DATA_VALUE ]\nNEXT"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hboo.ch\nLibrary is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objGetMethodList(), __objGetMsgList(), __objHasData(), __objHasMethod(), __objSetValueList()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objHasData()",
				"ONELINER": "Determine whether a symbol exist in object as VAR",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objHasData( <oObject>, <cSymbol> ) --> lExist",
				"ARGUMENTS": "<oObject> is an object to scan.\n<cSymbol> is the name of the symbol to look for.",
				"RETURNS": "__objHasData() return .T. if the given <cSymbol> exist as VAR (instance variable) in object <oObject), .F. if it does not exist.",
				"DESCRIPTION": "__objHasData() is a low level class support function that let you find out if a symbol is an instance variable in a given object.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL oB := TBrowseNew( 0, 0, 24, 79 )\n? __objHasData( oB, \"nLeft\" )     // --> .T.\n? __objHasData( oB, \"lBugFree\" )  // --> .F.\n? __objHasData( oB, \"Left\" )      // --> .F. since this is a METHOD"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objGetMethodList(), __objGetMsgList(), __objHasMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objHasMethod()",
				"ONELINER": "Determine whether a symbol exist in object as METHOD",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objHasMethod( <oObject>, <cSymbol> ) --> lExist",
				"ARGUMENTS": "<oObject> is an object to scan.\n<cSymbol> is the name of the symbol to look for.",
				"RETURNS": "__objHasMethod() return .T. if the given <cSymbol> exist as METHOD (class function) in object <oObject), .F. if it does not exist.",
				"DESCRIPTION": "__objHasMethod() is a low level class support function that let you find out if a symbol is a class function in a given object.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL oB := TBrowseNew( 0, 0, 24, 79 )\n? __objHasMethod( oB, \"nLeft\" )    // --> .F. since this is a VAR\n? __objHasMethod( oB, \"FixBugs\" )  // --> .F.\n? __objHasMethod( oB, \"Left\" )     // --> .T."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objGetMethodList(), __objGetMsgList(), __objHasData()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objModInline()",
				"ONELINER": "Modify (replace) an INLINE method in an already existing class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objModInline( <oObject>, <cInlineName>, <bInline> ) --> oObject",
				"ARGUMENTS": "<oObject> is the object to work on.\n<cInlineName> is the symbol name of the INLINE method to modify.\n<bInline> is a new code block to associate with the INLINE method.",
				"RETURNS": "__objModInline() return a reference to <oObject>.",
				"DESCRIPTION": "__objModInline() is a low level class support function that modify an INLINE method in an object and replace it with a new code block. <oObject> is unchanged if a symbol with the name <cInlineName> does not exist in <oObject>. __objModInline() is used in inheritance mechanism.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// create a new THappy class and add a Smile INLINE method\nLOCAL oHappy := HBClass():New( \"THappy\" )\nLOCAL bMyInline   := {| Self, nType | HB_SYMBOL_UNUSED( Self ), ;\n   { \":)\", \";)\" }[ nType ] }\nLOCAL bYourInline := {| Self, nType | HB_SYMBOL_UNUSED( Self ), ;\n   { \"*SMILE*\", \"*WINK*\" }[ nType ] }\n__objAddInline( oHappy, \"Smile\", bMyInline )\n? oHappy:Smile( 1 )       // --> :)\n? oHappy:Smile( 2 )       // --> ;)\n// replace Smile inline method with a new code block\n__objModInline( oHappy, \"Smile\", bYourInline )\n? oHappy:Smile( 1 )       // --> *SMILE*\n? oHappy:Smile( 2 )       // --> *WINK*"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objAddInline(), __objDelInline(), __objGetMethodList(), __objGetMsgList(), __objHasMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objModMethod()",
				"ONELINER": "Modify (replace) a METHOD in an already existing class",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objModMethod( <oObject>, <cMethodName>, <nFuncPtr> ) --> oObject",
				"ARGUMENTS": "<oObject> is the object to work on.\n<cMethodName> is the symbol name of the METHOD to modify.\n<nFuncPtr> is a pointer to a new function to associate with the method.",
				"RETURNS": "__objModMethod() return a reference to <oObject>.",
				"DESCRIPTION": "__objModMethod() is a low level class support function that modify a METHOD in an object and replace it with a new function. <oObject> is unchanged if a symbol with the name <cMethodName> does not exist in <oObject>. __objModMethod() is used in inheritance mechanism.\nNote that <nFuncPtr> is a special pointer to a function that was created using the @ operator, see example below.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// create a new THappy class and add a Smile method\nLOCAL oHappy := HBClass():New( \"THappy\" )\n__objAddMethod( oHappy, \"Smile\", @MySmile() )\n? oHappy:Smile( 1 )       // --> :)\n? oHappy:Smile( 2 )       // --> ;)\n// replace Smile method with a new function\n__objAddMethod( oHappy, \"Smile\", @YourSmile() )\n? oHappy:Smile( 1 )       // --> *SMILE*\n? oHappy:Smile( 2 )       // --> *WINK*\n\nSTATIC FUNCTION MySmile( nType )\n   DO CASE\n   CASE nType == 1\n      RETURN \":)\"\n   CASE nType == 2\n      RETURN \";)\"\n   ENDCASE\n   RETURN NIL\n\nSTATIC FUNCTION YourSmile( nType )\n   DO CASE\n   CASE nType == 1\n      RETURN \"*SMILE*\"\n   CASE nType == 2\n      RETURN \"*WINK*\"\n   ENDCASE\n   RETURN NIL"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objAddMethod(), __objDelMethod(), __objGetMethodList(), __objGetMsgList(), __objHasMethod()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__objSetValueList()",
				"ONELINER": "Set object with an array of VAR names and values",
				"CATEGORY": "API",
				"SUBCATEGORY": "Objects",
				"SYNTAX": "__objSetValueList( <oObject>, <aData> ) --> oObject",
				"ARGUMENTS": "<oObject> is an object to set.\n<aData> is a 2D array with a pair of instance variables and values for setting those variable.",
				"RETURNS": "__objSetValueList() return a reference to <oObject>.",
				"DESCRIPTION": "__objSetValueList() is a low level class support function that let you set a group of instance variables with values. each array element in <aData> is a pair of: aData[ i ][ HB_OO_DATA_SYMBOL ] which contain the variable name to set aData[ i ][ HB_OO_DATA_VALUE  ] contain the new variable value.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// set some TBrowse instance variable\n#include \"hboo.ch\"\nLOCAL oB := TBrowse():New()\nLOCAL aData := Array( 4, 2 )\naData[ 1 ][ HB_OO_DATA_SYMBOL ] := \"nTop\"\naData[ 1 ][ HB_OO_DATA_VALUE  ] := 1\naData[ 2 ][ HB_OO_DATA_SYMBOL ] := \"nLeft\"\naData[ 2 ][ HB_OO_DATA_VALUE  ] := 10\naData[ 3 ][ HB_OO_DATA_SYMBOL ] := \"nBottom\"\naData[ 3 ][ HB_OO_DATA_VALUE  ] := 20\naData[ 4 ][ HB_OO_DATA_SYMBOL ] := \"nRight\"\naData[ 4 ][ HB_OO_DATA_VALUE  ] := 70\n__objSetValueList( oB, aData )\n? oB:nTop     // --> 1\n? oB:nLeft    // --> 10\n? oB:nBottom  // --> 20\n? oB:nRight   // --> 70"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hboo.ch\nLibrary is core",
				"TAGS": "API, Objects",
				"SEEALSO": "__objGetValueList()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FieldBlock()",
				"ONELINER": "Return a code block that sets/gets a value for a given field",
				"CATEGORY": "API",
				"SUBCATEGORY": "RDD",
				"SYNTAX": "FieldBlock( <cFieldName> ) --> bFieldBlock",
				"ARGUMENTS": "<cFieldName> is a string that contain the field name.",
				"RETURNS": "FieldBlock() return a code block that when evaluate could retrieve a field value or assigning a new value to the field. If <cFieldName> is not specified or from type other than character, FieldBlock() return NIL.",
				"DESCRIPTION": "FieldBlock() return a code block that sets/gets the value of field. When this code block is evaluated without any parameters passed then it returns the current value of the given field. If the code block is evaluated with a parameter, than its value is used to set a new value to the field, this value is also return by the block. If the block is evaluate and there is no field with the name <cFieldName> in the current work area, the code block return NIL.\nNote that FieldBlock() works on the current work area, if you need a specific work area code block use FieldWBlock() instead.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// open a file named test.dbf that have a field named \"first\"\nLOCAL bField\nUSE test\nbField := FieldBlock( \"first\" )\n? \"Original value of field 'first':\", Eval( bField )\nEval( bField, \"Mr X new name\" )\n? \"New value for the field 'first':\", Eval( bField )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "If the block is evaluate and there is no field with the name <cFieldName> in the current work area, the code block return NIL.\nCA-Cl*pper would raise `BASE/1003` error if the field does not exist.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, RDD",
				"SEEALSO": "Eval(), FieldWBlock(), MemVarBlock()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "FieldWBlock()",
				"ONELINER": "Return a sets/gets code block for field in a given work area",
				"CATEGORY": "API",
				"SUBCATEGORY": "RDD",
				"SYNTAX": "FieldWBlock( <cFieldName>, <nWorkArea> ) --> bFieldBlock",
				"ARGUMENTS": "<cFieldName> is a string that contain the field name.\n<nWorkArea> is the work area number in which <cFieldName> exist.",
				"RETURNS": "FieldWBlock() return a code block that when evaluate could retrieve field value or assigning a new value for a field in a given work area. If <cFieldName> is not specified or from type other than character, or if <nWorkArea> is not specified or is not numeric FieldWBlock() return NIL.",
				"DESCRIPTION": "FieldWBlock() return a code block that sets/gets the value of field from a given work area. When this code block is evaluated without any parameters passed then it returns the current value of the given field. If the code block is evaluated with a parameter, than its value is used to set a new value to the field, this value is also return by the block. If the block is evaluate and there is no field with the name <cFieldName> in work area number <nWorkArea>, the code block return NIL.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL bField\n// open a file named 'one' in work area 1 that has a field named \"first\"\nSELECT 1\nUSE one\n// open a file named 'two' in work area 2 that also has a field named \"first\"\nSELECT 2\nUSE two\nSELECT 1\n// this block works on the field \"first\" that exists on work area 2\nbField := FieldWBlock( \"first\", 2 )\n? \"Original 'first' values:\", one->first, two->first\n? \"'first' value for file 'two':\", Eval( bField )\nEval( bField, \"'two' has updated 'first'\" )\n? \"and now:\", one->first, two->first"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "If the block is evaluate and there is no field with the name <cFieldName> in the given work area, the code block return NIL.\nCA-Cl*pper would raise BASE/1003 error if the field does not exist.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, RDD",
				"SEEALSO": "Eval(), FieldBlock(), MemVarBlock()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AllTrim()",
				"ONELINER": "Removes leading and trailing blank spaces from a string",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "AllTrim( <cString> ) --> cExpression",
				"ARGUMENTS": "<cString> Any character string",
				"RETURNS": "<cExpression> An string will all blank spaces removed from <cString>",
				"DESCRIPTION": "This function returns the string <cExpression> will all leading and trailing blank spaces removed.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? AllTrim( \"Hello Harbour\" )\n? AllTrim( \"     Hello Harbour\" )\n? AllTrim( \"Hello Harbour     \" )\n? AllTrim( \"     hello Harbour     \" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "LTrim(), RTrim(), Trim()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Asc()",
				"ONELINER": "Returns the ASCII value of a character",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Asc( <cCharacter> ) --> nAscNumber",
				"ARGUMENTS": "<cCharacter> Any character expression",
				"RETURNS": "<nAscNumber> ASCII value",
				"DESCRIPTION": "This function return the ASCII value of the leftmost character of any character expression passed as <cCharacter>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Asc( \"A\" )\n? Asc( \"ą\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Chr()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "At()",
				"ONELINER": "Locates the position of a substring in a main string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "At( <cSearch>, <cString> ) --> nPos",
				"ARGUMENTS": "<cSearch> Substring to search for\n<cString> Main string",
				"RETURNS": "At() return the starting position of the first occurrence of the substring in the main string",
				"DESCRIPTION": "This function searches the string <cString> for the characters in the first string <cSearch>. If the substring is not contained within the second expression, the function will return 0.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? At( \"cde\", \"abcdefgfedcba\" )  // --> 3"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "RAt()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Chr()",
				"ONELINER": "Converts an ASCII value to it character value",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Chr( <nAsciiNum> ) --> cReturn",
				"ARGUMENTS": "<nAsciiNum> Any ASCII character code.",
				"RETURNS": "<cReturn> Character expression of that ASCII value",
				"DESCRIPTION": "This function returns the ASCII character code for <nAsciiNum>. The number expressed must be an integer value within the range of 0 to 255 inclusive. The Chr() function will send the character returned to whatever device is presently set.\nThe Chr() function may be used for printing special codes as well as normal and graphics character codes.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Chr( 32 )\n? Chr( 65 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Asc(), Inkey()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_At()",
				"ONELINER": "Locates the position of a substring in a main string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_At( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos",
				"ARGUMENTS": "<cSearch> Substring to search for\n<cString> Main string\n<nStart> First position to search in <cString>, by default 1\n<nEnd> End position to search, by default <cString> length",
				"RETURNS": "hb_At() return the starting position of the first occurrence of the substring in the main string",
				"DESCRIPTION": "This function searches the string <cString> for the characters in the first string <cSearch>. If the substring is not contained within the second expression, the function will return 0. The third and fourth parameters lets you indicate a starting and end offset to search in.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? hb_At( \"cde\", \"abcdefgfedcba\" )     // --> 3\n? hb_At( \"cde\", \"abcdefgfedcba\", 4 )  // --> 0"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "This function is sensitive to HB_CLP_STRICT settings during build.\n<nStart> and <nEnd> are Harbour extensions and do not exist if HB_CLP_STRICT is defined. In that case, the whole string is searched.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "hb_RAt()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_AtI()",
				"ONELINER": "Locates the position of a substring in a main string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_AtI( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos",
				"ARGUMENTS": "<cSearch> the sub-string to search for\n<cString> The main string to search into, for <cSearch>\n<nStart> Beginning search position into <cString>, default: 1\n<nEnd> Ending search position, default: Length of <cString> (i.e. entire <cString>)",
				"RETURNS": "hb_AtI() returns the position (if any), into main string, where first time the substring appears.",
				"DESCRIPTION": "This function has same functionality as hb_At() with the significant difference that it's case Insensitive.\nOptionally, with <nStart> can be defined the position into main string from where the search of <cSearch> must begin and with <nEnd> the position where it must stop. If neither of them is defined, <nStart> is 1st position and <nEnd> the ending of <cString>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? hb_At( \"AS\", \"as simple as possible\", 5 )   // --> 0\n? hb_AtI( \"AS\", \"as simple as possible\", 5 )  // --> 11"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "hb_At()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_ATokens()",
				"ONELINER": "Parses a complex string (e.g. a sentence or multi-line text) into individual tokens (words or other string chunks depending on delimiter used).",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_ATokens( <cString>, [<cDelim>|<lEOL>], [<lSkipStrings>], ;\n            [<lDoubleQuoteOnly>] ) --> aTokens",
				"ARGUMENTS": "<cString> Complex string to be parsed.\n<cDelim>|<lEOL Character(s) used as delimiter of separate tokens.\nIf <lEOL> flag defined instead of <cDelim>, then end of line marker(s) will be used as delimiter.\n<lSkipStrings> Boolean flag indicating if quoted substrings\nwill be tokenized or not.\n<lDoubleQuoteOnly> Boolean flag indicating that only double-quoted\nsubstrings will be tokenized.",
				"RETURNS": "<aTokens> A character array, filled with the individual tokens found.",
				"DESCRIPTION": "This function analyses the complex string <cString> and splits it into separate sub-strings (tokens) that are delimited by <cDelim> or by space character, if no <cDelim> delimiter is passed, or by EOL marker if <lEOL> instead of <cDelim> is specified.\nThe located tokens, are stored in an array which is returned by the function.\nIf <lSkipStrings> is .T. (default: .F.), the quoted sub-strings (if any) within <cString> are not tokenized. If <lDoubleQuoteOnly> is .T. only the double quote `\"` is recognized as a quote sign. This argument is meaningful only when <lSkipStrings> is .T.",
				"NOTES": "1) the tokenization process is case sensitive, in the (rare) case\nwhere <cDelim> is an alphabetic character.\n2) The delimiters are removed (trimmed) from tokens.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cString := \"Harbour is proven to be stable, robust and efficient.\"\nLOCAL aTokens := hb_ATokens( cString )\nAEval( aTokens, {| token, n | QOut( hb_ntos(n), token ) } )\n?\naTokens := hb_ATokens( cString, \",\" )\nAEval( aTokens, {| token, n | QOut( hb_ntos(n), token ) } )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "SubStr()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_LeftEq()",
				"ONELINER": "Checks if a sub-string matches to leftmost part of a string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_LeftEq( <cString>, <cSubString> ) --> lMatch",
				"ARGUMENTS": "<cString> Main string of comparison.\n<cSubString> Sub-string compared to leftmost part of <cString>",
				"RETURNS": "<lMatch> Boolean flag indicating if the matching was successful",
				"DESCRIPTION": "This function checks if all characters (one by one and with the given order) of <cSubString> match to leftmost (same length) part of <cString> or in other words, checks if <cString> starts with <cSubString>, in which case returns .T., otherwise .F.\nBasically it's equivalent to the expression: `Left( <cString>, Len( <cSubString> ) ) == <cSubString>` but faster and shorter.\nNOTE: Case sensitive!",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? hb_LeftEq( \"Harbour\", \"Ha\" )  // --> .T.\n? hb_LeftEq( \"Harbour\", \"ha\" )  // --> .F."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "hb_LeftEqI(), Left(), At()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_LeftEqI()",
				"ONELINER": "Checks if a sub-string matches to leftmost part of a string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_LeftEqI( <cString>, <cSubString> ) --> lMatch",
				"ARGUMENTS": "<cString> Main string of comparison.\n<cSubString> Sub-string compared to leftmost part of <cString>.",
				"RETURNS": "<lMatch> Boolean flag indicating if the matching was successful.",
				"DESCRIPTION": "This function is identical to hb_LeftEq() (see above for details) but it is case *insensitive*!",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? hb_LeftEqI( \"Harbour\", \"HA\" )  // --> .T.\n? hb_LeftEqI( \"Harbour\", \"ha\" )  // --> .T.\n? hb_LeftEq( \"Harbour\", \"HA\" )   // --> .F."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "hb_LeftEqI(), Left(), At()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_MemoRead()",
				"ONELINER": "Return the text file's contents as a character string",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_MemoRead( <cFileName> ) --> cString",
				"ARGUMENTS": "<cFileName> is the file name to read from disk.\nIt must include the file extension. If file to be read lives in another directory, you must include the path.",
				"RETURNS": "Returns the contents of a text file as a character string.\nIf <cFileName> cannot be found or read hb_MemoRead() returns an empty string (\"\").",
				"DESCRIPTION": "hb_MemoRead() is a function that reads the content of a text file (till now) from disk (floppy, HDD, CD-ROM, etc.) into a memory string. In that way you can manipulate as any character string or assigned to a memo field to be saved in a database.\nhb_MemoRead() function is used together with MemoEdit() and hb_MemoWrit() to get from disk text from several sources that would be edited, searched, replaced, displayed, etc.\nIt is used to import data from other sources to our database.\nNote: hb_MemoRead() does not use the settings SET DEFAULT or SET PATH to search for <cFileName>. It searches for <cFileName> in the current directory.\nOver a network, hb_MemoRead() attempts to open <cFileName> in read-only mode and shared.  If the file is used in mode exclusive by another process, the function will returns a null string (\"\").\nhb_MemoRead() vs MemoRead(): hb_MemoRead() is identical to MemoRead() except it won't truncate the last byte (on non-Unix compatible systems) if it's a EOF char.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// This example uses hb_MemoRead() to assign the contents of a text\n// file to a character variable for later search\n\nLOCAL cFile := \"account.prg\"\nLOCAL cString := hb_MemoRead( cFile )\nLOCAL cCopyright := \"Melina\"\n\nIF ! cCopyright $ cString                        // check for copyright\n   ? hb_MemoWrit( cFile, cCopyright + cString )  // if not, add it!\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "MemoEdit(), hb_MemoWrit(), REPLACE, MemoRead()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_MemoWrit()",
				"ONELINER": "Write a memo field or character string to a text file on disk",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_MemoWrit( <cFileName>, <cString> ) --> lSuccess",
				"ARGUMENTS": "<cFileName> is the file name to be written to disk.\nIt must include the file extension. If file to be read lives in another directory, you must include the path.\n<cString>   Is the memo field or character string, to be write to\n<cFile>.",
				"RETURNS": "Function returns true (.T.) if the writing operation was successful; otherwise, it returns false (.F.).",
				"DESCRIPTION": "This a function that writes a memo field or character string to a text file on disk (floppy, HDD, CD-ROM, etc.) If you not specified a path, hb_MemoWrit() writes <cFileName> to the current directory. If <cFileName> exists, it is overwritten.\nhb_MemoWrit() function is used together with hb_MemoRead() and MemoEdit() to save to disk text from several sources that was edited, searched, replaced, displayed, etc.\nNote that hb_MemoWrit() do not use the directory settings SET DEFAULT.\nhb_MemoWrit() vs MemoWrit(): hb_MemoWrit() never writes the obsolete EOF char at the end of the file.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "//  This example uses hb_MemoWrit() to write the contents of a character\n//  variable to a text file.\n\nLOCAL cFile := \"account.prg\"\nLOCAL cString := hb_MemoRead( cFile )\nLOCAL cCopyright := \"Melina\"\n\nIF ! cCopyright $ cString                        // check for copyright\n   ? hb_MemoWrit( cFile, cCopyright + cString )  // if not, add it!\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "MemoEdit(), MemoRead(), hb_MemoWrit()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_ntoc()",
				"ONELINER": "Converts a numeric value to string",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_ntoc( <nValue>, [<nDecs>] ) --> cValue",
				"ARGUMENTS": "<nValue> is the numeric value to convert.\n<nDecs> decimal digits to retain (if any).",
				"RETURNS": "<cValue> A string representation of <nValue>",
				"DESCRIPTION": "This function converts the given <nValue> numeric value to a string value, while (trying to) keep all or at least `nDecs` significant digits in double numbers, unless `<nDecs>` is lesser than actual decimal digits of <nValue>, in which case the result will be rounded.\nSET DECIMAL setting has no effect on the returned value (ignored), which means that, unlike f.e. Str(), all non-significant digits (e.g.: trailing decimal zeros) will be removed. Likewise, all leading empty spaces will be trimmed.\nReturns stringified value of `<nValue>`, preserving all (or at least `<nDecs>`) significant digits, if any. Interestingly, if `<nValue>` is NIL or not numeric, this function will return a null string and, unlike Str(), will NOT cause an RTE. NOTE: new function, available after 2016-06-20 21:59 UTC+0200 commit,\n(it is not available in earlier versions).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL n := ( 5 / 2 ) + 0.009\n\n? hb_ntoc( n )     // --> 2.509\n? Str( n )         // -->          2.51\n? hb_ntoc( n, 2 )  // --> 2.51\n? Str( n, 5, 2 )   // -->  2.51\n? hb_ntos( n )     // --> 2.51\n? \"--- decimals set to 7 ----\"\nSET DECIMALS TO 7\n? Str( n )         // -->          2.51\n? hb_ntoc( n )     // --> 2.509\n? Str( n, 10, 7 )  // -->  2.5090000\n? hb_ntoc( n, 7 )  // --> 2.509\n? \"--- pass non numeric / NIL value ----\"\n? Str( \"42\" )      // --> RTE"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Str(), hb_ntos()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_ntos()",
				"ONELINER": "Converts a numeric value to string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_ntos( <nValue> ) --> cValue",
				"ARGUMENTS": "<nValue> is the numeric value to convert.",
				"RETURNS": "<cValue> A string representation of <nValue>",
				"DESCRIPTION": "This function converts any numeric value to a string, trimming all the leading empty spaces. If `<nValue>` is NIL or not numeric, this function will return a null string.\nEssentially, `hb_ntos()` function is equivalent to `LTrim( Str( <nValue> ) )` but quite simpler and faster.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL n := ( 5 / 2 ) + 0.009\n\n? Str( n )      // -->          2.51\n? hb_ntos( n )  // --> 2.51"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Str(), hb_ntoc(), LTrim()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_RAt()",
				"ONELINER": "Searches for last occurrence a substring of a string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_RAt( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos",
				"ARGUMENTS": "<cSearch> Substring to search for\n<cString> Main string\n<nStart> First position to search in <cString>, by default 1.\n<nEnd> End position to search, by default <cString> length",
				"RETURNS": "hb_RAt() return the location of beginning position of last occurrence a substring of a string.",
				"DESCRIPTION": "This function searches for last occurrence a <cSearch> in <cString>. If the function is unable to find any occurrence of <cSearch> in <cString>, the return value is 0. 3rd and 4th parameters define inclusive range for 2nd parameter on which operation is performed. If 3rd and 4th parameters is not specified, then hb_RAt() is equal to RAt().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cString := \"acdefcdeedcb\"\nLOCAL cSearch := \"cde\"\nLOCAL i, y, r\nLOCAL nLen := Len( cString )\n\nFOR y := 1 TO nLen\n   FOR i := 1 TO nLen\n      IF ( r := hb_RAt( cSearch, cString, y, i ) ) > 0\n         ? 'hb_RAt( \"' + cSearch + '\", \"' + cString + '\",', hb_ntos( y ) + \",\", hb_ntos( i ), \") =\", ;\n            hb_ntos( r )\n      ENDIF\n   NEXT\nNEXT\n\n? hb_RAt( cSearch, \"abcdefgfedcba\" )  // --> 3"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "hb_At(), SubStr(), Right(), RAt()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_ValToStr()",
				"ONELINER": "Converts any scalar type to a string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "hb_ValToStr( <xValue> ) --> cString",
				"ARGUMENTS": "<xValue> is any scalar argument.",
				"RETURNS": "<cString> A string representation of <xValue> using default conversions.",
				"DESCRIPTION": "hb_ValToStr() can be used to convert any scalar value to a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Set( _SET_DATEFORMAT, \"yyyy-mm-dd\" )\n? hb_ValToStr( 4 ) == \"         4\"\n? hb_ValToStr( 4.0 / 2 ) == \"         2.00\"\n? hb_ValToStr( \"String\" ) == \"String\"\n? hb_ValToStr( 0d20010101 ) == \"2001-01-01\"\n? hb_ValToStr( NIL ) == \"NIL\"\n? hb_ValToStr( .F. ) == \".F.\"\n? hb_ValToStr( .T. ) == \".T.\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Str()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "HardCR()",
				"ONELINER": "Replace all soft carriage returns with hard carriages returns.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "HardCR( <cString> ) --> cConvertedString",
				"ARGUMENTS": "<cString> is a string of chars to convert.",
				"RETURNS": "<cConvertedString> Transformed string.",
				"DESCRIPTION": "Returns a string/memo with soft carriage return chars converted to hard carriage return chars.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n? HardCR( data->CNOTES )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "MemoTran(), StrTran()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IsAlpha()",
				"ONELINER": "Checks if leftmost character in a string is an alphabetic character",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "IsAlpha( <cString> ) --> lAlpha",
				"ARGUMENTS": "<cString> Any character string",
				"RETURNS": "<lAlpha> Logical true (.T.) or false (.F.).",
				"DESCRIPTION": "This function return a logical true (.T.) if the first character in <cString> is an alphabetic character. If not, the function will return a logical false (.F.).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? IsAlpha( \"hello\" )\n? IsAlpha( \"12345\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "IsDigit(), IsLower(), IsUpper(), Lower(), Upper()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IsDigit()",
				"ONELINER": "Checks if leftmost character is a digit character",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "IsDigit( <cString> ) --> lDigit",
				"ARGUMENTS": "<cString> Any character string",
				"RETURNS": "<lDigit> Logical true (.T.) or false (.F.).",
				"DESCRIPTION": "This function takes the character string <cString> and checks to see if the leftmost character is a digit, from 1 to 9. If so, the function will return a logical true (.T.); otherwise, it will return a logical false (.F.).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? IsDigit( \"12345\" )  // --> .T.\n? IsDigit( \"abcde\" )  // --> .F."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "IsAlpha(), IsLower(), IsUpper(), Lower(), Upper()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IsLower()",
				"ONELINER": "Checks if leftmost character is an lowercased letter.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "IsLower( <cString> ) --> lLower",
				"ARGUMENTS": "<cString> Any character string",
				"RETURNS": "<lLower> Logical true (.T.) or false (.F.).",
				"DESCRIPTION": "This function takes the character string <cString> and checks to see if the leftmost character is a lowercased letter. If so, the function will return a logical true (.T.); otherwise, it will return a logical false (.F.).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? IsLower( \"ABCde\" )  // --> .F.\n? IsLower( \"aBCde\" )  // --> .T."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "IsAlpha(), IsDigit(), IsUpper(), Lower(), Upper()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "IsUpper()",
				"ONELINER": "Checks if leftmost character is an uppercased letter.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "IsUpper( <cString> ) --> lUpper",
				"ARGUMENTS": "<cString> Any character string",
				"RETURNS": "<lUpper> Logical true (.T.) or false (.F.).",
				"DESCRIPTION": "This function checks to see if the leftmost character if <cString> is a uppercased letter. If so, the function will return a logical true (.T.); otherwise, it will return a logical false (.F.).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? IsUpper( \"Abcde\" )  // --> .T.\n? IsUpper( \"abcde\" )  // --> .F."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "IsAlpha(), IsLower(), IsDigit(), Lower(), Upper()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Left()",
				"ONELINER": "Extract the leftmost substring of a character expression",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Left( <cString>, <nLen> ) --> cReturn",
				"ARGUMENTS": "<cString> Main character to be parsed\n<nLen> Number of bytes to return beginning at the leftmost position",
				"RETURNS": "<cReturn>  Substring of evaluation",
				"DESCRIPTION": "This functions returns the leftmost <nLen> characters of <cString>. It is equivalent to the following expression:\n```\nSubStr( <cString>, 1, <nLen> )\n```",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Left( \"Hello Harbour\", 5 )  // --> \"Hello\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "SubStr(), Right(), At(), RAt()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Lower()",
				"ONELINER": "Universally lowercases a character string expression.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Lower( <cString> ) --> cLowerString",
				"ARGUMENTS": "<cString> Any character expression.",
				"RETURNS": "<cLowerString> Lowercased value of <cString>",
				"DESCRIPTION": "This function converts any character expression passes as <cString> to its lowercased representation. Any non alphabetic character withing <cString> will remain unchanged.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Lower( \"HARBOUR\" )    // --> \"harbour\"\n? Lower( \"Hello All\" )  // --> \"hello all\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Upper(), IsLower(), IsUpper()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "LTrim()",
				"ONELINER": "Removes leading spaces from a string",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "LTrim( <cString> ) --> cReturn",
				"ARGUMENTS": "<cString>  Character expression with leading spaces",
				"RETURNS": "LTrim() returns a copy of the original string with leading spaces removed.",
				"DESCRIPTION": "This function trims the leading space blank",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"|\" + LTrim( \"Hello     \" ) + \"|\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Trim(), RTrim(), AllTrim()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MemoRead()",
				"ONELINER": "Return the text file's contents as a character string",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "MemoRead( <cFileName> ) --> cString",
				"ARGUMENTS": "<cFileName> is the file name to read from disk.\nIt must include the file extension. If file to be read lives in another directory, you must include the path.",
				"RETURNS": "Returns the contents of a text file as a character string.\nIf <cFileName> cannot be found or read MemoRead() returns an empty string (\"\").",
				"DESCRIPTION": "MemoRead() is a function that reads the content of a text file (till now) from disk (floppy, HDD, CD-ROM, etc.) into a memory string. In that way you can manipulate as any character string or assigned to a memo field to be saved in a database.\nMemoRead() function is used together with MemoEdit() and MemoWrit() to get from disk text from several sources that would be edited, searched, replaced, displayed, etc.\nIt is used to import data from other sources to our database.\nNote: MemoRead() does not use the settings SET DEFAULT or SET PATH to search for <cFileName>. It searches for <cFileName> in the current directory.\nOver a network, MemoRead() attempts to open <cFileName> in read-only mode and shared.  If the file is used in mode exclusive by another process, the function will returns a null string (\"\").",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// This example uses MemoRead() to assign the contents of a text\n// file to a character variable for later search\n\nLOCAL cFile := \"account.prg\"\nLOCAL cString := MemoRead( cFile )\nLOCAL cCopyright := \"Melina\"\n\nIF ! cCopyright $ cString                     // check for copyright\n   ? MemoWrit( cFile, cCopyright + cString )  // if not, add it!\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "MemoEdit(), MemoWrit(), REPLACE, hb_MemoRead()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MemoTran()",
				"ONELINER": "Converts hard and soft carriage returns within strings.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "MemoTran( <cString>, <cHard>, <cSoft> ) --> cConvertedString",
				"ARGUMENTS": "<cString> is a string of chars to convert.\n<cHard> is the character to replace hard returns with. If not specified defaults to semicolon.\n<cSoft> is the character to replace soft returns with. If not specified defaults to single space.",
				"RETURNS": "<cConvertedString> Transformed string.",
				"DESCRIPTION": "Returns a string/memo with carriage return chars converted to specified chars.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n? MemoTran( data->CNOTES )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "HardCR(), StrTran()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MemoWrit()",
				"ONELINER": "Write a memo field or character string to a text file on disk",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "MemoWrit( <cFileName>, <cString> ) --> lSuccess",
				"ARGUMENTS": "<cFileName> is the file name to be written to disk.\nIt must include the file extension. If file to be read lives in another directory, you must include the path.\n<cString>   Is the memo field or character string, to be write to\n<cFile>.",
				"RETURNS": "Function returns true (.T.) if the writing operation was successful; otherwise, it returns false (.F.).",
				"DESCRIPTION": "This a function that writes a memo field or character string to a text file on disk (floppy, HDD, CD-ROM, etc.) If you not specified a path, MemoWrit() writes <cFileName> to the current directory. If <cFileName> exists, it is overwritten.\nMemoWrit() function is used together with MemoRead() and MemoEdit() to save to disk text from several sources that was edited, searched, replaced, displayed, etc.\nNote that MemoWrit() do not use the directory settings SET DEFAULT.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "//  This example uses MemoWrit() to write the contents of a character\n// variable to a text file.\n\nLOCAL cFile := \"account.prg\"\nLOCAL cString := MemoRead( cFile )\nLOCAL cCopyright := \"Melina\"\n\nIF ! cCopyright $ cString                     // check for copyright\n   ? MemoWrit( cFile, cCopyright + cString )  // if not, add it!\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "MemoEdit(), MemoRead(), hb_MemoWrit()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "PadC()",
				"ONELINER": "Centers an expression for a given width",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "PadC( <xVal>, <nWidth>, <cFill> ) --> cString",
				"ARGUMENTS": "<xVal> A Number, Character or Date value to pad\n<nWidth> Width of output string\n<cFill> Character to fill in the string",
				"RETURNS": "<cString> The Center string of <xVal>",
				"DESCRIPTION": "This function takes an date, number or character expression <xVal> and attempt to center the expression within a string of a given width expressed as <nWidth>. The default character used to pad either side of <xVal> will be a blank space. This character may be explicitly specified the value of <cFill>.\nIf the length of <xVal> is longer then <nWidth>, this function will truncate the string <xVal> from the leftmost side to the length of <nWidth>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? PadC( \"Harbour\", 20 )\n? PadC( 34.5142, 20 )\n? PadC( Date(), 35 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "AllTrim(), PadL(), PadR()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "PadL()",
				"ONELINER": "Left-justifies an expression for a given width",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "PadL( <xVal>, <nWidth>, <cFill> ) --> cString",
				"ARGUMENTS": "<xVal> An number, Character or date to pad\n<nWidth> Width of output string\n<cFill> Character to fill in the string",
				"RETURNS": "<cString> The left-justifies string of <xVal>",
				"DESCRIPTION": "This function takes an date, number, or character expression <xVal> and attempt to left-justify it within a string of a given width expressed as <nWidth>. The default character used to pad left side of <xVal> will be an blank space; however, this character may be explicitly specified the value of <cFill>.\nIf the length of <xVal> is longer then <nWidth>, this function will truncate the string <xVal> from the leftmost side to the length of <nWidth>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? PadL( \"Harbour\", 20 )\n? PadL( 34.5142, 20 )\n? PadL( Date(), 35 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "AllTrim(), PadC(), PadR()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "PadR()",
				"ONELINER": "Right-justifies an expression for a given width",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "PadR( <xVal>, <nWidth>, <cFill> ) --> cString",
				"ARGUMENTS": "<xVal> A Number, Character or Date value to pad\n<nWidth> Width of output string\n<cFill> Character to fill in the string",
				"RETURNS": "<cString> The right-justifies string of <xVal>",
				"DESCRIPTION": "This function takes an date, number, or character expression <xVal> and attempt to right-justify it within a string of a given width expressed as <nWidth>. The default character used to pad right side of <xVal> will be an blank space; however, this character may be explicitly specified the value of <cFill>.\nIf the length of <xVal> is longer then <nWidth>, this function will truncate the string <xVal> from the leftmost side to the length of <nWidth>.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? PadR( \"Harbour\", 20 )\n? PadR( 34.5142, 20 )\n? PadR( Date(), 35 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "AllTrim(), PadC(), PadL()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "RAt()",
				"ONELINER": "Searches for last occurrence a substring of a string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "RAt( <cSearch>, <cString> ) --> nPos",
				"ARGUMENTS": "<cSearch> Substring to search for\n<cString> Main string",
				"RETURNS": "RAt() return the location of beginning position of last occurrence a substring of a string.",
				"DESCRIPTION": "This function searches for last occurrence a <cSearch> in <cString>. If the function is unable to find any occurrence of <cSearch> in <cString>, the return value is 0.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? RAt( \"cde\", \"abcdefgfcdeedcba\" )  // --> 9\n? RAt( \"cdr\", \"abcdefgfedcba\" )     // --> 0"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "At(), SubStr(), Right(), hb_RAt()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Replicate()",
				"ONELINER": "Repeats a single character expression",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Replicate( <cString>, <nSize> ) --> cReplicateString",
				"ARGUMENTS": "<cString> Character string to be replicated\n<nSize> Number of times to replicate <cString>",
				"RETURNS": "<cReplicateString> A character expression contain the <cString> fill character.",
				"DESCRIPTION": "This function returns a string composed of <nSize> repetitions of <cString>. The length of the character string returned by this function is limited to the memory available.\nA value of 0 for <nSize> will return a null string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Replicate( \"a\", 10 )      // --> \"aaaaaaaaaa\"\n? Replicate( \"b\", 100000 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Space(), PadC(), PadL(), PadR()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Right()",
				"ONELINER": "Extract the rightmost substring of a character expression",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Right( <cString>, <nLen> ) --> cReturn",
				"ARGUMENTS": "<cString> Character expression to be parsed\n<nLen> Number of bytes to return beginning at the rightmost position",
				"RETURNS": "<cReturn>  Substring of evaluation",
				"DESCRIPTION": "This functions returns the rightmost <nLen> characters of <cString>. It is equivalent to the following expressions:\n```\nSubStr( <cString>, -<nLen> )\n```\n```\nSubStr( <cString>, Len( <cString> ) - <nLen> + 1, <nLen> )\n```",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Right( \"Hello Harbour\", 5 )  // --> \"rbour\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "SubStr(), Left(), At(), RAt()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "RTrim()",
				"ONELINER": "Remove trailing spaces from a string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "RTrim( <cExpression> ) --> cString",
				"ARGUMENTS": "<cExpression> Any character expression",
				"RETURNS": "<cString> A formatted string with out any blank spaced.",
				"DESCRIPTION": "This function returns the value of <cString> with any trailing blank removed.\nThis function is identical to RTrim() and the opposite of LTrim(). Together with LTrim(), this function equated to the AllTrim() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? RTrim( \"Hello\" )   // --> \"Hello\"\n? RTrim( \"\" )        // --> \"\"\n? RTrim( \"UA   \" )   // --> \"UA\"\n? RTrim( \"   UA\" )   // --> \"   UA\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "AllTrim(), LTrim(), Trim()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Space()",
				"ONELINER": "Returns a string of blank spaces",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Space( <nSize> ) --> cString",
				"ARGUMENTS": "<nSize> The length of the string",
				"RETURNS": "<cString> A string containing blank spaces",
				"DESCRIPTION": "This function returns a string consisting of <nSize> blank spaces. If the value of <nSize> is 0, a null string (\"\") will be returned.\nThis function is useful to declare the length of a character memory variable.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"dbstruct.ch\"\n\nPROCEDURE Main()\n\n   LOCAL cBigString\n   LOCAL cFirst\n   LOCAL cString := Space( 20 )   // Create an character memory variable\n                                  // with length 20\n   ? Len( cString )  // --> 20\n   cBigString := Space( 100000 )  // Create a memory variable with 100000\n                                  // blank spaces\n   ? Len( cBigString )\n   USE test NEW\n   cFirst := MakeEmpty( 1 )\n   ? Len( cFirst )\n\n   RETURN\n\nSTATIC FUNCTION MakeEmpty( xField )\n\n   LOCAL nRecord\n   LOCAL xRetValue\n\n   IF ! Alias() == \"\"\n      nRecord := RecNo()\n      dbGoto( 0 )\n      IF HB_ISSTRING( xField )\n         xField := AScan( dbStruct(), {| aFields | aFields[ DBS_NAME ] == Upper( xField ) } )\n      ELSE\n         hb_default( @xField, 0 )\n         IF xField < 1 .OR. xField > FCount()\n            xField := 0\n         ENDIF\n      ENDIF\n      IF xField != 0\n         xRetValue := FieldGet( xField )\n      ENDIF\n      dbGoto( nRecord )\n   ENDIF\n\n   RETURN xRetValue"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "PadC(), PadL(), PadR(), Replicate()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Str()",
				"ONELINER": "Convert a numeric expression to a character string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Str( <nNumber>, [<nLength>], [<nDecimals>] ) --> cNumber",
				"ARGUMENTS": "<nNumber> is the numeric expression to be converted to a character string.\n<nLength> is the length of the character string to return, including decimal digits, decimal point, and sign.\n<nDecimals> is the number of decimal places to return.",
				"RETURNS": "Str() returns <nNumber> formatted as a character string. If the optional length and decimal arguments are not specified, Str() returns the character string according to the following rules:\nResults of Str() with No Optional Arguments\n<table>\n Expression               Return Value Length\n Field Variable           Field length plus decimals\n Expressions/constants    Minimum of 10 digits plus decimals\n Val()                    Minimum of 3 digits\n Month()/Day()            3 digits\n Year()                   5 digits\n RecNo()                  7 digits\n</table>",
				"DESCRIPTION": "Str() is a numeric conversion function that converts numeric values to character strings. It is commonly used to concatenate numeric values to character strings. Str() has applications displaying numbers, creating codes such as part numbers from numeric values, and creating index keys that combine numeric and character data.\nStr() is like Transform(), which formats numeric values as character strings using a mask instead of length and decimal specifications.\nThe inverse of Str() is Val(), which converts character numbers to numerics.\n*  If <nLength> is less than the number of whole number digits in\n<nNumber>, Str() returns asterisks instead of the number.\n*  If <nLength> is less than the number of decimal digits\nrequired for the decimal portion of the returned string, Harbour rounds the number to the available number of decimal places.\n*  If <nLength> is specified but <nDecimals> is omitted (no\ndecimal places), the return value is rounded to an integer.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Str( 10, 6, 2 )   // --> \" 10.00\"\n? Str( -10, 8, 2 )  // --> \"  -10.00\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "StrZero(), Transform(), Val()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "StrTran()",
				"ONELINER": "Translate substring value with a main string",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "StrTran( <cString>, <cLocString>, [<cRepString>], [<nPos>],\n         [<nOccurrences>] ) --> cReturn",
				"ARGUMENTS": "<cString>     The main string to search\n<cLocString>  The string to locate in the main string\n<cRepString>  The string to replace the <cLocString>\n<nPos>        The first occurrence to be replaced\n<nOccurrences> Number of occurrence to replace",
				"RETURNS": "<cReturn>  Formatted string",
				"DESCRIPTION": "This function searches for any occurrence of <cLocString> in <cString> and replaces it with <cRepString>. If <cRepString> is not specified, a NULL byte will replace <cLocString>.\nIf <nPos> is used, its value defines the first occurrence to be replaced. The default value is 1. Additionally, if used, the value of <nOccurrences> tell the function how many occurrences of <cLocString> in <cString> are to the replaced. The default of <nOccurrences> is all occurrences.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? StrTran( \"Harbour  Power\", \"  \", \" \" )  // --> \"Harbour Power\"\n? StrTran( \"Harbour  Power  The Future  of  xBase\", \"  \", \" \" , , 2 )\n  // --> \"Harbour Power The future  of  xBase\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Libraty is rtl",
				"TAGS": "API, Strings",
				"SEEALSO": "SubStr(), At()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "StrZero()",
				"ONELINER": "Convert a numeric expression to a character string, zero padded.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "StrZero( <nNumber>, [<nLength>], [<nDecimals>] ) --> cNumber",
				"ARGUMENTS": "<nNumber> is the numeric expression to be converted to a character string.\n<nLength> is the length of the character string to return, including decimal digits, decimal point, and sign.\n<nDecimals> is the number of decimal places to return.",
				"RETURNS": "StrZero() returns <nNumber> formatted as a character string. If the optional length and decimal arguments are not specified, StrZero() returns the character string according to the following rules:\nResults of StrZero() with No Optional Arguments\n<table>\n Expression               Return Value Length\n Field Variable           Field length plus decimals\n Expressions/constants    Minimum of 10 digits plus decimals\n Val()                    Minimum of 3 digits\n Month()/Day()            3 digits\n Year()                   5 digits\n RecNo()                  7 digits\n</table>",
				"DESCRIPTION": "StrZero() is a numeric conversion function that converts numeric values to character strings. It is commonly used to concatenate numeric values to character strings. StrZero() has applications displaying numbers, creating codes such as part numbers from numeric values, and creating index keys that combine numeric and character data.\nStrZero() is like Transform(), which formats numeric values as character strings using a mask instead of length and decimal specifications.\nThe inverse of StrZero() is Val(), which converts character numbers to numerics.\n*  If <nLength> is less than the number of whole number digits in\n<nNumber>, Str() returns asterisks instead of the number.\n*  If <nLength> is less than the number of decimal digits\nrequired for the decimal portion of the returned string, Harbour rounds the number to the available number of decimal places.\n*  If <nLength> is specified but <nDecimals> is omitted (no\ndecimal places), the return value is rounded to an integer.\nThe StrZero() function was part of the CA-Cl*pper samples.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? StrZero( 10, 6, 2 )   // --> \"010.00\"\n? StrZero( -10, 8, 2 )  // --> \"-0010.00\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Str()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "SubStr()",
				"ONELINER": "Returns a substring from a main string",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "SubStr( <cString>, <nStart>, [<nLen>] ) --> cReturn",
				"ARGUMENTS": "<cString> Character expression to be parsed\n<nStart> Start position\n<nLen> Number of characters to return",
				"RETURNS": "<cReturn> Substring of evaluation",
				"DESCRIPTION": "This functions returns a character string formed from <cString>, starting at the position of <nStart> and continuing on for a length of <nLen> characters. If <nLen> is not specified, the value will be all remaining characters from the position of <nStart>.\nThe value of <nStart> may be negative. If it is, the direction of operation is reversed from a default of left-to-right to right-to-left for the number of characters specified in <nStart>. If the number of characters from <nStart> to the end of the string is less than <nLen> the rest are ignored.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? SubStr( \"Hello Harbour\",  7, 4 )  // --> \"Harb\"\n? SubStr( \"Hello Harbour\", -3, 3 )  // --> \"our\"\n? SubStr( \"Hello Harbour\",  7    )  // --> \"Harbour\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Left(), At(), Right()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Transform()",
				"ONELINER": "Formats a value based on a specific picture template.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Transform( <xExpression>, <cTemplate> ) --> cFormatted",
				"ARGUMENTS": "<xExpression> Any expression to be formatted.\n<cTemplate> Character string with picture template",
				"RETURNS": "<cFormatted> Formatted expression in character format",
				"DESCRIPTION": "This function returns <xExpression> in the format of the picture expression passed to the function as <cTemplate>.\nTheir are two components that can make up <cTemplate> : a function string and a template string. Function strings are those functions that globally tell what the format of <xExpression> should be. These functions are represented by a single character precede by the @ symbol.\nThere are a couple of rules to follow when using function strings and template strings:\n- First, a single space must fall between the function template\nand the template string if they are used in conjunction with one another.\n- Second, if both components make up the value of <cTemplate>, the\nfunction string must precede the template string. Otherwise, the function string may appear with out the template string and vice versa.\nThe table below shows the possible function strings available with the Transform() function.\n<table-noheader>\n @B   Left justify the string within the format.\n @C   Issue a CR after format is numbers are positive.\n @D   Put dates in SET DATE format.\n @E   Put dates in BRITISH format.\n @L   Make a zero padded string out of the number.\n @R   Insert non template characters.\n @X   Issue a DB after format is numbers are negative.\n @Z   Display any zero as blank spaces.\n @(   Quotes around negative numbers\n @!   Convert alpha characters to uppercased format.\n</table>\nThe second part of <cTemplate> consists of the format string. Each character in the string may be formatted based on using the follow characters as template markers for the string.\n<table-noheader>\n A,N,X,9,#   Any data type\n L           Shows logical as \"T\" or \"F\"\n Y           Shows logical as \"Y\" or \"N\"\n !           Convert to uppercase\n $           Dollar sing in place of leading spaces in numeric expression\n *           Asterisks in place of leading spaces in numeric expression\n ,           Commas position\n .           Decimal point position\n</table>",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cString := \"This is harbour\"\nLOCAL nNumber := 9923.34\nLOCAL nNumber1 := -95842.00\nLOCAL lValue := .T.\nLOCAL dDate := Date()\n? \"working with String\"\n? \"Current String is\", cString\n? \"All uppercased\", Transform( cString, \"@!\" )\n? \"Date is\", dDate\n? \"Date is\", Transform( dDate, \"@D\" )\n? Transform( nNumber, \"@L 99999999\" )  // --> \"009923.34\"\n? Transform( 0      , \"@L 9999\"     )  // --> \"0000\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "The @L function template is a FoxPro/Xbase++ Extension",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "@...SAY, DevOutPict()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Trim()",
				"ONELINER": "Remove trailing spaces from a string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Trim( <cExpression> ) --> cString",
				"ARGUMENTS": "<cExpression> Any character expression",
				"RETURNS": "<cString> A formatted string with out any blank spaced.",
				"DESCRIPTION": "This function returns the value of <cString> with any trailing blank removed.\nThis function is identical to RTrim() and the opposite of LTrim(). Together with LTrim(), this function equated to the AllTrim() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Trim( \"Hello\" )    // --> \"Hello\"\n? Trim( \"\" )         // --> \"\"\n? Trim( \"UA   \" )    // --> \"UA\"\n? Trim( \"   UA\" )    // --> \"   UA\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "RTrim(), LTrim(), AllTrim()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Upper()",
				"ONELINER": "Converts a character expression to uppercase format",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Upper( <cString> ) --> cUpperString",
				"ARGUMENTS": "<cString> Any character expression.",
				"RETURNS": "<cUpperString> Uppercased value of <cString>",
				"DESCRIPTION": "This function converts all alpha characters in <cString> to upper case values and returns that formatted character expression.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Upper( \"harbour\" )  // --> \"HARBOUR\"\n? Upper( \"Harbour\" )  // --> \"HARBOUR\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Lower(), IsUpper(), IsLower()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Val()",
				"ONELINER": "Convert a number from a character type to numeric",
				"CATEGORY": "API",
				"SUBCATEGORY": "Strings",
				"SYNTAX": "Val( <cNumber> ) --> nNumber",
				"ARGUMENTS": "<cNumber> Any valid character string of numbers.",
				"RETURNS": "<nNumber> The numeric value of <cNumber>",
				"DESCRIPTION": "This function converts any number previously defined as an character expression <cNumber> into a numeric expression.\nThis functions is the oppose of the Str() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Val( \"31421\" )  // --> 31421"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Strings",
				"SEEALSO": "Str(), Transform()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__TypeFile()",
				"ONELINER": "Show the content of a file on the console and/or printer",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "__TypeFile( <cFile>, [<lPrint>] ) --> NIL",
				"ARGUMENTS": "<cFile> is a name of the file to display. If the file have an extension, it must be specified (there is no default value).\n<lPrint> is an optional logical value that specifies whether the output should go only to the screen (.F.) or to both the screen and printer (.T.), the default is (.F.).",
				"RETURNS": "__TypeFile() always return NIL.",
				"DESCRIPTION": "__TypeFile() function type the content of a text file on the screen with an option to send this information also to the printer. The file is displayed as is without any headings or formatting.\nIf <cFile> contain no path, __TypeFile() try to find the file first in the `SET DEFAULT` directory and then in search all of the `SET PATH` directories. If <cFile> cannot be found a run-time error occur.\nUse `SET CONSOLE OFF` to suppress screen output. You can pause the output using <Ctrl-S>, press any key to resume.\n__TypeFile() function is used in the preprocessing of the TYPE command.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// The following examples assume a file name `test.txt` exist in all\n// specified paths, a run-time error would displayed if it does not\n\n// display test.txt file on screen\n__TypeFile( \"test.txt\" )\n\n// display test.txt file on screen and printer\n__TypeFile( \"test.txt\", .T. )\n\n// display test.txt file on printer only\nSET CONSOLE OFF\n__TypeFile( \"test.txt\", .T. )\nSET CONSOLE ON"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Terminal",
				"SEEALSO": "COPY FILE, SET DEFAULT, SET PATH, SET PRINTER, TYPE"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Col()",
				"ONELINER": "Returns the current screen column position",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "Col() --> nPosition",
				"ARGUMENTS": "None.",
				"RETURNS": "<nPosition>  Current column position",
				"DESCRIPTION": "This function returns the current cursor column position. The value for this function can range between 0 and MaxCol().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Col()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Terminal",
				"SEEALSO": "Row(), MaxRow(), MaxCol()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "DevOutPict()",
				"ONELINER": "Displays a value to a device using a picture template",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "DevOutPict( <xExp>, <cPicture>, [<cColorString>] )",
				"ARGUMENTS": "<xExp> is any valid expression.\n<cPicture> is any picture transformation that Transform() can use.\n<cColorString> is an optional string that specifies a screen color to use in place of the default color when the output goes to the screen.",
				"DESCRIPTION": "Outputs any expression using a picture transformation instead of using the default transformation for the type of expression.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Output a negative dollar amount using debit notation.\nDevOutPict( -1.25, \"@D$ 99,999.99 )  // --> $(     1.25)"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "DevOutPict() is mostly CA-Cl*pper compliant. Any differences are due to enhancements in the Harbour Transform() over CA-Cl*pper.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Terminal",
				"SEEALSO": "DevOut(), Transform()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_ColorIndex()",
				"ONELINER": "Extract one color from a full color-spec string.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "hb_ColorIndex( <cColorSpec>, <nIndex> ) --> cColor",
				"ARGUMENTS": "<cColorSpec> is a color list\n<nIndex> is the position of the color item to be extracted, the first position is the zero.",
				"RETURNS": "The selected color string, or if anything goes wrong, an empty string.",
				"DESCRIPTION": "CA-Cl*pper has a color spec string, which has more than one color in it, separated with commas.\nThis function will extract a given item from this list. You may use the manifest constants defined in color.ch to identify and extract common colors.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"color.ch\"\n? hb_ColorIndex( \"W/N, N/W\", CLR_ENHANCED )  // --> \"N/W\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Terminal",
				"SEEALSO": "ColorSelect()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MaxCol()",
				"ONELINER": "Returns the maximum number of columns in the current video mode",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "MaxCol() --> nPosition",
				"ARGUMENTS": "None.",
				"RETURNS": "<nPosition>  The maximum number of columns possible in current video mode",
				"DESCRIPTION": "This function returns the current cursor column position. The value for this function can range between 0 and MaxCol().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? MaxCol()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Terminal",
				"SEEALSO": "Row(), MaxRow(), Col()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MaxRow()",
				"ONELINER": "Returns the current screen row position",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "MaxRow() --> nPosition",
				"ARGUMENTS": "None.",
				"RETURNS": "<nPosition>  The maximum number of rows possible in current video mode",
				"DESCRIPTION": "This function returns the current cursor row location. The value for this function can range between 0 and MaxCol().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? MaxRow()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Terminal",
				"SEEALSO": "Col(), Row(), MaxCol()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "RESTORE SCREEN",
				"ONELINER": "Restore screen image and coordinate from an internal buffer",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "RESTORE SCREEN",
				"ARGUMENTS": "none.",
				"DESCRIPTION": "`RESTORE SCREEN` restores saved image of the whole screen from an internal buffer that was saved by `SAVE SCREEN`, it also restore cursor position. After a call to 'RESTORE SCREEN` the internal buffer is cleared.\n`RESTORE SCREEN` command is preprocessed into __XRestScreen() function during compile time. Note that `RESTORE SCREEN FROM` is preprocessed into RestScreen() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// save the screen, display list of files than restore the screen\nSAVE SCREEN\nDIR *.*\nRESTORE SCREEN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Terminal",
				"SEEALSO": "__XRestScreen(), SAVE SCREEN, __XSaveScreen()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Row()",
				"ONELINER": "Returns the current screen row position",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "Row() --> nPosition",
				"ARGUMENTS": "None.",
				"RETURNS": "<nPosition>  Current screen row position",
				"DESCRIPTION": "This function returns the current cursor row location. The value for this function can range between 0 and MaxCol().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Row()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Terminal",
				"SEEALSO": "Col(), MaxRow(), MaxCol()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SAVE SCREEN",
				"ONELINER": "Save whole screen image and coordinate to an internal buffer",
				"CATEGORY": "API",
				"SUBCATEGORY": "Terminal",
				"SYNTAX": "SAVE SCREEN",
				"ARGUMENTS": "none.",
				"DESCRIPTION": "`SAVE SCREEN` saves the image of the whole screen into an internal buffer, it also save current cursor position. The information could later be restored by `RESTORE SCREEN`. Each call to `SAVE SCREEN` overwrite the internal buffer.\n`SAVE SCREEN` command is preprocessed into __XSaveScreen() function during compile time. Note that `SAVE SCREEN TO` is preprocessed into SaveScreen() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// save the screen, display list of files than restore the screen\nSAVE SCREEN\nDIR *.*\nRESTORE SCREEN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, Terminal",
				"SEEALSO": "RESTORE SCREEN, __XRestScreen(), __XSaveScreen()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__AtPrompt()",
				"ONELINER": "Display a menu item on screen and define a message",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "__AtPrompt( <nRow>, <nCol>, <cPrompt>, [<xMsg>] ) --> .F.",
				"ARGUMENTS": "<nRow> is the row number to display the menu <cPrompt>. Value could range from zero to MaxRow().\n<nCol> is the column number to display the menu <cPrompt>. Value could range from zero to MaxCol().\n<cPrompt> is the menu item character string to display.\n<xMsg> define a message to display each time this menu item is highlighted. <xMsg> could be a character string or code block that is evaluated to a character string. If <xMsg> is not specified or of the wrong type, an empty string (\"\") would be used.",
				"RETURNS": "__AtPrompt() always return .F.",
				"DESCRIPTION": "With __AtPrompt() you define and display a menu item, each call to __AtPrompt() add another item to the menu, to start the menu itself you should call the __MenuTo() function (`MENU TO` command). You can define any row and column combination and they will be displayed at the order of definition. After each call to __AtPrompt(), the cursor is placed one column to the right of the last text displayed, and Row() and Col() are updated.\n`@...PROMPT` command is preprocessed into __AtPrompt() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nChoice\n// display a two line menu with status line at the bottom\n// let the user select favorite day\nSET MESSAGE TO 24 CENTER\n@ 10, 2 PROMPT \"Sunday\" MESSAGE \"This is the 1st item\"\n@ 11, 2 PROMPT \"Monday\" MESSAGE \"Now we're on the 2nd item\"\nMENU TO nChoice\nDO CASE\nCASE nChoice == 0           // user press <Esc> key\n   QUIT\nCASE nChoice == 1           // user select 1st menu item\n   ? \"Guess you don't like Mondays\"\nCASE nChoice == 2           // user select 2nd menu item\n   ? \"Just another day for some\"\nENDCASE"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "AChoice(), MENU TO, SET MESSAGE, SET INTENSITY, SET WRAP, __MenuTo()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__Input()",
				"ONELINER": "Stops application",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "__Input( <cMessage> ) --> cString",
				"ARGUMENTS": "<cMessage> is any valid expression.",
				"RETURNS": "<cString> input value macroed",
				"DESCRIPTION": "This function waits for a console input and returns macroed expression entered.",
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "__Wait(), __Accept()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__Keyboard()",
				"ONELINER": "Use hb_keyPut() instead",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "KEYBOARD <cString>\nCLEAR TYPEAHEAD",
				"ARGUMENTS": "<cString> is the optional string to stuff into the Harbour keyboard buffer after clearing it first.\nNote: The character `;` is converted to `Chr( 13 )` (this is an undocumented CA-Cl*pper feature).",
				"DESCRIPTION": "Clears the Harbour keyboard type-ahead buffer and then inserts an optional string into it.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Stuff an Enter key into the keyboard buffer\nKEYBOARD Chr( 13 )\n// Clear the keyboard buffer\nCLEAR TYPEAHEAD\n\nKEYBOARD Chr( 13 ); ? Inkey()  // --> 13\nKEYBOARD \";\"; ? Inkey()  // --> 13\nKEYBOARD \"Hello\"; CLEAR TYPEAHEAD; ? Inkey()  // --> 0"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "CLEAR TYPEAHEAD, KEYBOARD"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__MenuTo()",
				"ONELINER": "Invoked a menu defined by set of `@...PROMPT`",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "__MenuTo( <bBlock>, <cVariable> ) --> nChoice",
				"ARGUMENTS": "<bBlock> is a set/get code block for variable named <cVariable>.\n<cVariable> is a character string that contain the name of the variable to hold the menu choices, if this variable does not exist a PRIVATE variable with the name <cVariable> would be created to hold the result.",
				"RETURNS": "__MenuTo() return the number of select menu item, or 0 if there was no item to select from or if the user pressed the <Esc> key.",
				"DESCRIPTION": "__MenuTo() invoked the menu define by previous __AtPrompt() call and display a highlight bar that the user can move to select an option from the menu. If <cVariable> does not exist or not visible, a PRIVATE variable named <cVariable> is created and hold the current menu selection. If there is a variable named <cVariable>, its value is used to select the first highlighted item.\nMenu prompts and messages are displayed in current Standard color, highlighted bar is displayed using current Enhanced color.\nPressing the arrow keys move the highlighted bar. When a menu item is highlighted the message associated with it is displayed on the line specified with `SET MESSAGE`. If `SET WRAP` is ON and the user press <up> arrow while on the first selection the last menu item is highlighted, if the user press <Down> arrow while on the last item, the first item is highlighted.\nFollowing are active keys that handled by __MenuTo():\n<table>\n key            Meaning\n Up             Move to previous item\n Down           Move to next item\n Left           Move to previous item\n Right          Move to next item\n Home           Move to the first item\n End            Move to the last item\n PgUp           Select menu item, return position\n PgDn           Select menu item, return position\n Enter          Select menu item, return position\n Esc            Abort selection, return 0\n First letter   Select next menu with the same first letter,\n                return this item position.\n</table>\nupon exit the cursor is placed at MaxRow() - 1, 0 __MenuTo() can be nested without loosing the previous prompts.\n`MENU TO` command is preprocessed into __MenuTo() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nChoice\n// display menu item on each screen corner and let user select one\nCLS\nSET MESSAGE TO MaxRow() / 2 CENTER\nSET WRAP ON\n@ 0           , 0             PROMPT \"1. Upper left\"   MESSAGE \" One \"\n@ 0           , MaxCol() - 16 PROMPT \"2. Upper right\"  MESSAGE \" Two \"\n@ MaxRow() - 1, MaxCol() - 16 PROMPT \"3. Bottom right\" MESSAGE \"Three\"\n@ MaxRow() - 1, 0             PROMPT \"4. Bottom left\"  MESSAGE \"Four \"\nMENU TO nChoice\nSetPos( MaxRow() / 2, MaxCol() / 2 - 10 )\nIF nChoice == 0\n   ?? \"<Esc> was pressed\"\nELSE\n   ?? \"Selected option is\", nChoice\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "@...PROMPT, AChoice(), SET MESSAGE, SET INTENSITY, SET WRAP, __AtPrompt()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__NoNoAlert()",
				"ONELINER": "Override `//NOALERT` command-line switch",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "__NoNoAlert()",
				"ARGUMENTS": "This function takes no arguments.",
				"DESCRIPTION": "The `//NOALERT` command-line switch cause Cl*pper to ignore calls to the Alert() function, this function override this behavior and always display Alert() dialog box.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// make sure alert are been displayed\n__NoNoAlert()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Undocumented CA-Cl*pper v5.x function available in builds with HB_CLP_UNDOC option enabled (default)",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__XRestScreen()",
				"ONELINER": "Restore screen image and coordinate from an internal buffer",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "__XRestScreen()",
				"ARGUMENTS": "none.",
				"DESCRIPTION": "__XRestScreen() restores saved image of the whole screen from an internal buffer that was saved by __XSaveScreen(), it also restore cursor position. After a call to __XRestScreen() the internal buffer is cleared.\n`RESTORE SCREEN` command is preprocessed into __XRestScreen() function during compile time. Note that `RESTORE SCREEN FROM` is preprocessed into RestScreen() function.\n__XRestScreen() is a compatibility function, it is superseded by RestScreen() which allow you to restore the screen from a variable.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// save the screen, display list of files than restore the screen\nSAVE SCREEN\nDIR *.*\nRESTORE SCREEN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "__XRestScreen(), SAVE SCREEN, __XSaveScreen()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "__XSaveScreen()",
				"ONELINER": "Save whole screen image and coordinate to an internal buffer",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "__XSaveScreen()",
				"ARGUMENTS": "none.",
				"DESCRIPTION": "__XSaveScreen() saves the image of the whole screen into an internal buffer, it also save current cursor position. The information could later be restored by __XRestScreen(). Each call to __XSaveScreen() overwrite the internal buffer.\n`SAVE SCREEN` command is preprocessed into __XSaveScreen() function during compile time. Note that `SAVE SCREEN TO` is preprocessed into SaveScreen() function.\n__XSaveScreen() is a compatibility function, it is superseded by SaveScreen() which allow you to save part or all the screen into a variable.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// save the screen, display list of files than restore the screen\nSAVE SCREEN\nDIR *.*\nRESTORE SCREEN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "RESTORE SCREEN, RestScreen(), SaveScreen()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "AChoice()",
				"ONELINER": "Allows selection of an element from an array",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "AChoice( <nTop>, <nLeft>, <nBottom>, <nRight>, <acMenuItems>, [<alSelableItems> | <lSelableItems>], [<cUserFunction> | <bUserBlock>], [<nInitialItem>], [<nWindowRow>] ) --> nPosition",
				"ARGUMENTS": "<nTop>           - topmost row used to display array (default 0)\n<nLeft>          - leftmost row used to display array (default 0)\n<nBottom>        - bottommost row used to display array (default MaxRow())\n<nRight>         - rightmost row used to display array (default MaxCol())\n<acMenuItems>    - the character array of items from which to select\n<alSelableItems> - an array of items, either logical or character,\nwhich is used to determine if a particular item may be selected.  If the type of a given item is character, it is macro evaluated, and the result is expected to be a logical.  A value of .T. means that the item may be selected, .F. that it may not. (See next argument: `lSelectableItems`)\n<lSelableItems>  - a logical value which is used to apply to all\nitems in `acMenuItems`.  If .T., all items may be selected; if .F., none may be selected. (See previous argument: `alSelectableItems`) Default .T.\n<cUserFunction>  - the name of a function to be called which may\naffect special processing of keystrokes.  It is specified without parentheses or parameters. When it is called, it will be supplied with the parameters: `nMode`, `nCurElement`, and `nRowPos`. Default NIL.\n<bUserBlock>     - a codeblock to be called which may\naffect special processing of keystrokes. It should be specified in the form `{| nMode, nCurElemenet, nRowPos | MyFunc( nMode, nCurElemenet, nRowPos ) }`. Default NIL.\n<nInitialItem>   - the number of the element to be highlighted as\nthe current item when the array is initially displayed.  1 origin.  Default 1.\n<nWindowRow>     - the number of the window row on which the initial\nitem is to be displayed. 0 origin.  Default 0.",
				"RETURNS": "<nPosition>  - the number of the item to be selected, or 0 if the selection was aborted.",
				"DESCRIPTION": "Allows selection of an element from an array. Please see standard CA-Cl*pper documentation for AChoice() for additional detail.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL aItems := { \"One\", \"Two\", \"Three\" }\nLOCAL nChoice := AChoice( 10, 10, 20, 20, aItems )\nIF nChoice == 0\n   ? \"You did not choose an item\"\nELSE\n   ? ;\n      \"You chose element\", hb_ntos( nChoice ), ;\n      \"which has a value of\", aItems[ nChoice ]\nENDIF"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "MENU TO"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Alert()",
				"ONELINER": "Display a dialog box with a message",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "Alert( <xMessage>, [<aOptions>], [<cColorNorm>], [<nDelay>] ) --> nChoice or NIL",
				"ARGUMENTS": "<xMessage> Message to display in the dialog box. <xMessage> can be of any Harbour type. If <xMessage> is an array of Character strings, each element would be displayed in a new line. If <xMessage> is a Character string, you could split the message to several lines by placing a semicolon `;` in the desired places.\n<aOptions> Array with available response. Each element should be Character string. If omitted, default is `{ \"Ok\" }`.\n<cColorNorm> Color string to paint the dialog box with. If omitted, default color is `\"W+/R\"`.\n<nDelay> Number of seconds to wait to user response before abort. Default value is 0, that wait forever.",
				"RETURNS": "Alert() return Numeric value representing option number chosen.\nIf <Esc> was pressed, return value is zero.\nThe return value is NIL if Alert() is called with no parameters, or if <xMessage> type is not Character and HB_CLP_STRICT option was used. If <nDelay> seconds had passed without user response, the return value is 1.",
				"DESCRIPTION": "Alert() display simple dialog box on screen and let the user select one option. The user can move the highlight bar using arrow keys or <Tab> key. To select an option the user can press <Enter>, <Space> or the first letter of the option.\nIf the program is executed with the `//NOALERT` command-line switch, nothing is displayed and it simply returns NIL. This switch could be overridden with __NoNoAlert().\nIf the GT system is linked in, Alert() display the message using the full screen I/O system, if not, the information is printed to the standard output using OutStd().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cMessage, aOptions, nChoice\n\n// harmless message\ncMessage := \"Major Database Corruption Detected!;\" + ;\n            \"(deadline in few hours);;\" + ;\n            \"where DO you want to go today?\"\n\n// define response option\naOptions := { \"Ok\", \"www.example.com\", \"Oops\" }\n\n// show message and let end user select panic level\nnChoice := Alert( cMessage, aOptions )\nDO CASE\nCASE nChoice == 0\n   // do nothing, blame it on some one else\nCASE nChoice == 1\n   ? \"Please call home and tell them you're going to be late\"\nCASE nChoice == 2\n   // make sure your resume is up to date\nCASE nChoice == 3\n   ? \"Oops mode is not working in this version\"\nENDCASE"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "This function is sensitive to HB_CLP_STRICT settings during the compilation of src/rtl/alert.prg\n<b>defined</b>: <xMessage> accept Character values only and return NIL if other types are passed.\n<b>undefined</b>: <xMessage> could be any type, and internally converted to Character string. If type is Array, multi-line message is displayed.\n<b>defined</b>: Only the first four valid <aOptions> are taken.\n<b>undefined</b>: <aOptions> could contain as many as needed options.\nIf HB_COMPAT_C53 was define during compilation of src/rtl/alert.prg the Left-Mouse button could be used to select an option.\nThe interpretation of the `//NOALERT` command-line switch is done only if HB_CLP_UNDOC was define during compilation of src/rtl/alert.prg\n<cColorNorm> is a Harbour extension, or at least undocumented in Clipper 5.2 NG.\n<nDelay> is a Harbour extension.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "@...PROMPT, MENU TO, OutStd(), __NoNoAlert()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Browse()",
				"ONELINER": "Browse a database file",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "Browse( [<nTop>, <nLeft>, <nBottom>, <nRight>] ) --> lOk",
				"ARGUMENTS": "<nTop> coordinate for top row display.\n<nLeft> coordinate for left column display.\n<nBottom> coordinate for bottom row display.\n<nRight> coordinate for right column display.",
				"RETURNS": "Browse() return .F. if there is no database open in this work area, else it return .T.",
				"DESCRIPTION": "Browse() is a general purpose database browser, without any thinking you can browse a file using the following keys:\n<table>\n Key              Meaning\n Left             Move one column to the left (previous field)\n Right            Move one column to the right (next field)\n Up               Move up one row (previous record)\n Down             Move down one row (next record)\n PgUp             Move to the previous screen\n PgDn             Move to the next screen\n Ctrl+PgUp        Move to the top of the file\n Ctrl+PgDn        Move to the end of the file\n Home             Move to the leftmost visible column\n End              Move to the rightmost visible column\n Ctrl+Left        Pan one column to the left\n Ctrl+Right       Pan one column to the right\n Ctrl+Home        Move to the leftmost column\n Ctrl+End         Move to the rightmost column\n Esc              Terminate Browse()\n</table>\nOn top of the screen you see a status line with the following indication:\n<table>\n Record ###/###   Current record number / Total number of records.\n <none>           There are no records, the file is empty.\n <new>            You are in append mode at the bottom of file.\n <Deleted>        Current record is deleted.\n <bof>            You are at the top of file.\n</table>\nYou should pass whole four valid coordinate, if less than four parameters are passed to Browse() the coordinate are default to: 1, 0, MaxRow(), MaxCol().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// this one shows you how to browse around\nUSE test\nBrowse()"
				},
				"STATUS": "Started",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "dbEdit()*, TBrowse class"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "dbEdit()*",
				"ONELINER": "Browse records in a table",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "dbEdit( [<nTop>], [<nLeft>], [<nBottom>], [<nRight>], [<acColumns>], [<xUserFunc>], [<xColumnSayPictures>], [<xColumnHeaders>], [<xHeadingSeparators>], [<xColumnSeparators>], [<xFootingSeparators>], [<xColumnFootings>] ) --> lOk",
				"ARGUMENTS": "<nTop> coordinate for top row display. <nTop> could range from 0 to MaxRow(), default is 0.\n<nLeft> coordinate for left column display. <nLeft> could range from 0 to MaxCol(), default is 0.\n<nBottom> coordinate for bottom row display. <nBottom> could range from 0 to MaxRow(), default is MaxRow().\n<nRight> coordinate for right column display. <nRight> could range from 0 to MaxCol(), default is MaxCol().\n<acColumns> is an array of character expressions that contain database fields names or expressions to display in each column. If not specified, the default is to display all fields from the database in the current work area.\n<xUserFunc> is a name of a user defined function or a code block that would be called every time unrecognized key is been pressed or when there are no keys waiting to be processed and dbEdit() goes into idle mode. If <xUserFunc> is a character string, it must contain root name of a valid user define function without parentheses. Both the user define function or the code block should accept two parameters: <nMode>, <nCurrentColumn>. Both should return a numeric value that correspond to one of the expected return codes (see table below for a list of <nMode> and return codes).\n<xColumnSayPictures> is an optional picture. If <xColumnSayPictures> is a character string, all columns would used this value as a picture string. If <xColumnSayPictures> is an array, each element should be a character string that correspond to a picture string for the column with the same index. Look at the help for `@...SAY` to get more information about picture values.\n<xColumnHeaders> contain the header titles for each column, if this is a character string, all columns would have that same header, if this is an array, each element is a character string that contain the header title for one column. Header may be split to more than one line by placing semicolon `;` in places where you want to break line. If omitted, the default value for each column header is taken from <acColumns> or field name if <acColumns> was not specified.\n<xHeadingSeparators> is an array that contain characters that draw the lines separating the headers and the fields data. Instead of an array you can use a character string that would be used to display the same line for all fields. Default value is a double line.\n<xColumnSeparators> is an array that contain characters that draw the lines separating displayed columns. Instead of an array you can use a character string that would be used to display the same line for all fields. Default value is a single line.\n<xFootingSeparators> is an array that contain characters that draw the lines separating the fields data area and the footing area. Instead of an array you can use a character string that would be used to display the same line for all footers. Default is to have to no footing separators.\n<xColumnFootings> contain the footing to be displayed at the bottom of each column, if this is a character string, all columns would have that same footer, if this is an array, each element is a character string that contain the footer for one column. Footer may be split to more than one line by placing semicolon `;` in places where you want to break line. If omitted, no footer are displayed.",
				"RETURNS": "dbEdit() return .F. if there is no database in use or if the number of columns to display is zero, else dbEdit() return .T.",
				"DESCRIPTION": "dbEdit() display and edit records from one or more work areas in a grid on screen. Each column is defined by element from <acColumns> and is the equivalent of one field. Each row is equivalent of one database record.\nFollowing are active keys that handled by dbEdit():\n<table>\n Key              Meaning\n Left             Move one column to the left (previous field)\n Right            Move one column to the right (next field)\n Up               Move up one row (previous record)\n Down             Move down one row (next record)\n PgUp             Move to the previous screen\n PgDn             Move to the next screen\n Ctrl+PgUp        Move to the top of the file\n Ctrl+PgDn        Move to the end of the file\n Home             Move to the leftmost visible column\n End              Move to the rightmost visible column\n Ctrl+Left        Pan one column to the left\n Ctrl+Right       Pan one column to the right\n Ctrl+Home        Move to the leftmost column\n Ctrl+End         Move to the rightmost column\n</table>\nWhen <xUserFunc> is omitted, two more keys are active:\n<table>\n Key              Meaning\n Esc              Terminate Browse()\n Enter            Terminate Browse()\n</table>\nWhen dbEdit() execute <xUserFunc> it pass the following arguments: <nMode> and the index of current record in <acColumns>. If <acColumns> is omitted, the index number is the FieldName() number of the open database structure.\ndbEdit() <nMode> could be one of the following:\n<table>\n dbedit.ch      Meaning\n DE_IDLE        dbEdit() is idle, all movement keys have been handled.\n DE_HITTOP      Attempt to cursor past top of file.\n DE_HITBOTTOM   Attempt to cursor past bottom of file.\n DE_EMPTY       No records in work area, database is empty.\n DE_EXCEPT      Key exception.\n</table>\nThe user define function or code block must return a value that tell dbEdit() what to do next.\nUser function return codes:\n<table>\n dbedit.ch    Meaning\n DE_ABORT     Abort dbEdit().\n DE_CONT      Continue dbEdit() as is.\n DE_REFRESH   Force reread/redisplay of all data rows.\n</table>\nThe user function is called once in each of the following cases: - The database is empty. - The user try to move past top of file or past bottom file. - Key exception, the uses had pressed a key that is not handled by dbEdit(). - The keyboard buffer is empty or a screen refresh had just occurred dbEdit() is a compatibility function, it is superseded by the TBrowse class and there for not recommended for new applications.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Browse a file using default values\nUSE test\ndbEdit()"
				},
				"STATUS": "Started",
				"COMPLIANCE": "<xUserFunc> can take a code block value, this is a Harbour extension.\nCA-Cl*pper will throw an error if there's no database open, Harbour would return .F.\nCA-Cl*pper is buggy and will throw an error if the number of columns is zero, Harbour would return .F.\nThe CA-Cl*pper 5.2 NG state that the return value is NIL, this is wrong and should be read logical.\nThere is an undocumented result code (3) from the user defined function in CA-Cl*pper (both 87 and 5.x). This is an Append Mode which: \"split the screen to allow data to be appended in windowed area\". This mode is not supported by Harbour.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header files are dbedit.ch, inkey.ch\nLibrary is core",
				"TAGS": "API, User interface",
				"SEEALSO": "@...SAY, Browse(), TBrowse class, Transform()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_keyPut()",
				"ONELINER": "Put an inkey code to the keyboard buffer.",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "hb_keyPut( <nInkeyCode> )",
				"ARGUMENTS": "<nInkeyCode> is the inkey code, which should be inserted into the keyboard buffer.",
				"RETURNS": "There is no return value.",
				"DESCRIPTION": "Inserts an inkey code to the string buffer. The buffer is *not* cleared in this operation. This function allows to insert such inkey codes which are not in the range of 0 to 255. To insert more than one code, call the function repeatedly. The zero code cannot be inserted.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\n// Stuff an <Alt+PgDn> key into the keyboard buffer\nhb_keyPut( K_ALT_PGDN ); ? Inkey()  // --> 417\nhb_keyPut( K_F11 ); ? Inkey()  // --> -40"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "KEYBOARD, CLEAR TYPEAHEAD, Inkey()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Inkey()",
				"ONELINER": "Extracts the next key code from the Harbour keyboard buffer.",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "Inkey( [<nTimeout>] [, <nEvents>] ) --> nKey",
				"ARGUMENTS": "<nTimeout> is an optional timeout value in seconds, with a granularity of 1/10th of a second. If omitted, Inkey() returns immediately. If set to 0, Inkey() waits until an input event occurs. If set to any other value, Inkey() will return either when an input event occurs or when the timeout period has elapsed. If only this parameter is specified and it is not numeric, it will be treated as if it were 0. But if both parameters are specified and this parameter is not numeric, it will be treated as if it were not present.\n<nEvents> is an optional mask of input events that are to be enabled. If omitted, defaults to `hb_set.HB_SET_EVENTMASK`. Valid input masks are in inkey.ch and are explained below. It is recommended that the mask names be used rather than their numeric values, in case the numeric values change in future releases of Harbour. To allow more than one type of input event, simply add the various mask names together.\n<table>\n inkey.ch            Meaning\n INKEY_MOVE          Mouse motion events are allowed\n INKEY_LDOWN         The mouse left click down event is allowed\n INKEY_LUP           The mouse left click up event is allowed\n INKEY_RDOWN         The mouse right click down event is allowed\n INKEY_RUP           The mouse right click up event is allowed\n INKEY_KEYBOARD      All keyboard events are allowed\n INKEY_ALL           All mouse and keyboard events are allowed\n HB_INKEY_EXTENDED   Extended keyboard codes are used.\n</table>\nIf the parameter is not numeric, it will be treated as if it were set to `hb_set.HB_SET_EVENTMASK`.",
				"RETURNS": "0 in case of timeout with no input event, otherwise returns a value in the range -47 to 386 for keyboard events or the range 1001 to 1007 for mouse events. Mouse events and non-printable keyboard events are represented by the `K_<event>` values listed in inkey.ch. Keyboard event return codes in the range 32 through 127 are equivalent to the printable ASCII character set. Keyboard event return codes in the range 128 through 255 are assumed to be printable, but results may vary based on hardware and nationality. If HB_INKEY_EXTENDED mode is used, then the return value for keyboard events ranges from 1 through 767 and 1077 through 1491, although not all codes are used.\nExtended key codes consist of the PC keyboard scan code and one or more offset values. If no keyboard modifier was used, then HB_INKEY_NONE is added. The <Alt> key adds HB_INKEY_ALT, the <Ctrl> key adds HB_INKEY_CTRL, the <Shift> key adds HB_INKEY_SHIFT, and enhanced keys (<KeyPad+/> and <CursorPad> keys) add HB_INKEY_ENHANCED. For example, <F1> is scan code 59, so if you just press <F1>, you get key code 315, but <Alt+F1> gives 443, <Ctrl+F1> gives 571, and <Shift+F1> gives 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+Ctrl> combinations, etc.)\nNote: The extended key code set is larger than the normal key code set. As a result, if you switch between the normal and extended modes, you need to be aware that some codes get translated into a zero in normal mode (because there is no corresponding code in normal mode) and that these codes get removed from the keyboard input buffer in normal mode and you won't be able to go back and fetch them later in extended mode.",
				"DESCRIPTION": "Inkey() can be used to detect input events, such as key-press, mouse movement, or mouse key clicks (up and/or down).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\n// Wait for the user to press the <Esc> key\n? \"Please press the <Esc> key.\"\nDO WHILE Inkey( 0.1 ) != K_ESC\nENDDO\n\nKEYBOARD \"AB\"; ? Inkey(), Inkey()  // -->   65   66"
				},
				"STATUS": "Started",
				"COMPLIANCE": "Inkey() is compliant with the CA-Cl*pper 5.3 Inkey() function with one exception: The Harbour Inkey() function will raise an argument error if the first parameter is less than or equal to 0 and the second parameter (or the default mask) is not valid, because otherwise Inkey() would never return, because it was, in effect, asked to wait forever for no events (Note: In CA-Cl*pper, this also blocks `SET KEY` events).",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core\nHeader is inkey.ch",
				"TAGS": "API, User interface"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "LastKey()",
				"ONELINER": "Get the last key extracted from the keyboard buffer.",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "LastKey( [<nInputMask>] ) --> nKey",
				"ARGUMENTS": "<nInputMask> is an optional integer value composed of one or more INKEY_ or HB_INKEY_ constants. The sole purpose of this argument is to allow switching between using HB_INKEY_EXTENDED key codes and using the normal CA-Cl*pper-compatible key codes",
				"RETURNS": "<nKey>  The last key extracted from the keyboard buffer.",
				"DESCRIPTION": "Returns the value of the last key extracted from the Harbour keyboard buffer",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\n// Continue looping unless the <Esc> key was pressed in MainFunc()\nDO WHILE .T.\n   MainFunc()\n   IF LastKey() == K_ESC\n      EXIT\n   ENDIF\nENDDO\n\nKEYBOARD \"AB\"; ? Inkey(), LastKey()  // -->   65   65\n\nSTATIC PROCEDURE MainFunc()\n   Inkey( 0 )\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "LastKey() is compliant with CA-Cl*pper 5.3, but has been extended for Harbour.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "Inkey(), LastKey()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MCol()",
				"ONELINER": "Returns the mouse cursor column position.",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "MCol() --> nMouseColumn",
				"ARGUMENTS": "None",
				"RETURNS": "<nMouseColumn> The mouse cursor column position.",
				"DESCRIPTION": "This function returns the column position of the mouse cursor. On graphical systems the value represents pixels. On character-based systems the value represents character columns as in CA-Cl*pper.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "IF MCol() < 1\n   ? \"Mouse is on left edge!\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "MCol() is compliant with CA-Cl*pper 5.3, but has been extended to work on graphical systems as well as character-based systems.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "MRow()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "MENU TO",
				"ONELINER": "Invoked a menu defined by set of `@...PROMPT`",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "MENU TO <cVariable>",
				"ARGUMENTS": "<cVariable> is a character string that contain the name of the variable to hold the menu choices, if this variable does not exist a PRIVATE variable with the name <cVariable> would be created to hold the result.",
				"DESCRIPTION": "`MENU TO` invoked the menu define by previous __AtPrompt() call and display a highlight bar that the user can move to select an option from the menu. If <cVariable> does not exist or not visible, a PRIVATE variable named <cVariable> is created and hold the current menu selection. If there is a variable named <cVariable>, its value is used to select the first highlighted item.\nMenu prompts and messages are displayed in current Standard color, highlighted bar is displayed using current Enhanced color.\nPressing the arrow keys move the highlighted bar. When a menu item is highlighted the message associated with it is displayed on the line specified with `SET MESSAGE`. If `SET WRAP` is ON and the user press <Up> arrow while on the first selection the last menu item is highlighted, if the user press <Down> arrow while on the last item, the first item is highlighted.\nFollowing are active keys that handled by `MENU TO`:\n<table>\n key            Meaning\n Up             Move to previous item\n Down           Move to next item\n Left           Move to previous item\n Right          Move to next item\n Home           Move to the first item\n End            Move to the last item\n PgUp           Select menu item, return position\n PgDn           Select menu item, return position\n Enter          Select menu item, return position\n Esc            Abort selection, return 0\n First letter   Select next menu with the same first letter,\n                return this item position.\n</table>\nupon exit the cursor is placed at MaxRow() - 1, 0 `MENU TO` can be nested without loosing the previous prompts.\n`MENU TO` command is preprocessed into __MenuTo() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nChoice\n// display menu item on each screen corner and let user select one\nCLS\nSET MESSAGE TO MaxRow() / 2 CENTER\nSET WRAP ON\n@ 0           , 0             PROMPT \"1. Upper left\"   MESSAGE \" One \"\n@ 0           , MaxCol() - 16 PROMPT \"2. Upper right\"  MESSAGE \" Two \"\n@ MaxRow() - 1, MaxCol() - 16 PROMPT \"3. Bottom right\" MESSAGE \"Three\"\n@ MaxRow() - 1, 0             PROMPT \"4. Bottom left\"  MESSAGE \"Four \"\nMENU TO nChoice\nSetPos( MaxRow() / 2, MaxCol() / 2 - 10 )\nIF nChoice == 0\n   ?? \"<Esc> was pressed\"\nELSE\n   ?? \"Selected option is\", nChoice\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "API, User interface",
				"SEEALSO": "@...PROMPT, AChoice(), SET MESSAGE, SET INTENSITY, SET WRAP, __AtPrompt()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MRow()",
				"ONELINER": "Returns the mouse cursor row position.",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "MRow() --> nMouseRow",
				"ARGUMENTS": "None",
				"RETURNS": "<nMouseRow> The mouse cursor row position.",
				"DESCRIPTION": "This function returns the current mouse row cursor position. On graphical systems the value represents pixel rows. On character-based systems the value represents character rows as in CA-Cl*pper.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "IF MRow() < 1\n   ? \"Mouse is on top row!\"\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "MRow() is compliant with CA-Cl*pper 5.3, but has been extended to work on graphical systems as well as character-based systems.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "MCol()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "NextKey()",
				"ONELINER": "Get the next key code in the buffer without extracting it.",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "NextKey( [<nInputMask>] ) --> nKey",
				"ARGUMENTS": "<nInputMask> is an optional integer value composed of one or more INKEY_ or HB_INKEY_ constants. The sole purpose of this argument is to allow switching between using HB_INKEY_EXTENDED key codes and using the normal CA-Cl*pper-compatible key codes",
				"RETURNS": "<nKey>  The value of the next key in the Harbour keyboard buffer.",
				"DESCRIPTION": "Returns the value of the next key in the Harbour keyboard buffer without extracting it.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\n// Use NextKey() with Inkey() to change display characters, or by\n// itself to exit the loop, so that the caller can detect the <Esc>.\nLOCAL nKey, cChar := \"+\"\nDO WHILE .T.\n   ?? cChar\n   nKey := NextKey()\n   DO CASE\n   CASE nKey == K_ESC\n      EXIT\n   CASE nKey != 0\n      cChar := hb_keyChar( nKey )\n   ENDCASE\nENDDO\n\nKEYBOARD \"AB\"; ? NextKey(), NextKey()  // -->   65   65"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "NextKey() is compliant with CA-Cl*pper 5.3, but has been extended for Harbour.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "Inkey(), LastKey()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "OutErr()",
				"ONELINER": "Write a list of values to the standard error device",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "OutErr( <xExp,...> )",
				"ARGUMENTS": "<xExp,...> is a list of expressions to display. Expressions are any mixture of Harbour data types.",
				"DESCRIPTION": "OutErr() write one or more values into the standard error device. Character and Memo values are printed as is, Dates are printed according to the `SET DATE FORMAT`, Numeric values are converted to strings, Logical values are printed as .T. or .F., NIL are printed as NIL, values of any other kind are printed as empty string. There is one space separating each two values. Note that Numeric value can take varying length when converted into string depending on its source (see Str() for detail).\nThere is an undocumented CA-Cl*pper command-line switch `//STDERR` which can set the file handle to write output from OutErr(). If not specified the default STDERR is used, `//STDERR` or `//STDERR:0` set OutErr() to output to the same file handle as OutStd(), `//STDERR:n` set output to file handle n. Like other undocumented features this switch is available only if src/rtl/console.c was compiled with the HB_CLP_UNDOC flag.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// write error log information\nOutErr( hb_DateTime(), \"Core meltdown detected\" )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "?|??, DevOut(), DevOutPict(), DispOut(), DispOutAt(), OutStd(), QOut(), QQOut(), Str()"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "OutStd()",
				"ONELINER": "Write a list of values to the standard output device",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "OutStd( <xExp,...> )",
				"ARGUMENTS": "<xExp,...> is a list of expressions to display. Expressions are any mixture of Harbour data types.",
				"DESCRIPTION": "OutStd() write one or more values into the standard output device. Character and Memo values are printed as is, Dates are printed according to the `SET DATE FORMAT`, Numeric values are converted to strings, Logical values are printed as .T. or .F., NIL are printed as NIL, values of any other kind are printed as empty string. There is one space separating each two values. Note that Numeric value can take varying length when converted into string depending on its source (see Str() for detail).\nOutStd() is similar to QQOut() with the different that QQOut() send its output to the Harbour console stream, which can or cannot be redirected according with the screen driver, and OutStd() send its output to the standard output device (STDOUT) and can be redirected.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "OutStd( \"Hello\" )           // --> Hello\n\nOutStd( 1, .T., NIL, \"A\" )\nOutStd( \"B\" )               // -->          1 .T. NIL AB"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "?|??, DevOut(), DevOutPict(), DispOut(), DispOutAt(), OutErr(), QOut(), QQOut(), Str()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ReadKey()*",
				"ONELINER": "Determine which key terminated a READ.",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "ReadKey() --> nKeyCode",
				"ARGUMENTS": "None.",
				"RETURNS": "ReadKey() returns a numeric code representing the key that caused READ to terminate.",
				"DESCRIPTION": "ReadKey() is used after a READ was terminated to determine the exit key pressed. If the GET buffer was updated during READ, 256 is added to the return code.\n<table-doubleheader>\n Exit               Return code     Return code\n Key                (not updated)   (updated)\n Up                    4            260\n Down                  5            261\n Page-Up               6            262\n Page-Down             7            263\n Ctrl Page-Up         34            290\n Ctrl Page-Down       35            291\n Esc                  12            268\n Ctrl End             14            270\n Enter                15            271\n Key >= 32            15            271\n otherwise             0            0\n</table>\nReadKey() is a compatibility function so try not to use it. ReadKey() is superseded by LastKey() which returns the Inkey() code for that key.  Updated() could be used to find if the GET buffer was changed during the READ.",
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "@...GET, Inkey(), LastKey(), READ, ReadExit(), Updated()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ReadVar()",
				"ONELINER": "Return variable name of current GET or MENU",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "ReadVar( [<cVarName>] ) --> cOldVarName",
				"ARGUMENTS": "<cVarName> is a new variable name to set.",
				"RETURNS": "ReadVar() return the old variable name. If no variable previously was set, ReadVar() return \"\".",
				"DESCRIPTION": "ReadVar() is set inside a READ or `MENU TO` command to hold the uppercase name of the GET / `MENU TO` variable, and re-set back to old value when those commands finished. You should not normally set a variable name but rather use it to retrieve the name of a GET variable when executing a VALID or WHEN clause, or during `SET KEY` execution and you are inside a READ or `MENU TO`.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\nLOCAL What_Is_Bug\n// display a menu, press <F1> to view the MENU TO variable name\nCLS\n@ 1, 10 PROMPT \"blood sucking insect that infect beds   \"\n@ 2, 10 PROMPT \"germ; virus infection                   \"\n@ 3, 10 PROMPT \"defect; snag; (source of) malfunctioning\"\n@ 4, 10 PROMPT \"small hidden microphone                 \"\n@ 6, 10 SAY \"(Press <F1> for a hint)\"\nSetKey( K_F1, {|| ShowVar() } )\nMENU TO What_Is_Bug\n\nSTATIC PROCEDURE ShowVar()\n   Alert( ReadVar() )  // --> \"WHAT_IS_BUG\"\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "ReadVar() works exactly like CA-Cl*pper's ReadKey().\nNote however, that the <cVarName> parameter is not documented and used internally by CA-Cl*pper.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "@...GET, @...PROMPT, MENU TO, READ, SetKey(), __AtPrompt(), __MenuTo()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "TBrowseDB()",
				"ONELINER": "Create a new TBrowse object to be used with database file",
				"CATEGORY": "API",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "TBrowseDB( [<nTop>], [<nLeft>], [<nBottom>], [<nRight>] ) --> oBrowse",
				"ARGUMENTS": "<nTop> coordinate for top row display.\n<nLeft> coordinate for left column display.\n<nBottom> coordinate for bottom row display.\n<nRight> coordinate for right column display.",
				"RETURNS": "TBrowseDB() return new TBrowse object with the specified coordinate and a default :SkipBlock, :GoTopBlock and :GoBottomBlock to browse a database file.",
				"DESCRIPTION": "TBrowseDB() is a quick way to create a TBrowse() object along with the minimal support needed to browse a database. Note that the returned TBrowse() object contain no TBColumn() objects and you need to add column for each field by your self.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// For a good example, look at the source code for Browse() function\n// at src/rtl/browse.prg"
				},
				"STATUS": "Started",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, User interface",
				"SEEALSO": "Browse(), TBColumn class, TBrowse class, TBrowseNew()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvClear()",
				"ONELINER": "This function releases all PRIVATE and PUBLIC variables",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvClear()",
				"ARGUMENTS": "None",
				"RETURNS": "Nothing",
				"DESCRIPTION": "This function releases all PRIVATE and PUBLIC variables. It is used to implement `CLEAR MEMORY` statement. The memory occupied by all visible variables are released - any attempt to access the variable will result in a runtime error. You have to reuse PRIVATE or PUBLIC statement to create again the variable that was cleared by this function.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "__mvPublic()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvExist()",
				"ONELINER": "Determine if a given name is a PUBLIC or PRIVATE memory variable",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvExist( <cVarName> ) --> lVariableExist",
				"ARGUMENTS": "<cVarName> - string that specifies the name of variable to check",
				"RETURNS": "__mvExist() return TRUE (.T.) if a MEMVAR named <cVarName> exist.",
				"DESCRIPTION": "This function determine if a PUBLIC or PRIVATE variable with the name <cVarName> exist or not.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL   TheLocal\nSTATIC  TheStatic\nPUBLIC  ThePublic\nPRIVATE ThePrivate\n? __mvExist( \"NotExist\"   )  // --> .F.\n? __mvExist( \"TheLocal\"   )  // --> .F.\n? __mvExist( \"TheStatic\"  )  // --> .F.\n? __mvExist( \"ThePublic\"  )  // --> .T.\n? __mvExist( \"ThePrivate\" )  // --> .T."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "MEMVAR, PRIVATE, PUBLIC"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvGet()",
				"ONELINER": "This function returns value of memory variable",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvGet( <cVarName> ) --> xVar",
				"ARGUMENTS": "<cVarName> - string that specifies the name of variable",
				"RETURNS": "<xVar> The value of variable",
				"DESCRIPTION": "This function returns the value of PRIVATE or PUBLIC variable if this variable exists otherwise it generates a runtime error. The variable is specified by its name passed as the function parameter.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? ValType( MemVarBlock( \"myvar\" ) )\nSTATIC FUNCTION MemVarBlock( cMemvar )\n   RETURN {| x | ;\n      iif( PCount() == 0, ;\n         __mvGet( cMemvar ), ;\n         __mvPut( cMemvar, x ) ) }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "__mvPut()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvPrivate()",
				"ONELINER": "This function creates a PRIVATE variable",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvPrivate( <variable_name> )",
				"ARGUMENTS": "<variable_name> = either a string that contains the variable's name or an one-dimensional array of strings with variable names No skeleton are allowed here.",
				"RETURNS": "Nothing",
				"DESCRIPTION": "This function can be called either by the Harbour compiler or by user. The compiler always passes the item of HB_IT_SYMBOL type that stores the name of variable. If a variable with the same name exists already then the value of old variable is hidden until the new variable is  released. The new variable is always initialized to NIL value.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvPublic()",
				"ONELINER": "This function creates a PUBLIC variable",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvPublic( <variable_name> )",
				"ARGUMENTS": "<variable_name> = either a string that contains the variable's name or an one-dimensional array of strings with variable names No skeleton are allowed here.",
				"RETURNS": "Nothing",
				"DESCRIPTION": "This function can be called either by the Harbour compiler or by user. The compiler always passes the item of HB_IT_SYMBOL type that stores the name of variable. If a variable with the same name exists already then the new variable is not created - the previous value remains unchanged. If it is first variable with this name then the  variable is initialized with .T. value.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvPut()",
				"ONELINER": "This function set the value of memory variable",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvPut( <cVarName> [, <xValue>] ) --> xValue",
				"ARGUMENTS": "<cVarName> - string that specifies the name of variable <xValue>   - a value of any type that will be set - if it is not specified then NIL is assumed",
				"RETURNS": "<xValue> A value assigned to the given variable.",
				"DESCRIPTION": "This function sets the value of PRIVATE or PUBLIC variable if this variable exists otherwise it generates a runtime error. The variable is specified by its name passed as the function parameter. If a value is not specified then the NIL is assumed",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? ValType( MemVarBlock( \"myvar\" ) )\nSTATIC FUNCTION MemVarBlock( cMemvar )\n   RETURN {| x | ;\n      iif( PCount() == 0, ;\n         __mvGet( cMemvar ), ;\n         __mvPut( cMemvar, x ) ) }"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "__mvPut()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvRelease()",
				"ONELINER": "This function releases PRIVATE variables",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvRelease( <skeleton>, <include_exclude_flag> )",
				"ARGUMENTS": "<skeleton> = string that contains the wildcard mask for variables' names that will be released. Supported wildcards: '*' and '?' <include_exclude_flag> = logical value that specifies if variables that match passed skeleton should be either included in deletion (if .T.) or excluded from deletion (if .F.)",
				"RETURNS": "Nothing",
				"DESCRIPTION": "This function releases values stored in memory variables. It shouldn't be called directly, it should be placed into `RELEASE ALL` command. If the released variable is a PRIVATE variable then previously hidden variable with the same name becomes visible after exit from the procedure where released variable was created. If you access the released variable in the same function/procedure where it was created the the NIL value is returned. You can however assign a new value to released variable without any side effects. PUBLIC variables are not changed by this function.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvScope()",
				"ONELINER": "If variable exists then returns its scope.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvScope( <cVarName> )",
				"ARGUMENTS": "<cVarName> = a string with a variable name to check",
				"RETURNS": "The symbolic values are defined in hbmemvar.ch\n<table-noheader>\n HB_MV_NOT_FOUND      variable is not declared (not found in symbol table)\n HB_MV_UNKNOWN        if variable doesn't exist (but found in symbol table)\n HB_MV_ERROR          if information cannot be obtained (memory error or argument error)\n HB_MV_PUBLIC         for public variables\n HB_MV_PRIVATE_GLOBAL for private variables declared outside of current function/procedure\n HB_MV_PRIVATE_LOCAL  for private variables declared in current function/procedure\n</table>",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbmemvar.ch\"\n\nMEMVAR pPublic\nMEMVAR mPrivateGlobal\nMEMVAR mPrivateLocal\n\nPROCEDURE Main()\n\n   PUBLIC pPublic\n   PRIVATE mPrivateGlobal\n\n   CallProc()\n   ? __mvScope( \"mPrivateLocal\" )   // --> HB_MV_UNKNOWN\n\n   RETURN\n\nSTATIC PROCEDURE CallProc()\n\n   PRIVATE mPrivateLocal\n\n   ? __mvScope( \"pPublic\" )         // --> HB_MV_PUBLIC\n   ? __mvScope( \"mPrivateGlobal\" )  // --> HB_MV_PRIVATE_GLOBAL\n   ? __mvScope( \"mPrivateLocal\" )   // --> HB_MV_PRIVATE_LOCAL\n   ? __mvScope( \"mFindMe\" )         // --> HB_MV_NOT_FOUND\n\n   IF __mvScope( \"pPublic\" ) > HB_MV_ERROR\n      ? \"Variable exists\"\n   ELSE\n      ? \"Variable not created yet\"\n   ENDIF\n\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "__mvXRelease()",
				"ONELINER": "This function releases value stored in PRIVATE or PUBLIC variable",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "__mvXRelease( <variable_name> )",
				"ARGUMENTS": "<variable_name> = either a string that contains the variable's name or an one-dimensional array of strings with variable names No skeleton are allowed here.",
				"RETURNS": "Nothing",
				"DESCRIPTION": "This function releases values stored in memory variable. It shouldn't be called directly, rather it should be placed into RELEASE command. If the released variable is a PRIVATE variable then previously hidden variable with the same name becomes visible after exit from the procedure where released variable was created. If you access the released variable in the same function/procedure where it was created the the NIL value is returned. You can however assign a new value to released variable without any side effects.\nIt releases variable even if this variable was created in different procedure.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "MEMVAR mPrivate\n\nPROCEDURE Main()\n\n   PRIVATE mPrivate := \"PRIVATE from Main()\"\n\n   ? mPrivate     // --> PRIVATE from Main()\n   Test()\n   ? mPrivate     // --> PRIVATE from Main()\n\n   RETURN\n\nSTATIC PROCEDURE Test()\n\n   PRIVATE mPrivate := \"PRIVATE from Test()\"\n\n   ? mPrivate           // --> PRIVATE from Test()\n   RELEASE mPrivate\n   ? mPrivate           // --> NIL\n   mPrivate := \"Again in Main()\"\n\n   RETURN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Empty()",
				"ONELINER": "Checks if the passed argument is empty.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "Empty( <xExp> ) --> lIsEmpty",
				"ARGUMENTS": "<xExp> is any valid expression.",
				"RETURNS": "A logical value. It is true (.T.) if the passed argument is empty otherwise it is false (.F.).",
				"DESCRIPTION": "This function checks if an expression has empty value and returns a logical indicating whether it the expression is empty or not.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? Empty( \"I'm not empty\" )  // --> .F.\n? Empty( NIL )              // --> .T.\n? Empty( 0 )                // --> .T.\n? Empty( .F. )              // --> .T.\n? Empty( \"\" )               // --> .T.\n? Empty( \"  \" )             // --> .T.\n? Empty( 1 )                // --> .F.\n? Empty( .T. )              // --> .F.\n? Empty( \"smile\" )          // --> .F.\n? Empty( Date() )           // --> .F."
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "Len()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "hb_PIsByRef()",
				"ONELINER": "Determine if a parameter is passed by reference.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "hb_PIsByRef( nParam ) --> lParamIsByRef",
				"ARGUMENTS": "<nParam> is the parameter number to test.",
				"RETURNS": "<lVarIsByRef> a logical value indicating if the parameter is passed by reference to actual function or procedure.",
				"DESCRIPTION": "This function return a logical value indicating if the parameter is passed by reference to actual function or procedure.\nThis function is based on the form that Harbour manages to the variables for reference. When a variable is passed by reference, what receives the function or procedure is, a pointer to the previous variable, be this the container variable of the data or a pointer to another variable. The function observes if the variable passed points to a common variable or to a variable passed by reference.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "PROCEDURE Main()\n\n   LOCAL cVar := \"Test local\"\n\n   MEMVAR m_nVar\n   PRIVATE m_nVar := 0\n\n   Test( @cVar, @m_nVar, cVar, m_nVar )\n\n   RETURN\n\nSTATIC PROCEDURE Test( Arg1, Arg2, Arg3, Arg4 )\n   ? hb_PIsByRef( 1 )  // --> .T.\n   ? hb_PIsByRef( 2 )  // --> .T.\n   ? hb_PIsByRef( 3 )  // --> .F.\n   ? hb_PIsByRef( 4 )  // --> .F.\n   RETURN"
				},
				"STATUS": "Started",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "ValType()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Len()",
				"ONELINER": "Returns size of a string or size of an array.",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "Len( <cString> | <aArray> ) --> nLength",
				"ARGUMENTS": "<acString> is a character string or the array to check.",
				"RETURNS": "The length of the string or the number of elements that contains an array.",
				"DESCRIPTION": "This function returns the string length or the size of an array or the size of a hash table. If it is used with a multidimensional array it returns the size of the first dimension.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cName\n\n? Len( \"Harbour\" )         // --> 7\n? Len( { \"One\", \"Two\" } )  // --> 2\n\ncName := \"\"\nACCEPT \"Enter your name: \" TO cName\n? Len( cName )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "Empty(), RTrim(), LTrim(), AAdd(), ASize()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "MemVarBlock()",
				"ONELINER": "Returns a codeblock that sets/gets a value of memvar variable",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "MemVarBlock( <cMemvarName> ) --> bBlock",
				"ARGUMENTS": "<cMemvarName> - a string that contains the name of variable",
				"RETURNS": "<bBlock> a codeblock that sets/get the value of variable",
				"DESCRIPTION": "This function returns a codeblock that sets/gets the value of PRIVATE or PUBLIC variable. When this codeblock is evaluated without any parameters passed then it returns the current value of given variable. If the second parameter is passed for the codeblock evaluation then its value is used to set the new value of given variable - the passed value is also returned as a value of the codeblock evaluation.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cbSetGet\nPUBLIC xPublic\n\ncbSetGet := MemVarBlock( \"xPublic\" )\nEval( cbSetGet, \"new value\" )\n? \"Value of xPublic variable\", Eval( cbSetGet )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "__mvGet(), __mvPut()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "Type()",
				"ONELINER": "Retrieves the type of an expression",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "Type( <cExp> ) --> cRetType",
				"ARGUMENTS": "<cExp> must be a character expression.",
				"RETURNS": "<cRetType> a string indicating the type of the passed expression.\n<table>\n <cRetType>   Meaning\n \"A\"          Array\n \"B\"          Block\n \"C\"          Character (string)\n \"D\"          Date\n \"L\"          Logical\n \"M\"          Memo\n \"N\"          Numeric\n \"O\"          Object\n \"P\"          Pointer\n \"S\"          Symbol\n \"U\"          NIL, local or static variable, or not linked-in function\n \"UE\"         syntax error in the expression or invalid arguments\n \"UI\"         function with non-reserved name was requested\n</table>",
				"DESCRIPTION": "This function returns a string which represents the data type of the argument. The argument can be any valid Harbour expression. If there is a syntax error in passed expression then \"UE\" is returned. If there is a call for any non-reserved Harbour function then \"UI\" is returned (in other words there is no call for passed UDF function during a data type determination - this is CA-Cl*pper compatible behavior). Additionally if requested user defined function is not linked into executable then \"U\" is returned.\nThe data type of expression is checked by invoking a macro compiler and by evaluation of generated code (if there is no syntax errors). This causes that Type() cannot determine a type of local or static variables - only symbols visible at runtime can be checked.\nNotice the subtle difference between Type() and ValType() functions. ValType() function doesn't call a macro compiler - it simply checks the type of passed argument of any type. Type() requires a string argument with a valid Harbour expression - the data type of this expression is returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL c, cFilter\nMEMVAR a, b\n\n? Type( \"{ 1, 2 }\" )                                 // --> \"A\"\n? Type( 'iif( .T., SubStr( \"TYPE\", 2, 1 ), .F. )' )  // --> \"C\"\n? Type( 'At( \"OK\", MyUDF() ) > 0' )                  // --> \"UI\"\n? Type( \"{ 1, 2 }[ 5 ]\" )                            // --> \"UE\"\n\nPRIVATE a := \"A\", b := \"B\"\n? Type( \"a + b + c\" )     // --> \"U\" ('c' variable is a local one)\n\ncFilter := Space( 60 )\nACCEPT \"Enter filter expression:\" TO cFilter\nIF Type( cFilter ) $ \"CDLMN\"\n   // this is a valid expression\n   SET FILTER TO &cFilter\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "- Incompatibility with CA-Cl*pper:\nIn the following code:\n```\nPRIVATE lCond := 0\n? Type( \"iof( lCond, 'true', MyUDF() )\" )\n```\nCA-Cl*pper will print \"UE\" - in Harbour the output will be \"UI\"\n- If \"UI\" is returned then the syntax of the expression is\ncorrect. However invalid arguments can be passed to function/procedure that will cause runtime errors during evaluation of expression.\n- Harbour supports two new types (Pointer and Symbol) which does\nnot exists in CA-Cl*pper.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "ValType()"
			},
			{
				"TEMPLATE": "Function",
				"NAME": "ValType()",
				"ONELINER": "Retrieves the data type of an expression",
				"CATEGORY": "API",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "ValType( <xExp> ) --> cRetType",
				"ARGUMENTS": "<xExp> is any valid expression.",
				"RETURNS": "<cRetType> a character indicating the type of the passed expression.\n<table>\n <cRetType>   Meaning\n \"A\"          Array\n \"B\"          Block\n \"C\"          Character (string)\n \"D\"          Date\n \"L\"          Logical\n \"M\"          Memo\n \"N\"          Numeric\n \"O\"          Object\n \"P\"          Pointer\n \"S\"          Symbol\n \"U\"          NIL\n</table>",
				"DESCRIPTION": "This function returns one character which represents the data type of the argument.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? ValType( Array( 1 ) )    // --> \"A\"\n? ValType( {|| 1 + 1 } )   // --> \"B\"\n? ValType( \"Harbour\" )     // --> \"C\"\n? ValType( Date() )        // --> \"D\"\n? ValType( .T. )           // --> \"L\"\n? ValType( 1 )             // --> \"N\"\n? ValType( TBrowse() )     // --> \"O\"\n? ValType( hb_idleAdd() )  // --> \"P\" Harbour extension\n? ValType( @QOut() )       // --> \"S\" Harbour extension\n? ValType( NIL )           // --> \"U\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "ValType() is CA-Cl*pper compliant, with the addition of the new Harbour types: Pointer and Symbol.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "API, Variable management",
				"SEEALSO": "Type()"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_setListenerAdd()",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "C Prototype\n\n#include \"hbset.h\"\nhb_setListenerAdd( PHB_SET_LISTENER_CALLBACK callback ) --> int",
				"ARGUMENTS": "<callback> A pointer to a function taking two enum parameters and returning no value. The first parameter identifies the SET parameter that is to be changed and the second parameter identifies whether the call is from before or after the value is changed. The callback function will be called twice whenever a SET parameter is changed using the Harbour SET function. The first call takes place before the SET value is changed and the second one is after the SET parameter has been changed.",
				"RETURNS": "An integer value representing the callback handle, in case the caller needs to deactivate the callback function.",
				"DESCRIPTION": "This function allows a subsystem that needs to track the status of some SET parameters to be notified whenever a SET parameter gets changed.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "void callback_function( HB_set_enum set, HB_set_listener_enum when )\n{\n   printf(\"\\nCalled for SET parameter %d %s changing.\",\n      set, (when ? \"after\" : \"before\"));\n}\nint handle = hb_setListenerAdd( callback_function );"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "C level API, Environment",
				"SEEALSO": "hb_setListenerRemove()"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_setListenerNotify()",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "C Prototype\n\n#include \"hbset.h\"\nhb_setListenerNotify( HB_set_enum set, HB_set_listener_enum\nwhen ) --> int",
				"ARGUMENTS": "<set> The number of the SET parameter that is to be or was changed.\n<when> Set to HB_SET_LISTENER_BEFORE when called before the SET parameter is to be changed and set to HB_SET_LISTENER_AFTER when called after the SET parameter has been changed.",
				"RETURNS": "<int>",
				"DESCRIPTION": "This function notifies all SET listener callback functions. It must be called any time you change the value of a SET parameter directly instead of using the Harbour SET function. Both before and after the change.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "hb_setListenerNotify( HB_SET_DECIMALS, HB_SET_LISTENER_BEFORE );\nhb_set.HB_SET_DECIMALS = 3;\nhb_setListenerNotify( HB_SET_DECIMALS, HB_SET_LISTENER_AFTER );"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "C level API, Environment",
				"SEEALSO": "hb_setListenerAdd()"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_setListenerRemove()",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "C Prototype\n\n#include \"hbset.h\"\nhb_setListenerRemove( int handle ) --> int",
				"ARGUMENTS": "<handle> The handle for the SET listener callback function to be removed.",
				"RETURNS": "The handle if the callback function could not be located or the negative value of the handle if the callback function was removed.",
				"DESCRIPTION": "This function removes a SET listener callback function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "int handle = hb_setListenerAdd( callback_function );\n/* ... */\nhb_setListenerRemove( handle );"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "C level API, Environment",
				"SEEALSO": "hb_setListenerAdd()"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_idleState()",
				"ONELINER": "Evaluates a single background task and calls the garbage collector.",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Idle states",
				"SYNTAX": "void hb_idleState( void );",
				"ARGUMENTS": "None",
				"DESCRIPTION": "hb_idleState() is a C function that requests garbage collection and executes a single background task defined by the codeblock passed with hb_idleAdd() function. It also releases the CPU time slices for platforms that require it.\nEvery call for this function evaluates different task in the order of task creation. There are no arguments passed during codeblock evaluation.\nThis function can be safely called even if there are no background tasks defined.\nThis function is automatically called from the Inkey() function.",
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "C level API, Idle states",
				"SEEALSO": "hb_idleAdd(), hb_idleDel(), hb_idleState()"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_mathGetErrMode()",
				"ONELINER": "get math error handling mode",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "C Prototype\n\n#include \"hbmath.h\"\nhb_mathGetErrMode( void ) --> imode",
				"RETURNS": "imode       math error handling mode",
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hbmath.h\nLibrary is core",
				"TAGS": "C level API, Math",
				"SEEALSO": "hb_mathSetErrMode()"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_mathGetHandler()",
				"ONELINER": "get current Harbour math error handler",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "C Prototype\n\n#include \"hbmath.h\"\nhb_mathGetHandler( void ) --> HB_MATH_HANDLERPROC handlerproc",
				"ARGUMENTS": "handlerproc             custom math handler\ntypedef int (* HB_MATH_HANDLERPROC)(HB_MATH_EXCEPTION * err)",
				"RETURNS": "<handerproc>",
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hbmath.h\nLibrary is core",
				"TAGS": "C level API, Math"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_mathGetLastError()",
				"ONELINER": "get the last math lib error",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "C Prototype\n\n#include \"hbmath.h\"\nhb_mathGetLastError( HB_MATH_EXCEPTION * phb_exc )\n                    --> int iMathErrorType",
				"ARGUMENTS": "phb_exc     pointer to HB_MATH_EXCEPTION structure, if not NULL,\nthe structure will be filled with information about the last math error:\n```c\ntypedef struct _HB_MATH_EXCEPTION {\n  int type;        // Math error type, is one of the constants\n                   // HB_MATH_ERR_xxx defined in hbmath.ch\n  char *funcname;  // Pointer to name of the math C RTL routine\n                   // that caused the error.\n  char *error;     // Pointer to error description.\n  double arg1;     // First and\n  double arg2;     // Second double argument to the math routine.\n  double retval;   // Corrected return value for the math routine.\n  int retvalwidth; // Width and\n  int retvaldec;   // Decimals of the corrected return value,\n                   // both default to -1\n  int handled;     // 1, if the math error is already corrected,\n                   // 0 otherwise.\n} HB_MATH_EXCEPTION;\n```",
				"RETURNS": "<iMathErrorType>",
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hbmath.h\nLibrary is core",
				"TAGS": "C level API, Math"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_mathIsMathErr()",
				"ONELINER": "Check if Harbour math error handling is available",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "C Prototype\n\n#include \"hbmath.h\"\nhb_mathIsMathErr( void ) --> int iIsMathHandler",
				"RETURNS": "<iIsMathHandler>",
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hbmath.h\nLibrary is core",
				"TAGS": "C level API, Math"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_mathResetError()",
				"ONELINER": "Reset the internal math error information structure",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "C Prototype\n\n#include \"hbmath.h\"\nhb_mathResetError( void )",
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hbmath.h\nLibrary is core",
				"TAGS": "C level API, Math"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_mathSetErrMode()",
				"ONELINER": "set math error handling mode",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "C Prototype\n\n#include \"hbmath.h\"\nhb_mathSetErrMode( int imode ) --> int ioldmode",
				"ARGUMENTS": "imode        math error handling mode, one of the following\nconstants, defined in hbmath.ch:\n<table-noheader>\nHB_MATH_ERRMODE_DEFAULT\nHB_MATH_ERRMODE_CDEFAULT\nHB_MATH_ERRMODE_USER\nHB_MATH_ERRMODE_USERDEFAULT\nHB_MATH_ERRMODE_USERCDEFAULT\n</table>",
				"RETURNS": "ioldmode     old math error handling mode",
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hbmath.h\nLibrary is core",
				"TAGS": "C level API, Math",
				"SEEALSO": "hb_mathGetErrMode()"
			},
			{
				"TEMPLATE": "C Function",
				"NAME": "hb_mathSetHandler()",
				"ONELINER": "set the Harbour math handler",
				"CATEGORY": "C level API",
				"SUBCATEGORY": "Math",
				"SYNTAX": "C Prototype\n\n#include \"hbmath.h\"\nhb_mathSetHandler( HB_MATH_HANDLERPROC handlerproc )\n                  --> HB_MATH_HANDLERPROC previous_handerproc",
				"ARGUMENTS": "handlerproc             custom math handler\ntypedef int (* HB_MATH_HANDLERPROC)(HB_MATH_EXCEPTION * err)",
				"RETURNS": "previous_handlerproc    previous math handler\ntypedef int (* HB_MATH_HANDLERPROC)(HB_MATH_EXCEPTION * err)",
				"STATUS": "Ready",
				"COMPLIANCE": "Not applicable",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Header file is hbmath.h\nLibrary is core",
				"TAGS": "C level API, Math"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "CLASS VAR",
				"ONELINER": "Define a CLASS VAR variable for a class (NOT for an Object!)",
				"CATEGORY": "Class",
				"SUBCATEGORY": "Data",
				"SYNTAX": "CLASS VAR <DataName1> [, <DataNameN>] [ AS <type> ] [ INIT <uValue> ]",
				"ARGUMENTS": "<DataName1>  Name of the VAR\n<type>       Optional data type specification from the following:\nCharacter, Numeric, Date, Logical, Codeblock, NIL\n<uValue>     Optional initial value at program startup",
				"DESCRIPTION": "`CLASS VAR` variables can also be thought of as the \"properties\" of an entire class. Each `CLASS VAR` exists only once, no matter how many objects are created. A common usage is for a counter that is incremented whenever an object is created and decremented when one is destroyed, thus monitoring the number of objects in existence for this class.\nYou can use the `AS <type>` clause to enforce that the `CLASS VAR` is maintained as a certain type. Otherwise it will take on the type of whatever value is first assigned to it. Use the `INIT <uValue>` clause to initialize that `VAR` to <uValue> whenever the class is first used.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbclass.ch\"\nCREATE CLASS TWindow\n   VAR   hWnd, nOldProc\n   CLASS VAR lRegistered AS LOGICAL\nENDCLASS"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Class, Data",
				"SEEALSO": "CLASS, METHOD, VAR"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "VAR",
				"ONELINER": "Alternate syntax for VAR: instance variable for the objects.",
				"CATEGORY": "Class",
				"SUBCATEGORY": "Data",
				"SYNTAX": "VAR <DataName1> [, <DataNameN>] [ AS <type> ] [ INIT <uValue> ]\n[[EXPORTED | VISIBLE] | [PROTECTED] | [HIDDEN]] [READONLY | RO]",
				"ARGUMENTS": "<DataName1>  Name of the VAR\n<type>       Optional data type specification from the following:\nCharacter, Numeric, Date, Logical, Codeblock, NIL.\n<uValue>     Optional initial value when creating a new object.\nEXPORTED     Specifies that this VAR is accessible to functions and\nmethods outside of the class.  VISIBLE is a synonym for EXPORTED.\nPROTECTED    Specifies that this VAR is only accessible to functions and methods within this class and its subclasses.\nHIDDEN       Specifies that this VAR is only accessible to the\nclass where it was defined, and is not inherited by the subclasses.\nREADONLY     Restricts assignment to the variable. If specified with\nthe EXPORTED clause, assignment is only permitted from the current class and its subclasses.  If specified with the PROTECTED clause, assignment is only permitted from the current class. RO is a synonym for READONLY.",
				"DESCRIPTION": "VAR elements can also be thought of as the \"properties\" of an object. They can be of any data type, including codeblock. Once an object has been created, the VAR elements are referenced with the colon `:` as in `MyObject:Heading := \"Last name\"`. Usually a class also defines methods to manipulate the VAR.\nYou can use the `AS <type>` clause to enforce that the VAR is maintained as a certain type. Otherwise it will take on the type of whatever value is first assigned to it.\nUse the `INIT <uValue>` clause to initialize that VAR to <uValue> whenever a new object is created.\nVAR can be a synonym for VAR, or it can use a slightly different syntax for compatibility with other dialects.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbclass.ch\"\n\nCREATE CLASS TBColumn\n\n   VAR Block      // Code block to retrieve data for the column\n   VAR Cargo      // User-definable variable\n   VAR ColorBlock // Code block that determines color of data items\n   VAR ColSep     // Column separator character\n   VAR DefColor   // Array of numeric indexes into the color table\n   VAR Footing    // Column footing\n   VAR FootSep    // Footing separator character\n   VAR Heading    // Column heading\n   VAR HeadSep    // Heading separator character\n   VAR Width      // Column display width\n   VAR ColPos     // Temporary column position on screen\n\n   METHOD New()   // Constructor\n\nENDCLASS\n\nMETHOD New() CLASS TBColumn\n   RETURN Self"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Class, Data",
				"SEEALSO": "CLASS, METHOD, CLASS VAR, VAR"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "CLASS",
				"ONELINER": "Define a Class for Object Oriented Programming",
				"CATEGORY": "Class",
				"SUBCATEGORY": "Definition",
				"SYNTAX": "[CREATE] CLASS <ClassName> [ <FROM, INHERIT> <SuperClass1> [, <SuperClassN>] ] [STATIC]",
				"ARGUMENTS": "<ClassName>  Name of the class to define. By tradition, Harbour\nclasses start with \"T\" to avoid collisions with user- created classes.\n<SuperClass1...n> The Parent class(es) to use for inheritance.\nHarbour supports Multiple Inheritance.\nSTATIC       This clause causes the class function to be declared\nas a static function. It will therefore not be available outside the current module.",
				"DESCRIPTION": "CLASS creates a class from which you can create objects. The CLASS command begins the class specification, in which the VAR elements (also known as instance variables) and METHODS of the class are named. The following scoping commands may also appear. They control the default scope of VAR and METHOD commands that follow them.\n<fixed>\n   EXPORTED:\n   VISIBLE:\n   HIDDEN:\n   PROTECTED:\n</fixed>\nThe class specification ends with the END CLASS command.\nClasses can inherit from multiple <SuperClasses>, and the chain of inheritance can extend to many levels.\nA program uses a Class by calling the Class Constructor, usually the `:New()` method, to create an object. That object is usually assigned to a variable, which is used to access the VAR elements and methods.\nHarbour's OOP syntax and implementation supports Scoping (Protect, Hidden and Readonly) and Delegating, and is largely compatible with Class(y)(tm), TopClass(tm) and Visual Objects(tm).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbclass.ch\"\n\nCREATE CLASS TBColumn\n\n   VAR Block      // Code block to retrieve data for the column\n   VAR Cargo      // User-definable variable\n   VAR ColorBlock // Code block that determines color of data items\n   VAR ColSep     // Column separator character\n   VAR DefColor   // Array of numeric indexes into the color table\n   VAR Footing    // Column footing\n   VAR FootSep    // Footing separator character\n   VAR Heading    // Column heading\n   VAR HeadSep    // Heading separator character\n   VAR Width      // Column display width\n   VAR ColPos     // Temporary column position on screen\n\n   METHOD New()    // Constructor\n\nENDCLASS\n\nMETHOD New() CLASS TBColumn\n   RETURN Self"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Class, Definition",
				"SEEALSO": "HBClass(), VAR, METHOD"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "ENDCLASS",
				"ONELINER": "End the declaration of a class.",
				"CATEGORY": "Class",
				"SUBCATEGORY": "Definition",
				"SYNTAX": "ENDCLASS",
				"ARGUMENTS": "(This statement has no arguments)",
				"DESCRIPTION": "ENDCLASS marks the end of a class declaration. It is usually followed by the class methods that are not INLINE.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbclass.ch\"\nCREATE CLASS TWindow\n   VAR hWnd, nOldProc\nENDCLASS"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Class, Definition",
				"SEEALSO": "CLASS, METHOD, VAR"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "ERROR HANDLER",
				"ONELINER": "Designate a method as an error handler for the class",
				"CATEGORY": "Class",
				"SUBCATEGORY": "Method",
				"SYNTAX": "ERROR HANDLER <MethodName>( [<params,...>] )",
				"ARGUMENTS": "<MethodName>  Name of the method to define\n<params,...>  Optional parameter list",
				"DESCRIPTION": "`ERROR HANDLER` names the method that should handle errors for the class being defined.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbclass.ch\"\n\nCREATE CLASS TWindow\n   ERROR HANDLER MyErrHandler()\nENDCLASS\n\nMETHOD MyErrHandler() CLASS TWindow\n   RETURN Self"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Class, Method",
				"SEEALSO": "ON ERROR, CLASS, METHOD, VAR"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "MESSAGE",
				"ONELINER": "Route a method call to another Method",
				"CATEGORY": "Class",
				"SUBCATEGORY": "Method",
				"SYNTAX": "MESSAGE <MessageName>   METHOD <MethodName>( [<params,...>] )\nMESSAGE <MessageName>() METHOD <MethodName>( [<params,...>] )",
				"ARGUMENTS": "<MessageName>  The pseudo-method name to define\n<MethodName>   The method to create and call when <MessageName>\nis invoked.\n<params,...>   Optional parameter list for the method",
				"DESCRIPTION": "The MESSAGE command is a seldom-used feature that lets you re-route a call to a method with a different name. This can be necessary if a method name conflicts with a public function that needs to be called from within the class methods.\nFor example, your app may have a public function called BeginPaint() that is used in painting windows. It would also be natural to have a Window class method called `:BeginPaint()` that the application can call. But within the class method you would not be able to call the public function because internally methods are based on static functions (which hide public functions of the same name).\nThe MESSAGE command lets you create the true method with a different name (`::xBeginPaint()`), yet still allow the `::BeginPaint()` syntax to call `::xBeginPaint()`.  This is then free to call the public function BeginPaint().",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n#include \"hbclass.ch\"\nCREATE CLASS TWindow\n   VAR    hWnd, nOldProc\n   METHOD New() CONSTRUCTOR\n   MESSAGE BeginPaint METHOD xBeginPaint()\nENDCLASS"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Class, Method",
				"SEEALSO": "METHOD, VAR, CLASS"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "METHOD",
				"ONELINER": "Declare a METHOD for a class in the class header",
				"CATEGORY": "Class",
				"SUBCATEGORY": "Method",
				"SYNTAX": "METHOD <MethodName>( [<params,...>] ) [CONSTRUCTOR]\nMETHOD <MethodName>( [<params,...>] ) INLINE <Code,...>\nMETHOD <MethodName>( [<params,...>] ) BLOCK  <CodeBlock>\nMETHOD <MethodName>( [<params,...>] ) EXTERN <NAME>( [<args,...>] )\nMETHOD <MethodName>( [<params,...>] ) SETGET\nMETHOD <MethodName>( [<params,...>] ) VIRTUAL\nMETHOD <MethodName>( [<param>] )      OPERATOR <op>\nMETHOD <MethodName>( [<params,...>] ) CLASS <ClassName>",
				"ARGUMENTS": "<MethodName>  Name of the method to define\n<params,...>  Optional parameter list",
				"DESCRIPTION": "Methods are \"class functions\" which do the work of the class. All methods must be defined in the class header between the CLASS and ENDCLASS commands.  If the body of a method is not fully defined here, the full body is written below the ENDCLASS command using this syntax:\nMETHOD <MethodName>( [<params,...>] ) CLASS <ClassName>\nMethods can reference the current object with the keyword `Self:` or its shorthand version `::`.\nCLAUSES:\nCONSTRUCTOR  Defines a special method Class Constructor method,\nused to create objects.  This is usually the New() method. Constructors always return the new object.\nINLINE       Fast and easy to code, INLINE lets you define the\ncode for the method immediately within the definition of the Class. Any methods not declared INLINE or BLOCK must be fully defined after the ENDCLASS command. The <Code, ...> following INLINE receives a parameter of Self. If you need to receive more parameters, use the BLOCK clause instead.\nBLOCK        Use this clause when you want to declare fast 'inline'\nmethods that need parameters. The first parameter to <CodeBlock> must be Self, as in:\nMETHOD       `<MethodName> BLOCK {| Self, <arg1>, <arg2>, ..., <argN> | ... }`\nEXTERN       If an external function does what the method needs,\nuse this clause to make an optimized call to that function directly.\nSETGET       For calculated Data. The name of the method can be\nmanipulated like a Data element to Set or Get a value.\nVIRTUAL      Methods that do nothing. Useful for Base classes where\nthe child class will define the method's behavior, or when you are first creating and testing a Class.\nOPERATOR     Operator Overloading for classes.\nSee example tests/testop.prg for details.\nCLASS <ClassName>\nUse this syntax only for defining a full method after the ENDCLASS command.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n#include \"hbclass.ch\"\nCREATE CLASS TWindow\n   VAR    hWnd, nOldProc\n   METHOD New() CONSTRUCTOR\n   METHOD Capture() INLINE  SetCapture( ::hWnd )\n   METHOD End() BLOCK  {| Self, lEnd | iif( lEnd := ::lValid(), ;\n      ::PostMsg( \"close\" ), ), lEnd }\n   METHOD EraseBkGnd( hDC )\n   METHOD cTitle( cNewTitle ) SETGET\n   METHOD Close() VIRTUAL\nENDCLASS\n\nMETHOD New() CLASS TWindow\n   LOCAL nVar, cStr\n   // ... <code> ...\n   // ... <code> ...\n   RETURN Self"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Class, Method",
				"SEEALSO": "HBClass(), VAR, CLASS"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "ON ERROR",
				"ONELINER": "Designate a method as an error handler for the class",
				"CATEGORY": "Class",
				"SUBCATEGORY": "Method",
				"SYNTAX": "ON ERROR <MethodName>( [<params,...>] )",
				"ARGUMENTS": "<MethodName>  Name of the method to define\n<params,...>  Optional parameter list",
				"DESCRIPTION": "`ON ERROR` is a synonym for `ERROR HANDLER`. It names the method that should handle errors for the class being defined.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"hbclass.ch\"\n\nCREATE CLASS TWindow\n   ON ERROR MyErrHandler()\nENDCLASS\n\nMETHOD MyErrHandler() CLASS TWindow\n   RETURN Self"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Class, Method",
				"SEEALSO": "ERROR HANDLER, CLASS, METHOD, VAR"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "COPY STRUCTURE",
				"ONELINER": "Create a new database based on current database structure",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Database",
				"SYNTAX": "COPY STRUCTURE TO <xcFileName> [FIELDS <field,...>]",
				"ARGUMENTS": "`TO xcFileName` is the name of the new database file to create. `.dbf` is the default extension if none is given. It can be specified as a literal file name or as a character expression enclosed in parentheses.\n`FIELDS `field,...` is an optional list of field names to copy from the currently open database in the specified order, the default is all fields. Names could be specified as uppercase or lowercase.",
				"DESCRIPTION": "`COPY STRUCTURE` create a new empty database file with a structure that is based on the currently open database in this work-area.\n`COPY STRUCTURE` can be use to create a sub-set of the currently open database, based on a given field list.\n`COPY STRUCTURE` command is preprocessed into __dbCopyStruct() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Create a new file that contains the same structure\nUSE test\nCOPY STRUCTURE TO MyCopy\n\n// Create a new file that contains part of the original structure\nUSE test\nCOPY STRUCTURE TO SomePart FIELDS name, address"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Database",
				"SEEALSO": "COPY STRUCTURE EXTENDED, dbCreate(), dbStruct(), __dbCopyStruct(), __dbCopyXStruct(), __dbCreate(), __dbStructFilter()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "COPY STRUCTURE EXTENDED",
				"ONELINER": "Copy current database structure into a definition file",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Database",
				"SYNTAX": "COPY STRUCTURE EXTENDED TO <xcFileName>",
				"ARGUMENTS": "<xcFileName> The name of the target definition file to create. `.dbf` is the default extension if none is given. It can be specified as a literal file name or as a character expression enclosed in parentheses.",
				"DESCRIPTION": "`COPY STRUCTURE EXTENDED` create a new database named <cFileName> with a pre-defined structure (also called \"structure extended file\"):\n<table>\n Field name   Type   Length   Decimals\n FIELD_NAME   C      10       0\n FIELD_TYPE   C      1        0\n FIELD_LEN    N      3        0\n FIELD_DEC    N      3        0\n</table>\nEach record in the new file contains information about one field in the original file. `CREATE FROM` could be used to create a database from the structure extended file.\nFor prehistoric compatibility reasons, Character fields which are longer than 255 characters are treated in a special way by writing part of the length in the FIELD_DEC according to the following formula (this is done internally):\n<fixed>\nFIELD->FIELD_DEC := Int( nLength / 256 )\nFIELD->FIELD_LEN :=      nLength % 256\n</fixed>\nLater if you want to calculate the length of a field you can use the following formula:\n<fixed>\nnLength := iif( FIELD->FIELD_TYPE == \"C\", ;\n                FIELD->FIELD_DEC * 256 + FIELD->FIELD_LEN, ;\n                FIELD->FIELD_LEN )\n</fixed>\n`COPY STRUCTURE EXTENDED` command is preprocessed into __dbCopyXStruct() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Open a database, then copy its structure to a new file,\n// Open the new file and list all its records\nUSE test\nCOPY STRUCTURE EXTENDED TO teststru\nUSE teststru\nLIST"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Database",
				"SEEALSO": "COPY STRUCTURE, CREATE, CREATE FROM, dbCreate(), dbStruct(), __dbCopyStruct(), __dbCopyXStruct(), __dbCreate()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "CREATE",
				"ONELINER": "Create empty structure extended file",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Database",
				"SYNTAX": "CREATE <xcFileName> [VIA <xcRDDName>] [ALIAS <xcAlias>]",
				"ARGUMENTS": "<xcFileName> is the target file name to create and then open. `.dbf` is the default extension if none is given. It can be specified as literal file name or as a character expression enclosed in parentheses.\n`VIA xcRDDName` is RDD name to create target with. If omitted, the default RDD is used. It can be specified as literal name or as a character expression enclosed in parentheses.\n`ALIAS xcAlias` is an optional alias to USE the target file with. If not specified, alias is based on the root name of <xcFileName>.",
				"DESCRIPTION": "CREATE a new empty structure extended file with the name <cFileName> and then open it in the current work-area. The new file has the following structure:\n<table>\n Field name   Type   Length   Decimals\n FIELD_NAME   C      10       0\n FIELD_TYPE   C      1        0\n FIELD_LEN    N      3        0\n FIELD_DEC    N      3        0\n</table>\nCREATE command is preprocessed into __dbCopyStruct() function during compile time and use this mode.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// CREATE a new structure extended file, append some records and\n// then CREATE FROM this file a new database file\n\nCREATE template\ndbAppend()\nFIELD->FIELD_NAME := \"CHANNEL\"\nFIELD->FIELD_TYPE := \"N\"\nFIELD->FIELD_LEN  := 2\nFIELD->FIELD_DEC  := 0\ndbAppend()\nFIELD->FIELD_NAME := \"PROGRAM\"\nFIELD->FIELD_TYPE := \"C\"\nFIELD->FIELD_LEN  := 20\nFIELD->FIELD_DEC  := 0\ndbAppend()\nFIELD->FIELD_NAME := \"REVIEW\"\nFIELD->FIELD_TYPE := \"C\"      // this field is 1000 char long\nFIELD->FIELD_LEN  := 232      // 1000 % 256 = 232\nFIELD->FIELD_DEC  := 3        // 1000 / 256 = 3\ndbCloseArea()\nCREATE TV_Guide FROM template"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Database",
				"SEEALSO": "COPY STRUCTURE, COPY STRUCTURE EXTENDED, CREATE FROM, dbCreate(), dbStruct(), __dbCopyStruct(), __dbCopyXStruct(), __dbCreate()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "CREATE FROM",
				"ONELINER": "Create new database file from a structure extended file",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Database",
				"SYNTAX": "CREATE <xcFileName> FROM <xcFileFrom> [VIA <xcRDDName>] [NEW] [ALIAS <xcAlias>]",
				"ARGUMENTS": "<xcFileName> is the target file name to create and then open. `.dbf` is the default extension if none is given. It can be specified as literal file name or as a character expression enclosed in parentheses.\n`FROM xcFileFrom` is a structure extended file name from which the target file <xcFileName> is going to be built. It can be specified as literal file name or as a character expression enclosed in parentheses.\n`VIA xcRDDName` is RDD name to create target with. If omitted, the default RDD is used. It can be specified as literal name or as a character expression enclosed in parentheses.\n`NEW` open the target file name <xcFileName> in the next available unused work-area and making it the current work-area. If omitted open the target file in current work-area.\n`ALIAS xcAlias` is an optional alias to USE the target file with. If not specified, alias is based on the root name of <xcFileName>.",
				"DESCRIPTION": "`CREATE FROM` open a structure extended file <xcFileFrom> where each record contain at least the following fields (in no particular order): FIELD_NAME, FIELD_TYPE, FIELD_LEN and FIELD_DEC. Any other field is ignored. From this information the file <xcFileName> is then created and opened in the current or new work-area (according to the NEW clause), if this is a new work-area it becomes the current.\nFor prehistoric compatibility reasons, structure extended file Character fields which are longer than 255 characters should be treated in a special way by writing part of the length in the FIELD_DEC according to the following formula:\n<fixed>\nFIELD->FIELD_DEC := Int( nLength / 256 )\nFIELD->FIELD_LEN :=      nLength % 256\n</fixed>\n`CREATE FROM` command is preprocessed into __dbCopyStruct() function during compile time and uses this mode.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// See example in the CREATE command"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Database",
				"SEEALSO": "COPY STRUCTURE, COPY STRUCTURE EXTENDED, CREATE, dbCreate(), dbStruct(), __dbCopyStruct(), __dbCopyXStruct(), __dbCreate()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "PACK",
				"ONELINER": "Remove records marked for deletion from a database",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Database",
				"SYNTAX": "PACK",
				"ARGUMENTS": "(This command has no arguments)",
				"DESCRIPTION": "This command removes records that were marked for deletion from the currently selected database. This command does not pack the contents of a memo field; those files must be packed via low-level functions.\nAll open index files will be automatically reindexed once PACK command has completed its operation. On completion, the record pointer is placed on the first record in the database.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test\ndbGoto( 10 )\nDELETE NEXT 10\n? LastRec()\nPACK\n? LastRec()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Database",
				"SEEALSO": "dbEval(), DELETE, Deleted(), ZAP, RECALL"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "ZAP",
				"ONELINER": "Remove all records from the current database file",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Database",
				"SYNTAX": "ZAP",
				"ARGUMENTS": "(This command has no arguments)",
				"DESCRIPTION": "This command removes all of the records from the database in the current work area. This operation also updates any index file in use at the time of this operation. In addition, this command removes all items within an associated memo file. In a network environment, any file that is about to be ZAPped must be used exclusively.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test\n? LastRec()  // --> 500\nZAP\n? LastRec()  // --> 0"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Database",
				"SEEALSO": "DELETE, PACK, USE"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET ALTERNATE",
				"ONELINER": "Toggle and echos output to an alternate file",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET ALTERNATE TO <cFile> [ADDITIVE]\nSET ALTERNATE on | OFF | ( <lAlter> )",
				"ARGUMENTS": "<cFile> Name of alternate file.\n<lAlter> Logical expression for toggle",
				"DESCRIPTION": "This command toggles and output console information to the alternate file <cFile>, provided that the command is toggled on or the condition <lAlter> is set to a logical true (.T.). If <cFile> does not has a file extension, .txt will be assumed. The file name may optionally have a drive letter and/or directory path. If none is specified, the current drive and directory will be used. If the ALTERNATE file is created but no `ALTERNATE ON` command is issued, nothing will be echoed to the file. If ADDITIVE clause is used, then the information will be appended to the existing alternate file. Otherwise, a new file will be created with the specified name (or an existing one will be overwritten) and the information will be appended to the file. The default is to create a new file. A `SET ALTERNATE TO` command will close the alternate file",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET ALTERNATE TO test.txt\nSET ALTERNATE ON\n? \"Harbour\"\n? \"is\"\n? \"Power\"\nSET ALTERNATE TO\nSET ALTERNATE OFF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "CLOSE, SET PRINTER, SET CONSOLE, Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET BELL",
				"ONELINER": "Toggle the bell to sound once a GET has been completed.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET BELL on | OFF | ( <lBell> )",
				"ARGUMENTS": "<lBell> Logical expression for toggle command",
				"DESCRIPTION": "This command toggles the bell to sound whenever a character is entered into the last character position of a GET, or if an invalid data type is entered into a GET.\nIf <lBell> is a logical true (.T.), the bell will be turned ON; otherwise, the bell will be turned off.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cDummy, GetList := {}\nSET BELL ON\ncDummy := Space( 20 )\n@ 3, 2 GET cDummy\nREAD\nSET BELL OFF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET CENTURY",
				"ONELINER": "Toggle the century digits in all dates display",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET CENTURY on | OFF | ( <lCent> )",
				"ARGUMENTS": "<lCent> Logical expression for toggle",
				"DESCRIPTION": "This command allows the input and display of dates with the century prefix. It will be in the standard `MM/DD/YYYY` format unless specified by the `SET DATE` command or Set() function. If <lCent> is a logical true (.T.), the command will be set on; otherwise, the command will be set off",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET CENTURY ON\n? Date()\nSET CENTURY OFF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET DATE, SET EPOCH, CToD(), Date(), DToC(), Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET CONSOLE",
				"ONELINER": "Toggle the console display",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET CONSOLE ON | off | ( <lConsole> )",
				"ARGUMENTS": "<lConsole> Logical expression for toggle command",
				"DESCRIPTION": "This command turns the screen display either off or on for all screens display other then direct output via the `@...SAY` commands or the <-> DevOut() function.\nIf <lConsole> is a logical true (.T.), the console will be turned ON; otherwise, the console will be turned off.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET CONSOLE ON\n? Date()\nSET CONSOLE OFF\n? Date()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET DEVICE, Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET DATE",
				"ONELINER": "Assigns a date format or chooses a predefined date data set.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET DATE FORMAT [TO] <cFormat>\n\nSET DATE [TO] [ANSI / BRITISH / FRENCH / GERMAN / ITALIAN / JAPAN / USA / AMERICAN]",
				"ARGUMENTS": "<cFormat> Keyword for date format",
				"DESCRIPTION": "This command sets the date format for function display purposes. If specified, <cFormat> may be a customized date format in which the letters d, m and y may be used to design a date format. The default is an AMERICAN date format; specifying no parameters will set the date format to AMERICAN. Below is a table of the various predefined dates formats.\n<table>\n Syntax         Date Format\n ANSI           yy.mm.dd\n BRITISH        dd/mm/yy\n FRENCH         dd/mm/yy\n GERMAN         dd.mm.yy\n ITALIAN        dd-mm-yy\n JAPAN          yy.mm.dd\n USA            mm-dd-yy\n AMERICAN       mm/dd/yy\n</table>",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET DATE JAPAN\n? Date()\nSET DATE GERMAN\n? Date()"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET DATE, SET EPOCH, CToD(), Date(), DToC(), Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET DECIMALS",
				"ONELINER": "Toggle the console display",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET DECIMALS TO [<nDecimal>]",
				"ARGUMENTS": "<nDecimal> Number of decimals places",
				"DESCRIPTION": "This command establishes the number of decimal places that Harbour will display in mathematical calculations, functions, memory variables, and fields. Issuing no parameter with this command will the default number of decimals to 0. For decimals to be seen, the `SET FIXED ON` command must be activated.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET FIXED ON\n? 25141251 / 362\nSET DECIMALS TO 10\n? 214514.214 / 6325"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET FIXED, Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET DEFAULT",
				"ONELINER": "Establishes the Harbour search drive and directory.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET DEFAULT TO [<cPath>]",
				"ARGUMENTS": "<cPath> Drive and/or path.",
				"DESCRIPTION": "This command changes the drive and directory used for reading and writing database, index, memory, and alternate files. Specifying no parameters with this command will default the operation to the current logged drive and directory.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET DEFAULT TO /hb/tests\nSet( _SET_DEFAULT, hb_DirSepToOS( \"/hb/tests\" ) )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET PATH, CurDir(), Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET DEVICE",
				"ONELINER": "Directs all `@...SAY` output to a device.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET DEVICE TO [printer | SCREEN ]",
				"ARGUMENTS": "None.",
				"DESCRIPTION": "This command determines whether the output from the `@...SAY` command and the DevPos() and DevOut() function will be displayed on the printer.\nWhen the device is set to the PRINTER, the `SET MARGIN` value adjusts the position of the column values accordingly. Also, an automatic page eject will be issued when the current printer head position is less than the last printed row. Finally, if used in conjunction with the `@...GET` commands, the values for the GETs will all be ignored.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET DEVICE TO SCREEN\n? 25141251 / 362\nSET DEVICE TO PRINTER\nSET PRINTER TO LPT1\n? 214514.214 / 6325\nSET PRINTER OFF\nSET DEVICE TO SCREEN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "@...SAY, SET PRINTER, SetPRC(), Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET EPOCH",
				"ONELINER": "Specify a base year for interpreting dates",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET EPOCH TO <nEpoch>",
				"ARGUMENTS": "<nEpoch> Base Century.",
				"DESCRIPTION": "This command sets the base year value for dates that have only two digits. The default setting is 1900. Dates between 0100-01-01 and 2999-12-31 are fully supported.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET EPOCH TO 2000"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET DATE, SET CENTURY, CToD(), Date(), DToC(), Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET FIXED",
				"ONELINER": "Set the number of decimal position to be displayed",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET FIXED on | OFF | ( <lFixed> )",
				"ARGUMENTS": "<lFixed> Logical expression for toggle",
				"DESCRIPTION": "This command activates a system wide fixed placement of decimals places shown for all numeric outputs. If the value of <lFixed> is a logical true (.T.), FIXED will be turned ON; otherwise it will be turned OFF.\nWhen `SET DECIMALS OFF` is used, the following rules apply to the number of decimal placed displayed.\n<table-noheader>\n Addition         Same as operand with the greatest number of decimal digits\n Subtraction      Same as operand with the greatest number of decimal digits\n Multiplication   Sum of operand decimal digits\n Division         Determined by SET DECIMALS TO\n Exponential      Determined by SET DECIMALS TO\n Log()            Determined by SET DECIMALS TO\n Exp()            Determined by SET DECIMALS TO\n Sqrt()           Determined by SET DECIMALS TO\n Val()            Determined by SET DECIMALS TO\n</table>",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET FIXED ON\n? 25141251 / 362\nSET FIXED OFF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET DECIMALS, Exp(), Log(), Sqrt(), Val(), Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET FUNCTION",
				"ONELINER": "Assign a character string to a function key",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET FUNCTION <nFunctionKey> TO [<cString>]",
				"ARGUMENTS": "<nFunctionKey> is a number in the range 1..40 that represent the function key to be assigned.\n<cString> is a character string to set. If <cString> is not specified, the function key is going to be set to NIL releasing by that any previous Set Function or SetKey() for that function.",
				"DESCRIPTION": "Set Function assign a character string with a function key, when this function key is pressed, the keyboard is stuffed with this character string. Set Function has the effect of clearing any SetKey() previously set to the same function number and vice versa.\n<table>\n nFunctionKey   Key to be set\n  1 .. 12       <F1> .. <F12>\n 13 .. 20       <Shift+F3> .. <Shift+F10>\n 21 .. 30       <Ctrl+F1> .. <Ctrl+F10>\n 31 .. 40       <Alt+F1> .. <Alt+F10>\n</table>\n`SET FUNCTION` command is preprocessed into __SetFunction() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\nLOCAL cTest, GetList := {}\n// Associate <F1> with a string\nSET FUNCTION 1 TO \"I Am Lazy\" + Chr( K_ENTER )\nCLS\ncTest := Space( 20 )\n@ 10, 0 SAY \"type something or <F1> for lazy mode\" GET cTest\nREAD\n? cTest"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "Harbour use 11 and 12 to represent <F11> and <F12>, while CA-Cl*pper use 11 and 12 to represent <Shift+F1> and <Shift+F2>.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "Inkey(), SetKey(), __Keyboard()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET INTENSITY",
				"ONELINER": "Toggles the enhanced display of PROMPTs and GETs.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET INTENSITY ON | off | ( <lInte> )",
				"ARGUMENTS": "<lInte> Logical expression for toggle command",
				"DESCRIPTION": "This command set the field input color and `@...PROMPT` menu color to either highlighted (inverse video) or normal color. The default condition is ON (highlighted).",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET INTENSITY ON"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "@...GET,@...PROMPT,@...SAY, Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET KEY",
				"ONELINER": "Assign an action block to a key",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET KEY <anKey> TO <bAction>] [WHEN <bCondition>]",
				"ARGUMENTS": "<anKey> is either a numeric key value, or an array of such values\n<bAction> is an optional code-block to be assigned\n<bCondition> is an optional condition code-block",
				"DESCRIPTION": "The `SET KEY` Command function is translated to the SetKey() function witch returns the current code-block assigned to a key when called with only the key value.  If the action block (and optionally the condition block) are passed, the current block is returned, and the new code block and condition block are stored. A group of keys may be assigned the same code block/condition block by using an array of key values in place on the first parameter.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"getexit.ch\"\n#include \"inkey.ch\"\nLOCAL bOldF10 := SetKey( K_F10, {|| Yahoo() } )\nLOCAL bBlock\n// some other processing ...\nSET KEY K_F10 TO bOldF10\n// some other processing ...\nbBlock := SetKey( K_SPACE )\nIF bBlock != NIL  // ...\n\n   // make <F10> exit current get, but only if in a get - ignores other\n   // wait-states such as menus, achoices, etc...\n   SetKey( K_F10, {|| GetActive():State := GE_WRITE }, ;\n      {|| GetActive() != NIL } )\nENDIF"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "`SET KEY` is mostly CA-Cl*pper compliant. The only difference is the addition of the condition code-block parameter, allowing set-keys to be conditionally turned off or on.  This condition-block cannot be returned once set - see hb_SetKeyGet()",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "hb_SetKeySave(), hb_SetKeyGet()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET MESSAGE",
				"ONELINER": "Establishes a message row for `@...PROMPT` command",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET MESSAGE TO [<nRow> [CENTER]]",
				"ARGUMENTS": "<nRow> Row number to display the message",
				"DESCRIPTION": "This command is designed to work in conjunction with the `MENU TO` and `@...PROMPT` commands. With this command, a row number between 0 and MaxRow() may be specified in <nRow>. This establishes the row on witch any message associated with an `@...PROMPT` command will appear.\nIf the value of <nRow> is 0, all messages will be suppressed. All messaged will be left-justifies unless the CENTER clause is used. In this case, the individual messages in each `@...PROMPT` command will be centered at the designated row (unless <nRow> is 0). All messages are independent; therefore, the screen area is cleared out by the centered message will vary based on the length of each individual message.\nSpecifying no parameters with this command set the row value to 0, witch suppresses all messages output. The British spelling of CENTRE is also supported.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "See tests/menuto.prg"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "Set(), SET WRAP, @...PROMPT, MENU TO"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET PATH",
				"ONELINER": "Specifies a search path for opening files",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET PATH TO [<cPath>]",
				"ARGUMENTS": "<cPath> Search path for files",
				"DESCRIPTION": "This command specifies the search path for files required by most commands and functions not found in the current drive and directory. This pertains primarily, but not exclusively, to databases, indexes, and memo files, as well as to memory, labels and reports files. The search hierarchy is: 1 Current drive and directory, 2 The `SET DEFAULT` path; 3 The `SET PATH` path.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET PATH TO /hb/tests\nSet( _SET_PATH, hb_DirSepToOS( \"/hb/tests\" ) )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET DEFAULT, CurDir(), Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET PRINTER",
				"ONELINER": "Toggles the printer and controls the printer device",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET PRINTER on | OFF\nSET PRINTER ( <lPrinter> )\nSET PRINTER TO [<cPrinter>] [ADDITIVE]",
				"ARGUMENTS": "<lPrinter>   Logical condition by which to toggle the printer\n<cPrinter> A device name or an alternate name",
				"DESCRIPTION": "This command can direct all output that is not controlled by the `@...SAY` command and the DevPos() and DevOut() functions to the printer. If specified, the condition <lPrinter> toggles the printer ON if a logical true (.T.) and OFF if a logical false (.F.). If no argument is specified in the command, the alternate file (if one is open) is closed, or the device is reselected and the PRINTER option is turned OFF.\nIf a device is specified in <cPrinter>, the output will be directed to that device instead of to the PRINTER. A specified device may be a literal string or a variable, as long as the variable is enclosed in parentheses. For a network, do not use a trailing colon when redirecting to a device.\nIf an alternate file is specified, <cPrinter> becomes the name of a file that will contain the output. If no file extension is specified an extension of .prn will be defaulted to.\nIf the ADDITIVE clause is specified, the information will be appended to the end of the specified output file. Otherwise, a new file will be created with the specified name (or an existing file will first be cleared) and the information will then be appended to the file. The default is to create a new file.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SET PRINTER ON\nSET PRINTER TO LPT1\n? 25141251 / 362\nSET PRINTER ( .F. )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "SET DEVICE, SET CONSOLE, DevOut(), Set()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "SET WRAP",
				"ONELINER": "Toggle wrapping the PROMPTs in a menu.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Environment",
				"SYNTAX": "SET WRAP on | OFF | ( <lWrap> )",
				"ARGUMENTS": "<lWrap> Logical expression for toggle",
				"DESCRIPTION": "This command toggles the highlighted bars in a `@...PROMPT` command to wrap around in a bottom-to-top and top-to-bottom manner. If the value of the logical expression <lWrap> is a logical false (.F.), the wrapping mode is set OFF; otherwise, it is set ON.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// See tests/menuto.prg"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Environment",
				"SEEALSO": "@...PROMPT, MENU TO"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "COPY FILE",
				"ONELINER": "Copies a file.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "COPY FILE <cFile> TO <cFile1>",
				"ARGUMENTS": "<cFile>   File name of source file <cFile1>  File name of target file",
				"DESCRIPTION": "This command makes an exact copy of <cFile> and names it <cFile1>. Both files must have the file extension included; the drive and the directory names must also be specified if they are different from the default drive and/or director. <cFile1> also can refer to a OS device (e.g. `LPT1`). This command does not observe the `SET PATH TO` or `SET DEFAULT TO` settings.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "COPY FILE test.dbf TO adir.prg\nCOPY FILE test.txt TO LPT1"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, FileSys",
				"SEEALSO": "ERASE, RENAME, FRename(), FErase()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "DELETE FILE",
				"ONELINER": "Remove a file from disk",
				"CATEGORY": "Command",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "DELETE FILE <xcFile>",
				"ARGUMENTS": "<xcFile> Name of file to remove",
				"DESCRIPTION": "This command removes a file from the disk. The use of a drive, directory, and wild-card skeleton operator is allowed for the root of the file name. The file extension is required. The `SET DEFAULT` and `SET PATH` commands do not affect this command.\nThe file must be considered closed by the operating system before it may be deleted.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "DELETE FILE test.txt"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, FileSys",
				"SEEALSO": "CurDir(), File(), FErase(), ERASE"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "DIR",
				"ONELINER": "Display listings of files",
				"CATEGORY": "Command",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "DIR [<cFileMask>]",
				"ARGUMENTS": "<cFileMask> File mask to include in the function return. It could contain path and standard wildcard characters as supported by your OS (like * and ?). If <cFileMask> contains no path, then SET DEFAULT path is used to display files in the mask.",
				"DESCRIPTION": "If no <cFileMask> is given, __Dir() display information about all *.dbf in the SET DEFAULT path, this information contain: file name, number of records, last update date and the size of each file.\nIf <cFileMask> is given, __Dir() list all files that match the mask with the following details: Name, Extension, Size, Date.\nDIR command is preprocessed into __Dir() function during compile time.\n__Dir() is a compatibility function, it is superseded by Directory() which returns all the information in a multidimensional array.\nIf long file names are available Harbour will use/display the first 15 characters else Harbour will use/display a 8.3 file name consistent with CA-Cl*pper.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "DIR          // information for all DBF files in current directory\n\nDIR \"*.dbf\"          // list all DBF file in current directory\n\n// list all PRG files in Harbour Run-Time library\n// for MS-DOS compatible operating systems\nDIR \"src/rtl/*.prg\"\n\n// list all files in the public section on a Unix like machine\nDIR \"/pub\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, FileSys",
				"SEEALSO": "ADir(), Directory(), SET DEFAULT, __Dir()*"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "ERASE",
				"ONELINER": "Remove a file from disk",
				"CATEGORY": "Command",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "ERASE <xcFile>",
				"ARGUMENTS": "<xcFile> Name of file to remove",
				"DESCRIPTION": "This command removes a file from the disk. The use of a drive, directory, and wild-card skeleton operator is allowed for the root of the file name. The file extension is required. The `SET DEFAULT` and `SET PATH` commands do not affect this command.\nThe file must be considered closed by the operating system before it may be deleted.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "ERASE test.txt"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, FileSys",
				"SEEALSO": "CurDir(), File(), FErase(), DELETE FILE"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "RENAME",
				"ONELINER": "Changes the name of a specified file",
				"CATEGORY": "Command",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "RENAME <cOldFile> TO <cNewFile>",
				"ARGUMENTS": "<cOldFile> Old file name\n<cNewFile> New File name",
				"DESCRIPTION": "This command changes the name of <cOldFile> to <cNewFile>. Both <cOldFile> and <cNewFile> must include a file extension. This command if not affected by the `SET PATH TO` or `SET DEFAULT TO` commands; drive and directory designates must be specified if either file is in a directory other then the default drive and directory.\nIf <cNewFile> id currently open or if it previously exists, this command will not perform the desired operation.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "RENAME test.txt TO test.old"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "Command, FileSys",
				"SEEALSO": "CurDir(), ERASE, File(), FErase(), FRename()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "TYPE",
				"ONELINER": "Show the content of a file on the console, printer or file",
				"CATEGORY": "Command",
				"SUBCATEGORY": "FileSys",
				"SYNTAX": "TYPE <xcFile> [TO PRINTER] [TO FILE <xcDestFile>]",
				"ARGUMENTS": "<xcFile> is a name of the file to display. If the file have an extension, it must be specified (there is no default value). It can be specified as literal file name or as a character expression enclosed in parentheses.\n`TO PRINTER` is an optional keyword that specifies that the output should go to both the screen and printer.\n`TO FILE` <xcDestFile> copy the source <xcFile> also to a file. If no extension is given `.txt` is added to the output file name. <xcDestFile> can be specified as literal file name or as a character expression enclosed in parentheses.",
				"DESCRIPTION": "TYPE command type the content of a text file on the screen with an option to send this information also to the printer or to an alternate file. The file is displayed as is without any headings or formatting.\nIf <xcFile> contain no path, TYPE try to find the file first in the `SET DEFAULT` directory and then in search all of the `SET PATH` directories. If <xcFile> cannot be found a run-time error occur.\nIf <xcDestFile> contain no path it is created in the `SET DEFAULT` directory.\nUse `SET CONSOLE OFF` to suppress screen output. You can pause the output using <Ctrl-S>, press any key to resume.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// The following examples assume a file name `test.txt` exist in all\n// specified paths, a run-time error would displayed if it does not\n\n// display test.txt file on screen\nTYPE test.txt\n\n// display test.txt file on screen and printer\nTYPE test.txt TO PRINTER\n\n// display test.txt file on printer only\nSET CONSOLE OFF\nTYPE test.txt TO PRINTER\nSET CONSOLE ON\n\n// display test.txt file on screen and into a file myreport.txt\nTYPE test.txt TO FILE myreport"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, FileSys",
				"SEEALSO": "COPY FILE, SET DEFAULT, SET PATH, SET PRINTER, __TypeFile()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "LABEL FORM",
				"ONELINER": "Displays labels to the screen or an alternate device",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Legacy",
				"SYNTAX": "LABEL FORM <cLabelName> [TO PRINTER] [TO FILE <cFile>] [<cScope>]\n           [WHILE <bWhile> ] [FOR <bFor> ] [SAMPLE] [NOCONSOLE]",
				"ARGUMENTS": "<cLabelName>   Name of label file <cFile>        Name of an alternate file <cScope>       Expression of a scoping condition <bWhile>       WHILE condition <bFor>         FOR condition",
				"DESCRIPTION": "This command allows labels to be printed based on the format outlined in LBL file specified as <cLabelName>. By default, output will go to the screen however this output may be rerouted with either the `TO PRINTER` or the `TO FILE` clause.\nIf the `TO FILE` clause is specified, the name of the ASCII text file containing the generated labels will be <cFile>.\nIf no file extension is specified a .txt extension is added. <cScope> is the scope condition for this command. Valid scopes include `NEXT <expN>` (number of records to be displayed, where <expN> is the number of records), `RECORD <expN>` (a specific record to be printed), REST (all records starting from the current record position, and ALL (all records). The default is ALL.\nBoth logical expression may work ill conjunction with one another where <bFor> is the logical expression for the FOR condition (for records to be displayed within a given value range) and <bWhile> for the WHILE condition (for records to be displayed until they fail to meet the condition).\nIf the SAMPLE clause is specified, test labels will be generated.\nIf the NOCONSOLE clause is specified, the console will be turned off while this command is being executed.\nThis command follows the search criteria outlined in the `SET PATH TO` command. The path may be specified, along, with (the drive letter, in <cLabelName>",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\nLABEL FORM test.lbl"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "Command, Legacy",
				"SEEALSO": "REPORT FORM"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "REPORT FORM",
				"ONELINER": "Display a report",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Legacy",
				"SYNTAX": "REPORT FORM <cReportName> [TO PRINTER] [TO FILE <cFile>] [<cScope>]\n            [WHILE <bWhile> ] [FOR <bFor> ]\n            [PLAIN |HEADING <cHeading>] [NOEJECT] [SUMMARY]\n            [NOCONSOLE]",
				"ARGUMENTS": "<cReportName> Name of report file\n<cFile>       Name of alternate file\n<cScope>      Scope.\n<bWhile>      Logical expression of WHILE condition .\n<bFor>        Logical expression of FOR condition.\n<cHeading>    Report heading",
				"DESCRIPTION": "This command prints out the report named <cReportName>, which is a standard FRM file. The file extension is not required because `.frm` will be assumed. The `SET PATH TO` and `SET DEFAULT TO` commands affect the search for the file <cReportName>; unless a drive and path are specified in <cReportName>, REPORT will search the path specified in the `SET PATH` command if it cannot find the report form in the current directory.\nThe output of the report will be offset based on the setting of the `SET MARGIN TO` value.\nBy default, output will go to the console; however, it may be controlled via either the `TO PRINTER` or `TO FILE` clause. If the output is to go to the file, the name of the alternate file is specified in <cFile>. Unless specified in <cFile>, the default file extension will be `.txt`.\n<cScope> is the scope for this command. Valid scopes include `NEXT <expN>` (where <expN> is the number of records), `RECORD <expN>` (a specific record to be displayed), REST (all records from the current record position), and ALL (all records). The default is ALL.\nBoth logical expressions may work in conjunction with one another, where <bFor> is the logical expression for the FOR condition (for records to be displayed within a given range) and <bWhile> for the WHILE condition (for records to be displayed until the condition fails).\nIf the PLAIN clause is specified, date and page numbers are suppressed. In addition, there is no  automatic page breaking, and the report title and column headings appear only once at the top of the form.\nIf the HEADING clause is used, <cHeading> is displayed on the first title of each report page. The value of <cHeading> is evaluated only once before executing the report; varying the values of <cHeading> is not allowed. The PLAIN clause will take precedence over the HEADING clause if both are included.\nIf the NOEJECT clause is used, the initial page eject on the report will not be issued when the output clause `TO PRINTER` is specified. Otherwise, this clause has no effect.\nIf the SUMMARY Clause is specified, the report will contain only groups, subgroups, and grand total information. The detailed title item information will be ignored.\nIf the NOCONSOLE clause is specified, output to the console will be turned off while this command is being executed.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "USE test NEW\nREPORT FORM test.frm"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "Command, Legacy",
				"SEEALSO": "LABEL FORM"
			},
			{
				"TEMPLATE": "Procedure",
				"NAME": "EJECT",
				"ONELINER": "Issue an command to advance the printer to the top of the form",
				"CATEGORY": "Command",
				"SUBCATEGORY": "Printer",
				"SYNTAX": "EJECT",
				"ARGUMENTS": "None",
				"DESCRIPTION": "This command issue an form-feed command to the printer. If the printer is not properly hooked up to the computer, an error will not be generated and the command will be ignored.\nOnce completed, the values of PRow() and PCol(), the row and column indicators to the printer, will be set to 0. Their values, however, may be manipulated before or after issuing an EJECT by using the DevPos() function.\nOn compile time this command is translated into __Eject() function.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL Curpos\nUSE test NEW\nSET DEVICE TO PRINTER\nCurpos := 0\nDO WHILE ! Eof()\n   ? test->first, test->last\n   Curpos++\n   IF Curpos > 59\n      Curpos := 0\n      EJECT\n   ENDIF\nENDDO\nSET DEVICE TO SCREEN"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, Printer",
				"SEEALSO": "DevPos(), SET PRINTER, PRow(), PCol()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "@...GET",
				"ONELINER": "Creates a GET object and displays it to the screen",
				"CATEGORY": "Command",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "@ <nRow>, <nCol> [SAY <cSay> [PICTURE <cSayPict>] COLOR <cSayColor> ]\nGET <xVar> [PICTURE <cGetPict>] [WHEN <lWhen>] [COLOR <cGetColor>]\n[VALID <lValid> / RANGE <xStart>, <xEnd>]",
				"ARGUMENTS": "<nRow>      The row coordinate.\n<nCol>      The column coordinate.\n<cSay>      Message to display.\n<cSayPict>  Character expression of PICTURE displayed.\n<cSayColor> Color to be Used for the SAY expression.\n<xVar>      An variable/field name.\n<cGetPict>  Character expression of PICTURE to get.\n<lWhen>     Logical expression to allow GET.\n<lValid>    Logical expression to validate GET input.\n<xStart>    Lower RANGE value.\n<xEnd>      Upper RANGE value.\n<cGetColor> Color string to be used for the GET expression.",
				"DESCRIPTION": "This command adds a GET object to the reserved array variable named `GetList` and displays it to the screen. The field or variable to be added to the GET object is specified in <xVar> and is displayed at row, column coordinate <nRow>, <nCol>.\nIf the SAY clause is used <cSay> will be displayed starting at <nRow>, <nCol>, with the field variable <xVar> displayed at Row(), `Col() + 1`. If <cSayPicr>, the picture template for the SAY expression <cSay>, is used, all formatting rules contained will apply See the TRANSFORM I function for further information.\nIf <cGetPict> is specified, the PICTURE clause of <xVar> will be used for the GET object and all formatting rules will apply. See the table below for GET formatting rules.\nIf the WHEN clause is specified, when <lWhen> evaluates to a logical true (.T.) condition, the GET object will he activated otherwise the GET object will be skipped and no information will be obtained via the screen. The name of a user-defined function returning a logical true (.T.) or false ( F.) or a code block may be, specified in <lWhen> This clause not activated until a READ command or ReadModal() function call is issued.\nIf the VALID clause is specified and <lValid> evaluates to it logical true (.T.) condition the current GET will be considered valid and the get operation will continue onto the next active GET object. If not, the cursor will remain on this GET object until aborted or until the condition in <lValid> evaluates to true (.T.). The name of a user-defined function returning a logical true (.T.) or false (.F.) or it code block may be specified in <lValid>. This clause is not activated until a READ command or ReadModal() function call is issued.\nIf the RANGE clause is specified instead of the VALID clause, the two inclusive range values for <xVar> must be specified in <xStart> and <xEnd>. Id <xVar> is a date data type, <xStart> and <xEnd> must also be date data types; if <xVar> is a numeric data type <xStart> and <xEnd> must also be numeric data types. If a value fails the RANGE test, the message \"OUT OF RANGE\" will appear in the SCOREBOARD area (row = 0, col = 60). The RANGE message may be turned off it the `SET SCOREBOARD` command or Set() function appropriately toggled.",
				"NOTES": "GET functions/formatting rules:\n<table-noheader>\n@A          Allows only alphabetic characters.\n@B          Numbers will be left justified\n@C          All positive numbers will be followed by CR.\n@D          All dates will be in the SET DATE format.\n@E          Dates will be in British formal: numbers in European format.\n@K          Allows a suggested value to be seen within the GET\n            area but clears It if any non cursor key is pressed when\n            the cursor is in the first Position in the GET area.\n@R          Non template characters will be inserted.\n@S<nSize>   Allows horizontal scrolling of a field or variable that\n            is <nSize> characters wide.\n@X          All negative numbers will be followed by DB\n@Z          Displays zero values as blanks.\n@!          Forces uppercase lettering\n@(          Displays negative numbers in parentheses with leading spaces.\n@)          Displays negative numbers in parentheses without leading spaces.\n</table>\nGET templates/formatting rules:\n<table-noheader>\nA   Only alphabetic characters allowed.\nN   Only alphabetic and numeric characters allowed\nX   Any character allowed.\nL   Only T or F allowed For logical data.\nY   Only Y or N allowed for logical data.\n9   Only digits, including signs, will be allowed.\n#   Only digits, signs. and spaces will he allowed.\n!   Alphabetic characters are converted to Uppercase.\n$   Dollar  will be displayed in place of leading\n    spaces for numeric data types.\n*   Asterisk,, will Be displayed in place of leading spaces\n    for numeric data types.\n.   Position of decimal point.\n,   Position of comma.\n</table>\nFormat PICTURE functions may he grouped together as well as used in conjunction with a PICTURE templates; however, a blank space must be included in the PICTURE string if there are both functions and templates.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cVar := Space( 50 ), nId := 0\nLOCAL GetList := {}\nCLS\n@ 3, 1 SAY \"Name\" GET cVar PICTURE \"@!S 30\"\n@ 4, 1 SAY \"Id\"   GET nId  PICTURE \"999.999\"\nREAD\n? \"The name you entered is\", cVar\n? \"The id you entered is\", nId"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, User interface",
				"SEEALSO": "@...SAY, READ, Transform()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "@...PROMPT",
				"ONELINER": "Display a menu item on screen and define a message",
				"CATEGORY": "Command",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "@ <nRow>, <nCol> PROMPT <cPrompt> [MESSAGE <xMsg>]",
				"ARGUMENTS": "<nRow> is the row number to display the menu <cPrompt>. Value could range from zero to MaxRow().\n<nCol> is the column number to display the menu <cPrompt>. Value could range from zero to MaxCol().\n<cPrompt> is the menu item character string to display.\n<xMsg> define a message to display each time this menu item is highlighted. <xMsg> could be a character string or code block that is evaluated to a character string. If <xMsg> is not specified or of the wrong type, an empty string (\"\") would be used.",
				"DESCRIPTION": "With `@...PROMPT` you define and display a menu item, each call to `@...PROMPT` add another item to the menu, to start the menu itself you should call the __MenuTo() function (`MENU TO` command). You can define any row and column combination and they will be displayed at the order of definition. After each call to `@...PROMPT`, the cursor is placed one column to the right of the last text displayed, and Row() and Col() are updated.\n`@...PROMPT` command is preprocessed into __AtPrompt() function during compile time.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL nChoice\n// display a two line menu with status line at the bottom\n// let the user select favorite day\nSET MESSAGE TO 24 CENTER\n@ 10, 2 PROMPT \"Sunday\" MESSAGE \"This is the 1st item\"\n@ 11, 2 PROMPT \"Monday\" MESSAGE \"Now we're on the 2nd item\"\nMENU TO nChoice\nDO CASE\nCASE nChoice == 0           // user press <Esc> key\n   QUIT\nCASE nChoice == 1           // user select 1st menu item\n   ? \"Guess you don't like Mondays\"\nCASE nChoice == 2           // user select 2nd menu item\n   ? \"Just another day for some\"\nENDCASE"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, User interface",
				"SEEALSO": "AChoice(), MENU TO, SET MESSAGE, SET INTENSITY, SET WRAP, __MenuTo()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "@...SAY",
				"ONELINER": "Displays data at specified coordinates of the current device.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "@ <nRow>, <nCol> SAY <xValue> [ PICTURE <cPict> ] [COLOR <cColor>]",
				"ARGUMENTS": "<nRow>     Row coordinate\n<nCol>     Column coordinate\n<xValue>   Value to display\n<cPict>    PICTURE format\n<cColor>   Color string",
				"DESCRIPTION": "This command displays the contents of <xValue> at row column coordinates <nRow>, <nCol>. A PICTURE clause may be specified in <cPict>. If the current device is set to the printer, the output will go to the printer; the default is for all output to go to the screen.\nFor a complete list of PICTURES templates and functions, see the `@...GET` command.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "CLS\n@ 2, 1 SAY \"Harbour\"\n@ 3, 1 SAY \"is\" COLOR \"b/r+\"\n@ 4, 1 SAY \"Power\" PICTURE \"@!\""
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, User interface",
				"SEEALSO": "@...GET, SET DEVICE, Transform()"
			},
			{
				"TEMPLATE": "Command",
				"NAME": "KEYBOARD",
				"ONELINER": "Stuffs the keyboard with a string.",
				"CATEGORY": "Command",
				"SUBCATEGORY": "User interface",
				"SYNTAX": "KEYBOARD <cString>",
				"ARGUMENTS": "<cString> String to be processed, one character at a time, by the Harbour keyboard processor",
				"DESCRIPTION": "This command stuffs the input buffer with <cString>.\nThe number of characters that can be stuffed into the keyboard buffer is controlled by the SET TYPEAHEAD command and may range from 0 to 32622, with each character being in the ASCII range of 0 to 255.\nNone of the extended keys may be stuffed into the keyboard buffer.\nIssuing a `KEYBOARD \" \"` will clear the keyboard buffer.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Stuff an Enter key into the keyboard buffer\nKEYBOARD Chr( 13 )\n// Clear the keyboard buffer\nCLEAR TYPEAHEAD\n\nKEYBOARD Chr( 13 ); ? Inkey()  // --> 13\nKEYBOARD \"Hello\"; CLEAR TYPEAHEAD; ? Inkey()  // --> 0"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Command, User interface",
				"SEEALSO": "CLEAR TYPEAHEAD, __Keyboard()"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1003",
				"ONELINER": "Attempt to access non-existing or hidden variable",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified variable was not found.\nIf it is a database field ensure that the required database is open.\nIf it is a private or public variable then it must be first created using PRIVATE or PUBLIC statement.",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1068",
				"ONELINER": "Bound error in array access",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The attempt to retrieve data from non-array value.",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1069",
				"ONELINER": "Bound error in array access",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The attempt to set data to non-array value.",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1070",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The type of compared arguments do not match.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"a\" == 0"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1072",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The type of compared arguments do not match.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"a\" != 0"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1073",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The type of compared argument do not match.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"a\" < 0"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1074",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The type of compared arguments do not match.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"a\" <= 0"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1075",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The type of compared arguments do not match.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"a\" > 0"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1076",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The type of compared arguments do not match.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"a\" >= 0"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1077",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "Operation is not allowed for passed argument. The argument is not a logical value.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? ! \"a\""
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1078",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The type of one or both arguments is not a logical.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n.AND."
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1079",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The type of one or both arguments is not a logical.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n.OR."
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1081",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The plus operation is not allowed for used arguments.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "+"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1082",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The minus operation is not allowed for used arguments.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? \"a\" - 1"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1085",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Mod()"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1086",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The value of argument cannot be incremented.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL cVar := \"a\"\ncVar++"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1089",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Abs( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1090",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Int( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1092",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Min( \"a\", \"b\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1093",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Max( \"a\", \"b\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1094",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Round( \"a\", 0 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1095",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Log( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1096",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Exp( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1097",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not an numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Sqrt( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1098",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not a string value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Val( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1099",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is not a numeric value",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Str( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1100",
				"ONELINER": "Incorrect type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified argument is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "RTrim( 1 )\nTrim( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1101",
				"ONELINER": "Incorrect type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified argument is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LTrim( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1102",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The first argument passed to a function is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Upper( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1103",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The first argument passed to a function is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Lower( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1104",
				"ONELINER": "Incorrect type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified argument is not a numeric value.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Chr( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1105",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The arguments passed to a function are of incorrect type.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Space( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1106",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The arguments passed to a function are of incorrect type.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Replicate( 1, \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1107",
				"ONELINER": "Incorrect type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified argument is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Asc( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1108",
				"ONELINER": "Incorrect type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified argument is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "At( 1, \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1109",
				"ONELINER": "Invalid type of arguments",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The arguments of '$' operator are not a strings.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "? 1 $ \"a\""
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1110",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The first argument passed to a function is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "SubStr( 1, 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1111",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The passed argument is neither a string nor an array.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Len( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1112",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function are of incorrect type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Year( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1113",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function are of incorrect type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Month( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1114",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function are of incorrect type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Day( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1115",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function are of incorrect type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "DoW( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1116",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function are of incorrect type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "CMonth( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1117",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is of incorrect type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "CDoW( \"a\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1120",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is of incorrect type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "DToS( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1122",
				"ONELINER": "Incorrect type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The argument (or arguments) passed to a function is of incorrect type",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Transform( \"a\", 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1124",
				"ONELINER": "Incorrect type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The first argument is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Left( 1, 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1126",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The first arguments passed to a function is not a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "StrTran( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1132",
				"ONELINER": "Bound error in array access",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified index into an array was greater then the number of elements in the array.",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/1133",
				"ONELINER": "Bound error in array element assignment",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified index into an array was greater then the number of elements in the array.",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/2010",
				"ONELINER": "Incorrect arguments type",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "Passed Runtime errors was not strings with file names to copy.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__CopyFile( 1, 2 )"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/2012",
				"ONELINER": "File error",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "An error has occurred during the attempt to open, create or write during copy operation",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__CopyFile( \"<nothere>\", \"test.txt\" )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/2017",
				"ONELINER": "Invalid argument passed to a function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The first argument is not an array or/and the second argument is not a code block",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "AEval( 1 )"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/2020",
				"ONELINER": "Invalid argument passed to function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The passed value is negative. Only values > 0 are allowed.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// SET DECIMALS\n// SET EPOCH\n// SET MARGIN\n// SET MESSAGE"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3001",
				"ONELINER": "Incorrect argument type",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The passed argument is not an object. Only data of type OBJECT can be cloned by this function",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__objClone( 1 )"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3002",
				"ONELINER": "Super class does not return an object",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "Passed argument is not a name of defined class or specified class doesn't have a super class",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n__clsInstSuper()"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3003",
				"ONELINER": "Cannot find super class",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "Passed argument is not a name of defined class",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__clsInstSuper()"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3004",
				"ONELINER": "Cannot modify a DATA item in a class",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The attempt to modify a data member of a class was made. Only INLINE and METHOD can be modified",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\n__clsModMsg()"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3005",
				"ONELINER": "Incorrect arguments type",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "Either the first argument was not an object or the second argument wasn't a string.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__clsAssocType( 1, 1 )"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3007",
				"ONELINER": "Invalid type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The passed arguments are causing conflict in handling of the request. There is no point in waiting forever for no input events!",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// FIXME\nInkey()"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3008",
				"ONELINER": "Invalid type of argument",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The passed argument(s) is not a string. It should be a string with a variable name or an one-dimensional array of strings.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__mvPrivate( 1 )\n__mvPublic( 1 )"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3009",
				"ONELINER": "Incorrect argument passed to __mvGet() function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "__mvGet() function expects only one argument: a string with a name of variable. The value of this variable will be returned.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__mvGet( 1 )"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3010",
				"ONELINER": "Incorrect argument passed to __mvPut() function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "__mvPut() function expects at least one argument: a string with a name of variable. The value of this variable will be set.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "__mvPut( 1 )"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3012",
				"ONELINER": "Invalid argument passed to a function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The first argument is not a string with function/procedure name that should be called.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "Do( 1 )"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3101",
				"ONELINER": "Invalid argument passed to an object/class function",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "One passed argument is not of the required type.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// __obj*()"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3102",
				"ONELINER": "A symbol should be modified or deleted from a class, but the symbol doesn't exist.",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "A symbol should be modified or deleted from a class, but the symbol doesn't exist.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// __obj*()"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE BASE/3103",
				"ONELINER": "A symbol should be added to a class, but the symbol already exists.",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "A symbol should be added to a class, but the symbol already exists.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// __obj*()"
				},
				"COMPLIANCE": "Harbour specific",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Runtime error",
				"NAME": "RTE TERM/2013",
				"ONELINER": "Create error",
				"CATEGORY": "Runtime errors",
				"DESCRIPTION": "The specified file cannot be created due some OS error.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// Set()\n// SET ALTERNATE TO"
				},
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "Runtime errors"
			},
			{
				"TEMPLATE": "Statement",
				"NAME": "FIELD",
				"ONELINER": "Declares a list of database field names.",
				"CATEGORY": "Statement",
				"SUBCATEGORY": "RDD",
				"SYNTAX": "FIELD <xField> [, <xFieldn...> [IN <cDatabase>]",
				"ARGUMENTS": "<xField>    A valid field name\n<xFieldn>   Additional field name\n<cDatabase> An valid alias name",
				"DESCRIPTION": "This command declares the names of fields <xField> (and <xFieldn> and following) with an optional alias identifier as <cDatabase> for each. This command allow  Harbour to resolve any reference to a field specified in the field list by viewing it as a field when it is not referenced by an alias. If a field is not listed in this list and it is not  explicitly tagged with an alias identifier, it may be viewed as a memory variable, which may cause run-time errors. This command has no effect on memory variables or on field reference buried within a macro expression.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "FIELD first\nFIELD age\nUSE test NEW\nfirst := \"FirstName\"\nage := 25"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "None.",
				"TAGS": "Statement, RDD",
				"SEEALSO": "MEMVAR, PRIVATE, PUBLIC, STATIC"
			},
			{
				"TEMPLATE": "Statement",
				"NAME": "LOCAL",
				"ONELINER": "Initializes a local memory variable or array",
				"CATEGORY": "Statement",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "LOCAL <xVar> [:= <xInit> ]",
				"ARGUMENTS": "<xVar>    Name of a memory variable or array.\n<xInit>   Value to be assigned to a variable or array",
				"DESCRIPTION": "This command created a LOCAL memory variable or array. The name of either is specified in <xVar>. If more then one variable is being initialized with the LOCAL command, separate each entry with a comma. If a variable or an array is to be assigned a start-up value, that expression may be specified in <xInit> and following. Is Strong type compile mode is used, the Compiler will check if the value received matches the type specified in <xType>.\nLOCAL variables are symbols generated at run time and are resolved at compile time. The visibility and life span of a LOCAL variable or array is limited to the function or procedure in which it is defined.\nNo macro expansions are allowed in the LOCAL declaration statement.\nNo Harbour command other then FUNCTION, PROCEDURE, PUBLIC, PRIVATE, PARAMETERS, MEMVAR, STATIC and FIELD, may precede the LOCAL command.\nLOCAL array reference may not be initialized (i.e., assigned values) on the same command-line as the LOCAL command statement. This can be done later in the program.\nLOCAL variables and arrays are not affected by the RELEASE command.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL n, lVar := .T.\n\nn := iif( lVar, \"A\", 3 )\nn := 2\nn := \"a\"\nn := Seconds() + 2\nn := Int( Seconds() + 2 )"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "None",
				"TAGS": "Statement, Variable management",
				"SEEALSO": "FIELD, PRIVATE, PUBLIC, STATIC, MEMVAR"
			},
			{
				"TEMPLATE": "Statement",
				"NAME": "MEMVAR",
				"ONELINER": "Declares private and public variables and arrays.",
				"CATEGORY": "Statement",
				"SUBCATEGORY": "Variable management",
				"SYNTAX": "MEMVAR <xVar>",
				"ARGUMENTS": "<xVar> Memory variable Name",
				"DESCRIPTION": "This command tells the compiler to resolve any reference to a memory variable designated within this list s if it possessed an explicit memory variable alias with either the `M->` or `MEMVAR->` prefix. Only those memory variables that do not contain any such explicit are affected by this command. Those memory variables within macro expansions are not affected by this command.\nThe MEMVAR declaration must appear before any executable commands; it is similar to the LOCAL, STATIC, FIELD, PARAMETERS, FUNCTION, and PROCEDURE commands statements.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "MEMVAR y AS NUMERIC\n\nLOCAL n, lVar := .T.\n\nn := iif( lVar, \"A\", 3 )\nn := 2\nn := \"a\"\nn := Seconds() + 2\nn := Int( Seconds() + 2 )\ny := n\n\n? y"
				},
				"STATUS": "Ready",
				"COMPLIANCE": "CA-Cl*pper v5.x compatible",
				"PLATFORMS": "Available on all platforms",
				"FILES": "None.",
				"TAGS": "Statement, Variable management",
				"SEEALSO": "LOCAL, STATIC, FIELD, PRIVATE, PUBLIC"
			},
			{
				"TEMPLATE": "Class",
				"NAME": "TBrowseNew()",
				"ONELINER": "Create a Browse Object",
				"CATEGORY": "TBrowse class",
				"SYNTAX": "TBrowseNew( <nTop>, <nLeft>, <nBottom>, <nRight> ) --> oBrowse",
				"ARGUMENTS": "<nTop>    Top Row\n<nLeft>   Top Left Column\n<nBottom> Bottom Row\n<nRight>  Bottom Right Column",
				"RETURNS": "<oBrowse>  An new Browse Object",
				"DESCRIPTION": "This function set up a browsing window at top-left coordinates of <nTop>, <nLeft> to bottom-right coordinates of <nBottom>, <nRight>. To browse Database files use TBrowseDB() function instead.",
				"DATANOLINK": "`:aColumns`       Array to hold all browse columns\n`:autoLite`       Logical value to control highlighting\n`:cargo`          User-definable variable\n`:colorSpec`      Color table for the TBrowse display\n`:colPos`         Current cursor column position\n`:colSep`         Column separator character\n`:footSep`        Footing separator character\n`:freeze`         Number of columns to freeze\n`:goBottomBlock`  Code block executed by `TBrowse:goBottom()`\n`:goTopBlock`     Code block executed by `TBrowse:goTop()`\n`:headSep`        Heading separator character\n`:hitBottom`      Indicates the end of available data\n`:hitTop`         Indicates the beginning of available data\n`:leftVisible`    Indicates position of leftmost unfrozen column in display\n`:nBottom`        Bottom row number for the TBrowse display\n`:nLeft`          Leftmost column for the TBrowse display\n`:nRight`         Rightmost column for the TBrowse display\n`:nTop`           Top row number for the TBrowse display\n`:rightVisible`   Indicates position of rightmost unfrozen column in display\n`:rowCount`       Number of visible data rows in the TBrowse display\n`:rowPos`         Current cursor row position\n`:skipBlock`      Code block used to reposition data source\n`:stable`         Indicates if the TBrowse object is stable\n`:aRedraw`        Array of logical items indicating, is appropriate row need to be redraw\n`:RelativePos`    Indicates record position relatively position of first record on the screen\n`:lHeaders`       Internal variable which indicates whether there are column footers to paint\n`:lFooters`       Internal variable which indicates whether there are column footers to paint\n`:aRect`          The rectangle specified with `:ColorRect()`\n`:aRectColor`     The color positions to use in the rectangle specified with `:ColorRect()`\n`:aKeys`        Holds the Default movement keys",
				"METHODSLINK": "`:AddColumn()` Adds an new TBColumn object to the current Browse\n`:Applykey()`  Perform the Browse Key movement\n`:SetKey()`    Add an New key to the Keyboard dictionary",
				"METHODSNOLINK": "`:New( nTop, nLeft, nBottom, nRight )`  Create an new Browse class and set the default values\n`:Down()`       Moves the cursor down one row\n`:End()`        Moves the cursor to the rightmost visible data column\n`:GoBottom()`   Repositions the data source to the bottom of file\n`:GoTop()`      Repositions the data source to the top of file\n`:Home()`       Moves the cursor to the leftmost visible data column\n`:Left()`       Moves the cursor left one column\n`:PageDown()`   Repositions the data source downward\n`:PageUp()`     Repositions the data source upward\n`:PanEnd()`     Moves the cursor to the rightmost data column\n`:PanHome()`    Moves the cursor to the leftmost visible data column\n`:PanLeft()`    Pans left without changing the cursor position\n`:PanRight()`   Pans right without changing the cursor position\n`:Right()`      Moves the cursor right one column\n`:Up()`         Moves the cursor up one row\n`:ColCount()`    Return the Current number of Columns\n`:ColorRect()`   Alters the color of a rectangular group of cells\n`:ColWidth( nColumn )`  Returns the display width of a particular column\n`:Configure( nMode )`   Reconfigures the internal settings of the TBrowse() object <nMode> is an undocumented parameter in CA-Cl*pper\n`:LeftDetermine()`      Determine leftmost unfrozen column in display\n`:DeHilite()`           Dehighlights the current cell\n`:DelColumn( nPos )`    Delete a column object from a browse\n`:ForceStable()`        Performs a full stabilization\n`:GetColumn( nColumn )` Gets a specific TBColumn() object\n`:Hilite()`             Highlights the current cell\n`:InsColumn( nPos, oCol )`   Insert a column object in a browse\n`:Invalidate()`        Forces entire redraw during next stabilization\n`:RefreshAll()`        Causes all data to be recalculated during the next stabilize\n`:RefreshCurrent()`    Causes the current row to be refilled and repainted on next stabilize\n`:SetColumn( nColumn, oCol )`   Replaces one TBColumn() object with another\n`:Stabilize()`          Performs incremental stabilization\n`:DispCell( nColumn, cColor )`  Displays a single cell",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "// See tests/tbrowse.prg"
				},
				"STATUS": "Started",
				"COMPLIANCE": "This functions is Compatible with CA-Cl*pper 5.2. The `:applykey()` and `:SetKey()` methods are only visible if HB_COMPAT_C53 is defined.",
				"PLATFORMS": "Available on all platforms",
				"FILES": "Library is core",
				"TAGS": "TBrowse class",
				"SEEALSO": "TBrowseNew(), TBColumnNew()"
			},
			{
				"TEMPLATE": "Class",
				"NAME": "TBrowse():AddColumn()",
				"ONELINER": "Add an New Column to an TBrowse Object",
				"CATEGORY": "TBrowse Method",
				"SYNTAX": ":AddColumn( <oCol> ) --> Self",
				"ARGUMENTS": "<oCol>  Is an TbColumn object",
				"RETURNS": "<Self>  The Current object",
				"DESCRIPTION": "This method add an new column object specified as <oCol> to the assigned browsing object.",
				"PLATFORMS": "Available on all platforms",
				"TAGS": "TBrowse Method"
			},
			{
				"TEMPLATE": "Class",
				"NAME": "TBrowse():ApplyKey()",
				"ONELINER": "Evaluates an code block associated with an specific key",
				"CATEGORY": "TBrowse Method",
				"SYNTAX": ":ApplyKey( <nKey> ) --> nResult",
				"ARGUMENTS": "<nKey>      An valid Inkey code",
				"RETURNS": "<nResult>   Value returned from the evaluated Code Block See Table Below\n<table>\n Value    Meaning\n -1       User request for the browse lost input focus\n 0        Code block associated with <nkey> was evaluated\n 1        Unable to locate <nKey> in the dictionary, Key was not processed\n</table>",
				"DESCRIPTION": "This method evaluate an code block associated with <nkey> that is contained in the TBrowse:SetKey() dictionary.",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "LOCAL oTb := TBrowseNew( 0, 0, 10, 20 )\nDO WHILE .T.\n   oTb:forceStable()\n   IF oTb:applykey( Inkey( 0 ) ) == -1\n      EXIT\n   ENDIF\nENDDO"
				},
				"PLATFORMS": "Available on all platforms",
				"TAGS": "TBrowse Method"
			},
			{
				"TEMPLATE": "Class",
				"NAME": "TBrowse():SetKey()",
				"ONELINER": "Get an optionally Set an new Code block associated to a inkey value",
				"CATEGORY": "TBrowse Method",
				"SYNTAX": ":SetKey( <nKey>[, <bBlock>] ) --> bOldBlock",
				"ARGUMENTS": "<nKey> An valid inkey Code\n<bBlock>  An optional action to associate to the inkey value.",
				"RETURNS": "<bOldBlock>  If a key-press has it code block changes, it will return the previous one; otherwise, it will return the current one",
				"DESCRIPTION": "This method Get an optionally set an code block that is associated to an inkey value. The table below show the default key-press/Code Block definitions\n<table>\n Inkey Value    Code Block\n K_DOWN         {| oB, nKey | oB:Down(), 0 }\n K_END          {| oB, nKey | oB:End(), 0 }\n K_CTRL_PGDN    {| oB, nKey | oB:GoBottom(), 0 }\n K_CTRL_PGUP    {| oB, nKey | oB:GoTop(), 0 }\n K_HOME         {| oB, nKey | oB:Home(), 0 }\n K_LEFT         {| oB, nKey | oB:Left(), 0 }\n K_PGDN         {| oB, nKey | oB:PageDown(), 0 }\n K_PGUP         {| oB, nKey | oB:PageUp(), 0 }\n K_CTRL_END     {| oB, nKey | oB:PanEnd(), 0 }\n K_CTRL_HOME    {| oB, nKey | oB:PanHome(), 0 }\n K_CTRL_LEFT    {| oB, nKey | oB:PanLeft(), 0 }\n K_CTRL_RIGHT   {| oB, nKey | oB:PanRight(), 0 }\n K_RIGHT        {| oB, nKey | oB:Right(), 0 }\n K_UP           {| oB, nKey | oB:Up(), 0 }\n K_ESC          {| oB, nKey | -1 }\n</table>\nThe keys handlers can be queried, added and replace an removed from the internal keyboard dictionary. See the example.\n```\noTb:SetKey( K_TAB, {| oTb, nKey | -1 } )\n```\n An default key handler can be declared by specifying a value of 0 for <nKey>. It associate code block will be evaluated each time TBrowse:Applykey() is called  with an key value that is not contained in the dictionary. For example\n```\noTb:SetKey( 0, {| oTb, nKey | DefKeyHandler( oTb, nkey } )\n```\n This call the a function named DefKeyHandler() when <nKey> is not contained in the dictionary.\nTo remove an key-press/code block definition, specify NIL for <bBlock>\n```\noTb:SetKey( K_ESC, NIL )\n```",
				"EXAMPLES": {
					"_preformatted": "yes",
					"__text": "#include \"inkey.ch\"\nLOCAL oTb := TBrowseNew( 0, 0, 10, 20 )\noTb:SetKey( K_F10, {| oTb, nkey | ShowListByname( oTb ) } )"
				},
				"PLATFORMS": "Available on all platforms",
				"TAGS": "TBrowse Method"
			}
		]
	}
}