Added some C code to speed up the array sort during startup.

---

Click! can now incorporate a Table and Index cross reference into each
source module header, and can create the list of all modules using files
and indexes.

The following CLICK.INI entries control this behaviour.

TABLE_XREF_FILE=TBL_CROS.TXT

// options are YES, NO
// please note that you must set ADD_CLICK_HEADERS=YES
TABLE_XREF_INTO_SOURCE=YES

// options are YES, NO
// please note that you must set ADD_CLICK_HEADERS=YES
INDEX_XREF_INTO_SOURCE=YES

---

Click! now recognizes when a Clipper FUNCTION or COMMAND is being used
as something other than a function or command.

New rules are:

If a Clipper function is not followed by a (, then it not evaluated as a
Clipper function.

/*
I suppose that means I should convert:
DO SOMEFUNC with a, b, c
...to...
SOMEFUNC( a, b, c )
...in PASS 1
*/

If a Clipper command is found within () or {} or [], then it not
evaluated as a Clipper command.

This will allow code like ...

#define TOP a[1]
#define LEFT a[2]
#define BOTTOM a[3]
#define RIGHT a[4]

aadd(envSTAck_, { row(), col(), setcursor(curs_size), setcolor(newcolor), ;
if(valtype(coords) == "A", { TOP, LEFT, BOTTOM, RIGHT, ;
savescreen(TOP, LEFT, BOTTOM, RIGHT) }, NIL) } )

... to continue to work, even though I find using reserved words as
variables or manifest constants an undesirable style ...

Also, prequalifying what can't be a function or a command has led to a
significant reduction in processing time!

---

The Aligner now recognize and align arrays destined for DBCREATE(),
so that code like...

somevar := {{ 'XXX', 'C', 123, 0 },;
{ 'YYYYY', 'C', 99, 0 },;
{'Z','D',8,0},;
{ 'AFIELD', 'C', 2, 0 } }

... ends up looking like ...

somevar := { { 'XXX' , 'C', 123, 0 }, ;
{ 'YYYYY' , 'C', 99, 0 }, ;
{ 'Z' , 'D', 8, 0 }, ;
{ 'AFIELD', 'C', 2, 0 } }

---

Click! now understands when [ and ] are being used as string delimiters.

So...

x := [asdfasdf'"asdf]
? [this works'"]
x := somefunc( [this works, too] )

...will all be recognized as a string being delimited by [].

---

Click! can now convert && to // when found as a comment marker.

( in CLICK.INI )
CONVERT_&&_TO_//=YES

So...

if x && test
...becomes...
if x // test

...but...

if x &&&&&&&& test
...becomes...
if x //&&&&&& test

---

STORE conversion modified to eliminate this...

for L_count = 1 to 5
store " " to Em_Benefit[L_count,1]
store 0.00 to Em_Benefit[L_count,2]
next

from becoming ...

for L_count = 1 to 5
Em_Benefit[ L_count := 1 ] := " "
Em_Benefit[ L_count := 2 ] := 0.00
next

Now, it correctly identifies internal commas and processes like:

for L_count = 1 to 5
Em_Benefit[ L_count, 1 ] := " "
Em_Benefit[ L_count, 2 ] := 0.00
next

---

Click! has an option to end it's run by returning to DOS with the
original screen and color setting, pausing for a keystroke to end the
run.

RESTORE_SCREEN_ON_EXIT=YES