Version 2.43

04-15-93

Bumped up the version number because it's been a while since I last
changed it.

Starting with this version MarxMenu stores it's serial number
information in the Bindery as well as the MARXMENU.EXE file. Thus when
you get a new version of MarxMenu it will serialize itself the first
time you run it. This makes updates easier.


04-16-93

BiosDate : String
Returns the date of the rom Bios.


04-18-93
MarxMenu is now more Windows aware. When running MarxMenu under Windows
the TaskNumber variable reads the Virtual Machine ID. Thus MarxMenu no
longer requires that you set a TASK= environment variable under windows.


DriveType (Drive) : String
DriveType returns the type of drive of a given drive letter. This is
like DiskType with the exception of how it deals with floppy drives.
DiskType actually tries to read the floppy so if you put a 720k disk in
a 1.4 meg drive then DiskType will return 720. DriveType returns the
type of drive the CMOS is configured for.


PcType : String
PcType returns the type of computer you are running as a string. Types
include: PC, XT, AT, PS2.


CpuName : String
Returns the name of the CPU. CPU names include:

  8088, 8086, V20 ,V30, 80188, 80186, 80286,
  80386, 80386SX, 80486, 80486SX


McpClass : Number
Returns the math coprocessor class.

 0 = None
 1 = 8078
 2 = 80287
 3 = 80387
 4 = 80487 (486 CPU)


McpName : String
Returns the name of the marh coprocessor. If there is no math
coprocessor then an empty string is returned. Names include:

  8087, 80287, 80387, 80487


EmsInstalled : Boolean
Returns True if EMS memory manager is installed.


EmsVersion : String
EmsVersion returns the version of the EMS driver you are using. If EMS
isn't present it returns an empty string.


XmsInstalled : Boolean
Returns True if XMS memory manager is installed.


XmsVersion : String
XmsVersion returns the version of the XMS driver you are using. If XMS
isn't present it returns an empty string.


VCPIInstalled : Boolean
Returns True if VCPI services are installed.


VCPIVersion : String
VCPIVersion returns the version of the VCPI driver you are using. If
VCPI isn't present it returns an empty string.


DPMIInstalled : Boolean
Returns True if DPMI services are installed.


DPMIVersion : String
DPMIVersion returns the version of the DPMI driver you are using. If
DPMI isn't present it returns an empty string.


MouseVersion : String
MouseVersion returns the version of the mouse driver you are using. If a
mouse driver isn't present it returns an empty string.


MouseIRQ : Number
Returns the interrupt number that the mouse driver is using.


MouseType : String
Reurns the type of mouse being used. If a mouse driver isn't present it
returns an empty string.

 Mouse Types: BUS, SERIAL, HP, INPORT, PS2, UNKNOWN


04-21-93

ComNewLineProgram : Procedure
ComNewLineProgram is a procedure variable that if set to point to a
procedure is executed every time a new line is received at the modem.

 Example:
   ComNewLineProgram = Loc ExamineLastLine

   Procedure ExamineLastLine
   var St P
      P = pos('Time Sync:',ComLastLine)
      if P = 0 then Return
      St = mid(ComLastLine,P + 11,17)    ;read Date and Time
      NovServerTime = TimeOf(St)
   EndProc

In this example, ExamineLastLine is executed once each new line and is
scaned for the word "Time Sync:". If the word is found it sets the
server time to the value following that word.


04-23-93

NovChangeObjPassword (Obj, Type, OldPassword, NewPassword)
NovChangeObjPassword is like NovChangePassword except it allows you to
change the password on other objects than yourself. Type refers to the
object type. Users are type 1.

 Example:
    NovChangeObjPassword('DAN',1,'POTATOE','POTATO')


05-06-93

ClearKbdBuffer
ClearKbdBuffer clears the characters out of the keyboard buffer.


05-18-93

Overlayed : Boolean
Overalyed returns true if menu is loaded as an overlay.


05-25-93

I've expanded the use of the word Trim. Besides trimming the blanks from
the ends of strings it will also trim blank lines from the ends of
arrays.


05-28-93

Local : Array
Parameters passed to procedures and local variables in a procedure are
elements of an array of local variables. By using the word Local you can
address passed parameters and local variables as if they were elements
of an array.

 Example:
   Procedure Test (A,B)
   var C,D
      Writeln A B C D
   EndProc

In the above example the variable A is the same as Local[1], B is
Local[2], C is Local[3], and D is Local[4]. The Local command can be
used to pass a varying number of parameters to a procedure as follows:

 Example:
   Procedure Test
      Loop Local
         Writeln Local[LoopIndex]
      endloop
   EndProc

   Test (1,2,3,4)

This allows the procedure Test to accept and process any number of
parameters you wish to pass to it.

===============================================================

Version 2.44

06-21-93

I've changed the semaphores to work with TSRs in upper memory. You no
longer need a TSR in low memory for semaphores to live. This improves
software metering.


TSRs (Array)
TSRs returns a list of all TSRs in memory as well as the names of
pending batch files.

 Example:
   var TsrList
   TSRs(TsrList)
   Loop TsrList
      Writeln TsrList[LoopIndex]
   EndLoop


InMem (TsrName) : Boolean
Inmem returns true if the TSR you are looking for is loaded. This allow
you to do conditionals based on the presence or absence of a TSR. It
will also check for the names of pending batch files.

 Example:
   if not InMem('BTRIEVE')
      Bat 'BTRIEVE.EXE'
   endif


MemoryLoc (TsrName) : Number
MemoryLoc returns the memory segment address of the TSR name you
specify. If the TSR isn't in memory it returns a 0.

 Example:
   Writeln 'Btrieve is at $' HexString(MemoryLoc('BTRIEVE'),4)


07-16-93

Well, I'm now jumping into the VLM stuff and making MarxMenu Netware 4
smart. Here's what I have so far. I still don't consider netware 4 to be
done yet, but it's getting at least close enough to start developing
for. Since this involves a lot of changes it's likely that I might have
broken a command or two. If you find something that doesn't work, let me
know about it.


VlmLoaded : Boolean
Returns true if the VLM shell is loaded.


NovConTableSize : Number
NovConTableSize returns the maximum number of servers the shell can
connect to. In the past using the NETX shells this has been 8. But the
new shells can be set to different values.


07-20-93

NovFirstNetworkDrive : String
NovFirstNetworkDrive returns the drive letter of the first network drive
on a Novell network.


07-27-93

The NovFullName command is now writeable.
  Example:
  NovFullName ('RNOORDA') = 'Ray Noorda'


NovManager (UserName) : Boolean
Returns True if the user has workgroup manager priveledges. If UserName
isn't specified then the current user is assumed.

 Example:
   if NovManager ('FRED') then Writeln 'Fred is a Manager'
   if NovManager then Writeln 'I am a Manager'


NovMaxUserConnections (UserName) : Number
Returns the maximum number of connections that a user is limited to. A
zero means unlimited connections. If UserName isn't specified then the
current user is assumed. You can also use this command to set the limit.

 Example:
   Writeln NovMaxConnection ('FRED')    ; Fred's Limit
   Writeln NovMaxConnection             ; My Limit
   NovMaxConnections ('BARNEY') = 5     ; Set Barney's limit to 5


NovSpaceUsed (UserName,Volume) : Number
NovSpaceUsed returns the total disk space in use by the user on the
specified volume.

 Example:
   Writeln NovSpaceUsed ('BILL','F:')   ; Bill's disk space on F:

NovSpaceLimit (UserName, Volume) : Number
NovSpaceLimit returns the disk space limit for the user on the specified
volume. You can also use this command to set the limit.

 Example:
   Writeln NovSpaceLimit ('BILL','F:')     ; Bill's space limit on F:
   NovSpaceLimit ('BILL','SYS:') = 2000000 ; Limits Bill's space


NovSerialNumber : String
NovSerialNumber returns the current server serial number as a string.

 Example:
   Writeln NovSerialNumber


NovUserFiles (UserName,Volume) : Number
NovUserFiles returns the number of files on the volume that are owned by
the user. This commamd takes a while to run. Expect delays from a few
seconds to several minutes.

 Example:
   Writeln NovUserFiles ('PETE','SYS:')


NovUserDirectories (UserName,Volume) : Number
NovUserDirectories returns the number of directories on the volume that
are owned by the user. This commamd takes a while to run. Expect delays
from a few seconds to several minutes.

 Example:
   Writeln NovUserDirectories ('PETE','F:')

===============================================================

Version 2.45

08-09-93

I bumped up the version number so that this can be the first official
VLM shell version.

I've enhanced the compilers ability to deal with conditionals. You can
now use the following syntax:

 if <condition> then <statement> else <statement>

This will work if the statements a single statements. Also:

 Repeat <Statement>
 Until <Condition>

or

 Repeat <Statement> Until <Condition>

have been added. Before you had to put Repeat on a line by itself.


The command ExitMenu can now take a command line which tells MarxMenu to
run this one line and then don't come back to the menu.

Example:
  ExitMenu 'DIR /W'


I made a change in the MXSTOP.BAT file. MarxMenu no longer deletes the
temporary batch file itself when exiting the menu. MarxMenu sets an
environment variable DELBAT to the name of the temporary batch file. The
MXSTOP.BAT file actually deletes it. You will want to run MARXMENU INST
to create a new MXSTOP.BAT file.


I added logic into MarxMenu to automatically process environment
variable referrences within filenames. Thus:

 F:\HOME\%USERNAME%\WINDOWS becomes F:\HOME\MARC\WINDOWS

This logic works with all commands that use file names.


New Commands:

LoopVal
LoopVal returns the current variable in a Loop EndLoop when the loop is
started using an array.

 Example:
   var X
   ReadDirectory X
   Loop X
      LoopVal = CleanFileName LoopVal
      Writeln LoopVal
   EndLoop

LoopVal can be read or written to. It can be indexed or used with
qualifiers. Any function that can be used with variables can be used
with LoopVal. With nested loops, LoopVal always references the innermost
loop.


EnvExpandString (String) : String
EnvExpandString will take a string that has environment variable
referrences in it and substitute the environment variable for that part
of the string.

 Example:
   Writeln EnvExpandString 'F:\HOME\%USERNAME%\WINDOWS'
   ; returns F:\HOME\MARC\WINDOWS


08-13-93

NovSemaphoreInfo (2DArray,Commection)
NovSemaphoreInfo reads the semaphore information of a connection number.
It returns a two dimensional array of the semaphore names, open count,
value, and task number.

 Example:
   Var Sem
   Qualifier Name, OpenCount, Val, Task
   NovConSemaphoreInfo(Sem,9)
   Loop Sem
      Write   LoopVal.Name ' ' LoopVal.OpenCount ' '
      Writeln LoopVal.Val ' ' LoopVal.Task
   EndLoop


NovLoginTime (Connection)
Returns the login time of a specific connection. If the connection
number isn't specified then the current connection is assumed.

 Example:
   var X
   X = NovLoginTime
   Writeln DateString(X) ' ' TimeString(X)


NovServDescription (Array)
NovServDescription returns an array of strings that contain the novell
file server description,

 Example:
   var Des
   NovServDescription(Des)
   Loop Des
      Writeln LoopVal
   EndLoop


NovConUsingAFile (Array,FileName)
NovConUsingAFile creates an array with a list of connection numbers that
have a file open.

 Example:
   ;WhoHas program in MarxMenu
   var ConnectionList
   NovConUsingAFile(ConnectionList,ParamStr(2))
   Loop ConnectionList
      Writeln NovLoginName(LoopVal) ' [' LoopVal ']'
   EndLoop


NovDiskSpaceFromDel (Path) : Number
NovDiskSpaceFromDel returns the amount of disk space that is used by
deleted files and is available for reuse.

 Example:
    Writeln NovDiskSpaceFromDel 'F:'


NovDiskSpaceFromDelNA (Path) : Number
NovDiskSpaceFromDelNA returns the amount of disk space that is used by
deleted files and is not yet available for reuse.

 Example:
    Writeln NovDiskSpaceFromDelNA 'F:'


CommaString (String) : String
CommaString takes a string that represents a number and adds commas
every three characters. If you pass it a number it will convert it to a
string and then add the commas.

 Example:
    Writeln CommaString ('12345')     ; returns 12,345
    Writeln CommaString (45 * 75)     ; returns 3,375


LongestString (Array) : Number
LongestString returns the length of the longest string in an array of
strings.

 Example:
   var X
   ReadTextFile('MARX.BAT',X)
   Writeln LongestString (X)


AmPm : Boolean
When AmPm is set true the TimeString function returns AmPm time format.

 Example:
    AmPm On
    Writeln TimeString(Now)  ; returns 10:13:34 am


08-18-93

NovConLoggedIn (Array)
NovConLoggedIn returns an array of connection numbers that have someone
logged in.

 Example:
   var Connections
   NovConLoggedIn(Connections)
   Loop Connection
      Writeln LoopVal
   EndLoop


NovMaxConnectionsUsed : Number
Returns the maximum number of connection used on the server. If you're
hunting through connection numbers you can use this value as a maximum
instead of NovMaxConnections to reduce the number of connections you
have to deal with.


NovShowNotLoggedIn : Boolean
NovShowNotLoggedIn is used with NovUsersLoggedIn and NovConLoggedIn.
Normally users who are connected but not logged in are filtered out buy
MarxMenu. But if you set NovShowNotLoggedIn to True, then NOT-LOGGED-IN
will be included in the list.


09-08-93

Forever
Forever is part of a loop Repeat -- Forever. Forever is an unconditional
jump to Repeat.

 Example:
   Repeat
      [statement]
      [statement]
   Forever


ComWriteRecChar (On/Off)
If ComWriteRecChar is set to On then any characters comming in the
serial port will be written to the screen. In a terminal program you
would typically turn ComWriteRecChar and ComSendKbdChar both on.


ComSendKbdChar (On/Off)
If ComSendKbdChar is set to On then any characters typed at the keyboard
will be sent out the serial port. In a terminal program you would
typically turn ComWriteRecChar and ComSendKbdChar both on.


ComLocalInput (On/Off)
If ComLocalInput is set to On then keys typed at the keyboard will be
treated as if they came in over the serial port. This allows a host
program like a BBS to be run from the local console as if the user were
typing in characters.


ComCheckActivity
ComCheckActivity will check the serial ports and keyboard and route
characters if anything needs to be routed. It is typically used in the
main process loop of communication programs to make it run fast.


ComZRecover (On/Off)
If ComZRecover is set to On then if you retry an aborted ZModem download
it will resume at the point where it was aborted.


ComFullFileName : String
Returns the full file name of the file that is currently being
transmitted.


09-20-93

UpperCaseCompare (On/Off)
When UpperCaseCompare is set to On, all string commands that compare
strings are case insensitive.

 Example:
   UpperCaseCompare On
   Writeln 'ABC' = 'abc'   ; returns true

The commands this affects include all comparison operators, Pos,
PosInList, and PosInSortedList.


PosInListPartial (String,Array) : Number
PosInListPartial is similar to the PosInList command. It searches a
string array for a matching string and returns the line number of the
first match. Unlike PosInList which compares the whole string,
PosInListPartial will find the first string that contains the search
string.

 Example:
   var List
   List[1] = 'Date=09-20-93'
   List[2] = 'Time=10:18'
   List[3] = 'Name=Marc'
   Writeln PosInListPartial('Name=',List)  ; returns 3


09-22-93

ComAcceptFileProgram
ComAcceptFileProgram is a variable that contains a procedure that you
use when receiving a file to determine if the file name being sent is
acceptable. You procedure needs to return a True to accept the name or a
False to reject the name.

 Example:
   ComAcceptFileProgram = Loc MyAcceptName

   ;- Always overwrite file

   Procedure MyAcceptName
      if ExistFile ComFullFileName
         DelFile ComFullFileName
      endif
      Return True
   EndProc

   ;----- Ask to overwrite existing file

   Procedure MyAcceptName
   var Ch
      if ExistFile ComFullFileName
         DoubleLineBox
         BoxBorderColor LCyan Mag
         BoxInsideColor Yellow Mag
         InverseColor Yellow Red
         DrawBox 31 7 47 3
         UseArrows Off
         Write ' File ' ComFileName ' exists. Replace it? (Y/n) '
         Ch = UpperCase(ReadKey)
         EraseTopWindow
         if Ch = 'N'
            Return False
         else
            DelFile ComFullFileName
            Return True
         endif
      endif
      Return True
   EndProc


10-12-93

NovDirectoryRights (Dir) : Number
NovDirectoryRights return your effective rights in the directory Dir.

 Example:
   Writeln NovDirectoryRights 'F:\PUBLIC'


NovAddTrustee (Dir,Rights,Object,Type)
NovAddTrustee adds a directory and access rights to a user or group. To
add rights to a user the Type is 1. For a group the Type is 2.

 Example:
   NovAddTrustee ('F:\PUBLIC',$FF,'EVERYONE',2)


NovDeleteTrustee (Dir,Object,Type)
NovDeleteTrustee removes a directory access rights from a user or group.
To delete rights from a user the Type is 1. For a group the Type is 2.

 Example:
   NovDeleteTrustee ('F:\PUBLIC','EVERYONE',2)


NovCreateUser (Name)
Creates a user in the bindery along with all the minimum default
properties.

 Example:
   NovCreateUser 'MARC'


NovCreateGroup (Name)
Creates a group in the bindery along with all the minimum default
properties.

 Example:
   NovCreateGroup 'ACCOUNTING'


NovCreatePrintQueue (Name)
Creates a print queue in the bindery along with all the minimum default
properties.

 Example:
   NovCreatePrintQueue 'ACCOUNTING'


10-18-93

I've fixed the Volume command so that a disk with no volume name works
correctly. I also made the Volume command setable so that you can set
the Volume as well as read it.

I also made the FileAttr command setable so that you can set file
attributes as well as read them.

I did some serious reworking of PickOne and PickMany so that they are
smarter than they were. Both are fully reenterant now so if you are in a
PickMany and you use a KeyEvent to call up another PickMany it still
works.

New Commands:

PickManyFlags : Array
PickManyFlags is an array that PickMany creates in real time indicating
which items are picked. The array is an array of boolean values
(True/False) that has the same number of elements as the array you are
picking from. Every element that is picked is set to true in the same
position in the PickManyFlags array.

Since updating is done in real time a KeyEvent or background task can
monitor this array and read which elements of the array are being
selected. You could pop up another window that listed those elements
already selected.


PickRedisplay
PickRedisplay sets a flag for PickOne or PickMany to redisplay the
choices in the array. If a KeyEvent were to alter the contents of an
array that is currently being picked, this commant would force a
redisplay the that the user sees the changes.

PickOne and PickMany automatically detect and redisply the array if the
number of elements of the array changes.

===============================================================

Version 2.46

10-25-93

Working on breaking the 64k barrier for MRX files. MRX code is still
limited to 64k but I've moved the space used by strings out of the code.
This allows for 64k of code and 64k of string space. Most MRX files are
about one third strings so this will allow MRX files to be significantly
bigger than they were.


10-29-93

EatKbdChar (On/Off)
EatKbdChar controls the behavior of WaitOrKbdReady. If it is On
(default) and a key is pressed the character will be absorbed from the
keyboard buffer. If it is off the character is left in the buffer.


FormatNum (Real,Format) : String
Form converts a real number to a string in a specific format which is
controlled by a format string. The characters of the string control the
decimal places, size of the string, and money signs.

 #  A digit position, blank if not available.
 *  A digit position, fill with asterisk if not available.
 @  A digit position, fill with zero if not available.
 $  A digit position, activating a floating dollar sign.
 -  A sign position, needed if * or @ digits used exclusively.
 +  A sign position, shows '+' for positive numbers as well.
 ,  A decimal comma or a separator comma.
 .  A decimal period or a separator period.

 Example:
   Writeln FormatNum(Pi,'#.#####')  ;returns 3.14159


Beginning to add the ability to access dBase files.

DbOpen (FileName) : Handle
DbOpen opens a dBase file and returns a file handle. The file handle is
used to access the data file with all other dBase commands. If you don't
specify a file extension the extension '.DBF' is assumed.

 Example:
   Handle = DbOpen 'MAILLIST.DBF'


DbFields (Handle,Fields)
DbFields reads the list of dBase fields into a 2 dimensional array. The
fields are as follows:

 1 - Name
 2 - Type
 3 - Length
 4 - Decimal Position

 Example:
   var Handle Fields
   Handle = DbOpen 'MAILLIST.DBF'
   DbFields(Handle,Fields)

   loop Fields
      loop LoopVal
         Write LoopVal ' '
      endloop
      Writeln
   endloop

 Field Types:
   C - Character
   D - Date
   N - Number
   L - Logical (True/False)

DbCreateFile (Name,Fields)
DbCreateFile creates an empty dBase file. The Fields parameter is a 2
dimensional array that specifies the field structure. The field
structure of the array is as follows:

 1 - Name
 2 - Type
 3 - Length
 4 - Decimal Position

 Example:
   var Fields
   Fields[1] = Set['Name','C',35,0]
   Fields[2] = Set['Age','N',3,0]
   DbCreateFile('AGE.DBF',Fields)


DbRecords (Handle) : Number
DbRecords return the number of records in a dBase file.


DbRecLen (Handle) : Number
DbRecLen return the record size in a dBase file.


DbGetRecord (Handle,Record,Data)
DbGetRecord reads a specific physical record from a dBase file into
array Data. It sets a variable DbDeleted to true if the record is
deleted. Error status information is returned in the variable
FileResult. If FileResult returns 5, the record is locked.

 Example:
   Handle = DbOpen 'MAILLIST.DBF'
   DbGetRecord(Handle,1,Data)
   loop Data
      Write LoopVal ' '        ;writes the first record
   endloop
   Writeln
   DbClose(Handle)


DbClose (Handle)
DbClose closes a dBase file.


DbDeleted : Boolean
After a DbGetRecord, DbDeleted returns True if the record was deleted.

 Example:
   Handle = DbOpen 'MAILLIST.DBF'
   DbGetRecord(Handle,33,Data)
   if DbDeleted then Writeln 'Record 1 is Deleted'


11-01-93

DbWriteRecord (Handle,Record,Data) DbWriteRecord writes a physical
record into a dBase file from Data at location Record. Error status
information is returned in the variable FileResult. If FileResult
returns 5, the record is locked.

MarxMenu automatically sets file locks while writing to a record so that
it prevents multiple writes to the same record when used on a network.

If you write a record that is one record past the end of the file, the
record will be appended. If you write beyond the end of the file,
MarxMenu will fill in the gap with empty deleted records.

 Example:
   Handle = DbOpen 'MAILLIST.DBF'
   DbWriteRecord(Handle,45,Data)
   DbClose(Handle)


DbDeleteRecord (Handle,Record)
DbDeleteRecord sets a specified record as deleted. The data in the
record remains and can be set undeleted.

 Example:
   Handle = DbOpen 'MAILLIST.DBF'
   DbDeleteRecord(Handle,20)
   DbClose(Handle)


DbUnDeleteRecord (Handle,Record)
DbUnDeleteRecord sets a specified record as not deleted.

 Example:
   Handle = DbOpen 'MAILLIST.DBF'
   DbUnDeleteRecord(Handle,55)
   DbClose(Handle)


DbLockRecord (Handle,Record)
Sets a file lock on a specified record. If you are accessing multiple
records or multiple files that all have to be updated at once, you might
want to lock them all first before doing the update,


DbUnLockRecord (Handle,Record)
Removes a file lock on a specified record. If you are accessing multiple
records or multiple files that all have to be updated at once, you might
want to lock them all first before doing the update,


DbLockFile (Handle)
DbLockFile puts a file lock on the entire dBase file.


DbUnLockFile (Handle)
DbUnLockFile removes a file lock from the entire dBase file.


DBaseMode (On/Off)
When MarxMenu reads a dBase record it converts numbers into real
numbers, boolean fields into boolean variables, and truncates spaces
from string variables. DBase programmers, however, like to have all
fields returned as strings with all the spaces included. If DBaseMode is
set to On, MarxMenu returns data as dBase programmers expect.


PadLeftChar (String,Char,Length) : String
PadLeftChar returns a string that is padded on the left side with the
character Char to a length of Length.

 Example:
   St = 'MARC'
   Writeln PadLeftChar(St,'*',8)   ;returns '****MARC'


PadRightChar (String,Char,Length) : String
PadRightChar returns a string that is padded on the right side with the
character Char to a length of Length.

 Example:
   St = 'MARC'
   Writeln PadRightChar(St,'*',8)   ;returns 'MARC****'


TrimLead (St)
TrimLead trims the leading spaces off of the left side of a string.

 Example:
   St = ' MARC '
   TrimLead(St)
   Writeln St      ;returns 'MARC '


TrimTrail (St)
TrimTrail trims the trailing spaces off of the right side of a string.

 Example:
   St = ' MARC '
   TrimTrail(St)
   Writeln St      ;returns ' MARC'


CharString (Char,Length)
CharString returns a string Length long made of of Char.

 Example:
   Writeln CharString ('*',4)  ;returns '****'


11-15-93

After getting complaints that MARXCOMP is using too much memory, I've
reworked the memory management so that it uses a lot less.


11-20-93

ComIRQ (ComPort) : Number
ComIRQ returns the interrupt number for the specified com port. It can
also me used to set the interrupt number to a non-standard interrupt.
The interrupt must be set before using ComInitPort.

 Example:
   Writeln ComIRQ (Com3)      ; displays the interrupt
   ComIRQ (Com3) = 5          ; set Com3 to use interrupt 5
   ComInitPort(38400,8,'N',1) ; Initialize the port


ComBasePort (ComPort) : Number
ComBasePort returns the base port address for the specified com port. It
can also me used to set the base port address to a non-standard base
port. The base port address must be set before using ComInitPort.

 Example:
   Writeln ComBasePort (Com3)      ; displays the base port
   ComBasePort (Com3) = $4F8       ; set Com3 base port
   ComInitPort(38400,8,'N',1)      ; Initialize the port


11-26-93

CopyFile (Source,Dest)
CopyFile copies a file from source to destination. If the destination
file already exists it will be deleted, even if it is a read-only file.
On novell networks it takes advantage of the server copy function to
increase speed. Results are returned in the FileResult variable.

 Example:
   CopyFile('MARXMENU.EXE','A:')


CurrentDrive : String
Returns the letter of the current drive.

 Example:
   Writeln CurrentDrive  ; returns C


12-07-93

ShareInstalled : Boolean
ShareInstalled returns True if the dos program SHARE is installed.


AssignInstalled : Boolean
AssignInstalled returns True if the dos program ASSIGN is installed.


AppendInstalled : Boolean
AppendInstalled returns True if the dos program APPEND is installed.


AnsiInstalled : Boolean
AnsiInstalled returns True if the ANSI device driver is installed.


PrintInstalled : Boolean
PrintInstalled returns True if the dos program PRINT is installed.


DosKeyInstalled : Boolean
DosKeyInstalled returns True if the dos program DOSKEY is installed.


12-10-93

Changed NovScanTrusteePath to return the trustees on all volumes of the
current server. If you had to use a lot of strange tricks to read all
volumes in the past you can now remove those tricks.


12-15-93

NovLoginType (Connection) : Num
NovLoginType returns the object type at a specific connection number.

 Example:
   Writeln NovLoginType(1)    ;returns the object type on connection 1


NovConnectionInfo (2D Array)
NovConnectionInfo reads all the connections and gathers a variety of
information about each connection into a two dimensional array. This
fields of this array include:

 1 - Connection Number
 2 - Connection Name
 3 - Connection Station Address
 4 - Connection Object Type
 5 - Connection Login Time
 6 - Connection Object Number

 Example:
   Var ConInfo
   NovConnectionInfo ConInfo
   Loop ConInfo
      Loop LoopVal
         Write LoopVal ' '
      EndLoop
      Writeln
   EndLoop


Unique (Array)
Unique removes duplicates from a sorted array.

 Example:
    Var A
    A = Set['A','B','B','C']
    Unique(A)                 ;removes the duplicate 'B'


12-17-93

EchoChar (On/Off)
When used with Readln, EchoChar controls whether or not characters typed
in will echo to the screen. Turning EchoChar Off is handy when entering
a password.

 Example:
   var PassW
   EchoChar Off
   Write ' Password: '
   PassW = Readln


NovNumberOfPrinters
When using the VLM shells you can specify up to 9 printers. This command
returns the number of printers your shell will support. With NETX it
returns 3 printers.

 Example:
   if NovNumberOfPrinters = 9
      NovCaptureQueue(9) = 'DOT'
   endif


NovGetRootLevel (Drive) : Number
NovGetRootLevel returns the number of directories below the fake root
that the current directory is. Drives with no fake root return 255.

 Example:
   The current directory is H:\LETTERS, but H: is mapped to the
   directory: TYME/SYS:HOME\MARC.

   Writeln NovGetRootLevel('H')  ;returns 1

===============================================================

Version 2.47

01-10-94

Linked in a new updated communications library, APRO 2.0. Besides
working better, I can now do more things with it. One new advance is
that MarxMenu now supports Compuserve B+ uploads and downloads.
Compuserve B+ is fully automatic and requires no aditional commands to
make it work. You just log onto Compuserve with it and start a file
transfer and the MarxMenu end just handles it.

02-01-94
Made the string to date conversion smarter. Now you can pass a string
'020194' and get 02-01-94.

